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,607 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readFile, realpath } from "node:fs/promises";
3
+ import { lstatSync, readFileSync, realpathSync } from "node:fs";
4
+ import { dirname, isAbsolute, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ import executionBroker from "../process-execution-broker/index.js";
8
+ import { isEvolutionEvalChildEvidenceStore } from "./evolution-eval-child-evidence-ledger-adapter.js";
9
+
10
+ import {
11
+ buildEvolutionEvalAttestationDigest,
12
+ computeEvolutionEvalIsolatedTargetDigest,
13
+ computeEvolutionEvalSignedEvidenceDigest,
14
+ computeEvolutionEvalSupervisedResultDigest,
15
+ computeEvolutionEvalTargetAuthorityDigest,
16
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES,
17
+ EVOLUTION_EVAL_SUPERVISION_SCHEMA,
18
+ EVOLUTION_EVAL_TARGET_INVOCATION_SCHEMA,
19
+ EVOLUTION_EVAL_TARGET_REVOCATION_SCHEMA,
20
+ } from "./evolution-eval-gate.js";
21
+
22
+ const WORKER = fileURLToPath(
23
+ new URL("./evolution-eval-process-supervisor-worker.mjs", import.meta.url),
24
+ );
25
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
26
+ const MAX_OUTPUT_BYTES = 1024 * 1024;
27
+ const DEFAULT_MEMORY_LIMIT_MB = 128;
28
+ const MIN_MEMORY_LIMIT_MB = 32;
29
+ const MAX_MEMORY_LIMIT_MB = 1024;
30
+ const MAX_PERMISSION_PATHS = 32;
31
+ const PROCESS_SUPERVISORS = new WeakSet();
32
+
33
+ function canonical(value) {
34
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
35
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
36
+ return `{${Object.keys(value)
37
+ .sort()
38
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
39
+ .join(",")}}`;
40
+ }
41
+
42
+ function sha(bytes) {
43
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
44
+ }
45
+
46
+ function jsonClone(value, label) {
47
+ let encoded;
48
+ let cloned;
49
+ try {
50
+ encoded = JSON.stringify(value);
51
+ cloned = JSON.parse(encoded);
52
+ } catch (cause) {
53
+ throw new TypeError(`${label} must be JSON data`, { cause });
54
+ }
55
+ if (!encoded || Buffer.byteLength(encoded) > MAX_OUTPUT_BYTES)
56
+ throw new TypeError(`${label} exceeds 1 MiB`);
57
+ if (canonical(cloned) !== canonical(value))
58
+ throw new TypeError(`${label} contains non-JSON values`);
59
+ return cloned;
60
+ }
61
+
62
+ function digest(value, label) {
63
+ if (!DIGEST.test(value ?? "")) throw new TypeError(`${label} is invalid`);
64
+ return value;
65
+ }
66
+
67
+ function timestamp(clock) {
68
+ const value = clock();
69
+ const date = value instanceof Date ? value : new Date(value);
70
+ if (!Number.isFinite(date.getTime()))
71
+ throw new TypeError("supervisor clock is invalid");
72
+ return date.toISOString();
73
+ }
74
+
75
+ async function moduleSnapshot(path, expectedDigest) {
76
+ const info = await lstat(path);
77
+ if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1)
78
+ throw new Error(
79
+ "evaluation target module is not a single-link regular file",
80
+ );
81
+ const physical = await realpath(path);
82
+ const bytes = await readFile(physical);
83
+ if (bytes.length < 1 || bytes.length > MAX_OUTPUT_BYTES)
84
+ throw new Error("evaluation target module exceeds 1 MiB");
85
+ if (sha(bytes) !== expectedDigest)
86
+ throw new Error(
87
+ "evaluation target module bytes differ from its descriptor",
88
+ );
89
+ return Object.freeze({
90
+ physical,
91
+ size: bytes.length,
92
+ digest: expectedDigest,
93
+ moduleUrl: `data:text/javascript;base64,${bytes.toString("base64")}`,
94
+ });
95
+ }
96
+
97
+ function moduleSnapshotSync(path, expectedDigest) {
98
+ const info = lstatSync(path);
99
+ if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1)
100
+ throw new Error(
101
+ "evaluation target module is not a single-link regular file",
102
+ );
103
+ const physical = realpathSync(path);
104
+ const bytes = readFileSync(physical);
105
+ if (bytes.length < 1 || bytes.length > MAX_OUTPUT_BYTES)
106
+ throw new Error("evaluation target module exceeds 1 MiB");
107
+ if (sha(bytes) !== expectedDigest)
108
+ throw new Error(
109
+ "evaluation target module bytes differ from its descriptor",
110
+ );
111
+ return Object.freeze({
112
+ physical,
113
+ size: bytes.length,
114
+ digest: expectedDigest,
115
+ moduleUrl: `data:text/javascript;base64,${bytes.toString("base64")}`,
116
+ });
117
+ }
118
+
119
+ function sandboxPolicy(value) {
120
+ if (value === undefined) value = {};
121
+ if (!value || typeof value !== "object" || Array.isArray(value))
122
+ throw new TypeError("process target sandboxPolicy must be an object");
123
+ const keys = Object.keys(value);
124
+ if (keys.some((key) => !["fsRead", "fsWrite", "memoryLimitMb"].includes(key)))
125
+ throw new TypeError("process target sandboxPolicy contains unknown fields");
126
+ const normalizePaths = (paths, label) => {
127
+ if (paths === undefined) return Object.freeze([]);
128
+ if (!Array.isArray(paths) || paths.length > MAX_PERMISSION_PATHS)
129
+ throw new TypeError(`${label} must be a bounded array`);
130
+ const normalized = paths.map((path) => {
131
+ if (typeof path !== "string" || !isAbsolute(path))
132
+ throw new TypeError(`${label} paths must be absolute`);
133
+ return resolve(path);
134
+ });
135
+ if (new Set(normalized).size !== normalized.length)
136
+ throw new TypeError(`${label} paths must be unique`);
137
+ return Object.freeze(normalized);
138
+ };
139
+ const memoryLimitMb = value.memoryLimitMb ?? DEFAULT_MEMORY_LIMIT_MB;
140
+ if (
141
+ !Number.isSafeInteger(memoryLimitMb) ||
142
+ memoryLimitMb < MIN_MEMORY_LIMIT_MB ||
143
+ memoryLimitMb > MAX_MEMORY_LIMIT_MB
144
+ )
145
+ throw new TypeError("process target memoryLimitMb is out of bounds");
146
+ return Object.freeze({
147
+ fsRead: normalizePaths(value.fsRead, "sandboxPolicy.fsRead"),
148
+ fsWrite: normalizePaths(value.fsWrite, "sandboxPolicy.fsWrite"),
149
+ memoryLimitMb,
150
+ });
151
+ }
152
+
153
+ function workerArguments(policy) {
154
+ return Object.freeze([
155
+ `--max-old-space-size=${policy.memoryLimitMb}`,
156
+ // Node 22.12 is the supported release baseline. The stable --permission
157
+ // alias was added later; the experimental spelling remains accepted by
158
+ // both the baseline and newer supported Node releases.
159
+ "--experimental-permission",
160
+ // Node 22.12 applies read restrictions while resolving the entry module,
161
+ // so the immutable supervisor worker itself must be granted explicitly.
162
+ `--allow-fs-read=${WORKER}`,
163
+ ...policy.fsRead.map((path) => `--allow-fs-read=${path}`),
164
+ ...policy.fsWrite.map((path) => `--allow-fs-write=${path}`),
165
+ WORKER,
166
+ ]);
167
+ }
168
+
169
+ async function attest(core, purpose, authority) {
170
+ const payloadDigest = buildEvolutionEvalAttestationDigest(core, purpose);
171
+ const attestation = await authority({ purpose, payloadDigest });
172
+ return Object.freeze({
173
+ ...core,
174
+ attestation: jsonClone(attestation, "attestation"),
175
+ });
176
+ }
177
+
178
+ function processResult(child, input) {
179
+ return new Promise((resolveResult, reject) => {
180
+ let stdout = "";
181
+ let stderr = "";
182
+ let settled = false;
183
+ let completionError = null;
184
+ const rejectOnce = (error) => {
185
+ if (settled) return;
186
+ settled = true;
187
+ reject(error);
188
+ };
189
+ child.stdout.on("data", (chunk) => {
190
+ stdout += chunk.toString("utf8");
191
+ if (!completionError && Buffer.byteLength(stdout) > MAX_OUTPUT_BYTES) {
192
+ completionError = new Error("evaluation target stdout exceeds 1 MiB");
193
+ child.kill("SIGKILL");
194
+ }
195
+ });
196
+ child.stderr.on("data", (chunk) => {
197
+ stderr += chunk.toString("utf8");
198
+ if (!completionError && Buffer.byteLength(stderr) > MAX_OUTPUT_BYTES) {
199
+ completionError = new Error("evaluation target stderr exceeds 1 MiB");
200
+ child.kill("SIGKILL");
201
+ }
202
+ });
203
+ child.once("error", rejectOnce);
204
+ child.once("close", (code, signal) => {
205
+ if (settled) return;
206
+ if (completionError) {
207
+ rejectOnce(completionError);
208
+ return;
209
+ }
210
+ if (code !== 0) {
211
+ rejectOnce(
212
+ new Error(
213
+ `evaluation target exited ${code ?? "null"}/${signal ?? "none"}: ${stderr.slice(0, 512)}`,
214
+ ),
215
+ );
216
+ return;
217
+ }
218
+ try {
219
+ const lines = stdout.trimEnd().split("\n");
220
+ if (lines.length !== 1)
221
+ throw new Error("target returned multiple records");
222
+ const message = JSON.parse(lines[0]);
223
+ if (message?.ok !== true || Object.keys(message).length !== 2)
224
+ throw new Error("target returned an invalid record");
225
+ settled = true;
226
+ resolveResult(jsonClone(message.value, "evaluation target result"));
227
+ } catch (cause) {
228
+ rejectOnce(
229
+ new Error("evaluation target response is invalid", { cause }),
230
+ );
231
+ }
232
+ });
233
+ child.stdin.once("error", (error) => {
234
+ completionError ??= error;
235
+ });
236
+ child.stdin.end(JSON.stringify(input));
237
+ });
238
+ }
239
+
240
+ export function createEvolutionEvalProcessSupervisor({
241
+ targets,
242
+ authorityDescriptor,
243
+ supervisorRevision,
244
+ invocationRevision,
245
+ revocationRevision,
246
+ attestSupervisor,
247
+ attestInvocation,
248
+ attestRevocation,
249
+ verifyEnforcement,
250
+ clock = Date.now,
251
+ spawnProcess = (...args) => executionBroker.spawn(...args),
252
+ fallbackSupervisor = null,
253
+ childEvidenceStore = null,
254
+ } = {}) {
255
+ if (!(targets instanceof Map) || targets.size < 1 || targets.size > 256)
256
+ throw new TypeError("process supervisor targets must be a bounded Map");
257
+ if (
258
+ typeof attestSupervisor !== "function" ||
259
+ typeof attestInvocation !== "function" ||
260
+ typeof attestRevocation !== "function" ||
261
+ typeof verifyEnforcement !== "function" ||
262
+ typeof clock !== "function" ||
263
+ typeof spawnProcess !== "function"
264
+ )
265
+ throw new TypeError("process supervisor authority ports are required");
266
+ if (typeof supervisorRevision !== "string" || supervisorRevision.length < 1)
267
+ throw new TypeError("supervisorRevision is required");
268
+ if (
269
+ typeof invocationRevision !== "string" ||
270
+ invocationRevision.length < 1 ||
271
+ typeof revocationRevision !== "string" ||
272
+ revocationRevision.length < 1
273
+ )
274
+ throw new TypeError("invocation and revocation revisions are required");
275
+ const registry = new Map();
276
+ for (const [handlerId, entry] of targets) {
277
+ if (
278
+ typeof handlerId !== "string" ||
279
+ entry?.target?.handlerId !== handlerId ||
280
+ entry.target.isolation !== "process" ||
281
+ typeof entry.exportName !== "string" ||
282
+ !/^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(entry.exportName) ||
283
+ typeof entry.modulePath !== "string" ||
284
+ !isAbsolute(entry.modulePath)
285
+ )
286
+ throw new TypeError(`process target is invalid: ${handlerId}`);
287
+ digest(entry.target.handlerArtifactDigest, "target handlerArtifactDigest");
288
+ const snapshot = moduleSnapshotSync(
289
+ resolve(entry.modulePath),
290
+ entry.target.handlerArtifactDigest,
291
+ );
292
+ registry.set(
293
+ handlerId,
294
+ Object.freeze({
295
+ target: Object.freeze(structuredClone(entry.target)),
296
+ exportName: entry.exportName,
297
+ snapshot,
298
+ sandboxPolicy: sandboxPolicy(entry.sandboxPolicy),
299
+ }),
300
+ );
301
+ }
302
+ const active = new Map();
303
+ const processTargetDigests = new Set(
304
+ [...registry.values()].map(({ target }) =>
305
+ computeEvolutionEvalIsolatedTargetDigest(target),
306
+ ),
307
+ );
308
+ if (
309
+ fallbackSupervisor !== null &&
310
+ (!fallbackSupervisor ||
311
+ typeof fallbackSupervisor.run !== "function" ||
312
+ typeof fallbackSupervisor.invokeTarget !== "function" ||
313
+ typeof fallbackSupervisor.revokeTarget !== "function")
314
+ )
315
+ throw new TypeError("fallbackSupervisor contract is invalid");
316
+ let durableEvidence = null;
317
+ if (childEvidenceStore !== null) {
318
+ const storeDescriptor = childEvidenceStore?.descriptor;
319
+ if (
320
+ !isEvolutionEvalChildEvidenceStore(childEvidenceStore) ||
321
+ typeof childEvidenceStore?.retain !== "function" ||
322
+ typeof childEvidenceStore?.resolve !== "function" ||
323
+ typeof storeDescriptor?.tenantId !== "string" ||
324
+ typeof storeDescriptor.streamId !== "string" ||
325
+ typeof storeDescriptor.authorityId !== "string" ||
326
+ !Number.isSafeInteger(storeDescriptor.revision) ||
327
+ !DIGEST.test(storeDescriptor.handlerArtifactDigest ?? "")
328
+ ) {
329
+ throw new TypeError("childEvidenceStore contract is invalid");
330
+ }
331
+ durableEvidence = Object.freeze({
332
+ descriptor: Object.freeze(structuredClone(storeDescriptor)),
333
+ retain: childEvidenceStore.retain.bind(childEvidenceStore),
334
+ resolve: childEvidenceStore.resolve.bind(childEvidenceStore),
335
+ });
336
+ }
337
+
338
+ async function persistEvidence(kind, evidence, purpose) {
339
+ if (!durableEvidence) return evidence;
340
+ const receiptDigest = computeEvolutionEvalSignedEvidenceDigest(
341
+ evidence,
342
+ purpose,
343
+ );
344
+ const acknowledgement = await durableEvidence.retain({
345
+ kind,
346
+ evidence,
347
+ receiptDigest,
348
+ });
349
+ if (
350
+ acknowledgement?.authenticated !== true ||
351
+ acknowledgement.durable !== true ||
352
+ acknowledgement.kind !== kind ||
353
+ acknowledgement.receiptDigest !== receiptDigest
354
+ ) {
355
+ throw new Error("child evidence retention was not durably confirmed");
356
+ }
357
+ const resolution = await durableEvidence.resolve({
358
+ tenantId: durableEvidence.descriptor.tenantId,
359
+ kind,
360
+ receiptDigest,
361
+ });
362
+ if (
363
+ resolution?.authenticated !== true ||
364
+ resolution.durable !== true ||
365
+ resolution.authorityId !== durableEvidence.descriptor.authorityId ||
366
+ resolution.revision !== durableEvidence.descriptor.revision ||
367
+ resolution.handlerArtifactDigest !==
368
+ durableEvidence.descriptor.handlerArtifactDigest ||
369
+ resolution.tenantId !== durableEvidence.descriptor.tenantId ||
370
+ resolution.streamId !== durableEvidence.descriptor.streamId ||
371
+ resolution.kind !== kind ||
372
+ resolution.receiptDigest !== receiptDigest ||
373
+ canonical(resolution.evidence) !== canonical(evidence)
374
+ ) {
375
+ throw new Error("child evidence durable readback was substituted");
376
+ }
377
+ return Object.freeze(structuredClone(resolution.evidence));
378
+ }
379
+
380
+ async function invocationEvidence(request, target, result, invokedAt) {
381
+ const core = {
382
+ schema: EVOLUTION_EVAL_TARGET_INVOCATION_SCHEMA,
383
+ requestDigest: request.requestDigest,
384
+ capabilityDigest: request.capabilityDigest,
385
+ targetDigest: computeEvolutionEvalIsolatedTargetDigest(target),
386
+ handlerArtifactDigest: target.handlerArtifactDigest,
387
+ targetHandlerId: target.handlerId,
388
+ targetRevision: target.handlerRevision,
389
+ targetAuthorityDigest: computeEvolutionEvalTargetAuthorityDigest(target),
390
+ operation: target.operation,
391
+ invocationId: request.invocationId,
392
+ invokedAt,
393
+ completedAt: timestamp(clock),
394
+ resultDigest: computeEvolutionEvalSupervisedResultDigest(result),
395
+ authorityRevision: invocationRevision,
396
+ };
397
+ return persistEvidence(
398
+ "invocation",
399
+ await attest(
400
+ core,
401
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetInvocation,
402
+ attestInvocation,
403
+ ),
404
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetInvocation,
405
+ );
406
+ }
407
+
408
+ async function revokeTarget(request) {
409
+ if (!processTargetDigests.has(request.targetDigest)) {
410
+ if (fallbackSupervisor) return fallbackSupervisor.revokeTarget(request);
411
+ throw new Error("evaluation revocation target is not registered");
412
+ }
413
+ const running = active.get(request.capabilityDigest);
414
+ const wasActive = Boolean(running);
415
+ if (request.mode === "hard-terminate" && running) {
416
+ running.child.kill("SIGKILL");
417
+ await running.closed;
418
+ }
419
+ active.delete(request.capabilityDigest);
420
+ const revokedAt = request.requestedAt;
421
+ const core = {
422
+ schema: EVOLUTION_EVAL_TARGET_REVOCATION_SCHEMA,
423
+ requestDigest: request.requestDigest,
424
+ capabilityDigest: request.capabilityDigest,
425
+ targetDigest: request.targetDigest,
426
+ invocationId: request.invocationId,
427
+ mode: request.mode,
428
+ requestedAt: request.requestedAt,
429
+ revoked: true,
430
+ wasActive,
431
+ activeInvocationTerminated:
432
+ request.mode === "hard-terminate" && wasActive,
433
+ revokedAt,
434
+ terminatedAt:
435
+ request.mode === "hard-terminate" && wasActive ? revokedAt : null,
436
+ authorityRevision: revocationRevision,
437
+ };
438
+ return persistEvidence(
439
+ "revocation",
440
+ await attest(
441
+ core,
442
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetRevocation,
443
+ attestRevocation,
444
+ ),
445
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetRevocation,
446
+ );
447
+ }
448
+
449
+ async function invokeTarget(request) {
450
+ const entry = registry.get(request?.target?.handlerId);
451
+ if (!entry) {
452
+ if (fallbackSupervisor) return fallbackSupervisor.invokeTarget(request);
453
+ throw new Error("evaluation target is not in the process registry");
454
+ }
455
+ if (canonical(entry.target) !== canonical(request.target))
456
+ throw new Error(
457
+ "evaluation target is not in the captured process registry",
458
+ );
459
+ if (active.has(request.capabilityDigest))
460
+ throw new Error("evaluation capability is already active");
461
+ await moduleSnapshot(entry.snapshot.physical, entry.snapshot.digest);
462
+ const invokedAt = timestamp(clock);
463
+ const child = spawnProcess(
464
+ process.execPath,
465
+ workerArguments(entry.sandboxPolicy),
466
+ {
467
+ cwd: dirname(entry.snapshot.physical),
468
+ env: Object.freeze({}),
469
+ shell: false,
470
+ windowsHide: true,
471
+ stdio: ["pipe", "pipe", "pipe"],
472
+ origin: "evolution-eval-process-supervisor",
473
+ reason: "Execute an attested evaluation target in a killable process",
474
+ },
475
+ );
476
+ const closed = new Promise((resolveClose) =>
477
+ child.once("close", (code, signal) => resolveClose({ code, signal })),
478
+ );
479
+ active.set(request.capabilityDigest, { child, closed });
480
+ try {
481
+ const value = await processResult(child, {
482
+ moduleUrl: entry.snapshot.moduleUrl,
483
+ exportName: entry.exportName,
484
+ payload: request.payload,
485
+ });
486
+ await moduleSnapshot(entry.snapshot.physical, entry.snapshot.digest);
487
+ return Object.freeze({
488
+ value,
489
+ evidence: await invocationEvidence(
490
+ request,
491
+ entry.target,
492
+ value,
493
+ invokedAt,
494
+ ),
495
+ });
496
+ } finally {
497
+ active.delete(request.capabilityDigest);
498
+ }
499
+ }
500
+
501
+ async function supervisionReceipt(request, status, value, revocation) {
502
+ const core = {
503
+ schema: EVOLUTION_EVAL_SUPERVISION_SCHEMA,
504
+ requestDigest: request.requestDigest,
505
+ invocationNonce: request.invocationNonce,
506
+ invocationId: request.invocationId,
507
+ capabilityDigest: request.capabilityDigest,
508
+ operation: request.operation,
509
+ requestedAt: request.requestedAt,
510
+ deadlineAt: request.deadlineAt,
511
+ payloadDigest: request.payloadDigest,
512
+ targetDigest: request.targetDigest,
513
+ targetHandlerId: request.targetHandlerId,
514
+ targetRevision: request.targetRevision,
515
+ targetAuthorityDigest: request.targetAuthorityDigest,
516
+ completedAt:
517
+ status === "terminated" ? request.deadlineAt : timestamp(clock),
518
+ status,
519
+ isolation: "process",
520
+ hardDeadlineEnforced: true,
521
+ lateSideEffectsPrevented: true,
522
+ invocationCount: 1,
523
+ capabilityRevoked: true,
524
+ resultDigest:
525
+ status === "completed"
526
+ ? computeEvolutionEvalSupervisedResultDigest(value)
527
+ : null,
528
+ targetInvocationDigest:
529
+ status === "completed" ? revocation.targetInvocationDigest : null,
530
+ revocationDigest: revocation.revocationDigest,
531
+ revocationMode: revocation.revocationMode,
532
+ wasActive: revocation.wasActive,
533
+ activeInvocationTerminated: revocation.activeInvocationTerminated,
534
+ terminatedAt: revocation.terminatedAt,
535
+ supervisorRevision,
536
+ };
537
+ return attest(
538
+ core,
539
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.supervisor,
540
+ attestSupervisor,
541
+ );
542
+ }
543
+
544
+ const supervisor = Object.freeze({
545
+ authorityDescriptor: Object.freeze(structuredClone(authorityDescriptor)),
546
+ invokeTarget,
547
+ revokeTarget,
548
+ verifyEnforcement,
549
+ async run(request, capability) {
550
+ if (!registry.has(request.targetHandlerId)) {
551
+ if (fallbackSupervisor)
552
+ return fallbackSupervisor.run(request, capability);
553
+ throw new Error("evaluation supervision target is not registered");
554
+ }
555
+ const remaining =
556
+ new Date(request.deadlineAt).getTime() -
557
+ new Date(timestamp(clock)).getTime();
558
+ if (!Number.isFinite(remaining) || remaining <= 0)
559
+ throw new Error("process supervision deadline is exhausted");
560
+ let timer;
561
+ const timeout = new Promise((resolveTimeout) => {
562
+ timer = setTimeout(() => resolveTimeout({ timedOut: true }), remaining);
563
+ });
564
+ const invocation = Promise.resolve()
565
+ .then(() => capability.invoke(Object.freeze({})))
566
+ .then(
567
+ (value) => ({ timedOut: false, value }),
568
+ (error) => ({ timedOut: false, error }),
569
+ );
570
+ const result = await Promise.race([invocation, timeout]);
571
+ clearTimeout(timer);
572
+ if (result.timedOut) {
573
+ const revocation = await capability.revoke({ mode: "hard-terminate" });
574
+ await invocation;
575
+ return {
576
+ value: null,
577
+ receipt: await supervisionReceipt(
578
+ request,
579
+ "terminated",
580
+ null,
581
+ revocation,
582
+ ),
583
+ };
584
+ }
585
+ if (result.error) throw result.error;
586
+ const revocation = await capability.revoke({ mode: "completed-release" });
587
+ return {
588
+ value: result.value.value,
589
+ receipt: await supervisionReceipt(
590
+ request,
591
+ "completed",
592
+ result.value.value,
593
+ {
594
+ ...revocation,
595
+ targetInvocationDigest: result.value.targetInvocationDigest,
596
+ },
597
+ ),
598
+ };
599
+ },
600
+ });
601
+ PROCESS_SUPERVISORS.add(supervisor);
602
+ return supervisor;
603
+ }
604
+
605
+ export function isEvolutionEvalProcessSupervisor(value) {
606
+ return PROCESS_SUPERVISORS.has(value);
607
+ }
@@ -337,6 +337,7 @@ export class EvolutionEvidenceArtifactAdapter {
337
337
  #purpose;
338
338
  #ttlMs;
339
339
  #project;
340
+ #projectAgentModel;
340
341
  #verify;
341
342
  #ports;
342
343
 
@@ -376,6 +377,11 @@ export class EvolutionEvidenceArtifactAdapter {
376
377
  );
377
378
  this.#ttlMs = ttlMs;
378
379
  this.#project = captureMethod(projector, "project", "projector");
380
+ this.#projectAgentModel = captureMethod(
381
+ projector,
382
+ "projectAgentModelRequest",
383
+ "projector",
384
+ );
379
385
  this.#verify = captureMethod(bundleVerifier, "verify", "bundleVerifier");
380
386
  this.#ports = artifactPorts;
381
387
  Object.freeze(this);
@@ -391,7 +397,14 @@ export class EvolutionEvidenceArtifactAdapter {
391
397
  }
392
398
 
393
399
  async projectAndPersist(input) {
394
- const bundle = await this.#project(input);
400
+ return this.#persist(await this.#project(input));
401
+ }
402
+
403
+ async projectAndPersistAgentModelRequest(input) {
404
+ return this.#persist(await this.#projectAgentModel(input));
405
+ }
406
+
407
+ async #persist(bundle) {
395
408
  const verification = await this.#verify(bundle);
396
409
  if (
397
410
  verification.verified !== true ||