chainlesschain 0.143.0 → 0.152.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 (227) hide show
  1. package/package.json +1 -1
  2. package/src/commands/a2a.js +196 -28
  3. package/src/commands/activitypub.js +364 -27
  4. package/src/commands/agent-network.js +217 -0
  5. package/src/commands/agent.js +587 -103
  6. package/src/commands/audit.js +206 -0
  7. package/src/commands/automation.js +201 -0
  8. package/src/commands/bi.js +355 -27
  9. package/src/commands/bm25.js +111 -27
  10. package/src/commands/browse.js +403 -29
  11. package/src/commands/ccron.js +128 -28
  12. package/src/commands/chat.js +207 -0
  13. package/src/commands/codegen.js +207 -0
  14. package/src/commands/collab.js +211 -0
  15. package/src/commands/compliance.js +824 -34
  16. package/src/commands/compt.js +127 -29
  17. package/src/commands/consol.js +8 -2
  18. package/src/commands/cowork.js +783 -34
  19. package/src/commands/crosschain.js +182 -28
  20. package/src/commands/dao.js +182 -28
  21. package/src/commands/dbevo.js +227 -0
  22. package/src/commands/dev.js +207 -0
  23. package/src/commands/did-v2.js +217 -0
  24. package/src/commands/did.js +221 -0
  25. package/src/commands/dlp.js +385 -27
  26. package/src/commands/economy.js +205 -50
  27. package/src/commands/evolution.js +203 -50
  28. package/src/commands/evomap.js +387 -27
  29. package/src/commands/export.js +213 -0
  30. package/src/commands/federation.js +209 -0
  31. package/src/commands/fflag.js +74 -22
  32. package/src/commands/fusion.js +205 -0
  33. package/src/commands/git.js +177 -37
  34. package/src/commands/governance.js +209 -0
  35. package/src/commands/hardening.js +209 -0
  36. package/src/commands/hmemory.js +204 -50
  37. package/src/commands/hook.js +209 -0
  38. package/src/commands/import.js +209 -0
  39. package/src/commands/incentive.js +209 -0
  40. package/src/commands/inference.js +170 -34
  41. package/src/commands/infra.js +203 -0
  42. package/src/commands/instinct.js +209 -0
  43. package/src/commands/ipfs.js +207 -0
  44. package/src/commands/itbudget.js +149 -33
  45. package/src/commands/kg.js +206 -0
  46. package/src/commands/llm.js +217 -0
  47. package/src/commands/lowcode.js +195 -38
  48. package/src/commands/marketplace.js +206 -0
  49. package/src/commands/matrix.js +386 -27
  50. package/src/commands/mcp.js +217 -0
  51. package/src/commands/mcpscaf.js +145 -33
  52. package/src/commands/meminj.js +145 -33
  53. package/src/commands/memory.js +209 -0
  54. package/src/commands/multimodal.js +203 -0
  55. package/src/commands/nlprog.js +225 -0
  56. package/src/commands/nostr.js +387 -27
  57. package/src/commands/note.js +205 -0
  58. package/src/commands/ops.js +219 -0
  59. package/src/commands/orchestrate.js +217 -0
  60. package/src/commands/orchgov.js +144 -33
  61. package/src/commands/org.js +209 -0
  62. package/src/commands/p2p.js +209 -0
  63. package/src/commands/pdfp.js +109 -27
  64. package/src/commands/perception.js +209 -0
  65. package/src/commands/perf.js +169 -32
  66. package/src/commands/perm.js +144 -33
  67. package/src/commands/permmem.js +203 -0
  68. package/src/commands/pipeline.js +207 -52
  69. package/src/commands/planmode.js +141 -32
  70. package/src/commands/plugin-ecosystem.js +209 -0
  71. package/src/commands/pqc.js +213 -0
  72. package/src/commands/privacy.js +203 -0
  73. package/src/commands/promcomp.js +111 -27
  74. package/src/commands/quantization.js +207 -0
  75. package/src/commands/rcache.js +205 -0
  76. package/src/commands/recommend.js +410 -34
  77. package/src/commands/reputation.js +208 -0
  78. package/src/commands/runtime.js +205 -0
  79. package/src/commands/sandbox.js +206 -0
  80. package/src/commands/scim.js +209 -0
  81. package/src/commands/seshhook.js +145 -33
  82. package/src/commands/seshsearch.js +141 -33
  83. package/src/commands/seshtail.js +144 -33
  84. package/src/commands/seshu.js +152 -33
  85. package/src/commands/session.js +209 -0
  86. package/src/commands/sganal.js +123 -29
  87. package/src/commands/siem.js +201 -34
  88. package/src/commands/skill.js +207 -0
  89. package/src/commands/sla.js +212 -0
  90. package/src/commands/slotfill.js +146 -33
  91. package/src/commands/social.js +358 -32
  92. package/src/commands/sso.js +209 -0
  93. package/src/commands/stress.js +206 -0
  94. package/src/commands/svccont.js +145 -33
  95. package/src/commands/sync.js +209 -0
  96. package/src/commands/tech.js +209 -0
  97. package/src/commands/tenant.js +217 -0
  98. package/src/commands/terraform.js +206 -0
  99. package/src/commands/tms.js +171 -33
  100. package/src/commands/tokens.js +209 -0
  101. package/src/commands/topiccls.js +146 -33
  102. package/src/commands/trust.js +217 -0
  103. package/src/commands/uprof.js +141 -32
  104. package/src/commands/vcheck.js +122 -28
  105. package/src/commands/wallet.js +209 -0
  106. package/src/commands/webfetch.js +141 -32
  107. package/src/commands/workflow.js +203 -0
  108. package/src/commands/zkp.js +184 -28
  109. package/src/index.js +180 -0
  110. package/src/lib/a2a-protocol.js +319 -51
  111. package/src/lib/activitypub-bridge.js +622 -50
  112. package/src/lib/agent-economy.js +304 -51
  113. package/src/lib/agent-network.js +341 -0
  114. package/src/lib/aiops.js +346 -0
  115. package/src/lib/app-builder.js +279 -46
  116. package/src/lib/audit-logger.js +321 -0
  117. package/src/lib/automation-engine.js +335 -0
  118. package/src/lib/autonomous-agent.js +284 -48
  119. package/src/lib/autonomous-developer.js +332 -0
  120. package/src/lib/bi-engine.js +616 -49
  121. package/src/lib/bm25-search.js +301 -49
  122. package/src/lib/browser-automation.js +630 -49
  123. package/src/lib/chat-core.js +336 -0
  124. package/src/lib/claude-code-bridge.js +341 -0
  125. package/src/lib/code-agent.js +339 -0
  126. package/src/lib/collaboration-governance.js +334 -0
  127. package/src/lib/community-governance.js +346 -0
  128. package/src/lib/compliance-framework-reporter.js +305 -51
  129. package/src/lib/compliance-manager.js +330 -0
  130. package/src/lib/compression-telemetry.js +301 -49
  131. package/src/lib/content-recommendation.js +351 -0
  132. package/src/lib/content-recommender.js +317 -52
  133. package/src/lib/cowork-cron.js +298 -49
  134. package/src/lib/cowork-learning.js +333 -0
  135. package/src/lib/cowork-share.js +338 -0
  136. package/src/lib/cowork-task-runner.js +308 -51
  137. package/src/lib/cowork-workflow.js +327 -0
  138. package/src/lib/cross-chain.js +311 -51
  139. package/src/lib/dao-governance.js +280 -46
  140. package/src/lib/dbevo.js +351 -0
  141. package/src/lib/decentral-infra.js +330 -0
  142. package/src/lib/did-manager.js +341 -0
  143. package/src/lib/did-v2-manager.js +341 -0
  144. package/src/lib/dlp-engine.js +626 -49
  145. package/src/lib/evolution-system.js +278 -47
  146. package/src/lib/evomap-governance.js +334 -0
  147. package/src/lib/evomap-manager.js +280 -46
  148. package/src/lib/execution-backend.js +294 -48
  149. package/src/lib/feature-flags.js +294 -49
  150. package/src/lib/federation-hardening.js +340 -0
  151. package/src/lib/git-integration.js +285 -47
  152. package/src/lib/hardening-manager.js +341 -0
  153. package/src/lib/hierarchical-memory.js +284 -48
  154. package/src/lib/hook-manager.js +341 -0
  155. package/src/lib/inference-network.js +308 -51
  156. package/src/lib/instinct-manager.js +346 -0
  157. package/src/lib/ipfs-storage.js +334 -0
  158. package/src/lib/iteration-budget.js +302 -50
  159. package/src/lib/knowledge-exporter.js +341 -0
  160. package/src/lib/knowledge-graph.js +333 -0
  161. package/src/lib/knowledge-importer.js +341 -0
  162. package/src/lib/llm-providers.js +346 -0
  163. package/src/lib/matrix-bridge.js +620 -47
  164. package/src/lib/mcp-registry.js +346 -0
  165. package/src/lib/mcp-scaffold.js +318 -54
  166. package/src/lib/memory-injection.js +288 -49
  167. package/src/lib/memory-manager.js +336 -0
  168. package/src/lib/multimodal.js +330 -0
  169. package/src/lib/nl-programming.js +341 -0
  170. package/src/lib/nostr-bridge.js +622 -49
  171. package/src/lib/note-versioning.js +339 -0
  172. package/src/lib/orchestrator.js +293 -48
  173. package/src/lib/org-manager.js +336 -0
  174. package/src/lib/p2p-manager.js +341 -0
  175. package/src/lib/pdf-parser.js +298 -49
  176. package/src/lib/perception.js +346 -0
  177. package/src/lib/perf-tuning.js +309 -50
  178. package/src/lib/permanent-memory.js +327 -0
  179. package/src/lib/permission-engine.js +287 -49
  180. package/src/lib/pipeline-orchestrator.js +289 -49
  181. package/src/lib/plan-mode.js +298 -51
  182. package/src/lib/plugin-ecosystem.js +346 -0
  183. package/src/lib/pqc-manager.js +346 -0
  184. package/src/lib/privacy-computing.js +335 -0
  185. package/src/lib/protocol-fusion.js +338 -0
  186. package/src/lib/quantization.js +337 -0
  187. package/src/lib/reputation-optimizer.js +340 -0
  188. package/src/lib/response-cache.js +333 -0
  189. package/src/lib/sandbox-v2.js +327 -0
  190. package/src/lib/scim-manager.js +346 -0
  191. package/src/lib/service-container.js +313 -52
  192. package/src/lib/session-consolidator.js +296 -49
  193. package/src/lib/session-hooks.js +312 -53
  194. package/src/lib/session-manager.js +334 -0
  195. package/src/lib/session-search.js +304 -51
  196. package/src/lib/session-tail.js +288 -49
  197. package/src/lib/session-usage.js +298 -52
  198. package/src/lib/siem-exporter.js +298 -51
  199. package/src/lib/skill-loader.js +334 -0
  200. package/src/lib/skill-marketplace.js +345 -0
  201. package/src/lib/sla-manager.js +341 -0
  202. package/src/lib/slot-filler.js +303 -51
  203. package/src/lib/social-graph-analytics.js +295 -49
  204. package/src/lib/social-graph.js +272 -49
  205. package/src/lib/social-manager.js +330 -0
  206. package/src/lib/sso-manager.js +340 -0
  207. package/src/lib/stress-tester.js +342 -0
  208. package/src/lib/sub-agent-registry.js +302 -53
  209. package/src/lib/sync-manager.js +336 -0
  210. package/src/lib/task-model-selector.js +302 -50
  211. package/src/lib/tech-learning-engine.js +341 -0
  212. package/src/lib/tenant-saas.js +341 -0
  213. package/src/lib/terraform-manager.js +333 -0
  214. package/src/lib/threat-intel.js +330 -0
  215. package/src/lib/todo-manager.js +281 -47
  216. package/src/lib/token-incentive.js +341 -0
  217. package/src/lib/token-tracker.js +336 -0
  218. package/src/lib/topic-classifier.js +297 -49
  219. package/src/lib/trust-security.js +343 -0
  220. package/src/lib/ueba.js +340 -0
  221. package/src/lib/universal-runtime.js +330 -0
  222. package/src/lib/user-profile.js +294 -50
  223. package/src/lib/version-checker.js +304 -50
  224. package/src/lib/wallet-manager.js +336 -0
  225. package/src/lib/web-fetch.js +292 -51
  226. package/src/lib/workflow-engine.js +330 -0
  227. package/src/lib/zkp-engine.js +286 -49
