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,120 @@
1
+ import {
2
+ WIKI_REVISION_SCHEMA,
3
+ WIKI_STATE_SCHEMA,
4
+ digestWikiState,
5
+ } from "./evidence-backed-wiki-maintainer.js";
6
+
7
+ export const WIKI_LEDGER_CORRUPT_CODE = "CC_EVOLUTION_WIKI_LEDGER_CORRUPT";
8
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
9
+ const REVISION_ID = /^wiki:[a-f0-9]{64}$/u;
10
+ function fail(code, message) {
11
+ const error = new Error(message);
12
+ error.code = code;
13
+ throw error;
14
+ }
15
+
16
+ // Same canonical digest as the Maintainer, including legacy revisions whose
17
+ // payload predates maintenanceRequestId/maintenanceRequestDigest.
18
+ export function verifyWikiRevision(revision, descriptor) {
19
+ const { state, stateDigest, revisionId, ...payload } = revision ?? {};
20
+ const fields = [
21
+ "schema",
22
+ "tenantId",
23
+ "evolutionRunId",
24
+ "revision",
25
+ "priorStateDigest",
26
+ "rulesDigest",
27
+ "maintainerModel",
28
+ "effectiveAt",
29
+ "evidenceRefs",
30
+ "operationDigest",
31
+ ];
32
+ const hasRequest = Object.hasOwn(payload, "maintenanceRequestId");
33
+ if (hasRequest)
34
+ fields.push("maintenanceRequestId", "maintenanceRequestDigest");
35
+ if (
36
+ Object.keys(payload).length !== fields.length ||
37
+ fields.some((key) => !Object.hasOwn(payload, key)) ||
38
+ payload.schema !== WIKI_REVISION_SCHEMA ||
39
+ payload.tenantId !== descriptor.tenantId ||
40
+ payload.evolutionRunId !== descriptor.evolutionRunId ||
41
+ !Number.isSafeInteger(payload.revision) ||
42
+ payload.revision < 1 ||
43
+ !DIGEST.test(payload.priorStateDigest ?? "") ||
44
+ !DIGEST.test(payload.rulesDigest ?? "") ||
45
+ !DIGEST.test(payload.operationDigest ?? "") ||
46
+ typeof payload.maintainerModel !== "string" ||
47
+ !payload.maintainerModel.trim() ||
48
+ typeof payload.effectiveAt !== "string" ||
49
+ !Number.isFinite(Date.parse(payload.effectiveAt)) ||
50
+ !Array.isArray(payload.evidenceRefs) ||
51
+ payload.evidenceRefs.length === 0 ||
52
+ payload.evidenceRefs.length > 256 ||
53
+ payload.evidenceRefs.some(
54
+ (ref) => typeof ref !== "string" || !ref.trim(),
55
+ ) ||
56
+ digestWikiState(payload.evidenceRefs) !==
57
+ digestWikiState([...new Set(payload.evidenceRefs)].sort()) ||
58
+ !REVISION_ID.test(revisionId ?? "") ||
59
+ revisionId !== `wiki:${digestWikiState(payload).slice(7)}` ||
60
+ state?.schema !== WIKI_STATE_SCHEMA ||
61
+ state.tenantId !== descriptor.tenantId ||
62
+ state.revision !== payload.revision ||
63
+ state.revisionId !== revisionId ||
64
+ stateDigest !== digestWikiState(state)
65
+ ) {
66
+ fail(
67
+ WIKI_LEDGER_CORRUPT_CODE,
68
+ "Wiki revision identity or state binding is invalid",
69
+ );
70
+ }
71
+ if (
72
+ hasRequest &&
73
+ !(
74
+ payload.maintenanceRequestId === null &&
75
+ payload.maintenanceRequestDigest === null
76
+ ) &&
77
+ (!DIGEST.test(payload.maintenanceRequestDigest ?? "") ||
78
+ payload.maintenanceRequestId !==
79
+ `wiki-maintenance:${payload.maintenanceRequestDigest.slice(7)}`)
80
+ ) {
81
+ fail(
82
+ WIKI_LEDGER_CORRUPT_CODE,
83
+ "Wiki maintenance request binding is invalid",
84
+ );
85
+ }
86
+ return revision;
87
+ }
88
+
89
+ export function verifyWikiRequestTransition(previousState, revision) {
90
+ const requests = revision.state.maintenanceRequests ?? {};
91
+ const previous = previousState.maintenanceRequests ?? {};
92
+ const requestId = revision.maintenanceRequestId ?? null;
93
+ if (
94
+ !requests ||
95
+ typeof requests !== "object" ||
96
+ Array.isArray(requests) ||
97
+ (requestId && Object.hasOwn(previous, requestId))
98
+ ) {
99
+ fail(
100
+ WIKI_LEDGER_CORRUPT_CODE,
101
+ "Wiki maintenance request is duplicated or invalid",
102
+ );
103
+ }
104
+ const expected = { ...previous };
105
+ if (requestId)
106
+ expected[requestId] = {
107
+ requestDigest: revision.maintenanceRequestDigest,
108
+ evidenceRefs: revision.evidenceRefs,
109
+ effectiveAt: revision.effectiveAt,
110
+ operationDigest: revision.operationDigest,
111
+ revision: revision.revision,
112
+ revisionId: revision.revisionId,
113
+ };
114
+ if (digestWikiState(requests) !== digestWikiState(expected)) {
115
+ fail(
116
+ WIKI_LEDGER_CORRUPT_CODE,
117
+ "Wiki maintenance request history was substituted",
118
+ );
119
+ }
120
+ }
@@ -0,0 +1,307 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ import {
4
+ EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
5
+ isEvolutionLedgerArtifactResolver,
6
+ } from "./evolution-artifact-ports.js";
7
+ import {
8
+ EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
9
+ EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
10
+ } from "./evolution-ledger.js";
11
+ import {
12
+ WIKI_PROPOSAL_STATUS,
13
+ WIKI_SKILL_PROPOSAL_SCHEMA,
14
+ computeWikiSkillProposalDigest,
15
+ } from "./wiki-informed-skill-proposer.js";
16
+
17
+ export const WIKI_SKILL_PROPOSAL_RECORD_SCHEMA =
18
+ "chainlesschain.wiki-skill-proposal-record/v1";
19
+ export const WIKI_SKILL_PROPOSAL_LEDGER_EVENT =
20
+ "evolution.wiki-skill-proposal.committed";
21
+ export const WIKI_SKILL_PROPOSAL_CONFLICT_CODE =
22
+ "CC_EVOLUTION_WIKI_SKILL_PROPOSAL_CONFLICT";
23
+ export const WIKI_SKILL_PROPOSAL_CORRUPT_CODE =
24
+ "CC_EVOLUTION_WIKI_SKILL_PROPOSAL_CORRUPT";
25
+
26
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
27
+
28
+ function canonical(value) {
29
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
30
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
31
+ return `{${Object.keys(value)
32
+ .sort()
33
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
34
+ .join(",")}}`;
35
+ }
36
+
37
+ function hash(value) {
38
+ return `sha256:${createHash("sha256")
39
+ .update(WIKI_SKILL_PROPOSAL_RECORD_SCHEMA)
40
+ .update("\0")
41
+ .update(canonical(value))
42
+ .digest("hex")}`;
43
+ }
44
+
45
+ function text(value, name) {
46
+ if (typeof value !== "string" || value.trim() === "")
47
+ throw new TypeError(`${name} is required`);
48
+ return value;
49
+ }
50
+
51
+ function digest(value, name) {
52
+ if (!DIGEST.test(value ?? "")) throw new TypeError(`${name} is invalid`);
53
+ return value;
54
+ }
55
+
56
+ function fail(code, message) {
57
+ const error = new Error(message);
58
+ error.code = code;
59
+ throw error;
60
+ }
61
+
62
+ function capture(owner, method, name) {
63
+ if (!owner || typeof owner[method] !== "function")
64
+ throw new TypeError(`${name}.${method}() is required`);
65
+ return (...args) => Reflect.apply(owner[method], owner, args);
66
+ }
67
+
68
+ function normalizeDescriptor(input) {
69
+ const descriptor = Object.freeze({
70
+ tenantId: text(input?.tenantId, "tenantId"),
71
+ artifactTenantId: text(input?.artifactTenantId, "artifactTenantId"),
72
+ evolutionRunId: text(input?.evolutionRunId, "evolutionRunId"),
73
+ skillName: text(input?.skillName, "skillName"),
74
+ audience: text(input?.audience, "audience"),
75
+ purpose: text(input?.purpose, "purpose"),
76
+ });
77
+ if (descriptor.purpose !== "evolution-ledger")
78
+ throw new TypeError("proposal adapter purpose must be evolution-ledger");
79
+ return descriptor;
80
+ }
81
+
82
+ function verifyRecord(record, descriptor) {
83
+ const proposal = record?.drafted?.proposal;
84
+ if (
85
+ record?.schema !== WIKI_SKILL_PROPOSAL_RECORD_SCHEMA ||
86
+ record.tenantId !== descriptor.tenantId ||
87
+ record.evolutionRunId !== descriptor.evolutionRunId ||
88
+ record.skillName !== descriptor.skillName ||
89
+ !DIGEST.test(record.planDigest ?? "") ||
90
+ !DIGEST.test(record.operationKey ?? "") ||
91
+ !DIGEST.test(record.inputDigest ?? "") ||
92
+ !DIGEST.test(record.outputDigest ?? "") ||
93
+ record.drafted?.status !== WIKI_PROPOSAL_STATUS.PROPOSAL ||
94
+ proposal?.schema !== WIKI_SKILL_PROPOSAL_SCHEMA ||
95
+ proposal.tenantId !== descriptor.tenantId ||
96
+ proposal.evolutionRunId !== descriptor.evolutionRunId ||
97
+ proposal.skillName !== descriptor.skillName ||
98
+ record.drafted.proposalDigest !==
99
+ computeWikiSkillProposalDigest(proposal) ||
100
+ record.outputDigest !== record.drafted.proposalDigest ||
101
+ !Number.isFinite(Date.parse(record.effectiveAt ?? "")) ||
102
+ !DIGEST.test(record.recordDigest ?? "")
103
+ ) {
104
+ fail(
105
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
106
+ "Wiki Skill proposal record binding is invalid",
107
+ );
108
+ }
109
+ const core = structuredClone(record);
110
+ delete core.recordDigest;
111
+ if (hash(core) !== record.recordDigest)
112
+ fail(
113
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
114
+ "Wiki Skill proposal record digest mismatch",
115
+ );
116
+ return Object.freeze(structuredClone(record));
117
+ }
118
+
119
+ export class WikiSkillProposalLedgerAdapter {
120
+ constructor({
121
+ descriptor: input,
122
+ artifactPorts,
123
+ ledger,
124
+ ledgerArtifactResolver,
125
+ } = {}) {
126
+ this.descriptor = normalizeDescriptor(input);
127
+ this._put = capture(artifactPorts, "putCanonical", "artifactPorts");
128
+ this._read = capture(ledger, "read", "ledger");
129
+ this._verify = capture(ledger, "verify", "ledger");
130
+ this._append = capture(ledger, "appendDomainEvent", "ledger");
131
+ if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver))
132
+ throw new TypeError(
133
+ "a branded EvolutionArtifactPorts ledger resolver is required",
134
+ );
135
+ this._resolve = ledgerArtifactResolver;
136
+ Object.freeze(this);
137
+ }
138
+
139
+ _events(planDigest) {
140
+ digest(planDigest, "planDigest");
141
+ const events = this._read();
142
+ if (!Array.isArray(events))
143
+ fail(WIKI_SKILL_PROPOSAL_CORRUPT_CODE, "proposal ledger read is invalid");
144
+ const selected = events.filter(
145
+ (event) =>
146
+ event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
147
+ event.type === WIKI_SKILL_PROPOSAL_LEDGER_EVENT &&
148
+ event.tenantId === this.descriptor.tenantId &&
149
+ event.skillName === this.descriptor.skillName &&
150
+ event.correlationId === planDigest,
151
+ );
152
+ if (selected.length > 1)
153
+ fail(
154
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
155
+ "a release plan has multiple committed Wiki Skill proposals",
156
+ );
157
+ return selected;
158
+ }
159
+
160
+ _resolveEvent(event) {
161
+ const authority = this._verify();
162
+ const resolution = this._resolve({
163
+ epoch: authority.epoch,
164
+ ledgerId: authority.ledgerId,
165
+ ref: event.subjectRef,
166
+ tenantId: this.descriptor.artifactTenantId,
167
+ });
168
+ if (
169
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
170
+ resolution.authenticated !== true ||
171
+ resolution.found !== true ||
172
+ resolution.ref !== event.subjectRef.ref ||
173
+ resolution.digest !== event.subjectRef.digest ||
174
+ !Buffer.isBuffer(resolution.bytes)
175
+ )
176
+ fail(
177
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
178
+ "proposal artifact resolution is invalid",
179
+ );
180
+ let durable;
181
+ try {
182
+ durable = JSON.parse(resolution.bytes.toString("utf8"));
183
+ } catch {
184
+ fail(
185
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
186
+ "proposal artifact is not canonical JSON",
187
+ );
188
+ }
189
+ if (
190
+ durable?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
191
+ durable.tenantId !== this.descriptor.artifactTenantId ||
192
+ durable.audience !== this.descriptor.audience ||
193
+ durable.purpose !== this.descriptor.purpose ||
194
+ durable.retention !== "ledger" ||
195
+ durable.type !== "wiki-skill-proposal"
196
+ )
197
+ fail(
198
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
199
+ "proposal durable artifact binding is invalid",
200
+ );
201
+ return verifyRecord(durable.value, this.descriptor);
202
+ }
203
+
204
+ load(planDigest) {
205
+ const event = this._events(planDigest)[0];
206
+ return event ? this._resolveEvent(event) : null;
207
+ }
208
+
209
+ commit({ planDigest, operationKey, inputDigest, drafted, effectiveAt } = {}) {
210
+ digest(planDigest, "planDigest");
211
+ digest(operationKey, "operationKey");
212
+ digest(inputDigest, "inputDigest");
213
+ const timestamp = new Date(effectiveAt).toISOString();
214
+ const core = {
215
+ schema: WIKI_SKILL_PROPOSAL_RECORD_SCHEMA,
216
+ tenantId: this.descriptor.tenantId,
217
+ evolutionRunId: this.descriptor.evolutionRunId,
218
+ skillName: this.descriptor.skillName,
219
+ planDigest,
220
+ operationKey,
221
+ inputDigest,
222
+ outputDigest: drafted?.proposalDigest,
223
+ drafted: structuredClone(drafted),
224
+ effectiveAt: timestamp,
225
+ };
226
+ const proposalRecord = verifyRecord(
227
+ { ...core, recordDigest: hash(core) },
228
+ this.descriptor,
229
+ );
230
+ const existing = this.load(planDigest);
231
+ if (existing) {
232
+ if (existing.recordDigest === proposalRecord.recordDigest)
233
+ return Object.freeze({
234
+ committed: true,
235
+ recovered: true,
236
+ outputDigest: existing.outputDigest,
237
+ recordDigest: existing.recordDigest,
238
+ });
239
+ fail(
240
+ WIKI_SKILL_PROPOSAL_CONFLICT_CODE,
241
+ "release plan is already bound to a different Wiki Skill proposal",
242
+ );
243
+ }
244
+ const head = this._verify();
245
+ const published = this._put("wiki-skill-proposal", proposalRecord, {
246
+ audience: this.descriptor.audience,
247
+ purpose: this.descriptor.purpose,
248
+ retention: "ledger",
249
+ });
250
+ if (
251
+ !published?.ref ||
252
+ published.receipt?.persisted !== true ||
253
+ published.receipt?.readbackVerified !== true ||
254
+ published.receipt?.integrityVerified !== true ||
255
+ published.receipt?.retention !== "ledger"
256
+ )
257
+ fail(
258
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
259
+ "proposal artifact was not durably read back",
260
+ );
261
+ const eventId = `wiki-skill-proposal.${proposalRecord.recordDigest.slice("sha256:".length)}`;
262
+ const receipt = this._append(
263
+ {
264
+ artifactTenantId: this.descriptor.artifactTenantId,
265
+ correlationId: planDigest,
266
+ decision: "committed",
267
+ eventId,
268
+ reason: "Wiki-informed Skill proposal committed",
269
+ skillName: this.descriptor.skillName,
270
+ sourceRefs: [],
271
+ subjectRef: published.ref,
272
+ tenantId: this.descriptor.tenantId,
273
+ timestamp,
274
+ type: WIKI_SKILL_PROPOSAL_LEDGER_EVENT,
275
+ },
276
+ { expectedHeadDigest: head.headDigest, expectedSequence: head.sequence },
277
+ );
278
+ if (
279
+ receipt?.authenticated !== true ||
280
+ receipt.committed !== true ||
281
+ receipt.durable !== true ||
282
+ receipt.eventId !== eventId ||
283
+ !DIGEST.test(receipt.receiptDigest ?? "")
284
+ )
285
+ fail(
286
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
287
+ "proposal ledger append was not durably confirmed",
288
+ );
289
+ const stored = this.load(planDigest);
290
+ if (stored?.recordDigest !== proposalRecord.recordDigest)
291
+ fail(
292
+ WIKI_SKILL_PROPOSAL_CORRUPT_CODE,
293
+ "proposal readback differs after ledger commit",
294
+ );
295
+ return Object.freeze({
296
+ committed: true,
297
+ recovered: false,
298
+ outputDigest: proposalRecord.outputDigest,
299
+ recordDigest: proposalRecord.recordDigest,
300
+ ledgerReceiptDigest: receipt.receiptDigest,
301
+ });
302
+ }
303
+ }
304
+
305
+ export function createWikiSkillProposalLedgerAdapter(options) {
306
+ return new WikiSkillProposalLedgerAdapter(options);
307
+ }
@@ -0,0 +1,101 @@
1
+ import {
2
+ EvidenceBackedWikiMaintainer,
3
+ WIKI_MAINTENANCE_REQUEST_SCHEMA,
4
+ digestWikiState,
5
+ } from "./evidence-backed-wiki-maintainer.js";
6
+
7
+ const POLICY = Object.freeze({
8
+ trustedProjectionRead: true,
9
+ rawEvidenceRead: false,
10
+ activeSkillWrite: false,
11
+ shell: false,
12
+ network: false,
13
+ secretRead: false,
14
+ });
15
+ function freeze(value) {
16
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
17
+ Object.freeze(value);
18
+ for (const child of Object.values(value)) freeze(child);
19
+ }
20
+ return value;
21
+ }
22
+
23
+ // Pure derivation only; this function has no persistence or authorization port.
24
+ // Callers must authenticate the source and authorize the exact operations, then
25
+ // commit through the real adapter with the same authenticated head/sequence CAS.
26
+ export async function deriveWikiTargetTombstoneRevision({
27
+ source,
28
+ descriptor,
29
+ operations,
30
+ effectiveAt,
31
+ requestDigest,
32
+ }) {
33
+ if (
34
+ !Array.isArray(operations) ||
35
+ operations.length < 1 ||
36
+ operations.length > 128 ||
37
+ operations.some((operation) => operation.type !== "tombstone")
38
+ )
39
+ throw new TypeError(
40
+ "target-only Wiki derivation requires bounded tombstones",
41
+ );
42
+ const ref = Object.keys(source.state.evidence ?? {}).sort()[0];
43
+ if (!ref)
44
+ throw new TypeError(
45
+ "Wiki tombstones require retained authenticated evidence metadata",
46
+ );
47
+ const core = source.state.evidence[ref];
48
+ const evidence = { ...core, envelopeDigest: digestWikiState(core) };
49
+ let revision = null;
50
+ const maintainer = new EvidenceBackedWikiMaintainer({
51
+ descriptor,
52
+ policy: POLICY,
53
+ ports: Object.freeze({
54
+ loadWiki: () => source,
55
+ resolveEvidence: () => evidence,
56
+ derive: () => ({ operations }),
57
+ commitRevision: ({ revision: next }) => {
58
+ revision = next;
59
+ return {
60
+ committed: true,
61
+ revisionId: next.revisionId,
62
+ stateDigest: next.stateDigest,
63
+ evolutionRunId: next.evolutionRunId,
64
+ };
65
+ },
66
+ }),
67
+ });
68
+ await maintainer.maintain({
69
+ evidenceRefs: [ref],
70
+ effectiveAt,
71
+ maintenanceRequest: {
72
+ schema: WIKI_MAINTENANCE_REQUEST_SCHEMA,
73
+ tenantId: descriptor.tenantId,
74
+ requestDigest,
75
+ requestId: `wiki-maintenance:${requestDigest.slice(7)}`,
76
+ },
77
+ });
78
+ if (!revision)
79
+ throw new Error(
80
+ "Wiki tombstone derivation unexpectedly reused an existing request",
81
+ );
82
+ // General maintenance also recalculates unrelated patterns. A targeted
83
+ // revocation has no authority to change their lifecycle, confidence or facts.
84
+ const scoped = structuredClone(source.state);
85
+ const targets = new Set(operations.map((operation) => operation.patternId));
86
+ for (const id of targets) scoped.patterns[id] = revision.state.patterns[id];
87
+ if (!Array.isArray(source.state.index))
88
+ throw new TypeError("Wiki source index is invalid");
89
+ scoped.index = source.state.index.filter(
90
+ (entry) => !targets.has(entry.patternId),
91
+ );
92
+ scoped.revision = revision.revision;
93
+ scoped.revisionId = revision.revisionId;
94
+ scoped.maintenanceRequests = revision.state.maintenanceRequests;
95
+ scoped.evolutionLog = revision.state.evolutionLog;
96
+ return freeze({
97
+ ...revision,
98
+ state: scoped,
99
+ stateDigest: digestWikiState(scoped),
100
+ });
101
+ }
@@ -0,0 +1,178 @@
1
+ import { types as utilTypes } from "node:util";
2
+
3
+ import {
4
+ projectWikiSkillBenchmarkClaim,
5
+ verifyWikiSkillBenchmarkPlan,
6
+ } from "./wikiskill-benchmark.js";
7
+ import {
8
+ executeWikiSkillBenchmarkProduction,
9
+ isWikiSkillBenchmarkDatasetProvider,
10
+ isWikiSkillBenchmarkGrader,
11
+ isWikiSkillBenchmarkReportAttestor,
12
+ isWikiSkillBenchmarkRunner,
13
+ verifyWikiSkillBenchmarkExecutionBinding,
14
+ } from "./wikiskill-benchmark-execution-host.js";
15
+ import { isWikiSkillBenchmarkLedgerAdapter } from "./wikiskill-benchmark-ledger-adapter.js";
16
+
17
+ const HOSTS = new WeakSet();
18
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
19
+
20
+ function capture(owner, method, label) {
21
+ if (
22
+ !owner ||
23
+ typeof owner !== "object" ||
24
+ utilTypes.isProxy(owner) ||
25
+ typeof owner[method] !== "function" ||
26
+ utilTypes.isProxy(owner[method])
27
+ ) {
28
+ throw new TypeError(`${label}.${method}() is required`);
29
+ }
30
+ return owner[method].bind(owner);
31
+ }
32
+
33
+ function exact(value, keys, label) {
34
+ if (
35
+ !value ||
36
+ typeof value !== "object" ||
37
+ Array.isArray(value) ||
38
+ utilTypes.isProxy(value) ||
39
+ Object.keys(value).length !== keys.length ||
40
+ Object.keys(value).some((key) => !keys.includes(key))
41
+ ) {
42
+ throw new TypeError(`${label} has unexpected or missing fields`);
43
+ }
44
+ }
45
+
46
+ function timestamp(value, label) {
47
+ if (typeof value !== "string") throw new TypeError(`${label} is required`);
48
+ const parsed = new Date(value);
49
+ if (!Number.isFinite(parsed.getTime()) || parsed.toISOString() !== value)
50
+ throw new TypeError(`${label} must be a canonical timestamp`);
51
+ return value;
52
+ }
53
+
54
+ export class WikiSkillBenchmarkCliHost {
55
+ constructor({
56
+ datasetProvider,
57
+ runner,
58
+ grader,
59
+ reportAttestor,
60
+ ledgerAdapter,
61
+ now = () => Date.now(),
62
+ } = {}) {
63
+ if (!isWikiSkillBenchmarkLedgerAdapter(ledgerAdapter))
64
+ throw new TypeError("WikiSkillBenchmarkLedgerAdapter is required");
65
+ if (
66
+ !isWikiSkillBenchmarkDatasetProvider(datasetProvider) ||
67
+ !isWikiSkillBenchmarkRunner(runner) ||
68
+ !isWikiSkillBenchmarkGrader(grader) ||
69
+ !isWikiSkillBenchmarkReportAttestor(reportAttestor)
70
+ )
71
+ throw new TypeError(
72
+ "all branded WikiSkill Benchmark providers are required",
73
+ );
74
+ if (typeof now !== "function" || utilTypes.isProxy(now))
75
+ throw new TypeError("benchmark trusted clock is required");
76
+ this._datasetProvider = datasetProvider;
77
+ this._runner = runner;
78
+ this._grader = grader;
79
+ this._reportAttestor = reportAttestor;
80
+ this._load = capture(ledgerAdapter, "load", "ledgerAdapter");
81
+ this._commit = capture(ledgerAdapter, "commit", "ledgerAdapter");
82
+ this._verifyReportAttestation = capture(
83
+ reportAttestor,
84
+ "verifyAttestation",
85
+ "reportAttestor",
86
+ );
87
+ this._now = now;
88
+ HOSTS.add(this);
89
+ Object.freeze(this);
90
+ }
91
+
92
+ async run(input = {}) {
93
+ exact(
94
+ input,
95
+ ["plan", "executionManifest", "effectiveAt"],
96
+ "benchmark run request",
97
+ );
98
+ const { plan, executionManifest, effectiveAt } = input;
99
+ const binding = verifyWikiSkillBenchmarkExecutionBinding({
100
+ plan,
101
+ executionManifest,
102
+ });
103
+ const timestampValue = timestamp(
104
+ effectiveAt ?? new Date(this._now()).toISOString(),
105
+ "effectiveAt",
106
+ );
107
+ const produced = await executeWikiSkillBenchmarkProduction({
108
+ plan: binding.plan,
109
+ executionManifest: binding.executionManifest,
110
+ datasetProvider: this._datasetProvider,
111
+ runner: this._runner,
112
+ grader: this._grader,
113
+ reportAttestor: this._reportAttestor,
114
+ });
115
+ const committed = await this._commit({
116
+ plan: binding.plan,
117
+ executionManifest: binding.executionManifest,
118
+ envelope: produced.envelope,
119
+ effectiveAt: timestampValue,
120
+ });
121
+ const durable = await this._load(produced.report.reportDigest);
122
+ if (
123
+ durable?.plan?.planDigest !== binding.plan.planDigest ||
124
+ durable.executionManifest?.manifestDigest !==
125
+ binding.executionManifest.manifestDigest ||
126
+ durable.envelope?.report?.reportDigest !== produced.report.reportDigest
127
+ ) {
128
+ throw new Error("benchmark bundle was not durably recoverable");
129
+ }
130
+ const claim = await projectWikiSkillBenchmarkClaim({
131
+ envelope: durable.envelope,
132
+ verifyAttestation: this._verifyReportAttestation,
133
+ });
134
+ return Object.freeze({
135
+ status: claim.status,
136
+ provenance: claim.provenance,
137
+ planDigest: binding.plan.planDigest,
138
+ executionManifestDigest: binding.executionManifest.manifestDigest,
139
+ reportDigest: claim.reportDigest,
140
+ metrics: claim.metrics,
141
+ committed: committed.committed === true,
142
+ recovered: committed.recovered === true,
143
+ });
144
+ }
145
+
146
+ async show(reportDigest) {
147
+ if (!DIGEST.test(reportDigest ?? ""))
148
+ throw new TypeError("reportDigest must be a sha256 digest");
149
+ const durable = await this._load(reportDigest);
150
+ if (!durable) return null;
151
+ const plan = verifyWikiSkillBenchmarkPlan(durable.plan);
152
+ verifyWikiSkillBenchmarkExecutionBinding({
153
+ plan,
154
+ executionManifest: durable.executionManifest,
155
+ });
156
+ const claim = await projectWikiSkillBenchmarkClaim({
157
+ envelope: durable.envelope,
158
+ verifyAttestation: this._verifyReportAttestation,
159
+ });
160
+ return Object.freeze({
161
+ status: claim.status,
162
+ provenance: claim.provenance,
163
+ planDigest: plan.planDigest,
164
+ executionManifestDigest: durable.executionManifest.manifestDigest,
165
+ reportDigest: claim.reportDigest,
166
+ metrics: claim.metrics,
167
+ effectiveAt: durable.effectiveAt,
168
+ });
169
+ }
170
+ }
171
+
172
+ export function createWikiSkillBenchmarkCliHost(options) {
173
+ return new WikiSkillBenchmarkCliHost(options);
174
+ }
175
+
176
+ export function isWikiSkillBenchmarkCliHost(value) {
177
+ return Boolean(value && HOSTS.has(value));
178
+ }