chainlesschain 0.166.21 → 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 (301) hide show
  1. package/README.md +67 -9
  2. package/package.json +4 -3
  3. package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-DR-MWcZc.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-DT8B7sEb.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-asjh3dQJ.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-DivQ491i.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-DPH2uUmy.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-Bp2nLyc-.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-CHS28khl.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-CKeaFSfz.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-CxwM9BAH.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-DYLDwaCv.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-uYTWOB8j.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-CvYa_dwT.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CanMAX4m.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-B4WaDtHw.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-K93Uof_3.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-CKeDLgUW.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-P93grAeB.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-BSHnMtDn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-epAOpUVJ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-ByjXfP7t.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-QztTU8tb.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-DhUc9yhN.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-C2sLhJJN.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-CcF_R7NW.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-Cm_X2IBk.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-4Sq5FjBt.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-Dx2_v4V6.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-7Vr1xekR.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-B66QPVf-.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-PLsEvhly.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-BMIK9BmC.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BDbyp3J_.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CJdzfZGi.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-C2TH5Y3-.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-D1dYXkvV.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-B-4A1I1j.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-Bgcc9UOl.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-DqOe-etP.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-7VnhzE_6.js} +1 -1
  46. package/src/assets/web-panel/assets/Notes-BxawpeUQ.js +7 -0
  47. package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-Cr08G2aE.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-Ce8bEGlK.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-BC7lveGv.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CakOW-G0.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-Cf8CaOBZ.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-DGJyMEfS.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-DNIwSdwu.js} +6 -6
  55. package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-5B1S12wa.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-CMB6Ke5t.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-D5PqTFiT.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CbKNdSjV.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-CJF5_-Gs.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-CT6iEAdi.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-Ci0h9mJ_.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-Da5mobZu.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BaCY8eey.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-CaITfTsI.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DtUDamyP.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-DX27gFpg.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DFL69osN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-BqGeoWv-.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-3z1WnEAc.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-C_OJQQ9Z.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BY7aT6Mo.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-BZv7DSaD.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B6D7STlI.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-Co_FCZAO.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CnY-9fgz.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-B71yXfZ8.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-Dd_P7awo.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-CvIEMyli.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-DknFBGOi.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-D_4nJONB.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-BNl21fa7.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-CFrCI7uK.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-BVfY6JLg.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Cj9CAK0J.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DcqZlzA3.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-Dfr_dMld.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-Yv6UF0AD.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-CDW_-1fs.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-BYOQvd-6.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-BCGO0BiP.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-DY-70cfQ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-366wfQBU.js} +1 -1
  96. package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
  97. package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B9ZogJJM.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B00GeekA.js → index-B9m5QAMg.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index-BBs2mv5M.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-BFv1hzF6.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
  102. package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-BXlEx4UH.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-e-e40id6.js → index-BayRTE5w.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DXet1xol.js → index-Bb9nyts1.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-Bf_Va0S-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Br3wQLVY.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-BvK4fjkk.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-C40UdtlS.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-C4UJA2ju.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-CB_Iw73G.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-CCwWp3mT.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-CFa2fPCk.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-CIyHxV4u.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-CUP-A2_h.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-CUo27q9J.js} +3 -3
  116. package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-CaT8trvf.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-CnZNbcux.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Cy2NE6AO.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-CzeEEazr.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-D--TEyDj.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DCtsjhhT.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DLOf7BSz.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DM5c4pc-.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-DRFC2Qt0.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DT_qVaaV.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-DUDoRk9r.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-Dg-AQYDf.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-DuIPq5MX.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CGlotREA.js → index-NYVBUAVN.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-NaCESahy.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-RjIMPG0u.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-Y9akzgFO.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-hZ0Eyrrw.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-CG99CcR4.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Z7MH0_0G.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-BX67lOdq.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CmAbG1fE.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-DiU5tI1_.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-BGfvLrYL.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-CggLEgaJ.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-t3nlghPZ.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-BkV4dL9s.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-qec1PUoC.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-ChjX6T8D.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-C3X53s4E.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-Ie0TEVFT.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-CRUMVS8l.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +18 -1
  153. package/src/commands/evolution-benchmark.js +72 -0
  154. package/src/commands/evolution.js +2 -0
  155. package/src/commands/governed-skill-marketplace.js +142 -0
  156. package/src/commands/marketplace.js +4 -1
  157. package/src/commands/serve.js +41 -0
  158. package/src/commands/skill.js +3 -0
  159. package/src/data/changelog.json +39 -0
  160. package/src/gateways/ws/ws-agent-handler.js +59 -2
  161. package/src/gateways/ws/ws-server.js +2 -0
  162. package/src/harness/golden-transcript.js +1 -0
  163. package/src/harness/prompt-compressor.js +51 -5
  164. package/src/harness/provider-backed-compaction.js +28 -1
  165. package/src/harness/remote-session-registry.js +15 -3
  166. package/src/index.js +30 -4
  167. package/src/lazy-dispatch.js +15 -1
  168. package/src/lib/advisor-runtime.js +55 -2
  169. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  170. package/src/lib/app-server/graph-runtime.js +32 -0
  171. package/src/lib/app-server/server.js +45 -1
  172. package/src/lib/app-server/websocket-transport.js +23 -0
  173. package/src/lib/autonomous-agent.js +63 -13
  174. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  175. package/src/lib/cowork/debate-review-cli.js +4 -3
  176. package/src/lib/cowork/decision-kb-cli.js +5 -0
  177. package/src/lib/cowork-adapter.js +38 -16
  178. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  179. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  180. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  181. package/src/lib/evolution/agent-model-projection.js +217 -0
  182. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  183. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  184. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  185. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
  186. package/src/lib/evolution/evidence-json-text.js +236 -0
  187. package/src/lib/evolution/evolution-artifact-ports.js +202 -21
  188. package/src/lib/evolution/evolution-deployment-loader.js +369 -0
  189. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  190. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  191. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  192. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  193. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  194. package/src/lib/evolution/evolution-evidence-projector.js +240 -37
  195. package/src/lib/evolution/evolution-file-witness.js +153 -30
  196. package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
  197. package/src/lib/evolution/evolution-ledger.js +66 -2
  198. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  199. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  200. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  201. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  202. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  203. package/src/lib/evolution/evolution-release-train.js +586 -0
  204. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  205. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  206. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  207. package/src/lib/evolution/evolution-workbench-projection.js +152 -25
  208. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  209. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  210. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  211. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  212. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  213. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  214. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  215. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +736 -0
  216. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  217. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  218. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  219. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
  220. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
  221. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
  222. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  223. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  224. package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
  225. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
  226. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
  227. package/src/lib/evolution/governed-knowledge-sync.js +332 -99
  228. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
  229. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  230. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  231. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  232. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  233. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  234. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  235. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  236. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  237. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  238. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  239. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  240. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  241. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  242. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  243. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  244. package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
  245. package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
  246. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  247. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  248. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  249. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  250. package/src/lib/evolution/skill-candidate-registry.js +22 -0
  251. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  252. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  253. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  254. package/src/lib/evolution/skill-release-registry.js +25 -4
  255. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  256. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  257. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  258. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  259. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  260. package/src/lib/evolution/skill-writer-inventory-manifest.js +15 -12
  261. package/src/lib/evolution/statistical-progressive-canary.js +845 -0
  262. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  263. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  264. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  265. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  266. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
  267. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  268. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  269. package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
  270. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  271. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  272. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  273. package/src/lib/evolution/wikiskill-benchmark.js +574 -0
  274. package/src/lib/goal-assess.js +17 -10
  275. package/src/lib/interactive-planner.js +9 -1
  276. package/src/lib/iteration-budget.js +16 -2
  277. package/src/lib/micro-compact.js +4 -1
  278. package/src/lib/model-failure-policy.js +21 -0
  279. package/src/lib/process-execution-broker/index.js +1 -0
  280. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  281. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  282. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  283. package/src/lib/read-file-page.js +191 -0
  284. package/src/lib/runnable-provider.js +2 -1
  285. package/src/lib/session-host-lease.js +11 -16
  286. package/src/lib/skill-retrieval-router.js +22 -1
  287. package/src/repl/agent-repl.js +127 -33
  288. package/src/runtime/agent-core.js +224 -80
  289. package/src/runtime/agent-runtime.js +43 -0
  290. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  291. package/src/runtime/fallback-model.js +143 -62
  292. package/src/runtime/headless-runner.js +54 -10
  293. package/src/runtime/headless-stream.js +53 -6
  294. package/src/runtime/runtime-factory.js +41 -2
  295. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
  296. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
  297. package/src/assets/web-panel/assets/Projects-FF_thRi6.js +0 -1
  298. package/src/assets/web-panel/assets/SpeechSettings-l7ox6KuX.js +0 -1
  299. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
  300. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
  301. package/src/assets/web-panel/assets/index-c8jJEHVs.js +0 -1
