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
@@ -0,0 +1,475 @@
1
+ import { types } from "node:util";
2
+ import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
3
+ import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
4
+ import { captureSkillRollbackProvider } from "./skill-promotion-controller.js";
5
+ import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
6
+ import {
7
+ verifySkillMutationRequest,
8
+ digestSkillMutationTransitionSubject,
9
+ } from "./skill-mutation-authority.js";
10
+ import {
11
+ createGovernedKnowledgeDependencyAuthority,
12
+ GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
13
+ digestGovernedKnowledgeDependencyResult,
14
+ } from "./governed-knowledge-dependency-authority.js";
15
+ // Reuse the bounded plain-data snapshot/hash, not pruning plans or permissions.
16
+ import {
17
+ capturePruningData as captureData,
18
+ pruningDigest as digest,
19
+ pruningCanonical as canonical,
20
+ } from "./governed-wiki-pruning-journal.js";
21
+
22
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
23
+ const VERIFICATION_SCHEMA =
24
+ "chainlesschain.knowledge-skill-rollback-verification/v1";
25
+
26
+ function fail(message) {
27
+ throw new Error(`knowledge Skill rollback: ${message}`);
28
+ }
29
+
30
+ export function governedKnowledgeSourceRef({ tenantId, knowledgeId }) {
31
+ if (
32
+ typeof tenantId !== "string" ||
33
+ !ID.test(tenantId) ||
34
+ typeof knowledgeId !== "string" ||
35
+ !ID.test(knowledgeId)
36
+ )
37
+ throw new TypeError("knowledge source identity is invalid");
38
+ return `knowledge://${encodeURIComponent(tenantId)}/${encodeURIComponent(knowledgeId)}`;
39
+ }
40
+
41
+ function bindReader(registry, transactionLedger, tenantId, wikiAdapter) {
42
+ const reader = captureSkillReleaseRegistryReader(registry);
43
+ if (
44
+ reader.tenantId !== tenantId ||
45
+ !reader.matchesTransactionLedger(transactionLedger)
46
+ )
47
+ throw new TypeError(
48
+ "knowledge rollback registry/ledger tenant binding differs",
49
+ );
50
+ const wiki =
51
+ wikiAdapter == null ? null : captureWikiRevisionReader(wikiAdapter);
52
+ if (
53
+ wiki &&
54
+ (wiki.descriptor.tenantId !== tenantId ||
55
+ !captureSkillReleaseOperationReader(transactionLedger).matchesWikiAdapter(
56
+ wikiAdapter,
57
+ ))
58
+ )
59
+ throw new TypeError("Knowledge Wiki lineage tenant differs");
60
+ return Object.freeze({
61
+ registry: reader,
62
+ operations: captureSkillReleaseOperationReader(transactionLedger),
63
+ wiki,
64
+ });
65
+ }
66
+
67
+ function wikiLineage(reader, request, release) {
68
+ if (release.candidate.derivationMode !== "wiki") return null;
69
+ if (!reader.wiki)
70
+ fail("Wiki-derived release requires an authenticated Wiki reader");
71
+ const revision = reader.wiki.readKnowledgeProvenance({
72
+ tenantId: request.tenantId,
73
+ revisionId: release.candidate.wikiRevision,
74
+ knowledgeId: request.knowledgeId,
75
+ contentDigest: request.contentDigest,
76
+ });
77
+ const context = reader.operations.currentContext();
78
+ if (
79
+ ["epoch", "ledgerId", "identityDigest"].some(
80
+ (key) => revision.checkpoint[key] !== context.checkpoint[key],
81
+ )
82
+ )
83
+ fail("Wiki provenance belongs to another release ledger");
84
+ const origin = reader.operations.resolveReleaseOrigin({
85
+ tenantId: request.tenantId,
86
+ skillName: release.skillName,
87
+ releaseDigest: release.releaseDigest,
88
+ context,
89
+ }).result;
90
+ if (
91
+ !origin ||
92
+ origin.projection.status !== "committed" ||
93
+ origin.intent.mutationRequest.requestDigest !==
94
+ release.mutationRequestDigest ||
95
+ revision.checkpoint.sequence >= origin.preparationCheckpoint.sequence
96
+ )
97
+ fail("Wiki provenance must precede the original release preparation");
98
+ return captureData({
99
+ wikiRevision: revision.revisionId,
100
+ stateDigest: revision.stateDigest,
101
+ checkpoint: revision.checkpoint,
102
+ releaseOriginTransactionId: origin.intent.transactionId,
103
+ releaseOriginReceiptDigest: origin.projection.receiptDigest,
104
+ affectedPatternIds: revision.affectedPatternIds,
105
+ unsafePatternIds: revision.unsafePatternIds,
106
+ });
107
+ }
108
+
109
+ function sameLedger(provider, verifier) {
110
+ const left = provider.operations.currentContext().checkpoint;
111
+ const right = verifier.operations.currentContext().checkpoint;
112
+ if (
113
+ ["epoch", "ledgerId", "identityDigest"].some(
114
+ (key) => left[key] !== right[key],
115
+ )
116
+ )
117
+ fail("independent readers do not authenticate the same ledger");
118
+ }
119
+
120
+ function releasesFor(reader, request) {
121
+ if (
122
+ request.dependency.kind !== "active-skill" ||
123
+ request.dependency.disposition !== "rollback-active"
124
+ )
125
+ fail("this provider requires an active-skill / rollback-active dependency");
126
+ // This effect accepts an immutable release identity, never an ambiguous content
127
+ // digest or a caller-supplied Skill name. Other dependency kinds need their own effect.
128
+ const from = reader.registry.readRelease(request.dependency.digest);
129
+ if (
130
+ !from ||
131
+ from.tenantId !== request.tenantId ||
132
+ from.releaseDigest !== request.dependency.digest
133
+ )
134
+ fail("dependent release is missing or substituted");
135
+ const sourceRef = governedKnowledgeSourceRef(request);
136
+ const wiki = wikiLineage(reader, request, from);
137
+ if (
138
+ !from.candidate.sourceEvidenceRefs.some(
139
+ (entry) =>
140
+ entry.ref === sourceRef && entry.digest === request.contentDigest,
141
+ ) &&
142
+ !wiki?.affectedPatternIds.length
143
+ )
144
+ fail("dependent candidate has no exact Knowledge source lineage");
145
+ return { from, sourceRef, wiki };
146
+ }
147
+
148
+ function validateTarget(reader, request, from, target, sourceRef) {
149
+ if (
150
+ !target ||
151
+ target.tenantId !== request.tenantId ||
152
+ target.skillName !== from.skillName ||
153
+ target.releaseDigest === from.releaseDigest
154
+ )
155
+ fail("no distinct same-tenant last-known-good release");
156
+ if (
157
+ target.candidate.sourceEvidenceRefs.some(
158
+ (entry) =>
159
+ entry.ref === sourceRef || entry.digest === request.contentDigest,
160
+ )
161
+ )
162
+ fail("last-known-good still depends on revoked Knowledge");
163
+ const wiki = wikiLineage(reader, request, target);
164
+ if (wiki?.unsafePatternIds.length)
165
+ fail("last-known-good Wiki revision still depends on revoked Knowledge");
166
+ return wiki;
167
+ }
168
+
169
+ function resolve(reader, request, from) {
170
+ return reader.operations.resolveOperation({
171
+ tenantId: request.tenantId,
172
+ skillName: from.skillName,
173
+ operationId: request.operationId,
174
+ context: reader.operations.currentContext(),
175
+ }).result;
176
+ }
177
+
178
+ function committedProof(reader, request) {
179
+ const { from, sourceRef, wiki } = releasesFor(reader, request);
180
+ const result = resolve(reader, request, from);
181
+ if (!result) return null;
182
+ const { intent, previous, projection, finalizationEvidence } = result;
183
+ if (projection.status !== "committed")
184
+ fail("release transaction is pending; reopen the registry to recover");
185
+ const target = reader.registry.readRelease(intent.targetReleaseDigest);
186
+ const targetWiki = validateTarget(reader, request, from, target, sourceRef);
187
+ if (
188
+ intent.operation !== "rollback" ||
189
+ intent.operationId !== request.operationId ||
190
+ intent.skillName !== from.skillName ||
191
+ previous.activeReleaseDigest !== from.releaseDigest ||
192
+ intent.targetReleaseDigest !== previous.lastKnownGoodReleaseDigest ||
193
+ intent.expectedParentDigest !== from.contentDigest ||
194
+ intent.dependencyLockDigest !== target.dependencyLockDigest
195
+ )
196
+ fail("transaction differs from the exact dependent release rollback");
197
+ const active = reader.registry.readActive(from.skillName);
198
+ if (
199
+ projection.current !== true ||
200
+ !active ||
201
+ active.release.releaseDigest !== target.releaseDigest ||
202
+ active.state.transactionId !== intent.transactionId ||
203
+ active.state.stateDigest !== projection.stateDigest
204
+ )
205
+ fail("rollback is no longer the current active release");
206
+ if (
207
+ !finalizationEvidence ||
208
+ finalizationEvidence.eventDigest !== projection.headDigest
209
+ )
210
+ fail("authenticated finalization evidence is missing");
211
+ return captureData({
212
+ fromReleaseDigest: from.releaseDigest,
213
+ targetReleaseDigest: target.releaseDigest,
214
+ transactionId: intent.transactionId,
215
+ stateDigest: projection.stateDigest,
216
+ releaseReceiptDigest: projection.receiptDigest,
217
+ authorityReceiptDigest: intent.authorityReceiptDigest,
218
+ intentDigest: intent.intentDigest,
219
+ epoch: projection.epoch,
220
+ ledgerId: projection.ledgerId,
221
+ sequence: projection.sequence,
222
+ finalizationEvidence,
223
+ ...(wiki || targetWiki
224
+ ? { wikiLineage: { from: wiki, target: targetWiki } }
225
+ : {}),
226
+ });
227
+ }
228
+
229
+ function authorizationData(value) {
230
+ if (!value || typeof value !== "object" || types.isProxy(value))
231
+ fail("rollback authorization must be own data");
232
+ const fields = Object.getOwnPropertyDescriptors(value);
233
+ if (
234
+ Reflect.ownKeys(fields).length !== 2 ||
235
+ !fields.request ||
236
+ !fields.capability ||
237
+ [fields.request, fields.capability].some(
238
+ (field) => !Object.hasOwn(field, "value") || !field.enumerable,
239
+ )
240
+ )
241
+ fail("rollback authorization requires exact own request/capability fields");
242
+ return {
243
+ request: verifySkillMutationRequest(fields.request.value),
244
+ capability: fields.capability.value,
245
+ };
246
+ }
247
+
248
+ // Real active-release effect with direct or historically authenticated Wiki
249
+ // provenance. Candidate rejection and quarantine require separate effects.
250
+ export function createGovernedKnowledgeSkillRollbackAuthority({
251
+ tenantId,
252
+ deviceId,
253
+ releaseRegistry,
254
+ transactionLedger,
255
+ rollbackProvider,
256
+ authorizationProvider,
257
+ verifierReleaseRegistry,
258
+ verifierTransactionLedger,
259
+ wikiLedgerAdapter = null,
260
+ verifierWikiLedgerAdapter = null,
261
+ providerDescriptor,
262
+ verifierDescriptor,
263
+ } = {}) {
264
+ if (
265
+ releaseRegistry === verifierReleaseRegistry ||
266
+ transactionLedger === verifierTransactionLedger
267
+ )
268
+ throw new TypeError(
269
+ "knowledge rollback verifier must use independent readers",
270
+ );
271
+ if (
272
+ (wikiLedgerAdapter === null) !== (verifierWikiLedgerAdapter === null) ||
273
+ (wikiLedgerAdapter !== null &&
274
+ wikiLedgerAdapter === verifierWikiLedgerAdapter)
275
+ )
276
+ throw new TypeError("Wiki provenance requires independent paired readers");
277
+ const providerReader = bindReader(
278
+ releaseRegistry,
279
+ transactionLedger,
280
+ tenantId,
281
+ wikiLedgerAdapter,
282
+ );
283
+ const verifierReader = bindReader(
284
+ verifierReleaseRegistry,
285
+ verifierTransactionLedger,
286
+ tenantId,
287
+ verifierWikiLedgerAdapter,
288
+ );
289
+ if (
290
+ providerReader.wiki &&
291
+ canonical(providerReader.wiki.descriptor) !==
292
+ canonical(verifierReader.wiki.descriptor)
293
+ )
294
+ throw new TypeError("Wiki provenance reader scopes differ");
295
+ sameLedger(providerReader, verifierReader);
296
+ const rollback = captureSkillRollbackProvider(
297
+ rollbackProvider,
298
+ releaseRegistry,
299
+ );
300
+ if (rollback.tenantId !== tenantId)
301
+ throw new TypeError("rollback tenant differs");
302
+ if (
303
+ !authorizationProvider ||
304
+ typeof authorizationProvider !== "object" ||
305
+ types.isProxy(authorizationProvider)
306
+ )
307
+ throw new TypeError("a fixed rollback authorization provider is required");
308
+ const authorize = Object.getOwnPropertyDescriptor(
309
+ authorizationProvider,
310
+ "authorizeRollback",
311
+ )?.value;
312
+ if (typeof authorize !== "function" || types.isProxy(authorize))
313
+ throw new TypeError("a fixed rollback authorization provider is required");
314
+ const providerIdentity = captureData(providerDescriptor);
315
+ const verifierIdentity = captureData(verifierDescriptor);
316
+
317
+ async function apply(request) {
318
+ sameLedger(providerReader, verifierReader);
319
+ let proof = committedProof(providerReader, request);
320
+ if (!proof) {
321
+ const { from, sourceRef, wiki } = releasesFor(providerReader, request);
322
+ const active = providerReader.registry.readActive(from.skillName);
323
+ if (!active || active.release.releaseDigest !== from.releaseDigest)
324
+ fail("dependent release is not currently active");
325
+ const target = providerReader.registry.readRelease(
326
+ active.state.lastKnownGoodReleaseDigest,
327
+ );
328
+ const targetWiki = validateTarget(
329
+ providerReader,
330
+ request,
331
+ from,
332
+ target,
333
+ sourceRef,
334
+ );
335
+ // Independently preflight before asking for a destructive capability.
336
+ const independent = verifierReader.registry.readActive(from.skillName);
337
+ if (canonical(independent) !== canonical(active))
338
+ fail("independent active state differs");
339
+ const independentSource = releasesFor(verifierReader, request);
340
+ const independentTargetWiki = validateTarget(
341
+ verifierReader,
342
+ request,
343
+ independentSource.from,
344
+ verifierReader.registry.readRelease(
345
+ active.state.lastKnownGoodReleaseDigest,
346
+ ),
347
+ sourceRef,
348
+ );
349
+ if (
350
+ canonical(wiki) !== canonical(independentSource.wiki) ||
351
+ canonical(targetWiki) !== canonical(independentTargetWiki)
352
+ )
353
+ fail("independent Wiki provenance differs");
354
+ const expected = captureData({
355
+ tenantId,
356
+ skillName: from.skillName,
357
+ operationId: request.operationId,
358
+ operation: "rollback",
359
+ targetScope: "active",
360
+ expectedTargetDigest: from.contentDigest,
361
+ expectedTargetRevision: active.state.revision,
362
+ targetReleaseDigest: target.releaseDigest,
363
+ transitionSubjectDigest: digestSkillMutationTransitionSubject({
364
+ tenantId,
365
+ skillName: from.skillName,
366
+ operation: "rollback",
367
+ candidateId: null,
368
+ rollbackTargetReleaseDigest: target.releaseDigest,
369
+ dependencyLockDigest: target.dependencyLockDigest,
370
+ expectedActiveContentDigest: from.contentDigest,
371
+ expectedActiveRevision: active.state.revision,
372
+ }),
373
+ });
374
+ const authorization = authorizationData(
375
+ await Reflect.apply(authorize, authorizationProvider, [expected]),
376
+ );
377
+ for (const key of [
378
+ "tenantId",
379
+ "skillName",
380
+ "operationId",
381
+ "operation",
382
+ "targetScope",
383
+ "expectedTargetDigest",
384
+ "expectedTargetRevision",
385
+ "transitionSubjectDigest",
386
+ ])
387
+ if (authorization.request[key] !== expected[key])
388
+ fail("authority authorized a different transition");
389
+ sameLedger(providerReader, verifierReader);
390
+ if (
391
+ committedProof(providerReader, request) !== null ||
392
+ canonical(providerReader.registry.readActive(from.skillName)) !==
393
+ canonical(active)
394
+ )
395
+ fail("release changed while authorization was pending");
396
+ await rollback.rollback({
397
+ authorization,
398
+ targetReleaseDigest: target.releaseDigest,
399
+ });
400
+ proof = committedProof(providerReader, request);
401
+ if (!proof) fail("rollback was not durably read back");
402
+ }
403
+ const core = {
404
+ schema: GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
405
+ tenantId,
406
+ deviceId,
407
+ operationId: request.operationId,
408
+ requestDigest: request.requestDigest,
409
+ knowledgeId: request.knowledgeId,
410
+ revocationReceiptDigest: request.revocationReceiptDigest,
411
+ dependencyKind: request.dependency.kind,
412
+ dependencyDigest: request.dependency.digest,
413
+ dependencyDisposition: request.dependency.disposition,
414
+ authorityId: providerIdentity.authorityId,
415
+ authorityRevision: providerIdentity.revision,
416
+ handlerArtifactDigest: providerIdentity.handlerArtifactDigest,
417
+ applied: true,
418
+ durable: true,
419
+ idempotent: true,
420
+ appliedAt: proof.finalizationEvidence.timestamp,
421
+ };
422
+ const { algorithm, keyId, value } = proof.finalizationEvidence.signature;
423
+ return captureData({
424
+ ...core,
425
+ resultDigest: digestGovernedKnowledgeDependencyResult(core),
426
+ attestation: { algorithm, keyId, value },
427
+ });
428
+ }
429
+
430
+ return createGovernedKnowledgeDependencyAuthority({
431
+ tenantId,
432
+ deviceId,
433
+ providerDescriptor: providerIdentity,
434
+ verifierDescriptor: verifierIdentity,
435
+ provider: Object.freeze({ apply }),
436
+ verifier: Object.freeze({
437
+ async verify({ request, result }) {
438
+ sameLedger(providerReader, verifierReader);
439
+ const proof = committedProof(verifierReader, request);
440
+ const providerProof = committedProof(providerReader, request);
441
+ if (!proof || canonical(proof) !== canonical(providerProof))
442
+ fail("independent durable rollback proof differs");
443
+ const { algorithm, keyId, value } =
444
+ proof.finalizationEvidence.signature;
445
+ if (
446
+ result.appliedAt !== proof.finalizationEvidence.timestamp ||
447
+ canonical(result.attestation) !==
448
+ canonical({ algorithm, keyId, value })
449
+ )
450
+ fail("result differs from authenticated finalization");
451
+ return captureData({
452
+ authenticated: true,
453
+ durable: true,
454
+ tenantId,
455
+ deviceId,
456
+ operationId: request.operationId,
457
+ requestDigest: request.requestDigest,
458
+ resultDigest: result.resultDigest,
459
+ providerAuthorityId: providerIdentity.authorityId,
460
+ providerRevision: providerIdentity.revision,
461
+ verifierAuthorityId: verifierIdentity.authorityId,
462
+ verifierRevision: verifierIdentity.revision,
463
+ verificationReceiptDigest: digest(VERIFICATION_SCHEMA, {
464
+ tenantId,
465
+ deviceId,
466
+ requestDigest: request.requestDigest,
467
+ resultDigest: result.resultDigest,
468
+ proof,
469
+ verifierIdentity,
470
+ }),
471
+ });
472
+ },
473
+ }),
474
+ });
475
+ }
@@ -4,21 +4,23 @@ import { types as utilTypes } from "node:util";
4
4
  import { isGovernedKnowledgeDependencyExecutor } from "./governed-knowledge-dependency-ledger-executor.js";
