chainlesschain 0.166.22 → 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 (291) hide show
  1. package/package.json +4 -3
  2. package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-DR-MWcZc.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DT8B7sEb.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-asjh3dQJ.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-DivQ491i.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-DPH2uUmy.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-Bp2nLyc-.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-CHS28khl.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-CKeaFSfz.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-CxwM9BAH.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-DYLDwaCv.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ds3pA-ET.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-uYTWOB8j.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-CvYa_dwT.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-CanMAX4m.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-B4WaDtHw.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-K93Uof_3.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-CKeDLgUW.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-P93grAeB.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-BSHnMtDn.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-epAOpUVJ.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-ByjXfP7t.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-QztTU8tb.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-DhUc9yhN.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-C2sLhJJN.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-CcF_R7NW.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-Cm_X2IBk.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-4Sq5FjBt.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-Dx2_v4V6.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-7Vr1xekR.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-B66QPVf-.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-DqTx7_u1.js → MarkdownRenderer-PLsEvhly.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-BMIK9BmC.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BDbyp3J_.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-CJdzfZGi.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-C2TH5Y3-.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-D1dYXkvV.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-B-4A1I1j.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-Bgcc9UOl.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-DqOe-etP.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-7VnhzE_6.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-BxawpeUQ.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-Cr08G2aE.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-Ce8bEGlK.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-BC7lveGv.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-CakOW-G0.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-Cf8CaOBZ.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-DGJyMEfS.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-DNIwSdwu.js} +6 -6
  54. package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-5B1S12wa.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-CMB6Ke5t.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-D5PqTFiT.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-CbKNdSjV.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-CJF5_-Gs.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CT6iEAdi.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-Ci0h9mJ_.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-Da5mobZu.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-BaCY8eey.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-CaITfTsI.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DtUDamyP.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-DX27gFpg.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-DFL69osN.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-BqGeoWv-.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-3z1WnEAc.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-C_OJQQ9Z.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-BY7aT6Mo.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BZv7DSaD.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-B6D7STlI.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Co_FCZAO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CnY-9fgz.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-B71yXfZ8.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-Dd_P7awo.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CvIEMyli.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-DknFBGOi.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-D_4nJONB.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-BNl21fa7.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-CFrCI7uK.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-BVfY6JLg.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-Cj9CAK0J.js} +3 -3
  86. package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-DcqZlzA3.js} +3 -3
  87. package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-Dfr_dMld.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-Yv6UF0AD.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-CDW_-1fs.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-BYOQvd-6.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BCGO0BiP.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-DY-70cfQ.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-366wfQBU.js} +1 -1
  95. package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
  96. package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-B9ZogJJM.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-B9m5QAMg.js} +1 -1
  98. package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-BBs2mv5M.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DiT_REby.js → index-BFv1hzF6.js} +1 -1
  100. package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
  101. package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-BXlEx4UH.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-BayRTE5w.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-Bb9nyts1.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-Bf_Va0S-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Br3wQLVY.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-BvK4fjkk.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-C40UdtlS.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DrOalGut.js → index-C4UJA2ju.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-CB_Iw73G.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CCwWp3mT.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-CFa2fPCk.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-CIyHxV4u.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-CUP-A2_h.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CUo27q9J.js} +3 -3
  115. package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-CaT8trvf.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-CnZNbcux.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-Cy2NE6AO.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CzeEEazr.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-D--TEyDj.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DCtsjhhT.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DLOf7BSz.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-DM5c4pc-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-DRFC2Qt0.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-DT_qVaaV.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-DUDoRk9r.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-Dg-AQYDf.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DuIPq5MX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-NYVBUAVN.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-NaCESahy.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-RjIMPG0u.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-Y9akzgFO.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-hZ0Eyrrw.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-CG99CcR4.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-Z7MH0_0G.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-BX67lOdq.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CmAbG1fE.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-DiU5tI1_.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BGfvLrYL.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-CggLEgaJ.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-t3nlghPZ.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-BkV4dL9s.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-qec1PUoC.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-ChjX6T8D.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-C3X53s4E.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Ie0TEVFT.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-CRUMVS8l.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +3 -3
  151. package/src/commands/agent.js +18 -1
  152. package/src/commands/evolution-benchmark.js +72 -0
  153. package/src/commands/evolution.js +2 -0
  154. package/src/commands/governed-skill-marketplace.js +142 -0
  155. package/src/commands/marketplace.js +4 -1
  156. package/src/commands/serve.js +10 -0
  157. package/src/commands/skill.js +3 -0
  158. package/src/data/changelog.json +26 -0
  159. package/src/gateways/ws/ws-agent-handler.js +59 -2
  160. package/src/gateways/ws/ws-server.js +2 -0
  161. package/src/harness/golden-transcript.js +1 -0
  162. package/src/harness/prompt-compressor.js +51 -5
  163. package/src/harness/provider-backed-compaction.js +28 -1
  164. package/src/harness/remote-session-registry.js +15 -3
  165. package/src/index.js +20 -2
  166. package/src/lazy-dispatch.js +6 -0
  167. package/src/lib/advisor-runtime.js +55 -2
  168. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  169. package/src/lib/app-server/graph-runtime.js +32 -0
  170. package/src/lib/app-server/server.js +45 -1
  171. package/src/lib/app-server/websocket-transport.js +2 -0
  172. package/src/lib/autonomous-agent.js +63 -13
  173. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  174. package/src/lib/cowork/debate-review-cli.js +4 -3
  175. package/src/lib/cowork/decision-kb-cli.js +5 -0
  176. package/src/lib/cowork-adapter.js +38 -16
  177. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  178. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  179. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  180. package/src/lib/evolution/agent-model-projection.js +217 -0
  181. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  182. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  183. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  184. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
  185. package/src/lib/evolution/evidence-json-text.js +236 -0
  186. package/src/lib/evolution/evolution-artifact-ports.js +193 -21
  187. package/src/lib/evolution/evolution-deployment-loader.js +163 -2
  188. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  189. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  190. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  191. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  192. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  193. package/src/lib/evolution/evolution-evidence-projector.js +240 -37
  194. package/src/lib/evolution/evolution-file-witness.js +153 -30
  195. package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
  196. package/src/lib/evolution/evolution-ledger.js +66 -2
  197. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  198. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  199. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  200. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  201. package/src/lib/evolution/evolution-release-train.js +54 -6
  202. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  203. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  204. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  205. package/src/lib/evolution/evolution-workbench-projection.js +134 -26
  206. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  207. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  208. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  209. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  210. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  211. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  212. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  213. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -0
  214. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  215. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  216. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
  217. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  218. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  219. package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
  220. package/src/lib/evolution/governed-knowledge-sync.js +17 -94
  221. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
  222. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  223. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  224. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  225. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  226. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  227. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  228. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  229. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  230. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  231. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  232. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  233. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  234. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  235. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  236. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  237. package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
  238. package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
  239. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  240. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  241. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  242. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  243. package/src/lib/evolution/skill-candidate-registry.js +22 -0
  244. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  245. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  246. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  247. package/src/lib/evolution/skill-release-registry.js +25 -4
  248. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  249. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  250. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  251. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  252. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  253. package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
  254. package/src/lib/evolution/statistical-progressive-canary.js +165 -3
  255. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  256. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  257. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  258. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  259. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
  260. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  261. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  262. package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
  263. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  264. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  265. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  266. package/src/lib/evolution/wikiskill-benchmark.js +80 -16
  267. package/src/lib/goal-assess.js +17 -10
  268. package/src/lib/interactive-planner.js +9 -1
  269. package/src/lib/iteration-budget.js +16 -2
  270. package/src/lib/micro-compact.js +4 -1
  271. package/src/lib/model-failure-policy.js +21 -0
  272. package/src/lib/process-execution-broker/index.js +1 -0
  273. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  274. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  275. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  276. package/src/lib/read-file-page.js +191 -0
  277. package/src/lib/runnable-provider.js +2 -1
  278. package/src/lib/skill-retrieval-router.js +22 -1
  279. package/src/repl/agent-repl.js +127 -33
  280. package/src/runtime/agent-core.js +163 -73
  281. package/src/runtime/agent-runtime.js +43 -0
  282. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  283. package/src/runtime/fallback-model.js +143 -62
  284. package/src/runtime/headless-runner.js +54 -10
  285. package/src/runtime/headless-stream.js +50 -6
  286. package/src/runtime/runtime-factory.js +41 -2
  287. package/src/assets/web-panel/assets/Projects-CvtU5peJ.js +0 -1
  288. package/src/assets/web-panel/assets/SpeechSettings-BudpA5kr.js +0 -1
  289. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
  290. package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
  291. package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
