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,133 @@
1
+ import { types } from "node:util";
2
+ import { capturePruningData as capture } from "./governed-wiki-pruning-journal.js";
3
+ import { createEvolutionWorkbenchRegistrySource } from "./evolution-workbench-registry-source.js";
4
+ import { createEvolutionWorkbenchReviewRuntime } from "./evolution-workbench-review-ledger-adapter.js";
5
+ import { createEvolutionWorkbenchRollbackRuntime } from "./evolution-workbench-rollback-ledger-adapter.js";
6
+ import { createEvolutionWorkbenchCliHost } from "./evolution-workbench-cli-host.js";
7
+
8
+ const REQUIRED = [
9
+ "descriptor",
10
+ "artifactPorts",
11
+ "ledger",
12
+ "ledgerArtifactResolver",
13
+ "releaseRegistry",
14
+ "transactionLedger",
15
+ "verifierLedger",
16
+ "verifierLedgerArtifactResolver",
17
+ "verifierReleaseRegistry",
18
+ "verifierTransactionLedger",
19
+ "rollbackProvider",
20
+ "authorizationProvider",
21
+ "identityProvider",
22
+ "decisionVerifier",
23
+ "humanDecisionProvider",
24
+ "humanDecisionVerifier",
25
+ "humanRollbackProvider",
26
+ "humanRollbackVerifier",
27
+ ];
28
+ const OPTIONAL = ["invocationReceiptSource", "pilotSource", "now"];
29
+
30
+ function optionsRecord(value) {
31
+ if (
32
+ !value ||
33
+ typeof value !== "object" ||
34
+ Array.isArray(value) ||
35
+ types.isProxy(value)
36
+ )
37
+ throw new TypeError("Workbench runtime requires explicit resource options");
38
+ const descriptors = Object.getOwnPropertyDescriptors(value);
39
+ const allowed = new Set([...REQUIRED, ...OPTIONAL]);
40
+ if (
41
+ Reflect.ownKeys(descriptors).some((key) => !allowed.has(key)) ||
42
+ REQUIRED.some((key) => !Object.hasOwn(descriptors, key))
43
+ )
44
+ throw new TypeError("Workbench runtime resources are missing or replaced");
45
+ const output = {};
46
+ for (const [key, property] of Object.entries(descriptors)) {
47
+ if (!Object.hasOwn(property, "value"))
48
+ throw new TypeError(
49
+ "Workbench runtime resource accessors are not allowed",
50
+ );
51
+ output[key] = property.value;
52
+ }
53
+ return output;
54
+ }
55
+
56
+ function fixed(owner, name) {
57
+ if (!owner || types.isProxy(owner))
58
+ throw new TypeError(`Workbench ${name} fixed port is required`);
59
+ const fn = Object.getOwnPropertyDescriptor(owner, name)?.value;
60
+ if (typeof fn !== "function" || types.isProxy(fn))
61
+ throw new TypeError(`Workbench ${name} fixed own method is required`);
62
+ return Object.freeze({ [name]: fn.bind(owner) });
63
+ }
64
+
65
+ // Open/recover the actual Registry before calling this assembly. Nothing here
66
+ // creates credentials or grants permissions. No host escapes before current
67
+ // storage, all adapters and existing-effect reconciliation have been verified.
68
+ export async function createEvolutionWorkbenchRuntime(input) {
69
+ const options = optionsRecord(input);
70
+ const descriptor = capture(options.descriptor);
71
+ const shared = {
72
+ descriptor,
73
+ artifactPorts: options.artifactPorts,
74
+ ledger: options.ledger,
75
+ ledgerArtifactResolver: options.ledgerArtifactResolver,
76
+ now: options.now ?? Date.now,
77
+ };
78
+ const identityProvider = fixed(options.identityProvider, "current");
79
+ const registrySource = createEvolutionWorkbenchRegistrySource({
80
+ ...shared,
81
+ releaseRegistry: options.releaseRegistry,
82
+ transactionLedger: options.transactionLedger,
83
+ verifierLedger: options.verifierLedger,
84
+ verifierLedgerArtifactResolver: options.verifierLedgerArtifactResolver,
85
+ verifierReleaseRegistry: options.verifierReleaseRegistry,
86
+ verifierTransactionLedger: options.verifierTransactionLedger,
87
+ });
88
+ const review = createEvolutionWorkbenchReviewRuntime({
89
+ ...shared,
90
+ registrySource,
91
+ decisionVerifier: fixed(options.decisionVerifier, "verify"),
92
+ humanDecisionProvider: fixed(options.humanDecisionProvider, "request"),
93
+ humanDecisionVerifier: fixed(options.humanDecisionVerifier, "verify"),
94
+ invocationReceiptSource: options.invocationReceiptSource ?? null,
95
+ pilotSource: options.pilotSource ?? null,
96
+ });
97
+ const rollback = createEvolutionWorkbenchRollbackRuntime({
98
+ ...shared,
99
+ projectionReader: review.projectionReader,
100
+ releaseRegistry: options.releaseRegistry,
101
+ transactionLedger: options.transactionLedger,
102
+ verifierReleaseRegistry: options.verifierReleaseRegistry,
103
+ verifierTransactionLedger: options.verifierTransactionLedger,
104
+ rollbackProvider: options.rollbackProvider,
105
+ authorizationProvider: fixed(
106
+ options.authorizationProvider,
107
+ "authorizeRollback",
108
+ ),
109
+ humanRollbackProvider: fixed(options.humanRollbackProvider, "authorize"),
110
+ humanRollbackVerifier: fixed(options.humanRollbackVerifier, "verify"),
111
+ });
112
+ const reviewRecovery = await review.reconcileCommitted();
113
+ const rollbackRecovery = await rollback.reconcileCommitted();
114
+ await review.projectionLoader.load();
115
+ const workbenchHost = createEvolutionWorkbenchCliHost({
116
+ tenantId: descriptor.tenantId,
117
+ projectionLoader: review.projectionLoader,
118
+ projectionAuthority: review.projectionAuthority,
119
+ identityProvider,
120
+ activeStateReader: rollback.activeStateReader,
121
+ batchExecutor: review.batchExecutor,
122
+ rollbackExecutor: rollback.rollbackExecutor,
123
+ });
124
+ return Object.freeze({
125
+ workbenchHost,
126
+ recovery: capture({
127
+ reviewsSettled: reviewRecovery.settledItems.length,
128
+ reviewPreparationsDeferred: reviewRecovery.deferredRequestDigests.length,
129
+ rollbacksSettled: rollbackRecovery.settledReceipts.length,
130
+ rollbackPlansDeferred: rollbackRecovery.deferredPlanDigests.length,
131
+ }),
132
+ });
133
+ }
@@ -1,4 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { types } from "node:util";
3
+ import { capturePruningData } from "./governed-wiki-pruning-journal.js";
2
4
 