@@ -1,12 +1,31 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { types as utilTypes } from "node:util";
3
3
 
4
+ import { verifyGovernedKnowledgeRecord } from "./governed-knowledge-sync.js";
5
+ import {
6
+ digestGovernedKnowledgeDependencyOperation,
7
+ isGovernedKnowledgeDependencyExecutionRequest,
8
+ } from "./governed-knowledge-dependency-ledger-executor.js";
9
+
4
10
  export const GOVERNED_KNOWLEDGE_DEPENDENCY_REQUEST_SCHEMA =
5
11
  "chainlesschain.governed-knowledge-dependency-request/v1";
6
12
  export const GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA =
7
13
  "chainlesschain.governed-knowledge-dependency-result/v1";
8
14
 
9
15
  const AUTHORITIES = new WeakSet();
16
+ // Only this module can dispatch a prepared router request into a leaf's full
17
+ // request/result verification pipeline. No public rebranding API is exposed.
18
+ const PREPARED_EXECUTIONS = new WeakMap();
19
+ const PREPARED_REVERIFIERS = new WeakMap();
20
+
21
+ // A read-only final check for the genuine executor. Reverification cannot call
22
+ // a provider again, mint a request, or bypass the original leaf verifier.
23
+ export function captureGovernedKnowledgeDependencyReverifier(authority) {
24
+ const verify = PREPARED_REVERIFIERS.get(authority);
25
+ if (!verify)
26
+ throw new TypeError("a genuine dependency authority is required");
27
+ return verify;
28
+ }
10
29
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
11
30
  const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
