chainlesschain 0.166.59 → 0.166.63

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 (182) hide show
  1. package/README.md +38 -8
  2. package/package.json +4 -1
  3. package/src/assets/web-panel/assets/{AIOps-B9i3kk5f.js → AIOps-CfPrpABR.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DGMs1wBm.js → ActionButton-Bkv1erki.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D-JGeynM.js → Analytics-fY_7epoU.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DLECnXlP.js → AppLayout-DegaN-aa.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-CwaTiXN4.js → Artifacts-90-UNTVE.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BCb7s5Ky.js → Audit-BRQ1F4sA.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-D4IOzvKs.js → BackgroundAgents-Cb85uP7O.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-Cknunk10.js → Backup-CrLBSWQK.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DnU8pbUh.js → BaseInput-DditUW5B.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DOouYIhz.js → Chat-0XozleDQ.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-8QXBJvgy.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-BrumNw6V.js → Checkbox-C2Ck_3ju.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-B4E_uI_N.js → Codegen-Chjw-MS7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-C7H2sdaL.js → Col-B_w8_Oka.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BFdzcMSl.js → Community-XAqxPnXq.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BzVXohrg.js → Compact-BX_3GJ3m.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-B_4QcuSH.js → Compliance-DE3kIC9z.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DjuQzJx8.js → Cowork-DPBYp1ey.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-Bf2iY-1-.js → Cron-D9cknqzn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CY9QW7IT.js → Crosschain-BzHrGWY9.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-kDZBvaKr.js → DID-BuD8TkZl.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DoYboS3g.js → Dashboard-BbxMuZVK.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-LLEzI6l1.js → Dropdown-jq0ki-tE.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-D2kmSvkg.js → EmailListRenderer-RiMvINxT.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-DHj2yUGZ.js → EvolutionSettings-DE-URi9i.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B7Hg7fR0.js → FamilyGuardDashboard-DV3ao62-.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CUdwU6aH.js → Federation-BF6BmBPg.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-D1KrwjwY.js → FormItemContext-CKTX59j2.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-CXGLoHfw.js → GenericCardRenderer-DZkH-CTs.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-TG3Q9JWG.js → Git-B5JYb-w-.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-BJD7h_fv.js → Governance-D3WfDZ6W.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-Dky4l_bZ.js → Inference-DoSvfDUk.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-CCx9aXBV.js → KnowledgeGraph-DUDIzN97.js} +1 -1
  36. package/src/assets/web-panel/assets/Logs-JfJerfFD.js +2 -0
  37. package/src/assets/web-panel/assets/MarkdownRenderer-DXgA7cZm.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-BzL6KJMX.js → Marketplace-BpVrOM_V.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-BReSRzEU.js → McpTools-CFnQdiSv.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-BhmkkCxd.js → Memory-Dxv81cNl.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BeQMHr_n.js → MobileBridge-C92eX7PB.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CphEwj_l.js → MobileProjects-BUHw7Wox.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-CFk1ibuN.js → Mtc-D-G9H4A1.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-CU9qrmbH.js → MtcAudit-CAEaEtAz.js} +5 -5
  45. package/src/assets/web-panel/assets/{Multisig-CKR-Gh0Y.js → Multisig-Cx_-X9HD.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-D1qWY6Mx.js → NLProgramming-DRIKG4Xy.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-B4CM0C65.js → Notes-CmL0vKUv.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-BTQYWveR.js → NotificationSettings-D2cQ5aQn.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-DxN6fAn8.js → OrderTableRenderer-CPfd7PNy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-scgboNfd.js → Organization-EKqO46hz.js} +2 -2
  51. package/src/assets/web-panel/assets/{Overflow-BP4aQhid.js → Overflow-BOHjBwJo.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-65jIo6MY.js → P2P-Dx4LdCE0.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-Bfi4-tDQ.js → PdhVaultBrowser-CgCt2xdT.js} +5 -5
  54. package/src/assets/web-panel/assets/{Permissions-DWtxT7bE.js → Permissions-DWjDeO7O.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-Bilmr8BR.js → PersonalDataHub-Bx4Od8pG.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-IPIMM-1y.js → Pipeline-oKxws_Ch.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DFB8RiVK.js → Privacy-Df1HVRKR.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-DxZksvu1.js → ProjectInit-BraLwZT4.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-DsjPsnYN.js → ProjectSettings-CKru54M0.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-CC5FBLLq.js → Projects-BEr7cJcS.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-Dk3ViPuF.js → Providers-C8v30DU3.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-CJ8R6-bF.js → QrScannerModal-CPyNV-O5.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DJfCPORc.js → QuickAsk-BLIew7A5.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DjDygXeb.js → Recommend-DVjWmsPs.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BJiJ1YHw.js → RemoteSession-B4PNTaEf.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-fYE8jPcc.js → Reputation-D5HOV6oI.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-vcvsjMm4.js → Row-DgCQom2M.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-CZnKliwn.js → RssFeed-zvIcGHgz.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-DEStiFGI.js → Search-C-KbJP_z.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-BPb_szxS.js → Security-CasnI-Ld.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-TR0xZhSF.js → Services-CR-pSlFv.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-BSPu9boC.js → Skeleton-BB5On1b5.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CXEj9pC6.js → Skills-CC-wdQi-.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-jlOlDGMA.js → Sla-CPX5QKEu.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-C8oPE_HQ.js → SpeechSettings-Bifkl6Zz.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DZNUx8zt.js → SyncSettings-CdUVeB-S.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-B4T6aoOl.js → Tasks-BttwN3fs.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-DeRgtwZ5.js → Templates-CBHNbpQ7.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DDVoXGxa.js → Tenant-B90lEwSQ.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-DGAUoJMz.js → Terminal-u8KqitsA.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-Co4Nkpjm.js → TimelineRenderer-CnEJMkJo.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-DaMLa0Fm.js → Tokens-CTM2OOJ_.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C7iLr-Ik.js → Trigger-Ca8NmmgU.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-CxX_tQqi.js → Trust-CI9GpUj2.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-ClrdckEx.js → UkeySign-BlMLGqKK.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-DgTVhaoK.js → VideoEditing-C8yCZrH0.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-SIbwES0O.js → Wallet-BpuYrz8o.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-YNqVnhZF.js → WebAuthn-DFpNfLG_.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BvynT9mj.js → WorkflowEditor-BWhLoeU4.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-X79b2tVy.js → chat-Dwo4LC7E.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-DioWDCbu.js → colors-DkdGvKBf.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DpAXXaqu.js → compact-item-1gI0lfs3.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BYq8bCQX.js → createContext-O9iHirtr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-axBqv361.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CDJNMJ_n.js → hasIn-DY1jo9BQ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DUe-hFGb.js → index-1AnBwAoM.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CS3QdYDW.js → index-B-kbagPi.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DZysaS5T.js → index-B0TX-bLV.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Cx0_WiSe.js → index-B5l7eb6E.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CJEFd0QJ.js → index-BDwV_V5g.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-D88MWTOx.js → index-BgHG4f2K.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BK53HyEP.js → index-BgVO1aXv.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-COqkDiRU.js → index-Bl6GfsQZ.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CUbuCFWb.js → index-BmAK4o9I.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C7cXBJcM.js → index-BsQkwBu2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Byt1ny7l.js → index-BumRAO-7.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bh9la-GL.js → index-Bx4MNNMY.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B8_grEFP.js → index-C4c0XaiT.js} +1 -1
  109. package/src/assets/web-panel/assets/index-CAsOttsq.js +1 -0
  110. package/src/assets/web-panel/assets/{index-YviHYMA2.js → index-CBqSTwY9.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-00kVj4me.js → index-D8fqsTHW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Wl55a61D.js → index-DCqPIE3G.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CLSt7mOy.js → index-DNnaEzC5.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C4xggKQp.js → index-DTppQua6.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CbxqdIzD.js → index-DfFzjnA0.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BwHEGjR7.js → index-DskEFn8M.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D3J9FKFr.js → index-DvRvwzc-.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BGEXGr9g.js → index-DwBcFhcc.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B6wxVEIZ.js → index-DwJBbK3Z.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-mHAPEcPi.js → index-DwhJqZqM.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-C1-NqghD.js → index-Dx51Am-0.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DP9ZLjra.js → index-E5Ar6dNV.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DSFkmRvK.js → index-ETHEhWvI.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DmNspbVU.js → index-KUrBWzIM.js} +1 -1
  125. package/src/assets/web-panel/assets/index-MgEKheCh.js +1 -0
  126. package/src/assets/web-panel/assets/{index-TqLyy6IR.js → index-YnGvCu0P.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-Q3WQ5Zhr.js → index-hRtVittm.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DAnXSg0r.js → index-nXoV4OCZ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BBvA7Hxj.js → index-qUbrqzvO.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BIO8EVHt.js → index-rIJqtLz-.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B8ChecWd.js → index-rkkMl4Lb.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DwG9khVs.js → index-tXjOuLZm.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-V6l3ia83.js → index-zLOzCcxM.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Bt0zcD5R.js → index-zPpssHXA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-18rmGkik.js → initDefaultProps-Du5HHTVt.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-3kvGzSgV.js → motion-D9mAVPKP.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Dx3DiVHc.js → move-DPO_sFtt.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-VX1dFJEI.js → mtc-parser-CnezVcXi.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-CniSeCOA.js → omit-DNpYMbet.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-RPggmcOd.js → pickAttrs-BUFm_slL.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B45YBykr.js → placementArrow-DvwJtnzY.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-D0nciAEn.js → responsiveObserve-CUWOh_KI.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-UxLNWqjI.js → slide-bVHCUsdj.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-CukpV_uI.js → statusUtils-FlOzOrxf.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BIcEZk6Y.js → styleChecker-C6CFXutA.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-Zah-xvV3.js → useFlexGapSupport-BNGqO_E0.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-BA7ihKFN.js → useFs-DyKOrA27.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-C64CsyY3.js → usePersonalDataHub-DZAqeMAJ.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-Datcekgj.js → vnode-Do7fVasi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-CaFQv1KF.js → zoom-DYkEmOT2.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +52 -0
  153. package/src/lib/background-agent-supervisor.js +10 -1
  154. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +119 -12
  155. package/src/lib/evolution/evolution-artifact-ports.js +6 -0
  156. package/src/lib/evolution/evolution-deployment-loader.js +139 -0
  157. package/src/lib/evolution/evolution-eval-gate.js +5 -0
  158. package/src/lib/evolution/evolution-ledger-ports.js +41 -17
  159. package/src/lib/evolution/pm-exploration-benchmark.js +253 -0
  160. package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
  161. package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
  162. package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
  163. package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
  164. package/src/lib/evolution/pm-exploration-ledger-adapter.js +860 -0
  165. package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
  166. package/src/lib/evolution/pm-exploration-receipts.js +626 -0
  167. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
  168. package/src/lib/evolution/pm-exploration-rounds.js +842 -0
  169. package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
  170. package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
  171. package/src/lib/evolution/pm-result-grader.cjs +287 -0
  172. package/src/lib/read-file-loop-guard.js +36 -5
  173. package/src/lib/secure-fs.js +51 -4
  174. package/src/lib/task-progress-tracker.js +29 -7
  175. package/src/lib/text-file-search.js +1 -0
  176. package/src/runtime/agent-core.js +46 -4
  177. package/src/assets/web-panel/assets/ChatBubbleRenderer-C4tdSms8.js +0 -1
  178. package/src/assets/web-panel/assets/Logs-BtesccPB.js +0 -2
  179. package/src/assets/web-panel/assets/MarkdownRenderer-DoN7oE2J.js +0 -1
  180. package/src/assets/web-panel/assets/devWarning-ONeWC5dH.js +0 -1
  181. package/src/assets/web-panel/assets/index--QLnQuO9.js +0 -1
  182. package/src/assets/web-panel/assets/index-CkgeII0e.js +0 -1
@@ -0,0 +1,613 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isProxy } from "node:util/types";
3
+
4
+ import {
5
+ PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA,
6
+ PM_EXPLORATION_GRADE_REQUEST_SCHEMA,
7
+ PM_EXPLORATION_GRADE_REQUEST_SCHEMA_V1,
8
+ PM_EXPLORATION_MERGE_REQUEST_SCHEMA,
9
+ PM_EXPLORATION_RUN_REQUEST_SCHEMA,
10
+ verifyPmExplorationExecutionManifest,
11
+ } from "./pm-exploration-execution-host.js";
12
+ import {
13
+ inspectPmExplorationReceiptAuthority,
14
+ verifyPmExplorationReceipt,
15
+ } from "./pm-exploration-receipts.js";
16
+ import { verifyPmExplorationVolcengineSettlementRecord } from "./pm-exploration-volcengine-provider.js";
17
+ import {
18
+ exportPmExplorationRecoverySnapshot,
19
+ restorePmExplorationJournal,
20
+ verifyPmExplorationPlan,
21
+ } from "./pm-exploration-rounds.js";
22
+
23
+ export const PM_EXPLORATION_EVIDENCE_BUNDLE_SCHEMA =
24
+ "chainlesschain.pm-exploration-evidence-bundle/v1";
25
+ export const PM_EXPLORATION_PROVIDER_EVIDENCE_BUNDLE_SCHEMA =
26
+ "chainlesschain.pm-exploration-evidence-bundle/v2";
27
+
28
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
29
+
30
+ function canonical(value) {
31
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
32
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
33
+ return `{${Object.keys(value)
34
+ .sort()
35
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
36
+ .join(",")}}`;
37
+ }
38
+
39
+ function hash(domain, value) {
40
+ return `sha256:${createHash("sha256")
41
+ .update(domain)
42
+ .update("\0")
43
+ .update(canonical(value))
44
+ .digest("hex")}`;
45
+ }
46
+
47
+ function deepFreeze(value, seen = new WeakSet()) {
48
+ if (!value || typeof value !== "object" || seen.has(value)) return value;
49
+ seen.add(value);
50
+ for (const key of Reflect.ownKeys(value)) {
51
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
52
+ if (descriptor && "value" in descriptor) deepFreeze(descriptor.value, seen);
53
+ }
54
+ return Object.freeze(value);
55
+ }
56
+
57
+ function exact(value, keys, label) {
58
+ if (
59
+ !value ||
60
+ typeof value !== "object" ||
61
+ Array.isArray(value) ||
62
+ isProxy(value) ||
63
+ Object.getPrototypeOf(value) !== Object.prototype
64
+ ) {
65
+ throw new TypeError(`${label} must be a plain object`);
66
+ }
67
+ const actual = Reflect.ownKeys(value);
68
+ if (
69
+ actual.length !== keys.length ||
70
+ actual.some((key) => {
71
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
72
+ return (
73
+ typeof key !== "string" ||
74
+ !keys.includes(key) ||
75
+ !descriptor ||
76
+ !descriptor.enumerable ||
77
+ !("value" in descriptor)
78
+ );
79
+ })
80
+ ) {
81
+ throw new TypeError(`${label} has unexpected or accessor fields`);
82
+ }
83
+ }
84
+
85
+ function digest(value, label) {
86
+ if (typeof value !== "string" || !DIGEST.test(value))
87
+ throw new TypeError(`${label} must be a sha256 digest`);
88
+ return value;
89
+ }
90
+
91
+ function array(value, label, maximum) {
92
+ if (
93
+ !Array.isArray(value) ||
94
+ isProxy(value) ||
95
+ Object.getPrototypeOf(value) !== Array.prototype ||
96
+ value.length > maximum ||
97
+ Reflect.ownKeys(value).length !== value.length + 1
98
+ ) {
99
+ throw new TypeError(`${label} must be a bounded dense array`);
100
+ }
101
+ for (let index = 0; index < value.length; index += 1) {
102
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
103
+ if (!descriptor || !descriptor.enumerable || !("value" in descriptor))
104
+ throw new TypeError(`${label} cannot contain holes or accessors`);
105
+ }
106
+ return value;
107
+ }
108
+
109
+ function metricsEqual(checkpoint, execution, grader) {
110
+ return ["tokens", "toolCalls", "wallClockMs"].every(
111
+ (key) =>
112
+ checkpoint.metrics[key] ===
113
+ execution.payload.metrics[key] + grader.payload.metrics[key],
114
+ );
115
+ }
116
+
117
+ function authoritySet(value, manifest) {
118
+ exact(
119
+ value,
120
+ ["execution", "grader", "merge", "evaluator"],
121
+ "PM exploration evidence authorities",
122
+ );
123
+ const result = {};
124
+ for (const [key, expected] of [
125
+ ["execution", manifest.runner],
126
+ ["grader", manifest.grader],
127
+ ["merge", manifest.merger],
128
+ ["evaluator", manifest.evaluator],
129
+ ]) {
130
+ const descriptor = inspectPmExplorationReceiptAuthority(value[key]);
131
+ if (canonical(descriptor) !== canonical(expected))
132
+ throw new Error(`PM exploration ${key} authority differs from manifest`);
133
+ result[key] = value[key];
134
+ }
135
+ return Object.freeze(result);
136
+ }
137
+
138
+ function receiptMap(values, maximum, label) {
139
+ const entries = array(values, label, maximum);
140
+ const result = new Map();
141
+ for (const value of entries) {
142
+ if (
143
+ !value ||
144
+ typeof value !== "object" ||
145
+ Array.isArray(value) ||
146
+ isProxy(value) ||
147
+ Object.getPrototypeOf(value) !== Object.prototype
148
+ ) {
149
+ throw new TypeError(`${label} must contain plain receipt objects`);
150
+ }
151
+ const receiptDigestField = Object.getOwnPropertyDescriptor(
152
+ value,
153
+ "receiptDigest",
154
+ );
155
+ if (
156
+ !receiptDigestField ||
157
+ !receiptDigestField.enumerable ||
158
+ !("value" in receiptDigestField)
159
+ ) {
160
+ throw new TypeError(`${label} receiptDigest must be an own data field`);
161
+ }
162
+ const receiptDigest = digest(
163
+ receiptDigestField.value,
164
+ `${label} receiptDigest`,
165
+ );
166
+ if (result.has(receiptDigest))
167
+ throw new Error(`${label} contains duplicate receipts`);
168
+ result.set(receiptDigest, value);
169
+ }
170
+ return result;
171
+ }
172
+
173
+ function providerSettlementMap(values, maximum) {
174
+ const entries = array(values, "PM provider settlement records", maximum);
175
+ const result = new Map();
176
+ for (const entry of entries) {
177
+ const record = verifyPmExplorationVolcengineSettlementRecord(entry);
178
+ const digest = record.settlement.settlementDigest;
179
+ if (result.has(digest))
180
+ throw new Error(
181
+ "PM provider settlement records contain duplicate digests",
182
+ );
183
+ result.set(digest, record);
184
+ }
185
+ return result;
186
+ }
187
+
188
+ function normalizeSnapshot(plan, snapshot) {
189
+ const journal = restorePmExplorationJournal(plan, snapshot);
190
+ return exportPmExplorationRecoverySnapshot(journal);
191
+ }
192
+
193
+ function validateCheckpointReceipts({
194
+ checkpoint,
195
+ authorities,
196
+ executionReceipts,
197
+ graderReceipts,
198
+ manifest,
199
+ plan,
200
+ }) {
201
+ const executionInput = executionReceipts.get(
202
+ checkpoint.executionReceiptDigest,
203
+ );
204
+ const graderInput = graderReceipts.get(checkpoint.graderReceiptDigest);
205
+ if (!executionInput || !graderInput)
206
+ throw new Error("PM checkpoint is missing its signed receipts");
207
+ const runCore = {
208
+ schema: PM_EXPLORATION_RUN_REQUEST_SCHEMA,
209
+ planDigest: plan.planDigest,
210
+ suiteDigest: plan.suiteDigest,
211
+ trainingPartitionDigest: plan.trainingPartitionDigest,
212
+ environmentDigest: plan.environmentDigest,
213
+ executionManifestDigest: manifest.manifestDigest,
214
+ toolPolicyDigest: manifest.toolPolicyDigest,
215
+ roundId: checkpoint.roundId,
216
+ stage: checkpoint.stage,
217
+ branchId: checkpoint.branchId,
218
+ taskId: checkpoint.taskId,
219
+ inputMemoryDigest: checkpoint.inputMemoryDigest,
220
+ };
221
+ const runRequestDigest = hash(PM_EXPLORATION_RUN_REQUEST_SCHEMA, runCore);
222
+ const execution = verifyPmExplorationReceipt(
223
+ authorities.execution,
224
+ executionInput,
225
+ {
226
+ planDigest: plan.planDigest,
227
+ environmentDigest: plan.environmentDigest,
228
+ requestDigest: runRequestDigest,
229
+ roundId: checkpoint.roundId,
230
+ stage: checkpoint.stage,
231
+ branchId: checkpoint.branchId,
232
+ taskId: checkpoint.taskId,
233
+ inputMemoryDigest: checkpoint.inputMemoryDigest,
234
+ outputMemoryDigest: checkpoint.outputMemoryDigest,
235
+ },
236
+ );
237
+ const gradeCore = {
238
+ schema: PM_EXPLORATION_GRADE_REQUEST_SCHEMA,
239
+ planDigest: plan.planDigest,
240
+ environmentDigest: plan.environmentDigest,
241
+ executionManifestDigest: manifest.manifestDigest,
242
+ roundId: checkpoint.roundId,
243
+ taskId: checkpoint.taskId,
244
+ executionRequestDigest: runRequestDigest,
245
+ inputMemoryDigest: checkpoint.inputMemoryDigest,
246
+ outputMemoryDigest: execution.payload.outputMemoryDigest,
247
+ executionStatus: execution.payload.status,
248
+ executionReceiptDigest: execution.receiptDigest,
249
+ traceDigest: execution.payload.traceDigest,
250
+ };
251
+ const gradeRequestDigest = hash(
252
+ PM_EXPLORATION_GRADE_REQUEST_SCHEMA,
253
+ gradeCore,
254
+ );
255
+ const expectedGraderBindings = {
256
+ planDigest: plan.planDigest,
257
+ environmentDigest: plan.environmentDigest,
258
+ requestDigest: gradeRequestDigest,
259
+ roundId: checkpoint.roundId,
260
+ executionReceiptDigest: execution.receiptDigest,
261
+ outputMemoryDigest: checkpoint.outputMemoryDigest,
262
+ decision: checkpoint.decision,
263
+ };
264
+ let grader;
265
+ try {
266
+ grader = verifyPmExplorationReceipt(
267
+ authorities.grader,
268
+ graderInput,
269
+ expectedGraderBindings,
270
+ );
271
+ } catch (error) {
272
+ if (
273
+ error?.message !== "PM exploration receipt requestDigest binding mismatch"
274
+ ) {
275
+ throw error;
276
+ }
277
+ const legacyGradeCore = {
278
+ schema: PM_EXPLORATION_GRADE_REQUEST_SCHEMA_V1,
279
+ planDigest: plan.planDigest,
280
+ environmentDigest: plan.environmentDigest,
281
+ executionManifestDigest: manifest.manifestDigest,
282
+ roundId: checkpoint.roundId,
283
+ inputMemoryDigest: checkpoint.inputMemoryDigest,
284
+ outputMemoryDigest: execution.payload.outputMemoryDigest,
285
+ executionStatus: execution.payload.status,
286
+ executionReceiptDigest: execution.receiptDigest,
287
+ traceDigest: execution.payload.traceDigest,
288
+ };
289
+ grader = verifyPmExplorationReceipt(authorities.grader, graderInput, {
290
+ ...expectedGraderBindings,
291
+ requestDigest: hash(
292
+ PM_EXPLORATION_GRADE_REQUEST_SCHEMA_V1,
293
+ legacyGradeCore,
294
+ ),
295
+ });
296
+ }
297
+ if (!metricsEqual(checkpoint, execution, grader))
298
+ throw new Error("PM checkpoint metrics differ from its signed receipts");
299
+ if (
300
+ execution.payload.status !== "succeeded" &&
301
+ checkpoint.decision === "accept"
302
+ ) {
303
+ throw new Error("PM checkpoint accepted a failed signed execution");
304
+ }
305
+ return Object.freeze({ execution, grader });
306
+ }
307
+
308
+ function validateMergeReceipt({ snapshot, authority, input, manifest, plan }) {
309
+ if (snapshot.merge === null) {
310
+ if (input !== null)
311
+ throw new Error("PM evidence has a merge receipt before a merge");
312
+ return null;
313
+ }
314
+ if (input === null)
315
+ throw new Error("PM evidence is missing its signed merge receipt");
316
+ const requestCore = {
317
+ schema: PM_EXPLORATION_MERGE_REQUEST_SCHEMA,
318
+ planDigest: plan.planDigest,
319
+ environmentDigest: plan.environmentDigest,
320
+ executionManifestDigest: manifest.manifestDigest,
321
+ mergeId: snapshot.merge.mergeId,
322
+ baseMemoryDigest: plan.initialMemoryDigest,
323
+ branchCheckpoints: snapshot.merge.branchCheckpoints,
324
+ };
325
+ const receipt = verifyPmExplorationReceipt(authority, input, {
326
+ planDigest: plan.planDigest,
327
+ environmentDigest: plan.environmentDigest,
328
+ requestDigest: hash(PM_EXPLORATION_MERGE_REQUEST_SCHEMA, requestCore),
329
+ mergeId: snapshot.merge.mergeId,
330
+ branchCheckpoints: snapshot.merge.branchCheckpoints,
331
+ outputMemoryDigest: snapshot.merge.outputMemoryDigest,
332
+ status: "succeeded",
333
+ });
334
+ if (receipt.receiptDigest !== snapshot.merge.conflictResolutionReceiptDigest)
335
+ throw new Error("PM merge receipt digest differs from the snapshot");
336
+ return receipt;
337
+ }
338
+
339
+ function validateEvaluatorReceipt({
340
+ snapshot,
341
+ authority,
342
+ input,
343
+ manifest,
344
+ mergeReceipt,
345
+ plan,
346
+ }) {
347
+ if (snapshot.frozen === null) {
348
+ if (input !== null)
349
+ throw new Error("PM evidence has an evaluator receipt before freeze");
350
+ return null;
351
+ }
352
+ if (input === null || mergeReceipt === null)
353
+ throw new Error("PM evidence is missing its signed evaluator receipt");
354
+ const requestCore = {
355
+ schema: PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA,
356
+ planDigest: plan.planDigest,
357
+ environmentDigest: plan.environmentDigest,
358
+ executionManifestDigest: manifest.manifestDigest,
359
+ mergeDigest: snapshot.merge.mergeDigest,
360
+ mergeReceiptDigest: mergeReceipt.receiptDigest,
361
+ finalCheckpointDigest: snapshot.frozen.finalCheckpointDigest,
362
+ finalMemoryDigest: snapshot.frozen.finalMemoryDigest,
363
+ };
364
+ const receipt = verifyPmExplorationReceipt(authority, input, {
365
+ planDigest: plan.planDigest,
366
+ environmentDigest: plan.environmentDigest,
367
+ requestDigest: hash(PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA, requestCore),
368
+ mergeReceiptDigest: mergeReceipt.receiptDigest,
369
+ finalCheckpointDigest: snapshot.frozen.finalCheckpointDigest,
370
+ finalMemoryDigest: snapshot.frozen.finalMemoryDigest,
371
+ decision: "accept",
372
+ });
373
+ if (receipt.receiptDigest !== snapshot.frozen.evaluatorReceiptDigest)
374
+ throw new Error("PM evaluator receipt digest differs from the snapshot");
375
+ return receipt;
376
+ }
377
+
378
+ function buildBundle({
379
+ plan,
380
+ manifest,
381
+ snapshot,
382
+ authorities,
383
+ receipts,
384
+ providerSettlements = null,
385
+ }) {
386
+ verifyPmExplorationPlan(plan);
387
+ const executionManifest = verifyPmExplorationExecutionManifest(manifest);
388
+ if (
389
+ executionManifest.planDigest !== plan.planDigest ||
390
+ executionManifest.environmentDigest !== plan.environmentDigest
391
+ ) {
392
+ throw new Error("PM evidence manifest differs from its plan");
393
+ }
394
+ const trustedAuthorities = authoritySet(authorities, executionManifest);
395
+ exact(
396
+ receipts,
397
+ ["execution", "grader", "merge", "evaluator"],
398
+ "PM exploration evidence receipts",
399
+ );
400
+ const normalizedSnapshot = normalizeSnapshot(plan, snapshot);
401
+ const executionInputs = receiptMap(
402
+ receipts.execution,
403
+ plan.maxRounds,
404
+ "execution receipts",
405
+ );
406
+ const graderInputs = receiptMap(
407
+ receipts.grader,
408
+ plan.maxRounds,
409
+ "grader receipts",
410
+ );
411
+ const orderedExecution = [];
412
+ const orderedGraders = [];
413
+ for (const checkpoint of normalizedSnapshot.checkpoints) {
414
+ const verified = validateCheckpointReceipts({
415
+ checkpoint,
416
+ authorities: trustedAuthorities,
417
+ executionReceipts: executionInputs,
418
+ graderReceipts: graderInputs,
419
+ manifest: executionManifest,
420
+ plan,
421
+ });
422
+ orderedExecution.push(verified.execution);
423
+ orderedGraders.push(verified.grader);
424
+ executionInputs.delete(verified.execution.receiptDigest);
425
+ graderInputs.delete(verified.grader.receiptDigest);
426
+ }
427
+ if (executionInputs.size !== 0 || graderInputs.size !== 0)
428
+ throw new Error(
429
+ "PM evidence contains receipts outside its checkpoint history",
430
+ );
431
+ const settlementInputs =
432
+ providerSettlements === null
433
+ ? null
434
+ : providerSettlementMap(providerSettlements, plan.maxRounds);
435
+ const orderedSettlements = [];
436
+ if (settlementInputs !== null) {
437
+ for (const execution of orderedExecution) {
438
+ const record = settlementInputs.get(execution.payload.traceDigest);
439
+ if (
440
+ !record ||
441
+ record.settlement.executionRequestDigest !==
442
+ execution.payload.requestDigest
443
+ ) {
444
+ throw new Error(
445
+ "PM provider settlement must bind each signed execution trace and request",
446
+ );
447
+ }
448
+ orderedSettlements.push(record);
449
+ settlementInputs.delete(execution.payload.traceDigest);
450
+ }
451
+ if (settlementInputs.size !== 0)
452
+ throw new Error(
453
+ "PM provider settlement records are outside the checkpoint history",
454
+ );
455
+ }
456
+ const mergeReceipt = validateMergeReceipt({
457
+ snapshot: normalizedSnapshot,
458
+ authority: trustedAuthorities.merge,
459
+ input: receipts.merge,
460
+ manifest: executionManifest,
461
+ plan,
462
+ });
463
+ const evaluatorReceipt = validateEvaluatorReceipt({
464
+ snapshot: normalizedSnapshot,
465
+ authority: trustedAuthorities.evaluator,
466
+ input: receipts.evaluator,
467
+ manifest: executionManifest,
468
+ mergeReceipt,
469
+ plan,
470
+ });
471
+ const schema =
472
+ providerSettlements === null
473
+ ? PM_EXPLORATION_EVIDENCE_BUNDLE_SCHEMA
474
+ : PM_EXPLORATION_PROVIDER_EVIDENCE_BUNDLE_SCHEMA;
475
+ const core = deepFreeze({
476
+ schema,
477
+ planDigest: plan.planDigest,
478
+ environmentDigest: plan.environmentDigest,
479
+ executionManifestDigest: executionManifest.manifestDigest,
480
+ snapshotDigest: normalizedSnapshot.snapshotDigest,
481
+ executionReceipts: orderedExecution,
482
+ graderReceipts: orderedGraders,
483
+ mergeReceipt,
484
+ evaluatorReceipt,
485
+ ...(providerSettlements === null
486
+ ? {}
487
+ : { providerSettlements: orderedSettlements }),
488
+ });
489
+ return deepFreeze({
490
+ ...core,
491
+ evidenceDigest: hash(schema, core),
492
+ authenticated: true,
493
+ snapshotAuthenticated: true,
494
+ qualifiesForPromotion: false,
495
+ });
496
+ }
497
+
498
+ export function createPmExplorationEvidenceBundle(input = {}) {
499
+ const keys = Reflect.ownKeys(input);
500
+ const hasProviderSettlements = Object.hasOwn(input, "providerSettlements");
501
+ const expected = hasProviderSettlements
502
+ ? [
503
+ "plan",
504
+ "manifest",
505
+ "snapshot",
506
+ "authorities",
507
+ "receipts",
508
+ "providerSettlements",
509
+ ]
510
+ : ["plan", "manifest", "snapshot", "authorities", "receipts"];
511
+ if (
512
+ !input ||
513
+ typeof input !== "object" ||
514
+ Array.isArray(input) ||
515
+ isProxy(input) ||
516
+ Object.getPrototypeOf(input) !== Object.prototype ||
517
+ keys.length !== expected.length ||
518
+ keys.some((key) => {
519
+ const descriptor = Object.getOwnPropertyDescriptor(input, key);
520
+ return (
521
+ typeof key !== "string" ||
522
+ !expected.includes(key) ||
523
+ !descriptor ||
524
+ !descriptor.enumerable ||
525
+ !("value" in descriptor)
526
+ );
527
+ })
528
+ ) {
529
+ throw new TypeError("PM exploration evidence bundle input is invalid");
530
+ }
531
+ return buildBundle({
532
+ ...input,
533
+ ...(hasProviderSettlements
534
+ ? { providerSettlements: input.providerSettlements }
535
+ : {}),
536
+ });
537
+ }
538
+
539
+ export function verifyPmExplorationEvidenceBundle({
540
+ plan,
541
+ manifest,
542
+ authorities,
543
+ snapshot,
544
+ bundle,
545
+ } = {}) {
546
+ const providerBound =
547
+ bundle?.schema === PM_EXPLORATION_PROVIDER_EVIDENCE_BUNDLE_SCHEMA;
548
+ exact(
549
+ bundle,
550
+ providerBound
551
+ ? [
552
+ "schema",
553
+ "planDigest",
554
+ "environmentDigest",
555
+ "executionManifestDigest",
556
+ "snapshotDigest",
557
+ "executionReceipts",
558
+ "graderReceipts",
559
+ "mergeReceipt",
560
+ "evaluatorReceipt",
561
+ "providerSettlements",
562
+ "evidenceDigest",
563
+ "authenticated",
564
+ "snapshotAuthenticated",
565
+ "qualifiesForPromotion",
566
+ ]
567
+ : [
568
+ "schema",
569
+ "planDigest",
570
+ "environmentDigest",
571
+ "executionManifestDigest",
572
+ "snapshotDigest",
573
+ "executionReceipts",
574
+ "graderReceipts",
575
+ "mergeReceipt",
576
+ "evaluatorReceipt",
577
+ "evidenceDigest",
578
+ "authenticated",
579
+ "snapshotAuthenticated",
580
+ "qualifiesForPromotion",
581
+ ],
582
+ "PM exploration evidence bundle",
583
+ );
584
+ if (
585
+ ![
586
+ PM_EXPLORATION_EVIDENCE_BUNDLE_SCHEMA,
587
+ PM_EXPLORATION_PROVIDER_EVIDENCE_BUNDLE_SCHEMA,
588
+ ].includes(bundle.schema) ||
589
+ bundle.authenticated !== true ||
590
+ bundle.snapshotAuthenticated !== true ||
591
+ bundle.qualifiesForPromotion !== false
592
+ ) {
593
+ throw new Error("PM exploration evidence bundle flags are invalid");
594
+ }
595
+ const normalized = buildBundle({
596
+ plan,
597
+ manifest,
598
+ snapshot,
599
+ authorities,
600
+ receipts: {
601
+ execution: bundle.executionReceipts,
602
+ grader: bundle.graderReceipts,
603
+ merge: bundle.mergeReceipt,
604
+ evaluator: bundle.evaluatorReceipt,
605
+ },
606
+ ...(providerBound
607
+ ? { providerSettlements: bundle.providerSettlements }
608
+ : {}),
609
+ });
610
+ if (canonical(normalized) !== canonical(bundle))
611
+ throw new Error("PM exploration evidence bundle digest mismatch");
612
+ return normalized;
613
+ }