@@ -481,3 +481,336 @@ export function _resetStateResponseCacheV2() {
481
481
  _profileIdleMsV2 = CACHE_DEFAULT_PROFILE_IDLE_MS;
482
482
  _refreshStuckMsV2 = CACHE_DEFAULT_REFRESH_STUCK_MS;
483
483
  }
484
+
485
+ // =====================================================================
486
+ // response-cache V2 governance overlay (iter23)
487
+ // =====================================================================
488
+ export const RCGOV_PROFILE_MATURITY_V2 = Object.freeze({
489
+ PENDING: "pending",
490
+ ACTIVE: "active",
491
+ STALE: "stale",
492
+ ARCHIVED: "archived",
493
+ });
494
+ export const RCGOV_REFRESH_LIFECYCLE_V2 = Object.freeze({
495
+ QUEUED: "queued",
496
+ REFRESHING: "refreshing",
497
+ REFRESHED: "refreshed",
498
+ FAILED: "failed",
499
+ CANCELLED: "cancelled",
500
+ });
501
+ const _rcgovPTrans = new Map([
502
+ [
503
+ RCGOV_PROFILE_MATURITY_V2.PENDING,
504
+ new Set([
505
+ RCGOV_PROFILE_MATURITY_V2.ACTIVE,
506
+ RCGOV_PROFILE_MATURITY_V2.ARCHIVED,
507
+ ]),
508
+ ],
509
+ [
510
+ RCGOV_PROFILE_MATURITY_V2.ACTIVE,
511
+ new Set([
512
+ RCGOV_PROFILE_MATURITY_V2.STALE,
513
+ RCGOV_PROFILE_MATURITY_V2.ARCHIVED,
514
+ ]),
515
+ ],
516
+ [
517
+ RCGOV_PROFILE_MATURITY_V2.STALE,
518
+ new Set([
519
+ RCGOV_PROFILE_MATURITY_V2.ACTIVE,
520
+ RCGOV_PROFILE_MATURITY_V2.ARCHIVED,
521
+ ]),
522
+ ],
523
+ [RCGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
524
+ ]);
525
+ const _rcgovPTerminal = new Set([RCGOV_PROFILE_MATURITY_V2.ARCHIVED]);
526
+ const _rcgovJTrans = new Map([
527
+ [
528
+ RCGOV_REFRESH_LIFECYCLE_V2.QUEUED,
529
+ new Set([
530
+ RCGOV_REFRESH_LIFECYCLE_V2.REFRESHING,
531
+ RCGOV_REFRESH_LIFECYCLE_V2.CANCELLED,
532
+ ]),
533
+ ],
534
+ [
535
+ RCGOV_REFRESH_LIFECYCLE_V2.REFRESHING,
536
+ new Set([
537
+ RCGOV_REFRESH_LIFECYCLE_V2.REFRESHED,
538
+ RCGOV_REFRESH_LIFECYCLE_V2.FAILED,
539
+ RCGOV_REFRESH_LIFECYCLE_V2.CANCELLED,
540
+ ]),
541
+ ],
542
+ [RCGOV_REFRESH_LIFECYCLE_V2.REFRESHED, new Set()],
543
+ [RCGOV_REFRESH_LIFECYCLE_V2.FAILED, new Set()],
544
+ [RCGOV_REFRESH_LIFECYCLE_V2.CANCELLED, new Set()],
545
+ ]);
546
+ const _rcgovPsV2 = new Map();
547
+ const _rcgovJsV2 = new Map();
548
+ let _rcgovMaxActive = 8,
549
+ _rcgovMaxPending = 15,
550
+ _rcgovIdleMs = 30 * 24 * 60 * 60 * 1000,
551
+ _rcgovStuckMs = 60 * 1000;
552
+ function _rcgovPos(n, label) {
553
+ const v = Math.floor(Number(n));
554
+ if (!Number.isFinite(v) || v <= 0)
555
+ throw new Error(`${label} must be positive integer`);
556
+ return v;
557
+ }
558
+ function _rcgovCheckP(from, to) {
559
+ const a = _rcgovPTrans.get(from);
560
+ if (!a || !a.has(to))
561
+ throw new Error(`invalid rcgov profile transition ${from} → ${to}`);
562
+ }
563
+ function _rcgovCheckJ(from, to) {
564
+ const a = _rcgovJTrans.get(from);
565
+ if (!a || !a.has(to))
566
+ throw new Error(`invalid rcgov refresh transition ${from} → ${to}`);
567
+ }
568
+ function _rcgovCountActive(owner) {
569
+ let c = 0;
570
+ for (const p of _rcgovPsV2.values())
571
+ if (p.owner === owner && p.status === RCGOV_PROFILE_MATURITY_V2.ACTIVE) c++;
572
+ return c;
573
+ }
574
+ function _rcgovCountPending(profileId) {
575
+ let c = 0;
576
+ for (const j of _rcgovJsV2.values())
577
+ if (
578
+ j.profileId === profileId &&
579
+ (j.status === RCGOV_REFRESH_LIFECYCLE_V2.QUEUED ||
580
+ j.status === RCGOV_REFRESH_LIFECYCLE_V2.REFRESHING)
581
+ )
582
+ c++;
583
+ return c;
584
+ }
585
+ export function setMaxActiveRcgovProfilesPerOwnerV2(n) {
586
+ _rcgovMaxActive = _rcgovPos(n, "maxActiveRcgovProfilesPerOwner");
587
+ }
588
+ export function getMaxActiveRcgovProfilesPerOwnerV2() {
589
+ return _rcgovMaxActive;
590
+ }
591
+ export function setMaxPendingRcgovRefreshsPerProfileV2(n) {
592
+ _rcgovMaxPending = _rcgovPos(n, "maxPendingRcgovRefreshsPerProfile");
593
+ }
594
+ export function getMaxPendingRcgovRefreshsPerProfileV2() {
595
+ return _rcgovMaxPending;
596
+ }
597
+ export function setRcgovProfileIdleMsV2(n) {
598
+ _rcgovIdleMs = _rcgovPos(n, "rcgovProfileIdleMs");
599
+ }
600
+ export function getRcgovProfileIdleMsV2() {
601
+ return _rcgovIdleMs;
602
+ }
603
+ export function setRcgovRefreshStuckMsV2(n) {
604
+ _rcgovStuckMs = _rcgovPos(n, "rcgovRefreshStuckMs");
605
+ }
606
+ export function getRcgovRefreshStuckMsV2() {
607
+ return _rcgovStuckMs;
608
+ }
609
+ export function _resetStateResponseCacheGovV2() {
610
+ _rcgovPsV2.clear();
611
+ _rcgovJsV2.clear();
612
+ _rcgovMaxActive = 8;
613
+ _rcgovMaxPending = 15;
614
+ _rcgovIdleMs = 30 * 24 * 60 * 60 * 1000;
615
+ _rcgovStuckMs = 60 * 1000;
616
+ }
617
+ export function registerRcgovProfileV2({ id, owner, lane, metadata } = {}) {
618
+ if (!id || !owner) throw new Error("id and owner required");
619
+ if (_rcgovPsV2.has(id)) throw new Error(`rcgov profile ${id} already exists`);
620
+ const now = Date.now();
621
+ const p = {
622
+ id,
623
+ owner,
624
+ lane: lane || "default",
625
+ status: RCGOV_PROFILE_MATURITY_V2.PENDING,
626
+ createdAt: now,
627
+ updatedAt: now,
628
+ lastTouchedAt: now,
629
+ activatedAt: null,
630
+ archivedAt: null,
631
+ metadata: { ...(metadata || {}) },
632
+ };
633
+ _rcgovPsV2.set(id, p);
634
+ return { ...p, metadata: { ...p.metadata } };
635
+ }
636
+ export function activateRcgovProfileV2(id) {
637
+ const p = _rcgovPsV2.get(id);
638
+ if (!p) throw new Error(`rcgov profile ${id} not found`);
639
+ const isInitial = p.status === RCGOV_PROFILE_MATURITY_V2.PENDING;
640
+ _rcgovCheckP(p.status, RCGOV_PROFILE_MATURITY_V2.ACTIVE);
641
+ if (isInitial && _rcgovCountActive(p.owner) >= _rcgovMaxActive)
642
+ throw new Error(`max active rcgov profiles for owner ${p.owner} reached`);
643
+ const now = Date.now();
644
+ p.status = RCGOV_PROFILE_MATURITY_V2.ACTIVE;
645
+ p.updatedAt = now;
646
+ p.lastTouchedAt = now;
647
+ if (!p.activatedAt) p.activatedAt = now;
648
+ return { ...p, metadata: { ...p.metadata } };
649
+ }
650
+ export function staleRcgovProfileV2(id) {
651
+ const p = _rcgovPsV2.get(id);
652
+ if (!p) throw new Error(`rcgov profile ${id} not found`);
653
+ _rcgovCheckP(p.status, RCGOV_PROFILE_MATURITY_V2.STALE);
654
+ p.status = RCGOV_PROFILE_MATURITY_V2.STALE;
655
+ p.updatedAt = Date.now();
656
+ return { ...p, metadata: { ...p.metadata } };
657
+ }
658
+ export function archiveRcgovProfileV2(id) {
659
+ const p = _rcgovPsV2.get(id);
660
+ if (!p) throw new Error(`rcgov profile ${id} not found`);
661
+ _rcgovCheckP(p.status, RCGOV_PROFILE_MATURITY_V2.ARCHIVED);
662
+ const now = Date.now();
663
+ p.status = RCGOV_PROFILE_MATURITY_V2.ARCHIVED;
664
+ p.updatedAt = now;
665
+ if (!p.archivedAt) p.archivedAt = now;
666
+ return { ...p, metadata: { ...p.metadata } };
667
+ }
668
+ export function touchRcgovProfileV2(id) {
669
+ const p = _rcgovPsV2.get(id);
670
+ if (!p) throw new Error(`rcgov profile ${id} not found`);
671
+ if (_rcgovPTerminal.has(p.status))
672
+ throw new Error(`cannot touch terminal rcgov profile ${id}`);
673
+ const now = Date.now();
674
+ p.lastTouchedAt = now;
675
+ p.updatedAt = now;
676
+ return { ...p, metadata: { ...p.metadata } };
677
+ }
678
+ export function getRcgovProfileV2(id) {
679
+ const p = _rcgovPsV2.get(id);
680
+ if (!p) return null;
681
+ return { ...p, metadata: { ...p.metadata } };
682
+ }
683
+ export function listRcgovProfilesV2() {
684
+ return [..._rcgovPsV2.values()].map((p) => ({
685
+ ...p,
686
+ metadata: { ...p.metadata },
687
+ }));
688
+ }
689
+ export function createRcgovRefreshV2({ id, profileId, source, metadata } = {}) {
690
+ if (!id || !profileId) throw new Error("id and profileId required");
691
+ if (_rcgovJsV2.has(id)) throw new Error(`rcgov refresh ${id} already exists`);
692
+ if (!_rcgovPsV2.has(profileId))
693
+ throw new Error(`rcgov profile ${profileId} not found`);
694
+ if (_rcgovCountPending(profileId) >= _rcgovMaxPending)
695
+ throw new Error(
696
+ `max pending rcgov refreshs for profile ${profileId} reached`,
697
+ );
698
+ const now = Date.now();
699
+ const j = {
700
+ id,
701
+ profileId,
702
+ source: source || "",
703
+ status: RCGOV_REFRESH_LIFECYCLE_V2.QUEUED,
704
+ createdAt: now,
705
+ updatedAt: now,
706
+ startedAt: null,
707
+ settledAt: null,
708
+ metadata: { ...(metadata || {}) },
709
+ };
710
+ _rcgovJsV2.set(id, j);
711
+ return { ...j, metadata: { ...j.metadata } };
712
+ }
713
+ export function refreshingRcgovRefreshV2(id) {
714
+ const j = _rcgovJsV2.get(id);
715
+ if (!j) throw new Error(`rcgov refresh ${id} not found`);
716
+ _rcgovCheckJ(j.status, RCGOV_REFRESH_LIFECYCLE_V2.REFRESHING);
717
+ const now = Date.now();
718
+ j.status = RCGOV_REFRESH_LIFECYCLE_V2.REFRESHING;
719
+ j.updatedAt = now;
720
+ if (!j.startedAt) j.startedAt = now;
721
+ return { ...j, metadata: { ...j.metadata } };
722
+ }
723
+ export function completeRefreshRcgovV2(id) {
724
+ const j = _rcgovJsV2.get(id);
725
+ if (!j) throw new Error(`rcgov refresh ${id} not found`);
726
+ _rcgovCheckJ(j.status, RCGOV_REFRESH_LIFECYCLE_V2.REFRESHED);
727
+ const now = Date.now();
728
+ j.status = RCGOV_REFRESH_LIFECYCLE_V2.REFRESHED;
729
+ j.updatedAt = now;
730
+ if (!j.settledAt) j.settledAt = now;
731
+ return { ...j, metadata: { ...j.metadata } };
732
+ }
733
+ export function failRcgovRefreshV2(id, reason) {
734
+ const j = _rcgovJsV2.get(id);
735
+ if (!j) throw new Error(`rcgov refresh ${id} not found`);
736
+ _rcgovCheckJ(j.status, RCGOV_REFRESH_LIFECYCLE_V2.FAILED);
737
+ const now = Date.now();
738
+ j.status = RCGOV_REFRESH_LIFECYCLE_V2.FAILED;
739
+ j.updatedAt = now;
740
+ if (!j.settledAt) j.settledAt = now;
741
+ if (reason) j.metadata.failReason = String(reason);
742
+ return { ...j, metadata: { ...j.metadata } };
743
+ }
744
+ export function cancelRcgovRefreshV2(id, reason) {
745
+ const j = _rcgovJsV2.get(id);
746
+ if (!j) throw new Error(`rcgov refresh ${id} not found`);
747
+ _rcgovCheckJ(j.status, RCGOV_REFRESH_LIFECYCLE_V2.CANCELLED);
748
+ const now = Date.now();
749
+ j.status = RCGOV_REFRESH_LIFECYCLE_V2.CANCELLED;
750
+ j.updatedAt = now;
751
+ if (!j.settledAt) j.settledAt = now;
752
+ if (reason) j.metadata.cancelReason = String(reason);
753
+ return { ...j, metadata: { ...j.metadata } };
754
+ }
755
+ export function getRcgovRefreshV2(id) {
756
+ const j = _rcgovJsV2.get(id);
757
+ if (!j) return null;
758
+ return { ...j, metadata: { ...j.metadata } };
759
+ }
760
+ export function listRcgovRefreshsV2() {
761
+ return [..._rcgovJsV2.values()].map((j) => ({
762
+ ...j,
763
+ metadata: { ...j.metadata },
764
+ }));
765
+ }
766
+ export function autoStaleIdleRcgovProfilesV2({ now } = {}) {
767
+ const t = now ?? Date.now();
768
+ const flipped = [];
769
+ for (const p of _rcgovPsV2.values())
770
+ if (
771
+ p.status === RCGOV_PROFILE_MATURITY_V2.ACTIVE &&
772
+ t - p.lastTouchedAt >= _rcgovIdleMs
773
+ ) {
774
+ p.status = RCGOV_PROFILE_MATURITY_V2.STALE;
775
+ p.updatedAt = t;
776
+ flipped.push(p.id);
777
+ }
778
+ return { flipped, count: flipped.length };
779
+ }
780
+ export function autoFailStuckRcgovRefreshsV2({ now } = {}) {
781
+ const t = now ?? Date.now();
782
+ const flipped = [];
783
+ for (const j of _rcgovJsV2.values())
784
+ if (
785
+ j.status === RCGOV_REFRESH_LIFECYCLE_V2.REFRESHING &&
786
+ j.startedAt != null &&
787
+ t - j.startedAt >= _rcgovStuckMs
788
+ ) {
789
+ j.status = RCGOV_REFRESH_LIFECYCLE_V2.FAILED;
790
+ j.updatedAt = t;
791
+ if (!j.settledAt) j.settledAt = t;
792
+ j.metadata.failReason = "auto-fail-stuck";
793
+ flipped.push(j.id);
794
+ }
795
+ return { flipped, count: flipped.length };
796
+ }
797
+ export function getResponseCacheGovStatsV2() {
798
+ const profilesByStatus = {};
799
+ for (const v of Object.values(RCGOV_PROFILE_MATURITY_V2))
800
+ profilesByStatus[v] = 0;
801
+ for (const p of _rcgovPsV2.values()) profilesByStatus[p.status]++;
802
+ const refreshsByStatus = {};
803
+ for (const v of Object.values(RCGOV_REFRESH_LIFECYCLE_V2))
804
+ refreshsByStatus[v] = 0;
805
+ for (const j of _rcgovJsV2.values()) refreshsByStatus[j.status]++;
806
+ return {
807
+ totalRcgovProfilesV2: _rcgovPsV2.size,
808
+ totalRcgovRefreshsV2: _rcgovJsV2.size,
809
+ maxActiveRcgovProfilesPerOwner: _rcgovMaxActive,
810
+ maxPendingRcgovRefreshsPerProfile: _rcgovMaxPending,
811
+ rcgovProfileIdleMs: _rcgovIdleMs,
812
+ rcgovRefreshStuckMs: _rcgovStuckMs,
813
+ profilesByStatus,
814
+ refreshsByStatus,
815
+ };
816
+ }
@@ -1002,3 +1002,330 @@ export function getSandboxStatsV2() {
1002
1002
  },
1003
1003
  };
