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,576 @@
1
+ import { deriveWikiTargetTombstoneRevision } from "./wiki-target-tombstone-revision.js";
2
+ import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
3
+ import { captureWikiPruningJournalStore } from "./governed-wiki-pruning-ledger-adapter.js";
4
+ import { captureWikiPruningSkillRollback } from "./governed-wiki-pruning-skill-rollback.js";
5
+ import {
6
+ capturePruningData,
7
+ pruningCanonical,
8
+ pruningDigest,
9
+ pruningOperationCalls,
10
+ verifyPruningJournalPlan,
11
+ } from "./governed-wiki-pruning-journal.js";
12
+
13
+ export const WIKI_PRUNING_MAINTENANCE_RECEIPT_SCHEMA =
14
+ "chainlesschain.wiki-pruning-maintenance-receipt/v1";
15
+ export const WIKI_PRUNING_DEPENDENCY_RECEIPT_SCHEMA =
16
+ "chainlesschain.wiki-pruning-dependency-receipt/v1";
17
+ export const WIKI_PRUNING_ROLLBACK_DEPENDENCY_RECEIPT_SCHEMA =
18
+ "chainlesschain.wiki-pruning-dependency-receipt/v2";
19
+ const RULES = Object.freeze({
20
+ schema: "chainlesschain.wiki-pruning-maintenance-rules/v1",
21
+ reducer:
22
+ "evidence-backed-wiki-maintainer/v1+target-only-tombstone-projection/v1",
23
+ batchSize: 128,
24
+ evidenceSelection: "first-retained-ref-lexical",
25
+ emptyActions: "no-op",
26
+ nonTargetFacts: "preserve-verbatim",
27
+ minCorroboratingSources: 2,
28
+ decayHalfLifeDays: 30,
29
+ staleConfidenceFloor: 0.2,
30
+ });
31
+ const RULES_DIGEST = pruningDigest(RULES.schema, RULES);
32
+ const MODEL = "deterministic:governed-wiki-pruning/v1";
33
+ const DEPENDENCY_RULES = Object.freeze({
34
+ ...RULES,
35
+ schema: "chainlesschain.wiki-pruning-dependency-rules/v1",
36
+ disposition: "tombstone-only-without-skill-dependencies",
37
+ duplicatePatterns: "one-tombstone-per-pattern-lexical",
38
+ });
39
+ const DEPENDENCY_RULES_DIGEST = pruningDigest(
40
+ DEPENDENCY_RULES.schema,
41
+ DEPENDENCY_RULES,
42
+ );
43
+ const ROLLBACK_RULES = Object.freeze({
44
+ ...DEPENDENCY_RULES,
45
+ schema: "chainlesschain.wiki-pruning-dependency-rules/v2",
46
+ disposition: "verified-same-ledger-release-rollback-before-tombstone",
47
+ });
48
+ const ROLLBACK_RULES_DIGEST = pruningDigest(
49
+ ROLLBACK_RULES.schema,
50
+ ROLLBACK_RULES,
51
+ );
52
+ const HEAD_KEYS = [
53
+ "epoch",
54
+ "ledgerId",
55
+ "identityDigest",
56
+ "sequence",
57
+ "headDigest",
58
+ ];
59
+
60
+ function fail(message) {
61
+ const error = new Error(message);
62
+ error.code = "CC_WIKI_PRUNING_MAINTENANCE_INVALID";
63
+ throw error;
64
+ }
65
+ function same(left, right) {
66
+ return pruningCanonical(left) === pruningCanonical(right);
67
+ }
68
+ function matchHead(expected, actual) {
69
+ return (
70
+ expected &&
71
+ Object.keys(expected).length === HEAD_KEYS.length &&
72
+ HEAD_KEYS.every(
73
+ (key) => Object.hasOwn(expected, key) && expected[key] === actual[key],
74
+ )
75
+ );
76
+ }
77
+
78
+ // Owns Wiki-only dependency tombstones and the later maintenance operation.
79
+ // Skill rollback requires a branded real ReleaseRegistry provider: a Wiki
80
+ // tombstone is NOT proof of a release rollback. Key destruction and retrieval
81
+ // need their own independently verified providers. The Maintainer reducer has
82
+ // no Raw/shell/network/Skill-write access; release effects are delegated only
83
+ // through the separately authorized branded rollback provider.
84
+ export class GovernedWikiPruningMaintenance {
85
+ #reader;
86
+ #commit;
87
+ #maintainerDescriptor;
88
+ #rollback;
89
+
90
+ constructor({
91
+ descriptor,
92
+ wikiLedgerAdapter,
93
+ skillRollbackProvider = null,
94
+ } = {}) {
95
+ this.#reader = captureWikiRevisionReader(wikiLedgerAdapter);
96
+ if (
97
+ descriptor?.tenantId !== this.#reader.descriptor.tenantId ||
98
+ typeof descriptor.streamId !== "string" ||
99
+ !descriptor.streamId.trim() ||
100
+ descriptor.streamId.length > 256
101
+ )
102
+ throw new TypeError("Wiki pruning maintenance scope is invalid");
103
+ this.descriptor = Object.freeze({
104
+ tenantId: descriptor.tenantId,
105
+ streamId: descriptor.streamId,
106
+ evolutionRunId: this.#reader.descriptor.evolutionRunId,
107
+ rulesDigest: RULES_DIGEST,
108
+ });
109
+ // This is an own, frozen arrow function on a branded adapter, not a virtual
110
+ // subclass method or a caller-supplied acknowledgement function.
111
+ this.#commit = wikiLedgerAdapter.commitRevision;
112
+ this.#rollback =
113
+ skillRollbackProvider === null
114
+ ? null
115
+ : captureWikiPruningSkillRollback(
116
+ skillRollbackProvider,
117
+ descriptor.tenantId,
118
+ );
119
+ this.#maintainerDescriptor = Object.freeze({
120
+ tenantId: this.descriptor.tenantId,
121
+ evolutionRunId: this.descriptor.evolutionRunId,
122
+ maintainerModel: MODEL,
123
+ rulesDigest: RULES_DIGEST,
124
+ minCorroboratingSources: RULES.minCorroboratingSources,
125
+ decayHalfLifeDays: RULES.decayHalfLifeDays,
126
+ staleConfidenceFloor: RULES.staleConfidenceFloor,
127
+ });
128
+ Object.freeze(this);
129
+ }
130
+
131
+ #plan(input) {
132
+ return verifyPruningJournalPlan(input, this.descriptor.tenantId);
133
+ }
134
+ #dependencyParts(plan) {
135
+ const targets = new Set();
136
+ const evidenceRefs = new Set(
137
+ plan.deletions.map((item) => item.evidenceRef),
138
+ );
139
+ for (const disposition of plan.dependencyDispositions) {
140
+ if (
141
+ !disposition ||
142
+ typeof disposition !== "object" ||
143
+ Array.isArray(disposition) ||
144
+ Object.keys(disposition).length !== 4 ||
145
+ !["tombstone", "rollback"].includes(disposition.action) ||
146
+ !Array.isArray(disposition.skillNames) ||
147
+ (disposition.action === "tombstone"
148
+ ? disposition.skillNames.length !== 0
149
+ : !this.#rollback || disposition.skillNames.length === 0) ||
150
+ typeof disposition.patternId !== "string" ||
151
+ !disposition.patternId.trim() ||
152
+ !evidenceRefs.has(disposition.evidenceRef)
153
+ )
154
+ fail(
155
+ "Wiki-only dependency disposition cannot authorize Skill rollback or unbound tombstones",
156
+ );
157
+ targets.add(disposition.patternId);
158
+ }
159
+ const operations = [...targets].sort().map((patternId) => ({
160
+ type: "tombstone",
161
+ patternId,
162
+ reason: "privacy-deletion-dependency",
163
+ }));
164
+ const rollback = plan.dependencyDispositions.some(
165
+ (item) => item.action === "rollback",
166
+ );
167
+ return this.#batches(operations, pruningOperationCalls(plan)[0], true).map(
168
+ (part) => ({ ...part, rollback }),
169
+ );
170
+ }
171
+ #batches(operations, call, dependency = false) {
172
+ const count = Math.ceil(operations.length / RULES.batchSize);
173
+ return Array.from({ length: count }, (_, index) => {
174
+ const batch = operations.slice(
175
+ index * RULES.batchSize,
176
+ (index + 1) * RULES.batchSize,
177
+ );
178
+ return {
179
+ dependency,
180
+ operations: batch,
181
+ requestDigest:
182
+ count === 1
183
+ ? call.requestDigest
184
+ : pruningDigest(
185
+ dependency
186
+ ? "chainlesschain.wiki-pruning-dependency-batch/v1"
187
+ : "chainlesschain.wiki-pruning-batch/v1",
188
+ {
189
+ requestDigest: call.requestDigest,
190
+ index,
191
+ count,
192
+ operations: batch,
193
+ },
194
+ ),
195
+ };
196
+ });
197
+ }
198
+ #parts(plan) {
199
+ for (const action of plan.patternActions) {
200
+ if (
201
+ !action ||
202
+ typeof action !== "object" ||
203
+ Array.isArray(action) ||
204
+ Object.keys(action).length !== 3 ||
205
+ action.type !== "tombstone" ||
206
+ typeof action.patternId !== "string" ||
207
+ typeof action.reason !== "string" ||
208
+ !action.reason.trim()
209
+ )
210
+ fail(
211
+ "Wiki pruning maintenance permits only exact planned tombstone operations",
212
+ );
213
+ }
214
+ return [
215
+ ...this.#dependencyParts(plan),
216
+ ...this.#batches(plan.patternActions, pruningOperationCalls(plan)[1]),
217
+ ];
218
+ }
219
+ authorityPorts() {
220
+ return Object.freeze({
221
+ requestDigests: ({ plan }) =>
222
+ this.#parts(this.#plan(plan)).map((part) => part.requestDigest),
223
+ verifySuccessors: ({ plan, history, context }) =>
224
+ this.#verifySuccessors(this.#plan(plan), history, context),
225
+ });
226
+ }
227
+ operationReceiptVerifier() {
228
+ return Object.freeze({
229
+ verify: (input) => this.#verifyReceipt(input),
230
+ verifyMany: (inputs) => this.#verifyReceipts(inputs),
231
+ });
232
+ }
233
+
234
+ async #derive(plan, source, part) {
235
+ return deriveWikiTargetTombstoneRevision({
236
+ source,
237
+ operations: part.operations,
238
+ effectiveAt: plan.effectiveAt,
239
+ requestDigest: part.requestDigest,
240
+ descriptor: part.dependency
241
+ ? {
242
+ ...this.#maintainerDescriptor,
243
+ maintainerModel: part.rollback
244
+ ? "deterministic:governed-wiki-pruning-dependency/v2"
245
+ : "deterministic:governed-wiki-pruning-dependency/v1",
246
+ rulesDigest: part.rollback
247
+ ? ROLLBACK_RULES_DIGEST
248
+ : DEPENDENCY_RULES_DIGEST,
249
+ }
250
+ : this.#maintainerDescriptor,
251
+ });
252
+ }
253
+
254
+ #rollbackInput(plan, history, context) {
255
+ const captured = context ?? {
256
+ mode: "current",
257
+ checkpoint: Object.fromEntries(
258
+ HEAD_KEYS.map((key) => [key, history.ledgerHead[key]]),
259
+ ),
260
+ };
261
+ return {
262
+ plan,
263
+ source: history.source,
264
+ context: captured,
265
+ requireCurrent: captured.mode === "current",
266
+ };
267
+ }
268
+ #hasRollback(plan) {
269
+ return plan.dependencyDispositions.some(
270
+ (item) => item.action === "rollback",
271
+ );
272
+ }
273
+ async #verifySuccessors(plan, history, context) {
274
+ return (await this.#replay(plan, history, context)).valid;
275
+ }
276
+ async #replay(plan, history, context) {
277
+ const parts = this.#parts(plan);
278
+ let rollbacks = null;
279
+ if (
280
+ history?.authenticated !== true ||
281
+ history.tenantId !== plan.tenantId ||
282
+ history.evolutionRunId !== this.descriptor.evolutionRunId ||
283
+ history.source?.stateDigest !== plan.wikiStateDigest ||
284
+ !Array.isArray(history.successors) ||
285
+ history.successors.length > parts.length
286
+ )
287
+ return { valid: false, rollbacks };
288
+ if (history.successors.length > 0 && this.#hasRollback(plan)) {
289
+ // Prove rollback BEFORE the first dependent Wiki revision, not merely
290
+ // before today's read or a later journal checkpoint. Current executions
291
+ // separately retain the actual active-pointer readback requirement.
292
+ rollbacks = this.#rollback.verify({
293
+ ...this.#rollbackInput(plan, history, context),
294
+ context: {
295
+ mode: "checkpoint",
296
+ checkpoint: history.successors[0].predecessorHead,
297
+ },
298
+ });
299
+ if (rollbacks === null) return { valid: false, rollbacks };
300
+ }
301
+ let source = history.source;
302
+ for (const [index, entry] of history.successors.entries()) {
303
+ const expected = await this.#derive(plan, source, parts[index]);
304
+ if (!same(expected, entry.revision)) return { valid: false, rollbacks };
305
+ source = {
306
+ trusted: true,
307
+ state: expected.state,
308
+ stateDigest: expected.stateDigest,
309
+ };
310
+ }
311
+ return {
312
+ valid:
313
+ history.current?.stateDigest === source.stateDigest &&
314
+ same(history.current.state, source.state),
315
+ rollbacks,
316
+ };
317
+ }
318
+
319
+ #history(plan, context = null) {
320
+ const query = {
321
+ tenantId: plan.tenantId,
322
+ stateDigest: plan.wikiStateDigest,
323
+ allowedMaintenanceRequestDigests: this.#parts(plan).map(
324
+ (part) => part.requestDigest,
325
+ ),
326
+ };
327
+ if (context === null) return this.#reader.resolveHistory(query);
328
+ const captured = capturePruningData(context);
329
+ if (
330
+ Object.keys(captured).length !== 2 ||
331
+ !Object.hasOwn(captured, "mode") ||
332
+ !Object.hasOwn(captured, "checkpoint")
333
+ )
334
+ fail("Wiki pruning receipt authorization context is invalid");
335
+ if (captured.mode === "checkpoint")
336
+ return this.#reader.resolveAtCheckpoint({
337
+ ...query,
338
+ checkpoint: captured.checkpoint,
339
+ });
340
+ if (captured.mode !== "current")
341
+ fail("Wiki pruning receipt requires current or checkpoint authorization");
342
+ const history = this.#reader.resolveHistory(query);
343
+ if (!matchHead(captured.checkpoint, history.ledgerHead))
344
+ fail("Wiki pruning receipt ledger head differs from authorization");
345
+ return history;
346
+ }
347
+
348
+ #receipt(plan, history, operationIndex, rollbacks = null) {
349
+ const dependencyCount = this.#dependencyParts(plan).length;
350
+ const start = operationIndex === 0 ? 0 : dependencyCount;
351
+ const end =
352
+ operationIndex === 0 ? dependencyCount : this.#parts(plan).length;
353
+ const sourceStateDigest =
354
+ start === 0
355
+ ? plan.wikiStateDigest
356
+ : history.successors[start - 1].revision.stateDigest;
357
+ const resultStateDigest =
358
+ end === 0
359
+ ? plan.wikiStateDigest
360
+ : history.successors[end - 1].revision.stateDigest;
361
+ const schema =
362
+ operationIndex === 0
363
+ ? this.#hasRollback(plan)
364
+ ? WIKI_PRUNING_ROLLBACK_DEPENDENCY_RECEIPT_SCHEMA
365
+ : WIKI_PRUNING_DEPENDENCY_RECEIPT_SCHEMA
366
+ : WIKI_PRUNING_MAINTENANCE_RECEIPT_SCHEMA;
367
+ const core = {
368
+ schema,
369
+ authenticated: true,
370
+ durable: true,
371
+ tenantId: plan.tenantId,
372
+ streamId: this.descriptor.streamId,
373
+ requestDigest: pruningOperationCalls(plan)[operationIndex].requestDigest,
374
+ planDigest: plan.planDigest,
375
+ rulesDigest:
376
+ operationIndex === 0
377
+ ? this.#hasRollback(plan)
378
+ ? ROLLBACK_RULES_DIGEST
379
+ : DEPENDENCY_RULES_DIGEST
380
+ : RULES_DIGEST,
381
+ sourceStateDigest,
382
+ resultStateDigest,
383
+ mode: start === end ? "noop" : "revisions",
384
+ ledger: Object.fromEntries(
385
+ ["epoch", "ledgerId", "identityDigest"].map((key) => [
386
+ key,
387
+ history.ledgerHead[key],
388
+ ]),
389
+ ),
390
+ revisions: history.successors
391
+ .slice(start, end)
392
+ .map(({ revision, eventDigest, artifactRef }) => ({
393
+ requestDigest: revision.maintenanceRequestDigest,
394
+ revisionId: revision.revisionId,
395
+ stateDigest: revision.stateDigest,
396
+ eventDigest,
397
+ artifactRef,
398
+ })),
399
+ };
400
+ if (operationIndex === 0 && this.#hasRollback(plan)) {
401
+ core.rollbacks = rollbacks;
402
+ if (core.rollbacks === null)
403
+ fail("dependency receipt has no committed release rollback");
404
+ }
405
+ return capturePruningData({
406
+ ...core,
407
+ receiptDigest: pruningDigest(schema, core),
408
+ });
409
+ }
410
+
411
+ #verifyReceipt(input) {
412
+ return this.#verifyReceipts([input]);
413
+ }
414
+
415
+ async #verifyReceipts(values) {
416
+ const inputs = capturePruningData(values);
417
+ if (!Array.isArray(inputs) || inputs.length < 1 || inputs.length > 2)
418
+ fail("Wiki receipt batch must contain one or two operations");
419
+ const { plan: input, tenantId, streamId, context } = inputs[0];
420
+ if (
421
+ tenantId !== this.descriptor.tenantId ||
422
+ streamId !== this.descriptor.streamId
423
+ )
424
+ return false;
425
+ const plan = this.#plan(input);
426
+ const history = this.#history(plan, context);
427
+ const replay = await this.#replay(plan, history, context);
428
+ const seen = new Set();
429
+ for (const value of inputs) {
430
+ if (
431
+ value.tenantId !== tenantId ||
432
+ value.streamId !== streamId ||
433
+ !same(value.plan, plan) ||
434
+ !same(value.context ?? null, context ?? null)
435
+ )
436
+ return false;
437
+ const call = {
438
+ request: value.request,
439
+ requestDigest: value.requestDigest,
440
+ };
441
+ const operationIndex =
442
+ call.request.operation === "dependency-dispositions" ? 0 : 1;
443
+ if (
444
+ seen.has(operationIndex) ||
445
+ !same(call, pruningOperationCalls(plan)[operationIndex])
446
+ )
447
+ return false;
448
+ seen.add(operationIndex);
449
+ if (
450
+ (operationIndex === 0
451
+ ? history.successors.length < this.#dependencyParts(plan).length
452
+ : history.successors.length !== this.#parts(plan).length) ||
453
+ !replay.valid ||
454
+ !same(
455
+ value.receipt,
456
+ this.#receipt(plan, history, operationIndex, replay.rollbacks),
457
+ )
458
+ )
459
+ return false;
460
+ }
461
+ // One authenticated history/replay proves both exact receipts, with no
462
+ // proof or authority cached for another read/checkpoint.
463
+ return true;
464
+ }
465
+
466
+ createProvider(journalStore) {
467
+ const journal = captureWikiPruningJournalStore(journalStore);
468
+ if (
469
+ journal.descriptor.tenantId !== this.descriptor.tenantId ||
470
+ journal.descriptor.streamId !== this.descriptor.streamId
471
+ )
472
+ throw new TypeError("Wiki pruning provider journal scope is invalid");
473
+ return Object.freeze({
474
+ applyDependencyDispositions: (call) => this.#apply(journal, call, 0),
475
+ applyWikiRevision: (call) => this.#apply(journal, call, 1),
476
+ });
477
+ }
478
+
479
+ async #apply(journal, input, operationIndex) {
480
+ const call = capturePruningData(input);
481
+ for (
482
+ let attempt = 0;
483
+ attempt <= (this.#rollback ? 4096 : 0) + 4096 / RULES.batchSize;
484
+ attempt++
485
+ ) {
486
+ const resolution = await journal.load({
487
+ tenantId: this.descriptor.tenantId,
488
+ });
489
+ const state = resolution.state;
490
+ if (!state)
491
+ fail("Wiki pruning must be durably prepared before applying effects");
492
+ const plan = this.#plan(state.plan);
493
+ if (!same(call, pruningOperationCalls(plan)[operationIndex]))
494
+ fail("Wiki pruning call differs from the current journal plan");
495
+ if (state.operationReceipts.length > operationIndex) {
496
+ const receipt = state.operationReceipts[operationIndex];
497
+ if (
498
+ !(await this.#verifyReceipt({
499
+ ...call,
500
+ plan,
501
+ receipt,
502
+ tenantId: this.descriptor.tenantId,
503
+ streamId: this.descriptor.streamId,
504
+ context: { mode: "checkpoint", checkpoint: resolution.checkpoint },
505
+ }))
506
+ )
507
+ fail(
508
+ "Wiki pruning journal contains a substituted maintenance receipt",
509
+ );
510
+ return receipt;
511
+ }
512
+ if (
513
+ state.phase !== (operationIndex === 0 ? "prepared" : "running") ||
514
+ state.operationReceipts.length !== operationIndex
515
+ )
516
+ fail("Wiki pruning dependency disposition must be acknowledged first");
517
+ const history = this.#history(plan);
518
+ if (!matchHead(resolution.ledgerHead, history.ledgerHead))
519
+ fail("Wiki pruning authorization changed before the effect");
520
+ const replay = await this.#replay(plan, history);
521
+ if (!replay.valid)
522
+ fail("Wiki pruning committed effects differ from deterministic replay");
523
+ if (
524
+ operationIndex === 0 &&
525
+ this.#hasRollback(plan) &&
526
+ history.successors.length === 0
527
+ ) {
528
+ const result = await this.#rollback.apply(
529
+ this.#rollbackInput(plan, history),
530
+ async () => {
531
+ const latest = await journal.load({
532
+ tenantId: this.descriptor.tenantId,
533
+ });
534
+ if (
535
+ latest.state?.plan.planDigest !== plan.planDigest ||
536
+ latest.state.phase !== "prepared" ||
537
+ latest.state.operationReceipts.length !== 0
538
+ )
539
+ fail(
540
+ "pruning journal changed while authorizing release rollback",
541
+ );
542
+ const fresh = this.#history(plan);
543
+ if (!matchHead(latest.ledgerHead, fresh.ledgerHead))
544
+ fail("pruning rollback authorization head changed");
545
+ return this.#rollbackInput(plan, fresh);
546
+ },
547
+ );
548
+ if (result.changed) continue;
549
+ }
550
+ const parts = this.#parts(plan);
551
+ const end =
552
+ operationIndex === 0
553
+ ? this.#dependencyParts(plan).length
554
+ : parts.length;
555
+ if (history.successors.length > end)
556
+ fail(
557
+ "Wiki pruning effects advanced beyond the journal dependency frontier",
558
+ );
559
+ if (history.successors.length === end)
560
+ return this.#receipt(plan, history, operationIndex, replay.rollbacks);
561
+ const next = await this.#derive(
562
+ plan,
563
+ history.current,
564
+ parts[history.successors.length],
565
+ );
566
+ // Reconcile after a lost acknowledgement by reopening this same request;
567
+ // never acknowledge a write merely because an append might have happened.
568
+ this.#commit({
569
+ expectedStateDigest: history.current.stateDigest,
570
+ expectedLedgerHead: resolution.ledgerHead,
571
+ revision: next,
572
+ });
573
+ }
574
+ fail("Wiki pruning maintenance exceeded its bounded batch progress");
575
+ }
576
+ }