chainlesschain 0.166.62 → 0.166.64

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 (172) hide show
  1. package/README.md +54 -8
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/assets/{AIOps-BqoRiuXE.js → AIOps-BFbLDWTF.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BwBhyFIm.js → ActionButton-CAHMtgNB.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DTW03Emb.js → Analytics-CkrSj0oR.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CI-wxMLQ.js → AppLayout-BTb0Ws1l.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-DVqbM3iE.js → Artifacts-C2Pgepj-.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DulhOs16.js → Audit-ZweyxXW8.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DnRs67e8.js → BackgroundAgents-BS8tAnzP.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-BFEZo0vX.js → Backup-CLkG_74M.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-D185sBnp.js → BaseInput-MIfNcdUZ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DUvP-2SK.js → Chat-DBwqlWWr.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-u9WKQbZb.js → ChatBubbleRenderer-6T0uoJuS.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-D8Zh_18b.js → Checkbox-DdBYhlVX.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-WdiWRdfC.js → Codegen-BR6MhiDo.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CnSoVpw6.js → Col-yO-5EbbM.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BJDHgBkw.js → Community-B608q_m7.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-uNRdmBaq.js → Compact-BmVHi7Z7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-_6jRTJa3.js → Compliance-BQ-DzutA.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-D5lnbXR6.js → Cowork-BEfLyXvi.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-D6tuGBVg.js → Cron-Cld6NX-_.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-Ce5e9Lbm.js → Crosschain-CUA3nDId.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-1VVKZ_c1.js → DID-DSI3E9zv.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DuHcZ13w.js → Dashboard-CoWtEdhO.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BC3EK0wN.js → Dropdown-CGhZ1Dyy.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DzLpGs5E.js → EmailListRenderer-BHZe2K5q.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-x2XZHG0Z.js → EvolutionSettings-Corjo98k.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-nAavV50Y.js → FamilyGuardDashboard-dPSWF3Pt.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CCHWVS5J.js → Federation-DT-Zr78c.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CGod_3Ni.js → FormItemContext-CzKq63B0.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DIFYQa2f.js → GenericCardRenderer-CDkKrmu0.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DikM1Nc5.js → Git-BrwRnLOv.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-SzzBXCDX.js → Governance-C4PtCzod.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-wVsu9QzM.js → Inference-CVPv5nwa.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DDpVxfO-.js → KnowledgeGraph-CmT9lvED.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BnIjS-2Z.js → Logs-DaRgv7pL.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-3AsRzie6.js → MarkdownRenderer-B3zZwlSz.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-Cj3PLhXV.js → Marketplace-Bm0GGEaL.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DMKO55Kz.js → McpTools-71L5h0en.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-wWJl5yJL.js → Memory-BoWrfASi.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-CJ_VIPgJ.js → MobileBridge-Dp4FcX_-.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CiJT5cF8.js → MobileProjects-00ja0Z7O.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BXmndm9a.js → Mtc-BZF6YNYp.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-C3hWIAnz.js → MtcAudit-Bp_vcI6H.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DU4OUQ7u.js → Multisig-CnCo56CS.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CyAwOeU5.js → NLProgramming-BCSzNHpv.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes--YvcAg13.js → Notes-kXoQk8B7.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Dyu6dC0D.js → NotificationSettings-oN-1fkcy.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Df-0iTO2.js → OrderTableRenderer-5ZVHrVZ9.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-a9Em4Sgu.js → Organization-D4_T9Tdc.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-CCQtvcsw.js → Overflow-d8vZwo9w.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P--CaB5e38.js → P2P-0HGUdmTv.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CmfHjoJG.js → PdhVaultBrowser-Cx8vp92z.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-BCDjNsXi.js → Permissions-XHd6pVQB.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-ByprqCJd.js → PersonalDataHub-CB5bZU9T.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-CZRZq-P0.js → Pipeline-Dy_qx4-0.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CeDay_dV.js → Privacy-BgR0-uEu.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CgpIfRAZ.js → ProjectInit-DAcRi1Nx.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CU8iakEs.js → ProjectSettings-Bd1Q0rK_.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-pPM0KRfQ.js → Projects-DVc9DcbM.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BfpxsZh1.js → Providers-C3c4QfUT.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Dmv3rax1.js → QrScannerModal-Ba_GbitW.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DBOtB5wd.js → QuickAsk-CSn5tIkO.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-C_KnHRvS.js → Recommend-B3-8PLX0.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-OIO9kT7D.js → RemoteSession-Bd_7Zmi-.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-BCfNIBt3.js → Reputation-BU2A_wy5.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-pnhw7dyj.js → Row-I0JFMjCz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-CLJ1A3FF.js → RssFeed-CNc4Dgfz.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-CSQzJ3gj.js → Search-uAA6ceLl.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CS_mvkaE.js → Security-U1SWj5nP.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DBqA2Csq.js → Services-BFjZ5ASY.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-BjR3_iWH.js → Skeleton-B8InBvQf.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DwGIXRJS.js → Skills-BDYwf3QV.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DwiHHJtJ.js → Sla-Dcc6iq3q.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-QYN_t0CS.js → SpeechSettings-C3Ta-mC9.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DcXA1Jp3.js → SyncSettings-BNHEYO95.js} +2 -2
  77. package/src/assets/web-panel/assets/Tasks-JbV6L1FX.js +1 -0
  78. package/src/assets/web-panel/assets/{Templates-C6MTuLXU.js → Templates-Yp0CUTBz.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DmbdMB2D.js → Tenant-CToNYxCo.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-DYeXnE4A.js → Terminal-D7W9UqSD.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BrwLhsSE.js → TimelineRenderer-B7rqc1kE.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-C5kKpRWj.js → Tokens-QP7K4ppA.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C4Zyg1jj.js → Trigger-CAWowQCR.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D0mrY3kY.js → Trust-B-0XOP97.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Bq5NMLLb.js → UkeySign-BtiZbiuj.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-OObS6euz.js → VideoEditing-Dee11JI0.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-Die77ZAO.js → Wallet-y7qOmaWY.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DFpqn0WO.js → WebAuthn-CjyRRWGK.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BgKZiece.js → WorkflowEditor-D7Kiz25Q.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CbWtbRmr.js → chat-4F_yB-Gw.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Zu_TgmpG.js → colors-CrczPd-t.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-BqABAwA_.js → compact-item-AenPL6fz.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DR6r1ykz.js → createContext-BcwoqPgi.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-C4qWsAvh.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-BNnYbjOt.js → hasIn-YouHmap8.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BQHn6m4S.js → index--xwN0ZvG.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DxloCIDQ.js → index-31dhJpt3.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CuYLjMxX.js → index-4r7B8sTx.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-hZ41pakD.js → index-5GHNjmnt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index--vigBXnN.js → index-B5Vmr0CM.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CpmSx_mp.js → index-B8EXHVmM.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BQ1WFS4G.js → index-BHA5Fyjc.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-ys7--3Ab.js → index-B_I1INkw.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CO9hQ7ri.js → index-BaguGDJP.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DaKziwj_.js → index-BoVeUGhC.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DiaPl_6F.js → index-BsGhFk79.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DEdqCQKQ.js → index-BwUqDg9_.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-hWckjvz-.js → index-BzyDSW_e.js} +1 -1
  109. package/src/assets/web-panel/assets/index-C-ltOW-O.js +1 -0
  110. package/src/assets/web-panel/assets/{index-P-0rrwu0.js → index-C5hpEYbx.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CVgcq0cJ.js → index-CHNKoexH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-rS1lj7A9.js → index-COgeZETv.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Ct4xnx2r.js → index-CWgIKCVS.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CYgH1j85.js → index-CZ9Ikuo6.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BtQDpNFU.js → index-CZT-LLGS.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B9qA3lcI.js → index-CedvtJA_.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DuCixW1o.js → index-D0dXNgvi.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-55eCb40A.js → index-D5Rvq67L.js} +3 -3
  119. package/src/assets/web-panel/assets/index-D7Ir0TiS.js +1 -0
  120. package/src/assets/web-panel/assets/{index-fvl4dSWm.js → index-D7m5Z4We.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-D08ytPR_.js → index-D8a1AEVK.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CbJgVaoQ.js → index-DAGfuEUu.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-n62j7dTt.js → index-DAh5KwVL.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BCyrVLzm.js → index-DE3qPp9l.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C912Wlyi.js → index-DNHmbdGm.js} +1 -1
  126. package/src/assets/web-panel/assets/{index--1t0mcMh.js → index-DPrzFdCg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-uwS83tsv.js → index-DVrgnhfu.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CR4uB9Mt.js → index-D_4VsL-L.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BvQB-LK5.js → index-Dfw3WyZU.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BbHnxChr.js → index-GP5u18DV.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CkBDWART.js → index-YX4dcbgh.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CSNMSJAt.js → index-fCuM1NPH.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-GrGT2dft.js → index-gy1H_PJk.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CmGll9ri.js → index-q_9aqSgF.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-BEtGYjIT.js → initDefaultProps-Ci6zc6ZA.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-Cvnft4fL.js → motion-DS3kjIxw.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-CdxE_5Yl.js → move-DCdWAKk4.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CS0l6IJn.js → mtc-parser-B0Wfce9U.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Bnji87sb.js → omit-Clx9TR6z.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-BYdnEgN3.js → pickAttrs-CqSiqUvN.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DYYd524z.js → placementArrow-BWe_v-40.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BbIJIkXp.js → responsiveObserve-BSJ68bw6.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BSvuvfUS.js → slide-VRPlLxZB.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DeLSt3js.js → statusUtils-BFBVDPdB.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-DpJTPfyI.js → styleChecker-CehOXy1f.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-S7WdFQMU.js → useFlexGapSupport-BCOdfK18.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CkfCBy52.js → useFs-BMKrjfJQ.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CA48p8Gt.js → usePersonalDataHub-BIjZ7IgI.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-C9D1tq_L.js → vnode-oD0MXddQ.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-B0TG7YQI.js → zoom-D7WqH2Ai.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +26 -0
  153. package/src/lib/evolution/evolution-artifact-ports.js +3 -0
  154. package/src/lib/evolution/evolution-deployment-loader.js +125 -9
  155. package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
  156. package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
  157. package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
  158. package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
  159. package/src/lib/evolution/pm-exploration-ledger-adapter.js +210 -22
  160. package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
  161. package/src/lib/evolution/pm-exploration-receipts.js +626 -0
  162. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
  163. package/src/lib/evolution/pm-exploration-rounds.js +12 -2
  164. package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
  165. package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
  166. package/src/lib/read-file-loop-guard.js +13 -7
  167. package/src/lib/task-progress-tracker.js +1 -1
  168. package/src/runtime/agent-core.js +14 -7
  169. package/src/assets/web-panel/assets/Tasks-DwWqvoyB.js +0 -1
  170. package/src/assets/web-panel/assets/devWarning-CmMzSuk5.js +0 -1
  171. package/src/assets/web-panel/assets/index-Dw-oPGSM.js +0 -1
  172. package/src/assets/web-panel/assets/index-OXemaG8f.js +0 -1
@@ -0,0 +1,946 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isProxy } from "node:util/types";
3
+
4
+ import {
5
+ completePmExplorationRound,
6
+ freezePmExplorationMemory,
7
+ inspectPmExplorationJournal,
8
+ mergePmExplorationBroadBranches,
9
+ startPmExplorationRound,
10
+ verifyPmExplorationPlan,
11
+ } from "./pm-exploration-rounds.js";
12
+ import { executePmExplorationBudgetedOperation } from "./pm-exploration-budget-executor.js";
13
+ import {
14
+ getPmExplorationReceiptSignerAuthority,
15
+ inspectPmExplorationReceiptAuthority,
16
+ issuePmExplorationReceipt,
17
+ verifyPmExplorationReceipt,
18
+ } from "./pm-exploration-receipts.js";
19
+ import { verifyPmExplorationVolcengineSettlementRecord } from "./pm-exploration-volcengine-provider.js";
20
+
21
+ export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA =
22
+ "chainlesschain.pm-exploration-execution-manifest/v2";
23
+ export const PM_EXPLORATION_RUN_REQUEST_SCHEMA =
24
+ "chainlesschain.pm-exploration-run-request/v1";
25
+ export const PM_EXPLORATION_GRADE_REQUEST_SCHEMA_V1 =
26
+ "chainlesschain.pm-exploration-grade-request/v1";
27
+ export const PM_EXPLORATION_GRADE_REQUEST_SCHEMA =
28
+ "chainlesschain.pm-exploration-grade-request/v2";
29
+ export const PM_EXPLORATION_EXECUTION_RESULT_SCHEMA =
30
+ "chainlesschain.pm-exploration-execution-result/v1";
31
+ export const PM_EXPLORATION_MERGE_RESULT_SCHEMA =
32
+ "chainlesschain.pm-exploration-merge-result/v1";
33
+ export const PM_EXPLORATION_EVALUATION_RESULT_SCHEMA =
34
+ "chainlesschain.pm-exploration-evaluation-result/v1";
35
+ export const PM_EXPLORATION_MERGE_REQUEST_SCHEMA =
36
+ "chainlesschain.pm-exploration-merge-request/v1";
37
+ export const PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA =
38
+ "chainlesschain.pm-exploration-evaluation-request/v1";
39
+
40
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
41
+ const ID = /^[a-z][a-z0-9]*(?:[._:-][a-z0-9]+)*$/u;
42
+ const RUNNERS = new WeakMap();
43
+ const GRADERS = new WeakMap();
44
+ const MERGERS = new WeakMap();
45
+ const EVALUATORS = new WeakMap();
46
+ const HOSTS = new WeakMap();
47
+
48
+ function canonical(value) {
49
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
50
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
51
+ return `{${Object.keys(value)
52
+ .sort()
53
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
54
+ .join(",")}}`;
55
+ }
56
+
57
+ function hash(domain, value) {
58
+ return `sha256:${createHash("sha256")
59
+ .update(domain)
60
+ .update("\0")
61
+ .update(canonical(value))
62
+ .digest("hex")}`;
63
+ }
64
+
65
+ function deepFreeze(value, seen = new WeakSet()) {
66
+ if (!value || typeof value !== "object" || seen.has(value)) return value;
67
+ seen.add(value);
68
+ for (const key of Reflect.ownKeys(value)) {
69
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
70
+ if (descriptor && "value" in descriptor) deepFreeze(descriptor.value, seen);
71
+ }
72
+ return Object.freeze(value);
73
+ }
74
+
75
+ function exact(value, keys, label) {
76
+ if (
77
+ !value ||
78
+ typeof value !== "object" ||
79
+ Array.isArray(value) ||
80
+ isProxy(value) ||
81
+ Object.getPrototypeOf(value) !== Object.prototype
82
+ ) {
83
+ throw new TypeError(`${label} must be a plain object`);
84
+ }
85
+ const actual = Reflect.ownKeys(value);
86
+ if (
87
+ actual.length !== keys.length ||
88
+ actual.some((key) => {
89
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
90
+ return (
91
+ typeof key !== "string" ||
92
+ !keys.includes(key) ||
93
+ !descriptor ||
94
+ !descriptor.enumerable ||
95
+ !("value" in descriptor)
96
+ );
97
+ })
98
+ ) {
99
+ throw new TypeError(`${label} has unexpected or accessor fields`);
100
+ }
101
+ }
102
+
103
+ function identifier(value, label) {
104
+ if (typeof value !== "string" || value.length > 256 || !ID.test(value))
105
+ throw new TypeError(`${label} is invalid`);
106
+ return value;
107
+ }
108
+
109
+ function digest(value, label) {
110
+ if (typeof value !== "string" || !DIGEST.test(value))
111
+ throw new TypeError(`${label} must be a sha256 digest`);
112
+ return value;
113
+ }
114
+
115
+ function integer(value, label, minimum = 0, maximum = Number.MAX_SAFE_INTEGER) {
116
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
117
+ throw new TypeError(`${label} is outside its allowed range`);
118
+ return value;
119
+ }
120
+
121
+ function authorityDescriptor(value, expectedRole, label) {
122
+ exact(
123
+ value,
124
+ [
125
+ "role",
126
+ "authorityId",
127
+ "revision",
128
+ "handlerArtifactDigest",
129
+ "publicKeyDigest",
130
+ ],
131
+ label,
132
+ );
133
+ if (value.role !== expectedRole)
134
+ throw new TypeError(`${label} has the wrong receipt role`);
135
+ return deepFreeze({
136
+ role: value.role,
137
+ authorityId: identifier(value.authorityId, `${label}.authorityId`),
138
+ revision: integer(value.revision, `${label}.revision`, 1),
139
+ handlerArtifactDigest: digest(
140
+ value.handlerArtifactDigest,
141
+ `${label}.handlerArtifactDigest`,
142
+ ),
143
+ publicKeyDigest: digest(value.publicKeyDigest, `${label}.publicKeyDigest`),
144
+ });
145
+ }
146
+
147
+ function toolIds(value) {
148
+ if (
149
+ !Array.isArray(value) ||
150
+ isProxy(value) ||
151
+ Object.getPrototypeOf(value) !== Array.prototype ||
152
+ value.length > 128 ||
153
+ Reflect.ownKeys(value).length !== value.length + 1
154
+ ) {
155
+ throw new TypeError("manifest toolIds must be a dense array");
156
+ }
157
+ const result = value.map((entry, index) => {
158
+ if (!Object.hasOwn(value, index))
159
+ throw new TypeError("manifest toolIds cannot contain holes");
160
+ return identifier(entry, "toolId");
161
+ });
162
+ if (new Set(result).size !== result.length)
163
+ throw new TypeError("manifest toolIds must be unique");
164
+ return Object.freeze(result);
165
+ }
166
+
167
+ export function createPmExplorationExecutionManifest(input = {}) {
168
+ exact(
169
+ input,
170
+ [
171
+ "planDigest",
172
+ "environmentDigest",
173
+ "runner",
174
+ "grader",
175
+ "merger",
176
+ "evaluator",
177
+ "toolIds",
178
+ "toolPolicyDigest",
179
+ "preRunSealDigest",
180
+ ],
181
+ "PM exploration execution manifest",
182
+ );
183
+ const core = deepFreeze({
184
+ schema: PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA,
185
+ planDigest: digest(input.planDigest, "planDigest"),
186
+ environmentDigest: digest(input.environmentDigest, "environmentDigest"),
187
+ runner: authorityDescriptor(input.runner, "execution", "runner"),
188
+ grader: authorityDescriptor(input.grader, "grader", "grader"),
189
+ merger: authorityDescriptor(input.merger, "merge", "merger"),
190
+ evaluator: authorityDescriptor(input.evaluator, "evaluator", "evaluator"),
191
+ toolIds: toolIds(input.toolIds),
192
+ toolPolicyDigest: digest(input.toolPolicyDigest, "toolPolicyDigest"),
193
+ preRunSealDigest: digest(input.preRunSealDigest, "preRunSealDigest"),
194
+ });
195
+ const authorities = [core.runner, core.grader, core.merger, core.evaluator];
196
+ if (
197
+ new Set(authorities.map((entry) => entry.authorityId)).size !==
198
+ authorities.length ||
199
+ new Set(authorities.map((entry) => entry.publicKeyDigest)).size !==
200
+ authorities.length
201
+ )
202
+ throw new TypeError("PM receipt roles must use independent authorities");
203
+ return deepFreeze({
204
+ ...core,
205
+ manifestDigest: hash(PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA, core),
206
+ });
207
+ }
208
+
209
+ export function verifyPmExplorationExecutionManifest(value) {
210
+ exact(
211
+ value,
212
+ [
213
+ "schema",
214
+ "planDigest",
215
+ "environmentDigest",
216
+ "runner",
217
+ "grader",
218
+ "merger",
219
+ "evaluator",
220
+ "toolIds",
221
+ "toolPolicyDigest",
222
+ "preRunSealDigest",
223
+ "manifestDigest",
224
+ ],
225
+ "PM exploration execution manifest envelope",
226
+ );
227
+ if (value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA)
228
+ throw new TypeError("PM exploration execution manifest schema is invalid");
229
+ const normalized = createPmExplorationExecutionManifest({
230
+ planDigest: value.planDigest,
231
+ environmentDigest: value.environmentDigest,
232
+ runner: value.runner,
233
+ grader: value.grader,
234
+ merger: value.merger,
235
+ evaluator: value.evaluator,
236
+ toolIds: value.toolIds,
237
+ toolPolicyDigest: value.toolPolicyDigest,
238
+ preRunSealDigest: value.preRunSealDigest,
239
+ });
240
+ if (canonical(normalized) !== canonical(value))
241
+ throw new Error("PM exploration execution manifest digest mismatch");
242
+ return normalized;
243
+ }
244
+
245
+ function createProvider({
246
+ signer,
247
+ handler,
248
+ prepare = null,
249
+ expectedRole,
250
+ bindings,
251
+ label,
252
+ }) {
253
+ if (typeof handler !== "function" || isProxy(handler))
254
+ throw new TypeError(`${label} handler must be a direct function`);
255
+ if (prepare !== null && (typeof prepare !== "function" || isProxy(prepare)))
256
+ throw new TypeError(`${label} prepare hook must be a direct function`);
257
+ const descriptor = inspectPmExplorationReceiptAuthority(signer);
258
+ if (descriptor.role !== expectedRole)
259
+ throw new TypeError(`${label} signer has the wrong receipt role`);
260
+ const provider = Object.freeze({});
261
+ bindings.set(provider, {
262
+ authority: getPmExplorationReceiptSignerAuthority(signer),
263
+ descriptor,
264
+ handler,
265
+ prepare,
266
+ issue: (payload) => issuePmExplorationReceipt(signer, payload),
267
+ });
268
+ return provider;
269
+ }
270
+
271
+ export function createPmExplorationRunner(options = {}) {
272
+ exact(options, ["signer", "run"], "PM exploration runner options");
273
+ return createProvider({
274
+ signer: options.signer,
275
+ handler: options.run,
276
+ expectedRole: "execution",
277
+ bindings: RUNNERS,
278
+ label: "PM exploration runner",
279
+ });
280
+ }
281
+
282
+ export function createPmExplorationGrader(options = {}) {
283
+ if (
284
+ !options ||
285
+ typeof options !== "object" ||
286
+ Array.isArray(options) ||
287
+ isProxy(options) ||
288
+ Object.getPrototypeOf(options) !== Object.prototype
289
+ ) {
290
+ throw new TypeError("PM exploration grader options must be a plain object");
291
+ }
292
+ const hasPrepare = Reflect.ownKeys(options).includes("prepare");
293
+ exact(
294
+ options,
295
+ hasPrepare ? ["signer", "prepare", "grade"] : ["signer", "grade"],
296
+ "PM exploration grader options",
297
+ );
298
+ return createProvider({
299
+ signer: options.signer,
300
+ handler: options.grade,
301
+ prepare: hasPrepare ? options.prepare : null,
302
+ expectedRole: "grader",
303
+ bindings: GRADERS,
304
+ label: "PM exploration grader",
305
+ });
306
+ }
307
+
308
+ export function createPmExplorationMerger(options = {}) {
309
+ exact(options, ["signer", "merge"], "PM exploration merger options");
310
+ return createProvider({
311
+ signer: options.signer,
312
+ handler: options.merge,
313
+ expectedRole: "merge",
314
+ bindings: MERGERS,
315
+ label: "PM exploration merger",
316
+ });
317
+ }
318
+
319
+ export function createPmExplorationEvaluator(options = {}) {
320
+ exact(options, ["signer", "evaluate"], "PM exploration evaluator options");
321
+ return createProvider({
322
+ signer: options.signer,
323
+ handler: options.evaluate,
324
+ expectedRole: "evaluator",
325
+ bindings: EVALUATORS,
326
+ label: "PM exploration evaluator",
327
+ });
328
+ }
329
+
330
+ function snapshotPlan(value) {
331
+ verifyPmExplorationPlan(value);
332
+ return deepFreeze(structuredClone(value));
333
+ }
334
+
335
+ export function createPmExplorationExecutionHost(options = {}) {
336
+ exact(
337
+ options,
338
+ [
339
+ "plan",
340
+ "manifest",
341
+ "runner",
342
+ "grader",
343
+ "merger",
344
+ "evaluator",
345
+ "invokeTool",
346
+ "now",
347
+ ],
348
+ "PM exploration execution host options",
349
+ );
350
+ const plan = snapshotPlan(options.plan);
351
+ const manifest = verifyPmExplorationExecutionManifest(options.manifest);
352
+ const runner = RUNNERS.get(options.runner);
353
+ const grader = GRADERS.get(options.grader);
354
+ const merger = MERGERS.get(options.merger);
355
+ const evaluator = EVALUATORS.get(options.evaluator);
356
+ if (!runner || !grader || !merger || !evaluator)
357
+ throw new TypeError("branded PM exploration providers are required");
358
+ if (
359
+ manifest.planDigest !== plan.planDigest ||
360
+ manifest.environmentDigest !== plan.environmentDigest
361
+ ) {
362
+ throw new Error("PM exploration manifest differs from its plan");
363
+ }
364
+ if (
365
+ canonical(manifest.runner) !== canonical(runner.descriptor) ||
366
+ canonical(manifest.grader) !== canonical(grader.descriptor) ||
367
+ canonical(manifest.merger) !== canonical(merger.descriptor) ||
368
+ canonical(manifest.evaluator) !== canonical(evaluator.descriptor)
369
+ ) {
370
+ throw new Error("PM exploration providers differ from the manifest");
371
+ }
372
+ if (typeof options.invokeTool !== "function" || isProxy(options.invokeTool))
373
+ throw new TypeError("PM exploration host requires a direct tool broker");
374
+ if (typeof options.now !== "function" || isProxy(options.now))
375
+ throw new TypeError("PM exploration host requires a direct clock");
376
+ const host = Object.freeze({});
377
+ HOSTS.set(host, {
378
+ grader,
379
+ evaluator,
380
+ invokeTool: options.invokeTool,
381
+ manifest,
382
+ merger,
383
+ now: options.now,
384
+ plan,
385
+ runner,
386
+ overhead: new WeakMap(),
387
+ });
388
+ return host;
389
+ }
390
+
391
+ export function isPmExplorationExecutionHost(value) {
392
+ return HOSTS.has(value);
393
+ }
394
+
395
+ export function inspectPmExplorationExecutionHost(value) {
396
+ const host = HOSTS.get(value);
397
+ if (!host)
398
+ throw new TypeError("a branded PM exploration execution host is required");
399
+ return Object.freeze({
400
+ planDigest: host.plan.planDigest,
401
+ environmentDigest: host.plan.environmentDigest,
402
+ manifestDigest: host.manifest.manifestDigest,
403
+ preRunSealDigest: host.manifest.preRunSealDigest,
404
+ });
405
+ }
406
+
407
+ function isoTime(now) {
408
+ const value = Number(now());
409
+ if (!Number.isSafeInteger(value) || value < 0)
410
+ throw new TypeError("PM exploration execution host clock is invalid");
411
+ return new Date(value).toISOString();
412
+ }
413
+
414
+ function remaining(plan, aggregate) {
415
+ return {
416
+ maxTokens: Math.max(0, plan.maxTokens - aggregate.tokens),
417
+ maxToolCalls: Math.max(0, plan.maxToolCalls - aggregate.toolCalls),
418
+ maxWallClockMs: Math.max(0, plan.maxWallClockMs - aggregate.wallClockMs),
419
+ };
420
+ }
421
+
422
+ function addMetrics(left, right) {
423
+ const result = {};
424
+ for (const key of ["tokens", "toolCalls", "wallClockMs"]) {
425
+ const value = left[key] + right[key];
426
+ if (!Number.isSafeInteger(value))
427
+ throw new TypeError(`combined ${key} exceeds the safe integer range`);
428
+ result[key] = value;
429
+ }
430
+ return result;
431
+ }
432
+
433
+ function overheadFor(host, journal) {
434
+ return (
435
+ host.overhead.get(journal) ??
436
+ Object.freeze({ tokens: 0, toolCalls: 0, wallClockMs: 0 })
437
+ );
438
+ }
439
+
440
+ function totalUsage(host, journal, projection) {
441
+ return addMetrics(projection.aggregateMetrics, overheadFor(host, journal));
442
+ }
443
+
444
+ function recordOverhead(host, journal, metrics) {
445
+ const next = Object.freeze(addMetrics(overheadFor(host, journal), metrics));
446
+ host.overhead.set(journal, next);
447
+ return next;
448
+ }
449
+
450
+ function normalizedRunnerValue(value) {
451
+ if (
452
+ !value ||
453
+ typeof value !== "object" ||
454
+ Array.isArray(value) ||
455
+ isProxy(value) ||
456
+ Object.getPrototypeOf(value) !== Object.prototype
457
+ ) {
458
+ throw new TypeError("PM exploration runner result must be a plain object");
459
+ }
460
+ const keys = Reflect.ownKeys(value);
461
+ const hasSettlement = Object.hasOwn(value, "providerSettlement");
462
+ const expected = hasSettlement
463
+ ? ["outputMemoryDigest", "traceDigest", "providerSettlement"]
464
+ : ["outputMemoryDigest", "traceDigest"];
465
+ if (
466
+ keys.length !== expected.length ||
467
+ keys.some((key) => {
468
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
469
+ return (
470
+ typeof key !== "string" ||
471
+ !expected.includes(key) ||
472
+ !descriptor ||
473
+ !descriptor.enumerable ||
474
+ !("value" in descriptor)
475
+ );
476
+ })
477
+ ) {
478
+ throw new TypeError(
479
+ "PM exploration runner result has unexpected or accessor fields",
480
+ );
481
+ }
482
+ const traceDigest = digest(value.traceDigest, "traceDigest");
483
+ const providerSettlement = hasSettlement
484
+ ? verifyPmExplorationVolcengineSettlementRecord(value.providerSettlement)
485
+ : null;
486
+ if (
487
+ providerSettlement !== null &&
488
+ providerSettlement.settlement.settlementDigest !== traceDigest
489
+ ) {
490
+ throw new Error(
491
+ "PM exploration provider settlement must match the signed trace digest",
492
+ );
493
+ }
494
+ return Object.freeze({
495
+ outputMemoryDigest: digest(value.outputMemoryDigest, "outputMemoryDigest"),
496
+ traceDigest,
497
+ providerSettlement,
498
+ });
499
+ }
500
+
501
+ function normalizedGraderValue(value) {
502
+ exact(
503
+ value,
504
+ ["decision", "scoreBasisPoints", "resultDigest"],
505
+ "PM exploration grader result",
506
+ );
507
+ if (!["accept", "reject", "unsafe"].includes(value.decision))
508
+ throw new TypeError("PM exploration grader decision is invalid");
509
+ return Object.freeze({
510
+ decision: value.decision,
511
+ scoreBasisPoints: integer(
512
+ value.scoreBasisPoints,
513
+ "scoreBasisPoints",
514
+ 0,
515
+ 10_000,
516
+ ),
517
+ resultDigest: digest(value.resultDigest, "resultDigest"),
518
+ });
519
+ }
520
+
521
+ async function runActor(binding, request, limits, host, prepare) {
522
+ const outcome = await executePmExplorationBudgetedOperation({
523
+ limits,
524
+ allowedToolIds: host.manifest.toolIds,
525
+ invokeTool: host.invokeTool,
526
+ operation: async (runtime) => {
527
+ if (prepare !== null) {
528
+ await prepare(request, runtime.signal);
529
+ if (runtime.signal.aborted)
530
+ throw (
531
+ runtime.signal.reason ?? new Error("grader prepare was aborted")
532
+ );
533
+ }
534
+ return normalizedRunnerValue(await binding.handler(request, runtime));
535
+ },
536
+ });
537
+ const succeeded = outcome.status === "succeeded";
538
+ const payload = {
539
+ planDigest: host.plan.planDigest,
540
+ environmentDigest: host.plan.environmentDigest,
541
+ requestDigest: request.requestDigest,
542
+ roundId: request.roundId,
543
+ stage: request.stage,
544
+ branchId: request.branchId,
545
+ taskId: request.taskId,
546
+ inputMemoryDigest: request.inputMemoryDigest,
547
+ outputMemoryDigest: succeeded
548
+ ? outcome.value.outputMemoryDigest
549
+ : request.inputMemoryDigest,
550
+ traceDigest: succeeded ? outcome.value.traceDigest : outcome.traceDigest,
551
+ status: outcome.status,
552
+ failureClass: outcome.failureClass,
553
+ metrics: outcome.metrics,
554
+ issuedAt: isoTime(host.now),
555
+ };
556
+ return Object.freeze({
557
+ receipt: binding.issue(payload),
558
+ providerSettlement: succeeded ? outcome.value.providerSettlement : null,
559
+ });
560
+ }
561
+
562
+ async function runGrader(binding, request, limits, host) {
563
+ const outcome = await executePmExplorationBudgetedOperation({
564
+ limits,
565
+ operation: async (runtime) => {
566
+ const result = normalizedGraderValue(
567
+ await binding.handler(request, runtime),
568
+ );
569
+ if (
570
+ request.executionStatus !== "succeeded" &&
571
+ result.decision === "accept"
572
+ )
573
+ throw new Error("a failed execution cannot be accepted");
574
+ if (
575
+ result.decision === "accept" &&
576
+ request.outputMemoryDigest === request.inputMemoryDigest
577
+ ) {
578
+ throw new Error("an accepted execution must change the memory digest");
579
+ }
580
+ return result;
581
+ },
582
+ });
583
+ const result =
584
+ outcome.status === "succeeded"
585
+ ? outcome.value
586
+ : Object.freeze({
587
+ decision: "unsafe",
588
+ scoreBasisPoints: 0,
589
+ resultDigest: outcome.traceDigest,
590
+ });
591
+ return binding.issue({
592
+ planDigest: host.plan.planDigest,
593
+ environmentDigest: host.plan.environmentDigest,
594
+ requestDigest: request.requestDigest,
595
+ roundId: request.roundId,
596
+ executionReceiptDigest: request.executionReceiptDigest,
597
+ outputMemoryDigest: request.outputMemoryDigest,
598
+ decision: result.decision,
599
+ scoreBasisPoints: result.scoreBasisPoints,
600
+ resultDigest: result.resultDigest,
601
+ metrics: outcome.metrics,
602
+ issuedAt: isoTime(host.now),
603
+ });
604
+ }
605
+
606
+ export async function executePmExplorationRound(hostValue, journal, input) {
607
+ const host = HOSTS.get(hostValue);
608
+ if (!host)
609
+ throw new TypeError("a branded PM exploration execution host is required");
610
+ exact(
611
+ input,
612
+ ["roundId", "stage", "branchId", "taskId", "inputMemoryDigest"],
613
+ "PM exploration hosted round",
614
+ );
615
+ const roundInput = Object.freeze({
616
+ roundId: identifier(input.roundId, "roundId"),
617
+ stage: input.stage,
618
+ branchId: input.branchId,
619
+ taskId: identifier(input.taskId, "taskId"),
620
+ inputMemoryDigest: digest(input.inputMemoryDigest, "inputMemoryDigest"),
621
+ });
622
+ const before = inspectPmExplorationJournal(journal);
623
+ if (before.planDigest !== host.plan.planDigest)
624
+ throw new Error("PM exploration journal differs from the execution host");
625
+ const round = startPmExplorationRound(journal, roundInput);
626
+ const runCore = {
627
+ schema: PM_EXPLORATION_RUN_REQUEST_SCHEMA,
628
+ planDigest: host.plan.planDigest,
629
+ suiteDigest: host.plan.suiteDigest,
630
+ trainingPartitionDigest: host.plan.trainingPartitionDigest,
631
+ environmentDigest: host.plan.environmentDigest,
632
+ executionManifestDigest: host.manifest.manifestDigest,
633
+ toolPolicyDigest: host.manifest.toolPolicyDigest,
634
+ ...roundInput,
635
+ };
636
+ const runRequest = deepFreeze({
637
+ ...runCore,
638
+ requestDigest: hash(PM_EXPLORATION_RUN_REQUEST_SCHEMA, runCore),
639
+ });
640
+ const executionOutcome = await runActor(
641
+ host.runner,
642
+ runRequest,
643
+ remaining(host.plan, totalUsage(host, journal, before)),
644
+ host,
645
+ host.grader.prepare,
646
+ );
647
+ const executionReceipt = executionOutcome.receipt;
648
+ const execution = verifyPmExplorationReceipt(
649
+ host.runner.authority,
650
+ executionReceipt,
651
+ {
652
+ planDigest: host.plan.planDigest,
653
+ environmentDigest: host.plan.environmentDigest,
654
+ requestDigest: runRequest.requestDigest,
655
+ roundId: roundInput.roundId,
656
+ stage: roundInput.stage,
657
+ branchId: roundInput.branchId,
658
+ taskId: roundInput.taskId,
659
+ inputMemoryDigest: roundInput.inputMemoryDigest,
660
+ },
661
+ );
662
+ const afterExecution = addMetrics(
663
+ totalUsage(host, journal, before),
664
+ execution.payload.metrics,
665
+ );
666
+ const gradeCore = {
667
+ schema: PM_EXPLORATION_GRADE_REQUEST_SCHEMA,
668
+ planDigest: host.plan.planDigest,
669
+ environmentDigest: host.plan.environmentDigest,
670
+ executionManifestDigest: host.manifest.manifestDigest,
671
+ roundId: roundInput.roundId,
672
+ taskId: roundInput.taskId,
673
+ executionRequestDigest: runRequest.requestDigest,
674
+ inputMemoryDigest: roundInput.inputMemoryDigest,
675
+ outputMemoryDigest: execution.payload.outputMemoryDigest,
676
+ executionStatus: execution.payload.status,
677
+ executionReceiptDigest: execution.receiptDigest,
678
+ traceDigest: execution.payload.traceDigest,
679
+ };
680
+ const gradeRequest = deepFreeze({
681
+ ...gradeCore,
682
+ requestDigest: hash(PM_EXPLORATION_GRADE_REQUEST_SCHEMA, gradeCore),
683
+ });
684
+ const graderReceipt = await runGrader(
685
+ host.grader,
686
+ gradeRequest,
687
+ remaining(host.plan, afterExecution),
688
+ host,
689
+ );
690
+ const grade = verifyPmExplorationReceipt(
691
+ host.grader.authority,
692
+ graderReceipt,
693
+ {
694
+ planDigest: host.plan.planDigest,
695
+ environmentDigest: host.plan.environmentDigest,
696
+ requestDigest: gradeRequest.requestDigest,
697
+ roundId: roundInput.roundId,
698
+ executionReceiptDigest: execution.receiptDigest,
699
+ outputMemoryDigest: execution.payload.outputMemoryDigest,
700
+ },
701
+ );
702
+ const consumed = addMetrics(execution.payload.metrics, grade.payload.metrics);
703
+ const checkpoint = completePmExplorationRound(journal, round, {
704
+ executionReceiptDigest: execution.receiptDigest,
705
+ graderReceiptDigest: grade.receiptDigest,
706
+ outputMemoryDigest: execution.payload.outputMemoryDigest,
707
+ decision: grade.payload.decision,
708
+ metrics: consumed,
709
+ });
710
+ return deepFreeze({
711
+ schema: PM_EXPLORATION_EXECUTION_RESULT_SCHEMA,
712
+ checkpoint,
713
+ executionReceipt: execution,
714
+ graderReceipt: grade,
715
+ providerSettlement: executionOutcome.providerSettlement,
716
+ budgetEnforced: true,
717
+ receiptsAuthenticated: true,
718
+ snapshotAuthenticated: false,
719
+ qualifiesForPromotion: false,
720
+ });
721
+ }
722
+
723
+ function normalizedMergerValue(value) {
724
+ exact(
725
+ value,
726
+ ["outputMemoryDigest", "conflictResolutionDigest"],
727
+ "PM exploration merger result",
728
+ );
729
+ return Object.freeze({
730
+ outputMemoryDigest: digest(value.outputMemoryDigest, "outputMemoryDigest"),
731
+ conflictResolutionDigest: digest(
732
+ value.conflictResolutionDigest,
733
+ "conflictResolutionDigest",
734
+ ),
735
+ });
736
+ }
737
+
738
+ function normalizedEvaluatorValue(value) {
739
+ exact(
740
+ value,
741
+ ["decision", "scoreBasisPoints", "evaluationDigest"],
742
+ "PM exploration evaluator result",
743
+ );
744
+ if (!["accept", "reject", "unsafe"].includes(value.decision))
745
+ throw new TypeError("PM exploration evaluator decision is invalid");
746
+ return Object.freeze({
747
+ decision: value.decision,
748
+ scoreBasisPoints: integer(
749
+ value.scoreBasisPoints,
750
+ "scoreBasisPoints",
751
+ 0,
752
+ 10_000,
753
+ ),
754
+ evaluationDigest: digest(value.evaluationDigest, "evaluationDigest"),
755
+ });
756
+ }
757
+
758
+ export async function mergePmExplorationBranches(hostValue, journal, input) {
759
+ const host = HOSTS.get(hostValue);
760
+ if (!host)
761
+ throw new TypeError("a branded PM exploration execution host is required");
762
+ exact(input, ["mergeId"], "PM exploration hosted merge");
763
+ const mergeId = identifier(input.mergeId, "mergeId");
764
+ const projection = inspectPmExplorationJournal(journal);
765
+ if (projection.planDigest !== host.plan.planDigest)
766
+ throw new Error("PM exploration journal differs from the execution host");
767
+ if (
768
+ projection.stage !== "broad" ||
769
+ projection.activeRoundCount !== 0 ||
770
+ projection.branchHeads.some((entry) => entry.checkpointDigest === null)
771
+ ) {
772
+ throw new Error("PM exploration branches are not ready to merge");
773
+ }
774
+ const branchCheckpoints = projection.branchHeads.map((entry) =>
775
+ Object.freeze({
776
+ branchId: entry.branchId,
777
+ checkpointDigest: entry.checkpointDigest,
778
+ memoryDigest: entry.memoryDigest,
779
+ }),
780
+ );
781
+ const core = {
782
+ schema: PM_EXPLORATION_MERGE_REQUEST_SCHEMA,
783
+ planDigest: host.plan.planDigest,
784
+ environmentDigest: host.plan.environmentDigest,
785
+ executionManifestDigest: host.manifest.manifestDigest,
786
+ mergeId,
787
+ baseMemoryDigest: host.plan.initialMemoryDigest,
788
+ branchCheckpoints,
789
+ };
790
+ const request = deepFreeze({
791
+ ...core,
792
+ requestDigest: hash(PM_EXPLORATION_MERGE_REQUEST_SCHEMA, core),
793
+ });
794
+ const outcome = await executePmExplorationBudgetedOperation({
795
+ limits: remaining(host.plan, totalUsage(host, journal, projection)),
796
+ operation: async (runtime) =>
797
+ normalizedMergerValue(await host.merger.handler(request, runtime)),
798
+ });
799
+ const succeeded = outcome.status === "succeeded";
800
+ const receipt = host.merger.issue({
801
+ planDigest: host.plan.planDigest,
802
+ environmentDigest: host.plan.environmentDigest,
803
+ requestDigest: request.requestDigest,
804
+ mergeId,
805
+ branchCheckpoints,
806
+ outputMemoryDigest: succeeded
807
+ ? outcome.value.outputMemoryDigest
808
+ : host.plan.initialMemoryDigest,
809
+ conflictResolutionDigest: succeeded
810
+ ? outcome.value.conflictResolutionDigest
811
+ : outcome.traceDigest,
812
+ status: outcome.status,
813
+ failureClass: outcome.failureClass,
814
+ metrics: outcome.metrics,
815
+ issuedAt: isoTime(host.now),
816
+ });
817
+ const verified = verifyPmExplorationReceipt(host.merger.authority, receipt, {
818
+ planDigest: host.plan.planDigest,
819
+ environmentDigest: host.plan.environmentDigest,
820
+ requestDigest: request.requestDigest,
821
+ mergeId,
822
+ branchCheckpoints,
823
+ });
824
+ recordOverhead(host, journal, verified.payload.metrics);
825
+ const merge = succeeded
826
+ ? mergePmExplorationBroadBranches(journal, {
827
+ mergeId,
828
+ outputMemoryDigest: verified.payload.outputMemoryDigest,
829
+ conflictResolutionReceiptDigest: verified.receiptDigest,
830
+ })
831
+ : null;
832
+ return deepFreeze({
833
+ schema: PM_EXPLORATION_MERGE_RESULT_SCHEMA,
834
+ merge,
835
+ mergeReceipt: verified,
836
+ budgetEnforced: true,
837
+ receiptsAuthenticated: true,
838
+ snapshotAuthenticated: false,
839
+ qualifiesForPromotion: false,
840
+ });
841
+ }
842
+
843
+ export async function evaluatePmExplorationMemory(hostValue, journal, input) {
844
+ const host = HOSTS.get(hostValue);
845
+ if (!host)
846
+ throw new TypeError("a branded PM exploration execution host is required");
847
+ exact(
848
+ input,
849
+ ["finalMemoryDigest", "mergeReceipt"],
850
+ "PM exploration hosted evaluation",
851
+ );
852
+ const finalMemoryDigest = digest(
853
+ input.finalMemoryDigest,
854
+ "finalMemoryDigest",
855
+ );
856
+ const projection = inspectPmExplorationJournal(journal);
857
+ if (
858
+ projection.planDigest !== host.plan.planDigest ||
859
+ projection.stage !== "deep" ||
860
+ projection.activeRoundCount !== 0 ||
861
+ projection.deepHead !== finalMemoryDigest ||
862
+ projection.finalCheckpointDigest === null
863
+ ) {
864
+ throw new Error("PM exploration memory is not ready for evaluation");
865
+ }
866
+ const mergeReceipt = verifyPmExplorationReceipt(
867
+ host.merger.authority,
868
+ input.mergeReceipt,
869
+ {
870
+ planDigest: host.plan.planDigest,
871
+ environmentDigest: host.plan.environmentDigest,
872
+ status: "succeeded",
873
+ },
874
+ );
875
+ if (projection.mergeReceiptDigest !== mergeReceipt.receiptDigest)
876
+ throw new Error("PM exploration merge receipt differs from the journal");
877
+ const core = {
878
+ schema: PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA,
879
+ planDigest: host.plan.planDigest,
880
+ environmentDigest: host.plan.environmentDigest,
881
+ executionManifestDigest: host.manifest.manifestDigest,
882
+ mergeDigest: projection.mergeDigest,
883
+ mergeReceiptDigest: mergeReceipt.receiptDigest,
884
+ finalCheckpointDigest: projection.finalCheckpointDigest,
885
+ finalMemoryDigest,
886
+ };
887
+ const request = deepFreeze({
888
+ ...core,
889
+ requestDigest: hash(PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA, core),
890
+ });
891
+ const outcome = await executePmExplorationBudgetedOperation({
892
+ limits: remaining(host.plan, totalUsage(host, journal, projection)),
893
+ operation: async (runtime) =>
894
+ normalizedEvaluatorValue(await host.evaluator.handler(request, runtime)),
895
+ });
896
+ const evaluation =
897
+ outcome.status === "succeeded"
898
+ ? outcome.value
899
+ : Object.freeze({
900
+ decision: "unsafe",
901
+ scoreBasisPoints: 0,
902
+ evaluationDigest: outcome.traceDigest,
903
+ });
904
+ const receipt = host.evaluator.issue({
905
+ planDigest: host.plan.planDigest,
906
+ environmentDigest: host.plan.environmentDigest,
907
+ requestDigest: request.requestDigest,
908
+ mergeReceiptDigest: mergeReceipt.receiptDigest,
909
+ finalCheckpointDigest: projection.finalCheckpointDigest,
910
+ finalMemoryDigest,
911
+ decision: evaluation.decision,
912
+ scoreBasisPoints: evaluation.scoreBasisPoints,
913
+ evaluationDigest: evaluation.evaluationDigest,
914
+ metrics: outcome.metrics,
915
+ issuedAt: isoTime(host.now),
916
+ });
917
+ const verified = verifyPmExplorationReceipt(
918
+ host.evaluator.authority,
919
+ receipt,
920
+ {
921
+ planDigest: host.plan.planDigest,
922
+ environmentDigest: host.plan.environmentDigest,
923
+ requestDigest: request.requestDigest,
924
+ mergeReceiptDigest: mergeReceipt.receiptDigest,
925
+ finalCheckpointDigest: projection.finalCheckpointDigest,
926
+ finalMemoryDigest,
927
+ },
928
+ );
929
+ recordOverhead(host, journal, verified.payload.metrics);
930
+ const frozen =
931
+ verified.payload.decision === "accept"
932
+ ? freezePmExplorationMemory(journal, {
933
+ finalMemoryDigest,
934
+ evaluatorReceiptDigest: verified.receiptDigest,
935
+ })
936
+ : null;
937
+ return deepFreeze({
938
+ schema: PM_EXPLORATION_EVALUATION_RESULT_SCHEMA,
939
+ frozen,
940
+ evaluatorReceipt: verified,
941
+ budgetEnforced: true,
942
+ receiptsAuthenticated: true,
943
+ snapshotAuthenticated: false,
944
+ qualifiesForPromotion: false,
945
+ });
946
+ }