chainlesschain 0.166.62 → 0.166.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/README.md +54 -8
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/assets/{AIOps-BqoRiuXE.js → AIOps-BFbLDWTF.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BwBhyFIm.js → ActionButton-CAHMtgNB.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DTW03Emb.js → Analytics-CkrSj0oR.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CI-wxMLQ.js → AppLayout-BTb0Ws1l.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-DVqbM3iE.js → Artifacts-C2Pgepj-.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DulhOs16.js → Audit-ZweyxXW8.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DnRs67e8.js → BackgroundAgents-BS8tAnzP.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-BFEZo0vX.js → Backup-CLkG_74M.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-D185sBnp.js → BaseInput-MIfNcdUZ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DUvP-2SK.js → Chat-DBwqlWWr.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-u9WKQbZb.js → ChatBubbleRenderer-6T0uoJuS.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-D8Zh_18b.js → Checkbox-DdBYhlVX.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-WdiWRdfC.js → Codegen-BR6MhiDo.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CnSoVpw6.js → Col-yO-5EbbM.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BJDHgBkw.js → Community-B608q_m7.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-uNRdmBaq.js → Compact-BmVHi7Z7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-_6jRTJa3.js → Compliance-BQ-DzutA.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-D5lnbXR6.js → Cowork-BEfLyXvi.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-D6tuGBVg.js → Cron-Cld6NX-_.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-Ce5e9Lbm.js → Crosschain-CUA3nDId.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-1VVKZ_c1.js → DID-DSI3E9zv.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DuHcZ13w.js → Dashboard-CoWtEdhO.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BC3EK0wN.js → Dropdown-CGhZ1Dyy.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DzLpGs5E.js → EmailListRenderer-BHZe2K5q.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-x2XZHG0Z.js → EvolutionSettings-Corjo98k.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-nAavV50Y.js → FamilyGuardDashboard-dPSWF3Pt.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CCHWVS5J.js → Federation-DT-Zr78c.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CGod_3Ni.js → FormItemContext-CzKq63B0.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DIFYQa2f.js → GenericCardRenderer-CDkKrmu0.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DikM1Nc5.js → Git-BrwRnLOv.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-SzzBXCDX.js → Governance-C4PtCzod.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-wVsu9QzM.js → Inference-CVPv5nwa.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DDpVxfO-.js → KnowledgeGraph-CmT9lvED.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BnIjS-2Z.js → Logs-DaRgv7pL.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-3AsRzie6.js → MarkdownRenderer-B3zZwlSz.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-Cj3PLhXV.js → Marketplace-Bm0GGEaL.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DMKO55Kz.js → McpTools-71L5h0en.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-wWJl5yJL.js → Memory-BoWrfASi.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-CJ_VIPgJ.js → MobileBridge-Dp4FcX_-.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CiJT5cF8.js → MobileProjects-00ja0Z7O.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BXmndm9a.js → Mtc-BZF6YNYp.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-C3hWIAnz.js → MtcAudit-Bp_vcI6H.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DU4OUQ7u.js → Multisig-CnCo56CS.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CyAwOeU5.js → NLProgramming-BCSzNHpv.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes--YvcAg13.js → Notes-kXoQk8B7.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Dyu6dC0D.js → NotificationSettings-oN-1fkcy.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Df-0iTO2.js → OrderTableRenderer-5ZVHrVZ9.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-a9Em4Sgu.js → Organization-D4_T9Tdc.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-CCQtvcsw.js → Overflow-d8vZwo9w.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P--CaB5e38.js → P2P-0HGUdmTv.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CmfHjoJG.js → PdhVaultBrowser-Cx8vp92z.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-BCDjNsXi.js → Permissions-XHd6pVQB.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-ByprqCJd.js → PersonalDataHub-CB5bZU9T.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-CZRZq-P0.js → Pipeline-Dy_qx4-0.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CeDay_dV.js → Privacy-BgR0-uEu.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CgpIfRAZ.js → ProjectInit-DAcRi1Nx.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CU8iakEs.js → ProjectSettings-Bd1Q0rK_.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-pPM0KRfQ.js → Projects-DVc9DcbM.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BfpxsZh1.js → Providers-C3c4QfUT.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Dmv3rax1.js → QrScannerModal-Ba_GbitW.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DBOtB5wd.js → QuickAsk-CSn5tIkO.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-C_KnHRvS.js → Recommend-B3-8PLX0.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-OIO9kT7D.js → RemoteSession-Bd_7Zmi-.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-BCfNIBt3.js → Reputation-BU2A_wy5.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-pnhw7dyj.js → Row-I0JFMjCz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-CLJ1A3FF.js → RssFeed-CNc4Dgfz.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-CSQzJ3gj.js → Search-uAA6ceLl.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CS_mvkaE.js → Security-U1SWj5nP.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DBqA2Csq.js → Services-BFjZ5ASY.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-BjR3_iWH.js → Skeleton-B8InBvQf.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DwGIXRJS.js → Skills-BDYwf3QV.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DwiHHJtJ.js → Sla-Dcc6iq3q.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-QYN_t0CS.js → SpeechSettings-C3Ta-mC9.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DcXA1Jp3.js → SyncSettings-BNHEYO95.js} +2 -2
  77. package/src/assets/web-panel/assets/Tasks-JbV6L1FX.js +1 -0
  78. package/src/assets/web-panel/assets/{Templates-C6MTuLXU.js → Templates-Yp0CUTBz.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DmbdMB2D.js → Tenant-CToNYxCo.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-DYeXnE4A.js → Terminal-D7W9UqSD.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BrwLhsSE.js → TimelineRenderer-B7rqc1kE.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-C5kKpRWj.js → Tokens-QP7K4ppA.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C4Zyg1jj.js → Trigger-CAWowQCR.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D0mrY3kY.js → Trust-B-0XOP97.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Bq5NMLLb.js → UkeySign-BtiZbiuj.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-OObS6euz.js → VideoEditing-Dee11JI0.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-Die77ZAO.js → Wallet-y7qOmaWY.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DFpqn0WO.js → WebAuthn-CjyRRWGK.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BgKZiece.js → WorkflowEditor-D7Kiz25Q.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CbWtbRmr.js → chat-4F_yB-Gw.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Zu_TgmpG.js → colors-CrczPd-t.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-BqABAwA_.js → compact-item-AenPL6fz.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DR6r1ykz.js → createContext-BcwoqPgi.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-C4qWsAvh.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-BNnYbjOt.js → hasIn-YouHmap8.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BQHn6m4S.js → index--xwN0ZvG.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DxloCIDQ.js → index-31dhJpt3.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CuYLjMxX.js → index-4r7B8sTx.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-hZ41pakD.js → index-5GHNjmnt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index--vigBXnN.js → index-B5Vmr0CM.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CpmSx_mp.js → index-B8EXHVmM.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BQ1WFS4G.js → index-BHA5Fyjc.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-ys7--3Ab.js → index-B_I1INkw.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CO9hQ7ri.js → index-BaguGDJP.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DaKziwj_.js → index-BoVeUGhC.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DiaPl_6F.js → index-BsGhFk79.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DEdqCQKQ.js → index-BwUqDg9_.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-hWckjvz-.js → index-BzyDSW_e.js} +1 -1
  109. package/src/assets/web-panel/assets/index-C-ltOW-O.js +1 -0
  110. package/src/assets/web-panel/assets/{index-P-0rrwu0.js → index-C5hpEYbx.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CVgcq0cJ.js → index-CHNKoexH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-rS1lj7A9.js → index-COgeZETv.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Ct4xnx2r.js → index-CWgIKCVS.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CYgH1j85.js → index-CZ9Ikuo6.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BtQDpNFU.js → index-CZT-LLGS.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B9qA3lcI.js → index-CedvtJA_.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DuCixW1o.js → index-D0dXNgvi.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-55eCb40A.js → index-D5Rvq67L.js} +3 -3
  119. package/src/assets/web-panel/assets/index-D7Ir0TiS.js +1 -0
  120. package/src/assets/web-panel/assets/{index-fvl4dSWm.js → index-D7m5Z4We.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-D08ytPR_.js → index-D8a1AEVK.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CbJgVaoQ.js → index-DAGfuEUu.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-n62j7dTt.js → index-DAh5KwVL.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BCyrVLzm.js → index-DE3qPp9l.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C912Wlyi.js → index-DNHmbdGm.js} +1 -1
  126. package/src/assets/web-panel/assets/{index--1t0mcMh.js → index-DPrzFdCg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-uwS83tsv.js → index-DVrgnhfu.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CR4uB9Mt.js → index-D_4VsL-L.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BvQB-LK5.js → index-Dfw3WyZU.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BbHnxChr.js → index-GP5u18DV.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CkBDWART.js → index-YX4dcbgh.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CSNMSJAt.js → index-fCuM1NPH.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-GrGT2dft.js → index-gy1H_PJk.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CmGll9ri.js → index-q_9aqSgF.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-BEtGYjIT.js → initDefaultProps-Ci6zc6ZA.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-Cvnft4fL.js → motion-DS3kjIxw.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-CdxE_5Yl.js → move-DCdWAKk4.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CS0l6IJn.js → mtc-parser-B0Wfce9U.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Bnji87sb.js → omit-Clx9TR6z.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-BYdnEgN3.js → pickAttrs-CqSiqUvN.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DYYd524z.js → placementArrow-BWe_v-40.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BbIJIkXp.js → responsiveObserve-BSJ68bw6.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BSvuvfUS.js → slide-VRPlLxZB.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DeLSt3js.js → statusUtils-BFBVDPdB.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-DpJTPfyI.js → styleChecker-CehOXy1f.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-S7WdFQMU.js → useFlexGapSupport-BCOdfK18.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CkfCBy52.js → useFs-BMKrjfJQ.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CA48p8Gt.js → usePersonalDataHub-BIjZ7IgI.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-C9D1tq_L.js → vnode-oD0MXddQ.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-B0TG7YQI.js → zoom-D7WqH2Ai.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +26 -0
  153. package/src/lib/evolution/evolution-artifact-ports.js +3 -0
  154. package/src/lib/evolution/evolution-deployment-loader.js +125 -9
  155. package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
  156. package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
  157. package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
  158. package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
  159. package/src/lib/evolution/pm-exploration-ledger-adapter.js +210 -22
  160. package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
  161. package/src/lib/evolution/pm-exploration-receipts.js +626 -0
  162. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
  163. package/src/lib/evolution/pm-exploration-rounds.js +12 -2
  164. package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
  165. package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
  166. package/src/lib/read-file-loop-guard.js +13 -7
  167. package/src/lib/task-progress-tracker.js +1 -1
  168. package/src/runtime/agent-core.js +14 -7
  169. package/src/assets/web-panel/assets/Tasks-DwWqvoyB.js +0 -1
  170. package/src/assets/web-panel/assets/devWarning-CmMzSuk5.js +0 -1
  171. package/src/assets/web-panel/assets/index-Dw-oPGSM.js +0 -1
  172. package/src/assets/web-panel/assets/index-OXemaG8f.js +0 -1
@@ -0,0 +1,521 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isPromise, isProxy, isUint8Array } from "node:util/types";
3
+
4
+ import {
5
+ EVOLUTION_ARTIFACT_DURABILITY_BINDING_SCHEMA,
6
+ EVOLUTION_ARTIFACT_DURABILITY_RECEIPT_SCHEMA,
7
+ EVOLUTION_ARTIFACT_DURABILITY_RESOLUTION_SCHEMA,
8
+ EVOLUTION_ARTIFACT_DURABILITY_RESOLVE_REQUEST_SCHEMA,
9
+ EVOLUTION_ARTIFACT_DURABILITY_RETAIN_REQUEST_SCHEMA,
10
+ } from "./evolution-ledger-ports.js";
11
+
12
+ export const PM_EXPLORATION_RECOVERY_SNAPSHOT_REQUEST_SCHEMA =
13
+ "chainlesschain.pm-exploration-recovery-snapshot-request/v1";
14
+ export const PM_EXPLORATION_RECOVERY_SNAPSHOT_ACK_SCHEMA =
15
+ "chainlesschain.pm-exploration-recovery-snapshot-ack/v1";
16
+ export const PM_EXPLORATION_RECOVERY_SNAPSHOT_CORRUPT_CODE =
17
+ "CC_PM_RECOVERY_SNAPSHOT_CORRUPT";
18
+
19
+ const DATABASE_SEAL_SCHEMA =
20
+ "chainlesschain.desktop-pm-database-pre-run-seal/v1";
21
+ const DATABASE_SNAPSHOT_DOMAIN =
22
+ "chainlesschain.desktop-pm-database-snapshot/v1";
23
+ const SNAPSHOT_TYPE = "pm-exploration-database-recovery-snapshot";
24
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
25
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
26
+ const MAX_SNAPSHOT_BYTES = 8 * 1024 * 1024 * 1024;
27
+ const STORES = new WeakMap();
28
+
29
+ function canonical(value) {
30
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
31
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
32
+ return `{${Object.keys(value)
33
+ .sort()
34
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
35
+ .join(",")}}`;
36
+ }
37
+
38
+ function hash(domain, value) {
39
+ return `sha256:${createHash("sha256")
40
+ .update(domain)
41
+ .update("\0")
42
+ .update(canonical(value))
43
+ .digest("hex")}`;
44
+ }
45
+
46
+ function hashBytes(value, domain = null) {
47
+ const hasher = createHash("sha256");
48
+ if (domain !== null) hasher.update(domain).update("\0");
49
+ return `sha256:${hasher.update(value).digest("hex")}`;
50
+ }
51
+
52
+ function exact(value, keys, label) {
53
+ if (
54
+ !value ||
55
+ typeof value !== "object" ||
56
+ Array.isArray(value) ||
57
+ isProxy(value) ||
58
+ Object.getPrototypeOf(value) !== Object.prototype
59
+ ) {
60
+ throw new TypeError(`${label} must be a plain object`);
61
+ }
62
+ const actual = Reflect.ownKeys(value);
63
+ if (
64
+ actual.length !== keys.length ||
65
+ actual.some((key) => {
66
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
67
+ return (
68
+ typeof key !== "string" ||
69
+ !keys.includes(key) ||
70
+ !descriptor ||
71
+ !descriptor.enumerable ||
72
+ !("value" in descriptor)
73
+ );
74
+ })
75
+ ) {
76
+ throw new TypeError(`${label} has unexpected or accessor fields`);
77
+ }
78
+ }
79
+
80
+ function digest(value, label) {
81
+ if (typeof value !== "string" || !DIGEST.test(value))
82
+ throw new TypeError(`${label} must be a sha256 digest`);
83
+ return value;
84
+ }
85
+
86
+ function identifier(value, label) {
87
+ if (typeof value !== "string" || !ID.test(value))
88
+ throw new TypeError(`${label} is invalid`);
89
+ return value;
90
+ }
91
+
92
+ function corrupt(message, options) {
93
+ const error = new Error(message, options);
94
+ error.code = PM_EXPLORATION_RECOVERY_SNAPSHOT_CORRUPT_CODE;
95
+ throw error;
96
+ }
97
+
98
+ function deepFreeze(value, seen = new WeakSet()) {
99
+ if (!value || typeof value !== "object" || seen.has(value)) return value;
100
+ seen.add(value);
101
+ for (const key of Reflect.ownKeys(value)) {
102
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
103
+ if (descriptor && "value" in descriptor) deepFreeze(descriptor.value, seen);
104
+ }
105
+ return Object.freeze(value);
106
+ }
107
+
108
+ function databaseSeal(value) {
109
+ exact(
110
+ value,
111
+ [
112
+ "schema",
113
+ "databasePathDigest",
114
+ "databaseSnapshotDigest",
115
+ "databaseSnapshotBytes",
116
+ "snapshotMethod",
117
+ "sealDigest",
118
+ ],
119
+ "PM recovery database seal",
120
+ );
121
+ if (
122
+ value.schema !== DATABASE_SEAL_SCHEMA ||
123
+ value.snapshotMethod !== "database-manager-backup" ||
124
+ !Number.isSafeInteger(value.databaseSnapshotBytes) ||
125
+ value.databaseSnapshotBytes < 1 ||
126
+ value.databaseSnapshotBytes > MAX_SNAPSHOT_BYTES
127
+ ) {
128
+ throw new TypeError("PM recovery database seal is invalid");
129
+ }
130
+ const core = {
131
+ schema: value.schema,
132
+ databasePathDigest: digest(value.databasePathDigest, "databasePathDigest"),
133
+ databaseSnapshotDigest: digest(
134
+ value.databaseSnapshotDigest,
135
+ "databaseSnapshotDigest",
136
+ ),
137
+ databaseSnapshotBytes: value.databaseSnapshotBytes,
138
+ snapshotMethod: value.snapshotMethod,
139
+ };
140
+ const seal = deepFreeze({
141
+ ...core,
142
+ sealDigest: digest(value.sealDigest, "sealDigest"),
143
+ });
144
+ if (seal.sealDigest !== hash(DATABASE_SEAL_SCHEMA, core))
145
+ throw new Error("PM recovery database seal digest mismatch");
146
+ return seal;
147
+ }
148
+
149
+ function snapshotBytes(value) {
150
+ if (
151
+ !value ||
152
+ typeof value !== "object" ||
153
+ isProxy(value) ||
154
+ !(
155
+ (Buffer.isBuffer(value) &&
156
+ Object.getPrototypeOf(value) === Buffer.prototype) ||
157
+ (isUint8Array(value) &&
158
+ Object.getPrototypeOf(value) === Uint8Array.prototype)
159
+ )
160
+ ) {
161
+ throw new TypeError("PM recovery snapshot bytes are invalid");
162
+ }
163
+ if (value.byteLength < 1 || value.byteLength > MAX_SNAPSHOT_BYTES)
164
+ throw new TypeError("PM recovery snapshot bytes exceed the allowed range");
165
+ return Buffer.from(value);
166
+ }
167
+
168
+ function captureAuthority(value) {
169
+ exact(
170
+ value,
171
+ ["id", "retain", "resolve"],
172
+ "PM recovery snapshot durability authority",
173
+ );
174
+ if (
175
+ typeof value.retain !== "function" ||
176
+ typeof value.resolve !== "function" ||
177
+ isProxy(value.retain) ||
178
+ isProxy(value.resolve)
179
+ ) {
180
+ throw new TypeError(
181
+ "PM recovery snapshot durability authority requires direct methods",
182
+ );
183
+ }
184
+ return Object.freeze({
185
+ id: identifier(value.id, "durability authority id"),
186
+ retain: (request) => Reflect.apply(value.retain, value, [request]),
187
+ resolve: (request) => Reflect.apply(value.resolve, value, [request]),
188
+ });
189
+ }
190
+
191
+ function validateAuthorityReceipt(value, binding, authorityId, schema, label) {
192
+ exact(
193
+ value,
194
+ [
195
+ "schema",
196
+ "authenticated",
197
+ "durable",
198
+ "authorityId",
199
+ "artifactTenantId",
200
+ "digest",
201
+ "purpose",
202
+ "ref",
203
+ "retention",
204
+ "type",
205
+ "receiptDigest",
206
+ ],
207
+ label,
208
+ );
209
+ if (
210
+ value.schema !== schema ||
211
+ value.authenticated !== true ||
212
+ value.durable !== true ||
213
+ value.authorityId !== authorityId ||
214
+ value.artifactTenantId !== binding.artifactTenantId ||
215
+ value.digest !== binding.digest ||
216
+ value.purpose !== binding.purpose ||
217
+ value.ref !== binding.ref ||
218
+ value.retention !== binding.retention ||
219
+ value.type !== binding.type
220
+ ) {
221
+ corrupt(`${label} is not authenticated durable evidence`);
222
+ }
223
+ digest(value.receiptDigest, `${label} receiptDigest`);
224
+ return value;
225
+ }
226
+
227
+ function normalizeRequest(value, expectedManifestDigest) {
228
+ exact(
229
+ value,
230
+ [
231
+ "schema",
232
+ "manifestDigest",
233
+ "transitionKind",
234
+ "snapshotRole",
235
+ "evidenceDigest",
236
+ "seal",
237
+ "bytes",
238
+ ],
239
+ "PM recovery snapshot request",
240
+ );
241
+ const expectedRole =
242
+ value.transitionKind === "success" ? "post-run" : "pre-run";
243
+ if (
244
+ value.schema !== PM_EXPLORATION_RECOVERY_SNAPSHOT_REQUEST_SCHEMA ||
245
+ value.manifestDigest !== expectedManifestDigest ||
246
+ !["success", "failure"].includes(value.transitionKind) ||
247
+ value.snapshotRole !== expectedRole
248
+ ) {
249
+ throw new Error("PM recovery snapshot request binding is invalid");
250
+ }
251
+ const seal = databaseSeal(value.seal);
252
+ const bytes = snapshotBytes(value.bytes);
253
+ if (
254
+ seal.databaseSnapshotBytes !== bytes.byteLength ||
255
+ seal.databaseSnapshotDigest !== hashBytes(bytes, DATABASE_SNAPSHOT_DOMAIN)
256
+ ) {
257
+ corrupt("PM recovery snapshot bytes differ from the database seal");
258
+ }
259
+ return {
260
+ manifestDigest: expectedManifestDigest,
261
+ transitionKind: value.transitionKind,
262
+ snapshotRole: value.snapshotRole,
263
+ evidenceDigest: digest(value.evidenceDigest, "evidenceDigest"),
264
+ seal,
265
+ bytes,
266
+ };
267
+ }
268
+
269
+ function ackCore(binding, request, authorityId, durabilityReceiptDigest) {
270
+ return {
271
+ schema: PM_EXPLORATION_RECOVERY_SNAPSHOT_ACK_SCHEMA,
272
+ authenticated: true,
273
+ durable: true,
274
+ readbackVerified: true,
275
+ manifestDigest: request.manifestDigest,
276
+ transitionKind: request.transitionKind,
277
+ snapshotRole: request.snapshotRole,
278
+ evidenceDigest: request.evidenceDigest,
279
+ sealDigest: request.seal.sealDigest,
280
+ databaseSnapshotDigest: request.seal.databaseSnapshotDigest,
281
+ databaseSnapshotBytes: request.seal.databaseSnapshotBytes,
282
+ artifactDigest: binding.digest,
283
+ artifactRef: binding.ref,
284
+ durabilityAuthorityId: authorityId,
285
+ durabilityReceiptDigest,
286
+ qualifiesForPromotion: false,
287
+ };
288
+ }
289
+
290
+ export function verifyPmExplorationRecoverySnapshotAck(value, expected = {}) {
291
+ if (
292
+ !expected ||
293
+ typeof expected !== "object" ||
294
+ Array.isArray(expected) ||
295
+ isProxy(expected) ||
296
+ Object.getPrototypeOf(expected) !== Object.prototype
297
+ ) {
298
+ throw new TypeError("PM recovery snapshot expected binding is invalid");
299
+ }
300
+ const expectedKeys = new Set([
301
+ "manifestDigest",
302
+ "transitionKind",
303
+ "evidenceDigest",
304
+ "sealDigest",
305
+ ]);
306
+ for (const key of Reflect.ownKeys(expected)) {
307
+ const descriptor = Object.getOwnPropertyDescriptor(expected, key);
308
+ if (
309
+ typeof key !== "string" ||
310
+ !expectedKeys.has(key) ||
311
+ !descriptor ||
312
+ !descriptor.enumerable ||
313
+ !("value" in descriptor)
314
+ ) {
315
+ throw new TypeError(
316
+ "PM recovery snapshot expected binding has invalid fields",
317
+ );
318
+ }
319
+ }
320
+ exact(
321
+ value,
322
+ [
323
+ "schema",
324
+ "authenticated",
325
+ "durable",
326
+ "readbackVerified",
327
+ "manifestDigest",
328
+ "transitionKind",
329
+ "snapshotRole",
330
+ "evidenceDigest",
331
+ "sealDigest",
332
+ "databaseSnapshotDigest",
333
+ "databaseSnapshotBytes",
334
+ "artifactDigest",
335
+ "artifactRef",
336
+ "durabilityAuthorityId",
337
+ "durabilityReceiptDigest",
338
+ "qualifiesForPromotion",
339
+ "snapshotAckDigest",
340
+ ],
341
+ "PM recovery snapshot acknowledgement",
342
+ );
343
+ const core = {
344
+ schema: value.schema,
345
+ authenticated: value.authenticated,
346
+ durable: value.durable,
347
+ readbackVerified: value.readbackVerified,
348
+ manifestDigest: digest(value.manifestDigest, "manifestDigest"),
349
+ transitionKind: value.transitionKind,
350
+ snapshotRole: value.snapshotRole,
351
+ evidenceDigest: digest(value.evidenceDigest, "evidenceDigest"),
352
+ sealDigest: digest(value.sealDigest, "sealDigest"),
353
+ databaseSnapshotDigest: digest(
354
+ value.databaseSnapshotDigest,
355
+ "databaseSnapshotDigest",
356
+ ),
357
+ databaseSnapshotBytes: value.databaseSnapshotBytes,
358
+ artifactDigest: digest(value.artifactDigest, "artifactDigest"),
359
+ artifactRef: identifier(value.artifactRef, "artifactRef"),
360
+ durabilityAuthorityId: identifier(
361
+ value.durabilityAuthorityId,
362
+ "durabilityAuthorityId",
363
+ ),
364
+ durabilityReceiptDigest: digest(
365
+ value.durabilityReceiptDigest,
366
+ "durabilityReceiptDigest",
367
+ ),
368
+ qualifiesForPromotion: value.qualifiesForPromotion,
369
+ };
370
+ if (
371
+ core.schema !== PM_EXPLORATION_RECOVERY_SNAPSHOT_ACK_SCHEMA ||
372
+ core.authenticated !== true ||
373
+ core.durable !== true ||
374
+ core.readbackVerified !== true ||
375
+ !["success", "failure"].includes(core.transitionKind) ||
376
+ core.snapshotRole !==
377
+ (core.transitionKind === "success" ? "post-run" : "pre-run") ||
378
+ !Number.isSafeInteger(core.databaseSnapshotBytes) ||
379
+ core.databaseSnapshotBytes < 1 ||
380
+ core.databaseSnapshotBytes > MAX_SNAPSHOT_BYTES ||
381
+ core.qualifiesForPromotion !== false
382
+ ) {
383
+ throw new Error("PM recovery snapshot acknowledgement is invalid");
384
+ }
385
+ for (const key of [
386
+ "manifestDigest",
387
+ "transitionKind",
388
+ "evidenceDigest",
389
+ "sealDigest",
390
+ ]) {
391
+ if (expected[key] !== undefined && core[key] !== expected[key])
392
+ throw new Error(`PM recovery snapshot acknowledgement ${key} mismatch`);
393
+ }
394
+ const snapshotAckDigest = digest(
395
+ value.snapshotAckDigest,
396
+ "snapshotAckDigest",
397
+ );
398
+ if (
399
+ snapshotAckDigest !==
400
+ hash(PM_EXPLORATION_RECOVERY_SNAPSHOT_ACK_SCHEMA, core)
401
+ ) {
402
+ throw new Error("PM recovery snapshot acknowledgement digest mismatch");
403
+ }
404
+ return deepFreeze({ ...core, snapshotAckDigest });
405
+ }
406
+
407
+ export function createPmExplorationRecoverySnapshotStore(input = {}) {
408
+ exact(
409
+ input,
410
+ ["manifestDigest", "artifactTenantId", "purpose", "durabilityAuthority"],
411
+ "PM recovery snapshot store input",
412
+ );
413
+ const manifestDigest = digest(input.manifestDigest, "manifestDigest");
414
+ const artifactTenantId = identifier(
415
+ input.artifactTenantId,
416
+ "artifactTenantId",
417
+ );
418
+ const purpose = identifier(input.purpose, "purpose");
419
+ const authority = captureAuthority(input.durabilityAuthority);
420
+ const store = Object.freeze({});
421
+ STORES.set(
422
+ store,
423
+ Object.freeze({ manifestDigest, artifactTenantId, purpose, authority }),
424
+ );
425
+ return store;
426
+ }
427
+
428
+ export function capturePmExplorationRecoverySnapshotStore(value) {
429
+ const captured = STORES.get(value);
430
+ if (!captured)
431
+ throw new TypeError("a branded PM recovery snapshot store is required");
432
+ return Object.freeze({
433
+ manifestDigest: captured.manifestDigest,
434
+ retainTransitionSnapshot: (input) => {
435
+ const request = normalizeRequest(input, captured.manifestDigest);
436
+ const artifactDigest = hashBytes(request.bytes);
437
+ const binding = deepFreeze({
438
+ artifactTenantId: captured.artifactTenantId,
439
+ digest: artifactDigest,
440
+ purpose: captured.purpose,
441
+ ref: `cc-pm-recovery-snapshot:${request.manifestDigest.slice(7)}:${request.evidenceDigest.slice(7)}:${request.snapshotRole}`,
442
+ retention: "ledger",
443
+ schema: EVOLUTION_ARTIFACT_DURABILITY_BINDING_SCHEMA,
444
+ type: SNAPSHOT_TYPE,
445
+ });
446
+ const retained = captured.authority.retain(
447
+ Object.freeze({
448
+ binding,
449
+ bytes: Buffer.from(request.bytes),
450
+ schema: EVOLUTION_ARTIFACT_DURABILITY_RETAIN_REQUEST_SCHEMA,
451
+ }),
452
+ );
453
+ if (isPromise(retained))
454
+ corrupt("PM recovery snapshot retain must be synchronous");
455
+ validateAuthorityReceipt(
456
+ retained,
457
+ binding,
458
+ captured.authority.id,
459
+ EVOLUTION_ARTIFACT_DURABILITY_RECEIPT_SCHEMA,
460
+ "PM recovery snapshot durability receipt",
461
+ );
462
+ const resolved = captured.authority.resolve(
463
+ Object.freeze({
464
+ artifactTenantId: binding.artifactTenantId,
465
+ digest: binding.digest,
466
+ purpose: binding.purpose,
467
+ ref: binding.ref,
468
+ retention: binding.retention,
469
+ schema: EVOLUTION_ARTIFACT_DURABILITY_RESOLVE_REQUEST_SCHEMA,
470
+ }),
471
+ );
472
+ if (isPromise(resolved))
473
+ corrupt("PM recovery snapshot resolve must be synchronous");
474
+ exact(
475
+ resolved,
476
+ [
477
+ "schema",
478
+ "authenticated",
479
+ "durable",
480
+ "authorityId",
481
+ "artifactTenantId",
482
+ "digest",
483
+ "purpose",
484
+ "ref",
485
+ "retention",
486
+ "type",
487
+ "receiptDigest",
488
+ "bytes",
489
+ ],
490
+ "PM recovery snapshot durability resolution",
491
+ );
492
+ validateAuthorityReceipt(
493
+ Object.fromEntries(
494
+ Reflect.ownKeys(resolved)
495
+ .filter((key) => key !== "bytes")
496
+ .map((key) => [key, resolved[key]]),
497
+ ),
498
+ binding,
499
+ captured.authority.id,
500
+ EVOLUTION_ARTIFACT_DURABILITY_RESOLUTION_SCHEMA,
501
+ "PM recovery snapshot durability resolution",
502
+ );
503
+ const readback = snapshotBytes(resolved.bytes);
504
+ if (!readback.equals(request.bytes))
505
+ corrupt("PM recovery snapshot durability readback differs");
506
+ const core = ackCore(
507
+ binding,
508
+ request,
509
+ captured.authority.id,
510
+ resolved.receiptDigest,
511
+ );
512
+ return deepFreeze({
513
+ ...core,
514
+ snapshotAckDigest: hash(
515
+ PM_EXPLORATION_RECOVERY_SNAPSHOT_ACK_SCHEMA,
516
+ core,
517
+ ),
518
+ });
519
+ },
520
+ });
521
+ }
@@ -419,8 +419,14 @@ function metrics(value) {
419
419
  }
