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
@@ -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
+ }
@@ -11,11 +11,16 @@ import {
11
11
  } from "./evolution-ledger.js";
12
12
  import {
13
13
  GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA,
14
+ verifyGovernedKnowledgeArtifactBinding,
14
15
  verifyGovernedKnowledgeEnvelopeIntegrity,
15
16
  verifyGovernedKnowledgeRecord,
16
17
  } from "./governed-knowledge-sync.js";
17
18
 
18
19
  export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA =
20
+ "chainlesschain.governed-evolution-knowledge-ledger-record/v4";
21
+ export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA =
22
+ "chainlesschain.governed-evolution-knowledge-ledger-record/v3";
23
+ export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA =
19
24
  "chainlesschain.governed-evolution-knowledge-ledger-record/v2";
20
25
  export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA =
21
26
  "chainlesschain.governed-evolution-knowledge-ledger-record/v1";
@@ -32,6 +37,7 @@ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
32
37
  const DISPOSITIONS = new Set(["conflict", "local", "remote"]);
33
38
  const MAX_CONFLICT_PAGE = 256;
34
39
  const RECORD_KEYS = new Set([
40
+ "artifactBinding",
35
41
  "committedAt",
36
42
  "authorizationReceiptDigest",
37
43
  "conflictWithDigest",
@@ -45,8 +51,11 @@ const RECORD_KEYS = new Set([
45
51
  "schema",
46
52
  "tenantId",
47
53
  ]);
54
+ const V2_RECORD_KEYS = new Set(
55
+ [...RECORD_KEYS].filter((key) => key !== "artifactBinding"),
56
+ );
48
57
  const LEGACY_RECORD_KEYS = new Set(
49
- [...RECORD_KEYS].filter((key) => key !== "operationId"),
58
+ [...V2_RECORD_KEYS].filter((key) => key !== "operationId"),
50
59
  );
51
60
 
52
61
  function canonical(value) {
@@ -132,9 +141,23 @@ function recordCore(value) {
132
141
  authorizationReceiptDigest: value.authorizationReceiptDigest,
133
142
  committedAt: value.committedAt,
134
143
  };
135
- if (value.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA) {
144
+ if (
145
+ [
146
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
147
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
148
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
149
+ ].includes(value.schema)
150
+ ) {
136
151
  core.operationId = value.operationId;
137
152
  }
153
+ if (
154
+ [
155
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
156
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
157
+ ].includes(value.schema)
158
+ ) {
159
+ core.artifactBinding = value.artifactBinding;
160
+ }
138
161
  return core;
139
162
  }
140
163
 
@@ -208,14 +231,24 @@ function validateEnvelope(value, knowledge, descriptor, disposition) {
208
231
  function validateLedgerRecord(value, descriptor) {
209
232
  const current =
210
233
  value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA;
234
+ const version3 =
235
+ value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA;
236
+ const version2 =
237
+ value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA;
211
238
  exact(
212
239
  value,
213
- current ? RECORD_KEYS : LEGACY_RECORD_KEYS,
240
+ current || version3
241
+ ? RECORD_KEYS
242
+ : version2
243
+ ? V2_RECORD_KEYS
244
+ : LEGACY_RECORD_KEYS,
214
245
  "knowledge sync ledger record",
215
246
  );
216
247
  if (
217
248
  ![
218
249
  GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
250
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
251
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
219
252
  GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA,
220
253
  ].includes(value.schema) ||
221
254
  value.tenantId !== descriptor.tenantId ||
@@ -231,10 +264,10 @@ function validateLedgerRecord(value, descriptor) {
231
264
  corrupt("knowledge sync ledger record binding is invalid");
232
265
  }
233
266
  if (
234
- (current &&
267
+ ((current || version3 || version2) &&
235
268
  value.operationId !== null &&
236
269
  !SAFE_ID.test(value.operationId ?? "")) ||
237
- (!current && Object.hasOwn(value, "operationId"))
270
+ (!current && !version3 && !version2 && Object.hasOwn(value, "operationId"))
238
271
  ) {
239
272
  corrupt("knowledge sync operation binding is invalid");
240
273
  }
@@ -246,6 +279,33 @@ function validateLedgerRecord(value, descriptor) {
246
279
  if (value.conflictWithDigest !== conflictWithDigest) {
247
280
  corrupt("knowledge sync conflict digest was substituted");
248
281
  }
282
+ if (current || version3) {
283
+ if (current || value.disposition === "local") {
284
+ try {
285
+ const binding = verifyGovernedKnowledgeArtifactBinding(
286
+ value.artifactBinding,
287
+ {
288
+ tenantId: descriptor.tenantId,
289
+ knowledge: value.knowledge,
290
+ authorizationReceiptDigest: value.authorizationReceiptDigest,
291
+ },
292
+ );
293
+ if (
294
+ current &&
295
+ (binding.activate !== (value.disposition !== "conflict") ||
296
+ (value.disposition === "local"
297
+ ? !["publish", "merge"].includes(binding.operation)
298
+ : binding.operation !== "receive"))
299
+ ) {
300
+ corrupt("knowledge sync artifact activation binding is invalid");
301
+ }
302
+ } catch {
303
+ corrupt("knowledge sync artifact binding is invalid");
304
+ }
305
+ } else if (value.artifactBinding !== null) {
306
+ corrupt("remote knowledge sync cannot claim an artifact binding");
307
+ }
308
+ }
249
309
  validateEnvelope(
250
310
  value.envelope,
251
311
  value.knowledge,
@@ -398,6 +458,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
398
458
  disposition,
399
459
  authorizationReceiptDigest,
400
460
  operationId = null,
461
+ artifactBinding = null,
401
462
  } = {}) => {
402
463
  if (!DISPOSITIONS.has(disposition)) {
403
464
  throw new TypeError("knowledge sync disposition is invalid");
@@ -451,6 +512,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
451
512
  conflictWithDigest,
452
513
  authorizationReceiptDigest,
453
514
  operationId,
515
+ artifactBinding,
454
516
  };
455
517
  if (canonical(stableExisting) !== canonical(stableRequest)) {
456
518
  corrupt("knowledge sync event identity resolved different content");
@@ -479,6 +541,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
479
541
  conflictWithDigest,
480
542
  authorizationReceiptDigest,
481
543
  operationId,
544
+ artifactBinding: clone(artifactBinding),
482
545
  committedAt,
483
546
  };
484
547
  const record = Object.freeze({
@@ -556,7 +619,11 @@ export class GovernedKnowledgeSyncLedgerAdapter {
556
619
  )
557
620
  ).filter(
558
621
  (record) =>
559
- record.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA &&
622
+ [
623
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
624
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
625
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
626
+ ].includes(record.schema) &&
560
627
  record.disposition === "local" &&
561
628
  record.operationId === normalizedId,
562
629
  );
@@ -566,6 +633,24 @@ export class GovernedKnowledgeSyncLedgerAdapter {
566
633
  return matches[0] ?? null;
567
634
  };
568
635
 
636
+ getReception = async ({ envelopeDigest } = {}) => {
637
+ if (!DIGEST.test(envelopeDigest ?? "")) {
638
+ throw new TypeError("knowledge reception envelope digest is invalid");
639
+ }
640
+ const matches = (
641
+ await Promise.all(
642
+ this._events().map((event) => this._resolveEvent(event)),
643
+ )
644
+ ).filter(
645
+ (record) =>
646
+ record.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA &&
647
+ ["remote", "conflict"].includes(record.disposition) &&
648
+ record.envelopeDigest === envelopeDigest,
649
+ );
650
+ if (matches.length > 1) corrupt("knowledge reception is ambiguous");
651
+ return matches[0] ?? null;
652
+ };
653
+
569
654
  listConflicts = async ({ cursor = 0, limit = 50 } = {}) => {
570
655
  if (
571
656
  !Number.isSafeInteger(cursor) ||
@@ -629,6 +714,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
629
714
  send: capture(send, "send", "send"),
630
715
  load: this.load,
631
716
  loadPublication: this.getPublication,
717
+ loadReception: this.getReception,
632
718
  commit: this.commit,
633
719
  });
634
720
  }