5
5
  import { isGovernedKnowledgeArtifactLifecycle } from "./governed-knowledge-artifact-lifecycle.js";
6
6
 
7
- export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
8
- "chainlesschain.governed-evolution-knowledge-sync/v1";
7
+ import {
8
+ GOVERNED_KNOWLEDGE_SCOPE,
9
+ verifyGovernedKnowledgeRecord,
10
+ normalizeGovernedKnowledgeVectorClock as vectorClock,
11
+ } from "./governed-knowledge-record.js";
12
+ export {
13
+ GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
14
+ GOVERNED_KNOWLEDGE_SCOPE,
15
+ verifyGovernedKnowledgeRecord,
16
+ } from "./governed-knowledge-record.js";
17
+
9
18
  export const GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA =
10
19
  "chainlesschain.governed-evolution-knowledge-envelope/v1";
11
20
  export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA =
12
21
  "chainlesschain.governed-knowledge-artifact-binding/v2";
13
22
  export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA =
14
23
  "chainlesschain.governed-knowledge-artifact-binding/v1";
15
- export const GOVERNED_KNOWLEDGE_SCOPE = Object.freeze({
16
- PERSONAL: "personal",
17
- PROJECT: "project",
18
- TEAM: "team",
19
- ORG: "org",
20
- });
21
-
22
24
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
23
25
  const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
