chainlesschain 0.166.22 → 0.166.25

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 (298) hide show
  1. package/README.md +46 -3
  2. package/package.json +4 -3
  3. package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-RaxL_QQD.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DD3ieFO-.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-CATDJukS.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-BHGsnRDS.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-BL6NunjN.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-D0nEWfbA.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-BAP1MUol.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-R4y2OeSi.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-ByQZ2z6S.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-32uV--xF.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-t1enanwz.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-D1CB-7bq.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-BPx3dQ2q.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-DkPTQ2Gl.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-ZriaxRlr.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-C_qJ0P7F.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-Bgoy-saS.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-B5i9y6XK.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-D7vBJ5-J.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-D4kvoGI_.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-BLOeBd-r.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-mecJaonC.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-GPKwaFer.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-BML9m7Dd.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-DN5bAtJC.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-DmD6Gecd.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-6wwplN_K.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUhpLkDL.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-eJfyXkwf.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-swAUW59x.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-CbdwJPDJ.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-UuYpg1nm.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-CS0G057y.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-BxIIB4k3.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-CZRjuvvI.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BOJ9A_Rf.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-BnkrR-Ok.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-Do4mPi13.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-2JxWa6-p.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-CS_mnpGd.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-DZ4J_351.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-Jh74zKXu.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-_4n2BfnS.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-CtENcKHv.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-dgDCvpK9.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-D5VxCrmG.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-CpIF8Xkd.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-aHnBZaez.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-8ppzog2V.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-D3p1BXkp.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-D7vflD5q.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-D2hY-Ek2.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-qK2VqhJC.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-DHJr4uu0.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-DMBS6trm.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-D3Ng74BT.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-CvtU5peJ.js → Projects-BfJFZiIW.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-DlNA95G0.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CMOIYxIm.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-D6MyGp5I.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-W6WcShtf.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-Dm_MjlV_.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-Ctvij6eX.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DivbeDE-.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-D4famoAw.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-6gOAh3zG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-DApb9kK8.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-B8OomyE2.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-BTJ2g2E3.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-NIRr4DD1.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BQHP_6px.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BudpA5kr.js → SpeechSettings-BVQTDSVS.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-BOD4Mar6.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Ciu7H2-y.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CtlwavRU.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-QLWYJdL6.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-B3q10mjm.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CqltBA_8.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-CJOKrj4y.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-CPMGgfdM.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-DiJms7Bl.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-rakR8eel.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-DAWZUM5o.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-DqUPnl7K.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-BnVUwvMm.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-B1CAwxgs.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-k2-0Jzfy.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-BAu8xBmW.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-DMlqcdfI.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BU9kfiSw.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DuGrUMAS.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-2vacgdcl.js} +1 -1
  95. package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-B-C-Ruft.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-B7wDjYUd.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-BMq0frKK.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DrOalGut.js → index-BUX4W-2v.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-BZz2eB33.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-BblNQlaA.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-BdfKoqsK.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DiT_REby.js → index-Bf8YofPE.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-Bn8tARil.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-Bpe2CJd-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-BxctzdYQ.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-C24NoPpy.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-C5C4kSi8.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-C6ICn9Y6.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-C8ldqZi6.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-C9WsM29I.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-CONPVaxw.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-CPyYXKFB.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CSvSf9px.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CXmpR6N3.js} +3 -3
  115. package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Chybe7Ge.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CyXmP3PW.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-DCusBOqR.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-DH01oIaj.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-DHg3LMNP.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-DWLTSIka.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DaUGdvtU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DcA-tEQd.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DfWvcu4p.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-DmZNnZz7.js} +1 -1
  125. package/src/assets/web-panel/assets/index-DvFfMAux.js +1 -0
  126. package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-JsyGqKmD.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-TtrpHmYx.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-Ygh0wmKz.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-dIYqw3f0.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-hDHHJYno.js} +1 -1
  131. package/src/assets/web-panel/assets/index-n6p-1A77.js +1 -0
  132. package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-oElehY4F.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-z4_YwZDW.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-B9OXWu2e.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-IQ47MCDQ.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-CLCU4kjV.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CXnVlSPq.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-BJjLXB0f.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BHdtvdy6.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-oq8X_Bwc.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-DTD02LAO.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-DbEeq8to.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-Do2fy1CJ.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-CFWD63T-.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-BeozAWOo.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-0-rIgnBL.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-CeiNoI31.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Dj0ReRNg.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-DD7MC4Dy.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +18 -1
  153. package/src/commands/evolution-benchmark.js +72 -0
  154. package/src/commands/evolution-knowledge.js +40 -1
  155. package/src/commands/evolution.js +2 -0
  156. package/src/commands/governed-skill-marketplace.js +142 -0
  157. package/src/commands/marketplace.js +4 -1
  158. package/src/commands/serve.js +21 -0
  159. package/src/commands/skill.js +3 -0
  160. package/src/data/changelog.json +39 -0
  161. package/src/gateways/ws/ws-agent-handler.js +59 -2
  162. package/src/gateways/ws/ws-server.js +2 -0
  163. package/src/generated/cc-agent-protocol.schema.json +3 -1
  164. package/src/harness/golden-transcript.js +1 -0
  165. package/src/harness/prompt-compressor.js +51 -5
  166. package/src/harness/provider-backed-compaction.js +28 -1
  167. package/src/harness/remote-session-registry.js +15 -3
  168. package/src/index.js +20 -2
  169. package/src/lazy-dispatch.js +6 -0
  170. package/src/lib/advisor-runtime.js +55 -2
  171. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  172. package/src/lib/app-server/graph-runtime.js +32 -0
  173. package/src/lib/app-server/server.js +94 -1
  174. package/src/lib/app-server/websocket-transport.js +15 -0
  175. package/src/lib/autonomous-agent.js +63 -13
  176. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  177. package/src/lib/cowork/debate-review-cli.js +4 -3
  178. package/src/lib/cowork/decision-kb-cli.js +5 -0
  179. package/src/lib/cowork-adapter.js +38 -16
  180. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  181. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  182. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  183. package/src/lib/evolution/agent-model-projection.js +437 -0
  184. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  185. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  186. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  187. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +32 -10
  188. package/src/lib/evolution/evidence-json-text.js +236 -0
  189. package/src/lib/evolution/evolution-artifact-ports.js +196 -21
  190. package/src/lib/evolution/evolution-deployment-loader.js +240 -2
  191. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  192. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  193. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  194. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  195. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  196. package/src/lib/evolution/evolution-evidence-projector.js +271 -37
  197. package/src/lib/evolution/evolution-file-witness.js +153 -30
  198. package/src/lib/evolution/evolution-ledger-ports.js +1219 -66
  199. package/src/lib/evolution/evolution-ledger.js +66 -2
  200. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  201. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  202. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  203. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  204. package/src/lib/evolution/evolution-release-train.js +54 -6
  205. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  206. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  207. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  208. package/src/lib/evolution/evolution-workbench-projection.js +134 -26
  209. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  210. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  211. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  212. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  213. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  214. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  215. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  216. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -0
  217. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  218. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  219. package/src/lib/evolution/governed-knowledge-dependency-inventory.js +392 -0
  220. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +217 -82
  221. package/src/lib/evolution/governed-knowledge-quarantine-release.js +1013 -0
  222. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  223. package/src/lib/evolution/governed-knowledge-revocation-host.js +59 -0
  224. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  225. package/src/lib/evolution/governed-knowledge-skill-rollback.js +510 -0
  226. package/src/lib/evolution/governed-knowledge-sync.js +181 -95
  227. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +516 -0
  228. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  229. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  230. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  231. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  232. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  233. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  234. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  235. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  236. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  237. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  238. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  239. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  240. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  241. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  242. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  243. package/src/lib/evolution/knowledge-wiki-source-admission.js +283 -0
  244. package/src/lib/evolution/knowledge-wiki-source-provenance.js +360 -0
  245. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  246. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  247. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  248. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  249. package/src/lib/evolution/skill-candidate-registry.js +43 -3
  250. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  251. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  252. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  253. package/src/lib/evolution/skill-release-registry.js +168 -4
  254. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  255. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  256. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  257. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  258. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  259. package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
  260. package/src/lib/evolution/statistical-progressive-canary.js +165 -3
  261. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  262. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  263. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  264. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  265. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +822 -101
  266. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  267. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  268. package/src/lib/evolution/wiki-target-tombstone-revision.js +109 -0
  269. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  270. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  271. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  272. package/src/lib/evolution/wikiskill-benchmark.js +80 -16
  273. package/src/lib/goal-assess.js +17 -10
  274. package/src/lib/interactive-planner.js +9 -1
  275. package/src/lib/iteration-budget.js +16 -2
  276. package/src/lib/micro-compact.js +4 -1
  277. package/src/lib/model-failure-policy.js +21 -0
  278. package/src/lib/process-execution-broker/index.js +1 -0
  279. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  280. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  281. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  282. package/src/lib/read-file-loop-guard.js +113 -0
  283. package/src/lib/read-file-page.js +191 -0
  284. package/src/lib/runnable-provider.js +2 -1
  285. package/src/lib/skill-retrieval-router.js +22 -1
  286. package/src/repl/agent-repl.js +133 -34
  287. package/src/runtime/agent-core.js +196 -74
  288. package/src/runtime/agent-runtime.js +43 -0
  289. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  290. package/src/runtime/fallback-model.js +143 -62
  291. package/src/runtime/headless-runner.js +54 -10
  292. package/src/runtime/headless-stream.js +50 -6
  293. package/src/runtime/runtime-factory.js +41 -2
  294. package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +0 -1
  295. package/src/assets/web-panel/assets/MarkdownRenderer-DqTx7_u1.js +0 -1
  296. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
  297. package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
  298. package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
