chainlesschain 0.166.59 → 0.166.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -8
- package/package.json +4 -1
- package/src/assets/web-panel/assets/{AIOps-B9i3kk5f.js → AIOps-CfPrpABR.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DGMs1wBm.js → ActionButton-Bkv1erki.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D-JGeynM.js → Analytics-fY_7epoU.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DLECnXlP.js → AppLayout-DegaN-aa.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CwaTiXN4.js → Artifacts-90-UNTVE.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BCb7s5Ky.js → Audit-BRQ1F4sA.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D4IOzvKs.js → BackgroundAgents-Cb85uP7O.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cknunk10.js → Backup-CrLBSWQK.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DnU8pbUh.js → BaseInput-DditUW5B.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DOouYIhz.js → Chat-0XozleDQ.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-8QXBJvgy.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BrumNw6V.js → Checkbox-C2Ck_3ju.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B4E_uI_N.js → Codegen-Chjw-MS7.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C7H2sdaL.js → Col-B_w8_Oka.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BFdzcMSl.js → Community-XAqxPnXq.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BzVXohrg.js → Compact-BX_3GJ3m.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-B_4QcuSH.js → Compliance-DE3kIC9z.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DjuQzJx8.js → Cowork-DPBYp1ey.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Bf2iY-1-.js → Cron-D9cknqzn.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CY9QW7IT.js → Crosschain-BzHrGWY9.js} +1 -1
- package/src/assets/web-panel/assets/{DID-kDZBvaKr.js → DID-BuD8TkZl.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DoYboS3g.js → Dashboard-BbxMuZVK.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-LLEzI6l1.js → Dropdown-jq0ki-tE.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D2kmSvkg.js → EmailListRenderer-RiMvINxT.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DHj2yUGZ.js → EvolutionSettings-DE-URi9i.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B7Hg7fR0.js → FamilyGuardDashboard-DV3ao62-.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CUdwU6aH.js → Federation-BF6BmBPg.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D1KrwjwY.js → FormItemContext-CKTX59j2.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CXGLoHfw.js → GenericCardRenderer-DZkH-CTs.js} +1 -1
- package/src/assets/web-panel/assets/{Git-TG3Q9JWG.js → Git-B5JYb-w-.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BJD7h_fv.js → Governance-D3WfDZ6W.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dky4l_bZ.js → Inference-DoSvfDUk.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CCx9aXBV.js → KnowledgeGraph-DUDIzN97.js} +1 -1
- package/src/assets/web-panel/assets/Logs-JfJerfFD.js +2 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-DXgA7cZm.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BzL6KJMX.js → Marketplace-BpVrOM_V.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BReSRzEU.js → McpTools-CFnQdiSv.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BhmkkCxd.js → Memory-Dxv81cNl.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BeQMHr_n.js → MobileBridge-C92eX7PB.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CphEwj_l.js → MobileProjects-BUHw7Wox.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CFk1ibuN.js → Mtc-D-G9H4A1.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CU9qrmbH.js → MtcAudit-CAEaEtAz.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CKR-Gh0Y.js → Multisig-Cx_-X9HD.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-D1qWY6Mx.js → NLProgramming-DRIKG4Xy.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-B4CM0C65.js → Notes-CmL0vKUv.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-BTQYWveR.js → NotificationSettings-D2cQ5aQn.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DxN6fAn8.js → OrderTableRenderer-CPfd7PNy.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-scgboNfd.js → Organization-EKqO46hz.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-BP4aQhid.js → Overflow-BOHjBwJo.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-65jIo6MY.js → P2P-Dx4LdCE0.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Bfi4-tDQ.js → PdhVaultBrowser-CgCt2xdT.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DWtxT7bE.js → Permissions-DWjDeO7O.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Bilmr8BR.js → PersonalDataHub-Bx4Od8pG.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-IPIMM-1y.js → Pipeline-oKxws_Ch.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DFB8RiVK.js → Privacy-Df1HVRKR.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DxZksvu1.js → ProjectInit-BraLwZT4.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DsjPsnYN.js → ProjectSettings-CKru54M0.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CC5FBLLq.js → Projects-BEr7cJcS.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Dk3ViPuF.js → Providers-C8v30DU3.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CJ8R6-bF.js → QrScannerModal-CPyNV-O5.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DJfCPORc.js → QuickAsk-BLIew7A5.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DjDygXeb.js → Recommend-DVjWmsPs.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BJiJ1YHw.js → RemoteSession-B4PNTaEf.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-fYE8jPcc.js → Reputation-D5HOV6oI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-vcvsjMm4.js → Row-DgCQom2M.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CZnKliwn.js → RssFeed-zvIcGHgz.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DEStiFGI.js → Search-C-KbJP_z.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BPb_szxS.js → Security-CasnI-Ld.js} +3 -3
- package/src/assets/web-panel/assets/{Services-TR0xZhSF.js → Services-CR-pSlFv.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BSPu9boC.js → Skeleton-BB5On1b5.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CXEj9pC6.js → Skills-CC-wdQi-.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jlOlDGMA.js → Sla-CPX5QKEu.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C8oPE_HQ.js → SpeechSettings-Bifkl6Zz.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DZNUx8zt.js → SyncSettings-CdUVeB-S.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-B4T6aoOl.js → Tasks-BttwN3fs.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DeRgtwZ5.js → Templates-CBHNbpQ7.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DDVoXGxa.js → Tenant-B90lEwSQ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DGAUoJMz.js → Terminal-u8KqitsA.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Co4Nkpjm.js → TimelineRenderer-CnEJMkJo.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DaMLa0Fm.js → Tokens-CTM2OOJ_.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C7iLr-Ik.js → Trigger-Ca8NmmgU.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CxX_tQqi.js → Trust-CI9GpUj2.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-ClrdckEx.js → UkeySign-BlMLGqKK.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DgTVhaoK.js → VideoEditing-C8yCZrH0.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-SIbwES0O.js → Wallet-BpuYrz8o.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-YNqVnhZF.js → WebAuthn-DFpNfLG_.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BvynT9mj.js → WorkflowEditor-BWhLoeU4.js} +1 -1
- package/src/assets/web-panel/assets/{chat-X79b2tVy.js → chat-Dwo4LC7E.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DioWDCbu.js → colors-DkdGvKBf.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DpAXXaqu.js → compact-item-1gI0lfs3.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BYq8bCQX.js → createContext-O9iHirtr.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-axBqv361.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CDJNMJ_n.js → hasIn-DY1jo9BQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUe-hFGb.js → index-1AnBwAoM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CS3QdYDW.js → index-B-kbagPi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZysaS5T.js → index-B0TX-bLV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx0_WiSe.js → index-B5l7eb6E.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJEFd0QJ.js → index-BDwV_V5g.js} +1 -1
- package/src/assets/web-panel/assets/{index-D88MWTOx.js → index-BgHG4f2K.js} +1 -1
- package/src/assets/web-panel/assets/{index-BK53HyEP.js → index-BgVO1aXv.js} +1 -1
- package/src/assets/web-panel/assets/{index-COqkDiRU.js → index-Bl6GfsQZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUbuCFWb.js → index-BmAK4o9I.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7cXBJcM.js → index-BsQkwBu2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Byt1ny7l.js → index-BumRAO-7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bh9la-GL.js → index-Bx4MNNMY.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8_grEFP.js → index-C4c0XaiT.js} +1 -1
- package/src/assets/web-panel/assets/index-CAsOttsq.js +1 -0
- package/src/assets/web-panel/assets/{index-YviHYMA2.js → index-CBqSTwY9.js} +1 -1
- package/src/assets/web-panel/assets/{index-00kVj4me.js → index-D8fqsTHW.js} +1 -1
- package/src/assets/web-panel/assets/{index-Wl55a61D.js → index-DCqPIE3G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLSt7mOy.js → index-DNnaEzC5.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4xggKQp.js → index-DTppQua6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbxqdIzD.js → index-DfFzjnA0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwHEGjR7.js → index-DskEFn8M.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3J9FKFr.js → index-DvRvwzc-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGEXGr9g.js → index-DwBcFhcc.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6wxVEIZ.js → index-DwJBbK3Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-mHAPEcPi.js → index-DwhJqZqM.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1-NqghD.js → index-Dx51Am-0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DP9ZLjra.js → index-E5Ar6dNV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSFkmRvK.js → index-ETHEhWvI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmNspbVU.js → index-KUrBWzIM.js} +1 -1
- package/src/assets/web-panel/assets/index-MgEKheCh.js +1 -0
- package/src/assets/web-panel/assets/{index-TqLyy6IR.js → index-YnGvCu0P.js} +3 -3
- package/src/assets/web-panel/assets/{index-Q3WQ5Zhr.js → index-hRtVittm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAnXSg0r.js → index-nXoV4OCZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBvA7Hxj.js → index-qUbrqzvO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIO8EVHt.js → index-rIJqtLz-.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8ChecWd.js → index-rkkMl4Lb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DwG9khVs.js → index-tXjOuLZm.js} +1 -1
- package/src/assets/web-panel/assets/{index-V6l3ia83.js → index-zLOzCcxM.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bt0zcD5R.js → index-zPpssHXA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-18rmGkik.js → initDefaultProps-Du5HHTVt.js} +1 -1
- package/src/assets/web-panel/assets/{motion-3kvGzSgV.js → motion-D9mAVPKP.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dx3DiVHc.js → move-DPO_sFtt.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-VX1dFJEI.js → mtc-parser-CnezVcXi.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CniSeCOA.js → omit-DNpYMbet.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-RPggmcOd.js → pickAttrs-BUFm_slL.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B45YBykr.js → placementArrow-DvwJtnzY.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D0nciAEn.js → responsiveObserve-CUWOh_KI.js} +1 -1
- package/src/assets/web-panel/assets/{slide-UxLNWqjI.js → slide-bVHCUsdj.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CukpV_uI.js → statusUtils-FlOzOrxf.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BIcEZk6Y.js → styleChecker-C6CFXutA.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Zah-xvV3.js → useFlexGapSupport-BNGqO_E0.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BA7ihKFN.js → useFs-DyKOrA27.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C64CsyY3.js → usePersonalDataHub-DZAqeMAJ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Datcekgj.js → vnode-Do7fVasi.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CaFQv1KF.js → zoom-DYkEmOT2.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +52 -0
- package/src/lib/background-agent-supervisor.js +10 -1
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +119 -12
- package/src/lib/evolution/evolution-artifact-ports.js +6 -0
- package/src/lib/evolution/evolution-deployment-loader.js +139 -0
- package/src/lib/evolution/evolution-eval-gate.js +5 -0
- package/src/lib/evolution/evolution-ledger-ports.js +41 -17
- package/src/lib/evolution/pm-exploration-benchmark.js +253 -0
- package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
- package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
- package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
- package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
- package/src/lib/evolution/pm-exploration-ledger-adapter.js +860 -0
- package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
- package/src/lib/evolution/pm-exploration-receipts.js +626 -0
- package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
- package/src/lib/evolution/pm-exploration-rounds.js +842 -0
- package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
- package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
- package/src/lib/evolution/pm-result-grader.cjs +287 -0
- package/src/lib/read-file-loop-guard.js +36 -5
- package/src/lib/secure-fs.js +51 -4
- package/src/lib/task-progress-tracker.js +29 -7
- package/src/lib/text-file-search.js +1 -0
- package/src/runtime/agent-core.js +46 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-C4tdSms8.js +0 -1
- package/src/assets/web-panel/assets/Logs-BtesccPB.js +0 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DoN7oE2J.js +0 -1
- package/src/assets/web-panel/assets/devWarning-ONeWC5dH.js +0 -1
- package/src/assets/web-panel/assets/index--QLnQuO9.js +0 -1
- package/src/assets/web-panel/assets/index-CkgeII0e.js +0 -1
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { isProxy } from "node:util/types";
|
|
3
|
+
|
|
4
|
+
import { verifyPmExplorationRecoverySnapshotAck } from "./pm-exploration-recovery-snapshot-store.js";
|
|
5
|
+
|
|
6
|
+
export const PM_EXPLORATION_SUCCESS_TRANSITION_SCHEMA =
|
|
7
|
+
"chainlesschain.desktop-pm-state-transition-success/v1";
|
|
8
|
+
export const PM_EXPLORATION_FAILED_TRANSITION_SCHEMA =
|
|
9
|
+
"chainlesschain.desktop-pm-failed-execution-evidence/v1";
|
|
10
|
+
export const PM_EXPLORATION_TRANSITION_DURABILITY_ACK_SCHEMA =
|
|
11
|
+
"chainlesschain.pm-exploration-transition-durability-ack/v1";
|
|
12
|
+
export const PM_EXPLORATION_SNAPSHOT_BOUND_TRANSITION_DURABILITY_ACK_SCHEMA =
|
|
13
|
+
"chainlesschain.pm-exploration-transition-durability-ack/v2";
|
|
14
|
+
export const PM_EXPLORATION_TRANSITION_RECOVERY_REQUEST_SCHEMA =
|
|
15
|
+
"chainlesschain.pm-exploration-transition-recovery-request/v1";
|
|
16
|
+
export const PM_EXPLORATION_TRANSITION_RECOVERY_SCHEMA =
|
|
17
|
+
"chainlesschain.pm-exploration-transition-recovery/v1";
|
|
18
|
+
|
|
19
|
+
const DATABASE_SEAL_SCHEMA =
|
|
20
|
+
"chainlesschain.desktop-pm-database-pre-run-seal/v1";
|
|
21
|
+
const DATABASE_TRANSITION_DOMAIN =
|
|
22
|
+
"chainlesschain.desktop-pm-database-transition/v1";
|
|
23
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
24
|
+
const MAX_SNAPSHOT_BYTES = 8 * 1024 * 1024 * 1024;
|
|
25
|
+
const COMMITTERS = new WeakMap();
|
|
26
|
+
|
|
27
|
+
function canonical(value) {
|
|
28
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
29
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
30
|
+
return `{${Object.keys(value)
|
|
31
|
+
.sort()
|
|
32
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
33
|
+
.join(",")}}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function hash(domain, value, canonicalize = true) {
|
|
37
|
+
return `sha256:${createHash("sha256")
|
|
38
|
+
.update(domain)
|
|
39
|
+
.update("\0")
|
|
40
|
+
.update(canonicalize ? canonical(value) : JSON.stringify(value))
|
|
41
|
+
.digest("hex")}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function exact(value, keys, label) {
|
|
45
|
+
if (
|
|
46
|
+
!value ||
|
|
47
|
+
typeof value !== "object" ||
|
|
48
|
+
Array.isArray(value) ||
|
|
49
|
+
isProxy(value) ||
|
|
50
|
+
Object.getPrototypeOf(value) !== Object.prototype
|
|
51
|
+
) {
|
|
52
|
+
throw new TypeError(`${label} must be a plain object`);
|
|
53
|
+
}
|
|
54
|
+
const actual = Reflect.ownKeys(value);
|
|
55
|
+
if (
|
|
56
|
+
actual.length !== keys.length ||
|
|
57
|
+
actual.some((key) => {
|
|
58
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
59
|
+
return (
|
|
60
|
+
typeof key !== "string" ||
|
|
61
|
+
!keys.includes(key) ||
|
|
62
|
+
!descriptor ||
|
|
63
|
+
!descriptor.enumerable ||
|
|
64
|
+
!("value" in descriptor)
|
|
65
|
+
);
|
|
66
|
+
})
|
|
67
|
+
) {
|
|
68
|
+
throw new TypeError(`${label} has unexpected or accessor fields`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function digest(value, label) {
|
|
73
|
+
if (typeof value !== "string" || !DIGEST.test(value))
|
|
74
|
+
throw new TypeError(`${label} must be a sha256 digest`);
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function optionalDigest(value, label) {
|
|
79
|
+
return value === null ? null : digest(value, label);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function deepFreeze(value, seen = new WeakSet()) {
|
|
83
|
+
if (!value || typeof value !== "object" || seen.has(value)) return value;
|
|
84
|
+
seen.add(value);
|
|
85
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
86
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
87
|
+
if (descriptor && "value" in descriptor) deepFreeze(descriptor.value, seen);
|
|
88
|
+
}
|
|
89
|
+
return Object.freeze(value);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function databaseSeal(value, label) {
|
|
93
|
+
exact(
|
|
94
|
+
value,
|
|
95
|
+
[
|
|
96
|
+
"schema",
|
|
97
|
+
"databasePathDigest",
|
|
98
|
+
"databaseSnapshotDigest",
|
|
99
|
+
"databaseSnapshotBytes",
|
|
100
|
+
"snapshotMethod",
|
|
101
|
+
"sealDigest",
|
|
102
|
+
],
|
|
103
|
+
label,
|
|
104
|
+
);
|
|
105
|
+
if (
|
|
106
|
+
value.schema !== DATABASE_SEAL_SCHEMA ||
|
|
107
|
+
value.snapshotMethod !== "database-manager-backup" ||
|
|
108
|
+
!Number.isSafeInteger(value.databaseSnapshotBytes) ||
|
|
109
|
+
value.databaseSnapshotBytes < 1 ||
|
|
110
|
+
value.databaseSnapshotBytes > MAX_SNAPSHOT_BYTES
|
|
111
|
+
) {
|
|
112
|
+
throw new TypeError(`${label} is invalid`);
|
|
113
|
+
}
|
|
114
|
+
const core = {
|
|
115
|
+
schema: value.schema,
|
|
116
|
+
databasePathDigest: digest(
|
|
117
|
+
value.databasePathDigest,
|
|
118
|
+
`${label} databasePathDigest`,
|
|
119
|
+
),
|
|
120
|
+
databaseSnapshotDigest: digest(
|
|
121
|
+
value.databaseSnapshotDigest,
|
|
122
|
+
`${label} databaseSnapshotDigest`,
|
|
123
|
+
),
|
|
124
|
+
databaseSnapshotBytes: value.databaseSnapshotBytes,
|
|
125
|
+
snapshotMethod: value.snapshotMethod,
|
|
126
|
+
};
|
|
127
|
+
const seal = deepFreeze({
|
|
128
|
+
...core,
|
|
129
|
+
sealDigest: digest(value.sealDigest, `${label} sealDigest`),
|
|
130
|
+
});
|
|
131
|
+
if (seal.sealDigest !== hash(DATABASE_SEAL_SCHEMA, core))
|
|
132
|
+
throw new Error(`${label} digest mismatch`);
|
|
133
|
+
return seal;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function successTransition(value, expectedManifestDigest) {
|
|
137
|
+
exact(
|
|
138
|
+
value,
|
|
139
|
+
[
|
|
140
|
+
"schema",
|
|
141
|
+
"manifestDigest",
|
|
142
|
+
"executionReceiptDigest",
|
|
143
|
+
"graderReceiptDigest",
|
|
144
|
+
"preRunSeal",
|
|
145
|
+
"postRunSeal",
|
|
146
|
+
"databaseChanged",
|
|
147
|
+
"previousStateTransitionDigest",
|
|
148
|
+
"stateTransitionDigest",
|
|
149
|
+
"authenticated",
|
|
150
|
+
"durable",
|
|
151
|
+
"qualifiesForPromotion",
|
|
152
|
+
],
|
|
153
|
+
"PM success transition evidence",
|
|
154
|
+
);
|
|
155
|
+
if (
|
|
156
|
+
value.schema !== PM_EXPLORATION_SUCCESS_TRANSITION_SCHEMA ||
|
|
157
|
+
value.manifestDigest !== expectedManifestDigest ||
|
|
158
|
+
typeof value.databaseChanged !== "boolean" ||
|
|
159
|
+
value.authenticated !== false ||
|
|
160
|
+
value.durable !== false ||
|
|
161
|
+
value.qualifiesForPromotion !== false
|
|
162
|
+
) {
|
|
163
|
+
throw new Error("PM success transition evidence fields are invalid");
|
|
164
|
+
}
|
|
165
|
+
const preRunSeal = databaseSeal(value.preRunSeal, "PM pre-run seal");
|
|
166
|
+
const postRunSeal = databaseSeal(value.postRunSeal, "PM post-run seal");
|
|
167
|
+
if (postRunSeal.databasePathDigest !== preRunSeal.databasePathDigest)
|
|
168
|
+
throw new Error("PM success transition changed database identity");
|
|
169
|
+
const databaseChanged =
|
|
170
|
+
postRunSeal.databaseSnapshotDigest !== preRunSeal.databaseSnapshotDigest;
|
|
171
|
+
if (databaseChanged !== value.databaseChanged)
|
|
172
|
+
throw new Error("PM success transition databaseChanged is inconsistent");
|
|
173
|
+
const core = {
|
|
174
|
+
manifestDigest: digest(value.manifestDigest, "manifestDigest"),
|
|
175
|
+
executionReceiptDigest: digest(
|
|
176
|
+
value.executionReceiptDigest,
|
|
177
|
+
"executionReceiptDigest",
|
|
178
|
+
),
|
|
179
|
+
graderReceiptDigest: digest(
|
|
180
|
+
value.graderReceiptDigest,
|
|
181
|
+
"graderReceiptDigest",
|
|
182
|
+
),
|
|
183
|
+
preRunSealDigest: preRunSeal.sealDigest,
|
|
184
|
+
postRunSealDigest: postRunSeal.sealDigest,
|
|
185
|
+
previousStateTransitionDigest: optionalDigest(
|
|
186
|
+
value.previousStateTransitionDigest,
|
|
187
|
+
"previousStateTransitionDigest",
|
|
188
|
+
),
|
|
189
|
+
};
|
|
190
|
+
const stateTransitionDigest = digest(
|
|
191
|
+
value.stateTransitionDigest,
|
|
192
|
+
"stateTransitionDigest",
|
|
193
|
+
);
|
|
194
|
+
if (stateTransitionDigest !== hash(DATABASE_TRANSITION_DOMAIN, core, false))
|
|
195
|
+
throw new Error("PM success transition digest mismatch");
|
|
196
|
+
return deepFreeze({
|
|
197
|
+
schema: value.schema,
|
|
198
|
+
manifestDigest: core.manifestDigest,
|
|
199
|
+
executionReceiptDigest: core.executionReceiptDigest,
|
|
200
|
+
graderReceiptDigest: core.graderReceiptDigest,
|
|
201
|
+
preRunSeal,
|
|
202
|
+
postRunSeal,
|
|
203
|
+
databaseChanged,
|
|
204
|
+
previousStateTransitionDigest: core.previousStateTransitionDigest,
|
|
205
|
+
stateTransitionDigest,
|
|
206
|
+
authenticated: false,
|
|
207
|
+
durable: false,
|
|
208
|
+
qualifiesForPromotion: false,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function failedTransition(value, expectedManifestDigest) {
|
|
213
|
+
exact(
|
|
214
|
+
value,
|
|
215
|
+
[
|
|
216
|
+
"schema",
|
|
217
|
+
"manifestDigest",
|
|
218
|
+
"preRunSeal",
|
|
219
|
+
"failureSeal",
|
|
220
|
+
"databaseIdentityUnchanged",
|
|
221
|
+
"databaseChanged",
|
|
222
|
+
"previousStateTransitionDigest",
|
|
223
|
+
"failureClass",
|
|
224
|
+
"authenticated",
|
|
225
|
+
"durable",
|
|
226
|
+
"qualifiesForPromotion",
|
|
227
|
+
"evidenceDigest",
|
|
228
|
+
],
|
|
229
|
+
"PM failed transition evidence",
|
|
230
|
+
);
|
|
231
|
+
if (
|
|
232
|
+
value.schema !== PM_EXPLORATION_FAILED_TRANSITION_SCHEMA ||
|
|
233
|
+
value.manifestDigest !== expectedManifestDigest ||
|
|
234
|
+
value.failureClass !== "execution-or-evidence-failed" ||
|
|
235
|
+
value.authenticated !== false ||
|
|
236
|
+
value.durable !== false ||
|
|
237
|
+
value.qualifiesForPromotion !== false
|
|
238
|
+
) {
|
|
239
|
+
throw new Error("PM failed transition evidence fields are invalid");
|
|
240
|
+
}
|
|
241
|
+
const preRunSeal = databaseSeal(value.preRunSeal, "PM pre-run seal");
|
|
242
|
+
const failureSeal =
|
|
243
|
+
value.failureSeal === null
|
|
244
|
+
? null
|
|
245
|
+
: databaseSeal(value.failureSeal, "PM failure seal");
|
|
246
|
+
const databaseIdentityUnchanged =
|
|
247
|
+
failureSeal === null
|
|
248
|
+
? null
|
|
249
|
+
: failureSeal.databasePathDigest === preRunSeal.databasePathDigest;
|
|
250
|
+
const databaseChanged =
|
|
251
|
+
failureSeal === null || !databaseIdentityUnchanged
|
|
252
|
+
? null
|
|
253
|
+
: failureSeal.databaseSnapshotDigest !==
|
|
254
|
+
preRunSeal.databaseSnapshotDigest;
|
|
255
|
+
if (
|
|
256
|
+
value.databaseIdentityUnchanged !== databaseIdentityUnchanged ||
|
|
257
|
+
value.databaseChanged !== databaseChanged
|
|
258
|
+
) {
|
|
259
|
+
throw new Error("PM failed transition database state is inconsistent");
|
|
260
|
+
}
|
|
261
|
+
const previousStateTransitionDigest = optionalDigest(
|
|
262
|
+
value.previousStateTransitionDigest,
|
|
263
|
+
"previousStateTransitionDigest",
|
|
264
|
+
);
|
|
265
|
+
const core = {
|
|
266
|
+
schema: value.schema,
|
|
267
|
+
manifestDigest: digest(value.manifestDigest, "manifestDigest"),
|
|
268
|
+
preRunSeal,
|
|
269
|
+
failureSeal,
|
|
270
|
+
databaseIdentityUnchanged,
|
|
271
|
+
databaseChanged,
|
|
272
|
+
previousStateTransitionDigest,
|
|
273
|
+
failureClass: value.failureClass,
|
|
274
|
+
authenticated: false,
|
|
275
|
+
durable: false,
|
|
276
|
+
qualifiesForPromotion: false,
|
|
277
|
+
};
|
|
278
|
+
const evidenceDigest = digest(value.evidenceDigest, "evidenceDigest");
|
|
279
|
+
if (
|
|
280
|
+
evidenceDigest !==
|
|
281
|
+
hash(PM_EXPLORATION_FAILED_TRANSITION_SCHEMA, core, false)
|
|
282
|
+
) {
|
|
283
|
+
throw new Error("PM failed transition evidence digest mismatch");
|
|
284
|
+
}
|
|
285
|
+
return deepFreeze({ ...core, evidenceDigest });
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export function verifyPmExplorationTransitionEvidence(
|
|
289
|
+
value,
|
|
290
|
+
expectedManifestDigest,
|
|
291
|
+
) {
|
|
292
|
+
const manifestDigest = digest(expectedManifestDigest, "manifestDigest");
|
|
293
|
+
if (
|
|
294
|
+
!value ||
|
|
295
|
+
typeof value !== "object" ||
|
|
296
|
+
Array.isArray(value) ||
|
|
297
|
+
isProxy(value)
|
|
298
|
+
) {
|
|
299
|
+
throw new TypeError("PM transition evidence must be a plain object");
|
|
300
|
+
}
|
|
301
|
+
const schema = Object.getOwnPropertyDescriptor(value, "schema");
|
|
302
|
+
if (!schema || !("value" in schema))
|
|
303
|
+
throw new TypeError("PM transition evidence schema must be plain data");
|
|
304
|
+
if (schema.value === PM_EXPLORATION_SUCCESS_TRANSITION_SCHEMA)
|
|
305
|
+
return successTransition(value, manifestDigest);
|
|
306
|
+
if (schema.value === PM_EXPLORATION_FAILED_TRANSITION_SCHEMA)
|
|
307
|
+
return failedTransition(value, manifestDigest);
|
|
308
|
+
throw new TypeError("PM transition evidence schema is invalid");
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function durabilityAck(value, binding) {
|
|
312
|
+
const snapshotBound = binding.recoverySnapshot !== null;
|
|
313
|
+
exact(
|
|
314
|
+
value,
|
|
315
|
+
snapshotBound
|
|
316
|
+
? [
|
|
317
|
+
"schema",
|
|
318
|
+
"authenticated",
|
|
319
|
+
"durable",
|
|
320
|
+
"readbackVerified",
|
|
321
|
+
"manifestDigest",
|
|
322
|
+
"evidenceDigest",
|
|
323
|
+
"transitionKind",
|
|
324
|
+
"recoverySnapshotAckDigest",
|
|
325
|
+
"ledgerEventDigest",
|
|
326
|
+
"durabilityReceiptDigest",
|
|
327
|
+
"qualifiesForPromotion",
|
|
328
|
+
]
|
|
329
|
+
: [
|
|
330
|
+
"schema",
|
|
331
|
+
"authenticated",
|
|
332
|
+
"durable",
|
|
333
|
+
"readbackVerified",
|
|
334
|
+
"manifestDigest",
|
|
335
|
+
"evidenceDigest",
|
|
336
|
+
"transitionKind",
|
|
337
|
+
"ledgerEventDigest",
|
|
338
|
+
"durabilityReceiptDigest",
|
|
339
|
+
"qualifiesForPromotion",
|
|
340
|
+
],
|
|
341
|
+
"PM transition durability acknowledgement",
|
|
342
|
+
);
|
|
343
|
+
if (
|
|
344
|
+
value.schema !==
|
|
345
|
+
(snapshotBound
|
|
346
|
+
? PM_EXPLORATION_SNAPSHOT_BOUND_TRANSITION_DURABILITY_ACK_SCHEMA
|
|
347
|
+
: PM_EXPLORATION_TRANSITION_DURABILITY_ACK_SCHEMA) ||
|
|
348
|
+
value.authenticated !== true ||
|
|
349
|
+
value.durable !== true ||
|
|
350
|
+
value.readbackVerified !== true ||
|
|
351
|
+
value.manifestDigest !== binding.manifestDigest ||
|
|
352
|
+
value.evidenceDigest !== binding.evidenceDigest ||
|
|
353
|
+
value.transitionKind !== binding.transitionKind ||
|
|
354
|
+
!DIGEST.test(value.ledgerEventDigest ?? "") ||
|
|
355
|
+
!DIGEST.test(value.durabilityReceiptDigest ?? "") ||
|
|
356
|
+
value.qualifiesForPromotion !== false
|
|
357
|
+
) {
|
|
358
|
+
throw new Error("PM transition durability acknowledgement is invalid");
|
|
359
|
+
}
|
|
360
|
+
if (
|
|
361
|
+
snapshotBound &&
|
|
362
|
+
value.recoverySnapshotAckDigest !==
|
|
363
|
+
binding.recoverySnapshot.snapshotAckDigest
|
|
364
|
+
) {
|
|
365
|
+
throw new Error(
|
|
366
|
+
"PM transition durability acknowledgement snapshot binding is invalid",
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
return deepFreeze({ ...value });
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function transitionRecovery(value, expectedManifestDigest) {
|
|
373
|
+
exact(
|
|
374
|
+
value,
|
|
375
|
+
[
|
|
376
|
+
"schema",
|
|
377
|
+
"authenticated",
|
|
378
|
+
"durable",
|
|
379
|
+
"readbackVerified",
|
|
380
|
+
"manifestDigest",
|
|
381
|
+
"revision",
|
|
382
|
+
"transitionKind",
|
|
383
|
+
"evidenceDigest",
|
|
384
|
+
"evidence",
|
|
385
|
+
"ledgerHeadDigest",
|
|
386
|
+
"ledgerEventDigest",
|
|
387
|
+
"durabilityReceiptDigest",
|
|
388
|
+
"qualifiesForPromotion",
|
|
389
|
+
],
|
|
390
|
+
"PM transition recovery",
|
|
391
|
+
);
|
|
392
|
+
if (
|
|
393
|
+
value.schema !== PM_EXPLORATION_TRANSITION_RECOVERY_SCHEMA ||
|
|
394
|
+
value.authenticated !== true ||
|
|
395
|
+
value.durable !== true ||
|
|
396
|
+
value.readbackVerified !== true ||
|
|
397
|
+
value.manifestDigest !== expectedManifestDigest ||
|
|
398
|
+
!Number.isSafeInteger(value.revision) ||
|
|
399
|
+
value.revision < 0 ||
|
|
400
|
+
![null, "success", "failure"].includes(value.transitionKind) ||
|
|
401
|
+
!DIGEST.test(value.ledgerHeadDigest ?? "") ||
|
|
402
|
+
value.qualifiesForPromotion !== false
|
|
403
|
+
) {
|
|
404
|
+
throw new Error("PM transition recovery is invalid");
|
|
405
|
+
}
|
|
406
|
+
if (value.transitionKind === null) {
|
|
407
|
+
if (
|
|
408
|
+
value.revision !== 0 ||
|
|
409
|
+
value.evidenceDigest !== null ||
|
|
410
|
+
value.evidence !== null ||
|
|
411
|
+
value.ledgerEventDigest !== null ||
|
|
412
|
+
value.durabilityReceiptDigest !== null
|
|
413
|
+
) {
|
|
414
|
+
throw new Error("empty PM transition recovery is inconsistent");
|
|
415
|
+
}
|
|
416
|
+
return deepFreeze({ ...value });
|
|
417
|
+
}
|
|
418
|
+
if (
|
|
419
|
+
value.revision < 1 ||
|
|
420
|
+
!DIGEST.test(value.evidenceDigest ?? "") ||
|
|
421
|
+
!DIGEST.test(value.ledgerEventDigest ?? "") ||
|
|
422
|
+
!DIGEST.test(value.durabilityReceiptDigest ?? "")
|
|
423
|
+
) {
|
|
424
|
+
throw new Error("PM transition recovery evidence is incomplete");
|
|
425
|
+
}
|
|
426
|
+
const evidence = verifyPmExplorationTransitionEvidence(
|
|
427
|
+
value.evidence,
|
|
428
|
+
expectedManifestDigest,
|
|
429
|
+
);
|
|
430
|
+
const transitionKind =
|
|
431
|
+
evidence.schema === PM_EXPLORATION_SUCCESS_TRANSITION_SCHEMA
|
|
432
|
+
? "success"
|
|
433
|
+
: "failure";
|
|
434
|
+
const evidenceDigest =
|
|
435
|
+
transitionKind === "success"
|
|
436
|
+
? evidence.stateTransitionDigest
|
|
437
|
+
: evidence.evidenceDigest;
|
|
438
|
+
if (
|
|
439
|
+
value.transitionKind !== transitionKind ||
|
|
440
|
+
value.evidenceDigest !== evidenceDigest
|
|
441
|
+
) {
|
|
442
|
+
throw new Error("PM transition recovery evidence binding is invalid");
|
|
443
|
+
}
|
|
444
|
+
return deepFreeze({ ...value, evidence });
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export function createPmExplorationTransitionCommitter(input = {}) {
|
|
448
|
+
const inspectableInput =
|
|
449
|
+
input &&
|
|
450
|
+
typeof input === "object" &&
|
|
451
|
+
!Array.isArray(input) &&
|
|
452
|
+
!isProxy(input) &&
|
|
453
|
+
Object.getPrototypeOf(input) === Object.prototype;
|
|
454
|
+
const recoverDescriptor = inspectableInput
|
|
455
|
+
? Object.getOwnPropertyDescriptor(input, "recover")
|
|
456
|
+
: null;
|
|
457
|
+
exact(
|
|
458
|
+
input,
|
|
459
|
+
recoverDescriptor
|
|
460
|
+
? ["manifestDigest", "commit", "recover"]
|
|
461
|
+
: ["manifestDigest", "commit"],
|
|
462
|
+
"PM transition committer input",
|
|
463
|
+
);
|
|
464
|
+
const expectedManifestDigest = digest(input.manifestDigest, "manifestDigest");
|
|
465
|
+
if (typeof input.commit !== "function" || isProxy(input.commit))
|
|
466
|
+
throw new TypeError("PM transition commit must be a direct function");
|
|
467
|
+
if (
|
|
468
|
+
recoverDescriptor &&
|
|
469
|
+
(typeof input.recover !== "function" || isProxy(input.recover))
|
|
470
|
+
) {
|
|
471
|
+
throw new TypeError("PM transition recovery must be a direct function");
|
|
472
|
+
}
|
|
473
|
+
const committer = Object.freeze({});
|
|
474
|
+
COMMITTERS.set(
|
|
475
|
+
committer,
|
|
476
|
+
Object.freeze({
|
|
477
|
+
manifestDigest: expectedManifestDigest,
|
|
478
|
+
commit: input.commit,
|
|
479
|
+
recover: recoverDescriptor ? input.recover : null,
|
|
480
|
+
}),
|
|
481
|
+
);
|
|
482
|
+
return committer;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export function capturePmExplorationTransitionCommitter(value) {
|
|
486
|
+
const captured = COMMITTERS.get(value);
|
|
487
|
+
if (!captured)
|
|
488
|
+
throw new TypeError("a branded PM transition committer is required");
|
|
489
|
+
return Object.freeze({
|
|
490
|
+
manifestDigest: captured.manifestDigest,
|
|
491
|
+
commitTransition: async (input, recoverySnapshotInput = null) => {
|
|
492
|
+
const evidence = verifyPmExplorationTransitionEvidence(
|
|
493
|
+
input,
|
|
494
|
+
captured.manifestDigest,
|
|
495
|
+
);
|
|
496
|
+
const transitionKind =
|
|
497
|
+
evidence.schema === PM_EXPLORATION_SUCCESS_TRANSITION_SCHEMA
|
|
498
|
+
? "success"
|
|
499
|
+
: "failure";
|
|
500
|
+
const evidenceDigest =
|
|
501
|
+
transitionKind === "success"
|
|
502
|
+
? evidence.stateTransitionDigest
|
|
503
|
+
: evidence.evidenceDigest;
|
|
504
|
+
const recoverySnapshot =
|
|
505
|
+
recoverySnapshotInput === null
|
|
506
|
+
? null
|
|
507
|
+
: verifyPmExplorationRecoverySnapshotAck(recoverySnapshotInput, {
|
|
508
|
+
manifestDigest: captured.manifestDigest,
|
|
509
|
+
transitionKind,
|
|
510
|
+
evidenceDigest,
|
|
511
|
+
sealDigest:
|
|
512
|
+
transitionKind === "success"
|
|
513
|
+
? evidence.postRunSeal.sealDigest
|
|
514
|
+
: evidence.preRunSeal.sealDigest,
|
|
515
|
+
});
|
|
516
|
+
const acknowledgement = await Reflect.apply(captured.commit, undefined, [
|
|
517
|
+
evidence,
|
|
518
|
+
...(recoverySnapshot === null ? [] : [recoverySnapshot]),
|
|
519
|
+
]);
|
|
520
|
+
return durabilityAck(acknowledgement, {
|
|
521
|
+
manifestDigest: captured.manifestDigest,
|
|
522
|
+
evidenceDigest,
|
|
523
|
+
transitionKind,
|
|
524
|
+
recoverySnapshot,
|
|
525
|
+
});
|
|
526
|
+
},
|
|
527
|
+
recoverTransition:
|
|
528
|
+
captured.recover === null
|
|
529
|
+
? null
|
|
530
|
+
: async () => {
|
|
531
|
+
const request = Object.freeze({
|
|
532
|
+
schema: PM_EXPLORATION_TRANSITION_RECOVERY_REQUEST_SCHEMA,
|
|
533
|
+
manifestDigest: captured.manifestDigest,
|
|
534
|
+
});
|
|
535
|
+
const recovered = await Reflect.apply(captured.recover, undefined, [
|
|
536
|
+
request,
|
|
537
|
+
]);
|
|
538
|
+
return transitionRecovery(recovered, captured.manifestDigest);
|
|
539
|
+
},
|
|
540
|
+
});
|
|
541
|
+
}
|