12
31
  const DESCRIPTOR_KEYS = new Set([
@@ -36,6 +55,14 @@ const RESULT_KEYS = new Set([
36
55
  "tenantId",
37
56
  ]);
38
57
  const ATTESTATION_KEYS = new Set(["algorithm", "keyId", "value"]);
58
+ const INPUT_KEYS = new Set([
59
+ "tenantId",
60
+ "deviceId",
61
+ "operationDigest",
62
+ "knowledge",
63
+ "dependency",
64
+ ]);
65
+ const DEPENDENCY_KEYS = new Set(["kind", "digest", "disposition"]);
39
66
 
40
67
  function canonical(value) {
41
68
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -83,6 +110,14 @@ function exact(value, keys, label) {
83
110
  ) {
84
111
  throw new TypeError(`${label} has an invalid shape`);
85
112
  }
113
+ if (
114
+ actual.some(
115
+ (key) =>
116
+ !Object.hasOwn(Object.getOwnPropertyDescriptor(value, key), "value"),
117
+ )
118
+ ) {
119
+ throw new TypeError(`${label} must contain only data properties`);
120
+ }
86
121
  return value;
87
122
  }
88
123
 
@@ -94,15 +129,17 @@ function identifier(value, label) {
94
129
  }
95
130
 
96
131
  function capture(owner, method, label) {
132
+ if (!owner || typeof owner !== "object" || utilTypes.isProxy(owner)) {
133
+ throw new TypeError(`${label}.${method}() is required`);
134
+ }
135
+ const implementation = owner[method];
97
136
  if (
98
- !owner ||
99
- typeof owner !== "object" ||
100
- utilTypes.isProxy(owner) ||
101
- typeof owner[method] !== "function"
137
+ typeof implementation !== "function" ||
138
+ utilTypes.isProxy(implementation)
102
139
  ) {
103
- throw new TypeError(`${label}.${method}() is required`);
140
+ throw new TypeError(`${label}.${method}() must be a non-proxy function`);
104
141
  }
105
- return (...args) => Reflect.apply(owner[method], owner, args);
142
+ return (...args) => Reflect.apply(implementation, owner, args);
106
143
  }
107
144
 
108
145
  function descriptor(input, label) {
@@ -219,55 +256,201 @@ export function createGovernedKnowledgeDependencyAuthority({
219
256
  }
220
257
  const apply = capture(provider, "apply", "provider");
221
258
  const verify = capture(verifier, "verify", "verifier");
259
+ const executePrepared = async (input, revalidation = null) => {
260
+ exact(input, INPUT_KEYS, "dependency execution input");
261
+ if (
262
+ input?.tenantId !== tenantId ||
263
+ input.deviceId !== deviceId ||
264
+ !DIGEST.test(input.operationDigest ?? "")
265
+ ) {
266
+ throw new Error("dependency request crossed its authority boundary");
267
+ }
268
+ // Normalize and snapshot before the first await, then bind both the entire
269
+ // operation and the selected edge. A plausible digest is not authorization
270
+ // to apply an unlisted dependency or to change its disposition.
271
+ const knowledge = verifyGovernedKnowledgeRecord(input.knowledge, {
272
+ tenantId,
273
+ });
274
+ const dependency = exact(input.dependency, DEPENDENCY_KEYS, "dependency");
275
+ const selected = knowledge.dependencies.find(
276
+ (entry) =>
277
+ entry.kind === dependency.kind &&
278
+ entry.digest === dependency.digest &&
279
+ entry.disposition === dependency.disposition,
280
+ );
281
+ if (
282
+ !["tombstone", "revoke"].includes(knowledge.action) ||
283
+ !selected ||
284
+ input.operationDigest !==
285
+ digestGovernedKnowledgeDependencyOperation({
286
+ tenantId,
287
+ deviceId,
288
+ knowledge,
289
+ })
290
+ ) {
291
+ throw new Error(
292
+ "dependency request is not bound to its revocation operation",
293
+ );
294
+ }
295
+ const request = requestFor({
296
+ tenantId,
297
+ deviceId,
298
+ operationDigest: input.operationDigest,
299
+ knowledge,
300
+ dependency: selected,
301
+ });
302
+ let supplied;
303
+ if (revalidation !== null) {
304
+ exact(
305
+ revalidation.result,
306
+ new Set([...RESULT_KEYS, "verificationReceiptDigest"]),
307
+ "previously verified dependency result",
308
+ );
309
+ if (!DIGEST.test(revalidation.result.verificationReceiptDigest))
310
+ throw new TypeError("dependency verification receipt is invalid");
311
+ supplied = clone(revalidation.result);
312
+ delete supplied.verificationReceiptDigest;
313
+ }
314
+ const result = validateResult(
315
+ revalidation === null ? await apply(request) : supplied,
316
+ request,
317
+ providerDescriptor,
318
+ );
319
+ const verified = await verify({
320
+ request,
321
+ result,
322
+ providerDescriptor,
323
+ verifierDescriptor,
324
+ });
325
+ if (
326
+ verified?.authenticated !== true ||
327
+ verified.durable !== true ||
328
+ verified.tenantId !== tenantId ||
329
+ verified.deviceId !== deviceId ||
330
+ verified.operationId !== request.operationId ||
331
+ verified.requestDigest !== request.requestDigest ||
332
+ verified.resultDigest !== result.resultDigest ||
333
+ verified.providerAuthorityId !== providerDescriptor.authorityId ||
334
+ verified.providerRevision !== providerDescriptor.revision ||
335
+ verified.verifierAuthorityId !== verifierDescriptor.authorityId ||
336
+ verified.verifierRevision !== verifierDescriptor.revision ||
337
+ !DIGEST.test(verified.verificationReceiptDigest ?? "")
338
+ ) {
339
+ throw new Error("dependency result was not independently verified");
340
+ }
341
+ return freeze({
342
+ ...clone(result),
343
+ verificationReceiptDigest: verified.verificationReceiptDigest,
344
+ });
345
+ };
222
346
  const authority = Object.freeze({
223
347
  tenantId,
224
348
  deviceId,
225
349
  async apply(input) {
226
- if (
227
- input?.tenantId !== tenantId ||
228
- input.deviceId !== deviceId ||
229
- !DIGEST.test(input.operationDigest ?? "")
230
- ) {
231
- throw new Error("dependency request crossed its authority boundary");
350
+ if (!isGovernedKnowledgeDependencyExecutionRequest(input, authority)) {
351
+ throw new TypeError(
352
+ "dependency execution requires a prepared executor request",
353
+ );
232
354
  }
233
- const request = requestFor(input);
234
- const result = validateResult(
235
- await apply(request),
236
- request,
237
- providerDescriptor,
238
- );
239
- const verified = await verify({
240
- request,
241
- result,
242
- providerDescriptor,
243
- verifierDescriptor,
244
- });
245
- if (
246
- verified?.authenticated !== true ||
247
- verified.durable !== true ||
248
- verified.tenantId !== tenantId ||
249
- verified.deviceId !== deviceId ||
250
- verified.operationId !== request.operationId ||
251
- verified.requestDigest !== request.requestDigest ||
252
- verified.resultDigest !== result.resultDigest ||
253
- verified.providerAuthorityId !== providerDescriptor.authorityId ||
254
- verified.providerRevision !== providerDescriptor.revision ||
255
- verified.verifierAuthorityId !== verifierDescriptor.authorityId ||
256
- verified.verifierRevision !== verifierDescriptor.revision ||
257
- !DIGEST.test(verified.verificationReceiptDigest ?? "")
258
- ) {
259
- throw new Error("dependency result was not independently verified");
260
- }
261
- return freeze({
262
- ...clone(result),
263
- verificationReceiptDigest: verified.verificationReceiptDigest,
264
- });
355
+ return executePrepared(input);
265
356
  },
266
357
  });
267
358
  AUTHORITIES.add(authority);
359
+ PREPARED_EXECUTIONS.set(authority, executePrepared);
360
+ PREPARED_REVERIFIERS.set(
361
+ authority,
362
+ Object.freeze((input, result) => {
363
+ if (!isGovernedKnowledgeDependencyExecutionRequest(input, authority))
364
+ throw new TypeError(
365
+ "dependency verification requires a prepared executor request",
366
+ );
367
+ return executePrepared(input, { result });
368
+ }),
369
+ );
268
370
  return authority;
269
371
  }
270
372
 
373
+ export function createGovernedKnowledgeDependencyRouter({
374
+ tenantId,
375
+ deviceId,
376
+ routes,
377
+ } = {}) {
378
+ identifier(tenantId, "router tenantId");
379
+ identifier(deviceId, "router deviceId");
380
+ if (
381
+ !routes ||
382
+ typeof routes !== "object" ||
383
+ utilTypes.isProxy(routes) ||
384
+ ![Object.prototype, null].includes(Object.getPrototypeOf(routes))
385
+ ) {
386
+ throw new TypeError("dependency routes must be a plain object");
387
+ }
388
+ const keys = Reflect.ownKeys(routes);
389
+ exact(routes, new Set(keys), "dependency routes");
390
+ const allowed = new Set([
391
+ "wiki/tombstone",
392
+ "wiki/quarantine",
393
+ "candidate/reject-candidate",
394
+ "candidate/quarantine",
395
+ "active-skill/rollback-active",
396
+ "active-skill/quarantine",
397
+ ]);
398
+ if (!keys.length || keys.some((key) => !allowed.has(key)))
399
+ throw new TypeError("dependency route is unsupported");
400
+ const handlers = new Map();
401
+ for (const key of keys) {
402
+ const authority = routes[key];
403
+ const execute = PREPARED_EXECUTIONS.get(authority);
404
+ if (
405
+ !execute ||
406
+ authority.tenantId !== tenantId ||
407
+ authority.deviceId !== deviceId
408
+ ) {
409
+ throw new TypeError(
410
+ "dependency route requires a genuine same-boundary leaf authority",
411
+ );
412
+ }
413
+ handlers.set(key, execute);
414
+ }
415
+ const router = Object.freeze({
416
+ tenantId,
417
+ deviceId,
418
+ async apply(input) {
419
+ if (!isGovernedKnowledgeDependencyExecutionRequest(input, router))
420
+ throw new TypeError(
421
+ "dependency routing requires a prepared executor request",
422
+ );
423
+ exact(input, INPUT_KEYS, "dependency routing input");
424
+ exact(input.dependency, DEPENDENCY_KEYS, "dependency route selection");
425
+ const execute = handlers.get(
426
+ `${input.dependency.kind}/${input.dependency.disposition}`,
427
+ );
428
+ if (!execute)
429
+ throw new Error("no real authority for this dependency disposition");
430
+ return execute(input);
431
+ },
432
+ });
433
+ AUTHORITIES.add(router);
434
+ PREPARED_REVERIFIERS.set(
435
+ router,
436
+ Object.freeze((input, result) => {
437
+ if (!isGovernedKnowledgeDependencyExecutionRequest(input, router))
438
+ throw new TypeError(
439
+ "dependency verification requires a prepared router request",
440
+ );
441
+ exact(input, INPUT_KEYS, "dependency verification input");
442
+ exact(input.dependency, DEPENDENCY_KEYS, "dependency verification route");
443
+ const execute = handlers.get(
444
+ `${input.dependency.kind}/${input.dependency.disposition}`,
445
+ );
446
+ if (!execute)
447
+ throw new Error("no real authority for dependency verification");
448
+ return execute(input, { result });
449
+ }),
450
+ );
451
+ return router;
452
+ }
453
+
271
454
  export function isGovernedKnowledgeDependencyAuthority(value) {
272
455
  return AUTHORITIES.has(value);
273
456
  }
@@ -14,36 +14,37 @@ import {
14
14
  GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
15
15
  digestGovernedKnowledgeDependencyResult,
16
16
  isGovernedKnowledgeDependencyAuthority,
17
+ captureGovernedKnowledgeDependencyReverifier,
17
18
  } from "./governed-knowledge-dependency-authority.js";
18
19
  import {
19
20
  isGovernedKnowledgeExecutionRecord,
20
21
  verifyGovernedKnowledgeRecord,
21
22
  } from "./governed-knowledge-sync.js";
22
23
 
23
- export const GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA =
24
- "chainlesschain.governed-knowledge-dependencies-prepared/v1";
24
+ import {
25
+ GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA,
26
+ GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
27
+ GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE,
28
+ digestGovernedKnowledgeDependencyOperation,
29
+ verifyGovernedKnowledgeDependencyPrepared,
30
+ } from "./governed-knowledge-revocation-record.js";
31
+ export {
32
+ GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA,
33
+ GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
34
+ GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE,
35
+ digestGovernedKnowledgeDependencyOperation,
36
+ verifyGovernedKnowledgeDependencyPrepared,
37
+ } from "./governed-knowledge-revocation-record.js";
38
+
25
39
  export const GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_SCHEMA =
26
40
  "chainlesschain.governed-knowledge-dependencies-settled/v1";
27
- export const GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE =
28
- "knowledge.revocation-dependencies.prepared";
29
41
  export const GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE =
30
42
  "knowledge.revocation-dependencies.settled";
31
- export const GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE =
32
- "CC_GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT";
33
-
34
43
  const EXECUTORS = new WeakSet();
44
+ const EXECUTION_REQUESTS = new WeakMap();
35
45
  const ARTIFACT_TYPE = "governed-knowledge-dependency-operation";
36
46
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
37
47
  const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
38
- const PREPARED_KEYS = new Set([
39
- "deviceId",
40
- "knowledge",
41
- "operationDigest",
42
- "preparedAt",
43
- "recordDigest",
44
- "schema",
45
- "tenantId",
46
- ]);
47
48
  const SETTLED_KEYS = new Set([
48
49
  "deviceId",
49
50
  "operationDigest",
@@ -139,15 +140,26 @@ function identifier(value, label) {
139
140
  }
140
141
 
141
142
  function capture(owner, method, label) {
143
+ if (!owner || typeof owner !== "object" || utilTypes.isProxy(owner)) {
144
+ throw new TypeError(`${label}.${method}() is required`);
145
+ }
146
+ const implementation = owner[method];
142
147
  if (
143
- !owner ||
144
- typeof owner !== "object" ||
145
- utilTypes.isProxy(owner) ||
146
- typeof owner[method] !== "function"
148
+ typeof implementation !== "function" ||
149
+ utilTypes.isProxy(implementation)
147
150
  ) {
148
- throw new TypeError(`${label}.${method}() is required`);
151
+ throw new TypeError(`${label}.${method}() must be a non-proxy function`);
149
152
  }
150
- return (...args) => Reflect.apply(owner[method], owner, args);
153
+ return (...args) => Reflect.apply(implementation, owner, args);
154
+ }
155
+
156
+ export function isGovernedKnowledgeDependencyExecutionRequest(
157
+ value,
158
+ authority,
159
+ ) {
160
+ return (
161
+ EXECUTION_REQUESTS.has(value) && EXECUTION_REQUESTS.get(value) === authority
162
+ );
151
163
  }
152
164
 
153
165
  function descriptor(input) {
@@ -161,29 +173,6 @@ function descriptor(input) {
161
173
  });
162
174
  }
163
175
 
164
- export function digestGovernedKnowledgeDependencyOperation({
165
- tenantId,
166
- deviceId,
167
- knowledge,
168
- }) {
169
- return hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, {
170
- tenantId,
171
- deviceId,
172
- knowledge,
173
- });
174
- }
175
-
176
- function preparedCore(value) {
177
- return {
178
- schema: value.schema,
179
- tenantId: value.tenantId,
180
- deviceId: value.deviceId,
181
- operationDigest: value.operationDigest,
182
- knowledge: value.knowledge,
183
- preparedAt: value.preparedAt,
184
- };
185
- }
186
-
187
176
  function settledCore(value) {
188
177
  return {
189
178
  schema: value.schema,
@@ -243,31 +232,6 @@ function validateResult(
243
232
  return freeze(clone(value));
244
233
  }
245
234
 
246
- function validatePrepared(value, descriptorValue) {
247
- exact(value, PREPARED_KEYS, "dependency prepared record");
248
- const knowledge = verifyGovernedKnowledgeRecord(value.knowledge, {
249
- tenantId: descriptorValue.tenantId,
250
- });
251
- const operationDigest = digestGovernedKnowledgeDependencyOperation({
252
- tenantId: descriptorValue.tenantId,
253
- deviceId: descriptorValue.deviceId,
254
- knowledge,
255
- });
256
- if (
257
- value.schema !== GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA ||
258
- value.tenantId !== descriptorValue.tenantId ||
259
- value.deviceId !== descriptorValue.deviceId ||
260
- !["tombstone", "revoke"].includes(knowledge.action) ||
261
- value.operationDigest !== operationDigest ||
262
- !Number.isFinite(Date.parse(value.preparedAt)) ||
263
- value.recordDigest !==
264
- hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, preparedCore(value))
265
- ) {
266
- corrupt("dependency prepared record is invalid");
267
- }
268
- return freeze(clone(value));
269
- }
270
-
271
235
  function validateSettled(value, prepared, descriptorValue) {
272
236
  exact(value, SETTLED_KEYS, "dependency settled record");
273
237
  const { knowledge, operationDigest } = prepared;
@@ -305,6 +269,9 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
305
269
  dependencyAuthority,
306
270
  now = Date.now,
307
271
  } = {}) {
272
+ if (new.target !== GovernedKnowledgeDependencyLedgerExecutor) {
273
+ throw new TypeError("dependency executors cannot be subclassed");
274
+ }
308
275
  this.descriptor = descriptor(descriptorInput);
309
276
  this._put = capture(artifactPorts, "putCanonical", "artifactPorts");
310
277
  this._read = capture(ledger, "read", "ledger");
@@ -331,6 +298,9 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
331
298
  }
332
299
  this._resolveArtifact = ledgerArtifactResolver;
333
300
  this._apply = capture(dependencyAuthority, "apply", "dependencyAuthority");
301
+ this._reverify =
302
+ captureGovernedKnowledgeDependencyReverifier(dependencyAuthority);
303
+ this._dependencyAuthority = dependencyAuthority;
334
304
  this._now = now;
335
305
  Object.freeze(this);
336
306
  EXECUTORS.add(this);
@@ -401,7 +371,10 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
401
371
  GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
402
372
  );
403
373
  if (!event) return null;
404
- const record = validatePrepared(this._resolve(event), this.descriptor);
374
+ const record = verifyGovernedKnowledgeDependencyPrepared(
375
+ this._resolve(event),
376
+ this.descriptor,
377
+ );
405
378
  if (
406
379
  record.operationDigest !== operationDigest ||
407
380
  event.decision !== "prepared" ||
@@ -528,7 +501,7 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
528
501
  return this._prepared(operationDigest);
529
502
  }
530
503
 
531
- async _settle(prepared, results) {
504
+ async _settle(prepared, results, verifiedHead) {
532
505
  const existing = this._settled(prepared);
533
506
  if (existing) return existing;
534
507
  const settledAt = this._timestamp();
@@ -547,6 +520,13 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
547
520
  const preparedEntry = this._prepared(prepared.operationDigest);
548
521
  if (!preparedEntry) corrupt("cannot settle unprepared dependencies");
549
522
  const head = this._verifyLedger();
523
+ if (
524
+ !verifiedHead ||
525
+ ["epoch", "ledgerId", "identityDigest", "sequence", "headDigest"].some(
526
+ (key) => verifiedHead[key] !== head[key],
527
+ )
528
+ )
529
+ corrupt("dependency effects changed before settlement authorization");
550
530
  const ref = this._publishArtifact(record);
551
531
  const eventId = `${GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE}.${prepared.operationDigest.slice(7)}`;
552
532
  try {
@@ -585,6 +565,9 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
585
565
  }
586
566
 
587
567
  async execute(knowledgeInput) {
568
+ if (!EXECUTORS.has(this)) {
569
+ throw new TypeError("dependency execution requires its branded executor");
570
+ }
588
571
  const knowledge = verifyGovernedKnowledgeRecord(knowledgeInput, {
589
572
  tenantId: this.descriptor.tenantId,
590
573
  });
@@ -599,24 +582,51 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
599
582
  const prepared = this._prepared(operationDigest);
600
583
  const completed = prepared ? this._settled(prepared.record) : null;
601
584
  if (completed) return this._result(completed.record, knowledge, true);
602
- await this._prepare(knowledgeInput, knowledge, operationDigest);
585
+ const durablePrepare = await this._prepare(
586
+ knowledgeInput,
587
+ knowledge,
588
+ operationDigest,
589
+ );
590
+ if (
591
+ !durablePrepare ||
592
+ durablePrepare.record.operationDigest !== operationDigest ||
593
+ canonical(durablePrepare.record.knowledge) !== canonical(knowledge)
594
+ ) {
595
+ corrupt("dependency prepare was not durably read back");
596
+ }
603
597
  const results = [];
598
+ const requests = [];
604
599
  for (const dependency of knowledge.dependencies) {
605
- results.push(
606
- await this._apply({
607
- tenantId: this.descriptor.tenantId,
608
- deviceId: this.descriptor.deviceId,
609
- operationDigest,
610
- knowledge,
611
- dependency,
612
- }),
613
- );
600
+ const request = freeze({
601
+ tenantId: this.descriptor.tenantId,
602
+ deviceId: this.descriptor.deviceId,
603
+ operationDigest,
604
+ knowledge,
605
+ dependency,
606
+ });
607
+ EXECUTION_REQUESTS.set(request, this._dependencyAuthority);
608
+ requests.push(request);
609
+ results.push(await this._apply(request));
614
610
  }
615
- const settled = await this._settle({ operationDigest, knowledge }, results);
611
+ // All effects must still hold together at one authenticated head. Earlier
612
+ // per-effect checks may predate later dependencies or a concurrent writer.
613
+ // This path only rereads/verifies; it never repeats provider side effects.
614
+ const verifiedHead = this._verifyLedger();
615
+ const verifiedResults = [];
616
+ for (const [index, request] of requests.entries())
617
+ verifiedResults.push(await this._reverify(request, results[index]));
618
+ const settled = await this._settle(
619
+ { operationDigest, knowledge },
620
+ verifiedResults,
621
+ verifiedHead,
622
+ );
616
623
  return this._result(settled.record, knowledge, prepared !== null);
617
624
  }
618
625
 
619
626
  async resume({ operationDigest } = {}) {
627
+ if (!EXECUTORS.has(this)) {
628
+ throw new TypeError("dependency recovery requires its branded executor");
629
+ }
620
630
  if (!DIGEST.test(operationDigest ?? "")) {
621
631
  throw new TypeError("operationDigest is invalid");
622
632
  }
@@ -641,6 +651,8 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
641
651
  }
642
652
  }
643
653
 
654
+ Object.freeze(GovernedKnowledgeDependencyLedgerExecutor.prototype);
655
+
644
656
  export function isGovernedKnowledgeDependencyExecutor(value) {
645
657
  return EXECUTORS.has(value);
646
658
  }
@@ -15,6 +15,7 @@ import {
15
15
  } from "./governed-knowledge-conflict-merge.js";
16
16
  import {
17
17
  GOVERNED_KNOWLEDGE_MERGE_PUBLISH_REQUEST_SCHEMA,
18
+ GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA,
18
19
  GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA,
19
20
  digestGovernedKnowledgeMergePublishResult,
20
21
  isGovernedKnowledgeMergePublisherAuthority,
@@ -55,6 +56,11 @@ const SETTLED_KEYS = new Set([
55
56
  ]);
56
57
  const PUBLISH_EVIDENCE_KEYS = new Set([
57
58
  "attestation",
59
+ "artifactCandidateDigest",
60
+ "artifactDigest",
61
+ "artifactReleaseId",
62
+ "artifactTransitionOperationId",
63
+ "artifactTransitionReceiptDigest",
58
64
  "deviceId",
59
65
  "durable",
60
66
  "envelopeDigest",
@@ -73,6 +79,9 @@ const PUBLISH_EVIDENCE_KEYS = new Set([
73
79
  "tenantId",
74
80
  "verificationReceiptDigest",
75
81
  ]);
82
+ const LEGACY_PUBLISH_EVIDENCE_KEYS = new Set(
83
+ [...PUBLISH_EVIDENCE_KEYS].filter((key) => !key.startsWith("artifact")),
84
+ );
76
85
 
77
86
  function canonical(value) {
78
87
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -181,7 +190,13 @@ function settledCore(value) {
181
190
  }
182
191
 
183
192
  function validatePublishEvidence(value, plan, descriptorValue) {
184
- exact(value, PUBLISH_EVIDENCE_KEYS, "merge publish evidence");
193
+ const legacy =
194
+ value?.schema === GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA;
195
+ exact(
196
+ value,
197
+ legacy ? LEGACY_PUBLISH_EVIDENCE_KEYS : PUBLISH_EVIDENCE_KEYS,
198
+ "merge publish evidence",
199
+ );
185
200
  const requestCore = {
186
201
  schema: GOVERNED_KNOWLEDGE_MERGE_PUBLISH_REQUEST_SCHEMA,
187
202
  tenantId: plan.tenantId,
@@ -193,7 +208,10 @@ function validatePublishEvidence(value, plan, descriptorValue) {
193
208
  mergedKnowledge: plan.mergedKnowledge,
194
209
  };
195
210
  if (
196
- value.schema !== GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA ||
211
+ ![
212
+ GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA,
213
+ GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA,
214
+ ].includes(value.schema) ||
197
215
  value.tenantId !== descriptorValue.tenantId ||
198
216
  value.deviceId !== descriptorValue.deviceId ||
199
217
  value.operationId !== `knowledge-merge:${plan.planDigest.slice(7)}` ||
@@ -207,6 +225,15 @@ function validatePublishEvidence(value, plan, descriptorValue) {
207
225
  !DIGEST.test(value.envelopeDigest ?? "") ||
208
226
  !DIGEST.test(value.resultDigest ?? "") ||
209
227
  !DIGEST.test(value.verificationReceiptDigest ?? "") ||
228
+ (!legacy &&
229
+ (!DIGEST.test(value.artifactCandidateDigest ?? "") ||
230
+ !DIGEST.test(value.artifactDigest ?? "") ||
231
+ !ID.test(value.artifactReleaseId ?? "") ||
232
+ !ID.test(value.artifactTransitionOperationId ?? "") ||
233
+ !value.artifactTransitionOperationId.startsWith(
234
+ "artifact-transition:",
235
+ ) ||
236
+ !DIGEST.test(value.artifactTransitionReceiptDigest ?? ""))) ||
210
237
  value.resultDigest !== digestGovernedKnowledgeMergePublishResult(value)
211
238
  ) {
212
239
  corrupt("merge publish evidence is not exactly bound");