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.
- package/README.md +75 -14
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CdsAAOAu.js → AIOps-HiHMDVK3.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-B8x5S-3u.js → ActionButton-H2RKuS8V.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C1eOGwSM.js → Analytics-CBPFBB61.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-Da-3Laze.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-B0tiKn2i.js → Artifacts-DiRQ9yzD.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DzGqTUvG.js → Audit-C9LtWEBh.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CMXYcy56.js → BackgroundAgents-4rpi7fVg.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DrN3N1_7.js → Backup-B8VQmHys.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BC9aoifZ.js → BaseInput-iCVpF2DK.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-F3Z9p0vk.js → Chat-BrQaXBwC.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-LMGrVg9Z.js → ChatBubbleRenderer-HIyU-9c0.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CDXlouzl.js → Checkbox-CsV__0_R.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-9c0RpaYc.js → Codegen-BvFeCIAE.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C-60iGia.js → Col-CagxV1O8.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DXE04H2M.js → Community-DAWr4ahG.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B4jEuBmH.js → Compact-Ba49Tdc2.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-uf13-dcK.js → Compliance-Brk-MSO4.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D6hpxLI4.js → Cowork-DeKH1v0o.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CSJobmkN.js → Cron-AHB-T-VL.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B0_rTlsi.js → Crosschain-Zbcrtimh.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D49FQsiZ.js → DID-ByFa1MWG.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BvjvIYfC.js → Dashboard-9jKovyuH.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BYe1gODU.js → Dropdown-DY8TaXi5.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CJ6znfiH.js → EmailListRenderer-rcaSveQ8.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-B3dcSq1H.js +1 -0
- package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BnoKDllh.js → FamilyGuardDashboard-5ao8smvA.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-AqhVFmd4.js → Federation-RTpNXXHT.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CNVYBpNg.js → FormItemContext-DWZvRMWv.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BbdYCfjH.js → GenericCardRenderer-CWi8SGvx.js} +1 -1
- package/src/assets/web-panel/assets/{Git-B_xClOR0.js → Git-CCLgDIqs.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CIKCDF9F.js → Governance-DUuyKrQl.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BdRSc0oa.js → Inference-RkFcM2A0.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DknpIQPx.js → KnowledgeGraph-C-QTauZr.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BcCPhMaZ.js → Logs-B-7Dz5Ui.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CgiHBe0A.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DEMNuvwO.js → Marketplace-CK1kSFDt.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D-tg9wfq.js → McpTools-BcaVwoY6.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-BqCLu-X9.js → Memory-QEI4xRwF.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-bN6vwbZc.js → MobileBridge-BqD-R0Ek.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BTM0-1MZ.js → MobileProjects-CwFoXf1M.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CcGXXyEn.js → Mtc-CTZ6qICG.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-B2Z5wPnM.js → MtcAudit-Cn7y2BzO.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DNW7dKam.js → Multisig-BCjsdGiN.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Ciz-g5G3.js → NLProgramming-CupTVNtA.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CeiEA6yF.js → Notes-C8kO3mGt.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DgeiEPwB.js → NotificationSettings-Cn-MJ8sQ.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D9DjubGK.js → OrderTableRenderer-BX4PrVfN.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CeA2EC_G.js → Organization-G_RjOL7M.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DT40ig7t.js → Overflow-BvX644ya.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-K4H13K3M.js → P2P-yWmLgYgQ.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-yYL7-rno.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DYQogL6r.js → Permissions-DtU8fhcZ.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DXhXVHar.js → PersonalDataHub-B17Vyk-x.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DQMdn5Ij.js → Pipeline-BZUsTyhP.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BiF1thop.js → Privacy-BswdhlPL.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-C2ptWEn7.js → ProjectInit-sJxSlY0C.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B5WCiDZD.js → ProjectSettings-BnbpdOke.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BNH6LKU6.js → Projects-DUjauf-6.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CgRJ8ZT1.js → Providers-DhF5I-UR.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-B3tuNJ3V.js → QrScannerModal-B3PeCAGo.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D9CO1SNI.js → QuickAsk-Cpaxrabg.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BGmwHY_U.js → Recommend-DqXFF66-.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CliYaolm.js → RemoteSession-DtDQ76Ox.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-sCiX2kmm.js → Reputation-BgLLKwu2.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DXHx_bk0.js → Row-BuMLhd8M.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Bg79mIxI.js → RssFeed-BizxUzBA.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CnKDYqyS.js → Search-CYNrJAQY.js} +1 -1
- package/src/assets/web-panel/assets/{Security-c-0QOrC2.js → Security-CIC02soH.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BBBTb4YA.js → Services-DD3WxXxw.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CtL_5fJe.js → Skeleton-C-d9Mbos.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BBkg1Eqr.js +1 -0
- package/src/assets/web-panel/assets/{Sla-C5LGNImz.js → Sla-DgrqUhns.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Btx0KgwX.js → SpeechSettings-CDXFwOHX.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DFLNSWuu.js → SyncSettings-BBio_v8M.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Btkyo0G7.js → Tasks-QQWSk-tc.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CIIt_k5J.js → Templates-RAPdM85o.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Nqo1PA2a.js → Tenant-2jI745PC.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CGwV9hW9.js → Terminal-ZCtYBMAe.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Bu3xrXyf.js → TimelineRenderer-DfI36Yg6.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-3bC3zrYj.js → Tokens-NQ1VaO0W.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DG84V7Xf.js → Trigger-DwFh5AMe.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-rPhNXoYJ.js → Trust-Dr0v45uH.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CamNxeAp.js → UkeySign-i7Q1Bdqr.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CkIuH4Gm.js → VideoEditing-CXSkk4gl.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-SD5W5uHT.js → Wallet-8_cAjou4.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn--A4Sddxn.js → WebAuthn-jn_3Gma7.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Ca7qvch8.js → WorkflowEditor-BmvodVLl.js} +1 -1
- package/src/assets/web-panel/assets/{chat-i8OBdjCB.js → chat-DGi3bmwL.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BeYbJKQ8.js → colors-D8OSTOU0.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BqpF-Sya.js → compact-item-DfNygJU_.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-qXTb29t3.js → createContext-B0lT0dbj.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BUooUkHH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DOfL0KSW.js → hasIn-Xtzg_EDR.js} +1 -1
- package/src/assets/web-panel/assets/{index-X8TXf9Bb.js → index-4s8GZJ73.js} +1 -1
- package/src/assets/web-panel/assets/{index-0OxY_Nsh.js → index-B-B7DDjX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CebShwk1.js → index-B0kDqFPU.js} +1 -1
- package/src/assets/web-panel/assets/{index-czHvbhS0.js → index-B2bgL5vL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXXeOim8.js → index-B3ittRaJ.js} +1 -1
- package/src/assets/web-panel/assets/{index--TQi5102.js → index-B4-hl9Rw.js} +1 -1
- package/src/assets/web-panel/assets/{index-C13IM9lj.js → index-BBR-_Pkv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CH7mHJoh.js → index-BBegBTDb.js} +1 -1
- package/src/assets/web-panel/assets/{index-vNYrAXO6.js → index-BFRkiqtr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIikgsI1.js → index-BJ6nxb18.js} +1 -1
- package/src/assets/web-panel/assets/{index-B177TAO-.js → index-BVOyO-ZV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bt7Ua7EC.js → index-BbTx5wo1.js} +1 -1
- package/src/assets/web-panel/assets/{index-nl9IxLfv.js → index-BhS9-r8Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cy8WApMp.js → index-BhYM_Rzp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmzmjSGb.js → index-BhhS0xnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8c3Ctj4.js → index-BpsIkWwQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4_8KnUt.js → index-Bujix_OR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLrDyxeZ.js → index-Byto86PA.js} +1 -1
- package/src/assets/web-panel/assets/{index-Byn_IHXR.js → index-CIbYQLD-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWLxMPZ_.js → index-CLRMkKeD.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByHZkqj5.js → index-CShl59Um.js} +1 -1
- package/src/assets/web-panel/assets/{index-TAvlGp5l.js → index-ConAvib0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKd03Rn4.js → index-Cp-yGWti.js} +1 -1
- package/src/assets/web-panel/assets/{index-rdW8KX_7.js → index-Cx_EAQEh.js} +1 -1
- package/src/assets/web-panel/assets/{index-JxyF4KNw.js → index-CyVOaMS7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYzQaGnV.js → index-DEH5ms1R.js} +1 -1
- package/src/assets/web-panel/assets/{index-zmvw3Ptl.js → index-DFkgqRqx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdbrE-hz.js → index-DVfE2S0f.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOwR6mHU.js → index-DVnowoxR.js} +1 -1
- package/src/assets/web-panel/assets/index-DVu4QCII.js +1 -0
- package/src/assets/web-panel/assets/{index-Cvig0IjN.js → index-DWpRgQvO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BD386d6M.js → index-DXNWsfbw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuzGZOAK.js → index-DZKM2nm2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dio2mTWq.js → index-De9jsBiC.js} +1 -1
- package/src/assets/web-panel/assets/{index-GGEsF-NA.js → index-EV-o-rTH.js} +1 -1
- package/src/assets/web-panel/assets/index-XYnz-yJ_.js +1 -0
- package/src/assets/web-panel/assets/{index-B00rNoIx.js → index-hDo9-qDw.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-P0NHi4.js → index-kdyFlPZw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCcXU9HN.js → index-svr-L6NS.js} +5 -5
- package/src/assets/web-panel/assets/{initDefaultProps-BKpYiODg.js → initDefaultProps-CPsOp_T6.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DJ2p-V-R.js → motion-8Jakob3_.js} +1 -1
- package/src/assets/web-panel/assets/{move-CmA2ejm5.js → move-DAogsEBs.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CAIGxQzN.js → mtc-parser-CkA9zZB_.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DJlnhA7K.js → omit-DMHNkosQ.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CZPrJyhF.js → pickAttrs-ByIvo_lk.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CXy74okE.js → placementArrow-CafMUHzz.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DexkLtci.js → responsiveObserve-CTehELUQ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BzjBJbPV.js → slide-BQISQ1KV.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-gnHIXw2X.js → statusUtils-Drm4jUoK.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DHBjT1Gk.js → styleChecker-DGniLRqn.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BmMStW87.js → useFlexGapSupport-DYz_z9wn.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BcV5VGA2.js → useFs-DRAPQMjC.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DBxxRRY2.js → usePersonalDataHub-CpgGLb8q.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Bt5yp9hj.js → vnode-p6925VWJ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CMdUkOfw.js → zoom-ClpO8REK.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/evolution-deployment.js +95 -0
- package/src/commands/evolution.js +2 -0
- package/src/constants.js +2 -2
- package/src/data/changelog.json +191 -752
- package/src/gateways/ws/evolution-deployment-topic-handlers.js +53 -0
- package/src/lib/evolution/evolution-deployment-config.js +81 -0
- package/src/lib/evolution/evolution-deployment-loader.js +62 -13
- package/src/lib/evolution/evolution-deployment-profile.js +114 -0
- package/src/lib/evolution/evolution-file-identity.js +42 -0
- package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +242 -0
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +74 -18
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +135 -20
- package/src/lib/evolution/evolution-ledger.js +353 -209
- package/src/lib/llm-providers.js +1 -0
- package/src/lib/public-ide-capability-manifest.js +2 -0
- package/src/lib/read-file-loop-guard.js +17 -4
- package/src/lib/remote-read-loop-guard.js +13 -0
- package/src/lib/task-model-selector.js +1 -1
- package/src/lib/task-progress-tracker.js +36 -1
- package/src/lib/text-file-search.js +11 -0
- package/src/runtime/agent-core.js +6 -2
- package/src/runtime/agent-runtime.js +2 -0
- package/src/assets/web-panel/assets/AppLayout-CdnpAzuo.js +0 -9
- package/src/assets/web-panel/assets/MarkdownRenderer-H_GkKEp-.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-CF7TzZmx.js +0 -7
- package/src/assets/web-panel/assets/Skills-DvqrC2_v.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DATyiD_X.js +0 -1
- package/src/assets/web-panel/assets/index-DmzMCELP.js +0 -1
- 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 =
|
|
896
|
+
const head = manifestHeadFromManifest(
|
|
853
897
|
authority,
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
544
|
+
const snapshot = recoverCheckpoint();
|
|
430
545
|
if (snapshot.head === null) {
|
|
431
546
|
throw failure(
|
|
432
547
|
EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|