chainlesschain 0.143.0 → 0.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/package.json +1 -1
  2. package/src/commands/a2a.js +196 -28
  3. package/src/commands/activitypub.js +157 -27
  4. package/src/commands/agent.js +587 -103
  5. package/src/commands/audit.js +206 -0
  6. package/src/commands/bi.js +152 -27
  7. package/src/commands/bm25.js +111 -27
  8. package/src/commands/browse.js +190 -29
  9. package/src/commands/ccron.js +128 -28
  10. package/src/commands/chat.js +207 -0
  11. package/src/commands/compliance.js +414 -34
  12. package/src/commands/compt.js +127 -29
  13. package/src/commands/consol.js +8 -2
  14. package/src/commands/cowork.js +580 -34
  15. package/src/commands/crosschain.js +182 -28
  16. package/src/commands/dao.js +182 -28
  17. package/src/commands/dlp.js +172 -27
  18. package/src/commands/economy.js +205 -50
  19. package/src/commands/evolution.js +203 -50
  20. package/src/commands/evomap.js +182 -27
  21. package/src/commands/fflag.js +74 -22
  22. package/src/commands/git.js +177 -37
  23. package/src/commands/hardening.js +209 -0
  24. package/src/commands/hmemory.js +204 -50
  25. package/src/commands/incentive.js +209 -0
  26. package/src/commands/inference.js +170 -34
  27. package/src/commands/itbudget.js +149 -33
  28. package/src/commands/kg.js +206 -0
  29. package/src/commands/lowcode.js +195 -38
  30. package/src/commands/marketplace.js +206 -0
  31. package/src/commands/matrix.js +179 -27
  32. package/src/commands/mcpscaf.js +145 -33
  33. package/src/commands/meminj.js +145 -33
  34. package/src/commands/nostr.js +178 -27
  35. package/src/commands/orchestrate.js +217 -0
  36. package/src/commands/orchgov.js +144 -33
  37. package/src/commands/pdfp.js +109 -27
  38. package/src/commands/perf.js +169 -32
  39. package/src/commands/perm.js +144 -33
  40. package/src/commands/pipeline.js +207 -52
  41. package/src/commands/planmode.js +141 -32
  42. package/src/commands/privacy.js +203 -0
  43. package/src/commands/promcomp.js +111 -27
  44. package/src/commands/recommend.js +177 -34
  45. package/src/commands/reputation.js +208 -0
  46. package/src/commands/sandbox.js +206 -0
  47. package/src/commands/seshhook.js +145 -33
  48. package/src/commands/seshsearch.js +141 -33
  49. package/src/commands/seshtail.js +144 -33
  50. package/src/commands/seshu.js +152 -33
  51. package/src/commands/sganal.js +123 -29
  52. package/src/commands/siem.js +201 -34
  53. package/src/commands/sla.js +212 -0
  54. package/src/commands/slotfill.js +146 -33
  55. package/src/commands/social.js +157 -32
  56. package/src/commands/stress.js +206 -0
  57. package/src/commands/svccont.js +145 -33
  58. package/src/commands/terraform.js +206 -0
  59. package/src/commands/tms.js +171 -33
  60. package/src/commands/topiccls.js +146 -33
  61. package/src/commands/uprof.js +141 -32
  62. package/src/commands/vcheck.js +122 -28
  63. package/src/commands/webfetch.js +141 -32
  64. package/src/commands/zkp.js +184 -28
  65. package/src/index.js +40 -0
  66. package/src/lib/a2a-protocol.js +319 -51
  67. package/src/lib/activitypub-bridge.js +288 -50
  68. package/src/lib/agent-economy.js +304 -51
  69. package/src/lib/app-builder.js +279 -46
  70. package/src/lib/audit-logger.js +321 -0
  71. package/src/lib/autonomous-agent.js +284 -48
  72. package/src/lib/bi-engine.js +283 -49
  73. package/src/lib/bm25-search.js +301 -49
  74. package/src/lib/browser-automation.js +296 -49
  75. package/src/lib/chat-core.js +336 -0
  76. package/src/lib/claude-code-bridge.js +341 -0
  77. package/src/lib/compliance-framework-reporter.js +305 -51
  78. package/src/lib/compliance-manager.js +330 -0
  79. package/src/lib/compression-telemetry.js +301 -49
  80. package/src/lib/content-recommender.js +317 -52
  81. package/src/lib/cowork-cron.js +298 -49
  82. package/src/lib/cowork-learning.js +333 -0
  83. package/src/lib/cowork-task-runner.js +308 -51
  84. package/src/lib/cowork-workflow.js +327 -0
  85. package/src/lib/cross-chain.js +311 -51
  86. package/src/lib/dao-governance.js +280 -46
  87. package/src/lib/dlp-engine.js +287 -49
  88. package/src/lib/evolution-system.js +278 -47
  89. package/src/lib/evomap-manager.js +280 -46
  90. package/src/lib/execution-backend.js +294 -48
  91. package/src/lib/feature-flags.js +294 -49
  92. package/src/lib/git-integration.js +285 -47
  93. package/src/lib/hardening-manager.js +341 -0
  94. package/src/lib/hierarchical-memory.js +284 -48
  95. package/src/lib/inference-network.js +308 -51
  96. package/src/lib/iteration-budget.js +302 -50
  97. package/src/lib/knowledge-graph.js +333 -0
  98. package/src/lib/matrix-bridge.js +281 -47
  99. package/src/lib/mcp-scaffold.js +318 -54
  100. package/src/lib/memory-injection.js +288 -49
  101. package/src/lib/nostr-bridge.js +286 -49
  102. package/src/lib/orchestrator.js +293 -48
  103. package/src/lib/pdf-parser.js +298 -49
  104. package/src/lib/perf-tuning.js +309 -50
  105. package/src/lib/permission-engine.js +287 -49
  106. package/src/lib/pipeline-orchestrator.js +289 -49
  107. package/src/lib/plan-mode.js +298 -51
  108. package/src/lib/privacy-computing.js +335 -0
  109. package/src/lib/reputation-optimizer.js +340 -0
  110. package/src/lib/sandbox-v2.js +327 -0
  111. package/src/lib/service-container.js +313 -52
  112. package/src/lib/session-consolidator.js +296 -49
  113. package/src/lib/session-hooks.js +312 -53
  114. package/src/lib/session-search.js +304 -51
  115. package/src/lib/session-tail.js +288 -49
  116. package/src/lib/session-usage.js +298 -52
  117. package/src/lib/siem-exporter.js +298 -51
  118. package/src/lib/skill-marketplace.js +345 -0
  119. package/src/lib/sla-manager.js +341 -0
  120. package/src/lib/slot-filler.js +303 -51
  121. package/src/lib/social-graph-analytics.js +295 -49
  122. package/src/lib/social-graph.js +272 -49
  123. package/src/lib/stress-tester.js +342 -0
  124. package/src/lib/sub-agent-registry.js +302 -53
  125. package/src/lib/task-model-selector.js +302 -50
  126. package/src/lib/terraform-manager.js +333 -0
  127. package/src/lib/todo-manager.js +281 -47
  128. package/src/lib/token-incentive.js +341 -0
  129. package/src/lib/topic-classifier.js +297 -49
  130. package/src/lib/user-profile.js +294 -50
  131. package/src/lib/version-checker.js +304 -50
  132. package/src/lib/web-fetch.js +292 -51
  133. package/src/lib/zkp-engine.js +286 -49
