chainlesschain 0.166.18 → 0.166.21

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 (214) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-CQSBl3hY.js → AIOps-BjMnsUci.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-IQt-vRLt.js → ActionButton-DdYFP03A.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DkHC8O7k.js → Analytics-Bb8TuuK_.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-CSti2P2T.js → AppLayout-Kn3TIOtk.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-C57hxn3v.js → Artifacts-4IxpqI_b.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-DByLntcf.js → Audit-BOV2caqU.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-D1Bd2EOa.js → BackgroundAgents-B86k-ay4.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-VstHzHng.js → Backup-C5_ie1e3.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CLhdexIf.js → BaseInput-xpwg6QCW.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-BefC_JZS.js → Chat-CVZOcZau.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DbXMvgmn.js → ChatBubbleRenderer-D8fPYhUu.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-CEY982vx.js → Checkbox-MKTq3zdP.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-Dcm_DTvJ.js → Codegen-JUk3wzep.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-C8SSu4KA.js → Col-JPvTA0kC.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-BVV9vwRR.js → Community-Tqgl87NQ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-B7c5Vo18.js → Compact-BuAFYBmN.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Tq9jSZ5a.js → Compliance-CXS9WIPZ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BJUjT09Q.js → Cowork-Ds2bFHrr.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CjV9PEaS.js → Cron-C_dV_OeW.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-Dl7ReL8F.js → Crosschain-BsO6tIRo.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-CG8PjWmM.js → DID-rNOFqBac.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CDBM6wmF.js → Dashboard-C2fcKKVY.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-8_55bXTD.js → Dropdown-Y7Ndr0X_.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-D3qOU1Cm.js → EmailListRenderer-DcP_uPmL.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bv5oWMZF.js → FamilyGuardDashboard-Cwn3gDzk.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-hpZ1xkKd.js → Federation-ClQuOsqb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-BN7GT191.js → FormItemContext-DfwtmlcK.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-PCRhfA7M.js → GenericCardRenderer-zNZhtbC5.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CIlP2vy7.js → Git-BZmdW-G5.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-81lgm7YL.js → Governance-CqBk4lEn.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-Cs24xMOV.js → Inference-Dbmt3ZXk.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-CrJLVCZo.js → KnowledgeGraph-hMTH6qf3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DLyO8RKT.js → Logs-CkiYgiW2.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-DBOqijrP.js → MarkdownRenderer-BL1FElXg.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-Dz7AbQZc.js → Marketplace-CbB6wfin.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BM0aFiWv.js → McpTools-BSwiFtte.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-C9SJzENX.js → Memory-B03PeHrz.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BO2HnNRk.js → MobileBridge-CRGrnd-X.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-CK_jMz0l.js → MobileProjects-CE_5v2kO.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-CfhrJsdO.js → Mtc-Dp11QVx1.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-BE2ELxgI.js → MtcAudit-CYu-3JBu.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-CgR_E3Jd.js → Multisig-CGyJ0Xl3.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Cw9445_K.js → NLProgramming-CoWi_ov1.js} +1 -1
  45. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +7 -0
  46. package/src/assets/web-panel/assets/{NotificationSettings-DxHVh4uT.js → NotificationSettings-DX4I2b4W.js} +1 -1
  47. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +1 -0
  48. package/src/assets/web-panel/assets/{Organization-pPXJtWo4.js → Organization-oopLO_tk.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-YamdTJwA.js → Overflow-BFVvjMyf.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-BvqP53x7.js → P2P-CBy5t-Tk.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Blz1Xn2n.js → PdhVaultBrowser--YWJNsu6.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CgFRQqFJ.js → Permissions-C2dZ8scb.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CFeo3-6O.js → PersonalDataHub-Bs3l7Hlx.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-BkaRojEK.js → Pipeline-DEBWbZuD.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-BNZEx2Qp.js → Privacy-CjHBb6NU.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-HUBOgEEK.js → ProjectInit-D2WipUz5.js} +2 -2
  57. package/src/assets/web-panel/assets/ProjectSettings-B6WfnrGB.js +2 -0
  58. package/src/assets/web-panel/assets/{Projects-Dc517BXp.js → Projects-FF_thRi6.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-DTLf8bgj.js → Providers-CCv5M_Dv.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-BBNjPszk.js → QrScannerModal-CGthxU54.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-DCsHvk3G.js → QuickAsk-CnPmXPFb.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-Dpr5YSop.js → Recommend-Df_tGEa9.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DmKnvqGg.js → RemoteSession-Z58N0Loe.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CSRfuurX.js → Reputation-CZTBQ2Vt.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-CDj3pQ_w.js → Row-CdK3YpCQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-DI0a_kNq.js → RssFeed-CFMVT5sb.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-jAy7B2nU.js → Search-DrF8RIvD.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CkHTqYhc.js → Security-Ddk2f2DM.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-CP-0Nzga.js → Services-CCuK-VOo.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-BkF5-p3n.js → Skeleton-DxCpHzeM.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BDu-utDE.js → Skills-t2oTDgcv.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-CQvq_2Qb.js → Sla-Df63M9_R.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-T7Ap512g.js → SpeechSettings-l7ox6KuX.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-Bt-PLvot.js → SyncSettings-COd_tgPp.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-yLEcCogg.js → Tasks-CzDCcrik.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-ByN3fmbr.js → Templates-D-vfxTGA.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DBI7hITH.js → Tenant-BlpT_Gxc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B77_DlGX.js → Terminal-D5rq52Hg.js} +2 -2
  79. package/src/assets/web-panel/assets/TimelineRenderer-DdoMndkK.js +1 -0
  80. package/src/assets/web-panel/assets/{Tokens-BV2N6cR8.js → Tokens-BhgBsI6g.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-CjXWGH3p.js → Trigger-DwwzoikZ.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-uqXIq3WC.js → Trust-HkTpzXFb.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-D-6qu4vY.js → UkeySign-D9nk6Ehe.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-CxGmx_2e.js → VideoEditing-BKk0rfoy.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DSq7WlAg.js → Wallet-IVWIU_Lq.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-CDBiD57O.js → WebAuthn-CFTCpfsG.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-Z8f63TSb.js → WorkflowEditor-Dnf4Obif.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-B-UZFBjy.js → chat-D2snERdj.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-CFk7K-7Q.js → colors-DKEjK1N1.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-X0IVMvgi.js → compact-item-BEDLwQdt.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DWg4j2n6.js → createContext-DA9iW1a0.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-CkVCwNNF.js → hasIn-5l2xEcY9.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BipwEbTA.js → index-5pW4t1iD.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-5OcZHdzc.js → index-7P1b8HZo.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Cvwu_rA_.js → index-B00GeekA.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CbIAWbma.js → index-B4QYBliR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CNKFsBlz.js → index-B7_W_rYd.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BoskgPt9.js → index-BO9dQjpt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CvOa-IFV.js → index-BZ5lY2zx.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-_-9k3Tna.js → index-B_eCoZgW.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CbihMThv.js → index-BgfImyZI.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DLSBks8h.js → index-Bq5P3piS.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-LU54bChK.js → index-Bqc8tdIF.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Btqk6zWb.js → index-C7sKbM5s.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D8uEL8Uw.js → index-CGlotREA.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CLlP1E4X.js → index-CRPrHE7h.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DeWKPQGs.js → index-CX1x4AFn.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Db_5xhrU.js → index-CbTPvp2_.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CDfSD07S.js → index-CjWltbi_.js} +1 -1
  111. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +1 -0
  112. package/src/assets/web-panel/assets/{index-BPBia4b-.js → index-CkMKuqUs.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C1ZAOJRW.js → index-CmruhzFi.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-P83LDnCz.js → index-Csfb-7hw.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DcDggpWR.js → index-CxEtQYdi.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-OjnAwUJo.js → index-D7z4zB_a.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D-EJNxgR.js → index-DLoalqRX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B3-B3FWD.js → index-DU2TXJu-.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-D92g4l3n.js → index-DXet1xol.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Ca0mij1n.js → index-Dbd7eEex.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DCqpl_E_.js → index-Dbkghqn_.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DyWlOuak.js → index-Dg2a9owQ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CUBkvFPH.js → index-DpqtbXdE.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DhVHoqGL.js → index-DqwPFbOb.js} +3 -3
  125. package/src/assets/web-panel/assets/{index-BG-GaZri.js → index-DvV03Ayk.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CMCEXBRh.js → index-NJieh3T1.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-B273IY-E.js → index-Td8ZwyoC.js} +1 -1
  128. package/src/assets/web-panel/assets/index-c8jJEHVs.js +1 -0
  129. package/src/assets/web-panel/assets/{index-BzXjYUmd.js → index-e-e40id6.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CCLwoATF.js → index-fccZmC_h.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CN8HZlLH.js → index-fgYk0QXO.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BB4KHHcv.js → index-yYEQXYaU.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-CFNgY8lJ.js → initDefaultProps-CPrcB1TC.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-D-5RrDzn.js → motion-BQ7mWRh_.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-DN-L0Bd-.js → move-CzOEq99p.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-6mgLSeCK.js → mtc-parser-BlQI5jrw.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-ClWW8eTP.js → omit-DlW4gxmv.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-Vystq3R8.js → pickAttrs-BBYms5nP.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-D0H9hK4W.js → placementArrow-az2MPJ_7.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-B3iNRU-a.js → responsiveObserve-D1-ibEol.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-CiMXe6am.js → slide-DHGqa4GA.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-CGDZJ1uT.js → statusUtils-CYGDo6lD.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-D2zA6NkY.js → styleChecker-Cl2EM9K6.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-C1sYU6QE.js → useFlexGapSupport-DdYhzuv1.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BzUHSjg2.js → useFs-DWumPuBW.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CxB5yZCq.js → usePersonalDataHub-DxAO-Aqi.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BfUfMwtc.js → vnode-CplsQf_N.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-CFYmj1TO.js → zoom-Cw5HXNSG.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +2 -2
  151. package/src/commands/agent.js +19 -1
  152. package/src/commands/evolution-knowledge.js +54 -0
  153. package/src/commands/evolution-workbench.js +83 -0
  154. package/src/commands/evolution.js +6 -1
  155. package/src/commands/serve.js +16 -0
  156. package/src/commands/skill.js +158 -16
  157. package/src/data/changelog.json +26 -0
  158. package/src/gateways/ws/session-protocol.js +2 -0
  159. package/src/gateways/ws/ws-agent-handler.js +124 -69
  160. package/src/gateways/ws/ws-server.js +19 -0
  161. package/src/generated/cc-agent-protocol.schema.json +7 -1
  162. package/src/harness/jsonl-session-store.js +25 -1
  163. package/src/index.js +1 -1
  164. package/src/lib/app-server/cli-agent-kernel-adapter.js +8 -0
  165. package/src/lib/app-server/graph-runtime.js +40 -1
  166. package/src/lib/app-server/server.js +181 -3
  167. package/src/lib/app-server/websocket-transport.js +2 -0
  168. package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +17 -0
  169. package/src/lib/evolution/agent-evolution-runtime-composition.js +165 -1
  170. package/src/lib/evolution/controlled-skill-production-pilot.js +912 -0
  171. package/src/lib/evolution/evolution-artifact-ports.js +21 -0
  172. package/src/lib/evolution/evolution-raw-crypto-shred.js +185 -0
  173. package/src/lib/evolution/evolution-workbench-batch-executor.js +195 -0
  174. package/src/lib/evolution/evolution-workbench-cli-host.js +169 -0
  175. package/src/lib/evolution/evolution-workbench-metrics-ledger-adapter.js +648 -0
  176. package/src/lib/evolution/evolution-workbench-metrics.js +943 -0
  177. package/src/lib/evolution/evolution-workbench-projection.js +734 -0
  178. package/src/lib/evolution/evolution-workbench-version-control.js +272 -0
  179. package/src/lib/evolution/governed-knowledge-conflict-merge.js +352 -0
  180. package/src/lib/evolution/governed-knowledge-dependency-authority.js +273 -0
  181. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +646 -0
  182. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +644 -0
  183. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +282 -0
  184. package/src/lib/evolution/governed-knowledge-node-crypto-authority.js +348 -0
  185. package/src/lib/evolution/governed-knowledge-rbac-approval-authority.js +621 -0
  186. package/src/lib/evolution/governed-knowledge-review-host.js +249 -0
  187. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +643 -0
  188. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +259 -0
  189. package/src/lib/evolution/governed-knowledge-sync.js +485 -0
  190. package/src/lib/evolution/governed-knowledge-trust-ledger.js +707 -0
  191. package/src/lib/evolution/governed-skill-marketplace.js +430 -0
  192. package/src/lib/evolution/governed-wiki-pruning.js +435 -0
  193. package/src/lib/evolution/skill-outcome-index-authority.js +268 -0
  194. package/src/lib/evolution/skill-outcome-source-catalog-authority.js +237 -0
  195. package/src/lib/public-ide-capability-manifest.js +4 -0
  196. package/src/lib/skill-outcome-authority.js +43 -0
  197. package/src/lib/skill-outcome-transcript-authority.js +252 -0
  198. package/src/lib/skill-retrieval-router-benchmark.js +135 -0
  199. package/src/lib/skill-retrieval-router.js +235 -0
  200. package/src/lib/skill-vector-authority.js +325 -0
  201. package/src/lib/skill-vector-process-authority.js +386 -0
  202. package/src/repl/agent-repl.js +7 -1
  203. package/src/runtime/agent-core.js +72 -6
  204. package/src/runtime/agent-runtime.js +42 -0
  205. package/src/runtime/headless-runner.js +32 -0
  206. package/src/runtime/headless-stream.js +36 -1
  207. package/src/runtime/runtime-factory.js +62 -4
  208. package/src/assets/web-panel/assets/Notes-DZimkTrb.js +0 -7
  209. package/src/assets/web-panel/assets/OrderTableRenderer-Iy-pnX56.js +0 -1
  210. package/src/assets/web-panel/assets/ProjectSettings-CFMmhROS.js +0 -2
  211. package/src/assets/web-panel/assets/TimelineRenderer-CsLTB_QO.js +0 -1
  212. package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +0 -1
  213. package/src/assets/web-panel/assets/index-BCp2ir-1.js +0 -1
  214. package/src/assets/web-panel/assets/index-Bw4iuzRD.js +0 -1
@@ -0,0 +1,648 @@
1
+ import {
2
+ EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
3
+ isEvolutionLedgerArtifactResolver,
4
+ } from "./evolution-artifact-ports.js";
5
+ import {
6
+ EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
7
+ EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
8
+ } from "./evolution-ledger.js";
9
+ import {
10
+ createEmptyEvolutionWorkbenchMetricsSnapshot,
11
+ digestEvolutionWorkbenchMetricsRetentionBatch,
12
+ digestEvolutionWorkbenchMetricsRetentionQuery,
13
+ verifyEvolutionWorkbenchMetricsSnapshot,
14
+ } from "./evolution-workbench-metrics.js";
15
+
16
+ export const EVOLUTION_WORKBENCH_METRICS_LEDGER_EVENT =
17
+ "evolution.workbench.metrics.snapshot.committed";
18
+ export const EVOLUTION_WORKBENCH_METRICS_RETENTION_LEDGER_EVENT =
19
+ "evolution.workbench.metrics.receipts.retained";
20
+ export const EVOLUTION_WORKBENCH_METRICS_RETENTION_SCHEMA =
21
+ "chainlesschain.evolution-workbench-metrics-receipt-retention/v1";
22
+
23
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
24
+ const METRICS_LEDGER_ADAPTERS = new WeakSet();
25
+ const METRICS_OUTCOME_READERS = new WeakSet();
26
+
27
+ function canonical(value) {
28
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
29
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
30
+ return `{${Object.keys(value)
31
+ .sort()
32
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
33
+ .join(",")}}`;
34
+ }
35
+
36
+ function hash(domain, value) {
37
+ return `sha256:${createHash("sha256")
38
+ .update(domain)
39
+ .update("\0")
40
+ .update(canonical(value))
41
+ .digest("hex")}`;
42
+ }
43
+
44
+ function string(value, label) {
45
+ if (typeof value !== "string" || value.trim() === "") {
46
+ throw new TypeError(`${label} is required`);
47
+ }
48
+ return value;
49
+ }
50
+
51
+ function capture(owner, method, label) {
52
+ if (typeof owner?.[method] !== "function") {
53
+ throw new TypeError(`${label}.${method}() is required`);
54
+ }
55
+ return (...args) => Reflect.apply(owner[method], owner, args);
56
+ }
57
+
58
+ function descriptor(input) {
59
+ return Object.freeze({
60
+ tenantId: string(input?.tenantId, "tenantId"),
61
+ artifactTenantId: string(input?.artifactTenantId, "artifactTenantId"),
62
+ evolutionRunId: string(input?.evolutionRunId, "evolutionRunId"),
63
+ skillName: string(input?.skillName, "skillName"),
64
+ audience: string(input?.audience, "audience"),
65
+ purpose: string(input?.purpose, "purpose"),
66
+ });
67
+ }
68
+
69
+ function fail(message) {
70
+ throw new Error(message);
71
+ }
72
+
73
+ function verifyRetentionSegment(value, expected) {
74
+ if (
75
+ value?.schema !== EVOLUTION_WORKBENCH_METRICS_RETENTION_SCHEMA ||
76
+ value.tenantId !== expected.tenantId ||
77
+ value.evolutionRunId !== expected.evolutionRunId ||
78
+ value.skillName !== expected.skillName ||
79
+ !Number.isSafeInteger(value.priorRetainedReceiptCount) ||
80
+ value.priorRetainedReceiptCount < 0 ||
81
+ !Number.isSafeInteger(value.retainedReceiptCount) ||
82
+ !Array.isArray(value.receiptDigests) ||
83
+ value.receiptDigests.length < 1 ||
84
+ value.receiptDigests.length > 10_000 ||
85
+ new Set(value.receiptDigests).size !== value.receiptDigests.length ||
86
+ value.receiptDigests.some((item) => !DIGEST.test(item)) ||
87
+ value.receiptDigests.join("\n") !==
88
+ [...value.receiptDigests].sort().join("\n") ||
89
+ value.retainedReceiptCount !==
90
+ value.priorRetainedReceiptCount + value.receiptDigests.length ||
91
+ (value.priorRetentionRootDigest !== null &&
92
+ !DIGEST.test(value.priorRetentionRootDigest ?? "")) ||
93
+ typeof value.throughAt !== "string" ||
94
+ !Number.isFinite(Date.parse(value.throughAt)) ||
95
+ !DIGEST.test(value.batchDigest ?? "") ||
96
+ !DIGEST.test(value.retentionRootDigest ?? "")
97
+ ) {
98
+ fail("Workbench metrics retention segment is invalid");
99
+ }
100
+ if (
101
+ value.batchDigest !==
102
+ digestEvolutionWorkbenchMetricsRetentionBatch({
103
+ tenantId: value.tenantId,
104
+ evolutionRunId: value.evolutionRunId,
105
+ skillName: value.skillName,
106
+ priorRetentionRootDigest: value.priorRetentionRootDigest,
107
+ priorRetainedReceiptCount: value.priorRetainedReceiptCount,
108
+ throughAt: value.throughAt,
109
+ receiptDigests: value.receiptDigests,
110
+ })
111
+ ) {
112
+ fail("Workbench metrics retention batch digest is invalid");
113
+ }
114
+ const core = structuredClone(value);
115
+ delete core.retentionRootDigest;
116
+ if (
117
+ value.retentionRootDigest !==
118
+ hash(EVOLUTION_WORKBENCH_METRICS_RETENTION_SCHEMA, core)
119
+ ) {
120
+ fail("Workbench metrics retention root digest is invalid");
121
+ }
122
+ return Object.freeze(structuredClone(value));
123
+ }
124
+
125
+ export class EvolutionWorkbenchMetricsLedgerAdapter {
126
+ constructor({
127
+ descriptor: input,
128
+ artifactPorts,
129
+ ledger,
130
+ ledgerArtifactResolver,
131
+ } = {}) {
132
+ this.descriptor = descriptor(input);
133
+ this._putCanonical = capture(
134
+ artifactPorts,
135
+ "putCanonical",
136
+ "artifactPorts",
137
+ );
138
+ this._readLedger = capture(ledger, "read", "ledger");
139
+ this._verifyLedger = capture(ledger, "verify", "ledger");
140
+ this._appendDomainEvent = capture(ledger, "appendDomainEvent", "ledger");
141
+ if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)) {
142
+ throw new TypeError(
143
+ "a branded EvolutionArtifactPorts ledger resolver is required",
144
+ );
145
+ }
146
+ this._resolveArtifact = ledgerArtifactResolver;
147
+ METRICS_LEDGER_ADAPTERS.add(this);
148
+ Object.freeze(this);
149
+ }
150
+
151
+ _eventsOf(type) {
152
+ const events = this._readLedger();
153
+ if (!Array.isArray(events))
154
+ fail("Workbench metrics ledger read is invalid");
155
+ return events.filter(
156
+ (event) =>
157
+ event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
158
+ event.type === type &&
159
+ event.tenantId === this.descriptor.tenantId &&
160
+ event.correlationId === this.descriptor.evolutionRunId &&
161
+ event.skillName === this.descriptor.skillName,
162
+ );
163
+ }
164
+
165
+ _events() {
166
+ return this._eventsOf(EVOLUTION_WORKBENCH_METRICS_LEDGER_EVENT);
167
+ }
168
+
169
+ _retentionEvents() {
170
+ return this._eventsOf(EVOLUTION_WORKBENCH_METRICS_RETENTION_LEDGER_EVENT);
171
+ }
172
+
173
+ _resolveRecord(event, expectedType) {
174
+ const authority = this._verifyLedger();
175
+ const resolution = this._resolveArtifact({
176
+ epoch: authority.epoch,
177
+ ledgerId: authority.ledgerId,
178
+ ref: event.subjectRef,
179
+ tenantId: this.descriptor.artifactTenantId,
180
+ });
181
+ if (
182
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
183
+ resolution.authenticated !== true ||
184
+ resolution.found !== true ||
185
+ resolution.ref !== event.subjectRef.ref ||
186
+ resolution.digest !== event.subjectRef.digest ||
187
+ !Buffer.isBuffer(resolution.bytes)
188
+ ) {
189
+ fail("Workbench metrics artifact resolution is invalid");
190
+ }
191
+ let record;
192
+ try {
193
+ record = JSON.parse(resolution.bytes.toString("utf8"));
194
+ } catch {
195
+ fail("Workbench metrics artifact is not canonical JSON");
196
+ }
197
+ if (
198
+ record?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
199
+ record.tenantId !== this.descriptor.artifactTenantId ||
200
+ record.audience !== this.descriptor.audience ||
201
+ record.purpose !== this.descriptor.purpose ||
202
+ record.retention !== "ledger" ||
203
+ record.type !== expectedType
204
+ ) {
205
+ fail("Workbench metrics durable artifact binding is invalid");
206
+ }
207
+ return record.value;
208
+ }
209
+
210
+ _resolve(event) {
211
+ return verifyEvolutionWorkbenchMetricsSnapshot(
212
+ this._resolveRecord(event, "evolution-workbench-metrics-snapshot"),
213
+ this.descriptor,
214
+ );
215
+ }
216
+
217
+ _latest() {
218
+ const events = this._events();
219
+ if (events.length === 0) return null;
220
+ for (let index = 1; index < events.length; index += 1) {
221
+ if (events[index].sequence <= events[index - 1].sequence) {
222
+ fail("Workbench metrics ledger order is invalid");
223
+ }
224
+ }
225
+ const event = events.at(-1);
226
+ const snapshot = this._resolve(event);
227
+ if (snapshot.revision !== events.length) {
228
+ fail("Workbench metrics revision has a gap or duplicate");
229
+ }
230
+ const retention = snapshot.retentionRootDigest
231
+ ? this._retentionChain(snapshot.retentionRootDigest).at(-1)
232
+ : null;
233
+ if (
234
+ (retention?.segment.retainedReceiptCount ?? 0) !==
235
+ (snapshot.retainedReceiptCount ?? 0)
236
+ ) {
237
+ fail("Workbench metrics snapshot retention binding is invalid");
238
+ }
239
+ return { event, snapshot };
240
+ }
241
+
242
+ _retentionChain(rootDigest = null) {
243
+ if (rootDigest === null) return [];
244
+ if (!DIGEST.test(rootDigest))
245
+ fail("Workbench metrics retention root is invalid");
246
+ const events = this._retentionEvents();
247
+ const chain = [];
248
+ let priorRoot = null;
249
+ let priorCount = 0;
250
+ let priorSequence = 0;
251
+ const retainedDigests = new Set();
252
+ for (const event of events) {
253
+ if (event.sequence <= priorSequence) {
254
+ fail("Workbench metrics retention ledger order is invalid");
255
+ }
256
+ priorSequence = event.sequence;
257
+ const segment = verifyRetentionSegment(
258
+ this._resolveRecord(
259
+ event,
260
+ "evolution-workbench-metrics-receipt-retention",
261
+ ),
262
+ this.descriptor,
263
+ );
264
+ if (
265
+ segment.priorRetentionRootDigest !== priorRoot ||
266
+ segment.priorRetainedReceiptCount !== priorCount
267
+ ) {
268
+ fail("Workbench metrics retention lineage is discontinuous");
269
+ }
270
+ for (const value of segment.receiptDigests) {
271
+ if (retainedDigests.has(value)) {
272
+ fail("Workbench metrics retention replayed a receipt digest");
273
+ }
274
+ retainedDigests.add(value);
275
+ }
276
+ chain.push({ event, segment });
277
+ priorRoot = segment.retentionRootDigest;
278
+ priorCount = segment.retainedReceiptCount;
279
+ if (priorRoot === rootDigest) return chain;
280
+ }
281
+ fail("Workbench metrics retention root was not found");
282
+ }
283
+
284
+ loadSnapshot = () => {
285
+ const latest = this._latest();
286
+ return latest
287
+ ? Object.freeze({
288
+ found: true,
289
+ authenticated: true,
290
+ durable: true,
291
+ snapshot: latest.snapshot,
292
+ })
293
+ : Object.freeze({ found: false, authenticated: true, durable: true });
294
+ };
295
+
296
+ loadOutcomeSnapshot = () => {
297
+ const loaded = this.loadSnapshot();
298
+ const authority = this._verifyLedger();
299
+ return Object.freeze({
300
+ ...loaded,
301
+ descriptor: this.descriptor,
302
+ ledgerAuthority: Object.freeze({
303
+ schema: authority.schema,
304
+ status: authority.status,
305
+ authenticated: authority.authenticated,
306
+ durable: authority.durable,
307
+ ledgerId: authority.ledgerId,
308
+ identityDigest: authority.identityDigest,
309
+ headDigest: authority.headDigest,
310
+ sequence: authority.sequence,
311
+ eventCount: authority.eventCount,
312
+ witnessId: authority.witnessId,
313
+ witnessGeneration: authority.witnessGeneration,
314
+ witnessDigest: authority.witnessDigest,
315
+ }),
316
+ });
317
+ };
318
+
319
+ createOutcomeReader = () => {
320
+ const reader = Object.freeze({
321
+ loadOutcomeSnapshot: this.loadOutcomeSnapshot,
322
+ });
323
+ METRICS_OUTCOME_READERS.add(reader);
324
+ return reader;
325
+ };
326
+
327
+ retainReceiptDigests = (request = {}) => {
328
+ const receiptDigests = Array.isArray(request.receiptDigests)
329
+ ? [...request.receiptDigests].sort()
330
+ : [];
331
+ if (
332
+ request.tenantId !== this.descriptor.tenantId ||
333
+ request.evolutionRunId !== this.descriptor.evolutionRunId ||
334
+ request.skillName !== this.descriptor.skillName ||
335
+ !Number.isSafeInteger(request.priorRetainedReceiptCount) ||
336
+ request.priorRetainedReceiptCount < 0 ||
337
+ (request.priorRetentionRootDigest !== null &&
338
+ !DIGEST.test(request.priorRetentionRootDigest ?? "")) ||
339
+ typeof request.throughAt !== "string" ||
340
+ !Number.isFinite(Date.parse(request.throughAt)) ||
341
+ receiptDigests.length < 1 ||
342
+ receiptDigests.length > 10_000 ||
343
+ new Set(receiptDigests).size !== receiptDigests.length ||
344
+ receiptDigests.some((item) => !DIGEST.test(item)) ||
345
+ !Number.isSafeInteger(
346
+ request.priorRetainedReceiptCount + receiptDigests.length,
347
+ )
348
+ ) {
349
+ throw new TypeError("Workbench metrics retention request is invalid");
350
+ }
351
+ const batch = {
352
+ tenantId: this.descriptor.tenantId,
353
+ evolutionRunId: this.descriptor.evolutionRunId,
354
+ skillName: this.descriptor.skillName,
355
+ priorRetentionRootDigest: request.priorRetentionRootDigest,
356
+ priorRetainedReceiptCount: request.priorRetainedReceiptCount,
357
+ throughAt: request.throughAt,
358
+ receiptDigests,
359
+ };
360
+ const batchDigest = digestEvolutionWorkbenchMetricsRetentionBatch(batch);
361
+ const retentionEvents = this._retentionEvents();
362
+ const latest = retentionEvents.length
363
+ ? this._retentionChain(
364
+ verifyRetentionSegment(
365
+ this._resolveRecord(
366
+ retentionEvents.at(-1),
367
+ "evolution-workbench-metrics-receipt-retention",
368
+ ),
369
+ this.descriptor,
370
+ ).retentionRootDigest,
371
+ ).at(-1)
372
+ : null;
373
+ if (
374
+ (latest?.segment.retentionRootDigest ?? null) !==
375
+ request.priorRetentionRootDigest ||
376
+ (latest?.segment.retainedReceiptCount ?? 0) !==
377
+ request.priorRetainedReceiptCount
378
+ ) {
379
+ if (
380
+ latest?.segment.priorRetentionRootDigest ===
381
+ request.priorRetentionRootDigest &&
382
+ latest.segment.priorRetainedReceiptCount ===
383
+ request.priorRetainedReceiptCount &&
384
+ latest.segment.batchDigest === batchDigest
385
+ ) {
386
+ return Object.freeze({
387
+ authenticated: true,
388
+ durable: true,
389
+ recovered: true,
390
+ priorRetentionRootDigest: request.priorRetentionRootDigest,
391
+ retainedReceiptCount: latest.segment.retainedReceiptCount,
392
+ retentionRootDigest: latest.segment.retentionRootDigest,
393
+ batchDigest,
394
+ });
395
+ }
396
+ fail("Workbench metrics retention CAS conflict");
397
+ }
398
+ if (latest) {
399
+ const retained = new Set(
400
+ this._retentionChain(latest.segment.retentionRootDigest).flatMap(
401
+ ({ segment }) => segment.receiptDigests,
402
+ ),
403
+ );
404
+ if (receiptDigests.some((value) => retained.has(value))) {
405
+ fail("Workbench metrics retention source replayed a receipt");
406
+ }
407
+ }
408
+ const segmentCore = {
409
+ schema: EVOLUTION_WORKBENCH_METRICS_RETENTION_SCHEMA,
410
+ ...batch,
411
+ batchDigest,
412
+ retainedReceiptCount:
413
+ request.priorRetainedReceiptCount + receiptDigests.length,
414
+ };
415
+ const segment = Object.freeze({
416
+ ...segmentCore,
417
+ retentionRootDigest: hash(
418
+ EVOLUTION_WORKBENCH_METRICS_RETENTION_SCHEMA,
419
+ segmentCore,
420
+ ),
421
+ });
422
+ const head = this._verifyLedger();
423
+ const published = this._putCanonical(
424
+ "evolution-workbench-metrics-receipt-retention",
425
+ segment,
426
+ {
427
+ audience: this.descriptor.audience,
428
+ purpose: this.descriptor.purpose,
429
+ retention: "ledger",
430
+ },
431
+ );
432
+ if (
433
+ !published?.ref ||
434
+ published.receipt?.persisted !== true ||
435
+ published.receipt?.readbackVerified !== true ||
436
+ published.receipt?.integrityVerified !== true ||
437
+ published.receipt?.retention !== "ledger"
438
+ ) {
439
+ fail("Workbench metrics retention artifact was not durably read back");
440
+ }
441
+ const eventId = `workbench.metrics.retention.${segment.retentionRootDigest.slice("sha256:".length)}`;
442
+ const receipt = this._appendDomainEvent(
443
+ {
444
+ artifactTenantId: this.descriptor.artifactTenantId,
445
+ correlationId: this.descriptor.evolutionRunId,
446
+ decision: "committed",
447
+ eventId,
448
+ reason: `${receiptDigests.length} Workbench receipt digests retained`,
449
+ skillName: this.descriptor.skillName,
450
+ sourceRefs: latest ? [latest.event.subjectRef] : [],
451
+ subjectRef: published.ref,
452
+ tenantId: this.descriptor.tenantId,
453
+ timestamp: request.throughAt,
454
+ type: EVOLUTION_WORKBENCH_METRICS_RETENTION_LEDGER_EVENT,
455
+ },
456
+ { expectedHeadDigest: head.headDigest, expectedSequence: head.sequence },
457
+ );
458
+ if (
459
+ receipt?.authenticated !== true ||
460
+ receipt.committed !== true ||
461
+ receipt.durable !== true ||
462
+ receipt.eventId !== eventId ||
463
+ !DIGEST.test(receipt.receiptDigest ?? "")
464
+ ) {
465
+ fail("Workbench metrics retention ledger append was not durable");
466
+ }
467
+ const stored = this._retentionChain(segment.retentionRootDigest).at(-1);
468
+ if (stored?.segment.retentionRootDigest !== segment.retentionRootDigest) {
469
+ fail("Workbench metrics retention readback differs after commit");
470
+ }
471
+ return Object.freeze({
472
+ authenticated: true,
473
+ durable: true,
474
+ recovered: false,
475
+ priorRetentionRootDigest: request.priorRetentionRootDigest,
476
+ retainedReceiptCount: segment.retainedReceiptCount,
477
+ retentionRootDigest: segment.retentionRootDigest,
478
+ batchDigest,
479
+ ledgerReceiptDigest: receipt.receiptDigest,
480
+ });
481
+ };
482
+
483
+ queryRetainedReceiptDigests = (request = {}) => {
484
+ if (
485
+ request.tenantId !== this.descriptor.tenantId ||
486
+ request.evolutionRunId !== this.descriptor.evolutionRunId ||
487
+ request.skillName !== this.descriptor.skillName ||
488
+ !DIGEST.test(request.retentionRootDigest ?? "") ||
489
+ !Array.isArray(request.receiptDigests) ||
490
+ request.receiptDigests.length > 10_000 ||
491
+ request.receiptDigests.some((item) => !DIGEST.test(item))
492
+ ) {
493
+ throw new TypeError("Workbench metrics retention query is invalid");
494
+ }
495
+ const retained = new Set();
496
+ for (const { segment } of this._retentionChain(
497
+ request.retentionRootDigest,
498
+ )) {
499
+ for (const value of segment.receiptDigests) retained.add(value);
500
+ }
501
+ return Object.freeze({
502
+ authenticated: true,
503
+ durable: true,
504
+ retentionRootDigest: request.retentionRootDigest,
505
+ queryDigest: digestEvolutionWorkbenchMetricsRetentionQuery(request),
506
+ matches: Object.freeze(
507
+ request.receiptDigests.map((value) => retained.has(value)),
508
+ ),
509
+ });
510
+ };
511
+
512
+ commitSnapshot = ({ expectedSnapshotDigest, snapshot } = {}) => {
513
+ if (!DIGEST.test(expectedSnapshotDigest ?? "")) {
514
+ throw new TypeError("expectedSnapshotDigest is invalid");
515
+ }
516
+ const verified = verifyEvolutionWorkbenchMetricsSnapshot(
517
+ snapshot,
518
+ this.descriptor,
519
+ );
520
+ const latest = this._latest();
521
+ const current =
522
+ latest?.snapshot ??
523
+ createEmptyEvolutionWorkbenchMetricsSnapshot(
524
+ this.descriptor.tenantId,
525
+ this.descriptor.evolutionRunId,
526
+ this.descriptor.skillName,
527
+ );
528
+ if (current.snapshotDigest !== expectedSnapshotDigest) {
529
+ if (latest?.snapshot.snapshotDigest === verified.snapshotDigest) {
530
+ return Object.freeze({
531
+ authenticated: true,
532
+ durable: true,
533
+ recovered: true,
534
+ snapshotDigest: verified.snapshotDigest,
535
+ });
536
+ }
537
+ fail("Workbench metrics snapshot CAS conflict");
538
+ }
539
+ if (
540
+ verified.revision !== current.revision + 1 ||
541
+ verified.priorSnapshotDigest !== current.snapshotDigest
542
+ ) {
543
+ fail("Workbench metrics snapshot does not extend current state");
544
+ }
545
+ const retention = verified.retentionRootDigest
546
+ ? this._retentionChain(verified.retentionRootDigest).at(-1)
547
+ : null;
548
+ if (
549
+ (retention?.segment.retainedReceiptCount ?? 0) !==
550
+ (verified.retainedReceiptCount ?? 0)
551
+ ) {
552
+ fail("Workbench metrics snapshot retention binding is invalid");
553
+ }
554
+ const head = this._verifyLedger();
555
+ const published = this._putCanonical(
556
+ "evolution-workbench-metrics-snapshot",
557
+ verified,
558
+ {
559
+ audience: this.descriptor.audience,
560
+ purpose: this.descriptor.purpose,
561
+ retention: "ledger",
562
+ },
563
+ );
564
+ if (
565
+ !published?.ref ||
566
+ published.receipt?.persisted !== true ||
567
+ published.receipt?.readbackVerified !== true ||
568
+ published.receipt?.integrityVerified !== true ||
569
+ published.receipt?.retention !== "ledger"
570
+ ) {
571
+ fail("Workbench metrics artifact was not durably read back");
572
+ }
573
+ const eventId = `workbench.metrics.${verified.snapshotDigest.slice("sha256:".length)}`;
574
+ const receipt = this._appendDomainEvent(
575
+ {
576
+ artifactTenantId: this.descriptor.artifactTenantId,
577
+ correlationId: this.descriptor.evolutionRunId,
578
+ decision: "committed",
579
+ eventId,
580
+ reason: `Workbench metrics revision ${verified.revision} committed`,
581
+ skillName: this.descriptor.skillName,
582
+ sourceRefs: [
583
+ ...(latest ? [latest.event.subjectRef] : []),
584
+ ...(retention ? [retention.event.subjectRef] : []),
585
+ ],
586
+ subjectRef: published.ref,
587
+ tenantId: this.descriptor.tenantId,
588
+ timestamp: verified.throughAt,
589
+ type: EVOLUTION_WORKBENCH_METRICS_LEDGER_EVENT,
590
+ },
591
+ { expectedHeadDigest: head.headDigest, expectedSequence: head.sequence },
592
+ );
593
+ if (
594
+ receipt?.authenticated !== true ||
595
+ receipt.committed !== true ||
596
+ receipt.durable !== true ||
597
+ receipt.eventId !== eventId ||
598
+ !DIGEST.test(receipt.receiptDigest ?? "")
599
+ ) {
600
+ fail("Workbench metrics ledger append was not durable");
601
+ }
602
+ const stored = this._latest();
603
+ if (stored?.snapshot.snapshotDigest !== verified.snapshotDigest) {
604
+ fail("Workbench metrics ledger readback differs after commit");
605
+ }
606
+ return Object.freeze({
607
+ authenticated: true,
608
+ durable: true,
609
+ recovered: false,
610
+ snapshotDigest: verified.snapshotDigest,
611
+ ledgerReceiptDigest: receipt.receiptDigest,
612
+ });
613
+ };
614
+
615
+ aggregatorPorts({ readReceiptDelta } = {}) {
616
+ if (typeof readReceiptDelta !== "function") {
617
+ throw new TypeError("readReceiptDelta is required");
618
+ }
619
+ return Object.freeze({
620
+ loadSnapshot: this.loadSnapshot,
621
+ readReceiptDelta,
622
+ commitSnapshot: this.commitSnapshot,
623
+ retainReceiptDigests: this.retainReceiptDigests,
624
+ queryRetainedReceiptDigests: this.queryRetainedReceiptDigests,
625
+ });
626
+ }
627
+
628
+ backfillPorts({ readReceiptHistory } = {}) {
629
+ if (typeof readReceiptHistory !== "function") {
630
+ throw new TypeError("readReceiptHistory is required");
631
+ }
632
+ return Object.freeze({
633
+ loadSnapshot: this.loadSnapshot,
634
+ readReceiptHistory,
635
+ commitSnapshot: this.commitSnapshot,
636
+ queryRetainedReceiptDigests: this.queryRetainedReceiptDigests,
637
+ });
638
+ }
639
+ }
640
+
641
+ export function isEvolutionWorkbenchMetricsLedgerAdapter(value) {
642
+ return METRICS_LEDGER_ADAPTERS.has(value);
643
+ }
644
+
645
+ export function isEvolutionWorkbenchMetricsOutcomeReader(value) {
646
+ return METRICS_OUTCOME_READERS.has(value);
647
+ }
648
+ import { createHash } from "node:crypto";