chainlesschain 0.166.22 → 0.166.24

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 (291) hide show
  1. package/package.json +4 -3
  2. package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-DR-MWcZc.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DT8B7sEb.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-asjh3dQJ.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-DivQ491i.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-DPH2uUmy.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-Bp2nLyc-.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-CHS28khl.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-CKeaFSfz.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-CxwM9BAH.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-DYLDwaCv.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ds3pA-ET.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-uYTWOB8j.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-CvYa_dwT.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-CanMAX4m.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-B4WaDtHw.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-K93Uof_3.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-CKeDLgUW.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-P93grAeB.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-BSHnMtDn.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-epAOpUVJ.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-ByjXfP7t.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-QztTU8tb.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-DhUc9yhN.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-C2sLhJJN.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-CcF_R7NW.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-Cm_X2IBk.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-4Sq5FjBt.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-Dx2_v4V6.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-7Vr1xekR.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-B66QPVf-.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-DqTx7_u1.js → MarkdownRenderer-PLsEvhly.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-BMIK9BmC.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BDbyp3J_.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-CJdzfZGi.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-C2TH5Y3-.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-D1dYXkvV.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-B-4A1I1j.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-Bgcc9UOl.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-DqOe-etP.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-7VnhzE_6.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-BxawpeUQ.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-Cr08G2aE.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-Ce8bEGlK.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-BC7lveGv.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-CakOW-G0.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-Cf8CaOBZ.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-DGJyMEfS.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-DNIwSdwu.js} +6 -6
  54. package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-5B1S12wa.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-CMB6Ke5t.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-D5PqTFiT.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-CbKNdSjV.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-CJF5_-Gs.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CT6iEAdi.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-Ci0h9mJ_.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-Da5mobZu.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-BaCY8eey.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-CaITfTsI.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DtUDamyP.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-DX27gFpg.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-DFL69osN.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-BqGeoWv-.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-3z1WnEAc.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-C_OJQQ9Z.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-BY7aT6Mo.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BZv7DSaD.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-B6D7STlI.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Co_FCZAO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CnY-9fgz.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-B71yXfZ8.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-Dd_P7awo.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CvIEMyli.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-DknFBGOi.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-D_4nJONB.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-BNl21fa7.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-CFrCI7uK.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-BVfY6JLg.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-Cj9CAK0J.js} +3 -3
  86. package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-DcqZlzA3.js} +3 -3
  87. package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-Dfr_dMld.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-Yv6UF0AD.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-CDW_-1fs.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-BYOQvd-6.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BCGO0BiP.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-DY-70cfQ.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-366wfQBU.js} +1 -1
  95. package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
  96. package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-B9ZogJJM.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-B9m5QAMg.js} +1 -1
  98. package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-BBs2mv5M.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DiT_REby.js → index-BFv1hzF6.js} +1 -1
  100. package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
  101. package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-BXlEx4UH.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-BayRTE5w.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-Bb9nyts1.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-Bf_Va0S-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Br3wQLVY.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-BvK4fjkk.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-C40UdtlS.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DrOalGut.js → index-C4UJA2ju.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-CB_Iw73G.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CCwWp3mT.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-CFa2fPCk.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-CIyHxV4u.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-CUP-A2_h.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CUo27q9J.js} +3 -3
  115. package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-CaT8trvf.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-CnZNbcux.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-Cy2NE6AO.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CzeEEazr.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-D--TEyDj.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DCtsjhhT.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DLOf7BSz.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-DM5c4pc-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-DRFC2Qt0.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-DT_qVaaV.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-DUDoRk9r.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-Dg-AQYDf.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DuIPq5MX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-NYVBUAVN.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-NaCESahy.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-RjIMPG0u.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-Y9akzgFO.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-hZ0Eyrrw.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-CG99CcR4.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-Z7MH0_0G.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-BX67lOdq.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CmAbG1fE.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-DiU5tI1_.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BGfvLrYL.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-CggLEgaJ.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-t3nlghPZ.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-BkV4dL9s.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-qec1PUoC.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-ChjX6T8D.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-C3X53s4E.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Ie0TEVFT.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-CRUMVS8l.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +3 -3
  151. package/src/commands/agent.js +18 -1
  152. package/src/commands/evolution-benchmark.js +72 -0
  153. package/src/commands/evolution.js +2 -0
  154. package/src/commands/governed-skill-marketplace.js +142 -0
  155. package/src/commands/marketplace.js +4 -1
  156. package/src/commands/serve.js +10 -0
  157. package/src/commands/skill.js +3 -0
  158. package/src/data/changelog.json +26 -0
  159. package/src/gateways/ws/ws-agent-handler.js +59 -2
  160. package/src/gateways/ws/ws-server.js +2 -0
  161. package/src/harness/golden-transcript.js +1 -0
  162. package/src/harness/prompt-compressor.js +51 -5
  163. package/src/harness/provider-backed-compaction.js +28 -1
  164. package/src/harness/remote-session-registry.js +15 -3
  165. package/src/index.js +20 -2
  166. package/src/lazy-dispatch.js +6 -0
  167. package/src/lib/advisor-runtime.js +55 -2
  168. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  169. package/src/lib/app-server/graph-runtime.js +32 -0
  170. package/src/lib/app-server/server.js +45 -1
  171. package/src/lib/app-server/websocket-transport.js +2 -0
  172. package/src/lib/autonomous-agent.js +63 -13
  173. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  174. package/src/lib/cowork/debate-review-cli.js +4 -3
  175. package/src/lib/cowork/decision-kb-cli.js +5 -0
  176. package/src/lib/cowork-adapter.js +38 -16
  177. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  178. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  179. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  180. package/src/lib/evolution/agent-model-projection.js +217 -0
  181. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  182. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  183. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  184. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
  185. package/src/lib/evolution/evidence-json-text.js +236 -0
  186. package/src/lib/evolution/evolution-artifact-ports.js +193 -21
  187. package/src/lib/evolution/evolution-deployment-loader.js +163 -2
  188. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  189. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  190. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  191. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  192. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  193. package/src/lib/evolution/evolution-evidence-projector.js +240 -37
  194. package/src/lib/evolution/evolution-file-witness.js +153 -30
  195. package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
  196. package/src/lib/evolution/evolution-ledger.js +66 -2
  197. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  198. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  199. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  200. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  201. package/src/lib/evolution/evolution-release-train.js +54 -6
  202. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  203. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  204. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  205. package/src/lib/evolution/evolution-workbench-projection.js +134 -26
  206. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  207. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  208. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  209. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  210. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  211. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  212. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  213. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -0
  214. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  215. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  216. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
  217. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  218. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  219. package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
  220. package/src/lib/evolution/governed-knowledge-sync.js +17 -94
  221. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
  222. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  223. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  224. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  225. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  226. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  227. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  228. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  229. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  230. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  231. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  232. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  233. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  234. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  235. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  236. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  237. package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
  238. package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
  239. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  240. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  241. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  242. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  243. package/src/lib/evolution/skill-candidate-registry.js +22 -0
  244. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  245. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  246. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  247. package/src/lib/evolution/skill-release-registry.js +25 -4
  248. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  249. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  250. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  251. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  252. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  253. package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
  254. package/src/lib/evolution/statistical-progressive-canary.js +165 -3
  255. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  256. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  257. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  258. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  259. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
  260. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  261. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  262. package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
  263. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  264. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  265. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  266. package/src/lib/evolution/wikiskill-benchmark.js +80 -16
  267. package/src/lib/goal-assess.js +17 -10
  268. package/src/lib/interactive-planner.js +9 -1
  269. package/src/lib/iteration-budget.js +16 -2
  270. package/src/lib/micro-compact.js +4 -1
  271. package/src/lib/model-failure-policy.js +21 -0
  272. package/src/lib/process-execution-broker/index.js +1 -0
  273. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  274. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  275. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  276. package/src/lib/read-file-page.js +191 -0
  277. package/src/lib/runnable-provider.js +2 -1
  278. package/src/lib/skill-retrieval-router.js +22 -1
  279. package/src/repl/agent-repl.js +127 -33
  280. package/src/runtime/agent-core.js +163 -73
  281. package/src/runtime/agent-runtime.js +43 -0
  282. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  283. package/src/runtime/fallback-model.js +143 -62
  284. package/src/runtime/headless-runner.js +54 -10
  285. package/src/runtime/headless-stream.js +50 -6
  286. package/src/runtime/runtime-factory.js +41 -2
  287. package/src/assets/web-panel/assets/Projects-CvtU5peJ.js +0 -1
  288. package/src/assets/web-panel/assets/SpeechSettings-BudpA5kr.js +0 -1
  289. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
  290. package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
  291. package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