@@ -375,81 +375,319 @@ export function listUserRoles(db) {
375
375
 
376
376
  // ===== V2 Surface: Permission Engine governance overlay (CLI v0.141.0) =====
377
377
  export const PERM_RULE_MATURITY_V2 = Object.freeze({
378
- PENDING: "pending", ACTIVE: "active", DISABLED: "disabled", RETIRED: "retired",
378
+ PENDING: "pending",
379
+ ACTIVE: "active",
380
+ DISABLED: "disabled",
381
+ RETIRED: "retired",
379
382
  });
380
383
  export const PERM_CHECK_LIFECYCLE_V2 = Object.freeze({
381
- QUEUED: "queued", EVALUATING: "evaluating", ALLOWED: "allowed", DENIED: "denied", CANCELLED: "cancelled",
384
+ QUEUED: "queued",
385
+ EVALUATING: "evaluating",
386
+ ALLOWED: "allowed",
387
+ DENIED: "denied",
388
+ CANCELLED: "cancelled",
382
389
  });
383
390
  const _permRTrans = new Map([
384
- [PERM_RULE_MATURITY_V2.PENDING, new Set([PERM_RULE_MATURITY_V2.ACTIVE, PERM_RULE_MATURITY_V2.RETIRED])],
385
- [PERM_RULE_MATURITY_V2.ACTIVE, new Set([PERM_RULE_MATURITY_V2.DISABLED, PERM_RULE_MATURITY_V2.RETIRED])],
386
- [PERM_RULE_MATURITY_V2.DISABLED, new Set([PERM_RULE_MATURITY_V2.ACTIVE, PERM_RULE_MATURITY_V2.RETIRED])],
391
+ [
392
+ PERM_RULE_MATURITY_V2.PENDING,
393
+ new Set([PERM_RULE_MATURITY_V2.ACTIVE, PERM_RULE_MATURITY_V2.RETIRED]),
394
+ ],
395
+ [
396
+ PERM_RULE_MATURITY_V2.ACTIVE,
397
+ new Set([PERM_RULE_MATURITY_V2.DISABLED, PERM_RULE_MATURITY_V2.RETIRED]),
398
+ ],
399
+ [
400
+ PERM_RULE_MATURITY_V2.DISABLED,
401
+ new Set([PERM_RULE_MATURITY_V2.ACTIVE, PERM_RULE_MATURITY_V2.RETIRED]),
402
+ ],
387
403
  [PERM_RULE_MATURITY_V2.RETIRED, new Set()],
388
404
  ]);
389
405
  const _permRTerminal = new Set([PERM_RULE_MATURITY_V2.RETIRED]);
390
406
  const _permCTrans = new Map([
391
- [PERM_CHECK_LIFECYCLE_V2.QUEUED, new Set([PERM_CHECK_LIFECYCLE_V2.EVALUATING, PERM_CHECK_LIFECYCLE_V2.CANCELLED])],
392
- [PERM_CHECK_LIFECYCLE_V2.EVALUATING, new Set([PERM_CHECK_LIFECYCLE_V2.ALLOWED, PERM_CHECK_LIFECYCLE_V2.DENIED, PERM_CHECK_LIFECYCLE_V2.CANCELLED])],
407
+ [
408
+ PERM_CHECK_LIFECYCLE_V2.QUEUED,
409
+ new Set([
410
+ PERM_CHECK_LIFECYCLE_V2.EVALUATING,
411
+ PERM_CHECK_LIFECYCLE_V2.CANCELLED,
412
+ ]),
413
+ ],
414
+ [
415
+ PERM_CHECK_LIFECYCLE_V2.EVALUATING,
416
+ new Set([
417
+ PERM_CHECK_LIFECYCLE_V2.ALLOWED,
418
+ PERM_CHECK_LIFECYCLE_V2.DENIED,
419
+ PERM_CHECK_LIFECYCLE_V2.CANCELLED,
420
+ ]),
421
+ ],
393
422
  [PERM_CHECK_LIFECYCLE_V2.ALLOWED, new Set()],
394
423
  [PERM_CHECK_LIFECYCLE_V2.DENIED, new Set()],
395
424
  [PERM_CHECK_LIFECYCLE_V2.CANCELLED, new Set()],
396
425
  ]);
397
426
  const _permRsV2 = new Map();
398
427
  const _permCsV2 = new Map();
399
- let _permMaxActivePerOwner = 10, _permMaxPendingChecksPerRule = 30, _permIdleMs = 30 * 24 * 60 * 60 * 1000, _permStuckMs = 60 * 1000;
400
- function _permPos(n, label) { const v = Math.floor(Number(n)); if (!Number.isFinite(v) || v <= 0) throw new Error(`${label} must be positive integer`); return v; }
401
- function _permCheckR(from, to) { const a = _permRTrans.get(from); if (!a || !a.has(to)) throw new Error(`invalid perm rule transition ${from} → ${to}`); }
402
- function _permCheckC(from, to) { const a = _permCTrans.get(from); if (!a || !a.has(to)) throw new Error(`invalid perm check transition ${from} → ${to}`); }
403
- export function setMaxActivePermRulesPerOwnerV2(n) { _permMaxActivePerOwner = _permPos(n, "maxActivePermRulesPerOwner"); }
404
- export function getMaxActivePermRulesPerOwnerV2() { return _permMaxActivePerOwner; }
405
- export function setMaxPendingPermChecksPerRuleV2(n) { _permMaxPendingChecksPerRule = _permPos(n, "maxPendingPermChecksPerRule"); }
406
- export function getMaxPendingPermChecksPerRuleV2() { return _permMaxPendingChecksPerRule; }
407
- export function setPermRuleIdleMsV2(n) { _permIdleMs = _permPos(n, "permRuleIdleMs"); }
408
- export function getPermRuleIdleMsV2() { return _permIdleMs; }
409
- export function setPermCheckStuckMsV2(n) { _permStuckMs = _permPos(n, "permCheckStuckMs"); }
410
- export function getPermCheckStuckMsV2() { return _permStuckMs; }
411
- export function _resetStatePermissionEngineV2() { _permRsV2.clear(); _permCsV2.clear(); _permMaxActivePerOwner = 10; _permMaxPendingChecksPerRule = 30; _permIdleMs = 30 * 24 * 60 * 60 * 1000; _permStuckMs = 60 * 1000; }
428
+ let _permMaxActivePerOwner = 10,
429
+ _permMaxPendingChecksPerRule = 30,
430
+ _permIdleMs = 30 * 24 * 60 * 60 * 1000,
431
+ _permStuckMs = 60 * 1000;
432
+ function _permPos(n, label) {
433
+ const v = Math.floor(Number(n));
434
+ if (!Number.isFinite(v) || v <= 0)
435
+ throw new Error(`${label} must be positive integer`);
436
+ return v;
437
+ }
438
+ function _permCheckR(from, to) {
439
+ const a = _permRTrans.get(from);
440
+ if (!a || !a.has(to))
441
+ throw new Error(`invalid perm rule transition ${from} → ${to}`);
442
+ }
443
+ function _permCheckC(from, to) {
444
+ const a = _permCTrans.get(from);
445
+ if (!a || !a.has(to))
446
+ throw new Error(`invalid perm check transition ${from} → ${to}`);
447
+ }
448
+ export function setMaxActivePermRulesPerOwnerV2(n) {
449
+ _permMaxActivePerOwner = _permPos(n, "maxActivePermRulesPerOwner");
450
+ }
451
+ export function getMaxActivePermRulesPerOwnerV2() {
452
+ return _permMaxActivePerOwner;
453
+ }
454
+ export function setMaxPendingPermChecksPerRuleV2(n) {
455
+ _permMaxPendingChecksPerRule = _permPos(n, "maxPendingPermChecksPerRule");
456
+ }
457
+ export function getMaxPendingPermChecksPerRuleV2() {
458
+ return _permMaxPendingChecksPerRule;
459
+ }
460
+ export function setPermRuleIdleMsV2(n) {
461
+ _permIdleMs = _permPos(n, "permRuleIdleMs");
462
+ }
463
+ export function getPermRuleIdleMsV2() {
464
+ return _permIdleMs;
465
+ }
466
+ export function setPermCheckStuckMsV2(n) {
467
+ _permStuckMs = _permPos(n, "permCheckStuckMs");
468
+ }
469
+ export function getPermCheckStuckMsV2() {
470
+ return _permStuckMs;
471
+ }
472
+ export function _resetStatePermissionEngineV2() {
473
+ _permRsV2.clear();
474
+ _permCsV2.clear();
475
+ _permMaxActivePerOwner = 10;
476
+ _permMaxPendingChecksPerRule = 30;
477
+ _permIdleMs = 30 * 24 * 60 * 60 * 1000;
478
+ _permStuckMs = 60 * 1000;
479
+ }
412
480
  export function registerPermRuleV2({ id, owner, scope, metadata } = {}) {
413
- if (!id) throw new Error("perm rule id required"); if (!owner) throw new Error("perm rule owner required");
481
+ if (!id) throw new Error("perm rule id required");
482
+ if (!owner) throw new Error("perm rule owner required");
414
483
  if (_permRsV2.has(id)) throw new Error(`perm rule ${id} already registered`);
415
484
  const now = Date.now();
416
- const r = { id, owner, scope: scope || "*", status: PERM_RULE_MATURITY_V2.PENDING, createdAt: now, updatedAt: now, activatedAt: null, retiredAt: null, lastTouchedAt: now, metadata: { ...(metadata || {}) } };
417
- _permRsV2.set(id, r); return { ...r, metadata: { ...r.metadata } };
485
+ const r = {
486
+ id,
487
+ owner,
488
+ scope: scope || "*",
489
+ status: PERM_RULE_MATURITY_V2.PENDING,
490
+ createdAt: now,
491
+ updatedAt: now,
492
+ activatedAt: null,
493
+ retiredAt: null,
494
+ lastTouchedAt: now,
495
+ metadata: { ...(metadata || {}) },
496
+ };
497
+ _permRsV2.set(id, r);
498
+ return { ...r, metadata: { ...r.metadata } };
499
+ }
500
+ function _permCountActive(owner) {
501
+ let n = 0;
502
+ for (const r of _permRsV2.values())
503
+ if (r.owner === owner && r.status === PERM_RULE_MATURITY_V2.ACTIVE) n++;
504
+ return n;
418
505
  }
419
- function _permCountActive(owner) { let n = 0; for (const r of _permRsV2.values()) if (r.owner === owner && r.status === PERM_RULE_MATURITY_V2.ACTIVE) n++; return n; }
420
506
  export function activatePermRuleV2(id) {
421
- const r = _permRsV2.get(id); if (!r) throw new Error(`perm rule ${id} not found`);
507
+ const r = _permRsV2.get(id);
508
+ if (!r) throw new Error(`perm rule ${id} not found`);
422
509
  _permCheckR(r.status, PERM_RULE_MATURITY_V2.ACTIVE);
423
510
  const recovery = r.status === PERM_RULE_MATURITY_V2.DISABLED;
424
- if (!recovery && _permCountActive(r.owner) >= _permMaxActivePerOwner) throw new Error(`max active perm rules for owner ${r.owner} reached`);
425
- const now = Date.now(); r.status = PERM_RULE_MATURITY_V2.ACTIVE; r.updatedAt = now; r.lastTouchedAt = now; if (!r.activatedAt) r.activatedAt = now;
511
+ if (!recovery && _permCountActive(r.owner) >= _permMaxActivePerOwner)
512
+ throw new Error(`max active perm rules for owner ${r.owner} reached`);
513
+ const now = Date.now();
514
+ r.status = PERM_RULE_MATURITY_V2.ACTIVE;
515
+ r.updatedAt = now;
516
+ r.lastTouchedAt = now;
517
+ if (!r.activatedAt) r.activatedAt = now;
518
+ return { ...r, metadata: { ...r.metadata } };
519
+ }
520
+ export function disablePermRuleV2(id) {
521
+ const r = _permRsV2.get(id);
522
+ if (!r) throw new Error(`perm rule ${id} not found`);
523
+ _permCheckR(r.status, PERM_RULE_MATURITY_V2.DISABLED);
524
+ r.status = PERM_RULE_MATURITY_V2.DISABLED;
525
+ r.updatedAt = Date.now();
526
+ return { ...r, metadata: { ...r.metadata } };
527
+ }
528
+ export function retirePermRuleV2(id) {
529
+ const r = _permRsV2.get(id);
530
+ if (!r) throw new Error(`perm rule ${id} not found`);
531
+ _permCheckR(r.status, PERM_RULE_MATURITY_V2.RETIRED);
532
+ const now = Date.now();
533
+ r.status = PERM_RULE_MATURITY_V2.RETIRED;
534
+ r.updatedAt = now;
535
+ if (!r.retiredAt) r.retiredAt = now;
536
+ return { ...r, metadata: { ...r.metadata } };
537
+ }
538
+ export function touchPermRuleV2(id) {
539
+ const r = _permRsV2.get(id);
540
+ if (!r) throw new Error(`perm rule ${id} not found`);
541
+ if (_permRTerminal.has(r.status))
542
+ throw new Error(`cannot touch terminal perm rule ${id}`);
543
+ const now = Date.now();
544
+ r.lastTouchedAt = now;
545
+ r.updatedAt = now;
546
+ return { ...r, metadata: { ...r.metadata } };
547
+ }
548
+ export function getPermRuleV2(id) {
549
+ const r = _permRsV2.get(id);
550
+ if (!r) return null;
426
551
  return { ...r, metadata: { ...r.metadata } };
427
552
  }
428
- export function disablePermRuleV2(id) { const r = _permRsV2.get(id); if (!r) throw new Error(`perm rule ${id} not found`); _permCheckR(r.status, PERM_RULE_MATURITY_V2.DISABLED); r.status = PERM_RULE_MATURITY_V2.DISABLED; r.updatedAt = Date.now(); return { ...r, metadata: { ...r.metadata } }; }
429
- export function retirePermRuleV2(id) { const r = _permRsV2.get(id); if (!r) throw new Error(`perm rule ${id} not found`); _permCheckR(r.status, PERM_RULE_MATURITY_V2.RETIRED); const now = Date.now(); r.status = PERM_RULE_MATURITY_V2.RETIRED; r.updatedAt = now; if (!r.retiredAt) r.retiredAt = now; return { ...r, metadata: { ...r.metadata } }; }
430
- export function touchPermRuleV2(id) { const r = _permRsV2.get(id); if (!r) throw new Error(`perm rule ${id} not found`); if (_permRTerminal.has(r.status)) throw new Error(`cannot touch terminal perm rule ${id}`); const now = Date.now(); r.lastTouchedAt = now; r.updatedAt = now; return { ...r, metadata: { ...r.metadata } }; }
431
- export function getPermRuleV2(id) { const r = _permRsV2.get(id); if (!r) return null; return { ...r, metadata: { ...r.metadata } }; }
432
- export function listPermRulesV2() { return [..._permRsV2.values()].map((r) => ({ ...r, metadata: { ...r.metadata } })); }
433
- function _permCountPending(ruleId) { let n = 0; for (const c of _permCsV2.values()) if (c.ruleId === ruleId && (c.status === PERM_CHECK_LIFECYCLE_V2.QUEUED || c.status === PERM_CHECK_LIFECYCLE_V2.EVALUATING)) n++; return n; }
553
+ export function listPermRulesV2() {
554
+ return [..._permRsV2.values()].map((r) => ({
555
+ ...r,
556
+ metadata: { ...r.metadata },
557
+ }));
558
+ }
559
+ function _permCountPending(ruleId) {
560
+ let n = 0;
561
+ for (const c of _permCsV2.values())
562
+ if (
563
+ c.ruleId === ruleId &&
564
+ (c.status === PERM_CHECK_LIFECYCLE_V2.QUEUED ||
565
+ c.status === PERM_CHECK_LIFECYCLE_V2.EVALUATING)
566
+ )
567
+ n++;
568
+ return n;
569
+ }
434
570
  export function createPermCheckV2({ id, ruleId, subject, metadata } = {}) {
435
- if (!id) throw new Error("perm check id required"); if (!ruleId) throw new Error("perm check ruleId required");
571
+ if (!id) throw new Error("perm check id required");
572
+ if (!ruleId) throw new Error("perm check ruleId required");
436
573
  if (_permCsV2.has(id)) throw new Error(`perm check ${id} already exists`);
437
574
  if (!_permRsV2.has(ruleId)) throw new Error(`perm rule ${ruleId} not found`);
438
- if (_permCountPending(ruleId) >= _permMaxPendingChecksPerRule) throw new Error(`max pending perm checks for rule ${ruleId} reached`);
575
+ if (_permCountPending(ruleId) >= _permMaxPendingChecksPerRule)
576
+ throw new Error(`max pending perm checks for rule ${ruleId} reached`);
577
+ const now = Date.now();
578
+ const c = {
579
+ id,
580
+ ruleId,
581
+ subject: subject || "",
582
+ status: PERM_CHECK_LIFECYCLE_V2.QUEUED,
583
+ createdAt: now,
584
+ updatedAt: now,
585
+ startedAt: null,
586
+ settledAt: null,
587
+ metadata: { ...(metadata || {}) },
588
+ };
589
+ _permCsV2.set(id, c);
590
+ return { ...c, metadata: { ...c.metadata } };
591
+ }
592
+ export function evaluatePermCheckV2(id) {
593
+ const c = _permCsV2.get(id);
594
+ if (!c) throw new Error(`perm check ${id} not found`);
595
+ _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.EVALUATING);
596
+ const now = Date.now();
597
+ c.status = PERM_CHECK_LIFECYCLE_V2.EVALUATING;
598
+ c.updatedAt = now;
599
+ if (!c.startedAt) c.startedAt = now;
600
+ return { ...c, metadata: { ...c.metadata } };
601
+ }
602
+ export function allowPermCheckV2(id) {
603
+ const c = _permCsV2.get(id);
604
+ if (!c) throw new Error(`perm check ${id} not found`);
605
+ _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.ALLOWED);
606
+ const now = Date.now();
607
+ c.status = PERM_CHECK_LIFECYCLE_V2.ALLOWED;
608
+ c.updatedAt = now;
609
+ if (!c.settledAt) c.settledAt = now;
610
+ return { ...c, metadata: { ...c.metadata } };
611
+ }
612
+ export function denyPermCheckV2(id, reason) {
613
+ const c = _permCsV2.get(id);
614
+ if (!c) throw new Error(`perm check ${id} not found`);
615
+ _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.DENIED);
439
616
  const now = Date.now();
