chainlesschain 0.166.65 → 0.166.68
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.
- package/README.md +20 -12
- package/package.json +4 -4
- package/src/assets/web-panel/assets/{AIOps-Byz17CTN.js → AIOps-CXkSNOGY.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-C5LiW2-J.js → ActionButton-ysMR6gTs.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D1INcvZF.js → Analytics-WGZ0sWuw.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DZzHO1VV.js → AppLayout-Cs2iRlQG.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-WfYQL6Ia.js → Artifacts-5IdfxWz0.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DohBoGWO.js → Audit-U9V434QX.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Chtk-Hde.js → BackgroundAgents-BvFwxPlC.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B813PuMz.js → Backup-C9yTr9hO.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DaDdWWgK.js → BaseInput-BdsSwUgE.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D4pJ6oZ7.js → Chat-BB_2oBgH.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bpf1hDUl.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Clo9TvO6.js → Checkbox-v6M5m7dK.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-uejLg8Ih.js → Codegen-CtouWSIz.js} +1 -1
- package/src/assets/web-panel/assets/{Col-B7nbx-iJ.js → Col-CqQJ4ORW.js} +1 -1
- package/src/assets/web-panel/assets/{Community-FEyjPK1j.js → Community-BO__QCOy.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B6Fk0Kn6.js → Compact-D0Kq4xlH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BQG8goUl.js → Compliance-BSLKKBjA.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CbBeEfHp.js → Cowork-VsujXW5o.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DPzlFcEZ.js → Cron-j8DbLGi5.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B8pWJrbg.js → Crosschain-DWpYH1yN.js} +1 -1
- package/src/assets/web-panel/assets/{DID-gGQHUlFN.js → DID-mLaRxLQh.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C2TMFHrn.js → Dashboard-Cff033Jr.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BVPxGbll.js → Dropdown-B1Upt6fP.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CNPxs0hd.js → EmailListRenderer-CPtb8joV.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-_XTiB7q1.js → EvolutionSettings-CVh4Uv4g.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-UyE3VWtI.js → FamilyGuardDashboard-CrD1PhbF.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CLt6FHK-.js → Federation-ftxrvqW5.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CdNQPRPw.js → FormItemContext-9O80slC1.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BJ0AMhrh.js → GenericCardRenderer-DaYvYIj9.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CQnvMfOM.js → Git-BKZh0YE5.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-deYsHC-o.js → Governance-vWbN873j.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-qaSck43z.js → Inference-BN6RR-l8.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-De0aJ3Ls.js → KnowledgeGraph-x49x9m7Q.js} +1 -1
- package/src/assets/web-panel/assets/Logs-Co2EPLsJ.js +2 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-D7wIB-c7.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Byz3xCBN.js → Marketplace-DpPu6XQp.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DOZUUW6z.js → McpTools-BR0ksiax.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-C33wC2hA.js → Memory-BXznJ5-C.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-zZe-T_6M.js → MobileBridge-BHSOpfv7.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CRnUIume.js → MobileProjects-DdWmgIup.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-C1xlRVAN.js → Mtc-D9Rk_IGT.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-D0U07bIi.js → MtcAudit--i8q1lKc.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DF8uvV3h.js → Multisig-BHnNG7R9.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-bBPGAFlt.js → NLProgramming-Duo1ij2_.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BHAaOsgg.js → Notes-B44Le73p.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Cl0fG_rA.js → NotificationSettings-C3oy_7Gf.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BEPAs8Zv.js → OrderTableRenderer-Da_73SI5.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BAxSwgk5.js → Organization-ChsSwKxT.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-D68KubAu.js → Overflow-DR5G_cCn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-bhdT17zk.js → P2P-yfaobqow.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DgimH6Jp.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-Bq8fvkak.js → Permissions-DhinFvtE.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BYd2JEic.js → PersonalDataHub-CfeNVic1.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-Csg_ja69.js → Pipeline-CGKO26Nk.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-lwxwLj4M.js → Privacy-CxxfYEJh.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BdBZkH8z.js → ProjectInit-CZsaAab9.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-ClWgFy-K.js → ProjectSettings-BUm_6clQ.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Bu-qj8N1.js → Projects-Capr8bVq.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DEjxrxw3.js → Providers-D28VqPja.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-eccy-8Vi.js → QrScannerModal-Cj200vUb.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Vx3uDvFg.js → QuickAsk-BGpnEiam.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CfUivNps.js → Recommend-Ix79Tpni.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BU4gk7GI.js → RemoteSession-BdGAFbIk.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-CbPzdZ0C.js → Reputation-B1Lis0Wk.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CYLrgfKA.js → Row-Ba_okwOW.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DbY1oyuv.js → RssFeed-DDbEuI-m.js} +3 -3
- package/src/assets/web-panel/assets/{Search-QeW41K5r.js → Search-D89wAkMy.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CJxf1kLZ.js → Security-CJKCKAU-.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CFO9ySZc.js → Services-mitEc1XV.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CQFjeQN0.js → Skeleton-CnBjLDfX.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CLLB4INW.js → Skills-DSzDYvH3.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DxeLIJk0.js → Sla-CglJ_4p3.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-BicWJS7f.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-C6NOkcQK.js → SyncSettings-Cq7o6fmr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-LmVPWDfQ.js → Tasks-DOxFOBpU.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BdEfUoVB.js → Templates-bY0wSbQM.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-IUlESacN.js → Tenant-BAyyl0qX.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B9pDe7sn.js → Terminal-BGBhSpqc.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-ZCwB-Pki.js → TimelineRenderer-BvW5lXYz.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-4qk16LX1.js → Tokens-Ua_LIx8-.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-jXNyargn.js → Trigger-BGwb2KL1.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D13PydtT.js → Trust-CD2IEHvj.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-yPgws6mS.js → UkeySign-D5LetK6P.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B329WjpG.js → VideoEditing-oP7ehFgR.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-T8VM-Ttm.js → Wallet-BBtu4-xa.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-XuRibrpP.js → WebAuthn-iSPRU4Ht.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-D1Gwz3YR.js → WorkflowEditor-DuEDhQmB.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DjydtnT-.js → chat-DGDgqvvm.js} +1 -1
- package/src/assets/web-panel/assets/{colors-gFtBvPrr.js → colors-DGQMWa1-.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CndxhGfx.js → compact-item-COVznBL4.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DnfGpd0L.js → createContext-DIxVeHXI.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CjR9h-Z_.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CmT5hRVW.js → hasIn-DkxZO3E9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGlmPbl_.js → index-0ToBFsvW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsRKmb6k.js → index-2JZizEPc.js} +1 -1
- package/src/assets/web-panel/assets/{index-C14jryXi.js → index-BAL2p7YC.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0WFjxWs.js → index-BAlrovUm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlTcxT_L.js → index-BBw2MLIe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjcR-CwS.js → index-BHH95jcm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DreYqebI.js → index-BOTshZNx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaEPE2DC.js → index-BQm7ntcn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNHdO6Jr.js → index-BUqwlzc8.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3HvYeA3.js → index-BY6MSbWT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUlubR4l.js → index-BY9Ossof.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbpk75MO.js → index-BgM-3a1w.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqpR0Des.js → index-Bv0_u0ze.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjY-3sMA.js → index-C3XeNS82.js} +3 -3
- package/src/assets/web-panel/assets/{index-DV6NrfJx.js → index-C3bN6751.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuAvYTmY.js → index-CNRRrP3-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW3nWiu0.js → index-CV0KnNqR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZLDbPTa.js → index-CcNGQWum.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5na0B7G.js → index-Ci34vbh0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoBKSzqu.js → index-ClQVcrFt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuOx4Pbe.js → index-Cligb-Dl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgMKElUh.js → index-CokrhbY2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFif4Cev.js → index-CpZxDiVK.js} +1 -1
- package/src/assets/web-panel/assets/{index-HHP1zzo7.js → index-CyMHF2Bi.js} +1 -1
- package/src/assets/web-panel/assets/{index-_-wGLtAg.js → index-DDwPBGdA.js} +1 -1
- package/src/assets/web-panel/assets/{index-ktN-K1Tf.js → index-DU1ArKl5.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4Mqhmas.js → index-DV0H83eS.js} +1 -1
- package/src/assets/web-panel/assets/index-D_nxBMX5.js +1 -0
- package/src/assets/web-panel/assets/{index-BXNUTiW8.js → index-DaWQSp5a.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKyuE_Y2.js → index-DmduvOYT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DV2PR3Fa.js → index-ECoDhyH3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVM_w30N.js → index-ZcqTvPnt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRqz8TtI.js → index-b2_M6o20.js} +1 -1
- package/src/assets/web-panel/assets/{index-CB27echm.js → index-b_0qTo8O.js} +1 -1
- package/src/assets/web-panel/assets/{index-D88-8bsB.js → index-dfYkGovV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGbKeg8G.js → index-jo7DbU0w.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2d7358Y.js → index-usmG13jq.js} +1 -1
- package/src/assets/web-panel/assets/{index-zQf599Uq.js → index-vXrktF3e.js} +1 -1
- package/src/assets/web-panel/assets/index-z_cTUMX-.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-KV3V-PNH.js → initDefaultProps-CkSeiBwL.js} +1 -1
- package/src/assets/web-panel/assets/{motion-PFGQg7_X.js → motion-CSzhDP0s.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dnl79wq4.js → move-mgCt4iC6.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Bwl5JH9V.js → mtc-parser-BEZBLcKt.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DCcTtM1l.js → omit-BsHctMEr.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Cl6BjjDf.js → pickAttrs-1BHamnGW.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-fdqhyo42.js → placementArrow--Vb4Bd7l.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DYQpmcDW.js → responsiveObserve-DD33SqCm.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C4l-VfO4.js → slide-DfrLtxgK.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DYDw_dyZ.js → statusUtils-D9Pe_gXW.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BEsubSMu.js → styleChecker-0NY5iMun.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Cj82ggQ_.js → useFlexGapSupport-DSsZstwg.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B7L1eJ0V.js → useFs-BU8HyH59.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DVlJVD4d.js → usePersonalDataHub-D_xttink.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BBAbRN_Y.js → vnode-39VhX2lM.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BYn48q-I.js → zoom-D5KQ8Pks.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +20 -7
- package/src/lib/dependency-install-policy.js +1 -1
- package/src/lib/evolution/browser-download-action-authority.js +747 -0
- package/src/lib/evolution/browser-download-artifact-disposal-authority.js +436 -0
- package/src/lib/evolution/browser-filesystem-quarantine-custody.js +2453 -0
- package/src/lib/evolution/browser-filesystem-quarantine-disposal.js +36 -0
- package/src/lib/evolution/browser-keyboard-action-authority.js +560 -0
- package/src/lib/evolution/browser-navigation-action-authority.js +546 -0
- package/src/lib/evolution/browser-quarantine-lock-maintenance-authority.js +573 -0
- package/src/lib/evolution/browser-quarantine-operator-revocation-authority.js +442 -0
- package/src/lib/evolution/browser-quarantine-retention-authority.js +503 -0
- package/src/lib/evolution/browser-quarantine-retention-scheduler.js +207 -0
- package/src/lib/evolution/browser-quarantined-download-executor.js +525 -0
- package/src/lib/evolution/browser-tab-open-action-authority.js +491 -0
- package/src/lib/evolution/browser-vision-action-authority.js +444 -0
- package/src/lib/evolution/browser-vision-observation-authority.js +304 -0
- package/src/lib/evolution/evolution-deployment-loader.js +202 -1
- package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +5 -0
- package/src/lib/evolution/evolution-eval-gate.js +2 -1
- package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +71 -9
- package/src/lib/evolution/evolution-eval-process-supervisor.js +276 -9
- package/src/lib/evolution/evolution-workbench-metrics.js +81 -21
- package/src/lib/evolution/pm-exploration-benchmark.js +747 -0
- package/src/lib/evolution/pm-exploration-budget-executor.js +106 -9
- package/src/lib/evolution/pm-exploration-egress-authority.js +382 -0
- package/src/lib/evolution/pm-exploration-evidence-bundle.js +149 -44
- package/src/lib/evolution/pm-exploration-execution-host.js +1254 -8
- package/src/lib/evolution/pm-exploration-process-grader.js +458 -0
- package/src/lib/evolution/pm-exploration-process-reviewer.js +456 -0
- package/src/lib/evolution/pm-exploration-process-runner.js +500 -0
- package/src/lib/evolution/pm-exploration-receipts.js +211 -11
- package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +465 -46
- package/src/lib/evolution/pm-exploration-transition-committer.js +185 -34
- package/src/lib/evolution/skill-outcome-index-authority.js +7 -3
- package/src/lib/governance-coverage.js +1 -1
- package/src/lib/headless-manifest.js +1 -1
- package/src/lib/protocol-replay.js +1 -1
- package/src/lib/skill-outcome-transcript-authority.js +45 -5
- package/src/runtime/agent-core.js +17 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Cf3LLgDc.js +0 -1
- package/src/assets/web-panel/assets/Logs-ZtS98jCm.js +0 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CTsYo9NN.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DqaO6wgH.js +0 -7
- package/src/assets/web-panel/assets/SpeechSettings-D4FA9KYI.js +0 -1
- package/src/assets/web-panel/assets/devWarning-D60SbiD-.js +0 -1
- package/src/assets/web-panel/assets/index-C0yR4_7h.js +0 -1
- package/src/assets/web-panel/assets/index-D4xuvo03.js +0 -1
|
@@ -10,6 +10,12 @@ import {
|
|
|
10
10
|
verifyPmExplorationPlan,
|
|
11
11
|
} from "./pm-exploration-rounds.js";
|
|
12
12
|
import { executePmExplorationBudgetedOperation } from "./pm-exploration-budget-executor.js";
|
|
13
|
+
import {
|
|
14
|
+
inspectPmExplorationEgressAuthority,
|
|
15
|
+
invokePmExplorationModelEgress,
|
|
16
|
+
PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA,
|
|
17
|
+
retrievePmExplorationMemory,
|
|
18
|
+
} from "./pm-exploration-egress-authority.js";
|
|
13
19
|
import {
|
|
14
20
|
getPmExplorationReceiptSignerAuthority,
|
|
15
21
|
inspectPmExplorationReceiptAuthority,
|
|
@@ -17,9 +23,40 @@ import {
|
|
|
17
23
|
verifyPmExplorationReceipt,
|
|
18
24
|
} from "./pm-exploration-receipts.js";
|
|
19
25
|
import { verifyPmExplorationVolcengineSettlementRecord } from "./pm-exploration-volcengine-provider.js";
|
|
26
|
+
import {
|
|
27
|
+
createPmExplorationProcessGraderExecutor,
|
|
28
|
+
inspectPmExplorationProcessGraderExecutor,
|
|
29
|
+
invokePmExplorationProcessGrader,
|
|
30
|
+
PM_EXPLORATION_GRADER_ISOLATION_SCHEMA,
|
|
31
|
+
} from "./pm-exploration-process-grader.js";
|
|
32
|
+
import {
|
|
33
|
+
createPmExplorationProcessRunnerExecutor,
|
|
34
|
+
inspectPmExplorationProcessRunnerExecutor,
|
|
35
|
+
invokePmExplorationProcessRunner,
|
|
36
|
+
PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA,
|
|
37
|
+
PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2,
|
|
38
|
+
} from "./pm-exploration-process-runner.js";
|
|
39
|
+
import {
|
|
40
|
+
createPmExplorationProcessReviewerExecutor,
|
|
41
|
+
inspectPmExplorationProcessReviewerExecutor,
|
|
42
|
+
invokePmExplorationProcessReviewer,
|
|
43
|
+
PM_EXPLORATION_CURRICULUM_ISOLATION_SCHEMA,
|
|
44
|
+
PM_EXPLORATION_EVALUATOR_ISOLATION_SCHEMA,
|
|
45
|
+
PM_EXPLORATION_MERGER_ISOLATION_SCHEMA,
|
|
46
|
+
} from "./pm-exploration-process-reviewer.js";
|
|
20
47
|
|
|
21
|
-
export const
|
|
48
|
+
export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2 =
|
|
22
49
|
"chainlesschain.pm-exploration-execution-manifest/v2";
|
|
50
|
+
export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3 =
|
|
51
|
+
"chainlesschain.pm-exploration-execution-manifest/v3";
|
|
52
|
+
export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4 =
|
|
53
|
+
"chainlesschain.pm-exploration-execution-manifest/v4";
|
|
54
|
+
export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5 =
|
|
55
|
+
"chainlesschain.pm-exploration-execution-manifest/v5";
|
|
56
|
+
export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6 =
|
|
57
|
+
"chainlesschain.pm-exploration-execution-manifest/v6";
|
|
58
|
+
export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA =
|
|
59
|
+
"chainlesschain.pm-exploration-execution-manifest/v7";
|
|
23
60
|
export const PM_EXPLORATION_RUN_REQUEST_SCHEMA =
|
|
24
61
|
"chainlesschain.pm-exploration-run-request/v1";
|
|
25
62
|
export const PM_EXPLORATION_GRADE_REQUEST_SCHEMA_V1 =
|
|
@@ -36,6 +73,10 @@ export const PM_EXPLORATION_MERGE_REQUEST_SCHEMA =
|
|
|
36
73
|
"chainlesschain.pm-exploration-merge-request/v1";
|
|
37
74
|
export const PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA =
|
|
38
75
|
"chainlesschain.pm-exploration-evaluation-request/v1";
|
|
76
|
+
export const PM_EXPLORATION_TASK_SELECTION_REQUEST_SCHEMA =
|
|
77
|
+
"chainlesschain.pm-exploration-task-selection-request/v1";
|
|
78
|
+
export const PM_EXPLORATION_TASK_SELECTION_RESULT_SCHEMA =
|
|
79
|
+
"chainlesschain.pm-exploration-task-selection-result/v1";
|
|
39
80
|
|
|
40
81
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
41
82
|
const ID = /^[a-z][a-z0-9]*(?:[._:-][a-z0-9]+)*$/u;
|
|
@@ -43,6 +84,7 @@ const RUNNERS = new WeakMap();
|
|
|
43
84
|
const GRADERS = new WeakMap();
|
|
44
85
|
const MERGERS = new WeakMap();
|
|
45
86
|
const EVALUATORS = new WeakMap();
|
|
87
|
+
const CURRICULA = new WeakMap();
|
|
46
88
|
const HOSTS = new WeakMap();
|
|
47
89
|
|
|
48
90
|
function canonical(value) {
|
|
@@ -144,6 +186,235 @@ function authorityDescriptor(value, expectedRole, label) {
|
|
|
144
186
|
});
|
|
145
187
|
}
|
|
146
188
|
|
|
189
|
+
function graderIsolationDescriptor(value) {
|
|
190
|
+
exact(
|
|
191
|
+
value,
|
|
192
|
+
[
|
|
193
|
+
"schema",
|
|
194
|
+
"mode",
|
|
195
|
+
"targetDigest",
|
|
196
|
+
"targetAuthorityDigest",
|
|
197
|
+
"handlerId",
|
|
198
|
+
"handlerRevision",
|
|
199
|
+
"operation",
|
|
200
|
+
"handlerArtifactDigest",
|
|
201
|
+
"supervisorAuthorityDigest",
|
|
202
|
+
"maxWallClockMs",
|
|
203
|
+
],
|
|
204
|
+
"graderIsolation",
|
|
205
|
+
);
|
|
206
|
+
if (
|
|
207
|
+
value.schema !== PM_EXPLORATION_GRADER_ISOLATION_SCHEMA ||
|
|
208
|
+
value.mode !== "process" ||
|
|
209
|
+
value.operation !== "pm-exploration-grade"
|
|
210
|
+
) {
|
|
211
|
+
throw new TypeError("graderIsolation descriptor is invalid");
|
|
212
|
+
}
|
|
213
|
+
return deepFreeze({
|
|
214
|
+
schema: value.schema,
|
|
215
|
+
mode: value.mode,
|
|
216
|
+
targetDigest: digest(value.targetDigest, "graderIsolation.targetDigest"),
|
|
217
|
+
targetAuthorityDigest: digest(
|
|
218
|
+
value.targetAuthorityDigest,
|
|
219
|
+
"graderIsolation.targetAuthorityDigest",
|
|
220
|
+
),
|
|
221
|
+
handlerId: identifier(value.handlerId, "graderIsolation.handlerId"),
|
|
222
|
+
handlerRevision: identifier(
|
|
223
|
+
value.handlerRevision,
|
|
224
|
+
"graderIsolation.handlerRevision",
|
|
225
|
+
),
|
|
226
|
+
operation: value.operation,
|
|
227
|
+
handlerArtifactDigest: digest(
|
|
228
|
+
value.handlerArtifactDigest,
|
|
229
|
+
"graderIsolation.handlerArtifactDigest",
|
|
230
|
+
),
|
|
231
|
+
supervisorAuthorityDigest: digest(
|
|
232
|
+
value.supervisorAuthorityDigest,
|
|
233
|
+
"graderIsolation.supervisorAuthorityDigest",
|
|
234
|
+
),
|
|
235
|
+
maxWallClockMs: integer(
|
|
236
|
+
value.maxWallClockMs,
|
|
237
|
+
"graderIsolation.maxWallClockMs",
|
|
238
|
+
1,
|
|
239
|
+
600_000,
|
|
240
|
+
),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function runnerIsolationDescriptor(value) {
|
|
245
|
+
exact(
|
|
246
|
+
value,
|
|
247
|
+
[
|
|
248
|
+
"schema",
|
|
249
|
+
"mode",
|
|
250
|
+
"brokerMode",
|
|
251
|
+
"targetDigest",
|
|
252
|
+
"targetAuthorityDigest",
|
|
253
|
+
"handlerId",
|
|
254
|
+
"handlerRevision",
|
|
255
|
+
"operation",
|
|
256
|
+
"handlerArtifactDigest",
|
|
257
|
+
"supervisorAuthorityDigest",
|
|
258
|
+
"maxWallClockMs",
|
|
259
|
+
],
|
|
260
|
+
"runnerIsolation",
|
|
261
|
+
);
|
|
262
|
+
if (
|
|
263
|
+
![
|
|
264
|
+
PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA,
|
|
265
|
+
PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2,
|
|
266
|
+
].includes(value.schema) ||
|
|
267
|
+
value.mode !== "process" ||
|
|
268
|
+
(value.schema === PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA
|
|
269
|
+
? value.brokerMode !== "parent-budgeted-tools"
|
|
270
|
+
: value.brokerMode !== "parent-budgeted-tools-memory-model") ||
|
|
271
|
+
value.operation !== "pm-exploration-run"
|
|
272
|
+
) {
|
|
273
|
+
throw new TypeError("runnerIsolation descriptor is invalid");
|
|
274
|
+
}
|
|
275
|
+
return deepFreeze({
|
|
276
|
+
schema: value.schema,
|
|
277
|
+
mode: value.mode,
|
|
278
|
+
brokerMode: value.brokerMode,
|
|
279
|
+
targetDigest: digest(value.targetDigest, "runnerIsolation.targetDigest"),
|
|
280
|
+
targetAuthorityDigest: digest(
|
|
281
|
+
value.targetAuthorityDigest,
|
|
282
|
+
"runnerIsolation.targetAuthorityDigest",
|
|
283
|
+
),
|
|
284
|
+
handlerId: identifier(value.handlerId, "runnerIsolation.handlerId"),
|
|
285
|
+
handlerRevision: identifier(
|
|
286
|
+
value.handlerRevision,
|
|
287
|
+
"runnerIsolation.handlerRevision",
|
|
288
|
+
),
|
|
289
|
+
operation: value.operation,
|
|
290
|
+
handlerArtifactDigest: digest(
|
|
291
|
+
value.handlerArtifactDigest,
|
|
292
|
+
"runnerIsolation.handlerArtifactDigest",
|
|
293
|
+
),
|
|
294
|
+
supervisorAuthorityDigest: digest(
|
|
295
|
+
value.supervisorAuthorityDigest,
|
|
296
|
+
"runnerIsolation.supervisorAuthorityDigest",
|
|
297
|
+
),
|
|
298
|
+
maxWallClockMs: integer(
|
|
299
|
+
value.maxWallClockMs,
|
|
300
|
+
"runnerIsolation.maxWallClockMs",
|
|
301
|
+
1,
|
|
302
|
+
600_000,
|
|
303
|
+
),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function egressAuthorityDescriptor(value, kind, label) {
|
|
308
|
+
exact(
|
|
309
|
+
value,
|
|
310
|
+
[
|
|
311
|
+
"schema",
|
|
312
|
+
"kind",
|
|
313
|
+
"authorityId",
|
|
314
|
+
"revision",
|
|
315
|
+
"handlerArtifactDigest",
|
|
316
|
+
"policyDigest",
|
|
317
|
+
"authorityDigest",
|
|
318
|
+
],
|
|
319
|
+
label,
|
|
320
|
+
);
|
|
321
|
+
if (
|
|
322
|
+
value.schema !== PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA ||
|
|
323
|
+
value.kind !== kind
|
|
324
|
+
) {
|
|
325
|
+
throw new TypeError(`${label} descriptor is invalid`);
|
|
326
|
+
}
|
|
327
|
+
const core = deepFreeze({
|
|
328
|
+
schema: value.schema,
|
|
329
|
+
kind: value.kind,
|
|
330
|
+
authorityId: identifier(value.authorityId, `${label}.authorityId`),
|
|
331
|
+
revision: integer(value.revision, `${label}.revision`, 1),
|
|
332
|
+
handlerArtifactDigest: digest(
|
|
333
|
+
value.handlerArtifactDigest,
|
|
334
|
+
`${label}.handlerArtifactDigest`,
|
|
335
|
+
),
|
|
336
|
+
policyDigest: digest(value.policyDigest, `${label}.policyDigest`),
|
|
337
|
+
});
|
|
338
|
+
const normalized = deepFreeze({
|
|
339
|
+
...core,
|
|
340
|
+
authorityDigest: hash(PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA, core),
|
|
341
|
+
});
|
|
342
|
+
if (normalized.authorityDigest !== value.authorityDigest)
|
|
343
|
+
throw new Error(`${label} authority digest mismatch`);
|
|
344
|
+
return normalized;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function reviewerIsolationDescriptor(value, kind) {
|
|
348
|
+
const label = `${kind}Isolation`;
|
|
349
|
+
const expected =
|
|
350
|
+
kind === "merger"
|
|
351
|
+
? {
|
|
352
|
+
operation: "pm-exploration-merge",
|
|
353
|
+
schema: PM_EXPLORATION_MERGER_ISOLATION_SCHEMA,
|
|
354
|
+
}
|
|
355
|
+
: kind === "evaluator"
|
|
356
|
+
? {
|
|
357
|
+
operation: "pm-exploration-evaluate",
|
|
358
|
+
schema: PM_EXPLORATION_EVALUATOR_ISOLATION_SCHEMA,
|
|
359
|
+
}
|
|
360
|
+
: {
|
|
361
|
+
operation: "pm-exploration-select-task",
|
|
362
|
+
schema: PM_EXPLORATION_CURRICULUM_ISOLATION_SCHEMA,
|
|
363
|
+
};
|
|
364
|
+
exact(
|
|
365
|
+
value,
|
|
366
|
+
[
|
|
367
|
+
"schema",
|
|
368
|
+
"mode",
|
|
369
|
+
"targetDigest",
|
|
370
|
+
"targetAuthorityDigest",
|
|
371
|
+
"handlerId",
|
|
372
|
+
"handlerRevision",
|
|
373
|
+
"operation",
|
|
374
|
+
"handlerArtifactDigest",
|
|
375
|
+
"supervisorAuthorityDigest",
|
|
376
|
+
"maxWallClockMs",
|
|
377
|
+
],
|
|
378
|
+
label,
|
|
379
|
+
);
|
|
380
|
+
if (
|
|
381
|
+
value.schema !== expected.schema ||
|
|
382
|
+
value.mode !== "process" ||
|
|
383
|
+
value.operation !== expected.operation
|
|
384
|
+
) {
|
|
385
|
+
throw new TypeError(`${label} descriptor is invalid`);
|
|
386
|
+
}
|
|
387
|
+
return deepFreeze({
|
|
388
|
+
schema: value.schema,
|
|
389
|
+
mode: value.mode,
|
|
390
|
+
targetDigest: digest(value.targetDigest, `${label}.targetDigest`),
|
|
391
|
+
targetAuthorityDigest: digest(
|
|
392
|
+
value.targetAuthorityDigest,
|
|
393
|
+
`${label}.targetAuthorityDigest`,
|
|
394
|
+
),
|
|
395
|
+
handlerId: identifier(value.handlerId, `${label}.handlerId`),
|
|
396
|
+
handlerRevision: identifier(
|
|
397
|
+
value.handlerRevision,
|
|
398
|
+
`${label}.handlerRevision`,
|
|
399
|
+
),
|
|
400
|
+
operation: value.operation,
|
|
401
|
+
handlerArtifactDigest: digest(
|
|
402
|
+
value.handlerArtifactDigest,
|
|
403
|
+
`${label}.handlerArtifactDigest`,
|
|
404
|
+
),
|
|
405
|
+
supervisorAuthorityDigest: digest(
|
|
406
|
+
value.supervisorAuthorityDigest,
|
|
407
|
+
`${label}.supervisorAuthorityDigest`,
|
|
408
|
+
),
|
|
409
|
+
maxWallClockMs: integer(
|
|
410
|
+
value.maxWallClockMs,
|
|
411
|
+
`${label}.maxWallClockMs`,
|
|
412
|
+
1,
|
|
413
|
+
600_000,
|
|
414
|
+
),
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
|
|
147
418
|
function toolIds(value) {
|
|
148
419
|
if (
|
|
149
420
|
!Array.isArray(value) ||
|
|
@@ -165,12 +436,51 @@ function toolIds(value) {
|
|
|
165
436
|
}
|
|
166
437
|
|
|
167
438
|
export function createPmExplorationExecutionManifest(input = {}) {
|
|
439
|
+
if (
|
|
440
|
+
!input ||
|
|
441
|
+
typeof input !== "object" ||
|
|
442
|
+
Array.isArray(input) ||
|
|
443
|
+
isProxy(input) ||
|
|
444
|
+
Object.getPrototypeOf(input) !== Object.prototype
|
|
445
|
+
) {
|
|
446
|
+
throw new TypeError(
|
|
447
|
+
"PM exploration execution manifest must be a plain object",
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
const hasRunnerIsolation = Reflect.ownKeys(input).includes("runnerIsolation");
|
|
451
|
+
const hasGraderIsolation = Reflect.ownKeys(input).includes("graderIsolation");
|
|
452
|
+
const hasMergerIsolation = Reflect.ownKeys(input).includes("mergerIsolation");
|
|
453
|
+
const hasEvaluatorIsolation =
|
|
454
|
+
Reflect.ownKeys(input).includes("evaluatorIsolation");
|
|
455
|
+
const hasCurriculum = Reflect.ownKeys(input).includes("curriculum");
|
|
456
|
+
const hasCurriculumIsolation = Reflect.ownKeys(input).includes(
|
|
457
|
+
"curriculumIsolation",
|
|
458
|
+
);
|
|
459
|
+
const hasMemoryRetrieval = Reflect.ownKeys(input).includes("memoryRetrieval");
|
|
460
|
+
const hasModelEgress = Reflect.ownKeys(input).includes("modelEgress");
|
|
461
|
+
if (hasCurriculum !== hasCurriculumIsolation)
|
|
462
|
+
throw new TypeError(
|
|
463
|
+
"curriculum authority and isolation must be declared together",
|
|
464
|
+
);
|
|
465
|
+
if (hasMemoryRetrieval !== hasModelEgress)
|
|
466
|
+
throw new TypeError(
|
|
467
|
+
"memory retrieval and model egress authorities must be declared together",
|
|
468
|
+
);
|
|
469
|
+
const isolationFields = [
|
|
470
|
+
...(hasRunnerIsolation ? ["runnerIsolation"] : []),
|
|
471
|
+
...(hasGraderIsolation ? ["graderIsolation"] : []),
|
|
472
|
+
...(hasMergerIsolation ? ["mergerIsolation"] : []),
|
|
473
|
+
...(hasEvaluatorIsolation ? ["evaluatorIsolation"] : []),
|
|
474
|
+
];
|
|
168
475
|
exact(
|
|
169
476
|
input,
|
|
170
477
|
[
|
|
171
478
|
"planDigest",
|
|
172
479
|
"environmentDigest",
|
|
480
|
+
...(hasCurriculum ? ["curriculum", "curriculumIsolation"] : []),
|
|
481
|
+
...(hasMemoryRetrieval ? ["memoryRetrieval", "modelEgress"] : []),
|
|
173
482
|
"runner",
|
|
483
|
+
...isolationFields,
|
|
174
484
|
"grader",
|
|
175
485
|
"merger",
|
|
176
486
|
"evaluator",
|
|
@@ -180,19 +490,85 @@ export function createPmExplorationExecutionManifest(input = {}) {
|
|
|
180
490
|
],
|
|
181
491
|
"PM exploration execution manifest",
|
|
182
492
|
);
|
|
493
|
+
const schema = hasMemoryRetrieval
|
|
494
|
+
? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA
|
|
495
|
+
: hasCurriculum
|
|
496
|
+
? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6
|
|
497
|
+
: hasMergerIsolation || hasEvaluatorIsolation
|
|
498
|
+
? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5
|
|
499
|
+
: hasRunnerIsolation
|
|
500
|
+
? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4
|
|
501
|
+
: hasGraderIsolation
|
|
502
|
+
? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3
|
|
503
|
+
: PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2;
|
|
183
504
|
const core = deepFreeze({
|
|
184
|
-
schema
|
|
505
|
+
schema,
|
|
185
506
|
planDigest: digest(input.planDigest, "planDigest"),
|
|
186
507
|
environmentDigest: digest(input.environmentDigest, "environmentDigest"),
|
|
508
|
+
...(hasCurriculum
|
|
509
|
+
? {
|
|
510
|
+
curriculum: authorityDescriptor(
|
|
511
|
+
input.curriculum,
|
|
512
|
+
"curriculum",
|
|
513
|
+
"curriculum",
|
|
514
|
+
),
|
|
515
|
+
curriculumIsolation: reviewerIsolationDescriptor(
|
|
516
|
+
input.curriculumIsolation,
|
|
517
|
+
"curriculum",
|
|
518
|
+
),
|
|
519
|
+
}
|
|
520
|
+
: {}),
|
|
521
|
+
...(hasMemoryRetrieval
|
|
522
|
+
? {
|
|
523
|
+
memoryRetrieval: egressAuthorityDescriptor(
|
|
524
|
+
input.memoryRetrieval,
|
|
525
|
+
"memory-retrieval",
|
|
526
|
+
"memoryRetrieval",
|
|
527
|
+
),
|
|
528
|
+
modelEgress: egressAuthorityDescriptor(
|
|
529
|
+
input.modelEgress,
|
|
530
|
+
"model-egress",
|
|
531
|
+
"modelEgress",
|
|
532
|
+
),
|
|
533
|
+
}
|
|
534
|
+
: {}),
|
|
187
535
|
runner: authorityDescriptor(input.runner, "execution", "runner"),
|
|
536
|
+
...(hasRunnerIsolation
|
|
537
|
+
? { runnerIsolation: runnerIsolationDescriptor(input.runnerIsolation) }
|
|
538
|
+
: {}),
|
|
188
539
|
grader: authorityDescriptor(input.grader, "grader", "grader"),
|
|
540
|
+
...(hasGraderIsolation
|
|
541
|
+
? { graderIsolation: graderIsolationDescriptor(input.graderIsolation) }
|
|
542
|
+
: {}),
|
|
189
543
|
merger: authorityDescriptor(input.merger, "merge", "merger"),
|
|
544
|
+
...(hasMergerIsolation
|
|
545
|
+
? {
|
|
546
|
+
mergerIsolation: reviewerIsolationDescriptor(
|
|
547
|
+
input.mergerIsolation,
|
|
548
|
+
"merger",
|
|
549
|
+
),
|
|
550
|
+
}
|
|
551
|
+
: {}),
|
|
190
552
|
evaluator: authorityDescriptor(input.evaluator, "evaluator", "evaluator"),
|
|
553
|
+
...(hasEvaluatorIsolation
|
|
554
|
+
? {
|
|
555
|
+
evaluatorIsolation: reviewerIsolationDescriptor(
|
|
556
|
+
input.evaluatorIsolation,
|
|
557
|
+
"evaluator",
|
|
558
|
+
),
|
|
559
|
+
}
|
|
560
|
+
: {}),
|
|
191
561
|
toolIds: toolIds(input.toolIds),
|
|
192
562
|
toolPolicyDigest: digest(input.toolPolicyDigest, "toolPolicyDigest"),
|
|
193
563
|
preRunSealDigest: digest(input.preRunSealDigest, "preRunSealDigest"),
|
|
194
564
|
});
|
|
195
|
-
const authorities = [
|
|
565
|
+
const authorities = [
|
|
566
|
+
...(hasCurriculum ? [core.curriculum] : []),
|
|
567
|
+
core.runner,
|
|
568
|
+
core.grader,
|
|
569
|
+
core.merger,
|
|
570
|
+
core.evaluator,
|
|
571
|
+
];
|
|
196
572
|
if (
|
|
197
573
|
new Set(authorities.map((entry) => entry.authorityId)).size !==
|
|
198
574
|
authorities.length ||
|
|
@@ -200,20 +576,123 @@ export function createPmExplorationExecutionManifest(input = {}) {
|
|
|
200
576
|
authorities.length
|
|
201
577
|
)
|
|
202
578
|
throw new TypeError("PM receipt roles must use independent authorities");
|
|
579
|
+
if (
|
|
580
|
+
hasMemoryRetrieval &&
|
|
581
|
+
(core.memoryRetrieval.authorityId === core.modelEgress.authorityId ||
|
|
582
|
+
core.memoryRetrieval.handlerArtifactDigest ===
|
|
583
|
+
core.modelEgress.handlerArtifactDigest ||
|
|
584
|
+
authorities.some(
|
|
585
|
+
(entry) =>
|
|
586
|
+
entry.authorityId === core.memoryRetrieval.authorityId ||
|
|
587
|
+
entry.authorityId === core.modelEgress.authorityId,
|
|
588
|
+
))
|
|
589
|
+
) {
|
|
590
|
+
throw new TypeError(
|
|
591
|
+
"PM egress and receipt roles must use independent authorities",
|
|
592
|
+
);
|
|
593
|
+
}
|
|
594
|
+
if (
|
|
595
|
+
hasMemoryRetrieval !==
|
|
596
|
+
(core.runnerIsolation?.schema === PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2)
|
|
597
|
+
) {
|
|
598
|
+
throw new TypeError(
|
|
599
|
+
"governed PM egress and its brokered process runner must be paired",
|
|
600
|
+
);
|
|
601
|
+
}
|
|
203
602
|
return deepFreeze({
|
|
204
603
|
...core,
|
|
205
|
-
manifestDigest: hash(
|
|
604
|
+
manifestDigest: hash(schema, core),
|
|
206
605
|
});
|
|
207
606
|
}
|
|
208
607
|
|
|
209
608
|
export function verifyPmExplorationExecutionManifest(value) {
|
|
609
|
+
if (
|
|
610
|
+
!value ||
|
|
611
|
+
typeof value !== "object" ||
|
|
612
|
+
Array.isArray(value) ||
|
|
613
|
+
isProxy(value) ||
|
|
614
|
+
Object.getPrototypeOf(value) !== Object.prototype
|
|
615
|
+
) {
|
|
616
|
+
throw new TypeError(
|
|
617
|
+
"PM exploration execution manifest envelope must be a plain object",
|
|
618
|
+
);
|
|
619
|
+
}
|
|
620
|
+
const hasRunnerIsolation = Reflect.ownKeys(value).includes("runnerIsolation");
|
|
621
|
+
const hasGraderIsolation = Reflect.ownKeys(value).includes("graderIsolation");
|
|
622
|
+
const hasMergerIsolation = Reflect.ownKeys(value).includes("mergerIsolation");
|
|
623
|
+
const hasEvaluatorIsolation =
|
|
624
|
+
Reflect.ownKeys(value).includes("evaluatorIsolation");
|
|
625
|
+
const hasCurriculum = Reflect.ownKeys(value).includes("curriculum");
|
|
626
|
+
const hasCurriculumIsolation = Reflect.ownKeys(value).includes(
|
|
627
|
+
"curriculumIsolation",
|
|
628
|
+
);
|
|
629
|
+
const hasMemoryRetrieval = Reflect.ownKeys(value).includes("memoryRetrieval");
|
|
630
|
+
const hasModelEgress = Reflect.ownKeys(value).includes("modelEgress");
|
|
631
|
+
if (
|
|
632
|
+
hasCurriculum !== hasCurriculumIsolation ||
|
|
633
|
+
hasMemoryRetrieval !== hasModelEgress
|
|
634
|
+
) {
|
|
635
|
+
throw new TypeError("PM exploration manifest authority pairing is invalid");
|
|
636
|
+
}
|
|
637
|
+
if (
|
|
638
|
+
(value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2 &&
|
|
639
|
+
(hasRunnerIsolation ||
|
|
640
|
+
hasGraderIsolation ||
|
|
641
|
+
hasMergerIsolation ||
|
|
642
|
+
hasEvaluatorIsolation ||
|
|
643
|
+
hasCurriculum ||
|
|
644
|
+
hasCurriculumIsolation ||
|
|
645
|
+
hasMemoryRetrieval ||
|
|
646
|
+
hasModelEgress)) ||
|
|
647
|
+
(value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3 &&
|
|
648
|
+
(hasRunnerIsolation ||
|
|
649
|
+
!hasGraderIsolation ||
|
|
650
|
+
hasMergerIsolation ||
|
|
651
|
+
hasEvaluatorIsolation ||
|
|
652
|
+
hasCurriculum ||
|
|
653
|
+
hasCurriculumIsolation ||
|
|
654
|
+
hasMemoryRetrieval ||
|
|
655
|
+
hasModelEgress)) ||
|
|
656
|
+
(value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4 &&
|
|
657
|
+
(!hasRunnerIsolation ||
|
|
658
|
+
hasMergerIsolation ||
|
|
659
|
+
hasEvaluatorIsolation ||
|
|
660
|
+
hasCurriculum ||
|
|
661
|
+
hasCurriculumIsolation ||
|
|
662
|
+
hasMemoryRetrieval ||
|
|
663
|
+
hasModelEgress)) ||
|
|
664
|
+
(value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5 &&
|
|
665
|
+
(hasCurriculum ||
|
|
666
|
+
hasCurriculumIsolation ||
|
|
667
|
+
hasMemoryRetrieval ||
|
|
668
|
+
hasModelEgress ||
|
|
669
|
+
(!hasMergerIsolation && !hasEvaluatorIsolation))) ||
|
|
670
|
+
(value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6 &&
|
|
671
|
+
(!hasCurriculum ||
|
|
672
|
+
!hasCurriculumIsolation ||
|
|
673
|
+
hasMemoryRetrieval ||
|
|
674
|
+
hasModelEgress)) ||
|
|
675
|
+
(value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA &&
|
|
676
|
+
(!hasMemoryRetrieval || !hasModelEgress))
|
|
677
|
+
) {
|
|
678
|
+
throw new TypeError("PM exploration manifest isolation schema is invalid");
|
|
679
|
+
}
|
|
680
|
+
const isolationFields = [
|
|
681
|
+
...(hasRunnerIsolation ? ["runnerIsolation"] : []),
|
|
682
|
+
...(hasGraderIsolation ? ["graderIsolation"] : []),
|
|
683
|
+
...(hasMergerIsolation ? ["mergerIsolation"] : []),
|
|
684
|
+
...(hasEvaluatorIsolation ? ["evaluatorIsolation"] : []),
|
|
685
|
+
];
|
|
210
686
|
exact(
|
|
211
687
|
value,
|
|
212
688
|
[
|
|
213
689
|
"schema",
|
|
214
690
|
"planDigest",
|
|
215
691
|
"environmentDigest",
|
|
692
|
+
...(hasCurriculum ? ["curriculum", "curriculumIsolation"] : []),
|
|
693
|
+
...(hasMemoryRetrieval ? ["memoryRetrieval", "modelEgress"] : []),
|
|
216
694
|
"runner",
|
|
695
|
+
...isolationFields,
|
|
217
696
|
"grader",
|
|
218
697
|
"merger",
|
|
219
698
|
"evaluator",
|
|
@@ -224,15 +703,40 @@ export function verifyPmExplorationExecutionManifest(value) {
|
|
|
224
703
|
],
|
|
225
704
|
"PM exploration execution manifest envelope",
|
|
226
705
|
);
|
|
227
|
-
if (
|
|
706
|
+
if (
|
|
707
|
+
value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA &&
|
|
708
|
+
value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6 &&
|
|
709
|
+
value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5 &&
|
|
710
|
+
value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4 &&
|
|
711
|
+
value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3 &&
|
|
712
|
+
value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2
|
|
713
|
+
)
|
|
228
714
|
throw new TypeError("PM exploration execution manifest schema is invalid");
|
|
229
715
|
const normalized = createPmExplorationExecutionManifest({
|
|
230
716
|
planDigest: value.planDigest,
|
|
231
717
|
environmentDigest: value.environmentDigest,
|
|
718
|
+
...(hasCurriculum
|
|
719
|
+
? {
|
|
720
|
+
curriculum: value.curriculum,
|
|
721
|
+
curriculumIsolation: value.curriculumIsolation,
|
|
722
|
+
}
|
|
723
|
+
: {}),
|
|
724
|
+
...(hasMemoryRetrieval
|
|
725
|
+
? {
|
|
726
|
+
memoryRetrieval: value.memoryRetrieval,
|
|
727
|
+
modelEgress: value.modelEgress,
|
|
728
|
+
}
|
|
729
|
+
: {}),
|
|
232
730
|
runner: value.runner,
|
|
731
|
+
...(hasRunnerIsolation ? { runnerIsolation: value.runnerIsolation } : {}),
|
|
233
732
|
grader: value.grader,
|
|
733
|
+
...(hasGraderIsolation ? { graderIsolation: value.graderIsolation } : {}),
|
|
234
734
|
merger: value.merger,
|
|
735
|
+
...(hasMergerIsolation ? { mergerIsolation: value.mergerIsolation } : {}),
|
|
235
736
|
evaluator: value.evaluator,
|
|
737
|
+
...(hasEvaluatorIsolation
|
|
738
|
+
? { evaluatorIsolation: value.evaluatorIsolation }
|
|
739
|
+
: {}),
|
|
236
740
|
toolIds: value.toolIds,
|
|
237
741
|
toolPolicyDigest: value.toolPolicyDigest,
|
|
238
742
|
preRunSealDigest: value.preRunSealDigest,
|
|
@@ -246,6 +750,9 @@ function createProvider({
|
|
|
246
750
|
signer,
|
|
247
751
|
handler,
|
|
248
752
|
prepare = null,
|
|
753
|
+
isolation = null,
|
|
754
|
+
consumeIsolationEvidence = null,
|
|
755
|
+
consumeEgressEvidence = null,
|
|
249
756
|
expectedRole,
|
|
250
757
|
bindings,
|
|
251
758
|
label,
|
|
@@ -254,14 +761,31 @@ function createProvider({
|
|
|
254
761
|
throw new TypeError(`${label} handler must be a direct function`);
|
|
255
762
|
if (prepare !== null && (typeof prepare !== "function" || isProxy(prepare)))
|
|
256
763
|
throw new TypeError(`${label} prepare hook must be a direct function`);
|
|
764
|
+
if (
|
|
765
|
+
consumeIsolationEvidence !== null &&
|
|
766
|
+
(typeof consumeIsolationEvidence !== "function" ||
|
|
767
|
+
isProxy(consumeIsolationEvidence))
|
|
768
|
+
) {
|
|
769
|
+
throw new TypeError(`${label} isolation evidence port must be direct`);
|
|
770
|
+
}
|
|
771
|
+
if (
|
|
772
|
+
consumeEgressEvidence !== null &&
|
|
773
|
+
(typeof consumeEgressEvidence !== "function" ||
|
|
774
|
+
isProxy(consumeEgressEvidence))
|
|
775
|
+
) {
|
|
776
|
+
throw new TypeError(`${label} egress evidence port must be direct`);
|
|
777
|
+
}
|
|
257
778
|
const descriptor = inspectPmExplorationReceiptAuthority(signer);
|
|
258
779
|
if (descriptor.role !== expectedRole)
|
|
259
780
|
throw new TypeError(`${label} signer has the wrong receipt role`);
|
|
260
781
|
const provider = Object.freeze({});
|
|
261
782
|
bindings.set(provider, {
|
|
262
783
|
authority: getPmExplorationReceiptSignerAuthority(signer),
|
|
784
|
+
consumeEgressEvidence,
|
|
785
|
+
consumeIsolationEvidence,
|
|
263
786
|
descriptor,
|
|
264
787
|
handler,
|
|
788
|
+
isolation,
|
|
265
789
|
prepare,
|
|
266
790
|
issue: (payload) => issuePmExplorationReceipt(signer, payload),
|
|
267
791
|
});
|
|
@@ -279,6 +803,83 @@ export function createPmExplorationRunner(options = {}) {
|
|
|
279
803
|
});
|
|
280
804
|
}
|
|
281
805
|
|
|
806
|
+
export function createPmExplorationProcessRunner(options = {}) {
|
|
807
|
+
if (
|
|
808
|
+
!options ||
|
|
809
|
+
typeof options !== "object" ||
|
|
810
|
+
Array.isArray(options) ||
|
|
811
|
+
isProxy(options) ||
|
|
812
|
+
Object.getPrototypeOf(options) !== Object.prototype
|
|
813
|
+
) {
|
|
814
|
+
throw new TypeError(
|
|
815
|
+
"PM exploration process runner options must be a plain object",
|
|
816
|
+
);
|
|
817
|
+
}
|
|
818
|
+
const hasNow = Reflect.ownKeys(options).includes("now");
|
|
819
|
+
const hasEgressBrokered = Reflect.ownKeys(options).includes("egressBrokered");
|
|
820
|
+
exact(
|
|
821
|
+
options,
|
|
822
|
+
[
|
|
823
|
+
"signer",
|
|
824
|
+
"supervisor",
|
|
825
|
+
"target",
|
|
826
|
+
"maxWallClockMs",
|
|
827
|
+
...(hasNow ? ["now"] : []),
|
|
828
|
+
...(hasEgressBrokered ? ["egressBrokered"] : []),
|
|
829
|
+
],
|
|
830
|
+
"PM exploration process runner options",
|
|
831
|
+
);
|
|
832
|
+
const executor = createPmExplorationProcessRunnerExecutor({
|
|
833
|
+
supervisor: options.supervisor,
|
|
834
|
+
target: options.target,
|
|
835
|
+
maxWallClockMs: options.maxWallClockMs,
|
|
836
|
+
...(hasNow ? { now: options.now } : {}),
|
|
837
|
+
...(hasEgressBrokered ? { egressBrokered: options.egressBrokered } : {}),
|
|
838
|
+
});
|
|
839
|
+
const evidence = new Map();
|
|
840
|
+
return createProvider({
|
|
841
|
+
signer: options.signer,
|
|
842
|
+
handler: async (request, runtime) => {
|
|
843
|
+
const result = await invokePmExplorationProcessRunner(
|
|
844
|
+
executor,
|
|
845
|
+
request,
|
|
846
|
+
runtime,
|
|
847
|
+
);
|
|
848
|
+
if (evidence.has(request.requestDigest))
|
|
849
|
+
throw new Error("process runner isolation evidence was replayed");
|
|
850
|
+
evidence.set(
|
|
851
|
+
request.requestDigest,
|
|
852
|
+
Object.freeze({
|
|
853
|
+
supervisionReceiptDigest: result.supervisionReceiptDigest,
|
|
854
|
+
egressEvidenceDigest: result.egressEvidenceDigest ?? null,
|
|
855
|
+
}),
|
|
856
|
+
);
|
|
857
|
+
return result.value;
|
|
858
|
+
},
|
|
859
|
+
isolation: inspectPmExplorationProcessRunnerExecutor(executor),
|
|
860
|
+
consumeIsolationEvidence: (requestDigest) => {
|
|
861
|
+
const value = evidence.get(requestDigest) ?? null;
|
|
862
|
+
if (value?.egressEvidenceDigest === null) evidence.delete(requestDigest);
|
|
863
|
+
return value?.supervisionReceiptDigest ?? null;
|
|
864
|
+
},
|
|
865
|
+
consumeEgressEvidence: (requestDigest) => {
|
|
866
|
+
const value = evidence.get(requestDigest)?.egressEvidenceDigest ?? null;
|
|
867
|
+
evidence.delete(requestDigest);
|
|
868
|
+
return value;
|
|
869
|
+
},
|
|
870
|
+
expectedRole: "execution",
|
|
871
|
+
bindings: RUNNERS,
|
|
872
|
+
label: "PM exploration process runner",
|
|
873
|
+
});
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
export function inspectPmExplorationRunnerIsolation(value) {
|
|
877
|
+
const runner = RUNNERS.get(value);
|
|
878
|
+
if (!runner)
|
|
879
|
+
throw new TypeError("a branded PM exploration runner is required");
|
|
880
|
+
return runner.isolation;
|
|
881
|
+
}
|
|
882
|
+
|
|
282
883
|
export function createPmExplorationGrader(options = {}) {
|
|
283
884
|
if (
|
|
284
885
|
!options ||
|
|
@@ -305,6 +906,50 @@ export function createPmExplorationGrader(options = {}) {
|
|
|
305
906
|
});
|
|
306
907
|
}
|
|
307
908
|
|
|
909
|
+
export function createPmExplorationProcessGrader(options = {}) {
|
|
910
|
+
if (
|
|
911
|
+
!options ||
|
|
912
|
+
typeof options !== "object" ||
|
|
913
|
+
Array.isArray(options) ||
|
|
914
|
+
isProxy(options) ||
|
|
915
|
+
Object.getPrototypeOf(options) !== Object.prototype
|
|
916
|
+
) {
|
|
917
|
+
throw new TypeError(
|
|
918
|
+
"PM exploration process grader options must be a plain object",
|
|
919
|
+
);
|
|
920
|
+
}
|
|
921
|
+
const hasNow = Reflect.ownKeys(options).includes("now");
|
|
922
|
+
exact(
|
|
923
|
+
options,
|
|
924
|
+
hasNow
|
|
925
|
+
? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
|
|
926
|
+
: ["signer", "supervisor", "target", "maxWallClockMs"],
|
|
927
|
+
"PM exploration process grader options",
|
|
928
|
+
);
|
|
929
|
+
const executor = createPmExplorationProcessGraderExecutor({
|
|
930
|
+
supervisor: options.supervisor,
|
|
931
|
+
target: options.target,
|
|
932
|
+
maxWallClockMs: options.maxWallClockMs,
|
|
933
|
+
...(hasNow ? { now: options.now } : {}),
|
|
934
|
+
});
|
|
935
|
+
return createProvider({
|
|
936
|
+
signer: options.signer,
|
|
937
|
+
handler: (request, runtime) =>
|
|
938
|
+
invokePmExplorationProcessGrader(executor, request, runtime),
|
|
939
|
+
isolation: inspectPmExplorationProcessGraderExecutor(executor),
|
|
940
|
+
expectedRole: "grader",
|
|
941
|
+
bindings: GRADERS,
|
|
942
|
+
label: "PM exploration process grader",
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
export function inspectPmExplorationGraderIsolation(value) {
|
|
947
|
+
const grader = GRADERS.get(value);
|
|
948
|
+
if (!grader)
|
|
949
|
+
throw new TypeError("a branded PM exploration grader is required");
|
|
950
|
+
return grader.isolation;
|
|
951
|
+
}
|
|
952
|
+
|
|
308
953
|
export function createPmExplorationMerger(options = {}) {
|
|
309
954
|
exact(options, ["signer", "merge"], "PM exploration merger options");
|
|
310
955
|
return createProvider({
|
|
@@ -316,6 +961,66 @@ export function createPmExplorationMerger(options = {}) {
|
|
|
316
961
|
});
|
|
317
962
|
}
|
|
318
963
|
|
|
964
|
+
export function createPmExplorationProcessMerger(options = {}) {
|
|
965
|
+
if (
|
|
966
|
+
!options ||
|
|
967
|
+
typeof options !== "object" ||
|
|
968
|
+
Array.isArray(options) ||
|
|
969
|
+
isProxy(options) ||
|
|
970
|
+
Object.getPrototypeOf(options) !== Object.prototype
|
|
971
|
+
) {
|
|
972
|
+
throw new TypeError(
|
|
973
|
+
"PM exploration process merger options must be a plain object",
|
|
974
|
+
);
|
|
975
|
+
}
|
|
976
|
+
const hasNow = Reflect.ownKeys(options).includes("now");
|
|
977
|
+
exact(
|
|
978
|
+
options,
|
|
979
|
+
hasNow
|
|
980
|
+
? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
|
|
981
|
+
: ["signer", "supervisor", "target", "maxWallClockMs"],
|
|
982
|
+
"PM exploration process merger options",
|
|
983
|
+
);
|
|
984
|
+
const executor = createPmExplorationProcessReviewerExecutor({
|
|
985
|
+
kind: "merge",
|
|
986
|
+
supervisor: options.supervisor,
|
|
987
|
+
target: options.target,
|
|
988
|
+
maxWallClockMs: options.maxWallClockMs,
|
|
989
|
+
...(hasNow ? { now: options.now } : {}),
|
|
990
|
+
});
|
|
991
|
+
const evidence = new Map();
|
|
992
|
+
return createProvider({
|
|
993
|
+
signer: options.signer,
|
|
994
|
+
handler: async (request, runtime) => {
|
|
995
|
+
const result = await invokePmExplorationProcessReviewer(
|
|
996
|
+
executor,
|
|
997
|
+
request,
|
|
998
|
+
runtime,
|
|
999
|
+
);
|
|
1000
|
+
if (evidence.has(request.requestDigest))
|
|
1001
|
+
throw new Error("process merger isolation evidence was replayed");
|
|
1002
|
+
evidence.set(request.requestDigest, result.supervisionReceiptDigest);
|
|
1003
|
+
return result.value;
|
|
1004
|
+
},
|
|
1005
|
+
isolation: inspectPmExplorationProcessReviewerExecutor(executor),
|
|
1006
|
+
consumeIsolationEvidence: (requestDigest) => {
|
|
1007
|
+
const value = evidence.get(requestDigest) ?? null;
|
|
1008
|
+
evidence.delete(requestDigest);
|
|
1009
|
+
return value;
|
|
1010
|
+
},
|
|
1011
|
+
expectedRole: "merge",
|
|
1012
|
+
bindings: MERGERS,
|
|
1013
|
+
label: "PM exploration process merger",
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
export function inspectPmExplorationMergerIsolation(value) {
|
|
1018
|
+
const merger = MERGERS.get(value);
|
|
1019
|
+
if (!merger)
|
|
1020
|
+
throw new TypeError("a branded PM exploration merger is required");
|
|
1021
|
+
return merger.isolation;
|
|
1022
|
+
}
|
|
1023
|
+
|
|
319
1024
|
export function createPmExplorationEvaluator(options = {}) {
|
|
320
1025
|
exact(options, ["signer", "evaluate"], "PM exploration evaluator options");
|
|
321
1026
|
return createProvider({
|
|
@@ -327,17 +1032,155 @@ export function createPmExplorationEvaluator(options = {}) {
|
|
|
327
1032
|
});
|
|
328
1033
|
}
|
|
329
1034
|
|
|
1035
|
+
export function createPmExplorationProcessEvaluator(options = {}) {
|
|
1036
|
+
if (
|
|
1037
|
+
!options ||
|
|
1038
|
+
typeof options !== "object" ||
|
|
1039
|
+
Array.isArray(options) ||
|
|
1040
|
+
isProxy(options) ||
|
|
1041
|
+
Object.getPrototypeOf(options) !== Object.prototype
|
|
1042
|
+
) {
|
|
1043
|
+
throw new TypeError(
|
|
1044
|
+
"PM exploration process evaluator options must be a plain object",
|
|
1045
|
+
);
|
|
1046
|
+
}
|
|
1047
|
+
const hasNow = Reflect.ownKeys(options).includes("now");
|
|
1048
|
+
exact(
|
|
1049
|
+
options,
|
|
1050
|
+
hasNow
|
|
1051
|
+
? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
|
|
1052
|
+
: ["signer", "supervisor", "target", "maxWallClockMs"],
|
|
1053
|
+
"PM exploration process evaluator options",
|
|
1054
|
+
);
|
|
1055
|
+
const executor = createPmExplorationProcessReviewerExecutor({
|
|
1056
|
+
kind: "evaluate",
|
|
1057
|
+
supervisor: options.supervisor,
|
|
1058
|
+
target: options.target,
|
|
1059
|
+
maxWallClockMs: options.maxWallClockMs,
|
|
1060
|
+
...(hasNow ? { now: options.now } : {}),
|
|
1061
|
+
});
|
|
1062
|
+
const evidence = new Map();
|
|
1063
|
+
return createProvider({
|
|
1064
|
+
signer: options.signer,
|
|
1065
|
+
handler: async (request, runtime) => {
|
|
1066
|
+
const result = await invokePmExplorationProcessReviewer(
|
|
1067
|
+
executor,
|
|
1068
|
+
request,
|
|
1069
|
+
runtime,
|
|
1070
|
+
);
|
|
1071
|
+
if (evidence.has(request.requestDigest))
|
|
1072
|
+
throw new Error("process evaluator isolation evidence was replayed");
|
|
1073
|
+
evidence.set(request.requestDigest, result.supervisionReceiptDigest);
|
|
1074
|
+
return result.value;
|
|
1075
|
+
},
|
|
1076
|
+
isolation: inspectPmExplorationProcessReviewerExecutor(executor),
|
|
1077
|
+
consumeIsolationEvidence: (requestDigest) => {
|
|
1078
|
+
const value = evidence.get(requestDigest) ?? null;
|
|
1079
|
+
evidence.delete(requestDigest);
|
|
1080
|
+
return value;
|
|
1081
|
+
},
|
|
1082
|
+
expectedRole: "evaluator",
|
|
1083
|
+
bindings: EVALUATORS,
|
|
1084
|
+
label: "PM exploration process evaluator",
|
|
1085
|
+
});
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
export function inspectPmExplorationEvaluatorIsolation(value) {
|
|
1089
|
+
const evaluator = EVALUATORS.get(value);
|
|
1090
|
+
if (!evaluator)
|
|
1091
|
+
throw new TypeError("a branded PM exploration evaluator is required");
|
|
1092
|
+
return evaluator.isolation;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
export function createPmExplorationProcessCurriculum(options = {}) {
|
|
1096
|
+
if (
|
|
1097
|
+
!options ||
|
|
1098
|
+
typeof options !== "object" ||
|
|
1099
|
+
Array.isArray(options) ||
|
|
1100
|
+
isProxy(options) ||
|
|
1101
|
+
Object.getPrototypeOf(options) !== Object.prototype
|
|
1102
|
+
) {
|
|
1103
|
+
throw new TypeError(
|
|
1104
|
+
"PM exploration process curriculum options must be a plain object",
|
|
1105
|
+
);
|
|
1106
|
+
}
|
|
1107
|
+
const hasNow = Reflect.ownKeys(options).includes("now");
|
|
1108
|
+
exact(
|
|
1109
|
+
options,
|
|
1110
|
+
hasNow
|
|
1111
|
+
? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
|
|
1112
|
+
: ["signer", "supervisor", "target", "maxWallClockMs"],
|
|
1113
|
+
"PM exploration process curriculum options",
|
|
1114
|
+
);
|
|
1115
|
+
const executor = createPmExplorationProcessReviewerExecutor({
|
|
1116
|
+
kind: "curriculum",
|
|
1117
|
+
supervisor: options.supervisor,
|
|
1118
|
+
target: options.target,
|
|
1119
|
+
maxWallClockMs: options.maxWallClockMs,
|
|
1120
|
+
...(hasNow ? { now: options.now } : {}),
|
|
1121
|
+
});
|
|
1122
|
+
const evidence = new Map();
|
|
1123
|
+
return createProvider({
|
|
1124
|
+
signer: options.signer,
|
|
1125
|
+
handler: async (request, runtime) => {
|
|
1126
|
+
const result = await invokePmExplorationProcessReviewer(
|
|
1127
|
+
executor,
|
|
1128
|
+
request,
|
|
1129
|
+
runtime,
|
|
1130
|
+
);
|
|
1131
|
+
if (evidence.has(request.requestDigest))
|
|
1132
|
+
throw new Error("process curriculum isolation evidence was replayed");
|
|
1133
|
+
evidence.set(request.requestDigest, result.supervisionReceiptDigest);
|
|
1134
|
+
return result.value;
|
|
1135
|
+
},
|
|
1136
|
+
isolation: inspectPmExplorationProcessReviewerExecutor(executor),
|
|
1137
|
+
consumeIsolationEvidence: (requestDigest) => {
|
|
1138
|
+
const value = evidence.get(requestDigest) ?? null;
|
|
1139
|
+
evidence.delete(requestDigest);
|
|
1140
|
+
return value;
|
|
1141
|
+
},
|
|
1142
|
+
expectedRole: "curriculum",
|
|
1143
|
+
bindings: CURRICULA,
|
|
1144
|
+
label: "PM exploration process curriculum",
|
|
1145
|
+
});
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
export function inspectPmExplorationCurriculumIsolation(value) {
|
|
1149
|
+
const curriculum = CURRICULA.get(value);
|
|
1150
|
+
if (!curriculum)
|
|
1151
|
+
throw new TypeError("a branded PM exploration curriculum is required");
|
|
1152
|
+
return curriculum.isolation;
|
|
1153
|
+
}
|
|
1154
|
+
|
|
330
1155
|
function snapshotPlan(value) {
|
|
331
1156
|
verifyPmExplorationPlan(value);
|
|
332
1157
|
return deepFreeze(structuredClone(value));
|
|
333
1158
|
}
|
|
334
1159
|
|
|
335
1160
|
export function createPmExplorationExecutionHost(options = {}) {
|
|
1161
|
+
const hasCurriculum =
|
|
1162
|
+
options &&
|
|
1163
|
+
typeof options === "object" &&
|
|
1164
|
+
Reflect.ownKeys(options).includes("curriculum");
|
|
1165
|
+
const hasMemoryRetrieval =
|
|
1166
|
+
options &&
|
|
1167
|
+
typeof options === "object" &&
|
|
1168
|
+
Reflect.ownKeys(options).includes("memoryRetrieval");
|
|
1169
|
+
const hasModelEgress =
|
|
1170
|
+
options &&
|
|
1171
|
+
typeof options === "object" &&
|
|
1172
|
+
Reflect.ownKeys(options).includes("modelEgress");
|
|
1173
|
+
if (hasMemoryRetrieval !== hasModelEgress)
|
|
1174
|
+
throw new TypeError(
|
|
1175
|
+
"PM exploration host memory and model egress ports must be paired",
|
|
1176
|
+
);
|
|
336
1177
|
exact(
|
|
337
1178
|
options,
|
|
338
1179
|
[
|
|
339
1180
|
"plan",
|
|
340
1181
|
"manifest",
|
|
1182
|
+
...(hasCurriculum ? ["curriculum"] : []),
|
|
1183
|
+
...(hasMemoryRetrieval ? ["memoryRetrieval", "modelEgress"] : []),
|
|
341
1184
|
"runner",
|
|
342
1185
|
"grader",
|
|
343
1186
|
"merger",
|
|
@@ -349,18 +1192,44 @@ export function createPmExplorationExecutionHost(options = {}) {
|
|
|
349
1192
|
);
|
|
350
1193
|
const plan = snapshotPlan(options.plan);
|
|
351
1194
|
const manifest = verifyPmExplorationExecutionManifest(options.manifest);
|
|
1195
|
+
const curriculum = hasCurriculum ? CURRICULA.get(options.curriculum) : null;
|
|
1196
|
+
const memoryRetrieval = hasMemoryRetrieval
|
|
1197
|
+
? inspectPmExplorationEgressAuthority(options.memoryRetrieval)
|
|
1198
|
+
: null;
|
|
1199
|
+
const modelEgress = hasModelEgress
|
|
1200
|
+
? inspectPmExplorationEgressAuthority(options.modelEgress)
|
|
1201
|
+
: null;
|
|
352
1202
|
const runner = RUNNERS.get(options.runner);
|
|
353
1203
|
const grader = GRADERS.get(options.grader);
|
|
354
1204
|
const merger = MERGERS.get(options.merger);
|
|
355
1205
|
const evaluator = EVALUATORS.get(options.evaluator);
|
|
356
|
-
if (
|
|
1206
|
+
if (
|
|
1207
|
+
!runner ||
|
|
1208
|
+
!grader ||
|
|
1209
|
+
!merger ||
|
|
1210
|
+
!evaluator ||
|
|
1211
|
+
(hasCurriculum && !curriculum)
|
|
1212
|
+
)
|
|
357
1213
|
throw new TypeError("branded PM exploration providers are required");
|
|
1214
|
+
if (hasCurriculum !== Object.hasOwn(manifest, "curriculum"))
|
|
1215
|
+
throw new Error("PM exploration curriculum differs from the manifest");
|
|
1216
|
+
if (hasMemoryRetrieval !== Object.hasOwn(manifest, "memoryRetrieval"))
|
|
1217
|
+
throw new Error("PM exploration egress differs from the manifest");
|
|
358
1218
|
if (
|
|
359
1219
|
manifest.planDigest !== plan.planDigest ||
|
|
360
1220
|
manifest.environmentDigest !== plan.environmentDigest
|
|
361
1221
|
) {
|
|
362
1222
|
throw new Error("PM exploration manifest differs from its plan");
|
|
363
1223
|
}
|
|
1224
|
+
if (
|
|
1225
|
+
hasMemoryRetrieval &&
|
|
1226
|
+
(canonical(manifest.memoryRetrieval) !== canonical(memoryRetrieval) ||
|
|
1227
|
+
canonical(manifest.modelEgress) !== canonical(modelEgress))
|
|
1228
|
+
) {
|
|
1229
|
+
throw new Error(
|
|
1230
|
+
"PM exploration egress authorities differ from the manifest",
|
|
1231
|
+
);
|
|
1232
|
+
}
|
|
364
1233
|
if (
|
|
365
1234
|
canonical(manifest.runner) !== canonical(runner.descriptor) ||
|
|
366
1235
|
canonical(manifest.grader) !== canonical(grader.descriptor) ||
|
|
@@ -369,21 +1238,63 @@ export function createPmExplorationExecutionHost(options = {}) {
|
|
|
369
1238
|
) {
|
|
370
1239
|
throw new Error("PM exploration providers differ from the manifest");
|
|
371
1240
|
}
|
|
1241
|
+
if (
|
|
1242
|
+
hasCurriculum &&
|
|
1243
|
+
(canonical(manifest.curriculum) !== canonical(curriculum.descriptor) ||
|
|
1244
|
+
canonical(manifest.curriculumIsolation) !==
|
|
1245
|
+
canonical(curriculum.isolation))
|
|
1246
|
+
) {
|
|
1247
|
+
throw new Error("PM exploration curriculum differs from the manifest");
|
|
1248
|
+
}
|
|
1249
|
+
const manifestIsolation = manifest.graderIsolation ?? null;
|
|
1250
|
+
if (canonical(manifestIsolation) !== canonical(grader.isolation))
|
|
1251
|
+
throw new Error(
|
|
1252
|
+
"PM exploration grader isolation differs from the manifest",
|
|
1253
|
+
);
|
|
1254
|
+
const manifestRunnerIsolation = manifest.runnerIsolation ?? null;
|
|
1255
|
+
if (canonical(manifestRunnerIsolation) !== canonical(runner.isolation))
|
|
1256
|
+
throw new Error(
|
|
1257
|
+
"PM exploration runner isolation differs from the manifest",
|
|
1258
|
+
);
|
|
1259
|
+
if (
|
|
1260
|
+
hasMemoryRetrieval &&
|
|
1261
|
+
runner.isolation?.schema !== PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2
|
|
1262
|
+
) {
|
|
1263
|
+
throw new Error(
|
|
1264
|
+
"PM exploration egress requires the brokered process runner",
|
|
1265
|
+
);
|
|
1266
|
+
}
|
|
1267
|
+
const manifestMergerIsolation = manifest.mergerIsolation ?? null;
|
|
1268
|
+
if (canonical(manifestMergerIsolation) !== canonical(merger.isolation))
|
|
1269
|
+
throw new Error(
|
|
1270
|
+
"PM exploration merger isolation differs from the manifest",
|
|
1271
|
+
);
|
|
1272
|
+
const manifestEvaluatorIsolation = manifest.evaluatorIsolation ?? null;
|
|
1273
|
+
if (canonical(manifestEvaluatorIsolation) !== canonical(evaluator.isolation))
|
|
1274
|
+
throw new Error(
|
|
1275
|
+
"PM exploration evaluator isolation differs from the manifest",
|
|
1276
|
+
);
|
|
372
1277
|
if (typeof options.invokeTool !== "function" || isProxy(options.invokeTool))
|
|
373
1278
|
throw new TypeError("PM exploration host requires a direct tool broker");
|
|
374
1279
|
if (typeof options.now !== "function" || isProxy(options.now))
|
|
375
1280
|
throw new TypeError("PM exploration host requires a direct clock");
|
|
376
1281
|
const host = Object.freeze({});
|
|
377
1282
|
HOSTS.set(host, {
|
|
1283
|
+
curriculum,
|
|
378
1284
|
grader,
|
|
379
1285
|
evaluator,
|
|
380
1286
|
invokeTool: options.invokeTool,
|
|
381
1287
|
manifest,
|
|
382
1288
|
merger,
|
|
1289
|
+
memoryRetrievalAuthority: hasMemoryRetrieval
|
|
1290
|
+
? options.memoryRetrieval
|
|
1291
|
+
: null,
|
|
1292
|
+
modelEgressAuthority: hasModelEgress ? options.modelEgress : null,
|
|
383
1293
|
now: options.now,
|
|
384
1294
|
plan,
|
|
385
1295
|
runner,
|
|
386
1296
|
overhead: new WeakMap(),
|
|
1297
|
+
selections: new WeakMap(),
|
|
387
1298
|
});
|
|
388
1299
|
return host;
|
|
389
1300
|
}
|
|
@@ -401,6 +1312,21 @@ export function inspectPmExplorationExecutionHost(value) {
|
|
|
401
1312
|
environmentDigest: host.plan.environmentDigest,
|
|
402
1313
|
manifestDigest: host.manifest.manifestDigest,
|
|
403
1314
|
preRunSealDigest: host.manifest.preRunSealDigest,
|
|
1315
|
+
...(host.curriculum === null
|
|
1316
|
+
? {}
|
|
1317
|
+
: { curriculumIsolation: host.curriculum.isolation }),
|
|
1318
|
+
...(host.runner.isolation === null
|
|
1319
|
+
? {}
|
|
1320
|
+
: { runnerIsolation: host.runner.isolation }),
|
|
1321
|
+
...(host.grader.isolation === null
|
|
1322
|
+
? {}
|
|
1323
|
+
: { graderIsolation: host.grader.isolation }),
|
|
1324
|
+
...(host.merger.isolation === null
|
|
1325
|
+
? {}
|
|
1326
|
+
: { mergerIsolation: host.merger.isolation }),
|
|
1327
|
+
...(host.evaluator.isolation === null
|
|
1328
|
+
? {}
|
|
1329
|
+
: { evaluatorIsolation: host.evaluator.isolation }),
|
|
404
1330
|
});
|
|
405
1331
|
}
|
|
406
1332
|
|
|
@@ -447,6 +1373,19 @@ function recordOverhead(host, journal, metrics) {
|
|
|
447
1373
|
return next;
|
|
448
1374
|
}
|
|
449
1375
|
|
|
1376
|
+
function settleOverhead(host, journal, metrics) {
|
|
1377
|
+
const current = overheadFor(host, journal);
|
|
1378
|
+
const next = {};
|
|
1379
|
+
for (const key of ["tokens", "toolCalls", "wallClockMs"]) {
|
|
1380
|
+
if (metrics[key] > current[key])
|
|
1381
|
+
throw new Error(`PM exploration ${key} overhead settlement underflow`);
|
|
1382
|
+
next[key] = current[key] - metrics[key];
|
|
1383
|
+
}
|
|
1384
|
+
const settled = Object.freeze(next);
|
|
1385
|
+
host.overhead.set(journal, settled);
|
|
1386
|
+
return settled;
|
|
1387
|
+
}
|
|
1388
|
+
|
|
450
1389
|
function normalizedRunnerValue(value) {
|
|
451
1390
|
if (
|
|
452
1391
|
!value ||
|
|
@@ -519,10 +1458,40 @@ function normalizedGraderValue(value) {
|
|
|
519
1458
|
}
|
|
520
1459
|
|
|
521
1460
|
async function runActor(binding, request, limits, host, prepare) {
|
|
1461
|
+
const egressContext = Object.freeze({
|
|
1462
|
+
planDigest: host.plan.planDigest,
|
|
1463
|
+
environmentDigest: host.plan.environmentDigest,
|
|
1464
|
+
executionManifestDigest: host.manifest.manifestDigest,
|
|
1465
|
+
roundId: request.roundId,
|
|
1466
|
+
stage: request.stage,
|
|
1467
|
+
branchId: request.branchId,
|
|
1468
|
+
taskId: request.taskId,
|
|
1469
|
+
inputMemoryDigest: request.inputMemoryDigest,
|
|
1470
|
+
});
|
|
522
1471
|
const outcome = await executePmExplorationBudgetedOperation({
|
|
523
1472
|
limits,
|
|
524
1473
|
allowedToolIds: host.manifest.toolIds,
|
|
525
1474
|
invokeTool: host.invokeTool,
|
|
1475
|
+
retrieveMemory:
|
|
1476
|
+
host.memoryRetrievalAuthority === null
|
|
1477
|
+
? null
|
|
1478
|
+
: ({ request: retrievalRequest, signal, remainingTokens }) =>
|
|
1479
|
+
retrievePmExplorationMemory(
|
|
1480
|
+
host.memoryRetrievalAuthority,
|
|
1481
|
+
egressContext,
|
|
1482
|
+
retrievalRequest,
|
|
1483
|
+
{ signal, remainingTokens },
|
|
1484
|
+
),
|
|
1485
|
+
invokeModel:
|
|
1486
|
+
host.modelEgressAuthority === null
|
|
1487
|
+
? null
|
|
1488
|
+
: ({ request: modelRequest, signal, remainingTokens }) =>
|
|
1489
|
+
invokePmExplorationModelEgress(
|
|
1490
|
+
host.modelEgressAuthority,
|
|
1491
|
+
egressContext,
|
|
1492
|
+
modelRequest,
|
|
1493
|
+
{ signal, remainingTokens },
|
|
1494
|
+
),
|
|
526
1495
|
operation: async (runtime) => {
|
|
527
1496
|
if (prepare !== null) {
|
|
528
1497
|
await prepare(request, runtime.signal);
|
|
@@ -535,6 +1504,19 @@ async function runActor(binding, request, limits, host, prepare) {
|
|
|
535
1504
|
},
|
|
536
1505
|
});
|
|
537
1506
|
const succeeded = outcome.status === "succeeded";
|
|
1507
|
+
const runnerIsolationEvidenceDigest =
|
|
1508
|
+
binding.consumeIsolationEvidence === null
|
|
1509
|
+
? null
|
|
1510
|
+
: binding.consumeIsolationEvidence(request.requestDigest);
|
|
1511
|
+
const egressEvidenceDigest =
|
|
1512
|
+
host.memoryRetrievalAuthority === null
|
|
1513
|
+
? null
|
|
1514
|
+
: (binding.consumeEgressEvidence?.(request.requestDigest) ?? null);
|
|
1515
|
+
if (succeeded && binding.isolation !== null) {
|
|
1516
|
+
digest(runnerIsolationEvidenceDigest, "runnerIsolationEvidenceDigest");
|
|
1517
|
+
}
|
|
1518
|
+
if (succeeded && host.memoryRetrievalAuthority !== null)
|
|
1519
|
+
digest(egressEvidenceDigest, "egressEvidenceDigest");
|
|
538
1520
|
const payload = {
|
|
539
1521
|
planDigest: host.plan.planDigest,
|
|
540
1522
|
environmentDigest: host.plan.environmentDigest,
|
|
@@ -550,12 +1532,32 @@ async function runActor(binding, request, limits, host, prepare) {
|
|
|
550
1532
|
traceDigest: succeeded ? outcome.value.traceDigest : outcome.traceDigest,
|
|
551
1533
|
status: outcome.status,
|
|
552
1534
|
failureClass: outcome.failureClass,
|
|
1535
|
+
...(binding.isolation === null
|
|
1536
|
+
? {}
|
|
1537
|
+
: {
|
|
1538
|
+
runnerIsolationEvidenceDigest: succeeded
|
|
1539
|
+
? runnerIsolationEvidenceDigest
|
|
1540
|
+
: null,
|
|
1541
|
+
}),
|
|
1542
|
+
...(host.memoryRetrievalAuthority === null
|
|
1543
|
+
? {}
|
|
1544
|
+
: {
|
|
1545
|
+
egressEvidenceDigest: succeeded ? egressEvidenceDigest : null,
|
|
1546
|
+
}),
|
|
553
1547
|
metrics: outcome.metrics,
|
|
554
1548
|
issuedAt: isoTime(host.now),
|
|
555
1549
|
};
|
|
556
1550
|
return Object.freeze({
|
|
557
1551
|
receipt: binding.issue(payload),
|
|
558
1552
|
providerSettlement: succeeded ? outcome.value.providerSettlement : null,
|
|
1553
|
+
runnerIsolationEvidenceDigest:
|
|
1554
|
+
succeeded && binding.isolation !== null
|
|
1555
|
+
? runnerIsolationEvidenceDigest
|
|
1556
|
+
: null,
|
|
1557
|
+
egressEvidenceDigest:
|
|
1558
|
+
succeeded && host.memoryRetrievalAuthority !== null
|
|
1559
|
+
? egressEvidenceDigest
|
|
1560
|
+
: null,
|
|
559
1561
|
});
|
|
560
1562
|
}
|
|
561
1563
|
|
|
@@ -603,13 +1605,184 @@ async function runGrader(binding, request, limits, host) {
|
|
|
603
1605
|
});
|
|
604
1606
|
}
|
|
605
1607
|
|
|
1608
|
+
function normalizedCurriculumValue(value) {
|
|
1609
|
+
exact(
|
|
1610
|
+
value,
|
|
1611
|
+
["taskId", "rationaleDigest"],
|
|
1612
|
+
"PM exploration curriculum result",
|
|
1613
|
+
);
|
|
1614
|
+
return Object.freeze({
|
|
1615
|
+
taskId: identifier(value.taskId, "taskId"),
|
|
1616
|
+
rationaleDigest: digest(value.rationaleDigest, "rationaleDigest"),
|
|
1617
|
+
});
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
function validateTaskSelectionPosition(host, projection, input) {
|
|
1621
|
+
if (
|
|
1622
|
+
projection.planDigest !== host.plan.planDigest ||
|
|
1623
|
+
projection.activeRoundCount !== 0 ||
|
|
1624
|
+
projection.stopReason !== null
|
|
1625
|
+
) {
|
|
1626
|
+
throw new Error("PM exploration journal is not ready for task selection");
|
|
1627
|
+
}
|
|
1628
|
+
if (input.stage === "broad") {
|
|
1629
|
+
if (projection.stage !== "broad")
|
|
1630
|
+
throw new Error("PM exploration broad selection stage is invalid");
|
|
1631
|
+
const branch = projection.branchHeads.find(
|
|
1632
|
+
(entry) => entry.branchId === input.branchId,
|
|
1633
|
+
);
|
|
1634
|
+
if (!branch || branch.memoryDigest !== input.inputMemoryDigest)
|
|
1635
|
+
throw new Error("PM exploration broad selection memory is invalid");
|
|
1636
|
+
return;
|
|
1637
|
+
}
|
|
1638
|
+
if (
|
|
1639
|
+
input.stage !== "deep" ||
|
|
1640
|
+
input.branchId !== null ||
|
|
1641
|
+
projection.stage !== "deep" ||
|
|
1642
|
+
projection.deepHead !== input.inputMemoryDigest
|
|
1643
|
+
) {
|
|
1644
|
+
throw new Error("PM exploration deep selection position is invalid");
|
|
1645
|
+
}
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
export async function selectPmExplorationTask(hostValue, journal, input) {
|
|
1649
|
+
const host = HOSTS.get(hostValue);
|
|
1650
|
+
if (!host)
|
|
1651
|
+
throw new TypeError("a branded PM exploration execution host is required");
|
|
1652
|
+
if (host.curriculum === null)
|
|
1653
|
+
throw new Error("PM exploration host has no curriculum provider");
|
|
1654
|
+
exact(
|
|
1655
|
+
input,
|
|
1656
|
+
["selectionId", "roundId", "stage", "branchId", "inputMemoryDigest"],
|
|
1657
|
+
"PM exploration task selection",
|
|
1658
|
+
);
|
|
1659
|
+
const selectionInput = Object.freeze({
|
|
1660
|
+
selectionId: identifier(input.selectionId, "selectionId"),
|
|
1661
|
+
roundId: identifier(input.roundId, "roundId"),
|
|
1662
|
+
stage: input.stage,
|
|
1663
|
+
branchId: input.branchId,
|
|
1664
|
+
inputMemoryDigest: digest(input.inputMemoryDigest, "inputMemoryDigest"),
|
|
1665
|
+
});
|
|
1666
|
+
const projection = inspectPmExplorationJournal(journal);
|
|
1667
|
+
validateTaskSelectionPosition(host, projection, selectionInput);
|
|
1668
|
+
const selections = host.selections.get(journal) ?? new Map();
|
|
1669
|
+
if (selections.size !== 0)
|
|
1670
|
+
throw new Error("PM exploration journal has a pending task selection");
|
|
1671
|
+
const core = {
|
|
1672
|
+
schema: PM_EXPLORATION_TASK_SELECTION_REQUEST_SCHEMA,
|
|
1673
|
+
planDigest: host.plan.planDigest,
|
|
1674
|
+
suiteDigest: host.plan.suiteDigest,
|
|
1675
|
+
trainingPartitionDigest: host.plan.trainingPartitionDigest,
|
|
1676
|
+
environmentDigest: host.plan.environmentDigest,
|
|
1677
|
+
executionManifestDigest: host.manifest.manifestDigest,
|
|
1678
|
+
...selectionInput,
|
|
1679
|
+
candidateTaskIds: host.plan.trainingTaskIds,
|
|
1680
|
+
completedRoundCount: projection.checkpointDigests.length,
|
|
1681
|
+
consecutiveNoGain: projection.consecutiveNoGain,
|
|
1682
|
+
};
|
|
1683
|
+
const request = deepFreeze({
|
|
1684
|
+
...core,
|
|
1685
|
+
requestDigest: hash(PM_EXPLORATION_TASK_SELECTION_REQUEST_SCHEMA, core),
|
|
1686
|
+
});
|
|
1687
|
+
const outcome = await executePmExplorationBudgetedOperation({
|
|
1688
|
+
limits: remaining(host.plan, totalUsage(host, journal, projection)),
|
|
1689
|
+
operation: async (runtime) =>
|
|
1690
|
+
normalizedCurriculumValue(
|
|
1691
|
+
await host.curriculum.handler(request, runtime),
|
|
1692
|
+
),
|
|
1693
|
+
});
|
|
1694
|
+
const consumedIsolationEvidence =
|
|
1695
|
+
host.curriculum.consumeIsolationEvidence?.(request.requestDigest) ?? null;
|
|
1696
|
+
const succeeded =
|
|
1697
|
+
outcome.status === "succeeded" &&
|
|
1698
|
+
host.plan.trainingTaskIds.includes(outcome.value.taskId);
|
|
1699
|
+
const curriculumIsolationEvidenceDigest = succeeded
|
|
1700
|
+
? consumedIsolationEvidence
|
|
1701
|
+
: null;
|
|
1702
|
+
if (succeeded)
|
|
1703
|
+
digest(
|
|
1704
|
+
curriculumIsolationEvidenceDigest,
|
|
1705
|
+
"curriculumIsolationEvidenceDigest",
|
|
1706
|
+
);
|
|
1707
|
+
const status =
|
|
1708
|
+
outcome.status === "succeeded" && !succeeded ? "failed" : outcome.status;
|
|
1709
|
+
const failureClass =
|
|
1710
|
+
outcome.status === "succeeded" && !succeeded
|
|
1711
|
+
? "infrastructure"
|
|
1712
|
+
: outcome.failureClass;
|
|
1713
|
+
const receipt = host.curriculum.issue({
|
|
1714
|
+
planDigest: host.plan.planDigest,
|
|
1715
|
+
environmentDigest: host.plan.environmentDigest,
|
|
1716
|
+
executionManifestDigest: host.manifest.manifestDigest,
|
|
1717
|
+
requestDigest: request.requestDigest,
|
|
1718
|
+
...selectionInput,
|
|
1719
|
+
taskId: succeeded ? outcome.value.taskId : null,
|
|
1720
|
+
rationaleDigest: succeeded
|
|
1721
|
+
? outcome.value.rationaleDigest
|
|
1722
|
+
: outcome.traceDigest,
|
|
1723
|
+
status,
|
|
1724
|
+
failureClass,
|
|
1725
|
+
curriculumIsolationEvidenceDigest,
|
|
1726
|
+
metrics: outcome.metrics,
|
|
1727
|
+
issuedAt: isoTime(host.now),
|
|
1728
|
+
});
|
|
1729
|
+
const verified = verifyPmExplorationReceipt(
|
|
1730
|
+
host.curriculum.authority,
|
|
1731
|
+
receipt,
|
|
1732
|
+
{
|
|
1733
|
+
planDigest: host.plan.planDigest,
|
|
1734
|
+
environmentDigest: host.plan.environmentDigest,
|
|
1735
|
+
executionManifestDigest: host.manifest.manifestDigest,
|
|
1736
|
+
requestDigest: request.requestDigest,
|
|
1737
|
+
selectionId: selectionInput.selectionId,
|
|
1738
|
+
roundId: selectionInput.roundId,
|
|
1739
|
+
stage: selectionInput.stage,
|
|
1740
|
+
branchId: selectionInput.branchId,
|
|
1741
|
+
inputMemoryDigest: selectionInput.inputMemoryDigest,
|
|
1742
|
+
},
|
|
1743
|
+
);
|
|
1744
|
+
recordOverhead(host, journal, verified.payload.metrics);
|
|
1745
|
+
if (succeeded) {
|
|
1746
|
+
selections.set(
|
|
1747
|
+
selectionInput.roundId,
|
|
1748
|
+
Object.freeze({
|
|
1749
|
+
receiptDigest: verified.receiptDigest,
|
|
1750
|
+
metrics: verified.payload.metrics,
|
|
1751
|
+
}),
|
|
1752
|
+
);
|
|
1753
|
+
host.selections.set(journal, selections);
|
|
1754
|
+
}
|
|
1755
|
+
return deepFreeze({
|
|
1756
|
+
schema: PM_EXPLORATION_TASK_SELECTION_RESULT_SCHEMA,
|
|
1757
|
+
selection: succeeded
|
|
1758
|
+
? Object.freeze({
|
|
1759
|
+
taskId: verified.payload.taskId,
|
|
1760
|
+
selectionReceiptDigest: verified.receiptDigest,
|
|
1761
|
+
})
|
|
1762
|
+
: null,
|
|
1763
|
+
curriculumReceipt: verified,
|
|
1764
|
+
curriculumIsolationEvidenceDigest,
|
|
1765
|
+
budgetEnforced: true,
|
|
1766
|
+
receiptsAuthenticated: true,
|
|
1767
|
+
snapshotAuthenticated: false,
|
|
1768
|
+
qualifiesForPromotion: false,
|
|
1769
|
+
});
|
|
1770
|
+
}
|
|
1771
|
+
|
|
606
1772
|
export async function executePmExplorationRound(hostValue, journal, input) {
|
|
607
1773
|
const host = HOSTS.get(hostValue);
|
|
608
1774
|
if (!host)
|
|
609
1775
|
throw new TypeError("a branded PM exploration execution host is required");
|
|
610
1776
|
exact(
|
|
611
1777
|
input,
|
|
612
|
-
[
|
|
1778
|
+
[
|
|
1779
|
+
"roundId",
|
|
1780
|
+
"stage",
|
|
1781
|
+
"branchId",
|
|
1782
|
+
"taskId",
|
|
1783
|
+
"inputMemoryDigest",
|
|
1784
|
+
...(host.curriculum === null ? [] : ["taskSelectionReceipt"]),
|
|
1785
|
+
],
|
|
613
1786
|
"PM exploration hosted round",
|
|
614
1787
|
);
|
|
615
1788
|
const roundInput = Object.freeze({
|
|
@@ -622,6 +1795,35 @@ export async function executePmExplorationRound(hostValue, journal, input) {
|
|
|
622
1795
|
const before = inspectPmExplorationJournal(journal);
|
|
623
1796
|
if (before.planDigest !== host.plan.planDigest)
|
|
624
1797
|
throw new Error("PM exploration journal differs from the execution host");
|
|
1798
|
+
let curriculumMetrics = Object.freeze({
|
|
1799
|
+
tokens: 0,
|
|
1800
|
+
toolCalls: 0,
|
|
1801
|
+
wallClockMs: 0,
|
|
1802
|
+
});
|
|
1803
|
+
if (host.curriculum !== null) {
|
|
1804
|
+
const selectionReceipt = verifyPmExplorationReceipt(
|
|
1805
|
+
host.curriculum.authority,
|
|
1806
|
+
input.taskSelectionReceipt,
|
|
1807
|
+
{
|
|
1808
|
+
planDigest: host.plan.planDigest,
|
|
1809
|
+
environmentDigest: host.plan.environmentDigest,
|
|
1810
|
+
executionManifestDigest: host.manifest.manifestDigest,
|
|
1811
|
+
roundId: roundInput.roundId,
|
|
1812
|
+
stage: roundInput.stage,
|
|
1813
|
+
branchId: roundInput.branchId,
|
|
1814
|
+
inputMemoryDigest: roundInput.inputMemoryDigest,
|
|
1815
|
+
taskId: roundInput.taskId,
|
|
1816
|
+
status: "succeeded",
|
|
1817
|
+
},
|
|
1818
|
+
);
|
|
1819
|
+
const selections = host.selections.get(journal);
|
|
1820
|
+
const selected = selections?.get(roundInput.roundId);
|
|
1821
|
+
if (selected?.receiptDigest !== selectionReceipt.receiptDigest) {
|
|
1822
|
+
throw new Error("PM exploration task selection is missing or replayed");
|
|
1823
|
+
}
|
|
1824
|
+
curriculumMetrics = selected.metrics;
|
|
1825
|
+
selections.delete(roundInput.roundId);
|
|
1826
|
+
}
|
|
625
1827
|
const round = startPmExplorationRound(journal, roundInput);
|
|
626
1828
|
const runCore = {
|
|
627
1829
|
schema: PM_EXPLORATION_RUN_REQUEST_SCHEMA,
|
|
@@ -699,7 +1901,10 @@ export async function executePmExplorationRound(hostValue, journal, input) {
|
|
|
699
1901
|
outputMemoryDigest: execution.payload.outputMemoryDigest,
|
|
700
1902
|
},
|
|
701
1903
|
);
|
|
702
|
-
const consumed = addMetrics(
|
|
1904
|
+
const consumed = addMetrics(
|
|
1905
|
+
curriculumMetrics,
|
|
1906
|
+
addMetrics(execution.payload.metrics, grade.payload.metrics),
|
|
1907
|
+
);
|
|
703
1908
|
const checkpoint = completePmExplorationRound(journal, round, {
|
|
704
1909
|
executionReceiptDigest: execution.receiptDigest,
|
|
705
1910
|
graderReceiptDigest: grade.receiptDigest,
|
|
@@ -707,12 +1912,23 @@ export async function executePmExplorationRound(hostValue, journal, input) {
|
|
|
707
1912
|
decision: grade.payload.decision,
|
|
708
1913
|
metrics: consumed,
|
|
709
1914
|
});
|
|
1915
|
+
if (host.curriculum !== null)
|
|
1916
|
+
settleOverhead(host, journal, curriculumMetrics);
|
|
710
1917
|
return deepFreeze({
|
|
711
1918
|
schema: PM_EXPLORATION_EXECUTION_RESULT_SCHEMA,
|
|
712
1919
|
checkpoint,
|
|
713
1920
|
executionReceipt: execution,
|
|
714
1921
|
graderReceipt: grade,
|
|
715
1922
|
providerSettlement: executionOutcome.providerSettlement,
|
|
1923
|
+
...(executionOutcome.runnerIsolationEvidenceDigest === null
|
|
1924
|
+
? {}
|
|
1925
|
+
: {
|
|
1926
|
+
runnerIsolationEvidenceDigest:
|
|
1927
|
+
executionOutcome.runnerIsolationEvidenceDigest,
|
|
1928
|
+
}),
|
|
1929
|
+
...(executionOutcome.egressEvidenceDigest === null
|
|
1930
|
+
? {}
|
|
1931
|
+
: { egressEvidenceDigest: executionOutcome.egressEvidenceDigest }),
|
|
716
1932
|
budgetEnforced: true,
|
|
717
1933
|
receiptsAuthenticated: true,
|
|
718
1934
|
snapshotAuthenticated: false,
|
|
@@ -797,6 +2013,14 @@ export async function mergePmExplorationBranches(hostValue, journal, input) {
|
|
|
797
2013
|
normalizedMergerValue(await host.merger.handler(request, runtime)),
|
|
798
2014
|
});
|
|
799
2015
|
const succeeded = outcome.status === "succeeded";
|
|
2016
|
+
const consumedIsolationEvidence =
|
|
2017
|
+
host.merger.consumeIsolationEvidence?.(request.requestDigest) ?? null;
|
|
2018
|
+
const mergerIsolationEvidenceDigest = succeeded
|
|
2019
|
+
? consumedIsolationEvidence
|
|
2020
|
+
: null;
|
|
2021
|
+
if (succeeded && host.merger.isolation !== null) {
|
|
2022
|
+
digest(mergerIsolationEvidenceDigest, "mergerIsolationEvidenceDigest");
|
|
2023
|
+
}
|
|
800
2024
|
const receipt = host.merger.issue({
|
|
801
2025
|
planDigest: host.plan.planDigest,
|
|
802
2026
|
environmentDigest: host.plan.environmentDigest,
|
|
@@ -811,6 +2035,9 @@ export async function mergePmExplorationBranches(hostValue, journal, input) {
|
|
|
811
2035
|
: outcome.traceDigest,
|
|
812
2036
|
status: outcome.status,
|
|
813
2037
|
failureClass: outcome.failureClass,
|
|
2038
|
+
...(host.merger.isolation === null
|
|
2039
|
+
? {}
|
|
2040
|
+
: { mergerIsolationEvidenceDigest }),
|
|
814
2041
|
metrics: outcome.metrics,
|
|
815
2042
|
issuedAt: isoTime(host.now),
|
|
816
2043
|
});
|
|
@@ -833,6 +2060,9 @@ export async function mergePmExplorationBranches(hostValue, journal, input) {
|
|
|
833
2060
|
schema: PM_EXPLORATION_MERGE_RESULT_SCHEMA,
|
|
834
2061
|
merge,
|
|
835
2062
|
mergeReceipt: verified,
|
|
2063
|
+
...(host.merger.isolation === null
|
|
2064
|
+
? {}
|
|
2065
|
+
: { mergerIsolationEvidenceDigest }),
|
|
836
2066
|
budgetEnforced: true,
|
|
837
2067
|
receiptsAuthenticated: true,
|
|
838
2068
|
snapshotAuthenticated: false,
|
|
@@ -893,6 +2123,16 @@ export async function evaluatePmExplorationMemory(hostValue, journal, input) {
|
|
|
893
2123
|
operation: async (runtime) =>
|
|
894
2124
|
normalizedEvaluatorValue(await host.evaluator.handler(request, runtime)),
|
|
895
2125
|
});
|
|
2126
|
+
const consumedIsolationEvidence =
|
|
2127
|
+
host.evaluator.consumeIsolationEvidence?.(request.requestDigest) ?? null;
|
|
2128
|
+
const evaluatorIsolationEvidenceDigest =
|
|
2129
|
+
outcome.status === "succeeded" ? consumedIsolationEvidence : null;
|
|
2130
|
+
if (outcome.status === "succeeded" && host.evaluator.isolation !== null) {
|
|
2131
|
+
digest(
|
|
2132
|
+
evaluatorIsolationEvidenceDigest,
|
|
2133
|
+
"evaluatorIsolationEvidenceDigest",
|
|
2134
|
+
);
|
|
2135
|
+
}
|
|
896
2136
|
const evaluation =
|
|
897
2137
|
outcome.status === "succeeded"
|
|
898
2138
|
? outcome.value
|
|
@@ -911,6 +2151,9 @@ export async function evaluatePmExplorationMemory(hostValue, journal, input) {
|
|
|
911
2151
|
decision: evaluation.decision,
|
|
912
2152
|
scoreBasisPoints: evaluation.scoreBasisPoints,
|
|
913
2153
|
evaluationDigest: evaluation.evaluationDigest,
|
|
2154
|
+
...(host.evaluator.isolation === null
|
|
2155
|
+
? {}
|
|
2156
|
+
: { evaluatorIsolationEvidenceDigest }),
|
|
914
2157
|
metrics: outcome.metrics,
|
|
915
2158
|
issuedAt: isoTime(host.now),
|
|
916
2159
|
});
|
|
@@ -938,6 +2181,9 @@ export async function evaluatePmExplorationMemory(hostValue, journal, input) {
|
|
|
938
2181
|
schema: PM_EXPLORATION_EVALUATION_RESULT_SCHEMA,
|
|
939
2182
|
frozen,
|
|
940
2183
|
evaluatorReceipt: verified,
|
|
2184
|
+
...(host.evaluator.isolation === null
|
|
2185
|
+
? {}
|
|
2186
|
+
: { evaluatorIsolationEvidenceDigest }),
|
|
941
2187
|
budgetEnforced: true,
|
|
942
2188
|
receiptsAuthenticated: true,
|
|
943
2189
|
snapshotAuthenticated: false,
|