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.
- package/README.md +54 -8
- package/package.json +3 -1
- package/src/assets/web-panel/assets/{AIOps-BqoRiuXE.js → AIOps-BFbLDWTF.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BwBhyFIm.js → ActionButton-CAHMtgNB.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DTW03Emb.js → Analytics-CkrSj0oR.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CI-wxMLQ.js → AppLayout-BTb0Ws1l.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-DVqbM3iE.js → Artifacts-C2Pgepj-.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DulhOs16.js → Audit-ZweyxXW8.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DnRs67e8.js → BackgroundAgents-BS8tAnzP.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BFEZo0vX.js → Backup-CLkG_74M.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D185sBnp.js → BaseInput-MIfNcdUZ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DUvP-2SK.js → Chat-DBwqlWWr.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-u9WKQbZb.js → ChatBubbleRenderer-6T0uoJuS.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-D8Zh_18b.js → Checkbox-DdBYhlVX.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-WdiWRdfC.js → Codegen-BR6MhiDo.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CnSoVpw6.js → Col-yO-5EbbM.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BJDHgBkw.js → Community-B608q_m7.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-uNRdmBaq.js → Compact-BmVHi7Z7.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-_6jRTJa3.js → Compliance-BQ-DzutA.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D5lnbXR6.js → Cowork-BEfLyXvi.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-D6tuGBVg.js → Cron-Cld6NX-_.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Ce5e9Lbm.js → Crosschain-CUA3nDId.js} +1 -1
- package/src/assets/web-panel/assets/{DID-1VVKZ_c1.js → DID-DSI3E9zv.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DuHcZ13w.js → Dashboard-CoWtEdhO.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BC3EK0wN.js → Dropdown-CGhZ1Dyy.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DzLpGs5E.js → EmailListRenderer-BHZe2K5q.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-x2XZHG0Z.js → EvolutionSettings-Corjo98k.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-nAavV50Y.js → FamilyGuardDashboard-dPSWF3Pt.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CCHWVS5J.js → Federation-DT-Zr78c.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CGod_3Ni.js → FormItemContext-CzKq63B0.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DIFYQa2f.js → GenericCardRenderer-CDkKrmu0.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DikM1Nc5.js → Git-BrwRnLOv.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-SzzBXCDX.js → Governance-C4PtCzod.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-wVsu9QzM.js → Inference-CVPv5nwa.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DDpVxfO-.js → KnowledgeGraph-CmT9lvED.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BnIjS-2Z.js → Logs-DaRgv7pL.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-3AsRzie6.js → MarkdownRenderer-B3zZwlSz.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-Cj3PLhXV.js → Marketplace-Bm0GGEaL.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DMKO55Kz.js → McpTools-71L5h0en.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-wWJl5yJL.js → Memory-BoWrfASi.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CJ_VIPgJ.js → MobileBridge-Dp4FcX_-.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CiJT5cF8.js → MobileProjects-00ja0Z7O.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BXmndm9a.js → Mtc-BZF6YNYp.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-C3hWIAnz.js → MtcAudit-Bp_vcI6H.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DU4OUQ7u.js → Multisig-CnCo56CS.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CyAwOeU5.js → NLProgramming-BCSzNHpv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes--YvcAg13.js → Notes-kXoQk8B7.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Dyu6dC0D.js → NotificationSettings-oN-1fkcy.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Df-0iTO2.js → OrderTableRenderer-5ZVHrVZ9.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-a9Em4Sgu.js → Organization-D4_T9Tdc.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CCQtvcsw.js → Overflow-d8vZwo9w.js} +1 -1
- package/src/assets/web-panel/assets/{P2P--CaB5e38.js → P2P-0HGUdmTv.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CmfHjoJG.js → PdhVaultBrowser-Cx8vp92z.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BCDjNsXi.js → Permissions-XHd6pVQB.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-ByprqCJd.js → PersonalDataHub-CB5bZU9T.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CZRZq-P0.js → Pipeline-Dy_qx4-0.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CeDay_dV.js → Privacy-BgR0-uEu.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CgpIfRAZ.js → ProjectInit-DAcRi1Nx.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CU8iakEs.js → ProjectSettings-Bd1Q0rK_.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-pPM0KRfQ.js → Projects-DVc9DcbM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BfpxsZh1.js → Providers-C3c4QfUT.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Dmv3rax1.js → QrScannerModal-Ba_GbitW.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DBOtB5wd.js → QuickAsk-CSn5tIkO.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-C_KnHRvS.js → Recommend-B3-8PLX0.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-OIO9kT7D.js → RemoteSession-Bd_7Zmi-.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BCfNIBt3.js → Reputation-BU2A_wy5.js} +1 -1
- package/src/assets/web-panel/assets/{Row-pnhw7dyj.js → Row-I0JFMjCz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CLJ1A3FF.js → RssFeed-CNc4Dgfz.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CSQzJ3gj.js → Search-uAA6ceLl.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CS_mvkaE.js → Security-U1SWj5nP.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DBqA2Csq.js → Services-BFjZ5ASY.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BjR3_iWH.js → Skeleton-B8InBvQf.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DwGIXRJS.js → Skills-BDYwf3QV.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DwiHHJtJ.js → Sla-Dcc6iq3q.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-QYN_t0CS.js → SpeechSettings-C3Ta-mC9.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DcXA1Jp3.js → SyncSettings-BNHEYO95.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-JbV6L1FX.js +1 -0
- package/src/assets/web-panel/assets/{Templates-C6MTuLXU.js → Templates-Yp0CUTBz.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DmbdMB2D.js → Tenant-CToNYxCo.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DYeXnE4A.js → Terminal-D7W9UqSD.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BrwLhsSE.js → TimelineRenderer-B7rqc1kE.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C5kKpRWj.js → Tokens-QP7K4ppA.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C4Zyg1jj.js → Trigger-CAWowQCR.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D0mrY3kY.js → Trust-B-0XOP97.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Bq5NMLLb.js → UkeySign-BtiZbiuj.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-OObS6euz.js → VideoEditing-Dee11JI0.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Die77ZAO.js → Wallet-y7qOmaWY.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DFpqn0WO.js → WebAuthn-CjyRRWGK.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BgKZiece.js → WorkflowEditor-D7Kiz25Q.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CbWtbRmr.js → chat-4F_yB-Gw.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Zu_TgmpG.js → colors-CrczPd-t.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BqABAwA_.js → compact-item-AenPL6fz.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DR6r1ykz.js → createContext-BcwoqPgi.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-C4qWsAvh.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BNnYbjOt.js → hasIn-YouHmap8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQHn6m4S.js → index--xwN0ZvG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxloCIDQ.js → index-31dhJpt3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuYLjMxX.js → index-4r7B8sTx.js} +1 -1
- package/src/assets/web-panel/assets/{index-hZ41pakD.js → index-5GHNjmnt.js} +1 -1
- package/src/assets/web-panel/assets/{index--vigBXnN.js → index-B5Vmr0CM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpmSx_mp.js → index-B8EXHVmM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQ1WFS4G.js → index-BHA5Fyjc.js} +1 -1
- package/src/assets/web-panel/assets/{index-ys7--3Ab.js → index-B_I1INkw.js} +1 -1
- package/src/assets/web-panel/assets/{index-CO9hQ7ri.js → index-BaguGDJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaKziwj_.js → index-BoVeUGhC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiaPl_6F.js → index-BsGhFk79.js} +1 -1
- package/src/assets/web-panel/assets/{index-DEdqCQKQ.js → index-BwUqDg9_.js} +1 -1
- package/src/assets/web-panel/assets/{index-hWckjvz-.js → index-BzyDSW_e.js} +1 -1
- package/src/assets/web-panel/assets/index-C-ltOW-O.js +1 -0
- package/src/assets/web-panel/assets/{index-P-0rrwu0.js → index-C5hpEYbx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVgcq0cJ.js → index-CHNKoexH.js} +1 -1
- package/src/assets/web-panel/assets/{index-rS1lj7A9.js → index-COgeZETv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ct4xnx2r.js → index-CWgIKCVS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYgH1j85.js → index-CZ9Ikuo6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtQDpNFU.js → index-CZT-LLGS.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9qA3lcI.js → index-CedvtJA_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuCixW1o.js → index-D0dXNgvi.js} +1 -1
- package/src/assets/web-panel/assets/{index-55eCb40A.js → index-D5Rvq67L.js} +3 -3
- package/src/assets/web-panel/assets/index-D7Ir0TiS.js +1 -0
- package/src/assets/web-panel/assets/{index-fvl4dSWm.js → index-D7m5Z4We.js} +1 -1
- package/src/assets/web-panel/assets/{index-D08ytPR_.js → index-D8a1AEVK.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbJgVaoQ.js → index-DAGfuEUu.js} +1 -1
- package/src/assets/web-panel/assets/{index-n62j7dTt.js → index-DAh5KwVL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCyrVLzm.js → index-DE3qPp9l.js} +1 -1
- package/src/assets/web-panel/assets/{index-C912Wlyi.js → index-DNHmbdGm.js} +1 -1
- package/src/assets/web-panel/assets/{index--1t0mcMh.js → index-DPrzFdCg.js} +1 -1
- package/src/assets/web-panel/assets/{index-uwS83tsv.js → index-DVrgnhfu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CR4uB9Mt.js → index-D_4VsL-L.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvQB-LK5.js → index-Dfw3WyZU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbHnxChr.js → index-GP5u18DV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkBDWART.js → index-YX4dcbgh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSNMSJAt.js → index-fCuM1NPH.js} +1 -1
- package/src/assets/web-panel/assets/{index-GrGT2dft.js → index-gy1H_PJk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmGll9ri.js → index-q_9aqSgF.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BEtGYjIT.js → initDefaultProps-Ci6zc6ZA.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cvnft4fL.js → motion-DS3kjIxw.js} +1 -1
- package/src/assets/web-panel/assets/{move-CdxE_5Yl.js → move-DCdWAKk4.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CS0l6IJn.js → mtc-parser-B0Wfce9U.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Bnji87sb.js → omit-Clx9TR6z.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BYdnEgN3.js → pickAttrs-CqSiqUvN.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DYYd524z.js → placementArrow-BWe_v-40.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BbIJIkXp.js → responsiveObserve-BSJ68bw6.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BSvuvfUS.js → slide-VRPlLxZB.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DeLSt3js.js → statusUtils-BFBVDPdB.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DpJTPfyI.js → styleChecker-CehOXy1f.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-S7WdFQMU.js → useFlexGapSupport-BCOdfK18.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CkfCBy52.js → useFs-BMKrjfJQ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CA48p8Gt.js → usePersonalDataHub-BIjZ7IgI.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-C9D1tq_L.js → vnode-oD0MXddQ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B0TG7YQI.js → zoom-D7WqH2Ai.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +26 -0
- package/src/lib/evolution/evolution-artifact-ports.js +3 -0
- package/src/lib/evolution/evolution-deployment-loader.js +125 -9
- package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
- package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
- package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
- package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
- package/src/lib/evolution/pm-exploration-ledger-adapter.js +210 -22
- package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
- package/src/lib/evolution/pm-exploration-receipts.js +626 -0
- package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
- package/src/lib/evolution/pm-exploration-rounds.js +12 -2
- package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
- package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
- package/src/lib/read-file-loop-guard.js +13 -7
- package/src/lib/task-progress-tracker.js +1 -1
- package/src/runtime/agent-core.js +14 -7
- package/src/assets/web-panel/assets/Tasks-DwWqvoyB.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CmMzSuk5.js +0 -1
- package/src/assets/web-panel/assets/index-Dw-oPGSM.js +0 -1
- package/src/assets/web-panel/assets/index-OXemaG8f.js +0 -1
|
@@ -21,9 +21,14 @@ import {
|
|
|
21
21
|
restorePmExplorationJournal,
|
|
22
22
|
verifyPmExplorationPlan,
|
|
23
23
|
} from "./pm-exploration-rounds.js";
|
|
24
|
+
import { verifyPmExplorationEvidenceBundle } from "./pm-exploration-evidence-bundle.js";
|
|
25
|
+
import { verifyPmExplorationExecutionManifest } from "./pm-exploration-execution-host.js";
|
|
26
|
+
import { inspectPmExplorationReceiptAuthority } from "./pm-exploration-receipts.js";
|
|
24
27
|
|
|
25
28
|
export const PM_EXPLORATION_LEDGER_RECORD_SCHEMA =
|
|
26
29
|
"chainlesschain.pm-exploration-ledger-record/v1";
|
|
30
|
+
export const PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA =
|
|
31
|
+
"chainlesschain.pm-exploration-ledger-record/v2";
|
|
27
32
|
export const PM_EXPLORATION_LEDGER_EVENT_TYPE =
|
|
28
33
|
"pm.exploration.snapshot-committed";
|
|
29
34
|
export const PM_EXPLORATION_LEDGER_RESTORE_SCHEMA =
|
|
@@ -55,6 +60,12 @@ const RECORD_KEYS = new Set([
|
|
|
55
60
|
"snapshot",
|
|
56
61
|
"committedAt",
|
|
57
62
|
]);
|
|
63
|
+
const AUTHENTICATED_RECORD_KEYS = new Set([
|
|
64
|
+
...RECORD_KEYS,
|
|
65
|
+
"evidenceBundle",
|
|
66
|
+
"evidenceDigest",
|
|
67
|
+
"executionManifestDigest",
|
|
68
|
+
]);
|
|
58
69
|
const DURABILITY_AUTHORITY_KEYS = new Set(["id", "retain", "resolve"]);
|
|
59
70
|
const DURABILITY_RECEIPT_KEYS = new Set([
|
|
60
71
|
"schema",
|
|
@@ -220,7 +231,19 @@ function normalizeSnapshot(plan, snapshot) {
|
|
|
220
231
|
return exportPmExplorationRecoverySnapshot(restored);
|
|
221
232
|
}
|
|
222
233
|
|
|
223
|
-
function
|
|
234
|
+
function normalizeEvidence(context, plan, snapshot, bundle) {
|
|
235
|
+
if (!context)
|
|
236
|
+
corrupt("PM exploration signed evidence verifier is unavailable");
|
|
237
|
+
return verifyPmExplorationEvidenceBundle({
|
|
238
|
+
plan,
|
|
239
|
+
manifest: context.manifest,
|
|
240
|
+
authorities: context.authorities,
|
|
241
|
+
snapshot,
|
|
242
|
+
bundle,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function parseRecord(resolution, descriptor, plan, evidenceContext) {
|
|
224
247
|
if (
|
|
225
248
|
resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
|
|
226
249
|
resolution.authenticated !== true ||
|
|
@@ -248,14 +271,23 @@ function parseRecord(resolution, descriptor, plan) {
|
|
|
248
271
|
) {
|
|
249
272
|
corrupt("PM exploration durable artifact binding is invalid");
|
|
250
273
|
}
|
|
274
|
+
const record = durable.value;
|
|
275
|
+
const authenticatedRecord =
|
|
276
|
+
record?.schema === PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA;
|
|
251
277
|
try {
|
|
252
|
-
exact(
|
|
278
|
+
exact(
|
|
279
|
+
record,
|
|
280
|
+
authenticatedRecord ? AUTHENTICATED_RECORD_KEYS : RECORD_KEYS,
|
|
281
|
+
"PM exploration ledger record",
|
|
282
|
+
);
|
|
253
283
|
} catch (cause) {
|
|
254
284
|
corrupt("PM exploration ledger record shape is invalid", { cause });
|
|
255
285
|
}
|
|
256
|
-
const record = durable.value;
|
|
257
286
|
if (
|
|
258
|
-
|
|
287
|
+
![
|
|
288
|
+
PM_EXPLORATION_LEDGER_RECORD_SCHEMA,
|
|
289
|
+
PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA,
|
|
290
|
+
].includes(record.schema) ||
|
|
259
291
|
record.descriptorDigest !== descriptor.descriptorDigest ||
|
|
260
292
|
!Number.isSafeInteger(record.revision) ||
|
|
261
293
|
record.revision < 1 ||
|
|
@@ -279,7 +311,35 @@ function parseRecord(resolution, descriptor, plan) {
|
|
|
279
311
|
) {
|
|
280
312
|
corrupt("PM exploration recovery snapshot readback differs");
|
|
281
313
|
}
|
|
282
|
-
|
|
314
|
+
let evidenceBundle = null;
|
|
315
|
+
if (authenticatedRecord) {
|
|
316
|
+
if (
|
|
317
|
+
!DIGEST.test(record.evidenceDigest ?? "") ||
|
|
318
|
+
!DIGEST.test(record.executionManifestDigest ?? "")
|
|
319
|
+
) {
|
|
320
|
+
corrupt("PM exploration signed evidence fields are invalid");
|
|
321
|
+
}
|
|
322
|
+
try {
|
|
323
|
+
evidenceBundle = normalizeEvidence(
|
|
324
|
+
evidenceContext,
|
|
325
|
+
plan,
|
|
326
|
+
snapshot,
|
|
327
|
+
record.evidenceBundle,
|
|
328
|
+
);
|
|
329
|
+
} catch (cause) {
|
|
330
|
+
corrupt("PM exploration signed evidence is invalid", { cause });
|
|
331
|
+
}
|
|
332
|
+
if (
|
|
333
|
+
evidenceBundle.evidenceDigest !== record.evidenceDigest ||
|
|
334
|
+
evidenceBundle.executionManifestDigest !==
|
|
335
|
+
record.executionManifestDigest ||
|
|
336
|
+
evidenceBundle.snapshotDigest !== snapshot.snapshotDigest ||
|
|
337
|
+
!same(evidenceBundle, record.evidenceBundle)
|
|
338
|
+
) {
|
|
339
|
+
corrupt("PM exploration signed evidence readback differs");
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return deepFreeze({ ...record, snapshot, evidenceBundle });
|
|
283
343
|
}
|
|
284
344
|
|
|
285
345
|
function assertSnapshotExtension(previous, next) {
|
|
@@ -313,8 +373,29 @@ function sameHead(left, right) {
|
|
|
313
373
|
].every((key) => left?.[key] === right?.[key]);
|
|
314
374
|
}
|
|
315
375
|
|
|
376
|
+
function recordIsAuthenticated(record) {
|
|
377
|
+
return record.schema === PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function recordEventId(record) {
|
|
381
|
+
const suffix = recordIsAuthenticated(record)
|
|
382
|
+
? hash("chainlesschain.pm-exploration-ledger-event-id/v2", {
|
|
383
|
+
snapshotDigest: record.snapshotDigest,
|
|
384
|
+
evidenceDigest: record.evidenceDigest,
|
|
385
|
+
}).slice(7)
|
|
386
|
+
: record.snapshotDigest.slice(7);
|
|
387
|
+
return `${PM_EXPLORATION_LEDGER_EVENT_TYPE}.${suffix}`;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function recordReason(record) {
|
|
391
|
+
return recordIsAuthenticated(record)
|
|
392
|
+
? `PM exploration authenticated recovery snapshot revision ${record.revision} committed`
|
|
393
|
+
: `PM exploration recovery snapshot revision ${record.revision} committed`;
|
|
394
|
+
}
|
|
395
|
+
|
|
316
396
|
function acknowledgement(descriptor, entry, recovered) {
|
|
317
|
-
|
|
397
|
+
const authenticated = recordIsAuthenticated(entry.record);
|
|
398
|
+
const result = {
|
|
318
399
|
schema: PM_EXPLORATION_LEDGER_ACK_SCHEMA,
|
|
319
400
|
authenticated: true,
|
|
320
401
|
durable: true,
|
|
@@ -330,14 +411,64 @@ function acknowledgement(descriptor, entry, recovered) {
|
|
|
330
411
|
snapshotDigest: entry.record.snapshotDigest,
|
|
331
412
|
ledgerEventDigest: entry.event.eventDigest,
|
|
332
413
|
recovered,
|
|
333
|
-
snapshotAuthenticated:
|
|
414
|
+
snapshotAuthenticated: authenticated,
|
|
334
415
|
qualifiesForPromotion: false,
|
|
416
|
+
};
|
|
417
|
+
if (authenticated) {
|
|
418
|
+
result.evidenceDigest = entry.record.evidenceDigest;
|
|
419
|
+
result.executionManifestDigest = entry.record.executionManifestDigest;
|
|
420
|
+
}
|
|
421
|
+
return deepFreeze(result);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
function normalizeEvidenceContext(executionManifest, receiptAuthorities, plan) {
|
|
425
|
+
if (executionManifest === null && receiptAuthorities === null) return null;
|
|
426
|
+
if (executionManifest === null || receiptAuthorities === null)
|
|
427
|
+
throw new TypeError(
|
|
428
|
+
"executionManifest and receiptAuthorities must be configured together",
|
|
429
|
+
);
|
|
430
|
+
const manifest = verifyPmExplorationExecutionManifest(executionManifest);
|
|
431
|
+
if (
|
|
432
|
+
manifest.planDigest !== plan.planDigest ||
|
|
433
|
+
manifest.environmentDigest !== plan.environmentDigest
|
|
434
|
+
) {
|
|
435
|
+
throw new TypeError("PM signed evidence manifest differs from the plan");
|
|
436
|
+
}
|
|
437
|
+
exact(
|
|
438
|
+
receiptAuthorities,
|
|
439
|
+
new Set(["execution", "grader", "merge", "evaluator"]),
|
|
440
|
+
"PM exploration receipt authorities",
|
|
441
|
+
);
|
|
442
|
+
for (const [role, expected] of [
|
|
443
|
+
["execution", manifest.runner],
|
|
444
|
+
["grader", manifest.grader],
|
|
445
|
+
["merge", manifest.merger],
|
|
446
|
+
["evaluator", manifest.evaluator],
|
|
447
|
+
]) {
|
|
448
|
+
if (
|
|
449
|
+
!same(
|
|
450
|
+
inspectPmExplorationReceiptAuthority(receiptAuthorities[role]),
|
|
451
|
+
expected,
|
|
452
|
+
)
|
|
453
|
+
) {
|
|
454
|
+
throw new TypeError(`PM ${role} receipt authority differs from manifest`);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return Object.freeze({
|
|
458
|
+
manifest,
|
|
459
|
+
authorities: Object.freeze({
|
|
460
|
+
execution: receiptAuthorities.execution,
|
|
461
|
+
grader: receiptAuthorities.grader,
|
|
462
|
+
merge: receiptAuthorities.merge,
|
|
463
|
+
evaluator: receiptAuthorities.evaluator,
|
|
464
|
+
}),
|
|
335
465
|
});
|
|
336
466
|
}
|
|
337
467
|
|
|
338
468
|
export class PmExplorationLedgerAdapter {
|
|
339
469
|
#append;
|
|
340
470
|
#clock;
|
|
471
|
+
#evidenceContext;
|
|
341
472
|
#plan;
|
|
342
473
|
#put;
|
|
343
474
|
#read;
|
|
@@ -352,12 +483,19 @@ export class PmExplorationLedgerAdapter {
|
|
|
352
483
|
artifactDurabilityAuthority,
|
|
353
484
|
ledger,
|
|
354
485
|
ledgerArtifactResolver,
|
|
486
|
+
executionManifest = null,
|
|
487
|
+
receiptAuthorities = null,
|
|
355
488
|
now = Date.now,
|
|
356
489
|
} = {}) {
|
|
357
490
|
this.descriptor = normalizeDescriptor(input);
|
|
358
491
|
this.#plan = snapshotPlan(plan);
|
|
359
492
|
if (this.#plan.planDigest !== this.descriptor.planDigest)
|
|
360
493
|
throw new TypeError("PM exploration plan differs from ledger descriptor");
|
|
494
|
+
this.#evidenceContext = normalizeEvidenceContext(
|
|
495
|
+
executionManifest,
|
|
496
|
+
receiptAuthorities,
|
|
497
|
+
this.#plan,
|
|
498
|
+
);
|
|
361
499
|
const trustedArtifactPorts = requireExactInstance(
|
|
362
500
|
artifactPorts,
|
|
363
501
|
EvolutionArtifactPorts.prototype,
|
|
@@ -404,7 +542,8 @@ export class PmExplorationLedgerAdapter {
|
|
|
404
542
|
this,
|
|
405
543
|
Object.freeze({
|
|
406
544
|
load: () => this.load(),
|
|
407
|
-
commitJournal: (journal) =>
|
|
545
|
+
commitJournal: (journal, evidenceBundle = null) =>
|
|
546
|
+
this.commitJournal(journal, evidenceBundle),
|
|
408
547
|
restoreLatestJournal: () => this.restoreLatestJournal(),
|
|
409
548
|
}),
|
|
410
549
|
);
|
|
@@ -437,7 +576,12 @@ export class PmExplorationLedgerAdapter {
|
|
|
437
576
|
) {
|
|
438
577
|
corrupt("PM exploration ledger subject was substituted");
|
|
439
578
|
}
|
|
440
|
-
return parseRecord(
|
|
579
|
+
return parseRecord(
|
|
580
|
+
resolution,
|
|
581
|
+
this.descriptor,
|
|
582
|
+
this.#plan,
|
|
583
|
+
this.#evidenceContext,
|
|
584
|
+
);
|
|
441
585
|
}
|
|
442
586
|
|
|
443
587
|
#historyWithIdentity() {
|
|
@@ -454,10 +598,8 @@ export class PmExplorationLedgerAdapter {
|
|
|
454
598
|
event.artifactTenantId !== this.descriptor.artifactTenantId ||
|
|
455
599
|
event.decision !== "committed" ||
|
|
456
600
|
event.skillName !== null ||
|
|
457
|
-
event.eventId !==
|
|
458
|
-
|
|
459
|
-
event.reason !==
|
|
460
|
-
`PM exploration recovery snapshot revision ${record.revision} committed` ||
|
|
601
|
+
event.eventId !== recordEventId(record) ||
|
|
602
|
+
event.reason !== recordReason(record) ||
|
|
461
603
|
event.timestamp !== new Date(record.committedAt).toISOString() ||
|
|
462
604
|
!DIGEST.test(event.eventDigest ?? "") ||
|
|
463
605
|
!Array.isArray(event.sourceRefs) ||
|
|
@@ -487,7 +629,8 @@ export class PmExplorationLedgerAdapter {
|
|
|
487
629
|
load() {
|
|
488
630
|
const latest = this.#historyWithIdentity().history.at(-1) ?? null;
|
|
489
631
|
if (!latest) return null;
|
|
490
|
-
|
|
632
|
+
const authenticated = recordIsAuthenticated(latest.record);
|
|
633
|
+
const result = {
|
|
491
634
|
schema: PM_EXPLORATION_LEDGER_RESTORE_SCHEMA,
|
|
492
635
|
authenticated: true,
|
|
493
636
|
durable: true,
|
|
@@ -503,9 +646,15 @@ export class PmExplorationLedgerAdapter {
|
|
|
503
646
|
snapshotDigest: latest.record.snapshotDigest,
|
|
504
647
|
ledgerEventDigest: latest.event.eventDigest,
|
|
505
648
|
snapshot: latest.record.snapshot,
|
|
506
|
-
snapshotAuthenticated:
|
|
649
|
+
snapshotAuthenticated: authenticated,
|
|
507
650
|
qualifiesForPromotion: false,
|
|
508
|
-
}
|
|
651
|
+
};
|
|
652
|
+
if (authenticated) {
|
|
653
|
+
result.evidenceBundle = latest.record.evidenceBundle;
|
|
654
|
+
result.evidenceDigest = latest.record.evidenceDigest;
|
|
655
|
+
result.executionManifestDigest = latest.record.executionManifestDigest;
|
|
656
|
+
}
|
|
657
|
+
return deepFreeze(result);
|
|
509
658
|
}
|
|
510
659
|
|
|
511
660
|
restoreLatestJournal() {
|
|
@@ -515,7 +664,7 @@ export class PmExplorationLedgerAdapter {
|
|
|
515
664
|
return Object.freeze({ journal, evidence });
|
|
516
665
|
}
|
|
517
666
|
|
|
518
|
-
commitJournal(journal) {
|
|
667
|
+
commitJournal(journal, evidenceBundle = null) {
|
|
519
668
|
let snapshot;
|
|
520
669
|
try {
|
|
521
670
|
snapshot = exportPmExplorationRecoverySnapshot(journal);
|
|
@@ -527,10 +676,38 @@ export class PmExplorationLedgerAdapter {
|
|
|
527
676
|
}
|
|
528
677
|
if (snapshot.planDigest !== this.descriptor.planDigest)
|
|
529
678
|
conflict("PM exploration journal belongs to another plan");
|
|
679
|
+
let authenticatedEvidence = null;
|
|
680
|
+
if (this.#evidenceContext) {
|
|
681
|
+
if (evidenceBundle === null)
|
|
682
|
+
throw new TypeError(
|
|
683
|
+
"signed PM exploration evidence is required for this adapter",
|
|
684
|
+
);
|
|
685
|
+
authenticatedEvidence = normalizeEvidence(
|
|
686
|
+
this.#evidenceContext,
|
|
687
|
+
this.#plan,
|
|
688
|
+
snapshot,
|
|
689
|
+
evidenceBundle,
|
|
690
|
+
);
|
|
691
|
+
} else if (evidenceBundle !== null) {
|
|
692
|
+
throw new TypeError(
|
|
693
|
+
"signed PM exploration evidence is not configured for this adapter",
|
|
694
|
+
);
|
|
695
|
+
}
|
|
530
696
|
const { history, identity } = this.#historyWithIdentity();
|
|
531
697
|
const latest = history.at(-1) ?? null;
|
|
532
|
-
if (latest?.record.snapshotDigest === snapshot.snapshotDigest)
|
|
533
|
-
|
|
698
|
+
if (latest?.record.snapshotDigest === snapshot.snapshotDigest) {
|
|
699
|
+
if (
|
|
700
|
+
(authenticatedEvidence === null &&
|
|
701
|
+
!recordIsAuthenticated(latest.record)) ||
|
|
702
|
+
(authenticatedEvidence !== null &&
|
|
703
|
+
recordIsAuthenticated(latest.record) &&
|
|
704
|
+
latest.record.evidenceDigest === authenticatedEvidence.evidenceDigest)
|
|
705
|
+
) {
|
|
706
|
+
return acknowledgement(this.descriptor, latest, true);
|
|
707
|
+
}
|
|
708
|
+
if (recordIsAuthenticated(latest.record))
|
|
709
|
+
conflict("PM exploration snapshot evidence cannot be replaced");
|
|
710
|
+
}
|
|
534
711
|
assertSnapshotExtension(latest?.record.snapshot ?? null, snapshot);
|
|
535
712
|
|
|
536
713
|
const revision = history.length + 1;
|
|
@@ -538,13 +715,24 @@ export class PmExplorationLedgerAdapter {
|
|
|
538
715
|
if (!Number.isSafeInteger(committedAt) || committedAt < 0)
|
|
539
716
|
throw new TypeError("PM exploration ledger clock is invalid");
|
|
540
717
|
const record = deepFreeze({
|
|
541
|
-
schema:
|
|
718
|
+
schema:
|
|
719
|
+
authenticatedEvidence === null
|
|
720
|
+
? PM_EXPLORATION_LEDGER_RECORD_SCHEMA
|
|
721
|
+
: PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA,
|
|
542
722
|
descriptorDigest: this.descriptor.descriptorDigest,
|
|
543
723
|
revision,
|
|
544
724
|
priorSnapshotDigest: latest?.record.snapshotDigest ?? null,
|
|
545
725
|
snapshotDigest: snapshot.snapshotDigest,
|
|
546
726
|
snapshot,
|
|
547
727
|
committedAt,
|
|
728
|
+
...(authenticatedEvidence === null
|
|
729
|
+
? {}
|
|
730
|
+
: {
|
|
731
|
+
evidenceBundle: authenticatedEvidence,
|
|
732
|
+
evidenceDigest: authenticatedEvidence.evidenceDigest,
|
|
733
|
+
executionManifestDigest:
|
|
734
|
+
authenticatedEvidence.executionManifestDigest,
|
|
735
|
+
}),
|
|
548
736
|
});
|
|
549
737
|
const published = this.#put(ARTIFACT_TYPE, record, {
|
|
550
738
|
audience: this.descriptor.audience,
|
|
@@ -617,7 +805,7 @@ export class PmExplorationLedgerAdapter {
|
|
|
617
805
|
) {
|
|
618
806
|
corrupt("PM exploration artifact was not durably retained");
|
|
619
807
|
}
|
|
620
|
-
const eventId =
|
|
808
|
+
const eventId = recordEventId(record);
|
|
621
809
|
try {
|
|
622
810
|
const receipt = this.#append(
|
|
623
811
|
{
|
|
@@ -625,7 +813,7 @@ export class PmExplorationLedgerAdapter {
|
|
|
625
813
|
correlationId: this.descriptor.planDigest,
|
|
626
814
|
decision: "committed",
|
|
627
815
|
eventId,
|
|
628
|
-
reason:
|
|
816
|
+
reason: recordReason(record),
|
|
629
817
|
skillName: null,
|
|
630
818
|
sourceRefs: latest ? [latest.event.subjectRef] : [],
|
|
631
819
|
subjectRef: published.ref,
|