440
- const c = { id, ruleId, subject: subject || "", status: PERM_CHECK_LIFECYCLE_V2.QUEUED, createdAt: now, updatedAt: now, startedAt: null, settledAt: null, metadata: { ...(metadata || {}) } };
441
- _permCsV2.set(id, c); return { ...c, metadata: { ...c.metadata } };
442
- }
443
- export function evaluatePermCheckV2(id) { const c = _permCsV2.get(id); if (!c) throw new Error(`perm check ${id} not found`); _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.EVALUATING); const now = Date.now(); c.status = PERM_CHECK_LIFECYCLE_V2.EVALUATING; c.updatedAt = now; if (!c.startedAt) c.startedAt = now; return { ...c, metadata: { ...c.metadata } }; }
444
- export function allowPermCheckV2(id) { const c = _permCsV2.get(id); if (!c) throw new Error(`perm check ${id} not found`); _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.ALLOWED); const now = Date.now(); c.status = PERM_CHECK_LIFECYCLE_V2.ALLOWED; c.updatedAt = now; if (!c.settledAt) c.settledAt = now; return { ...c, metadata: { ...c.metadata } }; }
445
- export function denyPermCheckV2(id, reason) { const c = _permCsV2.get(id); if (!c) throw new Error(`perm check ${id} not found`); _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.DENIED); const now = Date.now(); c.status = PERM_CHECK_LIFECYCLE_V2.DENIED; c.updatedAt = now; if (!c.settledAt) c.settledAt = now; if (reason) c.metadata.denyReason = String(reason); return { ...c, metadata: { ...c.metadata } }; }
446
- export function cancelPermCheckV2(id, reason) { const c = _permCsV2.get(id); if (!c) throw new Error(`perm check ${id} not found`); _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.CANCELLED); const now = Date.now(); c.status = PERM_CHECK_LIFECYCLE_V2.CANCELLED; c.updatedAt = now; if (!c.settledAt) c.settledAt = now; if (reason) c.metadata.cancelReason = String(reason); return { ...c, metadata: { ...c.metadata } }; }
447
- export function getPermCheckV2(id) { const c = _permCsV2.get(id); if (!c) return null; return { ...c, metadata: { ...c.metadata } }; }
448
- export function listPermChecksV2() { return [..._permCsV2.values()].map((c) => ({ ...c, metadata: { ...c.metadata } })); }
449
- export function autoDisableIdlePermRulesV2({ now } = {}) { const t = now ?? Date.now(); const flipped = []; for (const r of _permRsV2.values()) if (r.status === PERM_RULE_MATURITY_V2.ACTIVE && (t - r.lastTouchedAt) >= _permIdleMs) { r.status = PERM_RULE_MATURITY_V2.DISABLED; r.updatedAt = t; flipped.push(r.id); } return { flipped, count: flipped.length }; }
450
- export function autoDenyStuckPermChecksV2({ now } = {}) { const t = now ?? Date.now(); const flipped = []; for (const c of _permCsV2.values()) if (c.status === PERM_CHECK_LIFECYCLE_V2.EVALUATING && c.startedAt != null && (t - c.startedAt) >= _permStuckMs) { c.status = PERM_CHECK_LIFECYCLE_V2.DENIED; c.updatedAt = t; if (!c.settledAt) c.settledAt = t; c.metadata.denyReason = "auto-deny-stuck"; flipped.push(c.id); } return { flipped, count: flipped.length }; }
617
+ c.status = PERM_CHECK_LIFECYCLE_V2.DENIED;
618
+ c.updatedAt = now;
619
+ if (!c.settledAt) c.settledAt = now;
620
+ if (reason) c.metadata.denyReason = String(reason);
621
+ return { ...c, metadata: { ...c.metadata } };
622
+ }
623
+ export function cancelPermCheckV2(id, reason) {
624
+ const c = _permCsV2.get(id);
625
+ if (!c) throw new Error(`perm check ${id} not found`);
626
+ _permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.CANCELLED);
627
+ const now = Date.now();
628
+ c.status = PERM_CHECK_LIFECYCLE_V2.CANCELLED;
629
+ c.updatedAt = now;
630
+ if (!c.settledAt) c.settledAt = now;
631
+ if (reason) c.metadata.cancelReason = String(reason);
632
+ return { ...c, metadata: { ...c.metadata } };
633
+ }
634
+ export function getPermCheckV2(id) {
635
+ const c = _permCsV2.get(id);
636
+ if (!c) return null;
637
+ return { ...c, metadata: { ...c.metadata } };
638
+ }
639
+ export function listPermChecksV2() {
640
+ return [..._permCsV2.values()].map((c) => ({
641
+ ...c,
642
+ metadata: { ...c.metadata },
643
+ }));
644
+ }
645
+ export function autoDisableIdlePermRulesV2({ now } = {}) {
646
+ const t = now ?? Date.now();
647
+ const flipped = [];
648
+ for (const r of _permRsV2.values())
649
+ if (
650
+ r.status === PERM_RULE_MATURITY_V2.ACTIVE &&
651
+ t - r.lastTouchedAt >= _permIdleMs
652
+ ) {
653
+ r.status = PERM_RULE_MATURITY_V2.DISABLED;
654
+ r.updatedAt = t;
655
+ flipped.push(r.id);
656
+ }
657
+ return { flipped, count: flipped.length };
658
+ }
659
+ export function autoDenyStuckPermChecksV2({ now } = {}) {
660
+ const t = now ?? Date.now();
661
+ const flipped = [];
662
+ for (const c of _permCsV2.values())
663
+ if (
664
+ c.status === PERM_CHECK_LIFECYCLE_V2.EVALUATING &&
665
+ c.startedAt != null &&
666
+ t - c.startedAt >= _permStuckMs
667
+ ) {
668
+ c.status = PERM_CHECK_LIFECYCLE_V2.DENIED;
669
+ c.updatedAt = t;
670
+ if (!c.settledAt) c.settledAt = t;
671
+ c.metadata.denyReason = "auto-deny-stuck";
672
+ flipped.push(c.id);
673
+ }
674
+ return { flipped, count: flipped.length };
675
+ }
451
676
  export function getPermissionEngineGovStatsV2() {
452
- const rulesByStatus = {}; for (const v of Object.values(PERM_RULE_MATURITY_V2)) rulesByStatus[v] = 0; for (const r of _permRsV2.values()) rulesByStatus[r.status]++;
453
- const checksByStatus = {}; for (const v of Object.values(PERM_CHECK_LIFECYCLE_V2)) checksByStatus[v] = 0; for (const c of _permCsV2.values()) checksByStatus[c.status]++;
454
- return { totalPermRulesV2: _permRsV2.size, totalPermChecksV2: _permCsV2.size, maxActivePermRulesPerOwner: _permMaxActivePerOwner, maxPendingPermChecksPerRule: _permMaxPendingChecksPerRule, permRuleIdleMs: _permIdleMs, permCheckStuckMs: _permStuckMs, rulesByStatus, checksByStatus };
677
+ const rulesByStatus = {};
678
+ for (const v of Object.values(PERM_RULE_MATURITY_V2)) rulesByStatus[v] = 0;
679
+ for (const r of _permRsV2.values()) rulesByStatus[r.status]++;
680
+ const checksByStatus = {};
681
+ for (const v of Object.values(PERM_CHECK_LIFECYCLE_V2)) checksByStatus[v] = 0;
682
+ for (const c of _permCsV2.values()) checksByStatus[c.status]++;
683
+ return {
684
+ totalPermRulesV2: _permRsV2.size,
685
+ totalPermChecksV2: _permCsV2.size,
686
+ maxActivePermRulesPerOwner: _permMaxActivePerOwner,
687
+ maxPendingPermChecksPerRule: _permMaxPendingChecksPerRule,
688
+ permRuleIdleMs: _permIdleMs,
689
+ permCheckStuckMs: _permStuckMs,
690
+ rulesByStatus,
691
+ checksByStatus,
692
+ };
455
693
  }