1004
1004
  }
1005
+
1006
+ // =====================================================================
1007
+ // sandbox-v2 V2 governance overlay (iter16)
1008
+ // =====================================================================
1009
+ export const SBOX_PROFILE_MATURITY_V2 = Object.freeze({
1010
+ PENDING: "pending",
1011
+ ACTIVE: "active",
1012
+ PAUSED: "paused",
1013
+ ARCHIVED: "archived",
1014
+ });
1015
+ export const SBOX_EXEC_LIFECYCLE_V2 = Object.freeze({
1016
+ QUEUED: "queued",
1017
+ RUNNING: "running",
1018
+ COMPLETED: "completed",
1019
+ FAILED: "failed",
1020
+ CANCELLED: "cancelled",
1021
+ });
1022
+ const _sboxPTrans = new Map([
1023
+ [
1024
+ SBOX_PROFILE_MATURITY_V2.PENDING,
1025
+ new Set([
1026
+ SBOX_PROFILE_MATURITY_V2.ACTIVE,
1027
+ SBOX_PROFILE_MATURITY_V2.ARCHIVED,
1028
+ ]),
1029
+ ],
1030
+ [
1031
+ SBOX_PROFILE_MATURITY_V2.ACTIVE,
1032
+ new Set([
1033
+ SBOX_PROFILE_MATURITY_V2.PAUSED,
1034
+ SBOX_PROFILE_MATURITY_V2.ARCHIVED,
1035
+ ]),
1036
+ ],
1037
+ [
1038
+ SBOX_PROFILE_MATURITY_V2.PAUSED,
1039
+ new Set([
1040
+ SBOX_PROFILE_MATURITY_V2.ACTIVE,
1041
+ SBOX_PROFILE_MATURITY_V2.ARCHIVED,
1042
+ ]),
1043
+ ],
1044
+ [SBOX_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
1045
+ ]);
1046
+ const _sboxPTerminal = new Set([SBOX_PROFILE_MATURITY_V2.ARCHIVED]);
1047
+ const _sboxJTrans = new Map([
1048
+ [
1049
+ SBOX_EXEC_LIFECYCLE_V2.QUEUED,
1050
+ new Set([SBOX_EXEC_LIFECYCLE_V2.RUNNING, SBOX_EXEC_LIFECYCLE_V2.CANCELLED]),
1051
+ ],
1052
+ [
1053
+ SBOX_EXEC_LIFECYCLE_V2.RUNNING,
1054
+ new Set([
1055
+ SBOX_EXEC_LIFECYCLE_V2.COMPLETED,
1056
+ SBOX_EXEC_LIFECYCLE_V2.FAILED,
1057
+ SBOX_EXEC_LIFECYCLE_V2.CANCELLED,
1058
+ ]),
1059
+ ],
1060
+ [SBOX_EXEC_LIFECYCLE_V2.COMPLETED, new Set()],
1061
+ [SBOX_EXEC_LIFECYCLE_V2.FAILED, new Set()],
1062
+ [SBOX_EXEC_LIFECYCLE_V2.CANCELLED, new Set()],
1063
+ ]);
1064
+ const _sboxPsV2 = new Map();
1065
+ const _sboxJsV2 = new Map();
1066
+ let _sboxMaxActive = 6,
1067
+ _sboxMaxPending = 12,
1068
+ _sboxIdleMs = 30 * 24 * 60 * 60 * 1000,
1069
+ _sboxStuckMs = 60 * 1000;
1070
+ function _sboxPos(n, label) {
1071
+ const v = Math.floor(Number(n));
1072
+ if (!Number.isFinite(v) || v <= 0)
1073
+ throw new Error(`${label} must be positive integer`);
1074
+ return v;
1075
+ }
1076
+ function _sboxCheckP(from, to) {
1077
+ const a = _sboxPTrans.get(from);
1078
+ if (!a || !a.has(to))
1079
+ throw new Error(`invalid sbox profile transition ${from} → ${to}`);
1080
+ }
1081
+ function _sboxCheckJ(from, to) {
1082
+ const a = _sboxJTrans.get(from);
1083
+ if (!a || !a.has(to))
1084
+ throw new Error(`invalid sbox exec transition ${from} → ${to}`);
1085
+ }
1086
+ function _sboxCountActive(owner) {
1087
+ let c = 0;
1088
+ for (const p of _sboxPsV2.values())
1089
+ if (p.owner === owner && p.status === SBOX_PROFILE_MATURITY_V2.ACTIVE) c++;
1090
+ return c;
1091
+ }
1092
+ function _sboxCountPending(profileId) {
1093
+ let c = 0;
1094
+ for (const j of _sboxJsV2.values())
1095
+ if (
1096
+ j.profileId === profileId &&
1097
+ (j.status === SBOX_EXEC_LIFECYCLE_V2.QUEUED ||
1098
+ j.status === SBOX_EXEC_LIFECYCLE_V2.RUNNING)
1099
+ )
1100
+ c++;
1101
+ return c;
1102
+ }
1103
+ export function setMaxActiveSboxProfilesPerOwnerV2(n) {
1104
+ _sboxMaxActive = _sboxPos(n, "maxActiveSboxProfilesPerOwner");
1105
+ }
1106
+ export function getMaxActiveSboxProfilesPerOwnerV2() {
1107
+ return _sboxMaxActive;
1108
+ }
1109
+ export function setMaxPendingSboxExecsPerProfileV2(n) {
1110
+ _sboxMaxPending = _sboxPos(n, "maxPendingSboxExecsPerProfile");
1111
+ }
1112
+ export function getMaxPendingSboxExecsPerProfileV2() {
1113
+ return _sboxMaxPending;
1114
+ }
1115
+ export function setSboxProfileIdleMsV2(n) {
1116
+ _sboxIdleMs = _sboxPos(n, "sboxProfileIdleMs");
1117
+ }
1118
+ export function getSboxProfileIdleMsV2() {
1119
+ return _sboxIdleMs;
1120
+ }
1121
+ export function setSboxExecStuckMsV2(n) {
1122
+ _sboxStuckMs = _sboxPos(n, "sboxExecStuckMs");
1123
+ }
1124
+ export function getSboxExecStuckMsV2() {
1125
+ return _sboxStuckMs;
1126
+ }
1127
+ export function _resetStateSandboxV2() {
1128
+ _sboxPsV2.clear();
1129
+ _sboxJsV2.clear();
1130
+ _sboxMaxActive = 6;
1131
+ _sboxMaxPending = 12;
1132
+ _sboxIdleMs = 30 * 24 * 60 * 60 * 1000;
1133
+ _sboxStuckMs = 60 * 1000;
1134
+ }
1135
+ export function registerSboxProfileV2({ id, owner, template, metadata } = {}) {
1136
+ if (!id || !owner) throw new Error("id and owner required");
1137
+ if (_sboxPsV2.has(id)) throw new Error(`sbox profile ${id} already exists`);
1138
+ const now = Date.now();
1139
+ const p = {
1140
+ id,
1141
+ owner,
1142
+ template: template || "default",
1143
+ status: SBOX_PROFILE_MATURITY_V2.PENDING,
1144
+ createdAt: now,
1145
+ updatedAt: now,
1146
+ lastTouchedAt: now,
1147
+ activatedAt: null,
1148
+ archivedAt: null,
1149
+ metadata: { ...(metadata || {}) },
1150
+ };
1151
+ _sboxPsV2.set(id, p);
1152
+ return { ...p, metadata: { ...p.metadata } };
1153
+ }
1154
+ export function activateSboxProfileV2(id) {
1155
+ const p = _sboxPsV2.get(id);
1156
+ if (!p) throw new Error(`sbox profile ${id} not found`);
1157
+ const isInitial = p.status === SBOX_PROFILE_MATURITY_V2.PENDING;
1158
+ _sboxCheckP(p.status, SBOX_PROFILE_MATURITY_V2.ACTIVE);
1159
+ if (isInitial && _sboxCountActive(p.owner) >= _sboxMaxActive)
1160
+ throw new Error(`max active sbox profiles for owner ${p.owner} reached`);
1161
+ const now = Date.now();
1162
+ p.status = SBOX_PROFILE_MATURITY_V2.ACTIVE;
1163
+ p.updatedAt = now;
1164
+ p.lastTouchedAt = now;
1165
+ if (!p.activatedAt) p.activatedAt = now;
1166
+ return { ...p, metadata: { ...p.metadata } };
1167
+ }
1168
+ export function pauseSboxProfileV2(id) {
1169
+ const p = _sboxPsV2.get(id);
1170
+ if (!p) throw new Error(`sbox profile ${id} not found`);
1171
+ _sboxCheckP(p.status, SBOX_PROFILE_MATURITY_V2.PAUSED);
1172
+ p.status = SBOX_PROFILE_MATURITY_V2.PAUSED;
1173
+ p.updatedAt = Date.now();
1174
+ return { ...p, metadata: { ...p.metadata } };
1175
+ }
1176
+ export function archiveSboxProfileV2(id) {
1177
+ const p = _sboxPsV2.get(id);
1178
+ if (!p) throw new Error(`sbox profile ${id} not found`);
1179
+ _sboxCheckP(p.status, SBOX_PROFILE_MATURITY_V2.ARCHIVED);
1180
+ const now = Date.now();
1181
+ p.status = SBOX_PROFILE_MATURITY_V2.ARCHIVED;
1182
+ p.updatedAt = now;
1183
+ if (!p.archivedAt) p.archivedAt = now;
1184
+ return { ...p, metadata: { ...p.metadata } };
1185
+ }
1186
+ export function touchSboxProfileV2(id) {
1187
+ const p = _sboxPsV2.get(id);
1188
+ if (!p) throw new Error(`sbox profile ${id} not found`);
1189
+ if (_sboxPTerminal.has(p.status))
1190
+ throw new Error(`cannot touch terminal sbox profile ${id}`);
1191
+ const now = Date.now();
1192
+ p.lastTouchedAt = now;
1193
+ p.updatedAt = now;
1194
+ return { ...p, metadata: { ...p.metadata } };
1195
+ }
1196
+ export function getSboxProfileV2(id) {
1197
+ const p = _sboxPsV2.get(id);
1198
+ if (!p) return null;
1199
+ return { ...p, metadata: { ...p.metadata } };
1200
+ }
1201
+ export function listSboxProfilesV2() {
1202
+ return [..._sboxPsV2.values()].map((p) => ({
1203
+ ...p,
1204
+ metadata: { ...p.metadata },
1205
+ }));
1206
+ }
1207
+ export function createSboxExecV2({ id, profileId, command, metadata } = {}) {
1208
+ if (!id || !profileId) throw new Error("id and profileId required");
1209
+ if (_sboxJsV2.has(id)) throw new Error(`sbox exec ${id} already exists`);
1210
+ if (!_sboxPsV2.has(profileId))
1211
+ throw new Error(`sbox profile ${profileId} not found`);
1212
+ if (_sboxCountPending(profileId) >= _sboxMaxPending)
1213
+ throw new Error(`max pending sbox execs for profile ${profileId} reached`);
1214
+ const now = Date.now();
1215
+ const j = {
1216
+ id,
1217
+ profileId,
1218
+ command: command || "",
1219
+ status: SBOX_EXEC_LIFECYCLE_V2.QUEUED,
1220
+ createdAt: now,
1221
+ updatedAt: now,
1222
+ startedAt: null,
1223
+ settledAt: null,
1224
+ metadata: { ...(metadata || {}) },
1225
+ };
1226
+ _sboxJsV2.set(id, j);
1227
+ return { ...j, metadata: { ...j.metadata } };
1228
+ }
1229
+ export function runningSboxExecV2(id) {
1230
+ const j = _sboxJsV2.get(id);
1231
+ if (!j) throw new Error(`sbox exec ${id} not found`);
1232
+ _sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.RUNNING);
1233
+ const now = Date.now();
1234
+ j.status = SBOX_EXEC_LIFECYCLE_V2.RUNNING;
1235
+ j.updatedAt = now;
1236
+ if (!j.startedAt) j.startedAt = now;
1237
+ return { ...j, metadata: { ...j.metadata } };
1238
+ }
1239
+ export function completeExecSboxV2(id) {
1240
+ const j = _sboxJsV2.get(id);
1241
+ if (!j) throw new Error(`sbox exec ${id} not found`);
1242
+ _sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.COMPLETED);
1243
+ const now = Date.now();
1244
+ j.status = SBOX_EXEC_LIFECYCLE_V2.COMPLETED;
1245
+ j.updatedAt = now;
1246
+ if (!j.settledAt) j.settledAt = now;
1247
+ return { ...j, metadata: { ...j.metadata } };
1248
+ }
1249
+ export function failSboxExecV2(id, reason) {
1250
+ const j = _sboxJsV2.get(id);
1251
+ if (!j) throw new Error(`sbox exec ${id} not found`);
1252
+ _sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.FAILED);
1253
+ const now = Date.now();
1254
+ j.status = SBOX_EXEC_LIFECYCLE_V2.FAILED;
1255
+ j.updatedAt = now;
1256
+ if (!j.settledAt) j.settledAt = now;
1257
+ if (reason) j.metadata.failReason = String(reason);
1258
+ return { ...j, metadata: { ...j.metadata } };
1259
+ }
1260
+ export function cancelSboxExecV2(id, reason) {
1261
+ const j = _sboxJsV2.get(id);
1262
+ if (!j) throw new Error(`sbox exec ${id} not found`);
1263
+ _sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.CANCELLED);
1264
+ const now = Date.now();
1265
+ j.status = SBOX_EXEC_LIFECYCLE_V2.CANCELLED;
1266
+ j.updatedAt = now;
1267
+ if (!j.settledAt) j.settledAt = now;
1268
+ if (reason) j.metadata.cancelReason = String(reason);
1269
+ return { ...j, metadata: { ...j.metadata } };
1270
+ }
1271
+ export function getSboxExecV2(id) {
1272
+ const j = _sboxJsV2.get(id);
1273
+ if (!j) return null;
1274
+ return { ...j, metadata: { ...j.metadata } };
1275
+ }
1276
+ export function listSboxExecsV2() {
1277
+ return [..._sboxJsV2.values()].map((j) => ({
1278
+ ...j,
1279
+ metadata: { ...j.metadata },
1280
+ }));
1281
+ }
1282
+ export function autoPauseIdleSboxProfilesV2({ now } = {}) {
1283
+ const t = now ?? Date.now();
1284
+ const flipped = [];
1285
+ for (const p of _sboxPsV2.values())
1286
+ if (
1287
+ p.status === SBOX_PROFILE_MATURITY_V2.ACTIVE &&
1288
+ t - p.lastTouchedAt >= _sboxIdleMs
1289
+ ) {
1290
+ p.status = SBOX_PROFILE_MATURITY_V2.PAUSED;
1291
+ p.updatedAt = t;
1292
+ flipped.push(p.id);
1293
+ }
1294
+ return { flipped, count: flipped.length };
1295
+ }
1296
+ export function autoFailStuckSboxExecsV2({ now } = {}) {
1297
+ const t = now ?? Date.now();
1298
+ const flipped = [];
1299
+ for (const j of _sboxJsV2.values())
1300
+ if (
1301
+ j.status === SBOX_EXEC_LIFECYCLE_V2.RUNNING &&
1302
+ j.startedAt != null &&
1303
+ t - j.startedAt >= _sboxStuckMs
1304
+ ) {
1305
+ j.status = SBOX_EXEC_LIFECYCLE_V2.FAILED;
1306
+ j.updatedAt = t;
1307
+ if (!j.settledAt) j.settledAt = t;
1308
+ j.metadata.failReason = "auto-fail-stuck";
1309
+ flipped.push(j.id);
1310
+ }
1311
+ return { flipped, count: flipped.length };
1312
+ }
1313
+ export function getSandboxGovStatsV2() {
1314
+ const profilesByStatus = {};
1315
+ for (const v of Object.values(SBOX_PROFILE_MATURITY_V2))
1316
+ profilesByStatus[v] = 0;
1317
+ for (const p of _sboxPsV2.values()) profilesByStatus[p.status]++;
1318
+ const execsByStatus = {};
1319
+ for (const v of Object.values(SBOX_EXEC_LIFECYCLE_V2)) execsByStatus[v] = 0;
1320
+ for (const j of _sboxJsV2.values()) execsByStatus[j.status]++;
1321
+ return {
1322
+ totalSboxProfilesV2: _sboxPsV2.size,
1323
+ totalSboxExecsV2: _sboxJsV2.size,
1324
+ maxActiveSboxProfilesPerOwner: _sboxMaxActive,
1325
+ maxPendingSboxExecsPerProfile: _sboxMaxPending,
1326
+ sboxProfileIdleMs: _sboxIdleMs,
1327
+ sboxExecStuckMs: _sboxStuckMs,
1328
+ profilesByStatus,
1329
+ execsByStatus,
1330
+ };
1331
+ }