@@ -13,6 +13,10 @@ import {
13
13
  verifySkillPromotionReviewDecision,
14
14
  verifySkillPromotionReviewPacketArtifact,
15
15
  } from "./skill-promotion-review.js";
16
+ import {
17
+ SKILL_WIKI_REVIEW_DECISION_SCHEMA,
18
+ createSkillWikiReviewReconciliationSource,
19
+ } from "./skill-wiki-reconciliation.js";
16
20
 
17
21
  export const SKILL_PROMOTION_REVIEW_REQUEST_EVENT_TYPE =
18
22
  "skill.promotion-review.requested";
@@ -298,6 +302,9 @@ export class SkillPromotionReviewLedgerAdapter {
298
302
  ) {
299
303
  throw new Error("review decision signature verification failed");
300
304
  }
305
+ // The verifier may perform I/O. Do not commit an approval whose lease
306
+ // expired while that verification was in flight.
307
+ verifySkillPromotionReviewDecision(decision, packet, Number(this._now()));
301
308
  const decisionsForPacket = this._decisionEntries().filter(
302
309
  ({ decision: stored }) => stored.packetDigest === packet.packetDigest,
303
310
  );
@@ -400,6 +407,67 @@ export class SkillPromotionReviewLedgerAdapter {
400
407
  return Object.freeze(output);
401
408
  }