24
26
  const SCOPES = new Set(Object.values(GOVERNED_KNOWLEDGE_SCOPE));
@@ -97,6 +99,11 @@ function record(value, label) {
97
99
  ![Object.prototype, null].includes(Object.getPrototypeOf(value))
98
100
  )
99
101
  throw new TypeError(`${label} must be a plain object`);
102
+ for (const key of Reflect.ownKeys(value)) {
103
+ const property = Object.getOwnPropertyDescriptor(value, key);
104
+ if (typeof key !== "string" || !Object.hasOwn(property, "value"))
105
+ throw new TypeError(`${label} must contain only data properties`);
106
+ }
100
107
  return value;
101
108
  }
102
109
 
@@ -106,12 +113,6 @@ function id(value, label) {
106
113
  return value;
107
114
  }
108
115
 
109
- function digest(value, label) {
110
- if (typeof value !== "string" || !DIGEST.test(value))
111
- throw new TypeError(`${label} must be sha256-bound`);
112
- return value;
113
- }
114
-
115
116
  function capture(owner, method) {
116
117
  if (
117
118
  !owner ||
@@ -123,23 +124,6 @@ function capture(owner, method) {
123
124
  return (...args) => Reflect.apply(owner[method], owner, args);
124
125
  }
125
126
 
126
- function vectorClock(value) {
127
- record(value, "vectorClock");
128
- const entries = Object.entries(value);
129
- if (entries.length < 1 || entries.length > 64)
130
- throw new TypeError("vectorClock is empty or unbounded");
131
- const result = {};
132
- for (const [deviceId, revision] of entries.sort(([a], [b]) =>
133
- a.localeCompare(b),
134
- )) {
135
- id(deviceId, "vectorClock device");
136
- if (!Number.isSafeInteger(revision) || revision < 0)
137
- throw new TypeError("vectorClock revision is invalid");
138
- result[deviceId] = revision;
139
- }
140
- return result;
141
- }
142
-
143
127
  function relation(left, right) {
144
128
  const devices = new Set([...Object.keys(left), ...Object.keys(right)]);
145
129
  let before = false;
@@ -156,75 +140,14 @@ function relation(left, right) {
156
140
  return "equal";
157
141
  }
158
142
 
159
- function normalizeDependencies(value, action) {
160
- if (!Array.isArray(value) || value.length > 256)
161
- throw new TypeError("dependency dispositions are unbounded");
162
- const seen = new Set();
163
- return value.map((entry) => {
164
- record(entry, "dependency disposition");
165
- const normalized = {
166
- kind: id(entry.kind, "dependency kind"),
167
- digest: digest(entry.digest, "dependency digest"),
168
- disposition: id(entry.disposition, "dependency disposition"),
169
- };
170
- const key = `${normalized.kind}:${normalized.digest}`;
171
- if (seen.has(key)) throw new TypeError("duplicate dependency disposition");
172
- seen.add(key);
173
- if (
174
- ["tombstone", "revoke"].includes(action) &&
175
- ![
176
- "tombstone",
177
- "quarantine",
178
- "reject-candidate",
179
- "rollback-active",
180
- ].includes(normalized.disposition)
181
- )
182
- throw new TypeError("revocation dependency disposition is unsafe");
183
- return normalized;
184
- });
185
- }
186
-
187
143
  function normalizeRecord(input, descriptor, { executionRecord = false } = {}) {
188
- record(input, "knowledge record");
189
- const action = ACTIONS.has(input.action) ? input.action : null;
190
- const scope = SCOPES.has(input.scope) ? input.scope : null;
191
- if (!action || !scope || input.tenantId !== descriptor.tenantId)
192
- throw new TypeError("knowledge record boundary is invalid");
193
- const dependencies = normalizeDependencies(input.dependencies || [], action);
194
- if (
195
- ["team", "org"].includes(scope) &&
196
- !DIGEST.test(input.approvalReceiptDigest || "")
197
- )
198
- throw new TypeError("shared knowledge requires approval");
199
- if (
200
- ["tombstone", "revoke"].includes(action) &&
201
- (!DIGEST.test(input.revocationReceiptDigest || "") ||
202
- dependencies.length < 1)
203
- )
204
- throw new TypeError(
205
- "revocation must bind its receipt and dependency graph",
206
- );
207
- const normalized = freeze({
208
- schema: GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
144
+ const normalized = verifyGovernedKnowledgeRecord(input, {
209
145
  tenantId: descriptor.tenantId,
210
- knowledgeId: id(input.knowledgeId, "knowledgeId"),
211
- scope,
212
- scopeId: id(input.scopeId, "scopeId"),
213
- action,
214
- contentDigest: digest(input.contentDigest, "contentDigest"),
215
- vectorClock: vectorClock(input.vectorClock),
216
- approvalReceiptDigest: input.approvalReceiptDigest || null,
217
- revocationReceiptDigest: input.revocationReceiptDigest || null,
218
- dependencies,
219
146
  });
220
147
  if (executionRecord) EXECUTION_RECORDS.add(normalized);
221
148
  return normalized;
222
149
  }
223
150
 
224
- export function verifyGovernedKnowledgeRecord(input, { tenantId } = {}) {
225
- return normalizeRecord(input, { tenantId: id(tenantId, "tenantId") });
226
- }
227
-
228
151
  export function verifyGovernedKnowledgeArtifactBinding(
229
152
  input,
230
153
  { tenantId, knowledge, authorizationReceiptDigest } = {},