@@ -0,0 +1,587 @@
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 { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
11
+ import { captureWikiPruningJournalStore } from "./governed-wiki-pruning-ledger-adapter.js";
12
+ import { GovernedWikiPruningMaintenance } from "./governed-wiki-pruning-maintenance.js";
13
+ import { digestWikiState } from "./evidence-backed-wiki-maintainer.js";
14
+ import {
15
+ capturePruningData as snapshot,
16
+ pruningCanonical as canonical,
17
+ pruningDigest,
18
+ pruningOperationCalls,
19
+ verifyPruningJournalPlan,
20
+ WIKI_PRUNING_JOURNAL_MAX_BYTES,
21
+ } from "./governed-wiki-pruning-journal.js";
22
+
23
+ export const WIKI_PRUNING_RETRIEVAL_ARTIFACT_TYPE =
24
+ "wiki-pruning-retrieval-projection";
25
+ export const WIKI_PRUNING_RETRIEVAL_EVENT_TYPE =
26
+ "wiki.pruning.retrieval-projection-committed";
27
+ export const WIKI_PRUNING_RETRIEVAL_SCHEMA =
28
+ "chainlesschain.wiki-pruning-retrieval-projection/v1";
29
+ export const WIKI_PRUNING_RETRIEVAL_RECEIPT_SCHEMA =
30
+ "chainlesschain.wiki-pruning-retrieval-receipt/v1";
31
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
32
+ const HEAD_KEYS = [
33
+ "epoch",
34
+ "ledgerId",
35
+ "identityDigest",
36
+ "sequence",
37
+ "headDigest",
38
+ ];
39
+ const RECORD_KEYS = [
40
+ "schema",
41
+ "tenantId",
42
+ "streamId",
43
+ "evolutionRunId",
44
+ "revision",
45
+ "previousProjectionDigest",
46
+ "call",
47
+ "wikiStateDigest",
48
+ "wikiRevision",
49
+ "authorizationHead",
50
+ "index",
51
+ "projectionDigest",
52
+ ];
53
+ const same = (left, right) => canonical(left) === canonical(right);
54
+ const headOf = (value) =>
55
+ Object.fromEntries(HEAD_KEYS.map((key) => [key, value[key]]));
56
+ function fail(message) {
57
+ const error = new Error(message);
58
+ error.code = "CC_WIKI_PRUNING_RETRIEVAL_INVALID";
59
+ throw error;
60
+ }
61
+ function capture(owner, name) {
62
+ const method = owner?.[name];
63
+ if (typeof method !== "function")
64
+ throw new TypeError(`${name} port is required`);
65
+ return (...args) => Reflect.apply(method, owner, args);
66
+ }
67
+ function exact(value, keys) {
68
+ return (
69
+ value &&
70
+ !Array.isArray(value) &&
71
+ Object.keys(value).length === keys.length &&
72
+ keys.every((key) => Object.hasOwn(value, key))
73
+ );
74
+ }
75
+
76
+ // A real materialized Wiki index, not the Skill-content revocation index. Only
77
+ // the current authenticated journal authorizes publication. Receipts can be
78
+ // checked historically; the proposer can read only the finalized CURRENT view.
79
+ export class GovernedWikiPruningRetrieval {
80
+ #wiki;
81
+ #maintenance;
82
+ #put;
83
+ #read;
84
+ #verifyLedger;
85
+ #append;
86
+ #resolve;
87
+ #clock;
88
+
89
+ constructor({
90
+ descriptor,
91
+ wikiLedgerAdapter,
92
+ skillRollbackProvider = null,
93
+ artifactPorts,
94
+ ledger,
95
+ ledgerArtifactResolver,
96
+ clock = Date.now,
97
+ } = {}) {
98
+ const input = snapshot(descriptor);
99
+ const normalized = {};
100
+ for (const key of [
101
+ "tenantId",
102
+ "artifactTenantId",
103
+ "streamId",
104
+ "audience",
105
+ "purpose",
106
+ ]) {
107
+ if (
108
+ typeof input[key] !== "string" ||
109
+ !input[key].trim() ||
110
+ input[key].length > 256
111
+ )
112
+ throw new TypeError(`retrieval ${key} is invalid`);
113
+ normalized[key] = input[key];
114
+ }
115
+ if (normalized.purpose !== "evolution-ledger")
116
+ throw new TypeError("Wiki retrieval requires evolution-ledger purpose");
117
+ this.#wiki = captureWikiRevisionReader(wikiLedgerAdapter);
118
+ if (normalized.tenantId !== this.#wiki.descriptor.tenantId)
119
+ throw new TypeError("Wiki retrieval tenant mismatch");
120
+ this.descriptor = Object.freeze({
121
+ ...normalized,
122
+ evolutionRunId: this.#wiki.descriptor.evolutionRunId,
123
+ });
124
+ // Fixed product reducer, never a caller-supplied success flag.
125
+ this.#maintenance = new GovernedWikiPruningMaintenance({
126
+ descriptor: normalized,
127
+ wikiLedgerAdapter,
128
+ skillRollbackProvider,
129
+ }).authorityPorts();
130
+ if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver))
131
+ throw new TypeError("a branded artifact resolver is required");
132
+ this.#resolve = ledgerArtifactResolver;
133
+ this.#put = capture(artifactPorts, "putCanonical");
134
+ this.#read = capture(ledger, "read");
135
+ this.#verifyLedger = capture(ledger, "verify");
136
+ this.#append = capture(ledger, "appendDomainEvent");
137
+ if (typeof clock !== "function") throw new TypeError("clock is required");
138
+ this.#clock = clock;
139
+ Object.freeze(this);
140
+ }
141
+
142
+ #record(value) {
143
+ const record = snapshot(value);
144
+ if (
145
+ !exact(record, RECORD_KEYS) ||
146
+ record.schema !== WIKI_PRUNING_RETRIEVAL_SCHEMA ||
147
+ record.tenantId !== this.descriptor.tenantId ||
148
+ record.streamId !== this.descriptor.streamId ||
149
+ record.evolutionRunId !== this.descriptor.evolutionRunId ||
150
+ !Number.isSafeInteger(record.revision) ||
151
+ record.revision < 1 ||
152
+ (record.previousProjectionDigest !== null &&
153
+ !DIGEST.test(record.previousProjectionDigest)) ||
154
+ !DIGEST.test(record.wikiStateDigest) ||
155
+ (record.wikiRevision !== null &&
156
+ !/^wiki:[a-f0-9]{64}$/u.test(record.wikiRevision)) ||
157
+ !Array.isArray(record.index) ||
158
+ !exact(record.call, ["request", "requestDigest"]) ||
159
+ !DIGEST.test(record.call.requestDigest) ||
160
+ record.call.request?.operation !== "retrieval-projection" ||
161
+ record.call.request.tenantId !== this.descriptor.tenantId ||
162
+ !exact(record.authorizationHead, HEAD_KEYS)
163
+ )
164
+ fail("Wiki retrieval projection is invalid");
165
+ const { projectionDigest, ...core } = record;
166
+ if (projectionDigest !== pruningDigest(WIKI_PRUNING_RETRIEVAL_SCHEMA, core))
167
+ fail("Wiki retrieval projection digest mismatch");
168
+ return record;
169
+ }
170
+
171
+ #checkpoint(head, events, checkpoint) {
172
+ if (
173
+ !exact(checkpoint, HEAD_KEYS) ||
174
+ !Number.isSafeInteger(checkpoint.sequence) ||
175
+ checkpoint.sequence < 0 ||
176
+ checkpoint.sequence > events.length ||
177
+ HEAD_KEYS.slice(0, 3).some((key) => checkpoint[key] !== head[key]) ||
178
+ checkpoint.headDigest !==
179
+ (events[checkpoint.sequence - 1]?.eventDigest ?? null)
180
+ )
181
+ fail("Wiki retrieval checkpoint is not in this authenticated ledger");
182
+ return checkpoint.sequence;
183
+ }
184
+
185
+ #history(requestDigest = null, context = null) {
186
+ const events = this.#read({ limit: EVOLUTION_LEDGER_MAX_EVENTS });
187
+ if (!Array.isArray(events))
188
+ fail("Wiki retrieval ledger did not return events");
189
+ // read() authenticates the complete snapshot. Use its identity for each
190
+ // immutable artifact, then authenticate the current head again at the end.
191
+ // This is not an authorization cache and never skips artifact validation.
192
+ const tail = events.at(-1);
193
+ const head = tail
194
+ ? { ...headOf(tail), headDigest: tail.eventDigest }
195
+ : headOf(this.#verifyLedger());
196
+ if (
197
+ !Array.isArray(events) ||
198
+ events.length !== head.sequence ||
199
+ (events.at(-1)?.eventDigest ?? null) !== head.headDigest ||
200
+ events.some(
201
+ (event, index) =>
202
+ event.sequence !== index + 1 ||
203
+ HEAD_KEYS.slice(0, 3).some((key) => event[key] !== head[key]),
204
+ )
205
+ )
206
+ fail("Wiki retrieval ledger is incomplete or changed");
207
+ let boundary = head.sequence;
208
+ if (context !== null) {
209
+ const captured = snapshot(context);
210
+ if (
211
+ !exact(captured, ["mode", "checkpoint"]) ||
212
+ !["current", "checkpoint"].includes(captured.mode)
213
+ )
214
+ fail("Wiki retrieval context is invalid");
215
+ boundary = this.#checkpoint(head, events, captured.checkpoint);
216
+ if (captured.mode === "current" && !same(captured.checkpoint, head))
217
+ fail("Wiki retrieval current authorization head changed");
218
+ }
219
+ let latest = null;
220
+ let target = null;
221
+ const requests = new Set();
222
+ for (const event of events) {
223
+ if (
224
+ event.schema !== EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA ||
225
+ event.type !== WIKI_PRUNING_RETRIEVAL_EVENT_TYPE ||
226
+ event.tenantId !== this.descriptor.tenantId ||
227
+ event.correlationId !== this.descriptor.streamId
228
+ )
229
+ continue;
230
+ if (
231
+ event.artifactTenantId !== this.descriptor.artifactTenantId ||
232
+ event.decision !== "committed" ||
233
+ event.skillName !== null ||
234
+ !same(event.sourceRefs, latest ? [latest.event.subjectRef] : [])
235
+ )
236
+ fail("Wiki retrieval event lineage is invalid");
237
+ const resolution = this.#resolve({
238
+ epoch: head.epoch,
239
+ ledgerId: head.ledgerId,
240
+ tenantId: this.descriptor.artifactTenantId,
241
+ ref: event.subjectRef,
242
+ });
243
+ if (
244
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
245
+ resolution.authenticated !== true ||
246
+ resolution.found !== true ||
247
+ resolution.ref !== event.subjectRef.ref ||
248
+ resolution.digest !== event.subjectRef.digest ||
249
+ !DIGEST.test(resolution.receiptDigest) ||
250
+ !Buffer.isBuffer(resolution.bytes) ||
251
+ resolution.bytes.length > WIKI_PRUNING_JOURNAL_MAX_BYTES
252
+ )
253
+ fail("Wiki retrieval artifact resolution is invalid");
254
+ const envelope = JSON.parse(
255
+ new TextDecoder("utf-8", { fatal: true }).decode(resolution.bytes),
256
+ );
257
+ if (
258
+ envelope.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
259
+ envelope.type !== WIKI_PRUNING_RETRIEVAL_ARTIFACT_TYPE ||
260
+ envelope.retention !== "ledger" ||
261
+ envelope.tenantId !== this.descriptor.artifactTenantId ||
262
+ envelope.audience !== this.descriptor.audience ||
263
+ envelope.purpose !== this.descriptor.purpose
264
+ )
265
+ fail("Wiki retrieval artifact scope is invalid");
266
+ const record = this.#record(envelope.value);
267
+ if (
268
+ record.revision !== (latest?.record.revision ?? 0) + 1 ||
269
+ record.previousProjectionDigest !==
270
+ (latest?.record.projectionDigest ?? null) ||
271
+ event.eventId !==
272
+ `${WIKI_PRUNING_RETRIEVAL_EVENT_TYPE}.${record.projectionDigest.slice(7)}` ||
273
+ this.#checkpoint(head, events, record.authorizationHead) !==
274
+ event.sequence - 1 ||
275
+ requests.has(record.call.requestDigest)
276
+ )
277
+ fail("Wiki retrieval history or authorization lineage is invalid");
278
+ requests.add(record.call.requestDigest);
279
+ latest = { record, event };
280
+ if (
281
+ record.call.requestDigest === requestDigest &&
282
+ event.sequence <= boundary
283
+ )
284
+ target = latest;
285
+ }
286
+ if (!same(headOf(this.#verifyLedger()), head))
287
+ fail("Wiki retrieval ledger changed during read");
288
+ return { head, latest, target };
289
+ }
290
+
291
+ async #expected(plan, checkpoint = null) {
292
+ const requests = this.#maintenance.requestDigests({ plan });
293
+ const query = {
294
+ tenantId: plan.tenantId,
295
+ stateDigest: plan.wikiStateDigest,
296
+ allowedMaintenanceRequestDigests: requests,
297
+ };
298
+ const history =
299
+ checkpoint === null
300
+ ? this.#wiki.resolveHistory(query)
301
+ : this.#wiki.resolveAtCheckpoint({ ...query, checkpoint });
302
+ if (
303
+ history.successors.length !== requests.length ||
304
+ !(await this.#maintenance.verifySuccessors({
305
+ plan,
306
+ history,
307
+ context:
308
+ checkpoint === null
309
+ ? { mode: "current", checkpoint: headOf(history.ledgerHead) }
310
+ : { mode: "checkpoint", checkpoint },
311
+ }))
312
+ )
313
+ fail("Wiki retrieval requires all exact Wiki maintenance effects");
314
+ const removals = new Set(plan.retrievalRemovals);
315
+ if (!Array.isArray(history.current.state.index))
316
+ fail("Wiki index is invalid");
317
+ return {
318
+ history,
319
+ index: history.current.state.index.filter(
320
+ (entry) => !removals.has(entry.patternId),
321
+ ),
322
+ };
323
+ }
324
+
325
+ #receipt(entry) {
326
+ const { record, event } = entry;
327
+ const core = {
328
+ schema: WIKI_PRUNING_RETRIEVAL_RECEIPT_SCHEMA,
329
+ authenticated: true,
330
+ durable: true,
331
+ tenantId: this.descriptor.tenantId,
332
+ streamId: this.descriptor.streamId,
333
+ requestDigest: record.call.requestDigest,
334
+ projectionDigest: record.projectionDigest,
335
+ wikiStateDigest: record.wikiStateDigest,
336
+ eventDigest: event.eventDigest,
337
+ artifactRef: event.subjectRef,
338
+ };
339
+ return snapshot({
340
+ ...core,
341
+ receiptDigest: pruningDigest(WIKI_PRUNING_RETRIEVAL_RECEIPT_SCHEMA, core),
342
+ });
343
+ }
344
+
345
+ async #verifyEntry(plan, entry) {
346
+ if (!entry || !same(entry.record.call, pruningOperationCalls(plan).at(-1)))
347
+ return false;
348
+ const expected = await this.#expected(plan, entry.record.authorizationHead);
349
+ return (
350
+ entry.record.wikiStateDigest === expected.history.current.stateDigest &&
351
+ entry.record.wikiRevision === expected.history.current.state.revisionId &&
352
+ same(entry.record.index, expected.index)
353
+ );
354
+ }
355
+
356
+ operationReceiptVerifier() {
357
+ return Object.freeze({ verify: (input) => this.#verifyReceipt(input) });
358
+ }
359
+ async #verifyReceipt({
360
+ plan: inputPlan,
361
+ request,
362
+ requestDigest,
363
+ receipt,
364
+ tenantId,
365
+ streamId,
366
+ context,
367
+ } = {}) {
368
+ if (
369
+ tenantId !== this.descriptor.tenantId ||
370
+ streamId !== this.descriptor.streamId
371
+ )
372
+ return false;
373
+ const plan = verifyPruningJournalPlan(inputPlan, tenantId);
374
+ const call = snapshot({ request, requestDigest });
375
+ if (!same(call, pruningOperationCalls(plan).at(-1))) return false;
376
+ const { target } = this.#history(requestDigest, context ?? null);
377
+ return (
378
+ (await this.#verifyEntry(plan, target)) &&
379
+ same(snapshot(receipt), this.#receipt(target))
380
+ );
381
+ }
382
+
383
+ #journal(input) {
384
+ const journal = captureWikiPruningJournalStore(input);
385
+ if (
386
+ journal.descriptor.tenantId !== this.descriptor.tenantId ||
387
+ journal.descriptor.streamId !== this.descriptor.streamId
388
+ )
389
+ throw new TypeError("Wiki retrieval journal scope mismatch");
390
+ return journal;
391
+ }
392
+ createProvider(journalStore) {
393
+ const journal = this.#journal(journalStore);
394
+ return Object.freeze({
395
+ publishRetrievalProjection: (input) => this.#publish(journal, input),
396
+ });
397
+ }
398
+
399
+ async #publish(journal, input) {
400
+ const call = snapshot(input);
401
+ const resolution = await journal.load({
402
+ tenantId: this.descriptor.tenantId,
403
+ });
404
+ const state = resolution.state;
405
+ if (!state) fail("Wiki retrieval requires a prepared journal");
406
+ const plan = verifyPruningJournalPlan(state.plan, this.descriptor.tenantId);
407
+ const calls = pruningOperationCalls(plan);
408
+ if (!same(call, calls.at(-1)))
409
+ fail("Wiki retrieval call differs from the current plan");
410
+ if (state.operationReceipts.length === calls.length) {
411
+ const receipt = state.operationReceipts.at(-1);
412
+ if (
413
+ !(await this.#verifyReceipt({
414
+ ...call,
415
+ receipt,
416
+ plan,
417
+ ...this.descriptor,
418
+ context: { mode: "checkpoint", checkpoint: resolution.checkpoint },
419
+ }))
420
+ )
421
+ fail("Wiki retrieval saved receipt differs");
422
+ return receipt;
423
+ }
424
+ if (
425
+ state.phase !== "running" ||
426
+ state.operationReceipts.length !== calls.length - 1
427
+ )
428
+ fail("Wiki retrieval requires the Wiki and deletion receipt frontier");
429
+ const persisted = this.#history(call.requestDigest);
430
+ if (!same(persisted.head, resolution.ledgerHead))
431
+ fail("Wiki retrieval journal authorization changed");
432
+ if (persisted.target) {
433
+ if (!(await this.#verifyEntry(plan, persisted.target)))
434
+ fail("Wiki retrieval persisted effect was substituted");
435
+ return this.#receipt(persisted.target);
436
+ }
437
+ const expected = await this.#expected(plan);
438
+ if (
439
+ !same(headOf(expected.history.ledgerHead), resolution.ledgerHead) ||
440
+ !same(headOf(this.#verifyLedger()), resolution.ledgerHead)
441
+ )
442
+ fail("Wiki retrieval authorization changed before publish");
443
+ const core = {
444
+ schema: WIKI_PRUNING_RETRIEVAL_SCHEMA,
445
+ tenantId: this.descriptor.tenantId,
446
+ streamId: this.descriptor.streamId,
447
+ evolutionRunId: this.descriptor.evolutionRunId,
448
+ revision: (persisted.latest?.record.revision ?? 0) + 1,
449
+ previousProjectionDigest:
450
+ persisted.latest?.record.projectionDigest ?? null,
451
+ call,
452
+ wikiStateDigest: expected.history.current.stateDigest,
453
+ wikiRevision: expected.history.current.state.revisionId,
454
+ authorizationHead: resolution.ledgerHead,
455
+ index: expected.index,
456
+ };
457
+ const record = this.#record({
458
+ ...core,
459
+ projectionDigest: pruningDigest(WIKI_PRUNING_RETRIEVAL_SCHEMA, core),
460
+ });
461
+ const timestamp = new Date(this.#clock()).toISOString();
462
+ const published = this.#put(WIKI_PRUNING_RETRIEVAL_ARTIFACT_TYPE, record, {
463
+ audience: this.descriptor.audience,
464
+ purpose: this.descriptor.purpose,
465
+ retention: "ledger",
466
+ });
467
+ if (
468
+ published?.receipt?.persisted !== true ||
469
+ published.receipt.readbackVerified !== true ||
470
+ published.receipt.integrityVerified !== true ||
471
+ published.receipt.retention !== "ledger"
472
+ )
473
+ fail("Wiki retrieval persistence was not confirmed");
474
+ // Do not turn an uncertain write into an acknowledgement. A fresh instance
475
+ // can authenticate the committed record and reconcile the same request.
476
+ this.#append(
477
+ {
478
+ artifactTenantId: this.descriptor.artifactTenantId,
479
+ correlationId: this.descriptor.streamId,
480
+ decision: "committed",
481
+ eventId: `${WIKI_PRUNING_RETRIEVAL_EVENT_TYPE}.${record.projectionDigest.slice(7)}`,
482
+ reason: `Wiki retrieval projection ${record.revision} committed`,
483
+ skillName: null,
484
+ sourceRefs: persisted.latest ? [persisted.latest.event.subjectRef] : [],
485
+ subjectRef: published.ref,
486
+ tenantId: this.descriptor.tenantId,
487
+ timestamp,
488
+ type: WIKI_PRUNING_RETRIEVAL_EVENT_TYPE,
489
+ },
490
+ {
491
+ expectedHeadDigest: resolution.ledgerHead.headDigest,
492
+ expectedSequence: resolution.ledgerHead.sequence,
493
+ },
494
+ );
495
+ const recovered = this.#history(call.requestDigest);
496
+ if (!recovered.target || !same(recovered.target.record, record))
497
+ fail("Wiki retrieval readback differs from publication");
498
+ return this.#receipt(recovered.target);
499
+ }
500
+
501
+ createProposerReader({ journalStore, policy } = {}) {
502
+ if (
503
+ policy?.proposerWikiRead !== true ||
504
+ policy?.executionAgentWikiRead !== false
505
+ )
506
+ throw new TypeError("Wiki retrieval is isolated to the proposer");
507
+ const journal = this.#journal(journalStore);
508
+ return Object.freeze({
509
+ readIndex: (input) => this.#readCurrent(journal, input, false),
510
+ readPattern: (input) => this.#readCurrent(journal, input, true),
511
+ });
512
+ }
513
+
514
+ async #readCurrent(journal, input, patternMode) {
515
+ const query = snapshot(input);
516
+ const patternId = patternMode ? query.patternId : null;
517
+ if (
518
+ !exact(
519
+ query,
520
+ patternId === null
521
+ ? ["tenantId", "wikiRevision"]
522
+ : ["tenantId", "wikiRevision", "patternId"],
523
+ ) ||
524
+ query.tenantId !== this.descriptor.tenantId ||
525
+ (patternId !== null &&
526
+ (typeof patternId !== "string" || !patternId.trim()))
527
+ )
528
+ fail("Wiki retrieval read scope is invalid");
529
+ const resolution = await journal.load({ tenantId: query.tenantId });
530
+ const state = resolution.state;
531
+ if (state?.phase !== "finalized")
532
+ fail("Wiki retrieval has no finalized current projection");
533
+ const requestDigest = pruningOperationCalls(state.plan).at(
534
+ -1,
535
+ ).requestDigest;
536
+ const persisted = this.#history(requestDigest);
537
+ if (
538
+ !same(persisted.head, resolution.ledgerHead) ||
539
+ !persisted.target ||
540
+ persisted.target !== persisted.latest ||
541
+ !same(state.operationReceipts.at(-1), this.#receipt(persisted.target))
542
+ )
543
+ fail("Wiki retrieval projection is not the current journal effect");
544
+ const record = persisted.target.record;
545
+ // A later normal Wiki edit requires projection refresh, never silent reuse
546
+ // of a historical index. No historical-checkpoint option is exposed here.
547
+ const current = this.#wiki.resolveHistory({
548
+ tenantId: query.tenantId,
549
+ stateDigest: record.wikiStateDigest,
550
+ allowedMaintenanceRequestDigests: [],
551
+ });
552
+ if (
553
+ !same(headOf(current.ledgerHead), persisted.head) ||
554
+ query.wikiRevision !== record.wikiRevision ||
555
+ current.current.stateDigest !== record.wikiStateDigest
556
+ )
557
+ fail("Wiki retrieval projection is stale");
558
+ let data;
559
+ let kind;
560
+ if (patternId === null) {
561
+ kind = "wiki-index";
562
+ data = {
563
+ tenantId: query.tenantId,
564
+ wikiRevision: record.wikiRevision,
565
+ wikiStateDigest: record.wikiStateDigest,
566
+ projectionDigest: record.projectionDigest,
567
+ entries: record.index,
568
+ contradictionRefs: record.index
569
+ .filter((entry) => entry.status === "contradicted")
570
+ .map((entry) => entry.patternId),
571
+ };
572
+ } else {
573
+ if (!record.index.some((entry) => entry.patternId === patternId))
574
+ fail("Wiki pattern is excluded from the current retrieval projection");
575
+ kind = "pattern";
576
+ data = current.current.state.patterns[patternId];
577
+ if (!data) fail("Wiki projection references an absent pattern");
578
+ }
579
+ return snapshot({
580
+ kind,
581
+ trusted: true,
582
+ ref: `${persisted.target.event.subjectRef.ref}${patternId === null ? "" : `#pattern=${encodeURIComponent(patternId)}`}`,
583
+ digest: digestWikiState(data),
584
+ data,
585
+ });
586
+ }
587
+ }