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
@@ -1,175 +1,134 @@
1
- import { createHash } from "node:crypto";
2
-
1
+ import { types } from "node:util";
3
2
  import {
4
- EVOLUTION_WORKBENCH_BATCH_PLAN_SCHEMA,
5
- filterEvolutionWorkbenchProjection,
6
- } from "./evolution-workbench-projection.js";
7
- import { verifySkillPromotionReviewPacketArtifact } from "./skill-promotion-review.js";
8
-
9
- export const EVOLUTION_WORKBENCH_BATCH_ITEM_REQUEST_SCHEMA =
10
- "chainlesschain.evolution-workbench-batch-item-request/v1";
11
- export const EVOLUTION_WORKBENCH_BATCH_EXECUTION_SCHEMA =
12
- "chainlesschain.evolution-workbench-batch-execution/v1";
13
-
14
- const DIGEST = /^sha256:[a-f0-9]{64}$/u;
15
-
16
- function canonical(value) {
17
- if (value === null || typeof value !== "object") return JSON.stringify(value);
18
- if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
19
- return `{${Object.keys(value)
20
- .sort()
21
- .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
22
- .join(",")}}`;
23
- }
24
-
25
- function hash(domain, value) {
26
- return `sha256:${createHash("sha256")
27
- .update(domain)
28
- .update("\0")
29
- .update(canonical(value))
30
- .digest("hex")}`;
31
- }
32
-
33
- function clone(value) {
34
- return value == null ? value : structuredClone(value);
35
- }
36
-
37
- function freeze(value) {
38
- if (value && typeof value === "object" && !Object.isFrozen(value)) {
39
- Object.freeze(value);
40
- for (const child of Object.values(value)) freeze(child);
41
- }
42
- return value;
43
- }
44
-
45
- function verifyPlan(input, tenantId) {
46
- if (
47
- input?.schema !== EVOLUTION_WORKBENCH_BATCH_PLAN_SCHEMA ||
48
- input.tenantId !== tenantId ||
49
- !DIGEST.test(input?.planDigest ?? "")
50
- )
51
- throw new TypeError("Workbench batch plan is invalid");
52
- const core = clone(input);
53
- delete core.planDigest;
54
- if (hash(EVOLUTION_WORKBENCH_BATCH_PLAN_SCHEMA, core) !== input.planDigest)
55
- throw new Error("Workbench batch plan digest is invalid");
56
- return freeze(clone(input));
57
- }
58
-
59
- function itemRequest(plan, packet) {
60
- const core = {
61
- schema: EVOLUTION_WORKBENCH_BATCH_ITEM_REQUEST_SCHEMA,
62
- tenantId: plan.tenantId,
63
- planDigest: plan.planDigest,
64
- sourceProjectionDigest: plan.sourceProjectionDigest,
65
- packetDigest: packet.packetDigest,
66
- candidateId: packet.candidateId,
67
- candidateContentDigest: packet.candidateContentDigest,
68
- decision: plan.decision,
69
- reason: plan.reason,
70
- requestedBy: plan.requestedBy,
71
- requiredHumanQuorum: packet.requiredHumanQuorum,
72
- contentRiskDigest: packet.contentRisk.contentRiskDigest,
73
- contentRiskDetected: packet.contentRisk.detected,
74
- };
75
- return freeze({
76
- ...core,
77
- requestDigest: hash(EVOLUTION_WORKBENCH_BATCH_ITEM_REQUEST_SCHEMA, core),
78
- });
79
- }
3
+ verifyWorkbenchBatchPlan,
4
+ buildWorkbenchBatchItemRequest,
5
+ verifyWorkbenchHumanDecisionResponse,
6
+ buildWorkbenchExecutionItem,
7
+ buildWorkbenchBatchExecution,
8
+ } from "./evolution-workbench-review-protocol.js";
9
+ import { capturePruningData as captureData } from "./governed-wiki-pruning-journal.js";
10
+ export {
11
+ EVOLUTION_WORKBENCH_BATCH_ITEM_REQUEST_SCHEMA,
12
+ EVOLUTION_WORKBENCH_BATCH_EXECUTION_SCHEMA,
13
+ } from "./evolution-workbench-review-protocol.js";
80
14
 
