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
@@ -8,6 +8,7 @@ import {
8
8
  } from "./governed-knowledge-merge-publisher-authority.js";
9
9
  import { isGovernedKnowledgeSync } from "./governed-knowledge-sync.js";
10
10
  import { isGovernedKnowledgePublicationReader } from "./governed-knowledge-sync-ledger-adapter.js";
11
+ import { isEvolvableArtifactTransitionReader } from "./evolvable-artifact-ledger-adapter.js";
11
12
 
12
13
  export const GOVERNED_KNOWLEDGE_SYNC_MERGE_VERIFICATION_SCHEMA =
13
14
  "chainlesschain.governed-knowledge-sync-merge-verification/v1";
@@ -121,6 +122,7 @@ function verifyStoredPublication(record, request, envelope = null) {
121
122
 
122
123
  export function createGovernedKnowledgeSyncMergePublisherAuthority({
123
124
  sync,
125
+ verifierArtifactTransitionReader,
124
126
  providerPublicationReader,
125
127
  verifierPublicationReader,
126
128
  providerDescriptor,
@@ -142,9 +144,22 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
142
144
  }
143
145
  const tenantId = sync.tenantId;
144
146
  const deviceId = sync.deviceId;
147
+ if (
148
+ !isEvolvableArtifactTransitionReader(verifierArtifactTransitionReader) ||
149
+ verifierArtifactTransitionReader.tenantId !== tenantId
150
+ ) {
151
+ throw new TypeError(
152
+ "an independent tenant-bound artifact transition reader is required",
153
+ );
154
+ }
155
+ const readArtifactTransition = capture(
156
+ verifierArtifactTransitionReader,
157
+ "readTransition",
158
+ "verifierArtifactTransitionReader",
159
+ );
145
160
  const providerIdentity = descriptor(providerDescriptor, "provider");
146
161
  const verifierIdentity = descriptor(verifierDescriptor, "verifier");
147
- const publish = capture(sync, "publish", "sync");
162
+ const publish = capture(sync, "publishWithArtifactEvidence", "sync");
148
163
  const readProviderPublication = bindReader(
149
164
  providerPublicationReader,
150
165
  tenantId,
@@ -158,10 +173,14 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
158
173
  "verifierPublicationReader",
159
174
  );
160
175
  const provider = Object.freeze({
161
- async publish(request) {
162
- const envelope = await publish(request.mergedKnowledge, {
176
+ async publish(request, plan) {
177
+ const published = await publish(request.mergedKnowledge, {
163
178
  operationId: request.operationId,
179
+ artifactOperation: "merge",
180
+ artifactEvidenceDigest: plan.humanReceiptDigest,
181
+ artifactHumanReviewed: true,
164
182
  });
183
+ const { envelope, artifact } = published;
165
184
  const stored = verifyStoredPublication(
166
185
  await readProviderPublication({ operationId: request.operationId }),
167
186
  request,
@@ -184,6 +203,12 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
184
203
  knowledgeId: request.knowledgeId,
185
204
  mergedContentDigest: request.mergedContentDigest,
186
205
  envelopeDigest: stored.envelopeDigest,
206
+ artifactCandidateDigest: artifact.artifactCandidateDigest,
207
+ artifactDigest: artifact.artifactDigest,
208
+ artifactReleaseId: artifact.artifactReleaseId,
209
+ artifactTransitionOperationId: artifact.artifactTransitionOperationId,
210
+ artifactTransitionReceiptDigest:
211
+ artifact.artifactTransitionReceiptDigest,
187
212
  providerAuthorityId: providerIdentity.authorityId,
188
213
  providerRevision: providerIdentity.revision,
189
214
  providerHandlerArtifactDigest: providerIdentity.handlerArtifactDigest,
@@ -204,13 +229,30 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
204
229
  await readVerifierPublication({ operationId: request.operationId }),
205
230
  request,
206
231
  );
232
+ const transition = await readArtifactTransition({
233
+ operationId: result.artifactTransitionOperationId,
234
+ });
207
235
  if (
208
236
  result.envelopeDigest !== stored.envelopeDigest ||
209
237
  Date.parse(result.publishedAt) < Date.parse(stored.committedAt) ||
210
238
  canonical(result.attestation) !==
211
239
  canonical(stored.envelope.signature) ||
212
240
  result.resultDigest !==
213
- digestGovernedKnowledgeMergePublishResult(result)
241
+ digestGovernedKnowledgeMergePublishResult(result) ||
242
+ transition?.request?.previousArtifactDigest !==
243
+ result.artifactCandidateDigest ||
244
+ transition.request.nextArtifactDigest !== result.artifactDigest ||
245
+ transition.artifact.artifactDigest !== result.artifactDigest ||
246
+ transition.artifact.activeReleaseId !== result.artifactReleaseId ||
247
+ transition.artifact.contentDigest !== request.mergedContentDigest ||
248
+ transition.artifact.runtimeManifest.operation !== "merge" ||
249
+ transition.artifact.runtimeManifest.operationId !==
250
+ request.operationId ||
251
+ transition.receipt.operationId !==
252
+ result.artifactTransitionOperationId ||
253
+ transition.receipt.receiptDigest !==
254
+ result.artifactTransitionReceiptDigest ||
255
+ transition.receipt.durable !== true
214
256
  ) {
215
257
  throw new Error("merge publication result differs from durable state");
216
258
  }
@@ -224,6 +266,12 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
224
266
  resultDigest: result.resultDigest,
225
267
  envelopeDigest: stored.envelopeDigest,
226
268
  publicationRecordDigest: stored.recordDigest,
269
+ artifactCandidateDigest: result.artifactCandidateDigest,
270
+ artifactDigest: result.artifactDigest,
271
+ artifactReleaseId: result.artifactReleaseId,
272
+ artifactTransitionOperationId: result.artifactTransitionOperationId,
273
+ artifactTransitionReceiptDigest:
274
+ result.artifactTransitionReceiptDigest,
227
275
  verifierAuthorityId: verifierIdentity.authorityId,
228
276
  verifierRevision: verifierIdentity.revision,
229
277
  verifierHandlerArtifactDigest: verifierIdentity.handlerArtifactDigest,
@@ -239,6 +287,11 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
239
287
  planDigest: request.planDigest,
240
288
  resultDigest: result.resultDigest,
241
289
  envelopeDigest: stored.envelopeDigest,
290
+ artifactCandidateDigest: result.artifactCandidateDigest,
291
+ artifactDigest: result.artifactDigest,
292
+ artifactReleaseId: result.artifactReleaseId,
293
+ artifactTransitionOperationId: result.artifactTransitionOperationId,
294
+ artifactTransitionReceiptDigest: result.artifactTransitionReceiptDigest,
242
295
  providerAuthorityId: providerIdentity.authorityId,
243
296
  providerRevision: providerIdentity.revision,
244
297
  verifierAuthorityId: verifierIdentity.authorityId,
@@ -2,18 +2,25 @@ import { createHash } from "node:crypto";
2
2
  import { types as utilTypes } from "node:util";
3
3
 
4
4
  import { isGovernedKnowledgeDependencyExecutor } from "./governed-knowledge-dependency-ledger-executor.js";
5
+ import { isGovernedKnowledgeArtifactLifecycle } from "./governed-knowledge-artifact-lifecycle.js";
6
+
7
+ import {
8
+ GOVERNED_KNOWLEDGE_SCOPE,
9
+ verifyGovernedKnowledgeRecord,
10
+ normalizeGovernedKnowledgeVectorClock as vectorClock,
11
+ } from "./governed-knowledge-record.js";
12
+ export {
13
+ GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
14
+ GOVERNED_KNOWLEDGE_SCOPE,
15
+ verifyGovernedKnowledgeRecord,
16
+ } from "./governed-knowledge-record.js";
5
17
 
6
- export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
7
- "chainlesschain.governed-evolution-knowledge-sync/v1";
8
18
  export const GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA =
9
19
  "chainlesschain.governed-evolution-knowledge-envelope/v1";
10
- export const GOVERNED_KNOWLEDGE_SCOPE = Object.freeze({
11
- PERSONAL: "personal",
12
- PROJECT: "project",
13
- TEAM: "team",
14
- ORG: "org",
15
- });
16
-
20
+ export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA =
21
+ "chainlesschain.governed-knowledge-artifact-binding/v2";
22
+ export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA =
23
+ "chainlesschain.governed-knowledge-artifact-binding/v1";
17
24
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
18
25
  const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
19
26
  const SCOPES = new Set(Object.values(GOVERNED_KNOWLEDGE_SCOPE));
@@ -37,6 +44,20 @@ const ENVELOPE_KEYS = new Set([
37
44
  "tenantId",
38
45
  "vectorClock",
39
46
  ]);
47
+ const ARTIFACT_BINDING_KEYS = new Set([
48
+ "activate",
49
+ "authorizationReceiptDigest",
50
+ "baseline",
51
+ "evidenceDigest",
52
+ "humanReviewed",
53
+ "issuedAt",
54
+ "operationId",
55
+ "operation",
56
+ "schema",
57
+ ]);
58
+ const LEGACY_ARTIFACT_BINDING_KEYS = new Set(
59
+ [...ARTIFACT_BINDING_KEYS].filter((key) => key !== "activate"),
60
+ );
40
61
 
41
62
  function canonical(value) {
42
63
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -78,6 +99,11 @@ function record(value, label) {
78
99
  ![Object.prototype, null].includes(Object.getPrototypeOf(value))
79
100
  )
80
101
  throw new TypeError(`${label} must be a plain object`);
102
+ for (const key of Reflect.ownKeys(value)) {
103
+ const property = Object.getOwnPropertyDescriptor(value, key);
104
+ if (typeof key !== "string" || !Object.hasOwn(property, "value"))
105
+ throw new TypeError(`${label} must contain only data properties`);
106
+ }
81
107
  return value;
82
108
  }
83
109
 
@@ -87,12 +113,6 @@ function id(value, label) {
87
113
  return value;
88
114
  }
89
115
 
90
- function digest(value, label) {
91
- if (typeof value !== "string" || !DIGEST.test(value))
92
- throw new TypeError(`${label} must be sha256-bound`);
93
- return value;
94
- }
95
-
96
116
  function capture(owner, method) {
97
117
  if (
98
118
  !owner ||
@@ -104,23 +124,6 @@ function capture(owner, method) {
104
124
  return (...args) => Reflect.apply(owner[method], owner, args);
105
125
  }
106
126
 
107
- function vectorClock(value) {
108
- record(value, "vectorClock");
109
- const entries = Object.entries(value);
110
- if (entries.length < 1 || entries.length > 64)
111
- throw new TypeError("vectorClock is empty or unbounded");
112
- const result = {};
113
- for (const [deviceId, revision] of entries.sort(([a], [b]) =>
114
- a.localeCompare(b),
115
- )) {
116
- id(deviceId, "vectorClock device");
117
- if (!Number.isSafeInteger(revision) || revision < 0)
118
- throw new TypeError("vectorClock revision is invalid");
119
- result[deviceId] = revision;
120
- }
121
- return result;
122
- }
123
-
124
127
  function relation(left, right) {
125
128
  const devices = new Set([...Object.keys(left), ...Object.keys(right)]);
126
129
  let before = false;
@@ -137,73 +140,59 @@ function relation(left, right) {
137
140
  return "equal";
138
141
  }
139
142
 
140
- function normalizeDependencies(value, action) {
141
- if (!Array.isArray(value) || value.length > 256)
142
- throw new TypeError("dependency dispositions are unbounded");
143
- const seen = new Set();
144
- return value.map((entry) => {
145
- record(entry, "dependency disposition");
146
- const normalized = {
147
- kind: id(entry.kind, "dependency kind"),
148
- digest: digest(entry.digest, "dependency digest"),
149
- disposition: id(entry.disposition, "dependency disposition"),
150
- };
151
- const key = `${normalized.kind}:${normalized.digest}`;
152
- if (seen.has(key)) throw new TypeError("duplicate dependency disposition");
153
- seen.add(key);
154
- if (
155
- ["tombstone", "revoke"].includes(action) &&
156
- ![
157
- "tombstone",
158
- "quarantine",
159
- "reject-candidate",
160
- "rollback-active",
161
- ].includes(normalized.disposition)
162
- )
163
- throw new TypeError("revocation dependency disposition is unsafe");
164
- return normalized;
165
- });
166
- }
167
-
168
143
  function normalizeRecord(input, descriptor, { executionRecord = false } = {}) {
169
- record(input, "knowledge record");
170
- const action = ACTIONS.has(input.action) ? input.action : null;
171
- const scope = SCOPES.has(input.scope) ? input.scope : null;
172
- if (!action || !scope || input.tenantId !== descriptor.tenantId)
173
- throw new TypeError("knowledge record boundary is invalid");
174
- const dependencies = normalizeDependencies(input.dependencies || [], action);
175
- if (
176
- ["team", "org"].includes(scope) &&
177
- !DIGEST.test(input.approvalReceiptDigest || "")
178
- )
179
- throw new TypeError("shared knowledge requires approval");
180
- if (
181
- ["tombstone", "revoke"].includes(action) &&
182
- (!DIGEST.test(input.revocationReceiptDigest || "") ||
183
- dependencies.length < 1)
184
- )
185
- throw new TypeError(
186
- "revocation must bind its receipt and dependency graph",
187
- );
188
- const normalized = freeze({
189
- schema: GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
144
+ const normalized = verifyGovernedKnowledgeRecord(input, {
190
145
  tenantId: descriptor.tenantId,
191
- knowledgeId: id(input.knowledgeId, "knowledgeId"),
192
- scope,
193
- scopeId: id(input.scopeId, "scopeId"),
194
- action,
195
- contentDigest: digest(input.contentDigest, "contentDigest"),
196
- vectorClock: vectorClock(input.vectorClock),
197
- approvalReceiptDigest: input.approvalReceiptDigest || null,
198
- revocationReceiptDigest: input.revocationReceiptDigest || null,
199
- dependencies,
200
146
  });
201
147
  if (executionRecord) EXECUTION_RECORDS.add(normalized);
202
148
  return normalized;
203
149
  }
204
150
 
205
- export function verifyGovernedKnowledgeRecord(input, { tenantId } = {}) {
206
- return normalizeRecord(input, { tenantId: id(tenantId, "tenantId") });
151
+ export function verifyGovernedKnowledgeArtifactBinding(
152
+ input,
153
+ { tenantId, knowledge, authorizationReceiptDigest } = {},
154
+ ) {
155
+ record(input, "knowledge artifact binding");
156
+ const expectedTenantId = id(tenantId, "tenantId");
157
+ const normalizedKnowledge = verifyGovernedKnowledgeRecord(knowledge, {
158
+ tenantId: expectedTenantId,
159
+ });
160
+ const keys = Reflect.ownKeys(input);
161
+ const current = input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA;
162
+ const legacy =
163
+ input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA;
164
+ const expectedKeys = current
165
+ ? ARTIFACT_BINDING_KEYS
166
+ : LEGACY_ARTIFACT_BINDING_KEYS;
167
+ const baseline =
168
+ input.baseline === null
169
+ ? null
170
+ : verifyGovernedKnowledgeRecord(input.baseline, {
171
+ tenantId: expectedTenantId,
172
+ });
173
+ if (
174
+ (!current && !legacy) ||
175
+ keys.length !== expectedKeys.size ||
176
+ keys.some((key) => typeof key !== "string" || !expectedKeys.has(key)) ||
177
+ !ID.test(input.operationId ?? "") ||
178
+ !(
179
+ current ? ["publish", "merge", "receive"] : ["publish", "merge"]
180
+ ).includes(input.operation) ||
181
+ (current && typeof input.activate !== "boolean") ||
182
+ !Number.isFinite(Date.parse(input.issuedAt)) ||
183
+ input.authorizationReceiptDigest !== authorizationReceiptDigest ||
184
+ !DIGEST.test(input.authorizationReceiptDigest ?? "") ||
185
+ !DIGEST.test(input.evidenceDigest ?? "") ||
186
+ typeof input.humanReviewed !== "boolean" ||
187
+ (baseline !== null &&
188
+ (baseline.knowledgeId !== normalizedKnowledge.knowledgeId ||
189
+ baseline.scope !== normalizedKnowledge.scope ||
190
+ baseline.scopeId !== normalizedKnowledge.scopeId)) ||
191
+ canonical(baseline) !== canonical(input.baseline)
192
+ ) {
193
+ throw new Error("knowledge artifact binding is invalid");
194
+ }
195
+ return freeze(clone(input));
207
196
  }
208
197
 
209
198
  export function isGovernedKnowledgeExecutionRecord(value) {
@@ -250,7 +239,14 @@ export function verifyGovernedKnowledgeEnvelopeIntegrity(
250
239
  }
251
240
 
252
241
  export class GovernedKnowledgeSync {
253
- constructor({ tenantId, deviceId, ports, dependencyExecutor = null } = {}) {
242
+ constructor({
243
+ tenantId,
244
+ deviceId,
245
+ ports,
246
+ dependencyExecutor = null,
247
+ artifactLifecycle,
248
+ clock = () => Date.now(),
249
+ } = {}) {
254
250
  this.tenantId = id(tenantId, "tenantId");
255
251
  this.deviceId = id(deviceId, "deviceId");
256
252
  this._authorize = capture(ports, "authorize");
@@ -265,6 +261,16 @@ export class GovernedKnowledgeSync {
265
261
  ports?.loadPublication === undefined
266
262
  ? null
267
263
  : capture(ports, "loadPublication");
264
+ this._loadReception = capture(ports, "loadReception");
265
+ if (!isGovernedKnowledgeArtifactLifecycle(artifactLifecycle)) {
266
+ throw new TypeError(
267
+ "a branded governed Knowledge artifact lifecycle is required",
268
+ );
269
+ }
270
+ this._prepareArtifact = capture(artifactLifecycle, "prepare");
271
+ this._commitArtifact = capture(artifactLifecycle, "commit");
272
+ if (typeof clock !== "function") throw new TypeError("clock is required");
273
+ this._clock = clock;
268
274
  if (
269
275
  dependencyExecutor !== null &&
270
276
  !isGovernedKnowledgeDependencyExecutor(dependencyExecutor)
@@ -279,7 +285,20 @@ export class GovernedKnowledgeSync {
279
285
  SYNCHRONIZERS.add(this);
280
286
  }
281
287
 
282
- async publish(input, { operationId = null } = {}) {
288
+ async publish(input, options = {}) {
289
+ const result = await this.publishWithArtifactEvidence(input, options);
290
+ return result.envelope;
291
+ }
292
+
293
+ async publishWithArtifactEvidence(
294
+ input,
295
+ {
296
+ operationId = null,
297
+ artifactOperation = "publish",
298
+ artifactEvidenceDigest = null,
299
+ artifactHumanReviewed = false,
300
+ } = {},
301
+ ) {
283
302
  const knowledge = normalizeRecord(input, this, { executionRecord: true });
284
303
  if (knowledge.scope === "personal")
285
304
  throw new Error("personal knowledge cannot enter a shared sync channel");
@@ -301,6 +320,32 @@ export class GovernedKnowledgeSync {
301
320
  throw new Error("publish operationId resolved different knowledge");
302
321
  }
303
322
  verifyGovernedKnowledgeEnvelopeIntegrity(existing.envelope, this);
323
+ const binding = verifyGovernedKnowledgeArtifactBinding(
324
+ existing.artifactBinding,
325
+ {
326
+ tenantId: this.tenantId,
327
+ knowledge,
328
+ authorizationReceiptDigest: existing.authorizationReceiptDigest,
329
+ },
330
+ );
331
+ if (
332
+ artifactOperation !== binding.operation ||
333
+ (artifactEvidenceDigest !== null &&
334
+ artifactEvidenceDigest !== binding.evidenceDigest) ||
335
+ artifactHumanReviewed !== binding.humanReviewed
336
+ ) {
337
+ throw new Error("publish artifact recovery binding differs");
338
+ }
339
+ const prepared = await this._prepareArtifact({
340
+ knowledge,
341
+ currentKnowledge: binding.baseline,
342
+ operation: binding.operation,
343
+ operationId: binding.operationId,
344
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
345
+ evidenceDigest: binding.evidenceDigest,
346
+ issuedAt: binding.issuedAt,
347
+ humanReviewed: binding.humanReviewed,
348
+ });
304
349
  const sent = await this._send({ envelope: existing.envelope });
305
350
  if (
306
351
  sent?.durable !== true ||
@@ -308,10 +353,51 @@ export class GovernedKnowledgeSync {
308
353
  ) {
309
354
  throw new Error("sync transport did not durably accept the envelope");
310
355
  }
311
- return freeze(clone(existing.envelope));
356
+ const artifact = await this._commitArtifact(prepared);
357
+ return freeze({
358
+ envelope: clone(existing.envelope),
359
+ artifact: clone(artifact),
360
+ recovered: true,
361
+ });
312
362
  }
313
363
  }
314
364
  const admission = await this._admit("publish", knowledge);
365
+ const current = await this._load({ knowledgeId: knowledge.knowledgeId });
366
+ const effectiveOperationId =
367
+ operationId ??
368
+ `knowledge-publish:${hash(
369
+ "chainlesschain.governed-knowledge-publish-operation/v1",
370
+ { tenantId: this.tenantId, deviceId: this.deviceId, knowledge },
371
+ ).slice(7)}`;
372
+ const milliseconds = Number(this._clock());
373
+ if (!Number.isFinite(milliseconds))
374
+ throw new TypeError("knowledge sync clock is invalid");
375
+ const binding = freeze({
376
+ schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
377
+ activate: true,
378
+ operationId: effectiveOperationId,
379
+ operation: artifactOperation,
380
+ issuedAt: new Date(milliseconds).toISOString(),
381
+ authorizationReceiptDigest: admission.receiptDigest,
382
+ evidenceDigest: artifactEvidenceDigest ?? admission.receiptDigest,
383
+ humanReviewed: artifactHumanReviewed,
384
+ baseline: current === null ? null : clone(current),
385
+ });
386
+ verifyGovernedKnowledgeArtifactBinding(binding, {
387
+ tenantId: this.tenantId,
388
+ knowledge,
389
+ authorizationReceiptDigest: admission.receiptDigest,
390
+ });
391
+ const prepared = await this._prepareArtifact({
392
+ knowledge,
393
+ currentKnowledge: binding.baseline,
394
+ operation: binding.operation,
395
+ operationId: binding.operationId,
396
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
397
+ evidenceDigest: binding.evidenceDigest,
398
+ issuedAt: binding.issuedAt,
399
+ humanReviewed: binding.humanReviewed,
400
+ });
315
401
  await this._applyRevocationDependencies(knowledge);
316
402
  const plaintext = Buffer.from(canonical(knowledge), "utf8");
317
403
  const encrypted = await this._encrypt({ knowledge, plaintext });
@@ -344,11 +430,19 @@ export class GovernedKnowledgeSync {
344
430
  envelopeDigest,
345
431
  signature: clone(signature),
346
432
  });
347
- await this._persist(knowledge, envelope, "local", admission, operationId);
433
+ await this._persist(
434
+ knowledge,
435
+ envelope,
436
+ "local",
437
+ admission,
438
+ operationId,
439
+ binding,
440
+ );
348
441
  const sent = await this._send({ envelope });
349
442
  if (sent?.durable !== true || sent.envelopeDigest !== envelopeDigest)
350
443
  throw new Error("sync transport did not durably accept the envelope");
351
- return envelope;
444
+ const artifact = await this._commitArtifact(prepared);
445
+ return freeze({ envelope, artifact: clone(artifact), recovered: false });
352
446
  }
353
447
 
354
448
  async receive(envelope) {
@@ -390,6 +484,60 @@ export class GovernedKnowledgeSync {
390
484
  )
391
485
  throw new Error("knowledge envelope substituted its governed record");
392
486
  const admission = await this._admit("receive", knowledge);
487
+ const existing = await this._loadReception({
488
+ envelopeDigest: envelope.envelopeDigest,
489
+ });
490
+ if (existing) {
491
+ const comparable = { ...existing.knowledge };
492
+ delete comparable.conflictWithDigest;
493
+ if (
494
+ !["remote", "conflict"].includes(existing.disposition) ||
495
+ existing.envelopeDigest !== envelope.envelopeDigest ||
496
+ canonical(comparable) !== canonical(knowledge)
497
+ ) {
498
+ throw new Error("receive envelope resolved different knowledge");
499
+ }
500
+ const binding = verifyGovernedKnowledgeArtifactBinding(
501
+ existing.artifactBinding,
502
+ {
503
+ tenantId: this.tenantId,
504
+ knowledge,
505
+ authorizationReceiptDigest: existing.authorizationReceiptDigest,
506
+ },
507
+ );
508
+ if (
509
+ binding.operation !== "receive" ||
510
+ binding.activate !== (existing.disposition === "remote")
511
+ ) {
512
+ throw new Error("receive artifact recovery binding differs");
513
+ }
514
+ const prepared = await this._prepareArtifact({
515
+ knowledge,
516
+ currentKnowledge: binding.baseline,
517
+ operation: binding.operation,
518
+ operationId: binding.operationId,
519
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
520
+ evidenceDigest: binding.evidenceDigest,
521
+ issuedAt: binding.issuedAt,
522
+ activate: binding.activate,
523
+ humanReviewed: binding.humanReviewed,
524
+ });
525
+ const artifact = await this._commitArtifact(prepared);
526
+ return existing.disposition === "conflict"
527
+ ? freeze({
528
+ applied: false,
529
+ reason: "conflict",
530
+ requiresHumanMerge: true,
531
+ recovered: true,
532
+ artifact: clone(artifact),
533
+ })
534
+ : freeze({
535
+ applied: true,
536
+ action: knowledge.action,
537
+ recovered: true,
538
+ artifact: clone(artifact),
539
+ });
540
+ }
393
541
  const current = await this._load({ knowledgeId: knowledge.knowledgeId });
394
542
  if (current) {
395
543
  const order = relation(current.vectorClock, knowledge.vectorClock);
@@ -400,22 +548,105 @@ export class GovernedKnowledgeSync {
400
548
  return freeze({ applied: false, reason: "replay" });
401
549
  }
402
550
  if (order === "concurrent") {
551
+ const binding = this._receiveArtifactBinding({
552
+ knowledge,
553
+ current,
554
+ admission,
555
+ envelope,
556
+ activate: false,
557
+ });
558
+ const prepared = await this._prepareArtifact({
559
+ knowledge,
560
+ currentKnowledge: binding.baseline,
561
+ operation: binding.operation,
562
+ operationId: binding.operationId,
563
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
564
+ evidenceDigest: binding.evidenceDigest,
565
+ issuedAt: binding.issuedAt,
566
+ activate: binding.activate,
567
+ humanReviewed: binding.humanReviewed,
568
+ });
403
569
  await this._persist(
404
570
  { ...knowledge, conflictWithDigest: current.contentDigest },
405
571
  envelope,
406
572
  "conflict",
407
573
  admission,
574
+ null,
575
+ binding,
408
576
  );
577
+ const artifact = await this._commitArtifact(prepared);
409
578
  return freeze({
410
579
  applied: false,
411
580
  reason: "conflict",
412
581
  requiresHumanMerge: true,
582
+ recovered: false,
583
+ artifact: clone(artifact),
413
584
  });
414
585
  }
415
586
  }
587
+ const binding = this._receiveArtifactBinding({
588
+ knowledge,
589
+ current,
590
+ admission,
591
+ envelope,
592
+ activate: true,
593
+ });
594
+ const prepared = await this._prepareArtifact({
595
+ knowledge,
596
+ currentKnowledge: binding.baseline,
597
+ operation: binding.operation,
598
+ operationId: binding.operationId,
599
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
600
+ evidenceDigest: binding.evidenceDigest,
601
+ issuedAt: binding.issuedAt,
602
+ activate: binding.activate,
603
+ humanReviewed: binding.humanReviewed,
604
+ });
416
605
  await this._applyRevocationDependencies(knowledge);
417
- await this._persist(knowledge, envelope, "remote", admission);
418
- return freeze({ applied: true, action: knowledge.action });
606
+ await this._persist(
607
+ knowledge,
608
+ envelope,
609
+ "remote",
610
+ admission,
611
+ null,
612
+ binding,
613
+ );
614
+ const artifact = await this._commitArtifact(prepared);
615
+ return freeze({
616
+ applied: true,
617
+ action: knowledge.action,
618
+ recovered: false,
619
+ artifact: clone(artifact),
620
+ });
621
+ }
622
+
623
+ _receiveArtifactBinding({
624
+ knowledge,
625
+ current,
626
+ admission,
627
+ envelope,
628
+ activate,
629
+ }) {
630
+ const milliseconds = Number(this._clock());
631
+ if (!Number.isFinite(milliseconds))
632
+ throw new TypeError("knowledge sync clock is invalid");
633
+ const binding = freeze({
634
+ schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
635
+ activate,
636
+ operationId: `knowledge-receive:${envelope.envelopeDigest.slice(7)}`,
637
+ operation: "receive",
638
+ issuedAt: new Date(milliseconds).toISOString(),
639
+ authorizationReceiptDigest: admission.receiptDigest,
640
+ evidenceDigest: envelope.envelopeDigest,
641
+ humanReviewed: false,
642
+ baseline: current === null ? null : clone(current),
643
+ });
644
+ verifyGovernedKnowledgeArtifactBinding(binding, {
645
+ tenantId: this.tenantId,
646
+ knowledge,
647
+ authorizationReceiptDigest: admission.receiptDigest,
648
+ });
649
+ return binding;
419
650
  }
420
651
 
421
652
  async _admit(operation, knowledge) {
@@ -439,6 +670,7 @@ export class GovernedKnowledgeSync {
439
670
  disposition,
440
671
  admission,
441
672
  operationId = null,
673
+ artifactBinding = null,
442
674
  ) {
443
675
  const result = await this._commit({
444
676
  knowledge,
@@ -447,6 +679,7 @@ export class GovernedKnowledgeSync {
447
679
  disposition,
448
680
  authorizationReceiptDigest: admission.receiptDigest,
449
681
  operationId,
682
+ artifactBinding,
450
683
  });
451
684
  if (
452
685
  result?.authenticated !== true ||