3
5
  import { filterEvolutionWorkbenchProjection } from "./evolution-workbench-projection.js";
4
6
 
@@ -156,7 +158,8 @@ export function buildEvolutionWorkbenchRollbackPlan(
156
158
  });
157
159
  }
158
160
 
159
- function verifyPlan(plan, tenantId) {
161
+ export function verifyEvolutionWorkbenchRollbackPlan(input, tenantId) {
162
+ const plan = capturePruningData(input);
160
163
  if (
161
164
  plan?.schema !== EVOLUTION_WORKBENCH_ROLLBACK_PLAN_SCHEMA ||
162
165
  plan.tenantId !== tenantId ||
@@ -170,9 +173,57 @@ function verifyPlan(plan, tenantId) {
170
173
  return freeze(clone(plan));
171
174
  }
172
175
 
176
+ export function buildEvolutionWorkbenchRollbackRequest(
177
+ plan,
178
+ authorizationReceiptDigest,
179
+ ) {
180
+ const core = {
181
+ planDigest: plan.planDigest,
182
+ expectedActiveStateDigest: plan.expectedActiveStateDigest,
183
+ fromContentDigest: plan.fromContentDigest,
184
+ toContentDigest: plan.toContentDigest,
185
+ authorizationReceiptDigest: digest(
186
+ authorizationReceiptDigest,
187
+ "authorization receipt",
188
+ ),
189
+ };
190
+ return freeze({
191
+ ...core,
192
+ requestDigest: hash(
193
+ "chainlesschain.evolution-workbench-rollback-request/v1",
194
+ core,
195
+ ),
196
+ });
197
+ }
198
+
199
+ export function buildEvolutionWorkbenchRollbackReceipt(
200
+ plan,
201
+ request,
202
+ transitionReceiptDigest,
203
+ active,
204
+ ) {
205
+ const core = {
206
+ schema: EVOLUTION_WORKBENCH_ROLLBACK_RECEIPT_SCHEMA,
207
+ tenantId: plan.tenantId,
208
+ skillName: plan.skillName,
209
+ planDigest: plan.planDigest,
210
+ requestDigest: request.requestDigest,
211
+ authorizationReceiptDigest: request.authorizationReceiptDigest,
212
+ transitionReceiptDigest,
213
+ activeStateDigest: active.stateDigest,
214
+ activeContentDigest: active.contentDigest,
215
+ };
216
+ return freeze({
217
+ ...core,
218
+ receiptDigest: hash(EVOLUTION_WORKBENCH_ROLLBACK_RECEIPT_SCHEMA, core),
219
+ });
220
+ }
221
+
173
222
  export class EvolutionWorkbenchRollbackExecutor {
174
223
  constructor({ tenantId, ports } = {}) {
175
224
  this.tenantId = string(tenantId, "tenantId");
225
+ if (!ports || types.isProxy(ports))
226
+ throw new TypeError("fixed rollback ports are required");
176
227
  for (const name of [
177
228
  "loadProjection",
178
229
  "authorizeHumanRollback",
@@ -180,14 +231,16 @@ export class EvolutionWorkbenchRollbackExecutor {
180
231
  "readActiveState",
181
232
  "commitRollback",
182
233
  ]) {
183
- if (typeof ports?.[name] !== "function")
234
+ const method = Object.getOwnPropertyDescriptor(ports, name)?.value;
235
+ if (typeof method !== "function" || types.isProxy(method))
184
236
  throw new TypeError(`Workbench rollback port ${name} is required`);
185
- this[`_${name}`] = ports[name].bind(ports);
237
+ this[`_${name}`] = method.bind(ports);
186
238
  }
239
+ Object.freeze(this);
187
240
  }
188
241
 
189
242
  async execute(input) {
190
- const plan = verifyPlan(input, this.tenantId);
243
+ const plan = verifyEvolutionWorkbenchRollbackPlan(input, this.tenantId);
191
244
  const projection = await this._loadProjection({
192
245
  tenantId: this.tenantId,
193
246
  projectionDigest: plan.sourceProjectionDigest,
@@ -210,20 +263,10 @@ export class EvolutionWorkbenchRollbackExecutor {
210
263
  !DIGEST.test(authorization.receiptDigest ?? "")
211
264
  )
212
265
  throw new Error("Workbench rollback lacks exact human authorization");
213
- const requestCore = {
214
- planDigest: plan.planDigest,
215
- expectedActiveStateDigest: plan.expectedActiveStateDigest,
216
- fromContentDigest: plan.fromContentDigest,
217
- toContentDigest: plan.toContentDigest,
218
- authorizationReceiptDigest: authorization.receiptDigest,
219
- };
220
- const request = freeze({
221
- ...requestCore,
222
- requestDigest: hash(
223
- "chainlesschain.evolution-workbench-rollback-request/v1",
224
- requestCore,
225
- ),
226
- });
266
+ const request = buildEvolutionWorkbenchRollbackRequest(
267
+ plan,
268
+ authorization.receiptDigest,
269
+ );
227
270
  const applied = await this._applyRollback(request);
228
271
  if (
229
272
  applied?.authenticated !== true ||
@@ -238,28 +281,19 @@ export class EvolutionWorkbenchRollbackExecutor {
238
281
  });
239
282
  if (
240
283
  active?.authenticated !== true ||
284
+ active.durable !== true ||
285
+ active.tenantId !== this.tenantId ||
286
+ active.skillName !== plan.skillName ||
241
287
  active.contentDigest !== plan.toContentDigest ||
242
288
  !DIGEST.test(active.stateDigest ?? "")
243
289
  )
244
290
  throw new Error("Workbench rollback active readback differs from target");
245
- const receiptCore = {
246
- schema: EVOLUTION_WORKBENCH_ROLLBACK_RECEIPT_SCHEMA,
247
- tenantId: this.tenantId,
248
- skillName: plan.skillName,
249
- planDigest: plan.planDigest,
250
- requestDigest: request.requestDigest,
251
- authorizationReceiptDigest: authorization.receiptDigest,
252
- transitionReceiptDigest: applied.receiptDigest,
253
- activeStateDigest: active.stateDigest,
254
- activeContentDigest: active.contentDigest,
255
- };
256
- const receipt = freeze({
257
- ...receiptCore,
258
- receiptDigest: hash(
259
- EVOLUTION_WORKBENCH_ROLLBACK_RECEIPT_SCHEMA,
260
- receiptCore,
261
- ),
262
- });
291
+ const receipt = buildEvolutionWorkbenchRollbackReceipt(
292
+ plan,
293
+ request,
294
+ applied.receiptDigest,
295
+ active,
296
+ );
263
297
  const committed = await this._commitRollback({ receipt });
264
298
  if (
265
299
  committed?.authenticated !== true ||
@@ -14,6 +14,7 @@ import {
14
14
  const {
15
15
  EVOLVABLE_ARTIFACT_PERSISTENCE_RECEIPT_SCHEMA,
16
16
  EVOLVABLE_ARTIFACT_ACTIVE_RELEASE_SCHEMA,
17
+ EVOLVABLE_ARTIFACT_CANDIDATE_READ_SCHEMA,
17
18
  EVOLVABLE_ARTIFACT_TRANSITION_REQUEST_SCHEMA,
18
19
  EVOLVABLE_ARTIFACT_TRANSITION_RECEIPT_SCHEMA,
19
20
  createEvolvableArtifactActiveReleaseReader,
@@ -510,6 +511,53 @@ export class EvolvableArtifactLedgerAdapter {
510
511
  return reader;
511
512
  }
512
513
 
514
+ candidateProvider() {
515
+ const adapter = this;
516
+ return Object.freeze({
517
+ readerScope: this.readerScope,
518
+ async readCandidate({ type, artifactId, candidateId } = {}) {
519
+ if (!ARTIFACT_TYPES.has(type))
520
+ throw new TypeError("candidate artifact type is invalid");
521
+ const normalizedArtifactId = text(artifactId, "artifactId");
522
+ const normalizedCandidateId = text(candidateId, "candidateId");
523
+ const matches = adapter
524
+ ._events(EVOLVABLE_ARTIFACT_CANDIDATE_EVENT)
525
+ .map((event) =>
526
+ adapter._resolve(
527
+ event,
528
+ "evolvable-artifact-candidate",
529
+ "candidate",
530
+ ),
531
+ )
532
+ .filter(
533
+ (record) =>
534
+ record.artifact.type === type &&
535
+ record.artifact.artifactId === normalizedArtifactId &&
536
+ record.artifact.candidate.candidateId === normalizedCandidateId,
537
+ );
538
+ if (matches.length > 1)
539
+ throw new Error("candidate artifact read is ambiguous");
540
+ if (matches.length === 0) return null;
541
+ const record = matches[0];
542
+ return freeze({
543
+ schema: EVOLVABLE_ARTIFACT_CANDIDATE_READ_SCHEMA,
544
+ authenticated: true,
545
+ durable: true,
546
+ tenantId: record.artifact.tenantId,
547
+ type: record.artifact.type,
548
+ artifactId: record.artifact.artifactId,
549
+ candidateId: record.artifact.candidate.candidateId,
550
+ contentDigest: record.artifact.contentDigest,
551
+ artifactDigest: record.artifact.artifactDigest,
552
+ artifact: record.artifact,
553
+ persistenceReceipt: record.receipt,
554
+ contentAvailable: record.contentAvailable,
555
+ content: record.content,
556
+ });
557
+ },
558
+ });
559
+ }
560
+
513
561
  _activeArtifacts() {
514
562
  const histories = new Map();
515
563
  for (const event of this._events(EVOLVABLE_ARTIFACT_TRANSITION_EVENT)) {
@@ -0,0 +1,343 @@
1
+ import { captureSkillCandidateRegistryReader } from "./skill-candidate-registry.js";
2
+ import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
3
+ import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
4
+ import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
5
+ import { governedKnowledgeSourceRef } from "./governed-knowledge-skill-rollback.js";
6
+ import {
7
+ createGovernedKnowledgeDependencyAuthority,
8
+ GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
9
+ digestGovernedKnowledgeDependencyResult,
10
+ } from "./governed-knowledge-dependency-authority.js";
11
+ import {
12
+ capturePruningData as captureData,
13
+ pruningDigest as digest,
14
+ pruningCanonical as canonical,
15
+ } from "./governed-wiki-pruning-journal.js";
16
+
17
+ const VERIFICATION_SCHEMA =
18
+ "chainlesschain.knowledge-candidate-rejection-verification/v1";
19
+ const QUARANTINE_VERIFICATION_SCHEMA =
20
+ "chainlesschain.knowledge-candidate-quarantine-verification/v1";
21
+ function fail(message) {
22
+ throw new Error(`knowledge candidate disposition: ${message}`);
23
+ }
24
+
25
+ function bindReader(
26
+ candidateRegistry,
27
+ releaseRegistry,
28
+ transactionLedger,
29
+ tenantId,
30
+ wikiAdapter,
31
+ ) {
32
+ const candidates = captureSkillCandidateRegistryReader(candidateRegistry);
33
+ const releases = captureSkillReleaseRegistryReader(releaseRegistry);
34
+ if (
35
+ candidates.tenantId !== tenantId ||
36
+ releases.tenantId !== tenantId ||
37
+ !releases.matchesTransactionLedger(transactionLedger)
38
+ ) {
39
+ throw new TypeError(
40
+ "candidate rejection registry/ledger tenant binding differs",
41
+ );
42
+ }
43
+ const operations = captureSkillReleaseOperationReader(transactionLedger);
44
+ const wiki =
45
+ wikiAdapter == null ? null : captureWikiRevisionReader(wikiAdapter);
46
+ if (
47
+ wiki &&
48
+ (wiki.descriptor.tenantId !== tenantId ||
49
+ !operations.matchesWikiAdapter(wikiAdapter))
50
+ )
51
+ throw new TypeError("candidate Wiki tenant differs");
52
+ return Object.freeze({ candidates, releases, operations, wiki });
53
+ }
54
+
55
+ function sourceProof(reader, candidate, request, admission) {
56
+ const ref = governedKnowledgeSourceRef(request);
57
+ const direct = candidate.sourceEvidenceRefs.some(
58
+ (entry) => entry.ref === ref && entry.digest === request.contentDigest,
59
+ );
60
+ let wiki = null;
61
+ if (candidate.derivationMode === "wiki") {
62
+ if (!reader.wiki)
63
+ fail("Wiki-derived candidate requires an authenticated Wiki reader");
64
+ const revision = reader.wiki.readKnowledgeProvenance({
65
+ tenantId: request.tenantId,
66
+ revisionId: candidate.wikiRevision,
67
+ knowledgeId: request.knowledgeId,
68
+ contentDigest: request.contentDigest,
69
+ });
70
+ if (
71
+ ["epoch", "ledgerId", "identityDigest"].some(
72
+ (key) => revision.checkpoint[key] !== admission.checkpoint[key],
73
+ ) ||
74
+ revision.checkpoint.sequence >= admission.fence.sequence ||
75
+ admission.history.some(
76
+ (entry) => revision.checkpoint.sequence >= entry.preparationSequence,
77
+ )
78
+ ) {
79
+ fail(
80
+ "Wiki provenance must precede revocation and every original promotion",
81
+ );
82
+ }
83
+ wiki = {
84
+ revisionId: revision.revisionId,
85
+ stateDigest: revision.stateDigest,
86
+ checkpoint: revision.checkpoint,
87
+ affectedPatternIds: revision.affectedPatternIds,
88
+ };
89
+ }
90
+ if (!direct && !wiki?.affectedPatternIds.length)
91
+ fail("candidate source lineage does not identify the revoked Knowledge");
92
+ return captureData({ direct, wiki });
93
+ }
94
+
95
+ function prove(reader, request, context, disposition) {
96
+ if (
97
+ request.dependency.kind !== "candidate" ||
98
+ request.dependency.disposition !== disposition
99
+ ) {
100
+ fail(`this provider requires a candidate / ${disposition} dependency`);
101
+ }
102
+ const candidate = reader.candidates.read(request.dependency.digest);
103
+ if (
104
+ candidate.tenantId !== request.tenantId ||
105
+ candidate.candidateId !== request.dependency.digest
106
+ )
107
+ fail("candidate identity differs");
108
+ const resolve =
109
+ disposition === "quarantine"
110
+ ? reader.operations.resolveCandidateQuarantine
111
+ : reader.operations.resolveCandidateRevocation;
112
+ const admission = resolve({
113
+ tenantId: request.tenantId,
114
+ skillName: candidate.skillName,
115
+ candidateId: candidate.candidateId,
116
+ operationDigest: request.operationDigest,
117
+ context,
118
+ });
119
+ if (!admission.fence || admission.fence.record.deviceId !== request.deviceId)
120
+ fail("no exact durable candidate admission fence");
121
+ const knowledge = admission.fence.record.knowledge;
122
+ for (const key of [
123
+ "tenantId",
124
+ "knowledgeId",
125
+ "action",
126
+ "contentDigest",
127
+ "revocationReceiptDigest",
128
+ ]) {
129
+ if (knowledge[key] !== request[key])
130
+ fail("prepared revocation differs from request");
131
+ }
132
+ if (admission.pendingTransactions.length)
133
+ fail(
134
+ "in-flight release transition requires recovery before candidate disposition can settle",
135
+ );
136
+ const active = reader.releases.readActive(candidate.skillName);
137
+ if (
138
+ Boolean(active) !== Boolean(admission.current) ||
139
+ (active &&
140
+ (active.release.releaseDigest !== admission.current.releaseDigest ||
141
+ active.state.stateDigest !== admission.current.stateDigest ||
142
+ active.state.revision !== admission.current.revision ||
143
+ admission.current.projection.current !== true))
144
+ )
145
+ fail("actual active state differs from authenticated release history");
146
+ let lastKnownGood = null;
147
+ if (active) {
148
+ lastKnownGood = reader.releases.readRelease(
149
+ active.state.lastKnownGoodReleaseDigest,
150
+ );
151
+ if (
152
+ active.release.candidate.candidateId === candidate.candidateId ||
153
+ lastKnownGood.candidate.candidateId === candidate.candidateId
154
+ ) {
155
+ fail(
156
+ "active or rollback-eligible candidate requires real release rollback first",
157
+ );
158
+ }
159
+ }
160
+ const source = sourceProof(reader, candidate, request, admission);
161
+ if (canonical(reader.operations.currentContext()) !== canonical(context))
162
+ fail("ledger changed during candidate verification");
163
+ return captureData({
164
+ candidateId: candidate.candidateId,
165
+ skillName: candidate.skillName,
166
+ source,
167
+ admission,
168
+ active: active
169
+ ? {
170
+ releaseDigest: active.release.releaseDigest,
171
+ stateDigest: active.state.stateDigest,
172
+ lastKnownGoodReleaseDigest: lastKnownGood.releaseDigest,
173
+ }
174
+ : null,
175
+ });
176
+ }
177
+
178
+ export function createGovernedKnowledgeCandidateRejectionAuthority(
179
+ options = {},
180
+ ) {
181
+ return createCandidateDispositionAuthority(options, "reject-candidate");
182
+ }
183
+
184
+ // Quarantine is a distinct, persistent admission disposition, not rejection or
185
+ // a draft-label rewrite. Neither factory may certify an active/LKG candidate.
186
+ export function createGovernedKnowledgeCandidateQuarantineAuthority(
187
+ options = {},
188
+ ) {
189
+ return createCandidateDispositionAuthority(options, "quarantine");
190
+ }
191
+
192
+ function createCandidateDispositionAuthority(
193
+ {
194
+ tenantId,
195
+ deviceId,
196
+ candidateRegistry,
197
+ releaseRegistry,
198
+ transactionLedger,
199
+ verifierCandidateRegistry,
200
+ verifierReleaseRegistry,
201
+ verifierTransactionLedger,
202
+ wikiLedgerAdapter = null,
203
+ verifierWikiLedgerAdapter = null,
204
+ providerDescriptor,
205
+ verifierDescriptor,
206
+ },
207
+ disposition,
208
+ ) {
209
+ if (
210
+ candidateRegistry === verifierCandidateRegistry ||
211
+ releaseRegistry === verifierReleaseRegistry ||
212
+ transactionLedger === verifierTransactionLedger ||
213
+ (wikiLedgerAdapter !== null &&
214
+ wikiLedgerAdapter === verifierWikiLedgerAdapter) ||
215
+ Boolean(wikiLedgerAdapter) !== Boolean(verifierWikiLedgerAdapter)
216
+ ) {
217
+ throw new TypeError(
218
+ "candidate rejection requires independent fixed readers",
219
+ );
220
+ }
221
+ const provider = bindReader(
222
+ candidateRegistry,
223
+ releaseRegistry,
224
+ transactionLedger,
225
+ tenantId,
226
+ wikiLedgerAdapter,
227
+ );
228
+ const verifier = bindReader(
229
+ verifierCandidateRegistry,
230
+ verifierReleaseRegistry,
231
+ verifierTransactionLedger,
232
+ tenantId,
233
+ verifierWikiLedgerAdapter,
234
+ );
235
+ const providerHead = provider.operations.currentContext().checkpoint;
236
+ const verifierHead = verifier.operations.currentContext().checkpoint;
237
+ if (
238
+ ["epoch", "ledgerId", "identityDigest"].some(
239
+ (key) => providerHead[key] !== verifierHead[key],
240
+ )
241
+ ) {
242
+ throw new TypeError(
243
+ "candidate rejection readers belong to different ledgers",
244
+ );
245
+ }
246
+ if (
247
+ provider.wiki &&
248
+ canonical(provider.wiki.descriptor) !== canonical(verifier.wiki.descriptor)
249
+ )
250
+ throw new TypeError("candidate Wiki reader scopes differ");
251
+ const providerIdentity = captureData(providerDescriptor);
252
+ const verifierIdentity = captureData(verifierDescriptor);
253
+ function proofPair(request) {
254
+ const context = provider.operations.currentContext();
255
+ const other = verifier.operations.currentContext();
256
+ if (canonical(context) !== canonical(other))
257
+ fail("independent readers do not authenticate the same current ledger");
258
+ const left = prove(provider, request, context, disposition);
259
+ const right = prove(verifier, request, context, disposition);
260
+ if (canonical(left) !== canonical(right))
261
+ fail("independent candidate rejection proof differs");
262
+ return left;
263
+ }
264
+ return createGovernedKnowledgeDependencyAuthority({
265
+ tenantId,
266
+ deviceId,
267
+ providerDescriptor: providerIdentity,
268
+ verifierDescriptor: verifierIdentity,
269
+ provider: Object.freeze({
270
+ async apply(request) {
271
+ // Preparation already activated the mandatory admission fence. This
272
+ // authority certifies its real effect; it never changes a draft label
273
+ // or reports success while an active/in-flight version can survive.
274
+ const proof = proofPair(request);
275
+ const evidence = proof.admission.fence.evidence;
276
+ const core = {
277
+ schema: GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
278
+ tenantId,
279
+ deviceId,
280
+ operationId: request.operationId,
281
+ requestDigest: request.requestDigest,
282
+ knowledgeId: request.knowledgeId,
283
+ revocationReceiptDigest: request.revocationReceiptDigest,
284
+ dependencyKind: request.dependency.kind,
285
+ dependencyDigest: request.dependency.digest,
286
+ dependencyDisposition: request.dependency.disposition,
287
+ authorityId: providerIdentity.authorityId,
288
+ authorityRevision: providerIdentity.revision,
289
+ handlerArtifactDigest: providerIdentity.handlerArtifactDigest,
290
+ applied: true,
291
+ durable: true,
292
+ idempotent: true,
293
+ appliedAt: evidence.timestamp,
294
+ };
295
+ const { algorithm, keyId, value } = evidence.signature;
296
+ return captureData({
297
+ ...core,
298
+ resultDigest: digestGovernedKnowledgeDependencyResult(core),
299
+ attestation: { algorithm, keyId, value },
300
+ });
301
+ },
302
+ }),
303
+ verifier: Object.freeze({
304
+ async verify({ request, result }) {
305
+ const proof = proofPair(request);
306
+ const evidence = proof.admission.fence.evidence;
307
+ const { algorithm, keyId, value } = evidence.signature;
308
+ if (
309
+ result.appliedAt !== evidence.timestamp ||
310
+ canonical(result.attestation) !==
311
+ canonical({ algorithm, keyId, value })
312
+ )
313
+ fail("result differs from authenticated admission fence");
314
+ return captureData({
315
+ authenticated: true,
316
+ durable: true,
317
+ tenantId,
318
+ deviceId,
319
+ operationId: request.operationId,
320
+ requestDigest: request.requestDigest,
321
+ resultDigest: result.resultDigest,
322
+ providerAuthorityId: providerIdentity.authorityId,
323
+ providerRevision: providerIdentity.revision,
324
+ verifierAuthorityId: verifierIdentity.authorityId,
325
+ verifierRevision: verifierIdentity.revision,
326
+ verificationReceiptDigest: digest(
327
+ disposition === "quarantine"
328
+ ? QUARANTINE_VERIFICATION_SCHEMA
329
+ : VERIFICATION_SCHEMA,
330
+ {
331
+ tenantId,
332
+ deviceId,
333
+ requestDigest: request.requestDigest,
334
+ resultDigest: result.resultDigest,
335
+ proof,
336
+ verifierIdentity,
337
+ },
338
+ ),
339
+ });
340
+ },
341
+ }),
342
+ });
343
+ }