chainlesschain 0.166.65 → 0.166.69

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 (200) hide show
  1. package/README.md +20 -12
  2. package/package.json +4 -4
  3. package/src/assets/web-panel/assets/{AIOps-Byz17CTN.js → AIOps-FhevRfL6.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-C5LiW2-J.js → ActionButton-rOeOykx5.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D1INcvZF.js → Analytics-BK_wYlfz.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DZzHO1VV.js → AppLayout-_2cCtZKV.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-WfYQL6Ia.js → Artifacts-D5MSvVzk.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DohBoGWO.js → Audit-yd-Ah-A3.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-Chtk-Hde.js → BackgroundAgents-yCaw_Gu_.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-B813PuMz.js → Backup-G3ADD4N-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DaDdWWgK.js → BaseInput-ByDhkLbF.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-D4pJ6oZ7.js → Chat-BMrc7qjz.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-nA7n0I6S.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-Clo9TvO6.js → Checkbox-BHYgyZWA.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-uejLg8Ih.js → Codegen-DJfcy0jC.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-B7nbx-iJ.js → Col-C27zROxc.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-FEyjPK1j.js → Community-CuS5tq_1.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-B6Fk0Kn6.js → Compact-BrYJNe7Q.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BQG8goUl.js → Compliance-8hfahYHT.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CbBeEfHp.js → Cowork-DdE0n2lp.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-DPzlFcEZ.js → Cron-CUq3aSiX.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-B8pWJrbg.js → Crosschain-BM4XSPWG.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-gGQHUlFN.js → DID-CdaBY57N.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2TMFHrn.js → Dashboard-Cwtd52So.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BVPxGbll.js → Dropdown-BvlObh6U.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-CNPxs0hd.js → EmailListRenderer-e3fLhjnX.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-_XTiB7q1.js → EvolutionSettings-CTtk1Zo8.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-UyE3VWtI.js → FamilyGuardDashboard-BpPJUnCU.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CLt6FHK-.js → Federation-vzjZ6_nQ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CdNQPRPw.js → FormItemContext-DEDNLhkE.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-BJ0AMhrh.js → GenericCardRenderer-DEl2Te5f.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CQnvMfOM.js → Git-BzsYQnCq.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-deYsHC-o.js → Governance-zxJs6Y8s.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-qaSck43z.js → Inference-5JUsrmF1.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-De0aJ3Ls.js → KnowledgeGraph-Br8b5Htz.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-ZtS98jCm.js → Logs-D-tubDMJ.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-In4itZX2.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Byz3xCBN.js → Marketplace-s8MmWkS9.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DOZUUW6z.js → McpTools-Wu-WRg4M.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-C33wC2hA.js → Memory-B_i-eX9w.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-zZe-T_6M.js → MobileBridge-Ca64kjVx.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CRnUIume.js → MobileProjects-Cq9AFiO4.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-C1xlRVAN.js → Mtc-DKvGmG3y.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-D0U07bIi.js → MtcAudit-BVvWx8pF.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DF8uvV3h.js → Multisig-wqeJ2O9x.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-bBPGAFlt.js → NLProgramming-DX87ysYu.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BHAaOsgg.js → Notes-ChenGdu0.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Cl0fG_rA.js → NotificationSettings-BZRa68-x.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-BEPAs8Zv.js → OrderTableRenderer-DZ6xG1M6.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-BAxSwgk5.js → Organization-BWJp4VPX.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-D68KubAu.js → Overflow-BoM4bYt5.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-bhdT17zk.js → P2P-Cvi8YV09.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-DqaO6wgH.js → PdhVaultBrowser-CNVC1NIj.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-Bq8fvkak.js → Permissions-DNd1MRjW.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BYd2JEic.js → PersonalDataHub-DGSBYZ5-.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-Csg_ja69.js → Pipeline-DkcoGMBo.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-lwxwLj4M.js → Privacy-DltwvMAW.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-BdBZkH8z.js → ProjectInit-ChYbpHg8.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-ClWgFy-K.js → ProjectSettings-B8FWiHTJ.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Bu-qj8N1.js → Projects-DuyhtSm4.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-DEjxrxw3.js → Providers-Bo18Tx_6.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-eccy-8Vi.js → QrScannerModal-6W85KlsG.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-Vx3uDvFg.js → QuickAsk-DznRUedP.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CfUivNps.js → Recommend-CQDN3_p-.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BU4gk7GI.js → RemoteSession-CiJgokEj.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-CbPzdZ0C.js → Reputation-DexzGH7E.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-CYLrgfKA.js → Row-BgZOIvSi.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-DbY1oyuv.js → RssFeed-BWIZJ_Jr.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-QeW41K5r.js → Search-B376EwWJ.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CJxf1kLZ.js → Security-92mUR5OD.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-CFO9ySZc.js → Services-ClSEAOHk.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CQFjeQN0.js → Skeleton-DVhLbv99.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CLLB4INW.js → Skills-JTcXs_xI.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DxeLIJk0.js → Sla-DnKY9zy9.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-D4FA9KYI.js → SpeechSettings-GO1JefAH.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-C6NOkcQK.js → SyncSettings-jX5tB2St.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-LmVPWDfQ.js → Tasks-BxRBzhUc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-BdEfUoVB.js → Templates-CAVkbTG1.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-IUlESacN.js → Tenant-5Y7sHBkz.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B9pDe7sn.js → Terminal-CbbLShYb.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-ZCwB-Pki.js → TimelineRenderer-2HptWihL.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-4qk16LX1.js → Tokens-B-jGxzHl.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-jXNyargn.js → Trigger-9DGa90DT.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D13PydtT.js → Trust-BSJEkEOO.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-yPgws6mS.js → UkeySign-C807So5R.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-B329WjpG.js → VideoEditing-ByiieAv-.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-T8VM-Ttm.js → Wallet-BixbIOUv.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-XuRibrpP.js → WebAuthn-z7akhor4.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-D1Gwz3YR.js → WorkflowEditor-KvijuUuR.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-DjydtnT-.js → chat-BYKoh0YG.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-gFtBvPrr.js → colors-CLT8IYBt.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-CndxhGfx.js → compact-item-DlBIyYHF.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DnfGpd0L.js → createContext-5XmAnNLr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BmcCIHwY.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CmT5hRVW.js → hasIn-rPdRhm7K.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DoBKSzqu.js → index-8un-eUDI.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DGbKeg8G.js → index-B-0nAxf5.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DreYqebI.js → index-B1VfBUPB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-zQf599Uq.js → index-BBt2CSAx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BlTcxT_L.js → index-BDtlwjSr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CqpR0Des.js → index-BIRl2Ii5.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C3HvYeA3.js → index-BgevTkUv.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B0WFjxWs.js → index-Bve7Wsgf.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BNHdO6Jr.js → index-Bzd0sFkp.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DV2PR3Fa.js → index-C2sFDVb_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D2d7358Y.js → index-CErvHCDe.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DaEPE2DC.js → index-CM_a9spK.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DKyuE_Y2.js → index-CY6TMc2m.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BVM_w30N.js → index-ChlzaTV3.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CZLDbPTa.js → index-CsnbOKdI.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-HHP1zzo7.js → index-D3-NL-x-.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BFif4Cev.js → index-D3f9Jzx2.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C14jryXi.js → index-DCDSycWo.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CB27echm.js → index-DIVrVGvf.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BGlmPbl_.js → index-DI_tYFBe.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BsRKmb6k.js → index-DPS4mWnI.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BXNUTiW8.js → index-DTslLzPJ.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dbpk75MO.js → index-DW8vozBS.js} +1 -1
  119. package/src/assets/web-panel/assets/index-DY8rmd6x.js +1 -0
  120. package/src/assets/web-panel/assets/{index-DjY-3sMA.js → index-DZiSMYoD.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-DV6NrfJx.js → index-DZjGcIGU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-ktN-K1Tf.js → index-Dea32nOK.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DjcR-CwS.js → index-Djd7uqwM.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CuOx4Pbe.js → index-Dntid6oj.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BW3nWiu0.js → index-DqZU4_7J.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-C4Mqhmas.js → index-DuvweiCz.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CRqz8TtI.js → index-DzExCCLS.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D5na0B7G.js → index-LKT-Ol0A.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-_-wGLtAg.js → index-akwXS-FF.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CgMKElUh.js → index-b-rQCMkx.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DUlubR4l.js → index-eHbr3f5I.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D88-8bsB.js → index-kx6zDWew.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DuAvYTmY.js → index-rRuCGdKW.js} +1 -1
  134. package/src/assets/web-panel/assets/index-sbwcUeRS.js +1 -0
  135. package/src/assets/web-panel/assets/{initDefaultProps-KV3V-PNH.js → initDefaultProps-a8411LiK.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-PFGQg7_X.js → motion-oVcQdpCm.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Dnl79wq4.js → move-B-eyzzzL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-Bwl5JH9V.js → mtc-parser-BCYIxuG7.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-DCcTtM1l.js → omit-DuFtWiYh.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Cl6BjjDf.js → pickAttrs-CVAoJhGu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-fdqhyo42.js → placementArrow-Y2iub2bO.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DYQpmcDW.js → responsiveObserve-BHenWIVD.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-C4l-VfO4.js → slide-CKrMaL29.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DYDw_dyZ.js → statusUtils-w8eb_1da.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BEsubSMu.js → styleChecker-CCVi_Ww3.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-Cj82ggQ_.js → useFlexGapSupport-BsmR_q0r.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-B7L1eJ0V.js → useFs-a8GMBjnc.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-DVlJVD4d.js → usePersonalDataHub-BMUYSPn-.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-BBAbRN_Y.js → vnode-DL2pI31V.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BYn48q-I.js → zoom-Cbi8fISi.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +33 -7
  153. package/src/lib/dependency-install-policy.js +1 -1
  154. package/src/lib/evolution/browser-download-action-authority.js +747 -0
  155. package/src/lib/evolution/browser-download-artifact-disposal-authority.js +436 -0
  156. package/src/lib/evolution/browser-filesystem-quarantine-custody.js +2453 -0
  157. package/src/lib/evolution/browser-filesystem-quarantine-disposal.js +36 -0
  158. package/src/lib/evolution/browser-keyboard-action-authority.js +560 -0
  159. package/src/lib/evolution/browser-navigation-action-authority.js +546 -0
  160. package/src/lib/evolution/browser-quarantine-lock-maintenance-authority.js +573 -0
  161. package/src/lib/evolution/browser-quarantine-operator-revocation-authority.js +442 -0
  162. package/src/lib/evolution/browser-quarantine-retention-authority.js +503 -0
  163. package/src/lib/evolution/browser-quarantine-retention-scheduler.js +207 -0
  164. package/src/lib/evolution/browser-quarantined-download-executor.js +525 -0
  165. package/src/lib/evolution/browser-tab-open-action-authority.js +491 -0
  166. package/src/lib/evolution/browser-vision-action-authority.js +444 -0
  167. package/src/lib/evolution/browser-vision-observation-authority.js +304 -0
  168. package/src/lib/evolution/evolution-deployment-loader.js +241 -1
  169. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +5 -0
  170. package/src/lib/evolution/evolution-eval-gate.js +2 -1
  171. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +71 -9
  172. package/src/lib/evolution/evolution-eval-process-supervisor.js +276 -9
  173. package/src/lib/evolution/evolution-workbench-metrics.js +81 -21
  174. package/src/lib/evolution/pm-exploration-benchmark.js +747 -0
  175. package/src/lib/evolution/pm-exploration-budget-executor.js +106 -9
  176. package/src/lib/evolution/pm-exploration-egress-authority.js +382 -0
  177. package/src/lib/evolution/pm-exploration-evidence-bundle.js +149 -44
  178. package/src/lib/evolution/pm-exploration-execution-host.js +1254 -8
  179. package/src/lib/evolution/pm-exploration-process-grader.js +458 -0
  180. package/src/lib/evolution/pm-exploration-process-reviewer.js +456 -0
  181. package/src/lib/evolution/pm-exploration-process-runner.js +500 -0
  182. package/src/lib/evolution/pm-exploration-receipts.js +211 -11
  183. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +465 -46
  184. package/src/lib/evolution/pm-exploration-transition-committer.js +185 -34
  185. package/src/lib/evolution/skill-outcome-index-authority.js +7 -3
  186. package/src/lib/evolution/skill-writer-inventory-manifest.js +0 -39
  187. package/src/lib/evolution/volcengine-function-execution-authority.js +2949 -0
  188. package/src/lib/evolution/volcengine-function-process-executor.js +615 -0
  189. package/src/lib/evolution/volcengine-function-replay-store.js +836 -0
  190. package/src/lib/evolution/volcengine-function-revocation-status-floor-store.js +480 -0
  191. package/src/lib/governance-coverage.js +1 -1
  192. package/src/lib/headless-manifest.js +1 -1
  193. package/src/lib/protocol-replay.js +1 -1
  194. package/src/lib/skill-outcome-transcript-authority.js +45 -5
  195. package/src/runtime/agent-core.js +17 -0
  196. package/src/assets/web-panel/assets/ChatBubbleRenderer-Cf3LLgDc.js +0 -1
  197. package/src/assets/web-panel/assets/MarkdownRenderer-CTsYo9NN.js +0 -1
  198. package/src/assets/web-panel/assets/devWarning-D60SbiD-.js +0 -1
  199. package/src/assets/web-panel/assets/index-C0yR4_7h.js +0 -1
  200. package/src/assets/web-panel/assets/index-D4xuvo03.js +0 -1
@@ -0,0 +1,615 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { isProxy } from "node:util/types";
3
+
4
+ import {
5
+ buildEvolutionEvalAttestationDigest,
6
+ computeEvolutionEvalIsolatedTargetDigest,
7
+ computeEvolutionEvalSignedEvidenceDigest,
8
+ computeEvolutionEvalSupervisedResultDigest,
9
+ computeEvolutionEvalTargetAuthorityDigest,
10
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES,
11
+ EVOLUTION_EVAL_ISOLATED_TARGET_SCHEMA,
12
+ EVOLUTION_EVAL_SUPERVISION_SCHEMA,
13
+ } from "./evolution-eval-gate.js";
14
+ import { isEvolutionEvalProcessSupervisor } from "./evolution-eval-process-supervisor.js";
15
+
16
+ export const VOLCENGINE_FUNCTION_PROCESS_EXECUTOR_SCHEMA =
17
+ "chainlesschain.volcengine-function-process-executor/v1";
18
+ export const VOLCENGINE_FUNCTION_PROCESS_EVIDENCE_SCHEMA =
19
+ "chainlesschain.volcengine-function-process-evidence/v1";
20
+ export const VOLCENGINE_FUNCTION_PROCESS_OPERATION =
21
+ "volcengine-function-execute";
22
+
23
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
24
+ const ID = /^[^\p{Cc}]{1,256}$/u;
25
+ const MAX_PAYLOAD_BYTES = 1024 * 1024;
26
+ const MAX_JSON_DEPTH = 16;
27
+ const MAX_JSON_FIELDS = 2048;
28
+ const EXECUTORS = new WeakMap();
29
+ const PROCESS_RESULTS = new WeakMap();
30
+ const SUPERVISION_RECEIPT_KEYS = Object.freeze([
31
+ "schema",
32
+ "requestDigest",
33
+ "invocationNonce",
34
+ "invocationId",
35
+ "capabilityDigest",
36
+ "operation",
37
+ "requestedAt",
38
+ "deadlineAt",
39
+ "payloadDigest",
40
+ "targetDigest",
41
+ "targetHandlerId",
42
+ "targetRevision",
43
+ "targetAuthorityDigest",
44
+ "completedAt",
45
+ "status",
46
+ "isolation",
47
+ "hardDeadlineEnforced",
48
+ "lateSideEffectsPrevented",
49
+ "invocationCount",
50
+ "capabilityRevoked",
51
+ "resultDigest",
52
+ "targetInvocationDigest",
53
+ "revocationDigest",
54
+ "revocationMode",
55
+ "wasActive",
56
+ "activeInvocationTerminated",
57
+ "terminatedAt",
58
+ "supervisorRevision",
59
+ "attestation",
60
+ ]);
61
+
62
+ function canonical(value) {
63
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
64
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
65
+ return `{${Object.keys(value)
66
+ .sort()
67
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
68
+ .join(",")}}`;
69
+ }
70
+
71
+ function hash(domain, value) {
72
+ return `sha256:${createHash("sha256")
73
+ .update(domain)
74
+ .update("\0")
75
+ .update(canonical(value))
76
+ .digest("hex")}`;
77
+ }
78
+
79
+ function exact(value, keys, label) {
80
+ if (
81
+ !value ||
82
+ typeof value !== "object" ||
83
+ Array.isArray(value) ||
84
+ isProxy(value) ||
85
+ Object.getPrototypeOf(value) !== Object.prototype
86
+ ) {
87
+ throw new TypeError(`${label} must be a plain object`);
88
+ }
89
+ const actual = Reflect.ownKeys(value);
90
+ if (
91
+ actual.length !== keys.length ||
92
+ actual.some((key) => {
93
+ const field = Object.getOwnPropertyDescriptor(value, key);
94
+ return (
95
+ typeof key !== "string" ||
96
+ !keys.includes(key) ||
97
+ !field?.enumerable ||
98
+ !Object.hasOwn(field, "value")
99
+ );
100
+ })
101
+ ) {
102
+ throw new TypeError(`${label} has unexpected or accessor fields`);
103
+ }
104
+ }
105
+
106
+ function cloneJsonData(value, label, state, depth = 0) {
107
+ if (value === null || typeof value === "boolean") return value;
108
+ if (typeof value === "string") return value;
109
+ if (typeof value === "number" && Number.isFinite(value)) return value;
110
+ if (
111
+ !value ||
112
+ typeof value !== "object" ||
113
+ isProxy(value) ||
114
+ depth >= MAX_JSON_DEPTH ||
115
+ state.ancestors.has(value)
116
+ ) {
117
+ throw new TypeError(`${label} must be bounded plain JSON data`);
118
+ }
119
+ state.ancestors.add(value);
120
+ try {
121
+ const array = Array.isArray(value);
122
+ if (!array && Object.getPrototypeOf(value) !== Object.prototype)
123
+ throw new TypeError(`${label} must be bounded plain JSON data`);
124
+ const keys = Reflect.ownKeys(value);
125
+ const dataKeys = array ? keys.filter((key) => key !== "length") : keys;
126
+ state.fields += dataKeys.length;
127
+ if (state.fields > MAX_JSON_FIELDS)
128
+ throw new TypeError(`${label} must be bounded plain JSON data`);
129
+ if (
130
+ dataKeys.some((key, index) => {
131
+ const field = Object.getOwnPropertyDescriptor(value, key);
132
+ return (
133
+ typeof key !== "string" ||
134
+ (array && key !== String(index)) ||
135
+ (!array && ["__proto__", "constructor", "prototype"].includes(key)) ||
136
+ !field?.enumerable ||
137
+ !Object.hasOwn(field, "value")
138
+ );
139
+ })
140
+ ) {
141
+ throw new TypeError(`${label} must be bounded plain JSON data`);
142
+ }
143
+ if (array) {
144
+ return Object.freeze(
145
+ dataKeys.map((key) =>
146
+ cloneJsonData(
147
+ Object.getOwnPropertyDescriptor(value, key).value,
148
+ label,
149
+ state,
150
+ depth + 1,
151
+ ),
152
+ ),
153
+ );
154
+ }
155
+ const clone = {};
156
+ for (const key of dataKeys) {
157
+ clone[key] = cloneJsonData(
158
+ Object.getOwnPropertyDescriptor(value, key).value,
159
+ label,
160
+ state,
161
+ depth + 1,
162
+ );
163
+ }
164
+ return Object.freeze(clone);
165
+ } finally {
166
+ state.ancestors.delete(value);
167
+ }
168
+ }
169
+
170
+ function normalizePayload(value) {
171
+ const normalized = cloneJsonData(value, "Volcengine function request", {
172
+ ancestors: new Set(),
173
+ fields: 0,
174
+ });
175
+ if (
176
+ !normalized ||
177
+ Array.isArray(normalized) ||
178
+ Buffer.byteLength(JSON.stringify(normalized)) > MAX_PAYLOAD_BYTES
179
+ ) {
180
+ throw new TypeError("Volcengine function request is invalid");
181
+ }
182
+ return normalized;
183
+ }
184
+
185
+ function contextSignal(value) {
186
+ if (
187
+ !value ||
188
+ typeof value !== "object" ||
189
+ Array.isArray(value) ||
190
+ isProxy(value) ||
191
+ Object.getPrototypeOf(value) !== Object.prototype
192
+ ) {
193
+ throw new TypeError(
194
+ "Volcengine function process executor requires an abort signal",
195
+ );
196
+ }
197
+ const field = Object.getOwnPropertyDescriptor(value, "signal");
198
+ if (!field?.enumerable || !Object.hasOwn(field, "value"))
199
+ throw new TypeError(
200
+ "Volcengine function process executor requires an abort signal",
201
+ );
202
+ return field.value;
203
+ }
204
+
205
+ function identifier(value, label) {
206
+ if (typeof value !== "string" || !ID.test(value))
207
+ throw new TypeError(`${label} is invalid`);
208
+ return value;
209
+ }
210
+
211
+ function digest(value, label) {
212
+ if (typeof value !== "string" || !DIGEST.test(value))
213
+ throw new TypeError(`${label} must be a sha256 digest`);
214
+ return value;
215
+ }
216
+
217
+ function timestamp(now) {
218
+ const milliseconds = Number(now());
219
+ if (!Number.isSafeInteger(milliseconds) || milliseconds < 0)
220
+ throw new TypeError("Volcengine process executor clock is invalid");
221
+ return Object.freeze({
222
+ milliseconds,
223
+ iso: new Date(milliseconds).toISOString(),
224
+ });
225
+ }
226
+
227
+ function targetBinding(value) {
228
+ const targetDigest = computeEvolutionEvalIsolatedTargetDigest(value);
229
+ const targetAuthorityDigest =
230
+ computeEvolutionEvalTargetAuthorityDigest(value);
231
+ if (
232
+ value.schema !== EVOLUTION_EVAL_ISOLATED_TARGET_SCHEMA ||
233
+ value.isolation !== "process" ||
234
+ value.operation !== VOLCENGINE_FUNCTION_PROCESS_OPERATION
235
+ ) {
236
+ throw new TypeError(
237
+ "Volcengine function process executor requires a process-isolated execution target",
238
+ );
239
+ }
240
+ return Object.freeze({
241
+ target: Object.freeze(structuredClone(value)),
242
+ targetDigest,
243
+ targetAuthorityDigest,
244
+ });
245
+ }
246
+
247
+ function receiptDigest(value) {
248
+ exact(
249
+ value,
250
+ SUPERVISION_RECEIPT_KEYS,
251
+ "Volcengine function supervision receipt",
252
+ );
253
+ return computeEvolutionEvalSignedEvidenceDigest(
254
+ value,
255
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.supervisor,
256
+ );
257
+ }
258
+
259
+ function validateReceipt({ receipt, request, binding, value, status }) {
260
+ const digestValue = receiptDigest(receipt);
261
+ const { attestation, ...core } = receipt;
262
+ const requestedAt = Date.parse(request.requestedAt);
263
+ const deadlineAt = Date.parse(request.deadlineAt);
264
+ const completedAt = Date.parse(receipt.completedAt);
265
+ const completed = status === "completed";
266
+ if (
267
+ receipt.schema !== EVOLUTION_EVAL_SUPERVISION_SCHEMA ||
268
+ receipt.requestDigest !== request.requestDigest ||
269
+ receipt.invocationNonce !== request.invocationNonce ||
270
+ receipt.invocationId !== request.invocationId ||
271
+ receipt.capabilityDigest !== request.capabilityDigest ||
272
+ receipt.operation !== binding.target.operation ||
273
+ receipt.requestedAt !== request.requestedAt ||
274
+ receipt.deadlineAt !== request.deadlineAt ||
275
+ receipt.payloadDigest !== request.payloadDigest ||
276
+ receipt.targetDigest !== binding.targetDigest ||
277
+ receipt.targetHandlerId !== binding.target.handlerId ||
278
+ receipt.targetRevision !== binding.target.handlerRevision ||
279
+ receipt.targetAuthorityDigest !== binding.targetAuthorityDigest ||
280
+ !Number.isFinite(requestedAt) ||
281
+ !Number.isFinite(deadlineAt) ||
282
+ !Number.isFinite(completedAt) ||
283
+ completedAt < requestedAt ||
284
+ completedAt > deadlineAt ||
285
+ receipt.status !== status ||
286
+ receipt.isolation !== "process" ||
287
+ receipt.hardDeadlineEnforced !== true ||
288
+ receipt.lateSideEffectsPrevented !== true ||
289
+ receipt.invocationCount !== 1 ||
290
+ receipt.capabilityRevoked !== true ||
291
+ receipt.resultDigest !==
292
+ (completed ? computeEvolutionEvalSupervisedResultDigest(value) : null) ||
293
+ (completed
294
+ ? !DIGEST.test(receipt.targetInvocationDigest ?? "")
295
+ : receipt.targetInvocationDigest !== null) ||
296
+ !DIGEST.test(receipt.revocationDigest ?? "") ||
297
+ receipt.revocationMode !==
298
+ (completed ? "completed-release" : "hard-terminate") ||
299
+ receipt.wasActive !== !completed ||
300
+ receipt.activeInvocationTerminated !== !completed ||
301
+ receipt.terminatedAt !== (completed ? null : request.deadlineAt) ||
302
+ receipt.supervisorRevision !==
303
+ binding.supervisor.authorityDescriptor.handlerRevision
304
+ ) {
305
+ throw new Error(
306
+ "Volcengine function process supervision receipt is invalid",
307
+ );
308
+ }
309
+ const verified = binding.supervisor.verifyEnforcement({
310
+ purpose: EVOLUTION_EVAL_ATTESTATION_PURPOSES.supervisor,
311
+ payloadDigest: buildEvolutionEvalAttestationDigest(
312
+ core,
313
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.supervisor,
314
+ ),
315
+ attestation,
316
+ });
317
+ if (verified !== true || (verified && typeof verified.then === "function"))
318
+ throw new Error(
319
+ "Volcengine function process supervision attestation was rejected",
320
+ );
321
+ return digestValue;
322
+ }
323
+
324
+ function invocationCapability(binding, supervisionRequest, invocation) {
325
+ let revocation = null;
326
+ return Object.freeze({
327
+ async invoke() {
328
+ const result = await binding.supervisor.invokeTarget(invocation);
329
+ return Object.freeze({
330
+ value: result.value,
331
+ resultDigest: computeEvolutionEvalSupervisedResultDigest(result.value),
332
+ targetInvocationDigest: computeEvolutionEvalSignedEvidenceDigest(
333
+ result.evidence,
334
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetInvocation,
335
+ ),
336
+ });
337
+ },
338
+ async revoke({ mode, requestedAt = null }) {
339
+ if (revocation !== null) return revocation;
340
+ revocation = binding.supervisor
341
+ .revokeTarget({
342
+ requestDigest: supervisionRequest.requestDigest,
343
+ capabilityDigest: supervisionRequest.capabilityDigest,
344
+ targetDigest: binding.targetDigest,
345
+ invocationId: supervisionRequest.invocationId,
346
+ mode,
347
+ requestedAt:
348
+ requestedAt ??
349
+ (mode === "hard-terminate"
350
+ ? supervisionRequest.deadlineAt
351
+ : timestamp(binding.now).iso),
352
+ deadlineAt: supervisionRequest.deadlineAt,
353
+ })
354
+ .then((receipt) =>
355
+ Object.freeze({
356
+ revocationDigest: computeEvolutionEvalSignedEvidenceDigest(
357
+ receipt,
358
+ EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetRevocation,
359
+ ),
360
+ revocationMode: mode,
361
+ wasActive: receipt.wasActive,
362
+ activeInvocationTerminated: receipt.activeInvocationTerminated,
363
+ terminatedAt: receipt.terminatedAt,
364
+ }),
365
+ );
366
+ return revocation;
367
+ },
368
+ });
369
+ }
370
+
371
+ export function createVolcengineFunctionProcessExecutor(options = {}) {
372
+ if (
373
+ !options ||
374
+ typeof options !== "object" ||
375
+ Array.isArray(options) ||
376
+ isProxy(options) ||
377
+ Object.getPrototypeOf(options) !== Object.prototype
378
+ ) {
379
+ throw new TypeError(
380
+ "Volcengine function process executor options must be a plain object",
381
+ );
382
+ }
383
+ const hasNow = Reflect.ownKeys(options).includes("now");
384
+ exact(
385
+ options,
386
+ ["supervisor", "target", ...(hasNow ? ["now"] : [])],
387
+ "Volcengine function process executor options",
388
+ );
389
+ if (!isEvolutionEvalProcessSupervisor(options.supervisor))
390
+ throw new TypeError("a branded evolution process supervisor is required");
391
+ const now = hasNow ? options.now : Date.now;
392
+ if (typeof now !== "function" || isProxy(now))
393
+ throw new TypeError(
394
+ "Volcengine function process executor clock must be a direct function",
395
+ );
396
+ const supervisorDescriptor = options.supervisor.authorityDescriptor;
397
+ if (!supervisorDescriptor || typeof supervisorDescriptor !== "object")
398
+ throw new TypeError("process supervisor authority descriptor is required");
399
+ if (!options.supervisor.childEvidenceStoreDescriptor)
400
+ throw new TypeError(
401
+ "Volcengine function process executor requires a durable child evidence store",
402
+ );
403
+ const captured = targetBinding(options.target);
404
+ const descriptor = Object.freeze({
405
+ schema: VOLCENGINE_FUNCTION_PROCESS_EXECUTOR_SCHEMA,
406
+ mode: "process",
407
+ targetDigest: captured.targetDigest,
408
+ targetAuthorityDigest: captured.targetAuthorityDigest,
409
+ handlerId: identifier(captured.target.handlerId, "process handlerId"),
410
+ handlerRevision: identifier(
411
+ captured.target.handlerRevision,
412
+ "process handlerRevision",
413
+ ),
414
+ operation: captured.target.operation,
415
+ handlerArtifactDigest: digest(
416
+ captured.target.handlerArtifactDigest,
417
+ "process handlerArtifactDigest",
418
+ ),
419
+ supervisorAuthorityDigest: hash(
420
+ "chainlesschain.volcengine-function-process-supervisor-authority/v1",
421
+ {
422
+ authorityDescriptor: supervisorDescriptor,
423
+ childEvidenceStoreDescriptor:
424
+ options.supervisor.childEvidenceStoreDescriptor ?? null,
425
+ },
426
+ ),
427
+ });
428
+ const execute = async (request, context) =>
429
+ invokeVolcengineFunctionProcessExecutor(execute, request, context);
430
+ Object.freeze(execute);
431
+ EXECUTORS.set(execute, {
432
+ ...captured,
433
+ descriptor,
434
+ now,
435
+ supervisor: options.supervisor,
436
+ });
437
+ return execute;
438
+ }
439
+
440
+ export function inspectVolcengineFunctionProcessExecutor(value) {
441
+ const binding = EXECUTORS.get(value);
442
+ if (!binding)
443
+ throw new TypeError(
444
+ "a branded Volcengine function process executor is required",
445
+ );
446
+ return binding.descriptor;
447
+ }
448
+
449
+ export function captureVolcengineFunctionProcessResult(executor, response) {
450
+ const binding = EXECUTORS.get(executor);
451
+ const result =
452
+ response && typeof response === "object"
453
+ ? PROCESS_RESULTS.get(response)
454
+ : null;
455
+ if (!binding || !result || result.executor !== executor)
456
+ throw new TypeError(
457
+ "a result from the captured Volcengine function process executor is required",
458
+ );
459
+ PROCESS_RESULTS.delete(response);
460
+ return result.evidence;
461
+ }
462
+
463
+ export async function invokeVolcengineFunctionProcessExecutor(
464
+ executor,
465
+ request,
466
+ context,
467
+ ) {
468
+ const binding = EXECUTORS.get(executor);
469
+ if (!binding)
470
+ throw new TypeError(
471
+ "a branded Volcengine function process executor is required",
472
+ );
473
+ const signal = contextSignal(context);
474
+ if (!(signal instanceof AbortSignal))
475
+ throw new TypeError(
476
+ "Volcengine function process executor requires an abort signal",
477
+ );
478
+ if (signal.aborted)
479
+ throw signal.reason ?? new Error("function execution was aborted");
480
+ const payload = normalizePayload(request);
481
+ const current = timestamp(binding.now);
482
+ const deadlineAt = Date.parse(payload.deadlineAt);
483
+ if (
484
+ !Number.isFinite(deadlineAt) ||
485
+ new Date(deadlineAt).toISOString() !== payload.deadlineAt ||
486
+ deadlineAt <= current.milliseconds
487
+ ) {
488
+ throw new TypeError("Volcengine function process deadline is invalid");
489
+ }
490
+ const payloadDigest = hash(
491
+ "chainlesschain.evolution-eval-supervision-payload/v1",
492
+ payload,
493
+ );
494
+ const invocationNonce = `function-supervision-${randomBytes(16).toString("hex")}`;
495
+ const invocationId = `function-invocation-${randomBytes(16).toString("hex")}`;
496
+ const capabilityNonce = `function-capability-${randomBytes(16).toString("hex")}`;
497
+ const capabilityDigest = hash(
498
+ "chainlesschain.evolution-eval-invocation-capability/v1",
499
+ {
500
+ capabilityNonce,
501
+ invocationNonce,
502
+ invocationId,
503
+ functionRequestDigest: digest(
504
+ payload.requestDigest,
505
+ "function requestDigest",
506
+ ),
507
+ payloadDigest,
508
+ targetDigest: binding.targetDigest,
509
+ deadlineAt: payload.deadlineAt,
510
+ },
511
+ );
512
+ const supervisionRequest = Object.freeze({
513
+ schema: "chainlesschain.evolution-eval-supervision-request/v3",
514
+ operation: binding.target.operation,
515
+ invocationNonce,
516
+ invocationId,
517
+ capabilityDigest,
518
+ requestedAt: current.iso,
519
+ deadlineAt: payload.deadlineAt,
520
+ payloadDigest,
521
+ targetDigest: binding.targetDigest,
522
+ targetHandlerId: binding.target.handlerId,
523
+ targetRevision: binding.target.handlerRevision,
524
+ targetAuthorityDigest: binding.targetAuthorityDigest,
525
+ requestDigest: payload.requestDigest,
526
+ });
527
+ const invocation = Object.freeze({
528
+ schema: "chainlesschain.evolution-eval-target-invocation-request/v2",
529
+ requestDigest: payload.requestDigest,
530
+ capabilityDigest,
531
+ invocationId,
532
+ deadlineAt: payload.deadlineAt,
533
+ payload,
534
+ payloadDigest,
535
+ target: binding.target,
536
+ targetDigest: binding.targetDigest,
537
+ });
538
+ const capability = invocationCapability(
539
+ binding,
540
+ supervisionRequest,
541
+ invocation,
542
+ );
543
+ let abortRevocation = null;
544
+ const abort = () => {
545
+ abortRevocation ??= capability.revoke({
546
+ mode: "hard-terminate",
547
+ requestedAt: timestamp(binding.now).iso,
548
+ });
549
+ };
550
+ signal.addEventListener("abort", abort, { once: true });
551
+ try {
552
+ let response;
553
+ try {
554
+ response = await binding.supervisor.run(supervisionRequest, capability);
555
+ } catch (cause) {
556
+ if (signal.aborted)
557
+ throw signal.reason ?? new Error("function execution was aborted");
558
+ throw cause;
559
+ }
560
+ if (signal.aborted)
561
+ throw signal.reason ?? new Error("function execution was aborted");
562
+ if (response.receipt.status === "terminated") {
563
+ validateReceipt({
564
+ receipt: response.receipt,
565
+ request: supervisionRequest,
566
+ binding,
567
+ value: null,
568
+ status: "terminated",
569
+ });
570
+ const error = new Error(
571
+ "Volcengine function process execution deadline exceeded",
572
+ );
573
+ error.code = "CC_VOLCENGINE_FUNCTION_DEADLINE_EXCEEDED";
574
+ throw error;
575
+ }
576
+ const supervisionReceiptDigest = validateReceipt({
577
+ receipt: response.receipt,
578
+ request: supervisionRequest,
579
+ binding,
580
+ value: response.value,
581
+ status: "completed",
582
+ });
583
+ exact(
584
+ response.value,
585
+ ["toolResult", "auditEvidence"],
586
+ "Volcengine function process result",
587
+ );
588
+ const evidenceCore = Object.freeze({
589
+ schema: VOLCENGINE_FUNCTION_PROCESS_EVIDENCE_SCHEMA,
590
+ requestDigest: payload.requestDigest,
591
+ targetDigest: binding.targetDigest,
592
+ targetAuthorityDigest: binding.targetAuthorityDigest,
593
+ supervisorAuthorityDigest: binding.descriptor.supervisorAuthorityDigest,
594
+ supervisionReceiptDigest,
595
+ targetInvocationDigest: response.receipt.targetInvocationDigest,
596
+ revocationDigest: response.receipt.revocationDigest,
597
+ completedAt: response.receipt.completedAt,
598
+ isolation: "process",
599
+ hardDeadlineEnforced: true,
600
+ lateSideEffectsPrevented: true,
601
+ });
602
+ const evidence = Object.freeze({
603
+ ...evidenceCore,
604
+ evidenceDigest: hash(
605
+ VOLCENGINE_FUNCTION_PROCESS_EVIDENCE_SCHEMA,
606
+ evidenceCore,
607
+ ),
608
+ });
609
+ PROCESS_RESULTS.set(response.value, { executor, evidence });
610
+ return response.value;
611
+ } finally {
612
+ signal.removeEventListener("abort", abort);
613
+ if (abortRevocation !== null) await abortRevocation.catch(() => {});
614
+ }
615
+ }