402
409
 
410
+ // Historical evidence is not a fresh approval. Workbench recovery may use
411
+ // this only to reconcile an effect already committed to this exact Ledger.
412
+ async readReview(packetDigest) {
413
+ if (!DIGEST.test(packetDigest ?? ""))
414
+ throw new TypeError("packetDigest is required");
415
+ const head = this._verifyLedger();
416
+ const { packet, event: packetEvent } = this._packetByDigest(packetDigest);
417
+ const matches = this._decisionEntries().filter(
418
+ ({ decision }) => decision.packetDigest === packetDigest,
419
+ );
420
+ if (matches.length > 1) corrupt("review packet has conflicting decisions");
421
+ const entry = matches[0] ?? null;
422
+ for (const event of [packetEvent, entry?.event].filter(Boolean)) {
423
+ if (
424
+ event.artifactTenantId !== this.descriptor.artifactTenantId ||
425
+ event.skillName !== packet.skillName ||
426
+ packet.tenantId !== this.descriptor.tenantId
427
+ )
428
+ corrupt("review evidence crossed its durable scope");
429
+ }
430
+ if (
431
+ packetEvent.decision !== "proposed" ||
432
+ packetEvent.sourceRefs.length !== 0
433
+ )
434
+ corrupt("review packet lineage is invalid");
435
+ if (entry) {
436
+ verifySkillPromotionReviewDecision(
437
+ entry.decision,
438
+ packet,
439
+ Date.parse(entry.decision.decidedAt),
440
+ );
441
+ if (
442
+ entry.event.sequence <= packetEvent.sequence ||
443
+ entry.event.timestamp !== entry.decision.decidedAt ||
444
+ entry.event.reason !== entry.decision.reason ||
445
+ entry.event.decision !==
446
+ (entry.decision.decision === "approved" ? "accepted" : "rejected")
447
+ )
448
+ corrupt("review decision event binding is invalid");
449
+ if (
450
+ (await this._verifyDecisionSignature({
451
+ decision: entry.decision,
452
+ packet,
453
+ source: "workbench-recovery",
454
+ ledgerEventDigest: entry.event.eventDigest,
455
+ })) !== true
456
+ )
457
+ throw new Error("review decision signature verification failed");
458
+ }
459
+ if (this._verifyLedger().headDigest !== head.headDigest)
460
+ corrupt("review Ledger changed during evidence authentication");
461
+ return Object.freeze({
462
+ packet,
463
+ packetRef: packetEvent.subjectRef,
464
+ packetSequence: packetEvent.sequence,
465
+ decision: entry?.decision ?? null,
466
+ decisionRef: entry?.event.subjectRef ?? null,
467
+ decisionSequence: entry?.event.sequence ?? null,
468
+ });
469
+ }
470
+
403
471
  createDecisionResolver() {
404
472
  return Object.freeze({
405
473
  resolve: async (request) => {
@@ -444,6 +512,38 @@ export class SkillPromotionReviewLedgerAdapter {
444
512
  },
445
513
  });
446
514
  }
515
+
516
+ createWikiRejectionReconciliationSource() {
517
+ return createSkillWikiReviewReconciliationSource({
518
+ tenantId: this.descriptor.tenantId,
519
+ streamId: `${this.descriptor.streamId}:wiki-rejections`,
520
+ readReviewDecisions: async () => {
521
+ await this.listReviews();
522
+ return this._decisionEntries()
523
+ .filter(({ decision }) => decision.decision === "rejected")
524
+ .map(({ decision, event }) => {
525
+ const { packet } = this._packetByDigest(decision.packetDigest);
526
+ return {
527
+ schema: SKILL_WIKI_REVIEW_DECISION_SCHEMA,
528
+ authenticated: true,
529
+ durable: true,
530
+ tenantId: this.descriptor.tenantId,
531
+ streamId: `${this.descriptor.streamId}:wiki-rejections`,
532
+ sequence: event.sequence,
533
+ candidateId: packet.candidateId,
534
+ skillName: packet.skillName,
535
+ decision: decision.decision,
536
+ reason: decision.reason,
537
+ occurredAt: decision.decidedAt,
538
+ packetDigest: decision.packetDigest,
539
+ decisionReceiptDigest: decision.receiptDigest,
540
+ sourceEvidenceRefs: packet.evidenceSummary,
541
+ sourceReceiptDigest: event.eventDigest,
542
+ };
543
+ });
544
+ },
545
+ });
546
+ }
447
547
  }
