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,459 @@
1
+ import {
2
+ EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
3
+ isEvolutionLedgerArtifactResolver,
4
+ } from "./evolution-artifact-ports.js";
5
+ import {
6
+ EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
7
+ EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
8
+ EVOLUTION_LEDGER_MAX_EVENTS,
9
+ } from "./evolution-ledger.js";
10
+ import {
11
+ WIKI_PRUNING_JOURNAL_MAX_BYTES,
12
+ assertPruningJournalTransition,
13
+ pruningCanonical,
14
+ pruningOperationCalls,
15
+ verifyWikiPruningJournal,
16
+ } from "./governed-wiki-pruning-journal.js";
17
+
18
+ export const WIKI_PRUNING_JOURNAL_EVENT_TYPE = "wiki.pruning.journal-committed";
19
+ export const WIKI_PRUNING_JOURNAL_ARTIFACT_TYPE = "wiki-pruning-journal";
20
+ const STORES = new WeakMap();
21
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
22
+ function currentContext(head) {
23
+ return Object.freeze({
24
+ mode: "current",
25
+ checkpoint: Object.freeze({
26
+ epoch: head.epoch,
27
+ ledgerId: head.ledgerId,
28
+ identityDigest: head.identityDigest,
29
+ sequence: head.sequence,
30
+ headDigest: head.headDigest,
31
+ }),
32
+ });
33
+ }
34
+
35
+ function historicalContext(event) {
36
+ return Object.freeze({
37
+ mode: "checkpoint",
38
+ checkpoint: Object.freeze({
39
+ epoch: event.epoch,
40
+ ledgerId: event.ledgerId,
41
+ identityDigest: event.identityDigest,
42
+ sequence: event.sequence,
43
+ headDigest: event.eventDigest,
44
+ }),
45
+ });
46
+ }
47
+
48
+ function fail(message) {
49
+ const error = new Error(message);
50
+ error.code = "CC_WIKI_PRUNING_JOURNAL_INVALID";
51
+ throw error;
52
+ }
53
+ function conflict(message) {
54
+ const error = new Error(message);
55
+ error.code = "CC_WIKI_PRUNING_JOURNAL_CONFLICT";
56
+ throw error;
57
+ }
58
+ function capture(owner, name) {
59
+ const operation = owner?.[name];
60
+ if (typeof operation !== "function")
61
+ throw new TypeError(`${name} port is required`);
62
+ return (...args) => Reflect.apply(operation, owner, args);
63
+ }
64
+ function descriptor(input) {
65
+ const value = {};
66
+ for (const key of [
67
+ "tenantId",
68
+ "artifactTenantId",
69
+ "streamId",
70
+ "audience",
71
+ "purpose",
72
+ ]) {
73
+ if (
74
+ typeof input?.[key] !== "string" ||
75
+ !input[key].trim() ||
76
+ input[key].length > 256
77
+ )
78
+ throw new TypeError(`${key} is invalid`);
79
+ value[key] = input[key];
80
+ }
81
+ if (value.purpose !== "evolution-ledger")
82
+ throw new TypeError("pruning journal requires evolution-ledger purpose");
83
+ return Object.freeze(value);
84
+ }
85
+
86
+ // This adapter authenticates persistence, not business authorization by itself.
87
+ // Plan and operation verifiers are mandatory and reconsulted on every restore.
88
+ // Historical entries are verified at their authenticated checkpoint, NOT
89
+ // against an arbitrarily newer Wiki. The current unfinished execution and all
90
+ // proposed writes additionally require current authorization. A completed
91
+ // record is never treated as permission to perform more effects. Plan verifiers
92
+ // must bind checkpoint context to the Wiki ledger identity and ordered effects.
93
+ // The operation verifier must independently authenticate the exact provider
94
+ // receipt, not merely echo its authenticated/durable flags. Effect providers
95
+ // must reconcile duplicate requestDigest values across process boundaries.
96
+ export class GovernedWikiPruningLedgerAdapter {
97
+ #put;
98
+ #read;
99
+ #verifyLedger;
100
+ #append;
101
+ #resolve;
102
+ #verifyPlan;
103
+ #verifyOperation;
104
+ #verifyOperations;
105
+ #clock;
106
+
107
+ constructor({
108
+ descriptor: input,
109
+ artifactPorts,
110
+ ledger,
111
+ ledgerArtifactResolver,
112
+ planVerifier,
113
+ operationReceiptVerifier,
114
+ clock = Date.now,
115
+ } = {}) {
116
+ this.descriptor = descriptor(input);
117
+ if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver))
118
+ throw new TypeError(
119
+ "a branded EvolutionArtifactPorts ledger resolver is required",
120
+ );
121
+ this.#put = capture(artifactPorts, "putCanonical");
122
+ this.#read = capture(ledger, "read");
123
+ this.#verifyLedger = capture(ledger, "verify");
124
+ this.#append = capture(ledger, "appendDomainEvent");
125
+ this.#resolve = ledgerArtifactResolver;
126
+ this.#verifyPlan = capture(planVerifier, "verify");
127
+ this.#verifyOperation = capture(operationReceiptVerifier, "verify");
128
+ this.#verifyOperations =
129
+ operationReceiptVerifier.verifyAll === undefined
130
+ ? null
131
+ : capture(operationReceiptVerifier, "verifyAll");
132
+ if (typeof clock !== "function")
133
+ throw new TypeError("clock port is required");
134
+ this.#clock = clock;
135
+ Object.freeze(this);
136
+ STORES.set(
137
+ this,
138
+ Object.freeze({
139
+ descriptor: this.descriptor,
140
+ load: (input) => this.#load(input),
141
+ commit: (input) => this.#commit(input),
142
+ }),
143
+ );
144
+ }
145
+
146
+ async #authenticate(state, context, verifiedPrefix = null) {
147
+ if (
148
+ verifiedPrefix === null &&
149
+ (await this.#verifyPlan({
150
+ plan: state.plan,
151
+ tenantId: this.descriptor.tenantId,
152
+ streamId: this.descriptor.streamId,
153
+ context,
154
+ })) !== true
155
+ )
156
+ fail("pruning plan authorization is unavailable or revoked");
157
+ const calls = pruningOperationCalls(state.plan);
158
+ const inputs = [];
159
+ for (const [index, receipt] of state.operationReceipts.entries()) {
160
+ if (index < (verifiedPrefix?.operationReceipts.length ?? 0)) continue;
161
+ inputs.push({
162
+ ...calls[index],
163
+ plan: state.plan,
164
+ receipt,
165
+ tenantId: this.descriptor.tenantId,
166
+ streamId: this.descriptor.streamId,
167
+ context,
168
+ });
169
+ }
170
+ if (this.#verifyOperations && inputs.length) {
171
+ if ((await this.#verifyOperations(inputs)) !== true)
172
+ fail("pruning operation receipt batch authentication failed");
173
+ return;
174
+ }
175
+ for (const input of inputs) {
176
+ if ((await this.#verifyOperation(input)) !== true)
177
+ fail("pruning operation receipt authentication failed");
178
+ }
179
+ }
180
+
181
+ async #history() {
182
+ const all = this.#read({ limit: EVOLUTION_LEDGER_MAX_EVENTS });
183
+ if (!Array.isArray(all))
184
+ fail("pruning journal ledger did not return events");
185
+ // read() already authenticates this snapshot. Resolve its artifacts using
186
+ // the same identity and compare to a freshly authenticated head after ALL
187
+ // transition/business checks; no cached authorization crosses calls.
188
+ const tail = all.at(-1);
189
+ const head = tail
190
+ ? {
191
+ epoch: tail.epoch,
192
+ ledgerId: tail.ledgerId,
193
+ identityDigest: tail.identityDigest,
194
+ sequence: tail.sequence,
195
+ headDigest: tail.eventDigest,
196
+ }
197
+ : this.#verifyLedger();
198
+ if (
199
+ all.length !== head.sequence ||
200
+ (all.at(-1)?.eventDigest ?? null) !== head.headDigest ||
201
+ all.some(
202
+ (event, index) =>
203
+ event.sequence !== index + 1 ||
204
+ ["epoch", "ledgerId", "identityDigest"].some(
205
+ (key) => event[key] !== head[key],
206
+ ),
207
+ )
208
+ ) {
209
+ conflict("pruning journal ledger range is incomplete or changed");
210
+ }
211
+ const events = all.filter(
212
+ (event) =>
213
+ event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
214
+ event.type === WIKI_PRUNING_JOURNAL_EVENT_TYPE &&
215
+ event.tenantId === this.descriptor.tenantId &&
216
+ event.correlationId === this.descriptor.streamId,
217
+ );
218
+ const history = [];
219
+ const plans = new Set();
220
+ for (const event of events) {
221
+ const previous = history.at(-1) ?? null;
222
+ if (
223
+ event.artifactTenantId !== this.descriptor.artifactTenantId ||
224
+ event.decision !== "committed" ||
225
+ event.skillName !== null ||
226
+ !Array.isArray(event.sourceRefs) ||
227
+ event.sourceRefs.length !== (previous ? 1 : 0) ||
228
+ (previous &&
229
+ pruningCanonical(event.sourceRefs[0]) !==
230
+ pruningCanonical(previous.event.subjectRef))
231
+ )
232
+ fail("pruning journal event lineage is invalid");
233
+ const resolution = this.#resolve({
234
+ epoch: head.epoch,
235
+ ledgerId: head.ledgerId,
236
+ ref: event.subjectRef,
237
+ tenantId: this.descriptor.artifactTenantId,
238
+ });
239
+ if (
240
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
241
+ resolution.authenticated !== true ||
242
+ resolution.found !== true ||
243
+ resolution.ref !== event.subjectRef.ref ||
244
+ resolution.digest !== event.subjectRef.digest ||
245
+ !DIGEST.test(resolution.receiptDigest) ||
246
+ !Buffer.isBuffer(resolution.bytes) ||
247
+ resolution.bytes.length > WIKI_PRUNING_JOURNAL_MAX_BYTES
248
+ )
249
+ fail("pruning journal artifact resolution is invalid");
250
+ const record = JSON.parse(
251
+ new TextDecoder("utf-8", { fatal: true }).decode(resolution.bytes),
252
+ );
253
+ if (
254
+ record?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
255
+ record.tenantId !== this.descriptor.artifactTenantId ||
256
+ record.audience !== this.descriptor.audience ||
257
+ record.purpose !== this.descriptor.purpose ||
258
+ record.retention !== "ledger" ||
259
+ record.type !== WIKI_PRUNING_JOURNAL_ARTIFACT_TYPE
260
+ )
261
+ fail("pruning journal durable artifact binding is invalid");
262
+ const state = verifyWikiPruningJournal(
263
+ record.value,
264
+ this.descriptor.tenantId,
265
+ );
266
+ if (
267
+ event.eventId !==
268
+ `${WIKI_PRUNING_JOURNAL_EVENT_TYPE}.${state.journalDigest.slice(7)}`
269
+ )
270
+ fail("pruning journal event identity is invalid");
271
+ assertPruningJournalTransition(previous?.state ?? null, state);
272
+ if (previous?.state.plan.planDigest !== state.plan.planDigest) {
273
+ if (plans.has(state.plan.planDigest))
274
+ fail("pruning journal restarted a historical plan");
275
+ plans.add(state.plan.planDigest);
276
+ }
277
+ const samePlan =
278
+ previous?.state.plan.planDigest === state.plan.planDigest;
279
+ const entry = {
280
+ event,
281
+ state,
282
+ prepared: samePlan ? previous.prepared : { event, state },
283
+ };
284
+ if (samePlan) history[history.length - 1] = entry;
285
+ else history.push(entry);
286
+ }
287
+ // Every immutable event/transition above is checked. Per plan, authenticate
288
+ // its source at preparation and its full retained receipt prefix at the
289
+ // latest checkpoint. Intermediate states retain the exact same plan and
290
+ // immutable receipt prefixes, so need no duplicate business verification.
291
+ const latestEntry = history.at(-1);
292
+ const currentIsLatestCheckpoint =
293
+ latestEntry?.state.phase !== "finalized" &&
294
+ latestEntry?.event.sequence === head.sequence &&
295
+ latestEntry?.event.eventDigest === head.headDigest;
296
+ for (const entry of history) {
297
+ // When the latest checkpoint IS the current head, current verification
298
+ // proves the exact same historical boundary and additionally enforces
299
+ // current authorities/active pointers. Do not verify that boundary twice.
300
+ // Older preparation checkpoints always retain their own as-of check.
301
+ const latestContext =
302
+ entry === latestEntry && currentIsLatestCheckpoint
303
+ ? currentContext(head)
304
+ : historicalContext(entry.event);
305
+ await this.#authenticate(
306
+ entry.prepared.state,
307
+ entry.state.journalDigest === entry.prepared.state.journalDigest
308
+ ? latestContext
309
+ : historicalContext(entry.prepared.event),
310
+ );
311
+ if (entry.state.journalDigest !== entry.prepared.state.journalDigest)
312
+ await this.#authenticate(entry.state, latestContext);
313
+ }
314
+ const latest = history.at(-1)?.state;
315
+ if (latest && latest.phase !== "finalized" && !currentIsLatestCheckpoint)
316
+ await this.#authenticate(latest, currentContext(head));
317
+ const after = this.#verifyLedger();
318
+ if (
319
+ after.headDigest !== head.headDigest ||
320
+ after.sequence !== head.sequence ||
321
+ after.identityDigest !== head.identityDigest ||
322
+ after.epoch !== head.epoch ||
323
+ after.ledgerId !== head.ledgerId
324
+ )
325
+ conflict("pruning journal ledger changed while restoring");
326
+ return { head, history };
327
+ }
328
+
329
+ #resolution(entry, head) {
330
+ return Object.freeze({
331
+ authenticated: true,
332
+ durable: true,
333
+ found: !!entry,
334
+ tenantId: this.descriptor.tenantId,
335
+ streamId: this.descriptor.streamId,
336
+ state: entry?.state ?? null,
337
+ receiptDigest: entry?.event.eventDigest ?? null,
338
+ ledgerHead: currentContext(head).checkpoint,
339
+ checkpoint: entry ? historicalContext(entry.event).checkpoint : null,
340
+ });
341
+ }
342
+
343
+ load(input) {
344
+ return this.#load(input);
345
+ }
346
+
347
+ async #load({ tenantId, planDigest = null } = {}) {
348
+ if (
349
+ tenantId !== this.descriptor.tenantId ||
350
+ (planDigest !== null && !DIGEST.test(planDigest))
351
+ )
352
+ throw new TypeError("pruning journal load scope is invalid");
353
+ const { history, head } = await this.#history();
354
+ return this.#resolution(
355
+ (planDigest === null
356
+ ? history
357
+ : history.filter((entry) => entry.state.plan.planDigest === planDigest)
358
+ ).at(-1),
359
+ head,
360
+ );
361
+ }
362
+
363
+ commit(input) {
364
+ return this.#commit(input);
365
+ }
366
+
367
+ async #commit({ state: input, expectedJournalDigest } = {}) {
368
+ const state = verifyWikiPruningJournal(input, this.descriptor.tenantId);
369
+ if (expectedJournalDigest !== null && !DIGEST.test(expectedJournalDigest))
370
+ throw new TypeError("expectedJournalDigest is invalid");
371
+ const { history, head } = await this.#history();
372
+ const previous = history.at(-1) ?? null;
373
+ if (previous?.state.journalDigest === state.journalDigest)
374
+ return this.#resolution(previous, head);
375
+ if ((previous?.state.journalDigest ?? null) !== expectedJournalDigest)
376
+ conflict("pruning journal changed before commit");
377
+ assertPruningJournalTransition(previous?.state ?? null, state);
378
+ if (
379
+ previous?.state.plan.planDigest !== state.plan.planDigest &&
380
+ history.some(
381
+ (entry) => entry.state.plan.planDigest === state.plan.planDigest,
382
+ )
383
+ )
384
+ fail("pruning journal cannot restart a historical plan");
385
+ // #history reauthenticated the unfinished plan and EVERY existing effect
386
+ // at this exact current head in this commit call. The transition validator
387
+ // above requires an identical plan and immutable receipt prefix. Only the
388
+ // newly appended receipt needs additional authentication; finalize adds
389
+ // none. Nothing is cached across calls, and the same head still guards CAS.
390
+ const verifiedPrefix =
391
+ previous?.state.phase !== "finalized" &&
392
+ previous?.state.plan.planDigest === state.plan.planDigest
393
+ ? previous.state
394
+ : null;
395
+ await this.#authenticate(state, currentContext(head), verifiedPrefix);
396
+ const now = Number(this.#clock());
397
+ if (!Number.isFinite(now))
398
+ throw new TypeError("pruning journal clock is invalid");
399
+ const published = this.#put(WIKI_PRUNING_JOURNAL_ARTIFACT_TYPE, state, {
400
+ audience: this.descriptor.audience,
401
+ purpose: this.descriptor.purpose,
402
+ retention: "ledger",
403
+ });
404
+ if (
405
+ published?.receipt?.persisted !== true ||
406
+ published.receipt.readbackVerified !== true ||
407
+ published.receipt.integrityVerified !== true ||
408
+ published.receipt.retention !== "ledger"
409
+ )
410
+ fail("pruning journal artifact was not durably confirmed");
411
+ const eventId = `${WIKI_PRUNING_JOURNAL_EVENT_TYPE}.${state.journalDigest.slice(7)}`;
412
+ let appendError = null;
413
+ try {
414
+ const receipt = this.#append(
415
+ {
416
+ artifactTenantId: this.descriptor.artifactTenantId,
417
+ correlationId: this.descriptor.streamId,
418
+ decision: "committed",
419
+ eventId,
420
+ reason: `Wiki pruning ${state.phase} checkpoint ${state.revision}`,
421
+ skillName: null,
422
+ sourceRefs: previous ? [previous.event.subjectRef] : [],
423
+ subjectRef: published.ref,
424
+ tenantId: this.descriptor.tenantId,
425
+ timestamp: new Date(now).toISOString(),
426
+ type: WIKI_PRUNING_JOURNAL_EVENT_TYPE,
427
+ },
428
+ {
429
+ expectedHeadDigest: head.headDigest,
430
+ expectedSequence: head.sequence,
431
+ },
432
+ );
433
+ if (
434
+ receipt?.authenticated !== true ||
435
+ receipt.durable !== true ||
436
+ receipt.committed !== true ||
437
+ receipt.eventId !== eventId
438
+ )
439
+ fail("pruning journal append was not confirmed");
440
+ } catch (error) {
441
+ // Only authenticated readback may turn response loss into success.
442
+ appendError = error;
443
+ }
444
+ const restored = await this.#history();
445
+ const recovered = restored.history.at(-1);
446
+ if (recovered?.state.journalDigest !== state.journalDigest) {
447
+ if (appendError) throw appendError;
448
+ fail("pruning journal readback did not match commit");
449
+ }
450
+ return this.#resolution(recovered, restored.head);
451
+ }
452
+ }
453
+
454
+ export function captureWikiPruningJournalStore(value) {
455
+ const ports = STORES.get(value);
456
+ if (!ports)
457
+ throw new TypeError("a branded Wiki pruning journal store is required");
458
+ return ports;
459
+ }