@@ -981,17 +981,19 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
981
981
  },
982
982
  }),
983
983
  scopeExclusion({
984
- id: "desktop-marketplace-skill-install-metadata",
984
+ id: "desktop-marketplace-governed-host-delegation",
985
985
  surface: "desktop",
986
- reasonCode: "marketplace-install-record-without-skill-artifact-mutation",
986
+ reasonCode:
987
+ "branded-governed-host-delegation-without-direct-skill-byte-write",
987
988
  evidence: {
988
989
  file: "desktop-app-vue/src/main/marketplace/skill-marketplace-client.js",
989
990
  symbol: "SkillMarketplaceClient.installSkill/uninstallSkill",
990
991
  evidence: [
991
- "async installSkill(skillId, skillData = {})",
992
- "INSERT OR REPLACE INTO skill_marketplace_installs",
993
- "async uninstallSkill(skillId)",
994
- 'prepare("DELETE FROM skill_marketplace_installs WHERE skill_id = ?")',
992
+ "!isDesktopGovernedSkillMarketplaceHost(governedHost)",
993
+ "async installSkill(skillId, options = {})",
994
+ "const result = await host.install({",
995
+ "async uninstallSkill(skillId, options = {})",
996
+ "const state = await host.revoke({ skillName: skillId, ...options });",
995
997
  ],
996
998
  },
997
999
  }),