420
420
 
421
421
  function updateStopReason(state, budgetExceeded) {
422
- if (budgetExceeded) state.stopReason = "budget-exhausted";
423
- else if (state.checkpoints.length >= state.plan.maxRounds)
422
+ if (
423
+ budgetExceeded ||
424
+ state.totals.tokens >= state.plan.maxTokens ||
425
+ state.totals.toolCalls >= state.plan.maxToolCalls ||
426
+ state.totals.wallClockMs >= state.plan.maxWallClockMs
427
+ ) {
428
+ state.stopReason = "budget-exhausted";
429
+ } else if (state.checkpoints.length >= state.plan.maxRounds)
424
430
  state.stopReason = "max-rounds";
425
431
  else if (state.consecutiveNoGain >= state.plan.maxConsecutiveNoGain)
426
432
  state.stopReason = "consecutive-no-gain";
@@ -815,12 +821,16 @@ export function inspectPmExplorationJournal(journal) {
815
821
  branchId,
816
822
  memoryDigest: state.branchHeads.get(branchId),
817
823
  checkpointCount: state.branchCheckpointDigests.get(branchId).length,
824
+ checkpointDigest:
825
+ state.branchCheckpointDigests.get(branchId).at(-1) ?? null,
818
826
  })),
819
827
  deepHead: state.deepHead,
820
828
  checkpointDigests: state.checkpoints.map(
821
829
  (checkpoint) => checkpoint.checkpointDigest,
822
830
  ),
823
831
  mergeDigest: state.merge?.mergeDigest ?? null,
832
+ mergeReceiptDigest: state.merge?.conflictResolutionReceiptDigest ?? null,
833
+ finalCheckpointDigest: state.checkpoints.at(-1)?.checkpointDigest ?? null,
824
834
  frozenMemoryDigest: state.frozen?.frozenMemoryDigest ?? null,
825
835
  aggregateMetrics: state.totals,
826
836
  consecutiveNoGain: state.consecutiveNoGain,