81
15
  export class EvolutionWorkbenchBatchExecutor {
82
- constructor({ tenantId, ports } = {}) {
16
+ constructor({ tenantId, ports, now = Date.now } = {}) {
83
17
  if (typeof tenantId !== "string" || tenantId.trim() === "")
84
18
  throw new TypeError("tenantId is required");
19
+ if (typeof now !== "function" || types.isProxy(now))
20
+ throw new TypeError("Workbench clock is required");
21
+ if (!ports || typeof ports !== "object" || types.isProxy(ports))
22
+ throw new TypeError("Workbench ports must be fixed own methods");
85
23
  this.tenantId = tenantId;
24
+ this._now = now;
86
25
  for (const name of [
87
26
  "loadProjection",
88
27
  "resolvePacket",
28
+ "loadExecutionItem",
89
29
  "requestHumanDecision",
30
+ "verifyHumanDecision",
31
+ "prepareDecision",
90
32
  "retainDecision",
91
33
  "commitExecutionItem",
92
34
  ]) {
93
- if (typeof ports?.[name] !== "function")
35
+ const method = Object.getOwnPropertyDescriptor(ports, name)?.value;
36
+ if (typeof method !== "function" || types.isProxy(method))
94
37
  throw new TypeError(
95
38
  `Workbench batch executor port ${name} is required`,
96
39
  );
97
- this[`_${name}`] = ports[name].bind(ports);
40
+ this[`_${name}`] = method.bind(ports);
98
41
  }
42
+ Object.freeze(this);
99
43
  }
100
44
 
101
45
  async execute(input) {
102
- const plan = verifyPlan(input, this.tenantId);
103
- const projection = await this._loadProjection({
104
- tenantId: this.tenantId,
105
- projectionDigest: plan.sourceProjectionDigest,
106
- });
107
- filterEvolutionWorkbenchProjection(projection, { limit: 1 });
108
- if (
109
- projection.tenantId !== plan.tenantId ||
110
- projection.runId !== plan.runId ||
111
- projection.skillName !== plan.skillName ||
112
- projection.projectionDigest !== plan.sourceProjectionDigest
113
- )
114
- throw new Error("Workbench batch source projection changed");
46
+ const plan = verifyWorkbenchBatchPlan(input, this.tenantId);
47
+ const projection = captureData(
48
+ await this._loadProjection({
49
+ tenantId: this.tenantId,
50
+ projectionDigest: plan.sourceProjectionDigest,
51
+ }),
52
+ );
53
+ verifyWorkbenchBatchPlan(plan, this.tenantId, projection);
115
54
  const pending = new Map(
116
- projection.candidates
117
- .filter(({ status }) => status === "pending")
118
- .map((candidate) => [candidate.packetDigest, candidate]),
55
+ projection.candidates.map((candidate) => [
56
+ candidate.packetDigest,
57
+ candidate,
58
+ ]),
119
59
  );
120
60
  const items = [];
121
61
  for (const packetDigest of plan.packetDigests) {
122
- if (!pending.has(packetDigest))
123
- throw new Error("Workbench batch packet is no longer pending");
124
- const packet = verifySkillPromotionReviewPacketArtifact(
62
+ const packet = captureData(
125
63
  await this._resolvePacket({ tenantId: this.tenantId, packetDigest }),
126
64
  );
65
+ const request = buildWorkbenchBatchItemRequest(plan, packet);
127
66
  if (
128
- packet.packetDigest !== packetDigest ||
129
- packet.candidateId !== pending.get(packetDigest).candidateId
67
+ packet.candidateId !== pending.get(packetDigest)?.candidateId ||
68
+ packet.candidateContentDigest !==
69
+ pending.get(packetDigest)?.candidateContentDigest
130
70
  )
131
71
  throw new Error("Workbench batch packet was substituted");
132
- const request = itemRequest(plan, packet);
133
- const decision = await this._requestHumanDecision(request);
134
- const expectedDecision =
135
- plan.decision === "approve" ? "approved" : "rejected";
72
+ const stored = captureData(
73
+ await this._loadExecutionItem({ plan, request }),
74
+ );
136
75
  if (
137
- decision?.tenantId !== this.tenantId ||
138
- decision.packetDigest !== packetDigest ||
139
- decision.candidateId !== packet.candidateId ||
140
- decision.decision !== expectedDecision ||
141
- decision.automated !== false ||
142
- decision.reason !== plan.reason ||
143
- decision.requestDigest !== request.requestDigest ||
144
- !DIGEST.test(decision.receiptDigest ?? "") ||
145
- typeof decision.signature !== "string" ||
146
- decision.signature.length < 32
76
+ stored &&
77
+ !["prepared", "applied", "committed"].includes(stored.status)
147
78
  )
148
- throw new Error("Workbench batch human decision is not exactly bound");
79
+ throw new Error("Workbench execution state is invalid");
80
+ const raw =
81
+ stored?.response ?? (await this._requestHumanDecision(request));
82
+ // Historical freshness is allowed only for an effect the fixed durable
83
+ // reader has already observed. An unapplied expired approval cannot run.
84
+ const historical =
85
+ stored?.status === "applied" || stored?.status === "committed";
86
+ const response = verifyWorkbenchHumanDecisionResponse(
87
+ raw,
88
+ request,
89
+ packet,
90
+ historical ? Date.parse(raw.decision?.decidedAt) : Number(this._now()),
91
+ );
92
+ if ((await this._verifyHumanDecision({ request, response })) !== true)
93
+ throw new Error(
94
+ "Workbench human decision signature verification failed",
95
+ );
96
+ const item = buildWorkbenchExecutionItem(request, response);
97
+ if (stored?.status === "committed") {
98
+ if (stored.item?.itemDigest !== item.itemDigest)
99
+ throw new Error("Workbench durable execution item differs");
100
+ items.push(item);
101
+ continue;
102
+ }
103
+ if (!stored) {
104
+ const prepared = await this._prepareDecision({
105
+ plan,
106
+ request,
107
+ response,
108
+ });
109
+ if (
110
+ prepared?.authenticated !== true ||
111
+ prepared.durable !== true ||
112
+ prepared.responseDigest !== response.responseDigest
113
+ )
114
+ throw new Error("Workbench human decision was not durably prepared");
115
+ }
149
116
  const retained = await this._retainDecision({
117
+ plan,
150
118
  packetDigest,
151
- decision,
119
+ decision: response.decision,
120
+ request,
121
+ response,
152
122
  });
153
123
  if (
154
124
  retained?.persisted !== true ||
155
- retained.receiptDigest !== decision.receiptDigest
125
+ retained.receiptDigest !== response.decision.receiptDigest
156
126
  )
157
127
  throw new Error("Workbench batch decision was not durably retained");
158
- const itemCore = {
159
- packetDigest,
160
- requestDigest: request.requestDigest,
161
- decisionReceiptDigest: decision.receiptDigest,
162
- };
163
- const item = freeze({
164
- ...itemCore,
165
- itemDigest: hash(
166
- "chainlesschain.evolution-workbench-batch-execution-item/v1",
167
- itemCore,
168
- ),
169
- });
170
128
  const committed = await this._commitExecutionItem({
171
- tenantId: this.tenantId,
172
- planDigest: plan.planDigest,
129
+ plan,
130
+ request,
131
+ response,
173
132
  item,
174
133
  });
175
134
  if (
@@ -178,18 +137,16 @@ export class EvolutionWorkbenchBatchExecutor {
178
137
  committed.itemDigest !== item.itemDigest
179
138
  )
180
139
  throw new Error("Workbench batch execution item was not committed");
140
+ const readback = await this._loadExecutionItem({ plan, request });
141
+ if (
142
+ readback?.status !== "committed" ||
143
+ readback.item?.itemDigest !== item.itemDigest
144
+ )
145
+ throw new Error(
146
+ "Workbench batch execution item was not durably read back",
147
+ );
181
148
  items.push(item);
182
149
  }
183
- const core = {
184
- schema: EVOLUTION_WORKBENCH_BATCH_EXECUTION_SCHEMA,
185
- tenantId: this.tenantId,
186
- planDigest: plan.planDigest,
187
- sourceProjectionDigest: plan.sourceProjectionDigest,
188
- items,
189
- };
190
- return freeze({
191
- ...core,
192
- executionDigest: hash(EVOLUTION_WORKBENCH_BATCH_EXECUTION_SCHEMA, core),
193
- });
150
+ return buildWorkbenchBatchExecution(plan, captureData(items));
194
151
  }
195
152
  }
@@ -0,0 +1,203 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { types } from "node:util";
3
+ import { captureWorkbenchFileResources } from "./evolution-workbench-file-resources.js";
4
+ import { captureSkillCandidateRegistryReader } from "./skill-candidate-registry.js";
5
+ import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
6
+ import { SkillPromotionController } from "./skill-promotion-controller.js";
7
+ import {
8
+ SkillMutationAuthority,
9
+ buildSkillMutationRequest,
10
+ digestSkillMutationTransitionSubject,
11
+ } from "./skill-mutation-authority.js";
12
+ import { consumeWorkbenchRollbackMutationContext } from "./evolution-workbench-rollback-ledger-adapter.js";
13
+ import {
14
+ capturePruningData as capture,
15
+ pruningCanonical as canonical,
16
+ } from "./governed-wiki-pruning-journal.js";
17
+
18
+ const RECEIPTS = [
19
+ "candidateReceipt",
20
+ "evalReceipt",
21
+ "actorReceipt",
22
+ "parentReceipt",
23
+ "targetReceipt",
24
+ ];
25
+ const TTL_MS = 120_000;
26
+ function record(value, keys, label) {
27
+ if (
28
+ !value ||
29
+ typeof value !== "object" ||
30
+ Array.isArray(value) ||
31
+ types.isProxy(value)
32
+ )
33
+ throw new TypeError(`${label} must be an own data record`);
34
+ const fields = Object.getOwnPropertyDescriptors(value);
35
+ if (
36
+ Reflect.ownKeys(fields).length !== keys.length ||
37
+ keys.some((key) => !Object.hasOwn(fields, key))
38
+ )
39
+ throw new TypeError(`${label} has missing or replaced fields`);
40
+ const output = {};
41
+ for (const key of keys) {
42
+ if (!Object.hasOwn(fields[key], "value") || !fields[key].enumerable)
43
+ throw new TypeError(`${label}.${key} must be an own data field`);
44
+ output[key] = fields[key].value;
45
+ }
46
+ return output;
47
+ }
48
+ function fixed(owner, name) {
49
+ if (!owner || typeof owner !== "object" || types.isProxy(owner))
50
+ throw new TypeError(`Workbench ${name} port is required`);
51
+ const fn = Object.getOwnPropertyDescriptor(owner, name)?.value;
52
+ if (typeof fn !== "function" || types.isProxy(fn))
53
+ throw new TypeError(`Workbench ${name} fixed own method is required`);
54
+ return Object.freeze({ [name]: fn.bind(owner) });
55
+ }
56
+ function same(a, b) {
57
+ return canonical(a) === canonical(b);
58
+ }
59
+ function fail(message) {
60
+ throw new Error(`Workbench mutation: ${message}`);
61
+ }
62
+
63
+ /**
64
+ * Real same-Ledger mutation authority and a rollback-only controller surface.
65
+ * External receipt sources supply artifacts; independent principal/receipt
66
+ * verifiers decide authority. No identity, receipt, approval or key is invented.
67
+ */
68
+ export function createEvolutionWorkbenchControlPorts(input) {
69
+ const options = record(
70
+ input,
71
+ [
72
+ "descriptor",
73
+ "fileResources",
74
+ "candidateRegistry",
75
+ "principalResolver",
76
+ "receiptVerifier",
77
+ "rollbackReceiptSource",
78
+ ],
79
+ "Workbench control options",
80
+ );
81
+ const { runtimeResources: r, mutationPorts } = captureWorkbenchFileResources(
82
+ options.fileResources,
83
+ );
84
+ const descriptor = capture(options.descriptor);
85
+ if (!same(descriptor, r.descriptor))
86
+ fail("descriptor differs from file resources");
87
+ const candidate = captureSkillCandidateRegistryReader(
88
+ options.candidateRegistry,
89
+ );
90
+ if (candidate.tenantId !== descriptor.tenantId)
91
+ fail("candidate tenant differs");
92
+ const primary = captureSkillReleaseRegistryReader(r.releaseRegistry);
93
+ const verifier = captureSkillReleaseRegistryReader(r.verifierReleaseRegistry);
94
+ const principalResolver = fixed(options.principalResolver, "resolve");
95
+ const receiptVerifier = fixed(options.receiptVerifier, "verify");
96
+ const receiptSource = fixed(options.rollbackReceiptSource, "resolve");
97
+ if (
98
+ options.rollbackReceiptSource === options.receiptVerifier ||
99
+ options.rollbackReceiptSource.resolve === options.receiptVerifier.verify
100
+ )
101
+ fail("receipt source and verifier must be independent ports");
102
+ const authority = new SkillMutationAuthority({
103
+ principalResolver,
104
+ receiptVerifier,
105
+ ...mutationPorts,
106
+ now: r.now,
107
+ });
108
+ const controller = new SkillPromotionController({
109
+ candidateRegistry: options.candidateRegistry,
110
+ releaseRegistry: r.releaseRegistry,
111
+ authority,
112
+ });
113
+
114
+ function current(expected, deadline = expected.expiresAt) {
115
+ if (Number(r.now()) >= Date.parse(deadline)) fail("authorization expired");
116
+ const active = primary.readActive(descriptor.skillName);
117
+ if (!active || !same(active, verifier.readActive(descriptor.skillName)))
118
+ fail("independent active states differ");
119
+ const target = primary.readRelease(expected.targetReleaseDigest);
120
+ if (!same(target, verifier.readRelease(expected.targetReleaseDigest)))
121
+ fail("independent target bytes differ");
122
+ if (
123
+ expected.tenantId !== descriptor.tenantId ||
124
+ expected.skillName !== descriptor.skillName ||
125
+ expected.operation !== "rollback" ||
126
+ expected.targetScope !== "active" ||
127
+ active.state.stateDigest !== expected.expectedActiveStateDigest ||
128
+ active.state.revision !== expected.expectedTargetRevision ||
129
+ active.release.releaseDigest !== expected.fromReleaseDigest ||
130
+ active.release.contentDigest !== expected.expectedTargetDigest ||
131
+ active.state.lastKnownGoodReleaseDigest !==
132
+ expected.targetReleaseDigest ||
133
+ target.tenantId !== descriptor.tenantId ||
134
+ target.skillName !== descriptor.skillName ||
135
+ target.dependencyLockDigest !== expected.dependencyLockDigest ||
136
+ digestSkillMutationTransitionSubject({
137
+ tenantId: descriptor.tenantId,
138
+ skillName: descriptor.skillName,
139
+ operation: "rollback",
140
+ candidateId: null,
141
+ rollbackTargetReleaseDigest: target.releaseDigest,
142
+ dependencyLockDigest: target.dependencyLockDigest,
143
+ expectedActiveContentDigest: active.release.contentDigest,
144
+ expectedActiveRevision: active.state.revision,
145
+ }) !== expected.transitionSubjectDigest
146
+ )
147
+ fail("current release no longer matches the exact prepared rollback");
148
+ }
149
+
150
+ const authorizationProvider = Object.freeze({
151
+ async authorizeRollback(input) {
152
+ const expected = consumeWorkbenchRollbackMutationContext(
153
+ input,
154
+ r.releaseRegistry,
155
+ r.ledger,
156
+ descriptor,
157
+ );
158
+ current(expected);
159
+ const mutation = capture({
160
+ tenantId: descriptor.tenantId,
161
+ audience: descriptor.audience,
162
+ operationId: expected.operationId,
163
+ operation: "rollback",
164
+ skillName: descriptor.skillName,
165
+ targetScope: "active",
166
+ expectedTargetDigest: expected.expectedTargetDigest,
167
+ expectedTargetRevision: expected.expectedTargetRevision,
168
+ transitionSubjectDigest: expected.transitionSubjectDigest,
169
+ expiresAt: new Date(
170
+ Math.min(Number(r.now()) + TTL_MS, Date.parse(expected.expiresAt)),
171
+ ).toISOString(),
172
+ nonce: randomBytes(32).toString("hex"),
173
+ });
174
+ const supplied = await receiptSource.resolve(
175
+ capture({
176
+ mutation,
177
+ planDigest: expected.planDigest,
178
+ authorizationReceiptDigest: expected.authorizationReceiptDigest,
179
+ policyReceipt: expected.policyReceipt,
180
+ fromReleaseDigest: expected.fromReleaseDigest,
181
+ targetReleaseDigest: expected.targetReleaseDigest,
182
+ }),
183
+ );
184
+ const receipts = record(
185
+ supplied,
186
+ RECEIPTS,
187
+ "Workbench rollback receipt source",
188
+ );
189
+ const request = buildSkillMutationRequest({
190
+ ...mutation,
191
+ receipts: { ...receipts, policyReceipt: expected.policyReceipt },
192
+ });
193
+ current(expected, request.expiresAt);
194
+ const capability = await authority.authorize(request);
195
+ current(expected, request.expiresAt);
196
+ return Object.freeze({ request, capability });
197
+ },
198
+ });
199
+ return Object.freeze({
200
+ rollbackProvider: controller.createRollbackProvider(),
201
+ authorizationProvider,
202
+ });
203
+ }