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
@@ -0,0 +1,403 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { types } from "node:util";
4
+ import { ArtifactStore } from "../artifact-store.js";
5
+ import { ensurePrivateDirectory } from "../secure-fs.js";
6
+ import { EvolutionArtifactPorts } from "./evolution-artifact-ports.js";
7
+ import { createEvolutionLedgerFileBackend } from "./evolution-ledger-file-backend.js";
8
+ import { createEvolutionLedgerPorts } from "./evolution-ledger-ports.js";
9
+ import { SkillReleaseRegistry } from "./skill-release-registry.js";
10
+ import { capturePruningData as capture } from "./governed-wiki-pruning-journal.js";
11
+
12
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
13
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
14
+ const STORAGE_ID = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/u;
15
+ const FILE_RESOURCES = new WeakSet();
16
+
17
+ export function captureWorkbenchFileResources(value) {
18
+ if (!FILE_RESOURCES.has(value))
19
+ throw new TypeError("genuine Workbench file resources are required");
20
+ return value;
21
+ }
22
+ const DESCRIPTOR_KEYS = [
23
+ "tenantId",
24
+ "artifactTenantId",
25
+ "streamId",
26
+ "runId",
27
+ "skillName",
28
+ "audience",
29
+ "purpose",
30
+ "authorityId",
31
+ "revision",
32
+ "handlerArtifactDigest",
33
+ ];
34
+ const STORAGE_KEYS = [
35
+ "artifactDir",
36
+ "ledgerRootDir",
37
+ "ledgerAuthorityRootDir",
38
+ "witnessFilePath",
39
+ "witnessId",
40
+ "releaseRootDir",
41
+ ];
42
+
43
+ function record(
44
+ value,
45
+ required,
46
+ optional = [],
47
+ label = "Workbench file resources",
48
+ ) {
49
+ if (
50
+ !value ||
51
+ typeof value !== "object" ||
52
+ Array.isArray(value) ||
53
+ types.isProxy(value)
54
+ )
55
+ throw new TypeError(`${label} must be an explicit data record`);
56
+ const properties = Object.getOwnPropertyDescriptors(value);
57
+ const allowed = new Set([...required, ...optional]);
58
+ if (
59
+ required.some((key) => !Object.hasOwn(properties, key)) ||
60
+ Reflect.ownKeys(properties).some((key) => !allowed.has(key))
61
+ )
62
+ throw new TypeError(`${label} has missing or unsupported fields`);
63
+ const result = {};
64
+ for (const [key, property] of Object.entries(properties)) {
65
+ if (!Object.hasOwn(property, "value") || !property.enumerable)
66
+ throw new TypeError(`${label}.${key} must be an own data field`);
67
+ result[key] = property.value;
68
+ }
69
+ return result;
70
+ }
71
+
72
+ function fixed(owner, name, label) {
73
+ if (!owner || typeof owner !== "object" || types.isProxy(owner))
74
+ throw new TypeError(`${label}.${name} port is required`);
75
+ const fn = Object.getOwnPropertyDescriptor(owner, name)?.value;
76
+ if (typeof fn !== "function" || types.isProxy(fn))
77
+ throw new TypeError(`${label}.${name} must be a fixed own method`);
78
+ return Object.freeze(fn.bind(owner));
79
+ }
80
+
81
+ function signingAuthority(input, label) {
82
+ const value = record(input, ["trust", "signer", "verifier"], [], label);
83
+ const trust = capture(
84
+ record(
85
+ value.trust,
86
+ ["algorithm", "keyId", "trustPolicyDigest"],
87
+ [],
88
+ `${label}.trust`,
89
+ ),
90
+ );
91
+ if (
92
+ typeof trust.algorithm !== "string" ||
93
+ !/^[a-z0-9][a-z0-9._+-]{0,63}$/u.test(trust.algorithm) ||
94
+ typeof trust.keyId !== "string" ||
95
+ trust.keyId.length > 256 ||
96
+ !/^[a-z][a-z0-9+.-]{1,31}:[^\s\\]+$/u.test(trust.keyId) ||
97
+ !DIGEST.test(trust.trustPolicyDigest)
98
+ )
99
+ throw new TypeError(`${label} trust is invalid`);
100
+ return Object.freeze({
101
+ trust,
102
+ signer: Object.freeze({ sign: fixed(value.signer, "sign", label) }),
103
+ verifier: Object.freeze({ verify: fixed(value.verifier, "verify", label) }),
104
+ });
105
+ }
106
+
107
+ function normalizedPath(value, label) {
108
+ if (
109
+ typeof value !== "string" ||
110
+ !path.isAbsolute(value) ||
111
+ value.includes("\0")
112
+ )
113
+ throw new TypeError(`${label} must be an absolute path`);
114
+ const result = path.resolve(value);
115
+ if (result === path.parse(result).root)
116
+ throw new TypeError(`${label} must be a dedicated storage path`);
117
+ return result;
118
+ }
119
+
120
+ function contained(parent, child) {
121
+ const relative = path.relative(parent, child);
122
+ return (
123
+ relative === "" ||
124
+ (relative !== ".." &&
125
+ !relative.startsWith(`..${path.sep}`) &&
126
+ !path.isAbsolute(relative))
127
+ );
128
+ }
129
+
130
+ function assertNoAliases(io, target, directory = true) {
131
+ for (let current = target; ; current = path.dirname(current)) {
132
+ let stat;
133
+ try {
134
+ stat = io.lstatSync(current);
135
+ } catch (error) {
136
+ if (error.code !== "ENOENT") throw error;
137
+ }
138
+ if (stat) {
139
+ const actual = io.realpathSync(current);
140
+ if (stat.isSymbolicLink() || path.relative(actual, current) !== "")
141
+ throw new Error("Workbench storage aliases/symlinks are not allowed");
142
+ if (
143
+ current === target &&
144
+ (directory ? !stat.isDirectory() : !stat.isFile() || stat.nlink !== 1)
145
+ )
146
+ throw new Error(
147
+ "Workbench storage path has an invalid file type or link count",
148
+ );
149
+ if (current !== target && !stat.isDirectory())
150
+ throw new Error("Workbench storage ancestor is not a directory");
151
+ }
152
+ if (path.dirname(current) === current) break;
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Opens real persistence, not a fixture or a permission authority. The caller
158
+ * still provides identity, human approval and mutation authority to the host.
159
+ * Returned writers are for the authenticated deployment module only, never RPC.
160
+ */
161
+ export function openEvolutionWorkbenchFileResources(input) {
162
+ const options = record(
163
+ input,
164
+ ["descriptor", "storage", "authorities"],
165
+ ["secure", "fsImpl", "now"],
166
+ );
167
+ const descriptor = capture(
168
+ record(options.descriptor, DESCRIPTOR_KEYS, [], "Workbench descriptor"),
169
+ );
170
+ for (const key of [
171
+ "tenantId",
172
+ "artifactTenantId",
173
+ "streamId",
174
+ "runId",
175
+ "skillName",
176
+ "audience",
177
+ "authorityId",
178
+ ])
179
+ if (typeof descriptor[key] !== "string" || !ID.test(descriptor[key]))
180
+ throw new TypeError(`Workbench ${key} is invalid`);
181
+ for (const key of ["artifactTenantId", "audience"])
182
+ if (!STORAGE_ID.test(descriptor[key]))
183
+ throw new TypeError(`Workbench storage ${key} is invalid`);
184
+ if (
185
+ descriptor.purpose !== "evolution-ledger" ||
186
+ !Number.isSafeInteger(descriptor.revision) ||
187
+ descriptor.revision < 1 ||
188
+ !DIGEST.test(descriptor.handlerArtifactDigest)
189
+ )
190
+ throw new TypeError(
191
+ "Workbench descriptor purpose/revision/handler digest is invalid",
192
+ );
193
+ const storage = record(
194
+ options.storage,
195
+ STORAGE_KEYS,
196
+ [],
197
+ "Workbench storage",
198
+ );
199
+ if (
200
+ typeof storage.witnessId !== "string" ||
201
+ !/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/u.test(storage.witnessId)
202
+ )
203
+ throw new TypeError("Workbench witnessId is invalid");
204
+ for (const key of STORAGE_KEYS.filter((key) => key !== "witnessId"))
205
+ storage[key] = normalizedPath(storage[key], key);
206
+ const directories = [
207
+ storage.artifactDir,
208
+ storage.ledgerRootDir,
209
+ storage.ledgerAuthorityRootDir,
210
+ storage.releaseRootDir,
211
+ path.dirname(storage.witnessFilePath),
212
+ ];
213
+ for (let i = 0; i < directories.length; i++)
214
+ for (let j = i + 1; j < directories.length; j++)
215
+ if (
216
+ contained(directories[i], directories[j]) ||
217
+ contained(directories[j], directories[i])
218
+ )
219
+ throw new Error(
220
+ "Workbench artifact, Ledger, authority, witness and Registry storage must be non-overlapping",
221
+ );
222
+
223
+ const secure = options.secure === undefined ? true : options.secure;
224
+ if (typeof secure !== "boolean")
225
+ throw new TypeError("Workbench secure must be boolean");
226
+ const io = options.fsImpl ?? fs;
227
+ if (!io || typeof io !== "object" || types.isProxy(io))
228
+ throw new TypeError("Workbench filesystem is invalid");
229
+ const clock = options.now ?? Date.now;
230
+ if (typeof clock !== "function" || types.isProxy(clock))
231
+ throw new TypeError("Workbench clock must be a fixed function");
232
+ const now = Object.freeze(() => {
233
+ const value = Number(clock());
234
+ if (!Number.isFinite(value) || Math.abs(value) > 8_640_000_000_000_000)
235
+ throw new TypeError("Workbench clock is invalid");
236
+ return value;
237
+ });
238
+ now();
239
+ const authorities = record(
240
+ options.authorities,
241
+ ["artifact", "ledger", "witness", "releaseDurability"],
242
+ [],
243
+ "Workbench authorities",
244
+ );
245
+ const artifact = record(
246
+ authorities.artifact,
247
+ ["envelopeSigner", "envelopeVerifier", "currentAuthorityResolver"],
248
+ [],
249
+ "Workbench artifact authority",
250
+ );
251
+ const artifactAuthority = {
252
+ envelopeSigner: Object.freeze({
253
+ sign: fixed(artifact.envelopeSigner, "sign", "artifact"),
254
+ }),
255
+ envelopeVerifier: Object.freeze({
256
+ verify: fixed(artifact.envelopeVerifier, "verify", "artifact"),
257
+ }),
258
+ currentAuthorityResolver: Object.freeze({
259
+ resolve: fixed(artifact.currentAuthorityResolver, "resolve", "artifact"),
260
+ }),
261
+ };
262
+ const ledgerAuthority = signingAuthority(authorities.ledger, "ledger");
263
+ const witnessAuthority = signingAuthority(authorities.witness, "witness");
264
+ // Check original identities before capturing wrappers, which must not disguise
265
+ // use of the same authority for the event log and its independent witness.
266
+ if (
267
+ authorities.ledger === authorities.witness ||
268
+ authorities.ledger.signer === authorities.witness.signer ||
269
+ authorities.ledger.verifier === authorities.witness.verifier ||
270
+ ledgerAuthority.trust.keyId === witnessAuthority.trust.keyId ||
271
+ ledgerAuthority.trust.trustPolicyDigest ===
272
+ witnessAuthority.trust.trustPolicyDigest
273
+ )
274
+ throw new TypeError(
275
+ "Workbench Ledger and witness authorities must be independent",
276
+ );
277
+ const durability = record(
278
+ authorities.releaseDurability,
279
+ ["id", "retain", "resolve"],
280
+ [],
281
+ "release durability authority",
282
+ );
283
+ if (typeof durability.id !== "string" || !STORAGE_ID.test(durability.id))
284
+ throw new TypeError("release durability authority id is invalid");
285
+ const artifactDurabilityAuthority = Object.freeze({
286
+ id: durability.id,
287
+ retain: fixed(
288
+ authorities.releaseDurability,
289
+ "retain",
290
+ "release durability",
291
+ ),
292
+ resolve: fixed(
293
+ authorities.releaseDurability,
294
+ "resolve",
295
+ "release durability",
296
+ ),
297
+ });
298
+ // All configuration and authority ports are captured before any storage opens.
299
+ for (const target of directories) assertNoAliases(io, target);
300
+ assertNoAliases(io, storage.witnessFilePath, false);
301
+ if (secure) {
302
+ for (const target of [
303
+ storage.artifactDir,
304
+ path.dirname(storage.witnessFilePath),
305
+ ])
306
+ ensurePrivateDirectory(target, {
307
+ applyWindowsAcl: true,
308
+ failIfUnavailable: true,
309
+ deps: { fs: io },
310
+ });
311
+ } else {
312
+ io.mkdirSync(path.dirname(storage.witnessFilePath), {
313
+ recursive: true,
314
+ mode: 0o700,
315
+ });
316
+ }
317
+ function open() {
318
+ for (const target of directories) assertNoAliases(io, target);
319
+ const artifactPorts = new EvolutionArtifactPorts({
320
+ artifactStore: new ArtifactStore({ dir: storage.artifactDir, now }),
321
+ tenantId: descriptor.artifactTenantId,
322
+ audience: descriptor.audience,
323
+ ...artifactAuthority,
324
+ now,
325
+ });
326
+ const ledgerArtifactResolver =
327
+ artifactPorts.createEvolutionLedgerArtifactResolver({
328
+ purpose: descriptor.purpose,
329
+ });
330
+ const { ledger } = createEvolutionLedgerFileBackend({
331
+ rootDir: storage.ledgerRootDir,
332
+ authorityRootDir: storage.ledgerAuthorityRootDir,
333
+ witnessFilePath: storage.witnessFilePath,
334
+ witnessId: storage.witnessId,
335
+ ledgerAuthority,
336
+ witnessAuthority,
337
+ artifactResolver: ledgerArtifactResolver,
338
+ secure,
339
+ fsImpl: io,
340
+ clock: now,
341
+ });
342
+ const ports = createEvolutionLedgerPorts({
343
+ artifactPorts,
344
+ ledger,
345
+ artifactTenantId: descriptor.artifactTenantId,
346
+ audience: descriptor.audience,
347
+ purpose: descriptor.purpose,
348
+ artifactDurabilityAuthority,
349
+ });
350
+ // Constructor authenticates and recovers the actual Registry journal.
351
+ const releaseRegistry = new SkillReleaseRegistry({
352
+ tenantId: descriptor.tenantId,
353
+ rootDir: storage.releaseRootDir,
354
+ transactionLedger: ports.transactionLedger,
355
+ secure,
356
+ fsImpl: io,
357
+ });
358
+ return {
359
+ artifactPorts,
360
+ ledger,
361
+ ledgerArtifactResolver,
362
+ releaseRegistry,
363
+ ...ports,
364
+ };
365
+ }
366
+ const primary = open();
367
+ const verifier = open();
368
+ for (const target of directories) assertNoAliases(io, target);
369
+ assertNoAliases(io, storage.witnessFilePath, false);
370
+ // Authenticate both complete stores now, not just their constructor shapes.
371
+ const left = primary.ledger.verify();
372
+ const right = verifier.ledger.verify();
373
+ for (const key of [
374
+ "epoch",
375
+ "ledgerId",
376
+ "identityDigest",
377
+ "sequence",
378
+ "headDigest",
379
+ ])
380
+ if (left[key] !== right[key])
381
+ throw new Error("Workbench file readers disagree at startup");
382
+ const result = Object.freeze({
383
+ runtimeResources: Object.freeze({
384
+ descriptor,
385
+ artifactPorts: primary.artifactPorts,
386
+ ledger: primary.ledger,
387
+ ledgerArtifactResolver: primary.ledgerArtifactResolver,
388
+ releaseRegistry: primary.releaseRegistry,
389
+ transactionLedger: primary.transactionLedger,
390
+ verifierLedger: verifier.ledger,
391
+ verifierLedgerArtifactResolver: verifier.ledgerArtifactResolver,
392
+ verifierReleaseRegistry: verifier.releaseRegistry,
393
+ verifierTransactionLedger: verifier.transactionLedger,
394
+ now,
395
+ }),
396
+ mutationPorts: Object.freeze({
397
+ auditSink: primary.auditSink,
398
+ nonceStore: primary.nonceStore,
399
+ }),
400
+ });
401
+ FILE_RESOURCES.add(result);
402
+ return result;
403
+ }
@@ -8,12 +8,18 @@ import {
8
8
  verifySkillPromotionReviewDecision,
9
9
  verifySkillPromotionReviewPacketArtifact,
10
10
  } from "./skill-promotion-review.js";
11
+ import {
12
+ captureWorkbenchRegistrySource,
13
+ verifyWorkbenchRegistryState,
14
+ } from "./evolution-workbench-registry-source.js";
11
15
 
12
16
  const { projectEvolutionRun } = evolutionRun;
13
17
  const { verifySkillInvocationReceipt } = skillInvocationReceipt;
14
18
 
15
19
  export const EVOLUTION_WORKBENCH_PROJECTION_SCHEMA =
16
20
  "chainlesschain.evolution-workbench-projection/v1";
21
+ export const EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA =
22
+ "chainlesschain.evolution-workbench-projection/v2";
17
23
  export const EVOLUTION_WORKBENCH_BATCH_PLAN_SCHEMA =
18
24
  "chainlesschain.evolution-workbench-batch-plan/v1";
19
25
  export const EVOLUTION_WORKBENCH_MAX_ITEMS = 10_000;
@@ -232,7 +238,8 @@ export function createEvolutionWorkbenchDataSource({
232
238
  skillName: skillNameInput,
233
239
  runAdapter,
234
240
  reviewAdapter,
235
- transitionAdapter,
241
+ transitionAdapter = null,
242
+ registrySource = null,
236
243
  invocationReceiptSource = null,
237
244
  pilotSource = null,
238
245
  } = {}) {
@@ -241,11 +248,23 @@ export function createEvolutionWorkbenchDataSource({
241
248
  const skillName = identifier(skillNameInput, "skillName");
242
249
  const loadRun = capture(runAdapter, "load", "runAdapter");
243
250
  const listReviews = capture(reviewAdapter, "listReviews", "reviewAdapter");
244
- const listTransitions = capture(
245
- transitionAdapter,
246
- "list",
247
- "transitionAdapter",
248
- );
251
+ const registryReader =
252
+ registrySource === null
253
+ ? null
254
+ : captureWorkbenchRegistrySource(registrySource);
255
+ if (
256
+ registryReader &&
257
+ (transitionAdapter !== null ||
258
+ registryReader.descriptor.tenantId !== tenantId ||
259
+ registryReader.descriptor.skillName !== skillName ||
260
+ registryReader.descriptor.runId !== runId)
261
+ )
262
+ throw new TypeError(
263
+ "Workbench Registry source scope differs or has a second transition authority",
264
+ );
265
+ const listTransitions = registryReader
266
+ ? null
267
+ : capture(transitionAdapter, "list", "transitionAdapter");
249
268
  const listInvocations =
250
269
  invocationReceiptSource === null
251
270
  ? () => []
@@ -259,6 +278,7 @@ export function createEvolutionWorkbenchDataSource({
259
278
  runId,
260
279
  skillName,
261
280
  async load() {
281
+ const context = registryReader?.currentContext();
262
282
  const run = normalizeRun(await loadRun(), { tenantId, runId });
263
283
  const reviews = normalizeReviews(await listReviews(), {
264
284
  tenantId,
@@ -278,10 +298,14 @@ export function createEvolutionWorkbenchDataSource({
278
298
  const reviewPacketDigests = new Set(
279
299
  reviews.map(({ packet }) => packet.packetDigest),
280
300
  );
281
- const transitions = normalizeTransitions(await listTransitions(), {
282
- tenantId,
283
- skillName,
284
- });
301
+ const registryData = registryReader?.load();
302
+ const transitions = normalizeTransitions(
303
+ registryData ? registryData.transitions : await listTransitions(),
304
+ {
305
+ tenantId,
306
+ skillName,
307
+ },
308
+ );
285
309
  for (const { request } of transitions) {
286
310
  if (!run.projection.registry.candidates[request.candidateId]) {
287
311
  throw new Error(
@@ -289,13 +313,16 @@ export function createEvolutionWorkbenchDataSource({
289
313
  );
290
314
  }
291
315
  }
292
- return deepFreeze({
316
+ const result = deepFreeze({
293
317
  run,
294
318
  reviews,
295
319
  transitions,
320
+ registry: registryData?.registry ?? null,
296
321
  invocations: normalizeInvocations(await listInvocations(), { runId }),
297
322
  pilot: normalizePilot(await readPilot(), { reviewPacketDigests }),
298
323
  });
324
+ if (registryReader) registryReader.assertCurrent(context);
325
+ return result;
299
326
  },
300
327
  });
301
328
  DATA_SOURCES.add(source);
@@ -563,15 +590,17 @@ export async function buildEvolutionWorkbenchProjection(
563
590
  normalizeTime(observedAt, "observedAt");
564
591
  const data = await source.load();
565
592
  const activeReleaseId = data.run.projection.registry.activeReleaseId;
566
- const activeCandidateIds = new Set(
567
- data.transitions
568
- .filter(
569
- ({ status, settlement }) =>
570
- status === "committed" &&
571
- settlement?.activeReleaseDigest === activeReleaseId,
572
- )
573
- .map(({ settlement }) => settlement.candidateId),
574
- );
593
+ const activeCandidateIds = data.registry
594
+ ? new Set(data.registry.active ? [data.registry.active.candidateId] : [])
595
+ : new Set(
596
+ data.transitions
597
+ .filter(
598
+ ({ status, settlement }) =>
599
+ status === "committed" &&
600
+ settlement?.activeReleaseDigest === activeReleaseId,
601
+ )
602
+ .map(({ settlement }) => settlement.candidateId),
603
+ );
575
604
  const candidates = data.reviews.map((review) =>
576
605
  candidateView(review, data.invocations, activeCandidateIds),
577
606
  );
@@ -579,14 +608,61 @@ export async function buildEvolutionWorkbenchProjection(
579
608
  ...runTimeline(data.run.events),
580
609
  ...reviewTimeline(data.reviews),
581
610
  ...transitionTimeline(data.transitions),
611
+ ...(data.registry?.operations ?? []).map((operation) => ({
612
+ id: `release:${operation.transactionId}`,
613
+ sequence: operation.sequence ?? operation.preparationSequence,
614
+ phase:
615
+ operation.status === "prepared"
616
+ ? `release-${operation.operation}-prepared`
617
+ : operation.operation === "rollback"
618
+ ? "release-rolled-back"
619
+ : "release-promoted",
620
+ status: operation.status,
621
+ subjectId: operation.candidateId,
622
+ digest: operation.receiptDigest,
623
+ artifactRef: null,
624
+ occurredAt: operation.occurredAt,
625
+ source: "release-registry",
626
+ detail: {
627
+ operationId: operation.operationId,
628
+ requestDigest: operation.requestDigest,
629
+ releaseDigest: operation.releaseDigest,
630
+ fromReleaseDigest: operation.fromReleaseDigest,
631
+ stateDigest: operation.stateDigest,
632
+ transactionId: operation.transactionId,
633
+ },
634
+ })),
582
635
  ].sort(timelineOrder);
583
636
  const conflicts = conflictsFor(candidates, data.transitions, data.pilot);
637
+ for (const operation of data.registry?.operations ?? [])
638
+ if (operation.status === "prepared")
639
+ conflicts.push({
640
+ type: "pending-registry-effect",
641
+ candidateId: operation.candidateId,
642
+ packetDigest: null,
643
+ reason: "actual Registry transaction has not finalized",
644
+ });
645
+ if (
646
+ data.registry?.active &&
647
+ !candidates.some((candidate) => candidate.actualUsage.active)
648
+ )
649
+ conflicts.push({
650
+ type: "active-outside-run",
651
+ candidateId: data.registry.active.candidateId,
652
+ packetDigest: null,
653
+ reason:
654
+ "current Registry release is outside this run's review candidates",
655
+ });
656
+ const schema = data.registry
657
+ ? EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA
658
+ : EVOLUTION_WORKBENCH_PROJECTION_SCHEMA;
584
659
  const core = {
585
- schema: EVOLUTION_WORKBENCH_PROJECTION_SCHEMA,
660
+ schema,
586
661
  tenantId: source.tenantId,
587
662
  runId: source.runId,
588
663
  skillName: source.skillName,
589
664
  observedAt,
665
+ ...(data.registry ? { registry: data.registry } : {}),
590
666
  run: {
591
667
  status: data.run.projection.status,
592
668
  projectionDigest: data.run.projection.projectionDigest,
@@ -608,6 +684,9 @@ export async function buildEvolutionWorkbenchProjection(
608
684
  rejectedCount: candidates.filter(({ status }) => status === "rejected")
609
685
  .length,
610
686
  transitionCount: data.transitions.length,
687
+ ...(data.registry
688
+ ? { registryOperationCount: data.registry.operations.length }
689
+ : {}),
611
690
  invocationCount: data.invocations.length,
612
691
  conflictCount: conflicts.length,
613
692
  },
@@ -618,7 +697,7 @@ export async function buildEvolutionWorkbenchProjection(
618
697
  };
619
698
  return deepFreeze({
620
699
  ...core,
621
- projectionDigest: hash(EVOLUTION_WORKBENCH_PROJECTION_SCHEMA, core),
700
+ projectionDigest: hash(schema, core),
622
701
  });
623
702
  }
624
703
 
@@ -627,10 +706,13 @@ export function filterEvolutionWorkbenchProjection(
627
706
  { query = "", status = null, offset = 0, limit = 100 } = {},
628
707
  ) {
629
708
  if (
630
- projection?.schema !== EVOLUTION_WORKBENCH_PROJECTION_SCHEMA ||
709
+ ![
710
+ EVOLUTION_WORKBENCH_PROJECTION_SCHEMA,
711
+ EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA,
712
+ ].includes(projection?.schema) ||
631
713
  projection.projectionDigest !==
632
714
  hash(
633
- EVOLUTION_WORKBENCH_PROJECTION_SCHEMA,
715
+ projection.schema,
634
716
  Object.fromEntries(
635
717
  Object.entries(projection).filter(
636
718
  ([key]) => key !== "projectionDigest",
@@ -642,6 +724,28 @@ export function filterEvolutionWorkbenchProjection(
642
724
  "a verified Evolution Workbench projection is required",
643
725
  );
644
726
  }
727
+ const registry =
728
+ projection.schema === EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA
729
+ ? verifyWorkbenchRegistryState(
730
+ projection.registry,
731
+ projection.tenantId,
732
+ projection.skillName,
733
+ )
734
+ : null;
735
+ if (
736
+ registry &&
737
+ (projection.summary.registryOperationCount !== registry.operations.length ||
738
+ projection.candidates.some(
739
+ (candidate) =>
740
+ candidate.actualUsage.active !==
741
+ (candidate.candidateId === registry.active?.candidateId &&
742
+ candidate.candidateContentDigest ===
743
+ registry.active?.contentDigest),
744
+ ))
745
+ )
746
+ throw new Error(
747
+ "Workbench candidate activity differs from current Registry state",
748
+ );
645
749
  if (
646
750
  !Number.isSafeInteger(offset) ||
647
751
  offset < 0 ||
@@ -679,8 +783,12 @@ export function filterEvolutionWorkbenchProjection(
679
783
  });
680
784
  const governance = {
681
785
  runStatus: projection.run.status,
682
- activeReleaseId: projection.run.activeReleaseId,
683
- lastKnownGoodReleaseId: projection.run.lastKnownGoodReleaseId,
786
+ activeReleaseId: registry
787
+ ? (registry.active?.releaseDigest ?? null)
788
+ : projection.run.activeReleaseId,
789
+ lastKnownGoodReleaseId: registry
790
+ ? (registry.active?.lastKnownGoodReleaseDigest ?? null)
791
+ : projection.run.lastKnownGoodReleaseId,
684
792
  conflictCount: projection.summary.conflictCount,
685
793
  pilot:
686
794
  projection.pilot === null