chainlesschain 0.166.42 → 0.166.44

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 (183) hide show
  1. package/README.md +75 -14
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-CdsAAOAu.js → AIOps-HiHMDVK3.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-B8x5S-3u.js → ActionButton-H2RKuS8V.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C1eOGwSM.js → Analytics-CBPFBB61.js} +3 -3
  7. package/src/assets/web-panel/assets/AppLayout-Da-3Laze.js +9 -0
  8. package/src/assets/web-panel/assets/{Artifacts-B0tiKn2i.js → Artifacts-DiRQ9yzD.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DzGqTUvG.js → Audit-C9LtWEBh.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-CMXYcy56.js → BackgroundAgents-4rpi7fVg.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-DrN3N1_7.js → Backup-B8VQmHys.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-BC9aoifZ.js → BaseInput-iCVpF2DK.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-F3Z9p0vk.js → Chat-BrQaXBwC.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-LMGrVg9Z.js → ChatBubbleRenderer-HIyU-9c0.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-CDXlouzl.js → Checkbox-CsV__0_R.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-9c0RpaYc.js → Codegen-BvFeCIAE.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-C-60iGia.js → Col-CagxV1O8.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DXE04H2M.js → Community-DAWr4ahG.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-B4jEuBmH.js → Compact-Ba49Tdc2.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-uf13-dcK.js → Compliance-Brk-MSO4.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-D6hpxLI4.js → Cowork-DeKH1v0o.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-CSJobmkN.js → Cron-AHB-T-VL.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-B0_rTlsi.js → Crosschain-Zbcrtimh.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-D49FQsiZ.js → DID-ByFa1MWG.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BvjvIYfC.js → Dashboard-9jKovyuH.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BYe1gODU.js → Dropdown-DY8TaXi5.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-CJ6znfiH.js → EmailListRenderer-rcaSveQ8.js} +1 -1
  28. package/src/assets/web-panel/assets/EvolutionSettings-B3dcSq1H.js +1 -0
  29. package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +1 -0
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BnoKDllh.js → FamilyGuardDashboard-5ao8smvA.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-AqhVFmd4.js → Federation-RTpNXXHT.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CNVYBpNg.js → FormItemContext-DWZvRMWv.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-BbdYCfjH.js → GenericCardRenderer-CWi8SGvx.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-B_xClOR0.js → Git-CCLgDIqs.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-CIKCDF9F.js → Governance-DUuyKrQl.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-BdRSc0oa.js → Inference-RkFcM2A0.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-DknpIQPx.js → KnowledgeGraph-C-QTauZr.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BcCPhMaZ.js → Logs-B-7Dz5Ui.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-CgiHBe0A.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-DEMNuvwO.js → Marketplace-CK1kSFDt.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-D-tg9wfq.js → McpTools-BcaVwoY6.js} +2 -2
  42. package/src/assets/web-panel/assets/{Memory-BqCLu-X9.js → Memory-QEI4xRwF.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-bN6vwbZc.js → MobileBridge-BqD-R0Ek.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-BTM0-1MZ.js → MobileProjects-CwFoXf1M.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-CcGXXyEn.js → Mtc-CTZ6qICG.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-B2Z5wPnM.js → MtcAudit-Cn7y2BzO.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DNW7dKam.js → Multisig-BCjsdGiN.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-Ciz-g5G3.js → NLProgramming-CupTVNtA.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-CeiEA6yF.js → Notes-C8kO3mGt.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DgeiEPwB.js → NotificationSettings-Cn-MJ8sQ.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-D9DjubGK.js → OrderTableRenderer-BX4PrVfN.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-CeA2EC_G.js → Organization-G_RjOL7M.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DT40ig7t.js → Overflow-BvX644ya.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-K4H13K3M.js → P2P-yWmLgYgQ.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-yYL7-rno.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-DYQogL6r.js → Permissions-DtU8fhcZ.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-DXhXVHar.js → PersonalDataHub-B17Vyk-x.js} +5 -5
  58. package/src/assets/web-panel/assets/{Pipeline-DQMdn5Ij.js → Pipeline-BZUsTyhP.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BiF1thop.js → Privacy-BswdhlPL.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-C2ptWEn7.js → ProjectInit-sJxSlY0C.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-B5WCiDZD.js → ProjectSettings-BnbpdOke.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-BNH6LKU6.js → Projects-DUjauf-6.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-CgRJ8ZT1.js → Providers-DhF5I-UR.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-B3tuNJ3V.js → QrScannerModal-B3PeCAGo.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-D9CO1SNI.js → QuickAsk-Cpaxrabg.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BGmwHY_U.js → Recommend-DqXFF66-.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-CliYaolm.js → RemoteSession-DtDQ76Ox.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-sCiX2kmm.js → Reputation-BgLLKwu2.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-DXHx_bk0.js → Row-BuMLhd8M.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-Bg79mIxI.js → RssFeed-BizxUzBA.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-CnKDYqyS.js → Search-CYNrJAQY.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-c-0QOrC2.js → Security-CIC02soH.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-BBBTb4YA.js → Services-DD3WxXxw.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CtL_5fJe.js → Skeleton-C-d9Mbos.js} +1 -1
  75. package/src/assets/web-panel/assets/Skills-BBkg1Eqr.js +1 -0
  76. package/src/assets/web-panel/assets/{Sla-C5LGNImz.js → Sla-DgrqUhns.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Btx0KgwX.js → SpeechSettings-CDXFwOHX.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-DFLNSWuu.js → SyncSettings-BBio_v8M.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-Btkyo0G7.js → Tasks-QQWSk-tc.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-CIIt_k5J.js → Templates-RAPdM85o.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-Nqo1PA2a.js → Tenant-2jI745PC.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CGwV9hW9.js → Terminal-ZCtYBMAe.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-Bu3xrXyf.js → TimelineRenderer-DfI36Yg6.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-3bC3zrYj.js → Tokens-NQ1VaO0W.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DG84V7Xf.js → Trigger-DwFh5AMe.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-rPhNXoYJ.js → Trust-Dr0v45uH.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CamNxeAp.js → UkeySign-i7Q1Bdqr.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-CkIuH4Gm.js → VideoEditing-CXSkk4gl.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-SD5W5uHT.js → Wallet-8_cAjou4.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn--A4Sddxn.js → WebAuthn-jn_3Gma7.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-Ca7qvch8.js → WorkflowEditor-BmvodVLl.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-i8OBdjCB.js → chat-DGi3bmwL.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-BeYbJKQ8.js → colors-D8OSTOU0.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BqpF-Sya.js → compact-item-DfNygJU_.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-qXTb29t3.js → createContext-B0lT0dbj.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BUooUkHH.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-DOfL0KSW.js → hasIn-Xtzg_EDR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-X8TXf9Bb.js → index-4s8GZJ73.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-0OxY_Nsh.js → index-B-B7DDjX.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CebShwk1.js → index-B0kDqFPU.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-czHvbhS0.js → index-B2bgL5vL.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CXXeOim8.js → index-B3ittRaJ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index--TQi5102.js → index-B4-hl9Rw.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C13IM9lj.js → index-BBR-_Pkv.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CH7mHJoh.js → index-BBegBTDb.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-vNYrAXO6.js → index-BFRkiqtr.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DIikgsI1.js → index-BJ6nxb18.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B177TAO-.js → index-BVOyO-ZV.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Bt7Ua7EC.js → index-BbTx5wo1.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-nl9IxLfv.js → index-BhS9-r8Z.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Cy8WApMp.js → index-BhYM_Rzp.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BmzmjSGb.js → index-BhhS0xnV.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-D8c3Ctj4.js → index-BpsIkWwQ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C4_8KnUt.js → index-Bujix_OR.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CLrDyxeZ.js → index-Byto86PA.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Byn_IHXR.js → index-CIbYQLD-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DWLxMPZ_.js → index-CLRMkKeD.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-ByHZkqj5.js → index-CShl59Um.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-TAvlGp5l.js → index-ConAvib0.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BKd03Rn4.js → index-Cp-yGWti.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-rdW8KX_7.js → index-Cx_EAQEh.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-JxyF4KNw.js → index-CyVOaMS7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BYzQaGnV.js → index-DEH5ms1R.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-zmvw3Ptl.js → index-DFkgqRqx.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BdbrE-hz.js → index-DVfE2S0f.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BOwR6mHU.js → index-DVnowoxR.js} +1 -1
  127. package/src/assets/web-panel/assets/index-DVu4QCII.js +1 -0
  128. package/src/assets/web-panel/assets/{index-Cvig0IjN.js → index-DWpRgQvO.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BD386d6M.js → index-DXNWsfbw.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BuzGZOAK.js → index-DZKM2nm2.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Dio2mTWq.js → index-De9jsBiC.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-GGEsF-NA.js → index-EV-o-rTH.js} +1 -1
  133. package/src/assets/web-panel/assets/index-XYnz-yJ_.js +1 -0
  134. package/src/assets/web-panel/assets/{index-B00rNoIx.js → index-hDo9-qDw.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-C-P0NHi4.js → index-kdyFlPZw.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DCcXU9HN.js → index-svr-L6NS.js} +5 -5
  137. package/src/assets/web-panel/assets/{initDefaultProps-BKpYiODg.js → initDefaultProps-CPsOp_T6.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-DJ2p-V-R.js → motion-8Jakob3_.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CmA2ejm5.js → move-DAogsEBs.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-CAIGxQzN.js → mtc-parser-CkA9zZB_.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DJlnhA7K.js → omit-DMHNkosQ.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CZPrJyhF.js → pickAttrs-ByIvo_lk.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CXy74okE.js → placementArrow-CafMUHzz.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DexkLtci.js → responsiveObserve-CTehELUQ.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-BzjBJbPV.js → slide-BQISQ1KV.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-gnHIXw2X.js → statusUtils-Drm4jUoK.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-DHBjT1Gk.js → styleChecker-DGniLRqn.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-BmMStW87.js → useFlexGapSupport-DYz_z9wn.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-BcV5VGA2.js → useFs-DRAPQMjC.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DBxxRRY2.js → usePersonalDataHub-CpgGLb8q.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-Bt5yp9hj.js → vnode-p6925VWJ.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-CMdUkOfw.js → zoom-ClpO8REK.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/evolution-deployment.js +95 -0
  156. package/src/commands/evolution.js +2 -0
  157. package/src/constants.js +2 -2
  158. package/src/data/changelog.json +191 -752
  159. package/src/gateways/ws/evolution-deployment-topic-handlers.js +53 -0
  160. package/src/lib/evolution/evolution-deployment-config.js +81 -0
  161. package/src/lib/evolution/evolution-deployment-loader.js +62 -13
  162. package/src/lib/evolution/evolution-deployment-profile.js +114 -0
  163. package/src/lib/evolution/evolution-file-identity.js +42 -0
  164. package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +242 -0
  165. package/src/lib/evolution/evolution-ledger-manifest-chain.js +74 -18
  166. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +135 -20
  167. package/src/lib/evolution/evolution-ledger.js +353 -209
  168. package/src/lib/llm-providers.js +1 -0
  169. package/src/lib/public-ide-capability-manifest.js +2 -0
  170. package/src/lib/read-file-loop-guard.js +17 -4
  171. package/src/lib/remote-read-loop-guard.js +13 -0
  172. package/src/lib/task-model-selector.js +1 -1
  173. package/src/lib/task-progress-tracker.js +36 -1
  174. package/src/lib/text-file-search.js +11 -0
  175. package/src/runtime/agent-core.js +6 -2
  176. package/src/runtime/agent-runtime.js +2 -0
  177. package/src/assets/web-panel/assets/AppLayout-CdnpAzuo.js +0 -9
  178. package/src/assets/web-panel/assets/MarkdownRenderer-H_GkKEp-.js +0 -1
  179. package/src/assets/web-panel/assets/PdhVaultBrowser-CF7TzZmx.js +0 -7
  180. package/src/assets/web-panel/assets/Skills-DvqrC2_v.js +0 -1
  181. package/src/assets/web-panel/assets/devWarning-DATyiD_X.js +0 -1
  182. package/src/assets/web-panel/assets/index-DmzMCELP.js +0 -1
  183. package/src/assets/web-panel/assets/index-TlPg2Jz6.js +0 -1
@@ -49,6 +49,12 @@ const SEAL_CONFIG_KEYS = new Set([
49
49
  "previousHead",
50
50
  "segmentStore",
51
51
  ]);
52
+ const DERIVE_HEAD_CONFIG_KEYS = new Set([
53
+ "authority",
54
+ "descriptor",
55
+ "manifest",
56
+ "previousHead",
57
+ ]);
52
58
  const VERIFY_CONFIG_KEYS = new Set([
53
59
  "authority",
54
60
  "descriptor",
@@ -711,6 +717,44 @@ function previousHead(value, descriptorValue, authority) {
711
717
  : normalizeHead(value, descriptorValue, authority);
712
718
  }
713
719
 
720
+ function manifestHeadFromManifest(
721
+ authority,
722
+ descriptorValue,
723
+ manifest,
724
+ previous,
725
+ ) {
726
+ if (
727
+ manifest.manifestSequence !== (previous?.manifestSequence || 0) + 1 ||
728
+ manifest.previousManifestDigest !== (previous?.manifestDigest || null) ||
729
+ manifest.sequenceStart !== (previous?.sequence || 0) + 1
730
+ ) {
731
+ throw failure(
732
+ EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
733
+ "manifest cannot derive the next contiguous head",
734
+ );
735
+ }
736
+ return sign(
737
+ authority,
738
+ "ledger-manifest-head",
739
+ Object.freeze({
740
+ authorityAlgorithm: authority.descriptor.algorithm,
741
+ authorityId: authority.descriptor.authorityId,
742
+ authorityRevision: authority.descriptor.revision,
743
+ epoch: descriptorValue.epoch,
744
+ eventDigest: manifest.eventDigests.at(-1),
745
+ issuedAt: manifest.issuedAt,
746
+ ledgerId: descriptorValue.ledgerId,
747
+ manifestDigest: manifest.manifestDigest,
748
+ manifestSequence: manifest.manifestSequence,
749
+ previousHeadDigest: previous?.headDigest || null,
750
+ schema: EVOLUTION_LEDGER_MANIFEST_HEAD_SCHEMA,
751
+ sequence: manifest.sequenceEnd,
752
+ tenantId: descriptorValue.tenantId,
753
+ }),
754
+ "headDigest",
755
+ );
756
+ }
757
+
714
758
  function storeFailure(cause, action) {
715
759
  if (cause instanceof EvolutionLedgerManifestError) throw cause;
716
760
  const code =
@@ -849,25 +893,11 @@ export function sealEvolutionLedgerManifestSegment(options = undefined) {
849
893
  }),
850
894
  "manifestDigest",
851
895
  );
852
- const head = sign(
896
+ const head = manifestHeadFromManifest(
853
897
  authority,
854
- "ledger-manifest-head",
855
- Object.freeze({
856
- authorityAlgorithm: authority.descriptor.algorithm,
857
- authorityId: authority.descriptor.authorityId,
858
- authorityRevision: authority.descriptor.revision,
859
- epoch: descriptorValue.epoch,
860
- eventDigest: eventDigests.at(-1),
861
- issuedAt,
862
- ledgerId: descriptorValue.ledgerId,
863
- manifestDigest: manifest.manifestDigest,
864
- manifestSequence: manifest.manifestSequence,
865
- previousHeadDigest: previous?.headDigest || null,
866
- schema: EVOLUTION_LEDGER_MANIFEST_HEAD_SCHEMA,
867
- sequence: segmentPayload.sequenceEnd,
868
- tenantId: descriptorValue.tenantId,
869
- }),
870
- "headDigest",
898
+ descriptorValue,
899
+ manifest,
900
+ previous,
871
901
  );
872
902
  return Object.freeze({
873
903
  head,
@@ -876,6 +906,32 @@ export function sealEvolutionLedgerManifestSegment(options = undefined) {
876
906
  });
877
907
  }
878
908
 
909
+ export function deriveEvolutionLedgerManifestHead(options = undefined) {
910
+ const fields = exactRecord(
911
+ options,
912
+ DERIVE_HEAD_CONFIG_KEYS,
913
+ "manifest head derivation configuration",
914
+ );
915
+ const descriptorValue = descriptor(data(fields, "descriptor"));
916
+ const authority = captureAuthority(data(fields, "authority"));
917
+ const manifest = normalizeManifest(
918
+ data(fields, "manifest"),
919
+ descriptorValue,
920
+ authority,
921
+ );
922
+ const previous = previousHead(
923
+ data(fields, "previousHead"),
924
+ descriptorValue,
925
+ authority,
926
+ );
927
+ return manifestHeadFromManifest(
928
+ authority,
929
+ descriptorValue,
930
+ manifest,
931
+ previous,
932
+ );
933
+ }
934
+
879
935
  export function verifyEvolutionLedgerManifestHead(options = undefined) {
880
936
  const fields = exactRecord(
881
937
  options,
@@ -3,6 +3,7 @@ import { types as utilTypes } from "node:util";
3
3
  import { captureImmutableLedgerSegmentStorePort } from "./evolution-immutable-ledger-segment-store.js";
4
4
  import {
5
5
  captureEvolutionLedgerManifestAuthority,
6
+ deriveEvolutionLedgerManifestHead,
6
7
  sealEvolutionLedgerManifestSegment,
7
8
  verifyEvolutionLedgerManifestChain,
8
9
  } from "./evolution-ledger-manifest-chain.js";
@@ -182,7 +183,7 @@ function own(record, name, code = EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE) {
182
183
  return field.value;
183
184
  }
184
185
 
185
- function coherentSnapshot(catalog, headStore, witnessAdapter) {
186
+ function checkpointParts(catalog, headStore, witnessAdapter) {
186
187
  let head;
187
188
  let manifest;
188
189
  let witness;
@@ -198,6 +199,20 @@ function coherentSnapshot(catalog, headStore, witnessAdapter) {
198
199
  { cause },
199
200
  );
200
201
  }
202
+ return { head, manifest, witness };
203
+ }
204
+
205
+ function witnessMatchesHead(witness, head) {
206
+ if (head === null) return witness.status === "absent";
207
+ if (witness.status !== "committed") return false;
208
+ return (
209
+ own(witness.record, "anchorDigest") === head.manifestDigest &&
210
+ own(witness.record, "headDigest") === head.headDigest &&
211
+ own(witness.record, "sequence") === head.sequence
212
+ );
213
+ }
214
+
215
+ function coherentCheckpoint({ head, manifest, witness }) {
201
216
  if (head === null) {
202
217
  if (manifest !== null || witness.status !== "absent") {
203
218
  throw failure(
@@ -207,10 +222,10 @@ function coherentSnapshot(catalog, headStore, witnessAdapter) {
207
222
  }
208
223
  return Object.freeze({ head: null, manifest: null, witness });
209
224
  }
210
- if (witness.status !== "committed") {
225
+ if (!witnessMatchesHead(witness, head)) {
211
226
  throw failure(
212
227
  EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
213
- "v2 manifest head has no committed witness",
228
+ "v2 manifest head has no matching committed witness",
214
229
  );
215
230
  }
216
231
  if (manifest?.manifestDigest !== head.manifestDigest) {
@@ -219,22 +234,15 @@ function coherentSnapshot(catalog, headStore, witnessAdapter) {
219
234
  "v2 manifest catalog latest does not bind the manifest head",
220
235
  );
221
236
  }
222
- const bindings = {
223
- anchorDigest: head.manifestDigest,
224
- headDigest: head.headDigest,
225
- sequence: head.sequence,
226
- };
227
- for (const [field, expected] of Object.entries(bindings)) {
228
- if (own(witness.record, field) !== expected) {
229
- throw failure(
230
- EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
231
- `v2 manifest witness ${field} binding differs`,
232
- );
233
- }
234
- }
235
237
  return Object.freeze({ head, manifest, witness });
236
238
  }
237
239
 
240
+ function coherentSnapshot(catalog, headStore, witnessAdapter) {
241
+ return coherentCheckpoint(
242
+ checkpointParts(catalog, headStore, witnessAdapter),
243
+ );
244
+ }
245
+
238
246
  function conflict(snapshot) {
239
247
  return Object.freeze({
240
248
  conflict: true,
@@ -301,13 +309,120 @@ export function createEvolutionLedgerV2ManifestBackend(options = undefined) {
301
309
  );
302
310
  }
303
311
 
312
+ const verifyPreparedChain = (head) =>
313
+ verifyEvolutionLedgerManifestChain({
314
+ authority: manifestAuthority,
315
+ descriptor: normalizedDescriptor,
316
+ head,
317
+ manifests: catalog.list(),
318
+ segmentStore,
319
+ });
320
+
321
+ const recoverCheckpoint = () => {
322
+ let parts = checkpointParts(catalog, headStore, witnessAdapter);
323
+ try {
324
+ return coherentCheckpoint(parts);
325
+ } catch (initialFailure) {
326
+ if (parts.manifest === null) throw initialFailure;
327
+ }
328
+
329
+ let proposedHead = parts.head;
330
+ if (parts.head?.manifestDigest !== parts.manifest.manifestDigest) {
331
+ const previousManifestDigest = parts.head?.manifestDigest ?? null;
332
+ const previousManifestSequence = parts.head?.manifestSequence ?? 0;
333
+ const previousSequence = parts.head?.sequence ?? 0;
334
+ if (
335
+ parts.manifest.previousManifestDigest !== previousManifestDigest ||
336
+ parts.manifest.manifestSequence !== previousManifestSequence + 1 ||
337
+ parts.manifest.sequenceStart !== previousSequence + 1 ||
338
+ !witnessMatchesHead(parts.witness, parts.head)
339
+ ) {
340
+ throw failure(
341
+ EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
342
+ "v2 manifest partial checkpoint is not a recoverable next segment",
343
+ );
344
+ }
345
+ proposedHead = deriveEvolutionLedgerManifestHead({
346
+ authority: manifestAuthority,
347
+ descriptor: normalizedDescriptor,
348
+ manifest: parts.manifest,
349
+ previousHead: parts.head,
350
+ });
351
+ verifyPreparedChain(proposedHead);
352
+ let committed;
353
+ try {
354
+ committed = headStore.commit({
355
+ expectedHeadDigest: parts.head?.headDigest ?? null,
356
+ nextHead: proposedHead,
357
+ });
358
+ } catch (cause) {
359
+ throw unknown(
360
+ "v2 manifest head recovery may be committed; reopen before retrying",
361
+ cause,
362
+ );
363
+ }
364
+ if (committed.committed !== true) {
365
+ const observed = headStore.read();
366
+ if (observed?.headDigest !== proposedHead.headDigest) {
367
+ throw unknown(
368
+ "v2 manifest head recovery conflicted; reopen before retrying",
369
+ );
370
+ }
371
+ }
372
+ parts = checkpointParts(catalog, headStore, witnessAdapter);
373
+ }
374
+
375
+ if (!witnessMatchesHead(parts.witness, proposedHead)) {
376
+ const witnessIsPrevious =
377
+ (parts.witness.status === "absent" &&
378
+ proposedHead.previousHeadDigest === null &&
379
+ parts.manifest.sequenceStart === 1) ||
380
+ (parts.witness.status === "committed" &&
381
+ own(parts.witness.record, "headDigest") ===
382
+ proposedHead.previousHeadDigest &&
383
+ own(parts.witness.record, "anchorDigest") ===
384
+ parts.manifest.previousManifestDigest &&
385
+ own(parts.witness.record, "sequence") ===
386
+ parts.manifest.sequenceStart - 1);
387
+ if (!witnessIsPrevious) {
388
+ throw failure(
389
+ EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
390
+ "v2 manifest witness is not at the recoverable previous checkpoint",
391
+ );
392
+ }
393
+ verifyPreparedChain(proposedHead);
394
+ let checkpointed;
395
+ try {
396
+ checkpointed = witnessAdapter.checkpoint({
397
+ expectedWitnessDigest: parts.witness.witnessDigest,
398
+ head: proposedHead,
399
+ manifest: parts.manifest,
400
+ });
401
+ } catch (cause) {
402
+ throw unknown(
403
+ "v2 manifest witness recovery may be committed; reopen before retrying",
404
+ cause,
405
+ );
406
+ }
407
+ if (checkpointed.checkpointed !== true) {
408
+ const observed = witnessAdapter.read();
409
+ if (!witnessMatchesHead(observed, proposedHead)) {
410
+ throw unknown(
411
+ "v2 manifest witness recovery conflicted; reopen before retrying",
412
+ );
413
+ }
414
+ }
415
+ }
416
+ return coherentSnapshot(catalog, headStore, witnessAdapter);
417
+ };
418
+
304
419
  const backend = Object.freeze({
305
420
  descriptor: Object.freeze({
306
421
  ...normalizedDescriptor,
307
422
  schema: EVOLUTION_LEDGER_V2_MANIFEST_BACKEND_SCHEMA,
308
423
  }),
309
424
  read() {
310
- return coherentSnapshot(catalog, headStore, witnessAdapter);
425
+ return recoverCheckpoint();
311
426
  },
312
427
  appendSegment(input) {
313
428
  const request = exactRecord(
@@ -323,7 +438,7 @@ export function createEvolutionLedgerV2ManifestBackend(options = undefined) {
323
438
  data(request, "expectedWitnessDigest"),
324
439
  "expectedWitnessDigest",
325
440
  );
326
- const current = coherentSnapshot(catalog, headStore, witnessAdapter);
441
+ const current = recoverCheckpoint();
327
442
  if (
328
443
  (current.head?.headDigest ?? null) !== expectedHeadDigest ||
329
444
  current.witness.witnessDigest !== expectedWitnessDigest
@@ -393,7 +508,7 @@ export function createEvolutionLedgerV2ManifestBackend(options = undefined) {
393
508
  }
394
509
  let final;
395
510
  try {
396
- final = coherentSnapshot(catalog, headStore, witnessAdapter);
511
+ final = recoverCheckpoint();
397
512
  } catch (cause) {
398
513
  throw unknown(
399
514
  "v2 manifest commit readback is unavailable; reopen before retrying",
@@ -426,7 +541,7 @@ export function createEvolutionLedgerV2ManifestBackend(options = undefined) {
426
541
  },
427
542
  verify(input = {}) {
428
543
  exactRecord(input, VERIFY_KEYS, "v2 manifest verification request");
429
- const snapshot = coherentSnapshot(catalog, headStore, witnessAdapter);
544
+ const snapshot = recoverCheckpoint();
430
545
  if (snapshot.head === null) {
431
546
  throw failure(
432
547
  EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,