chainlesschain 0.166.62 → 0.166.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +38 -8
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/assets/{AIOps-BqoRiuXE.js → AIOps-CfPrpABR.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BwBhyFIm.js → ActionButton-Bkv1erki.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DTW03Emb.js → Analytics-fY_7epoU.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CI-wxMLQ.js → AppLayout-DegaN-aa.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-DVqbM3iE.js → Artifacts-90-UNTVE.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DulhOs16.js → Audit-BRQ1F4sA.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DnRs67e8.js → BackgroundAgents-Cb85uP7O.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-BFEZo0vX.js → Backup-CrLBSWQK.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-D185sBnp.js → BaseInput-DditUW5B.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DUvP-2SK.js → Chat-0XozleDQ.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-u9WKQbZb.js → ChatBubbleRenderer-8QXBJvgy.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-D8Zh_18b.js → Checkbox-C2Ck_3ju.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-WdiWRdfC.js → Codegen-Chjw-MS7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CnSoVpw6.js → Col-B_w8_Oka.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BJDHgBkw.js → Community-XAqxPnXq.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-uNRdmBaq.js → Compact-BX_3GJ3m.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-_6jRTJa3.js → Compliance-DE3kIC9z.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-D5lnbXR6.js → Cowork-DPBYp1ey.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-D6tuGBVg.js → Cron-D9cknqzn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-Ce5e9Lbm.js → Crosschain-BzHrGWY9.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-1VVKZ_c1.js → DID-BuD8TkZl.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DuHcZ13w.js → Dashboard-BbxMuZVK.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BC3EK0wN.js → Dropdown-jq0ki-tE.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DzLpGs5E.js → EmailListRenderer-RiMvINxT.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-x2XZHG0Z.js → EvolutionSettings-DE-URi9i.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-nAavV50Y.js → FamilyGuardDashboard-DV3ao62-.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CCHWVS5J.js → Federation-BF6BmBPg.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CGod_3Ni.js → FormItemContext-CKTX59j2.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DIFYQa2f.js → GenericCardRenderer-DZkH-CTs.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DikM1Nc5.js → Git-B5JYb-w-.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-SzzBXCDX.js → Governance-D3WfDZ6W.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-wVsu9QzM.js → Inference-DoSvfDUk.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DDpVxfO-.js → KnowledgeGraph-DUDIzN97.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BnIjS-2Z.js → Logs-JfJerfFD.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-DXgA7cZm.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Cj3PLhXV.js → Marketplace-BpVrOM_V.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DMKO55Kz.js → McpTools-CFnQdiSv.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-wWJl5yJL.js → Memory-Dxv81cNl.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-CJ_VIPgJ.js → MobileBridge-C92eX7PB.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CiJT5cF8.js → MobileProjects-BUHw7Wox.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BXmndm9a.js → Mtc-D-G9H4A1.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-C3hWIAnz.js → MtcAudit-CAEaEtAz.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DU4OUQ7u.js → Multisig-Cx_-X9HD.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CyAwOeU5.js → NLProgramming-DRIKG4Xy.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes--YvcAg13.js → Notes-CmL0vKUv.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Dyu6dC0D.js → NotificationSettings-D2cQ5aQn.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Df-0iTO2.js → OrderTableRenderer-CPfd7PNy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-a9Em4Sgu.js → Organization-EKqO46hz.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-CCQtvcsw.js → Overflow-BOHjBwJo.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P--CaB5e38.js → P2P-Dx4LdCE0.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CmfHjoJG.js → PdhVaultBrowser-CgCt2xdT.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-BCDjNsXi.js → Permissions-DWjDeO7O.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-ByprqCJd.js → PersonalDataHub-Bx4Od8pG.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-CZRZq-P0.js → Pipeline-oKxws_Ch.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CeDay_dV.js → Privacy-Df1HVRKR.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CgpIfRAZ.js → ProjectInit-BraLwZT4.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CU8iakEs.js → ProjectSettings-CKru54M0.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-pPM0KRfQ.js → Projects-BEr7cJcS.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BfpxsZh1.js → Providers-C8v30DU3.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Dmv3rax1.js → QrScannerModal-CPyNV-O5.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DBOtB5wd.js → QuickAsk-BLIew7A5.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-C_KnHRvS.js → Recommend-DVjWmsPs.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-OIO9kT7D.js → RemoteSession-B4PNTaEf.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-BCfNIBt3.js → Reputation-D5HOV6oI.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-pnhw7dyj.js → Row-DgCQom2M.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-CLJ1A3FF.js → RssFeed-zvIcGHgz.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-CSQzJ3gj.js → Search-C-KbJP_z.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CS_mvkaE.js → Security-CasnI-Ld.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DBqA2Csq.js → Services-CR-pSlFv.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-BjR3_iWH.js → Skeleton-BB5On1b5.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DwGIXRJS.js → Skills-CC-wdQi-.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DwiHHJtJ.js → Sla-CPX5QKEu.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-QYN_t0CS.js → SpeechSettings-Bifkl6Zz.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DcXA1Jp3.js → SyncSettings-CdUVeB-S.js} +2 -2
  77. package/src/assets/web-panel/assets/Tasks-BttwN3fs.js +1 -0
  78. package/src/assets/web-panel/assets/{Templates-C6MTuLXU.js → Templates-CBHNbpQ7.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DmbdMB2D.js → Tenant-B90lEwSQ.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-DYeXnE4A.js → Terminal-u8KqitsA.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BrwLhsSE.js → TimelineRenderer-CnEJMkJo.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-C5kKpRWj.js → Tokens-CTM2OOJ_.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C4Zyg1jj.js → Trigger-Ca8NmmgU.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D0mrY3kY.js → Trust-CI9GpUj2.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Bq5NMLLb.js → UkeySign-BlMLGqKK.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-OObS6euz.js → VideoEditing-C8yCZrH0.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-Die77ZAO.js → Wallet-BpuYrz8o.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DFpqn0WO.js → WebAuthn-DFpNfLG_.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BgKZiece.js → WorkflowEditor-BWhLoeU4.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CbWtbRmr.js → chat-Dwo4LC7E.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Zu_TgmpG.js → colors-DkdGvKBf.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-BqABAwA_.js → compact-item-1gI0lfs3.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DR6r1ykz.js → createContext-O9iHirtr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-axBqv361.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-BNnYbjOt.js → hasIn-DY1jo9BQ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BbHnxChr.js → index-1AnBwAoM.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-P-0rrwu0.js → index-B-kbagPi.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DxloCIDQ.js → index-B0TX-bLV.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-uwS83tsv.js → index-B5l7eb6E.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DuCixW1o.js → index-BDwV_V5g.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BtQDpNFU.js → index-BgHG4f2K.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DEdqCQKQ.js → index-BgVO1aXv.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Ct4xnx2r.js → index-Bl6GfsQZ.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-ys7--3Ab.js → index-BmAK4o9I.js} +1 -1
  105. package/src/assets/web-panel/assets/{index--1t0mcMh.js → index-BsQkwBu2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BQHn6m4S.js → index-BumRAO-7.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BvQB-LK5.js → index-Bx4MNNMY.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-GrGT2dft.js → index-C4c0XaiT.js} +1 -1
  109. package/src/assets/web-panel/assets/index-CAsOttsq.js +1 -0
  110. package/src/assets/web-panel/assets/{index-BQ1WFS4G.js → index-CBqSTwY9.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CbJgVaoQ.js → index-D8fqsTHW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D08ytPR_.js → index-DCqPIE3G.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CkBDWART.js → index-DNnaEzC5.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CSNMSJAt.js → index-DTppQua6.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DiaPl_6F.js → index-DfFzjnA0.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DaKziwj_.js → index-DskEFn8M.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CVgcq0cJ.js → index-DvRvwzc-.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CuYLjMxX.js → index-DwBcFhcc.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CR4uB9Mt.js → index-DwJBbK3Z.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CpmSx_mp.js → index-DwhJqZqM.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-n62j7dTt.js → index-Dx51Am-0.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B9qA3lcI.js → index-E5Ar6dNV.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BCyrVLzm.js → index-ETHEhWvI.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CO9hQ7ri.js → index-KUrBWzIM.js} +1 -1
  125. package/src/assets/web-panel/assets/index-MgEKheCh.js +1 -0
  126. package/src/assets/web-panel/assets/{index-55eCb40A.js → index-YnGvCu0P.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-CYgH1j85.js → index-hRtVittm.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-C912Wlyi.js → index-nXoV4OCZ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-rS1lj7A9.js → index-qUbrqzvO.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-hZ41pakD.js → index-rIJqtLz-.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CmGll9ri.js → index-rkkMl4Lb.js} +1 -1
  132. package/src/assets/web-panel/assets/{index--vigBXnN.js → index-tXjOuLZm.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-fvl4dSWm.js → index-zLOzCcxM.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-hWckjvz-.js → index-zPpssHXA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-BEtGYjIT.js → initDefaultProps-Du5HHTVt.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-Cvnft4fL.js → motion-D9mAVPKP.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-CdxE_5Yl.js → move-DPO_sFtt.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CS0l6IJn.js → mtc-parser-CnezVcXi.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Bnji87sb.js → omit-DNpYMbet.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-BYdnEgN3.js → pickAttrs-BUFm_slL.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DYYd524z.js → placementArrow-DvwJtnzY.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BbIJIkXp.js → responsiveObserve-CUWOh_KI.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BSvuvfUS.js → slide-bVHCUsdj.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DeLSt3js.js → statusUtils-FlOzOrxf.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-DpJTPfyI.js → styleChecker-C6CFXutA.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-S7WdFQMU.js → useFlexGapSupport-BNGqO_E0.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CkfCBy52.js → useFs-DyKOrA27.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CA48p8Gt.js → usePersonalDataHub-DZAqeMAJ.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-C9D1tq_L.js → vnode-Do7fVasi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-B0TG7YQI.js → zoom-DYkEmOT2.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +13 -0
  153. package/src/lib/evolution/evolution-artifact-ports.js +3 -0
  154. package/src/lib/evolution/evolution-deployment-loader.js +125 -9
  155. package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
  156. package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
  157. package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
  158. package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
  159. package/src/lib/evolution/pm-exploration-ledger-adapter.js +210 -22
  160. package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
  161. package/src/lib/evolution/pm-exploration-receipts.js +626 -0
  162. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
  163. package/src/lib/evolution/pm-exploration-rounds.js +12 -2
  164. package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
  165. package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
  166. package/src/assets/web-panel/assets/MarkdownRenderer-3AsRzie6.js +0 -1
  167. package/src/assets/web-panel/assets/Tasks-DwWqvoyB.js +0 -1
  168. package/src/assets/web-panel/assets/devWarning-CmMzSuk5.js +0 -1
  169. package/src/assets/web-panel/assets/index-Dw-oPGSM.js +0 -1
  170. package/src/assets/web-panel/assets/index-OXemaG8f.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
+ }