@@ -1,16 +1,19 @@
1
1
  import { createHash } from "node:crypto";
2
2
 
3
3
  export const PROGRESSIVE_CANARY_PLAN_SCHEMA =
4
- "chainlesschain.progressive-canary-plan/v1";
4
+ "chainlesschain.progressive-canary-plan/v2";
5
5
  export const PROGRESSIVE_CANARY_ASSIGNMENT_SCHEMA =
6
- "chainlesschain.progressive-canary-assignment/v1";
6
+ "chainlesschain.progressive-canary-assignment/v2";
7
7
  export const PROGRESSIVE_CANARY_GATE_REPORT_SCHEMA =
8
- "chainlesschain.progressive-canary-gate-report/v1";
8
+ "chainlesschain.progressive-canary-gate-report/v2";
9
+ export const PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA =
10
+ "chainlesschain.progressive-canary-gate-receipt/v1";
9
11
 
10
12
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
11
13
  const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
12
14
  const RISK_TIERS = new Set(["low", "medium", "high"]);
13
15
  const AUTHORITIES = new WeakSet();
16
+ const GATE_AUTHORITIES = new WeakSet();
14
17
 
15
18
  function canonical(value) {
16
19
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -70,6 +73,10 @@ function verifyPlan(plan) {
70
73
  return plan;
71
74
  }
72
75
 
76
+ export function verifyProgressiveCanaryPlan(plan) {
77
+ return verifyPlan(plan);
78
+ }
79
+
73
80
  function normalizeSteps(steps) {
74
81
  if (!Array.isArray(steps) || steps.length < 3 || steps.length > 16)
75
82
  throw new TypeError("progressive Canary plan requires 3..16 steps");
@@ -160,6 +167,7 @@ export function createProgressiveCanaryPlan(input = {}) {
160
167
  "riskTier",
161
168
  "assignmentSaltDigest",
162
169
  "assignmentAuthority",
170
+ "gateAuthority",
163
171
  "steps",
164
172
  "thresholds",
165
173
  ],
@@ -172,6 +180,11 @@ export function createProgressiveCanaryPlan(input = {}) {
172
180
  ["id", "revision", "handlerDigest"],
173
181
  "assignmentAuthority",
174
182
  );
183
+ exact(
184
+ input.gateAuthority,
185
+ ["id", "revision", "handlerDigest"],
186
+ "gateAuthority",
187
+ );
175
188
  exact(
176
189
  input.thresholds,
177
190
  [
@@ -211,6 +224,20 @@ export function createProgressiveCanaryPlan(input = {}) {
211
224
  "assignmentAuthority.handlerDigest",
212
225
  ),
213
226
  }),
227
+ gateAuthority: Object.freeze({
228
+ id: id(input.gateAuthority.id, "gateAuthority.id"),
229
+ revision: integer(
230
+ input.gateAuthority.revision,
231
+ "gateAuthority.revision",
232
+ {
233
+ min: 1,
234
+ },
235
+ ),
236
+ handlerDigest: sha(
237
+ input.gateAuthority.handlerDigest,
238
+ "gateAuthority.handlerDigest",
239
+ ),
240
+ }),
214
241
  steps: normalizeSteps(input.steps),
215
242
  thresholds: Object.freeze({
216
243
  confidence: finite(input.thresholds.confidence, "confidence", {
@@ -337,6 +364,9 @@ export function createProgressiveCanaryAssignmentAuthority({
337
364
  }
338
365
 
339
366
  const authority = Object.freeze({
367
+ planDigest: plan.planDigest,
368
+ tenantId: plan.tenantId,
369
+ pilotId: plan.pilotId,
340
370
  async assign({ stepId, subjectDigest: subjectDigestInput } = {}) {
341
371
  const step = plan.steps.find(({ id: value }) => value === stepId);
342
372
  if (!step) throw new TypeError("Canary assignment step is invalid");
@@ -423,6 +453,138 @@ function verifyGateReport(report, plan) {
423
453
  return report;
424
454
  }
425
455
 
456
+ export function createProgressiveCanaryGateAuthority({
457
+ plan: planInput,
458
+ assignmentAuthority,
459
+ attestor,
460
+ verifier,
461
+ now = Date.now,
462
+ } = {}) {
463
+ const plan = verifyPlan(planInput);
464
+ if (!AUTHORITIES.has(assignmentAuthority))
465
+ throw new TypeError("a branded Canary assignment authority is required");
466
+ if (
467
+ assignmentAuthority.planDigest !== plan.planDigest ||
468
+ assignmentAuthority.tenantId !== plan.tenantId ||
469
+ assignmentAuthority.pilotId !== plan.pilotId
470
+ )
471
+ throw new TypeError("Canary assignment authority belongs to another plan");
472
+ if (typeof attestor !== "function" || typeof verifier !== "function")
473
+ throw new TypeError("Canary gate attestor and verifier are required");
474
+ if (typeof now !== "function")
475
+ throw new TypeError("Canary gate authority clock is required");
476
+
477
+ async function verifyReceipt(receipt, { stepId } = {}) {
478
+ exact(
479
+ receipt,
480
+ [
481
+ "schema",
482
+ "planDigest",
483
+ "tenantId",
484
+ "pilotId",
485
+ "stepId",
486
+ "report",
487
+ "reportDigest",
488
+ "authorityId",
489
+ "authorityRevision",
490
+ "handlerDigest",
491
+ "issuedAt",
492
+ "expiresAt",
493
+ "signature",
494
+ "receiptDigest",
495
+ ],
496
+ "Canary gate receipt",
497
+ );
498
+ const report = verifyGateReport(receipt.report, plan);
499
+ if (
500
+ receipt.schema !== PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA ||
501
+ receipt.planDigest !== plan.planDigest ||
502
+ receipt.tenantId !== plan.tenantId ||
503
+ receipt.pilotId !== plan.pilotId ||
504
+ receipt.stepId !== stepId ||
505
+ report.stepId !== stepId ||
506
+ receipt.reportDigest !== report.reportDigest ||
507
+ receipt.authorityId !== plan.gateAuthority.id ||
508
+ receipt.authorityRevision !== plan.gateAuthority.revision ||
509
+ receipt.handlerDigest !== plan.gateAuthority.handlerDigest ||
510
+ typeof receipt.issuedAt !== "string" ||
511
+ typeof receipt.expiresAt !== "string" ||
512
+ !Number.isFinite(Date.parse(receipt.issuedAt)) ||
513
+ !Number.isFinite(Date.parse(receipt.expiresAt)) ||
514
+ Date.parse(receipt.issuedAt) > Number(now()) ||
515
+ Date.parse(receipt.expiresAt) < Number(now()) ||
516
+ typeof receipt.signature !== "string" ||
517
+ receipt.signature.length < 32 ||
518
+ !DIGEST.test(receipt.receiptDigest ?? "")
519
+ )
520
+ throw new Error("Canary gate receipt binding is invalid or expired");
521
+ const core = structuredClone(receipt);
522
+ delete core.receiptDigest;
523
+ if (
524
+ hash(PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA, core) !==
525
+ receipt.receiptDigest
526
+ )
527
+ throw new Error("Canary gate receipt digest mismatch");
528
+ const payload = structuredClone(core);
529
+ delete payload.signature;
530
+ if (!(await verifier({ payload, signature: receipt.signature })))
531
+ throw new Error("Canary gate receipt signature rejected");
532
+ return Object.freeze(structuredClone(receipt));
533
+ }
534
+
535
+ const authority = Object.freeze({
536
+ planDigest: plan.planDigest,
537
+ tenantId: plan.tenantId,
538
+ pilotId: plan.pilotId,
539
+ async evaluate(input = {}) {
540
+ const report = await evaluateProgressiveCanaryGate({
541
+ ...input,
542
+ plan,
543
+ assignmentAuthority,
544
+ });
545
+ const payload = {
546
+ schema: PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA,
547
+ planDigest: plan.planDigest,
548
+ tenantId: plan.tenantId,
549
+ pilotId: plan.pilotId,
550
+ stepId: report.stepId,
551
+ report,
552
+ reportDigest: report.reportDigest,
553
+ authorityId: plan.gateAuthority.id,
554
+ authorityRevision: plan.gateAuthority.revision,
555
+ handlerDigest: plan.gateAuthority.handlerDigest,
556
+ };
557
+ const attestation = await attestor(
558
+ Object.freeze(structuredClone(payload)),
559
+ );
560
+ exact(
561
+ attestation,
562
+ ["issuedAt", "expiresAt", "signature"],
563
+ "gate attestation",
564
+ );
565
+ const core = { ...payload, ...attestation };
566
+ return verifyReceipt(
567
+ Object.freeze({
568
+ ...core,
569
+ receiptDigest: hash(PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA, core),
570
+ }),
571
+ { stepId: report.stepId },
572
+ );
573
+ },
574
+ verify: verifyReceipt,
575
+ });
576
+ GATE_AUTHORITIES.add(authority);
577
+ return authority;
578
+ }
579
+
580
+ export function isProgressiveCanaryGateAuthority(value) {
581
+ return GATE_AUTHORITIES.has(value);
582
+ }
583
+
584
+ export function isProgressiveCanaryAssignmentAuthority(value) {
585
+ return AUTHORITIES.has(value);
586
+ }
587
+
426
588
  export async function evaluateProgressiveCanaryGate({
427
589
  plan: planInput,
428
590
  stepId,
@@ -1,10 +1,12 @@
1
1
  import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
2
+ import { types as utilTypes } from "node:util";
2
3
  import { StructuredMemoryLedgerAdapter } from "./structured-memory-ledger-adapter.js";
3
4
  import { StructuredMemoryAuthorityLedgerAdapter } from "./structured-memory-authority-ledger-adapter.js";
4
5
  import { captureStructuredMemoryPromotionReceiptWriter } from "./structured-memory-promotion-receipt-writer.js";
5
6
  import { captureStructuredMemoryPolicyReceiptWriter } from "./structured-memory-policy-receipt-writer.js";
6
7
  import { createStructuredMemorySemanticReviewPipeline } from "./structured-memory-semantic-review-pipeline.js";
7
8
  import { createSkillEvaluatedPromotionControlPlane } from "./skill-promotion-controller.js";
9
+ import { SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA } from "./skill-revocation-propagation.js";
8
10
 
9
11
  const { captureStructuredMemoryAuthority } = structuredMemory;
10
12
 
@@ -12,6 +14,51 @@ export const STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA =
12
14
  "chainlesschain.structured-memory-agent-control-plane/v1";
13
15
 
14
16
  const CONTROL_PLANES = new WeakSet();
17
+ const REVOCATION_REQUEST_KEYS = new Set([
18
+ "schema",
19
+ "tenantId",
20
+ "streamId",
21
+ "operationId",
22
+ "transitionDigest",
23
+ "candidateId",
24
+ "skillName",
25
+ "occurredAt",
26
+ "sourceReceiptDigest",
27
+ "resolutionDigest",
28
+ "dependency",
29
+ "requestDigest",
30
+ ]);
31
+ const REVOCATION_DEPENDENCY_KEYS = new Set([
32
+ "kind",
33
+ "ref",
34
+ "digest",
35
+ "disposition",
36
+ ]);
37
+
38
+ function exactDataRecord(value, keys, label) {
39
+ if (
40
+ !value ||
41
+ typeof value !== "object" ||
42
+ Array.isArray(value) ||
43
+ utilTypes.isProxy(value) ||
44
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
45
+ ) {
46
+ throw new TypeError(`${label} must be a plain record`);
47
+ }
48
+ const own = Reflect.ownKeys(value);
49
+ if (
50
+ own.length !== keys.size ||
51
+ own.some((key) => typeof key !== "string" || !keys.has(key))
52
+ ) {
53
+ throw new TypeError(`${label} has an invalid shape`);
54
+ }
55
+ for (const key of own) {
56
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
57
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
58
+ throw new TypeError(`${label}.${String(key)} is not a data field`);
59
+ }
60
+ }
61
+ }
15
62
 
16
63
  function sameStorage(left, right) {
17
64
  return (
@@ -143,6 +190,78 @@ export function createStructuredMemoryAgentControlPlane({
143
190
  projection: memory.projection(),
144
191
  });
145
192
  };
193
+ const quarantineMemory = async (input) => {
194
+ exactDataRecord(
195
+ input,
196
+ REVOCATION_REQUEST_KEYS,
197
+ "Memory revocation request",
198
+ );
199
+ exactDataRecord(
200
+ input.dependency,
201
+ REVOCATION_DEPENDENCY_KEYS,
202
+ "Memory revocation dependency",
203
+ );
204
+ const request = structuredClone(input);
205
+ const projection = memory.projection();
206
+ const active = projection.memories[request?.dependency?.ref];
207
+ const quarantined = projection.quarantines?.[request?.dependency?.ref];
208
+ const subject =
209
+ active ??
210
+ (quarantined
211
+ ? {
212
+ ...quarantined,
213
+ memoryId: request.dependency.ref,
214
+ status: "active",
215
+ }
216
+ : null);
217
+ if (!subject) {
218
+ throw new Error("procedural Memory dependency is missing");
219
+ }
220
+ const authorityReceipt = await promotion.retainRevocation(request, subject);
221
+ if (quarantined) {
222
+ if (
223
+ quarantined.metadata?.revocationPropagationRequestDigest !==
224
+ request.requestDigest ||
225
+ quarantined.receipts?.revocation !== authorityReceipt.receiptDigest
226
+ ) {
227
+ throw new Error("quarantined Memory conflicts with the rollback");
228
+ }
229
+ } else {
230
+ await memory.append({
231
+ eventId: `revocation-${request.requestDigest.slice("sha256:".length)}`,
232
+ memoryId: subject.memoryId,
233
+ layer: "procedural",
234
+ action: "quarantine",
235
+ authority: promotionActor,
236
+ automatic: true,
237
+ contentDigest: subject.contentDigest,
238
+ artifactRef: subject.artifactRef,
239
+ evidenceRefs: authorityReceipt.evidenceRefs,
240
+ supersedes: [],
241
+ receiptRefs: { revocation: authorityReceipt.receiptDigest },
242
+ timestamp: request.occurredAt,
243
+ metadata: {
244
+ revocationPropagationRequestDigest: request.requestDigest,
245
+ transitionDigest: request.transitionDigest,
246
+ },
247
+ });
248
+ }
249
+ return Object.freeze({
250
+ schema: SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA,
251
+ authenticated: true,
252
+ durable: true,
253
+ applied: true,
254
+ idempotent: true,
255
+ tenantId,
256
+ operationId: request.operationId,
257
+ requestDigest: request.requestDigest,
258
+ dependencyKind: request.dependency.kind,
259
+ dependencyRef: request.dependency.ref,
260
+ dependencyDigest: request.dependency.digest,
261
+ disposition: request.dependency.disposition,
262
+ receiptDigest: memory.projection().projectionDigest,
263
+ });
264
+ };
146
265
  const controlPlane = Object.freeze({
147
266
  schema: STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA,
148
267
  tenantId,
@@ -152,6 +271,7 @@ export function createStructuredMemoryAgentControlPlane({
152
271
  promotionReceiptWriter: promotion,
153
272
  policyReceiptWriter: policy,
154
273
  reconcilePromotionMemories: Object.freeze(reconcilePromotionMemories),
274
+ quarantineMemory: Object.freeze(quarantineMemory),
155
275
  createEvaluatedPromotionControlPlane(options = {}) {
156
276
  if (
157
277
  !options ||
@@ -258,7 +258,11 @@ export class StructuredMemoryAuthorityLedgerAdapter {
258
258
  }
259
259
 
260
260
  async listReceipts(kind) {
261
- if (!["critic", "evaluator", "promotion", "policy"].includes(kind)) {
261
+ if (
262
+ !["critic", "evaluator", "promotion", "revocation", "policy"].includes(
263
+ kind,
264
+ )
265
+ ) {
262
266
  throw new TypeError(
263
267
  "a structured memory authority receipt kind is required",
264
268
  );
@@ -1,8 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { types as utilTypes } from "node:util";
2
3
  import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
3
4
  import { buildSkillEvaluatedPromotionReceiptEnvelope } from "./skill-evaluated-promotion.js";
4
5
  import { digestSkillMutationReceiptEnvelope } from "./skill-mutation-authority.js";
5
6
  import { SKILL_TARGET_MATRIX_EVAL_RECEIPT_SCHEMA } from "./skill-target-matrix-eval.js";
7
+ import {
8
+ SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA,
9
+ digestSkillRevocationDependencyRequest,
10
+ } from "./skill-revocation-propagation.js";
6
11
 
7
12
  const { createStructuredMemoryAuthorityReceipt } = structuredMemory;
8
13
  const SKILL_RELEASE_RECEIPT_SCHEMA =
@@ -12,6 +17,26 @@ const SKILL_PROMOTION_REVIEW_ENVELOPE_SCHEMA =
12
17
  const RELEASE_RECEIPT_DOMAIN = `${SKILL_RELEASE_RECEIPT_SCHEMA}\0`;
13
18
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
14
19
  const WRITERS = new WeakSet();
20
+ const REVOCATION_REQUEST_KEYS = new Set([
21
+ "schema",
22
+ "tenantId",
23
+ "streamId",
24
+ "operationId",
25
+ "transitionDigest",
26
+ "candidateId",
27
+ "skillName",
28
+ "occurredAt",
29
+ "sourceReceiptDigest",
30
+ "resolutionDigest",
31
+ "dependency",
32
+ "requestDigest",
33
+ ]);
34
+ const REVOCATION_DEPENDENCY_KEYS = new Set([
35
+ "kind",
36
+ "ref",
37
+ "digest",
38
+ "disposition",
39
+ ]);
15
40
 
16
41
  function canonical(value) {
17
42
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -40,6 +65,31 @@ function requiredDigest(value, name) {
40
65
  return value;
41
66
  }
42
67
 
68
+ function exact(value, keys, label) {
69
+ if (
70
+ !value ||
71
+ typeof value !== "object" ||
72
+ Array.isArray(value) ||
73
+ utilTypes.isProxy(value) ||
74
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
75
+ ) {
76
+ throw new TypeError(`${label} must be a plain record`);
77
+ }
78
+ const own = Reflect.ownKeys(value);
79
+ if (
80
+ own.length !== keys.size ||
81
+ own.some((key) => typeof key !== "string" || !keys.has(key))
82
+ ) {
83
+ throw new TypeError(`${label} has an invalid shape`);
84
+ }
85
+ for (const key of own) {
86
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
87
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
88
+ throw new TypeError(`${label}.${String(key)} is not a data field`);
89
+ }
90
+ }
91
+ }
92
+
43
93
  function capture(owner, name) {
44
94
  if (typeof owner?.[name] !== "function") {
45
95
  throw new TypeError(`${name} port is required`);
@@ -143,6 +193,45 @@ function verifyPromotion(result, matrixBinding, reviewBinding, tenantId) {
143
193
  return { release, receipt, evidenceRefs: [...new Set(evidenceRefs)].sort() };
144
194
  }
145
195
 
196
+ function verifyRevocation(request, memory, tenantId) {
197
+ exact(request, REVOCATION_REQUEST_KEYS, "Memory revocation request");
198
+ exact(
199
+ request.dependency,
200
+ REVOCATION_DEPENDENCY_KEYS,
201
+ "Memory revocation dependency",
202
+ );
203
+ if (
204
+ request?.schema !== SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA ||
205
+ request.tenantId !== tenantId ||
206
+ request.dependency?.kind !== "memory" ||
207
+ request.dependency.disposition !== "quarantine" ||
208
+ request.dependency.ref !== memory?.memoryId ||
209
+ request.dependency.digest !== memory?.contentDigest ||
210
+ request.requestDigest !== digestSkillRevocationDependencyRequest(request) ||
211
+ memory.layer !== "procedural" ||
212
+ !DIGEST.test(request.transitionDigest ?? "") ||
213
+ !DIGEST.test(request.sourceReceiptDigest ?? "") ||
214
+ !DIGEST.test(request.resolutionDigest ?? "") ||
215
+ !Number.isFinite(Date.parse(request.occurredAt ?? "")) ||
216
+ new Date(request.occurredAt).toISOString() !== request.occurredAt ||
217
+ typeof memory.artifactRef !== "string" ||
218
+ !Array.isArray(memory.evidenceRefs)
219
+ ) {
220
+ throw new Error("Memory revocation request is not exactly bound");
221
+ }
222
+ return {
223
+ evidenceRefs: [
224
+ ...new Set([
225
+ ...memory.evidenceRefs,
226
+ request.transitionDigest,
227
+ request.sourceReceiptDigest,
228
+ request.resolutionDigest,
229
+ request.requestDigest,
230
+ ]),
231
+ ].sort(),
232
+ };
233
+ }
234
+
146
235
  export function createStructuredMemoryPromotionReceiptWriter({
147
236
  descriptor: input,
148
237
  authorityStore,
@@ -201,6 +290,42 @@ export function createStructuredMemoryPromotionReceiptWriter({
201
290
  }
202
291
  return signed;
203
292
  },
293
+ async retainRevocation(request, memory) {
294
+ const verified = verifyRevocation(request, memory, descriptor.tenantId);
295
+ const receipt = createStructuredMemoryAuthorityReceipt({
296
+ tenantId: descriptor.tenantId,
297
+ kind: "revocation",
298
+ decision: "accepted",
299
+ memoryId: memory.memoryId,
300
+ layer: "procedural",
301
+ action: "quarantine",
302
+ contentDigest: memory.contentDigest,
303
+ artifactRef: memory.artifactRef,
304
+ evidenceRefs: verified.evidenceRefs,
305
+ issuerId: descriptor.issuerId,
306
+ issuerRevision: descriptor.issuerRevision,
307
+ issuerHandlerDigest: descriptor.issuerHandlerDigest,
308
+ issuedAt: request.occurredAt,
309
+ });
310
+ const attestation = await attest({
311
+ purpose: "structured-memory-revocation-receipt",
312
+ payloadDigest: receipt.receiptDigest,
313
+ receipt,
314
+ propagationRequestDigest: request.requestDigest,
315
+ });
316
+ if (attestation === null || attestation === undefined) {
317
+ throw new Error("revocation receipt attestor returned no attestation");
318
+ }
319
+ const signed = Object.freeze({ ...receipt, attestation });
320
+ const retained = await retainReceipt(signed);
321
+ if (
322
+ retained?.persisted !== true ||
323
+ retained.receiptDigest !== receipt.receiptDigest
324
+ ) {
325
+ throw new Error("revocation receipt was not durably acknowledged");
326
+ }
327
+ return signed;
328
+ },
204
329
  });
205
330
  WRITERS.add(writer);
206
331
  return writer;
@@ -215,6 +340,7 @@ export function captureStructuredMemoryPromotionReceiptWriter(value) {
215
340
  const captured = Object.freeze({
216
341
  descriptor: value.descriptor,
217
342
  retainPromotion: capture(value, "retainPromotion"),
343
+ retainRevocation: capture(value, "retainRevocation"),
218
344
  });
219
345
  WRITERS.add(captured);
220
346
  return captured;