448
548
 
449
549
  export function createSkillPromotionReviewLedgerAdapter(options) {
@@ -8,7 +8,10 @@ import {
8
8
  import {
9
9
  EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
10
10
  EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
11
+ EVOLUTION_LEDGER_MAX_EVENTS,
12
+ EvolutionLedger,
11
13
  } from "./evolution-ledger.js";
14
+ import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
12
15
  import {
13
16
  EMPTY_SKILL_ACTIVE_DIGEST,
14
17
  captureSkillEvaluatedPromotionControlPlane,
@@ -22,6 +25,10 @@ import {
22
25
  digestSkillMutationTransitionSubject,
23
26
  verifySkillMutationRequest,
24
27
  } from "./skill-mutation-authority.js";
28
+ import {
29
+ SKILL_WIKI_TRANSITION_SCHEMA,
30
+ createSkillWikiReconciliationSource,
31
+ } from "./skill-wiki-reconciliation.js";
25
32
 
26
33
  export const SKILL_REGISTRY_TRANSITION_REQUEST_SCHEMA =
27
34
  "chainlesschain.skill-registry-transition-request/v1";
@@ -125,6 +132,85 @@ const SETTLEMENT_KEYS = new Set([
125
132
  "settlementDigest",
126
133
  ]);
127
134
  const AUTHORIZATION_TTL_MS = 4 * 60_000;
135
+ const sortedRefs = (refs) =>
136
+ [...refs].sort((left, right) =>
137
+ left.ref < right.ref
138
+ ? -1
139
+ : left.ref > right.ref
140
+ ? 1
141
+ : left.digest < right.digest
142
+ ? -1
143
+ : left.digest > right.digest
144
+ ? 1
145
+ : 0,
146
+ );
147
+
148
+ // Read-only assembly over the same canonical parsing/effect checks as the
149
+ // transition writer. No source verifier, mutation authority or writer is
150
+ // invented merely to inspect existing workflow records.
151
+ export function createSkillRegistryTransitionLedgerReader({
152
+ descriptor,
153
+ ledger,
154
+ ledgerArtifactResolver,
155
+ releaseRegistry,
156
+ } = {}) {
157
+ if (
158
+ !(ledger instanceof EvolutionLedger) ||
159
+ utilTypes.isProxy(ledger) ||
160
+ !isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)
161
+ )
162
+ throw new TypeError(
163
+ "transition reader requires actual Ledger and artifact resolver",
164
+ );
165
+ const registry = captureSkillReleaseRegistryReader(releaseRegistry);
166
+ const scope = normalizeDescriptor(descriptor);
167
+ if (registry.tenantId !== scope.tenantId)
168
+ throw new TypeError("transition reader Registry tenant differs");
169
+ const view = {
170
+ descriptor: scope,
171
+ _readLedger: () =>
172
+ EvolutionLedger.prototype.read.call(ledger, {
173
+ limit: EVOLUTION_LEDGER_MAX_EVENTS,
174
+ }),
175
+ _verifyLedger: EvolutionLedger.prototype.verify.bind(ledger),
176
+ _resolveArtifact: ledgerArtifactResolver,
177
+ _readState: registry.readState,
178
+ _readRelease: registry.readRelease,
179
+ };
180
+ for (const name of [
181
+ "_events",
182
+ "_resolveEvent",
183
+ "_requests",
184
+ "_attempts",
185
+ "_settlements",
186
+ "_verifyCommittedSettlement",
187
+ "list",
188
+ ])
189
+ view[name] =
190
+ SkillRegistryTransitionLedgerAdapter.prototype[name].bind(view);
191
+ Object.freeze(view);
192
+ return Object.freeze({
193
+ list() {
194
+ const before = view._verifyLedger();
195
+ const rows = view.list();
196
+ const settlements = rows.some((row) => row.status === "committed")
197
+ ? view._settlements()
198
+ : [];
199
+ const values = rows.map((row) => ({
200
+ ...row,
201
+ settlementEventSequence:
202
+ settlements.find(
203
+ (entry) => entry.settlement.requestId === row.request.requestId,
204
+ )?.event.sequence ?? null,
205
+ }));
206
+ if (values.length > 10_000 || !same(before, view._verifyLedger()))
207
+ throw new Error(
208
+ "transition history is over budget or changed during authentication",
209
+ );
210
+ return deepFreeze(values);
211
+ },
212
+ });
213
+ }
128
214
 
129
215
  function canonical(value) {
130
216
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -703,8 +789,13 @@ export class SkillRegistryTransitionLedgerAdapter {
703
789
  event.skillName !== settlement.skillName ||
704
790
  !Array.isArray(event.sourceRefs) ||
705
791
  event.sourceRefs.length !== 2 ||
706
- !same(event.sourceRefs[0], attempt.request.event.subjectRef) ||
707
- !same(event.sourceRefs[1], attempt.event.subjectRef)
792
+ !same(
793
+ event.sourceRefs,
794
+ sortedRefs([
795
+ attempt.request.event.subjectRef,
796
+ attempt.event.subjectRef,
797
+ ]),
798
+ )
708
799
  ) {
709
800
  fail(
710
801
  SKILL_REGISTRY_TRANSITION_CORRUPT_CODE,
@@ -1174,6 +1265,44 @@ export class SkillRegistryTransitionLedgerAdapter {
1174
1265
  );
1175
1266
  }
1176
1267
 
1268
+ createWikiReconciliationSource() {
1269
+ return createSkillWikiReconciliationSource({
1270
+ tenantId: this.descriptor.tenantId,
1271
+ streamId: this.descriptor.streamId,
1272
+ readTransitions: () =>
1273
+ this._settlements().map(({ event, settlement }) => {
1274
+ const candidate = this._readCandidate(settlement.candidateId);
1275
+ if (
1276
+ candidate?.tenantId !== this.descriptor.tenantId ||
1277
+ candidate.candidateId !== settlement.candidateId ||
1278
+ candidate.skillName !== settlement.skillName
1279
+ ) {
1280
+ fail(
1281
+ SKILL_REGISTRY_TRANSITION_CORRUPT_CODE,
1282
+ "transition candidate lineage is invalid for Wiki reconciliation",
1283
+ );
1284
+ }
1285
+ return {
1286
+ schema: SKILL_WIKI_TRANSITION_SCHEMA,
1287
+ authenticated: true,
1288
+ durable: true,
1289
+ tenantId: this.descriptor.tenantId,
1290
+ streamId: this.descriptor.streamId,
1291
+ sequence: event.sequence,
1292
+ candidateId: settlement.candidateId,
1293
+ skillName: settlement.skillName,
1294
+ activeReleaseDigest: settlement.activeReleaseDigest,
1295
+ stateDigest: settlement.stateDigest,
1296
+ settlementDigest: settlement.settlementDigest,
1297
+ occurredAt: settlement.settledAt,
1298
+ wikiRevision: candidate.wikiRevision,
1299
+ sourceEvidenceRefs: candidate.sourceEvidenceRefs,
1300
+ sourceReceiptDigest: event.eventDigest,
1301
+ };
1302
+ }),
1303
+ });
1304
+ }
1305
+
1177
1306
  async processNext() {
1178
1307
  const pending = this.list().find((entry) => entry.status === "pending");
1179
1308
  if (!pending) return deepFreeze({ processed: false });
@@ -60,6 +60,17 @@ export const SKILL_RELEASE_JOURNAL_ARCHIVE_SCHEMA =
60
60
  "chainlesschain.skill-release-journal-archive/v1";
61
61
 
62
62
  const JOURNAL_SCHEMA = "chainlesschain.skill-release-journal/v4";
63
+ const REGISTRY_READERS = new WeakMap();
64
+
65
+ export function captureSkillReleaseRegistryReader(value) {
66
+ const reader = REGISTRY_READERS.get(value);
67
+ if (
68
+ !reader ||
69
+ Object.getPrototypeOf(value) !== SkillReleaseRegistry.prototype
70
+ )
71
+ throw new TypeError("a genuine SkillReleaseRegistry reader is required");
72
+ return reader;
73
+ }
63
74
  const INTENT_SCHEMA = "chainlesschain.skill-release-transition-intent/v2";
64
75
  const RELEASE_DOMAIN = `${SKILL_RELEASE_SCHEMA}\0`;
65
76
  const STATE_DOMAIN = `${SKILL_RELEASE_STATE_SCHEMA}\0`;
@@ -76,6 +87,9 @@ const TENANT_KEY_PATTERN = /^[a-f0-9]{64}$/u;
76
87
  const TEMP_PATTERN = /^\.(?:release|state|write)-[A-Za-z0-9._-]+\.tmp$/u;
77
88
  const MAX_FILE_BYTES = 4 * 1024 * 1024;
78
89
  const MAX_TENANT_MARKER_BYTES = 4096;
90
+ export const SKILL_RELEASE_INVENTORY_MAX_ENTRIES = 4_096;
91
+ export const SKILL_RELEASE_INVENTORY_MAX_BYTES = 32 * 1024 * 1024;
92
+ export const SKILL_RELEASE_INVENTORY_MAX_NODES = 1_000_000;
79
93
  const MAX_CANONICAL_DEPTH = 32;
80
94
  const MAX_CANONICAL_NODES = 100_000;
81
95
  const MAX_CANONICAL_ARRAY_ENTRIES = 65_536;
@@ -2765,6 +2779,18 @@ export class SkillReleaseRegistry {
2765
2779
  { cause },
2766
2780
  );
2767
2781
  }
2782
+ REGISTRY_READERS.set(
2783
+ this,
2784
+ Object.freeze({
2785
+ tenantId: ownerTenantId,
2786
+ readActive: SkillReleaseRegistry.prototype.readActive.bind(this),
2787
+ readState: SkillReleaseRegistry.prototype.readState.bind(this),
2788
+ readRelease: SkillReleaseRegistry.prototype.readRelease.bind(this),
2789
+ readInventory:
2790
+ SkillReleaseRegistry.prototype.readInventory.bind(this),
2791
+ matchesTransactionLedger: (value) => value === transactionLedger,
2792
+ }),
2793
+ );
2768
2794
  Object.freeze(this);
2769
2795
  }
2770
2796
 
@@ -3677,7 +3703,7 @@ export class SkillReleaseRegistry {
3677
3703
  });
3678
3704
  let projection;
3679
3705
  try {
3680
- projection = this.#ledgerMigrate(request);
3706
+ projection = this.#ledgerMigrate(request, { active, lastKnownGood });
3681
3707
  } catch (cause) {
3682
3708
  throw failure(
3683
3709
  "SKILL_RELEASE_STATE_MIGRATION_LEDGER_FAILED",
@@ -3861,6 +3887,144 @@ export class SkillReleaseRegistry {
3861
3887
  });
3862
3888
  }
3863
3889
 
3890
+ #readInventoryNames(area, pattern) {
3891
+ const directory = this.#directories[area]?.path;
3892
+ if (!directory || typeof this.#fs.opendirSync !== "function") {
3893
+ throw failure(
3894
+ "SKILL_RELEASE_STORE_UNSAFE",
3895
+ "release inventory requires bounded directory enumeration",
3896
+ );
3897
+ }
3898
+ const names = [];
3899
+ let handle = null;
3900
+ let enumerationError = null;
3901
+ try {
3902
+ handle = this.#fs.opendirSync(directory);
3903
+ while (true) {
3904
+ const entry = handle.readSync();
3905
+ if (entry === null) break;
3906
+ if (
3907
+ !entry ||
3908
+ typeof entry.name !== "string" ||
3909
+ !pattern.test(entry.name)
3910
+ ) {
3911
+ throw failure(
3912
+ "SKILL_RELEASE_STORE_UNSAFE",
3913
+ `release inventory found an unexpected ${area} entry`,
3914
+ );
3915
+ }
3916
+ if (names.length >= SKILL_RELEASE_INVENTORY_MAX_ENTRIES) {
3917
+ throw failure(
3918
+ "SKILL_RELEASE_STORE_LIMIT",
3919
+ `release inventory ${area} entry limit was exceeded`,
3920
+ );
3921
+ }
3922
+ names.push(entry.name);
3923
+ }
3924
+ } catch (cause) {
3925
+ enumerationError =
3926
+ cause instanceof SkillReleaseRegistryError
3927
+ ? cause
3928
+ : failure(
3929
+ "SKILL_RELEASE_STORE_UNSAFE",
3930
+ `release inventory could not enumerate ${area} safely`,
3931
+ { cause },
3932
+ );
3933
+ }
3934
+ if (handle !== null && typeof handle.closeSync === "function") {
3935
+ try {
3936
+ handle.closeSync();
3937
+ } catch (cause) {
3938
+ enumerationError = failure(
3939
+ "SKILL_RELEASE_STORE_UNSAFE",
3940
+ `release inventory could not close ${area} safely`,
3941
+ { cause, enumerationError },
3942
+ );
3943
+ }
3944
+ }
3945
+ if (enumerationError !== null) throw enumerationError;
3946
+ return names.sort();
3947
+ }
3948
+
3949
+ readInventory() {
3950
+ this.#assertBoundary();
3951
+ const releasePattern = /^[a-f0-9]{64}\.json$/u;
3952
+ const statePattern = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*\.json$/u;
3953
+ const beforeReleases = this.#readInventoryNames(
3954
+ "artifacts",
3955
+ releasePattern,
3956
+ );
3957
+ const beforeStates = this.#readInventoryNames("active", statePattern);
3958
+ if (
3959
+ beforeReleases.length + beforeStates.length >
3960
+ SKILL_RELEASE_INVENTORY_MAX_ENTRIES
3961
+ ) {
3962
+ throw failure(
3963
+ "SKILL_RELEASE_STORE_LIMIT",
3964
+ "release inventory aggregate entry limit was exceeded",
3965
+ );
3966
+ }
3967
+ const releases = beforeReleases.map((name) =>
3968
+ this.readRelease(`sha256:${name.slice(0, -".json".length)}`),
3969
+ );
3970
+ const active = beforeStates.map((name) => {
3971
+ const skill = name.slice(0, -".json".length);
3972
+ const value = this.readActive(skill);
3973
+ if (value === null) {
3974
+ throw failure(
3975
+ "SKILL_RELEASE_STATE_CORRUPT",
3976
+ "persisted active state has no committed release",
3977
+ );
3978
+ }
3979
+ return deepFreeze({ skillName: skill, ...value });
3980
+ });
3981
+ let bytes = 0;
3982
+ let nodes = 0;
3983
+ const stack = [...releases, ...active.map(({ state }) => state)];
3984
+ for (const value of stack) {
3985
+ bytes += Buffer.byteLength(canonicalJson(value), "utf8");
3986
+ const pending = [value];
3987
+ while (pending.length > 0) {
3988
+ const node = pending.pop();
3989
+ nodes += 1;
3990
+ if (nodes > SKILL_RELEASE_INVENTORY_MAX_NODES) {
3991
+ throw failure(
3992
+ "SKILL_RELEASE_STORE_LIMIT",
3993
+ "release inventory aggregate node limit was exceeded",
3994
+ );
3995
+ }
3996
+ if (node !== null && typeof node === "object") {
3997
+ pending.push(...(Array.isArray(node) ? node : Object.values(node)));
3998
+ }
3999
+ }
4000
+ }
4001
+ if (bytes > SKILL_RELEASE_INVENTORY_MAX_BYTES) {
4002
+ throw failure(
4003
+ "SKILL_RELEASE_STORE_LIMIT",
4004
+ "release inventory aggregate byte limit was exceeded",
4005
+ );
4006
+ }
4007
+ const afterReleases = this.#readInventoryNames("artifacts", releasePattern);
4008
+ const afterStates = this.#readInventoryNames("active", statePattern);
4009
+ const afterStateDigests = afterStates.map((name) =>
4010
+ this.readState(name.slice(0, -".json".length)).stateDigest,
4011
+ );
4012
+ if (
4013
+ canonicalJson(beforeReleases) !== canonicalJson(afterReleases) ||
4014
+ canonicalJson(beforeStates) !== canonicalJson(afterStates) ||
4015
+ active.some(
4016
+ ({ state }, index) => state.stateDigest !== afterStateDigests[index],
4017
+ )
4018
+ ) {
4019
+ throw failure(
4020
+ "SKILL_RELEASE_STORE_UNSAFE",
4021
+ "release inventory changed during authenticated enumeration",
4022
+ );
4023
+ }
4024
+ this.#assertBoundary();
4025
+ return deepFreeze({ active, releases });
4026
+ }
4027
+
3864
4028
  pinActive(name) {
3865
4029
  const active = this.readActive(name);
3866
4030
  if (!active)
@@ -4606,10 +4770,10 @@ export class SkillReleaseRegistry {
4606
4770
  );
4607
4771
  }
4608
4772
 
4609
- #prepare(intent) {
4773
+ #prepare(intent, targetRelease) {
4610
4774
  let projection;
4611
4775
  try {
4612
- projection = this.#ledgerPrepare(intent);
4776
+ projection = this.#ledgerPrepare(intent, targetRelease);
4613
4777
  } catch (cause) {
4614
4778
  throw failure(
4615
4779
  "SKILL_RELEASE_LEDGER_PREPARE_FAILED",
@@ -5374,7 +5538,7 @@ export class SkillReleaseRegistry {
5374
5538
  await this.#crash("after-journal", journal);
5375
5539
 
5376
5540
  this.#renewLease(lease);
5377
- prepareReceipt = this.#prepare(intent);
5541
+ prepareReceipt = this.#prepare(intent, target);
5378
5542
  journal = this.#persistJournal({
5379
5543
  ...journal,
5380
5544
  phase: "prepared",