chainlesschain 0.166.115 → 0.166.118
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 +43 -5
- package/package.json +4 -4
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BsoSoDNb.js → AIOps-BGySwMIP.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dcx7Gm5t.js → ActionButton-Chn7fBLr.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-S1hsBIz3.js → Analytics-ORH7UkGa.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B2j067qM.js → AppLayout-8xV4jWjP.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-D5iGV9ic.js → Artifacts-26SBK-x-.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C8ChVvXu.js → Audit-CtXpqbXg.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Cg97AAJS.js → BackgroundAgents-C5zLvQis.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CyxU9IUg.js → Backup-C93xY4vO.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CKlWjA8I.js → BaseInput-DpVCHfAn.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C-EqZza6.js → Chat-DM0LblR2.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BRFiXKPX.js → ChatBubbleRenderer-unlQUF1T.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-kkI13tSJ.js → Checkbox-BsAt3cKR.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-NlqEDwHK.js → Codegen-E_kp4KFd.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CfepEu79.js → Col-6msR3T6I.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BRo0qLXM.js → Community-PyX9c5D-.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BMu8TP0E.js → Compact-7G1bVDSH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-B7Q3Moef.js → Compliance-DcHN7GlD.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BVwt7Xmc.js → Cowork-WUIHJYDx.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CgBv20Qy.js → Cron-CWgCbptg.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CwcSBJk2.js → Crosschain-BzKZ6roD.js} +1 -1
- package/src/assets/web-panel/assets/{DID-d20rCiIm.js → DID-r7zxeItn.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-PpZaUYpS.js → Dashboard-D3pBiN2H.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DjsLdX_Z.js → Dropdown-C4otRJlZ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CaPkrtxn.js → EmailListRenderer-CzDTC8lm.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DDY8cQnE.js → EvolutionSettings-DGkXiIs-.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-VQavMjyj.js → FamilyGuardDashboard-BKdEyuiR.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D0GvKQgI.js → Federation-dsI-xcpf.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Dl_TWHmb.js → FormItemContext-CEEb1fMR.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Bny2uagG.js → GenericCardRenderer-D_mfO3Ts.js} +1 -1
- package/src/assets/web-panel/assets/{Git-B01KXq47.js → Git-CBwr2ZI3.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-F4c4Vwo1.js → Governance-D-Wy2Jjr.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-_025Q-8K.js → Inference-B4Yk_IRx.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DwbTmQb1.js → KnowledgeGraph-DoI7bi6m.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CnNo0hCm.js → Logs-Ce1IiKAj.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-GND_8y0V.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dkz5bv7F.js → Marketplace-CsIEByzK.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CBtRwDW_.js → McpTools-_DRzjcIn.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Y9jnyTb7.js → Memory-zvLpyi__.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Br1urkOz.js → MobileBridge-DXd1ik2Z.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DnsyuerX.js → MobileProjects-DKh2q-Y9.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-he3ZzieF.js → Mtc-Ct-fhtIx.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BadphAuN.js → MtcAudit-J4zY3Oqk.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-3_pVLymK.js → Multisig-B2HJMCKe.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DmtmHfsI.js → NLProgramming-CwcSmU4q.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CE4L2O55.js → Notes-Da53L6wb.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-B7QmfJn9.js → NotificationSettings-BxhufdrA.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-O0wRSyJ0.js → OrderTableRenderer-BoFwohAi.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BrlMSsyT.js → Organization-MIsMrUes.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CY4ULPrZ.js → Overflow-Dy2P4v3q.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-kIANZYKd.js → P2P-CD9Sxn2y.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DEgB4rvF.js → PdhVaultBrowser-BvBWgfG0.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-CWxywRp5.js → Permissions-CwOlDRis.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DAg7iCbr.js → PersonalDataHub-CZYaxEpv.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-Brc6ONnR.js → Pipeline-kLU7PUbB.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CcinYTL8.js → Privacy-BVRycSiI.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bz8XEsom.js → ProjectInit-DP3pr7uJ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CsOMlSTZ.js → ProjectSettings-CACaDYjs.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CB1k4zTC.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CeunOQiH.js → Providers-D7Y9WHRE.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CN2a2_Fb.js → QrScannerModal-CeP8xzs1.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CVeLif3e.js → QuickAsk-iJVFrhZ2.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-1k9WOEGM.js → Recommend-DmTpnagw.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Q8UCqIMw.js → RemoteSession-C6ek8Uni.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CkrCgXKM.js → Reputation-CPfwc9de.js} +1 -1
- package/src/assets/web-panel/assets/{Row-JFdvuTzi.js → Row-C1wwtSMJ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C74JHCmk.js → RssFeed-BiDJsqaH.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DrJiVO1T.js → Search-BF6Aon95.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BJzNlSJq.js → Security-Bps0XnV4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-D4TLMnJm.js → Services-uf92smGR.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-cswTDqhh.js → Skeleton-DQd4eVWW.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Bv0rM1BS.js → Skills-DgamiYa5.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-D9rE7hNh.js → Sla-CF1IVIrm.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-Bzxmjbpc.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-BwnMG8kq.js → SyncSettings-B8zKauiq.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-wJvU24cB.js → Tasks-DPKV_xSt.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CZbRU3tN.js → Templates-BikeSZIF.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-_jbpFJPZ.js → Tenant-CEaUaDkJ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BzNm5WKZ.js → Terminal-ZPgOSQ_q.js} +3 -3
- package/src/assets/web-panel/assets/{TimelineRenderer-bmybWjuS.js → TimelineRenderer-DmyB4Udk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-o1WDcqVQ.js → Tokens-g85Pm5TO.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BB1D6sIB.js → Trigger-D202hx9a.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CLxdCfy2.js → Trust-DzvQYVFy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B9LS6vS0.js → UkeySign-KRzwddVg.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Bg0-wxjz.js → VideoEditing-IRBXLO2z.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Bw0G2F6P.js → Wallet-DSf5KPgQ.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-irEiNY9b.js → WebAuthn-DNPxLTCc.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Bh08FbJs.js → WorkflowEditor-C3wAtVcK.js} +1 -1
- package/src/assets/web-panel/assets/{addon-fit-CK6X9sAG.js → addon-fit-CbkjSUJl.js} +1 -1
- package/src/assets/web-panel/assets/{chat-De-FPjVT.js → chat-q3XXUtv2.js} +1 -1
- package/src/assets/web-panel/assets/{colors-ygdyvinU.js → colors-CF54SNei.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BQ9jH9KV.js → compact-item-BaRkvZuT.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BFuVSyox.js → createContext-CDR9hsfs.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-1LO-NplX.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-i19GtR1P.js → hasIn-DlC--S8R.js} +1 -1
- package/src/assets/web-panel/assets/{index-DS1IwwGL.js → index-B0Ptc7yu.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1IsP_JO.js → index-B0V9rgdu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWfgeaG4.js → index-BEiUlFKb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTY20pWu.js → index-BJO0n1LQ.js} +1 -1
- package/src/assets/web-panel/assets/index-BLaJsev4.js +1 -0
- package/src/assets/web-panel/assets/index-BLmviChG.js +1 -0
- package/src/assets/web-panel/assets/{index-IXkif6J_.js → index-BU5DJqk7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVhtukYX.js → index-BY-Tf3OM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKlU5VZy.js → index-BZrE0Go8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw5pTpnI.js → index-BizdX2X5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGMxK155.js → index-C87Yr3h1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVnFgasM.js → index-C9Wypz9e.js} +1 -1
- package/src/assets/web-panel/assets/{index-C61w3omz.js → index-CAoG_E-q.js} +1 -1
- package/src/assets/web-panel/assets/{index-l5-J0jHx.js → index-CAxSyMrF.js} +1 -1
- package/src/assets/web-panel/assets/{index-28DjsABm.js → index-CC5HjNM6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPUCvc8i.js → index-CNZQEZ9g.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpdXhhMY.js → index-CPvIhha6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAboGZTw.js → index-CR_wqMGy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DL7ewjD2.js → index-CSClXoB3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bhf-MuUh.js → index-CZ8azVgB.js} +3 -3
- package/src/assets/web-panel/assets/{index-BaaydJcC.js → index-Ccc5z8eJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2LieObB.js → index-CeiKbM3a.js} +1 -1
- package/src/assets/web-panel/assets/{index-We2nK3ju.js → index-Cl6av3X7.js} +1 -1
- package/src/assets/web-panel/assets/{index-m8waSAyv.js → index-CtGfeD7E.js} +1 -1
- package/src/assets/web-panel/assets/{index-cDJsyAkI.js → index-Ctid12Gq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlwxUZQL.js → index-D0H-N0uG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBYiCI1d.js → index-D0vIgprF.js} +1 -1
- package/src/assets/web-panel/assets/{index-_9tUBcLm.js → index-D4wUDFRg.js} +1 -1
- package/src/assets/web-panel/assets/{index-4HoFz1MA.js → index-DJFipyK7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cq9k4-Ws.js → index-DX2REKNp.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuuOX5u3.js → index-Dc3gD0cw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgjLaB7k.js → index-DiQzer2R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMNjaSir.js → index-DntKLOs9.js} +1 -1
- package/src/assets/web-panel/assets/{index-vXtH3o6O.js → index-Dplhl6gh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLMtCKAY.js → index-Dq8q_PWB.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXrk8OYO.js → index-IVQdOBNN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBVcGaxk.js → index-Kerduyao.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKblSCL9.js → index-W6cLGjpW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgoSgmjK.js → index-qZDNFll9.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B_EZHeqN.js → initDefaultProps-Ccz7v71u.js} +1 -1
- package/src/assets/web-panel/assets/{markdown-Yo_c6Krv.js → markdown-Bq2x0XsR.js} +1 -1
- package/src/assets/web-panel/assets/markdown-DUKxbhE4.js +51 -0
- package/src/assets/web-panel/assets/{motion-BrVb_Gy1.js → motion-BlCLpVDp.js} +1 -1
- package/src/assets/web-panel/assets/{move-CKxVRL_J.js → move-B80G7fLU.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C80rvQ1J.js → mtc-parser-Djw08NJh.js} +1 -1
- package/src/assets/web-panel/assets/{omit-De5vD7BR.js → omit-Bg_G1eUr.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BTyEDjth.js → pickAttrs-Df9zYUg2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BWR94AjR.js → placementArrow-DjCDLhJ4.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-1g-Vnibk.js → responsiveObserve--Naz7NgY.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dmg6dYuF.js → slide-CHn3ald-.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ddj6rSab.js → statusUtils-BiGwoIK_.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DyP1mPDf.js → styleChecker-Zf2dQx1j.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D3d_0YuY.js → useFlexGapSupport-sLES8nyD.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-M3vq-gE2.js → useFs-DV1Hl4qu.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-GtP2TgtK.js → usePersonalDataHub-CZXr2Qxg.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BurE2ATQ.js → vnode-e8Eo3Oyl.js} +1 -1
- package/src/assets/web-panel/assets/{xterm-BZcWGsqw.js → xterm-zbskxxGA.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Ch-ViiDe.js → zoom-B8A6xKMF.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/compact.js +7 -2
- package/src/data/changelog.json +27 -1
- package/src/harness/jsonl-session-store.js +80 -74
- package/src/harness/prompt-compressor.js +57 -3
- package/src/lib/artifact-store.js +129 -20
- package/src/lib/bounded-artifact-file-read.js +128 -46
- package/src/lib/context-memory-kernel/context-image-transport.js +248 -0
- package/src/lib/context-memory-kernel/jsonl-session-context-port.js +4 -1
- package/src/lib/context-memory-kernel/live-compaction.js +40 -10
- package/src/lib/context-memory-kernel/message-adapter.js +80 -10
- package/src/lib/context-memory-kernel/message-bundle-store.js +1140 -0
- package/src/lib/context-memory-kernel/provider-context.js +23 -8
- package/src/lib/evolution/agent-evolution-ingress.js +103 -19
- package/src/lib/evolution/agent-evolution-runtime-composition.js +65 -27
- package/src/lib/evolution/agent-model-projection.js +90 -18
- package/src/lib/evolution/evidence-json-text.js +341 -42
- package/src/lib/evolution/evolution-artifact-ports.js +1005 -83
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +59 -15
- package/src/lib/evolution/evolution-evidence-projector.js +153 -16
- package/src/lib/evolution/evolution-evidence-storage-layout.js +115 -0
- package/src/lib/evolution/evolution-file-witness.js +7 -3
- package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +6 -2
- package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +6 -2
- package/src/lib/evolution/evolution-ledger.js +226 -55
- package/src/lib/evolution/evolution-private-storage.js +20 -0
- package/src/lib/evolution/evolution-run-ledger-adapter.js +298 -11
- package/src/lib/evolution/evolution-windows-directory-durability.js +215 -32
- package/src/lib/evolution/local-ui-evolution-runtime.js +3 -38
- package/src/lib/evolution/local-ui-signing-authority.js +69 -0
- package/src/lib/image-token-estimate.js +59 -0
- package/src/lib/ollama-provider-fetch.js +33 -0
- package/src/lib/provider-stream.js +14 -13
- package/src/lib/read-file-loop-guard.js +7 -4
- package/src/lib/session-history-origins.js +94 -35
- package/src/lib/session-message-provenance.js +26 -2
- package/src/lib/session-runtime-retention.js +10 -1
- package/src/lib/session-transcript-history.js +5 -1
- package/src/lib/session-transcript-migration.js +67 -12
- package/src/lib/storage-failure-cause-codes.js +449 -0
- package/src/lib/tool-result-preview.js +276 -0
- package/src/runtime/agent-core.js +111 -92
- package/src/runtime/headless-stream.js +121 -27
- package/src/assets/web-panel/assets/MarkdownRenderer-D8_iZief.js +0 -1
- package/src/assets/web-panel/assets/Projects-BeSOM6wi.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-Bfhvin8B.js +0 -1
- package/src/assets/web-panel/assets/devWarning-c2I2Rn4_.js +0 -1
- package/src/assets/web-panel/assets/index-CTs4dYcV.js +0 -1
- package/src/assets/web-panel/assets/index-DeuvaW15.js +0 -1
- package/src/assets/web-panel/assets/markdown-CsiA8-E5.js +0 -50
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import evolutionRun from "@chainlesschain/session-core/evolution-run";
|
|
2
|
+
import { types } from "node:util";
|
|
2
3
|
|
|
3
4
|
import {
|
|
4
5
|
EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
|
|
6
|
+
EvolutionArtifactPorts,
|
|
7
|
+
captureEvolutionLedgerArtifactResolverBinding,
|
|
8
|
+
captureEvolutionLedgerBatchReadWindow,
|
|
9
|
+
captureEvolutionLedgerWholeHistoryReader,
|
|
10
|
+
hasEvolutionLedgerDefaultPublication,
|
|
5
11
|
isEvolutionLedgerArtifactResolver,
|
|
6
12
|
} from "./evolution-artifact-ports.js";
|
|
7
13
|
import {
|
|
8
14
|
EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
|
|
9
15
|
EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
|
|
16
|
+
hasEvolutionLedgerDefaultAppendPorts,
|
|
17
|
+
getEvolutionLedgerVerifiedHistoryReader,
|
|
10
18
|
} from "./evolution-ledger.js";
|
|
11
19
|
|
|
12
20
|
const { EVENT_TYPES, projectEvolutionRun } = evolutionRun;
|
|
@@ -20,6 +28,7 @@ export const EVOLUTION_RUN_LEDGER_CORRUPT_CODE =
|
|
|
20
28
|
const ARTIFACT_TYPE = "evolution-run-event";
|
|
21
29
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
22
30
|
const EVIDENCE_READERS = new WeakMap();
|
|
31
|
+
const APPEND_NEXT = new WeakMap();
|
|
23
32
|
const EVENT_KEYS = new Set([
|
|
24
33
|
"schema",
|
|
25
34
|
"tenantId",
|
|
@@ -117,6 +126,80 @@ function normalizeEvent(input, descriptor) {
|
|
|
117
126
|
return Object.freeze(event);
|
|
118
127
|
}
|
|
119
128
|
|
|
129
|
+
// The new composition port accepts data only, never a sequence or a callback.
|
|
130
|
+
// Capture all nested values before any current-authority port can run.
|
|
131
|
+
function captureNextEventData(value, seen = new Set()) {
|
|
132
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
133
|
+
return value;
|
|
134
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
135
|
+
if (
|
|
136
|
+
!value ||
|
|
137
|
+
typeof value !== "object" ||
|
|
138
|
+
types.isProxy(value) ||
|
|
139
|
+
seen.has(value)
|
|
140
|
+
)
|
|
141
|
+
throw new TypeError("append-next event must contain acyclic plain data");
|
|
142
|
+
const array = Array.isArray(value);
|
|
143
|
+
const prototype = Object.getPrototypeOf(value);
|
|
144
|
+
if (!array && prototype !== Object.prototype && prototype !== null)
|
|
145
|
+
throw new TypeError("append-next event must contain plain objects");
|
|
146
|
+
const keys = Reflect.ownKeys(value).filter(
|
|
147
|
+
(key) => !(array && key === "length"),
|
|
148
|
+
);
|
|
149
|
+
if (
|
|
150
|
+
array &&
|
|
151
|
+
(keys.length !== value.length ||
|
|
152
|
+
keys.some((key, index) => key !== String(index)))
|
|
153
|
+
)
|
|
154
|
+
throw new TypeError("append-next event arrays must contain dense data");
|
|
155
|
+
const captured = array ? [] : Object.create(null);
|
|
156
|
+
seen.add(value);
|
|
157
|
+
try {
|
|
158
|
+
for (const key of keys) {
|
|
159
|
+
const property = Object.getOwnPropertyDescriptor(value, key);
|
|
160
|
+
if (
|
|
161
|
+
typeof key !== "string" ||
|
|
162
|
+
!property?.enumerable ||
|
|
163
|
+
!("value" in property)
|
|
164
|
+
)
|
|
165
|
+
throw new TypeError(
|
|
166
|
+
"append-next event cannot contain accessors or symbols",
|
|
167
|
+
);
|
|
168
|
+
captured[key] = captureNextEventData(property.value, seen);
|
|
169
|
+
}
|
|
170
|
+
} finally {
|
|
171
|
+
seen.delete(value);
|
|
172
|
+
}
|
|
173
|
+
return captured;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function normalizeNextEvent(input, descriptor) {
|
|
177
|
+
const captured = captureNextEventData(input);
|
|
178
|
+
if (
|
|
179
|
+
!captured ||
|
|
180
|
+
Array.isArray(captured) ||
|
|
181
|
+
Reflect.ownKeys(captured).length !== EVENT_KEYS.size - 1 ||
|
|
182
|
+
Reflect.ownKeys(captured).some(
|
|
183
|
+
(key) => key === "sequence" || !EVENT_KEYS.has(key),
|
|
184
|
+
)
|
|
185
|
+
)
|
|
186
|
+
throw new TypeError(
|
|
187
|
+
"append-next event requires event fields without sequence",
|
|
188
|
+
);
|
|
189
|
+
const { sequence: _temporary, ...event } = normalizeEvent(
|
|
190
|
+
{ ...captured, sequence: 1 },
|
|
191
|
+
descriptor,
|
|
192
|
+
);
|
|
193
|
+
return freeze(event);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function hasOriginalMethods(prototype, methods) {
|
|
197
|
+
return Object.entries(methods).every(
|
|
198
|
+
([name, method]) =>
|
|
199
|
+
Object.getOwnPropertyDescriptor(prototype, name)?.value === method,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
120
203
|
function parseRecord(resolution, descriptor) {
|
|
121
204
|
if (
|
|
122
205
|
resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
|
|
@@ -157,6 +240,12 @@ function parseRecord(resolution, descriptor) {
|
|
|
157
240
|
}
|
|
158
241
|
|
|
159
242
|
export class EvolutionRunLedgerAdapter {
|
|
243
|
+
#readBatches;
|
|
244
|
+
#verifiedHistory;
|
|
245
|
+
#originalRead;
|
|
246
|
+
#originalVerify;
|
|
247
|
+
#appendNextEligible;
|
|
248
|
+
|
|
160
249
|
constructor({
|
|
161
250
|
descriptor: input,
|
|
162
251
|
artifactPorts,
|
|
@@ -169,6 +258,12 @@ export class EvolutionRunLedgerAdapter {
|
|
|
169
258
|
this._read = capture(ledger, "read", "ledger");
|
|
170
259
|
this._verify = capture(ledger, "verify", "ledger");
|
|
171
260
|
this._append = capture(ledger, "appendDomainEvent", "ledger");
|
|
261
|
+
this.#originalRead = this._read;
|
|
262
|
+
this.#originalVerify = this._verify;
|
|
263
|
+
this.#verifiedHistory =
|
|
264
|
+
new.target === EvolutionRunLedgerAdapter
|
|
265
|
+
? getEvolutionLedgerVerifiedHistoryReader(ledger)
|
|
266
|
+
: null;
|
|
172
267
|
if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)) {
|
|
173
268
|
throw new TypeError(
|
|
174
269
|
"a branded EvolutionArtifactPorts ledger resolver is required",
|
|
@@ -177,7 +272,38 @@ export class EvolutionRunLedgerAdapter {
|
|
|
177
272
|
if (typeof now !== "function")
|
|
178
273
|
throw new TypeError("now must be a function");
|
|
179
274
|
this._resolve = ledgerArtifactResolver;
|
|
275
|
+
this.#readBatches = captureEvolutionLedgerBatchReadWindow(
|
|
276
|
+
ledgerArtifactResolver,
|
|
277
|
+
);
|
|
180
278
|
this._now = now;
|
|
279
|
+
const binding = captureEvolutionLedgerArtifactResolverBinding(
|
|
280
|
+
ledgerArtifactResolver,
|
|
281
|
+
);
|
|
282
|
+
this.#appendNextEligible = () =>
|
|
283
|
+
this.#verifiedHistory !== null &&
|
|
284
|
+
hasEvolutionLedgerDefaultAppendPorts(ledger) &&
|
|
285
|
+
Object.getPrototypeOf(this) === EvolutionRunLedgerAdapter.prototype &&
|
|
286
|
+
binding.matchesArtifactPorts(artifactPorts) &&
|
|
287
|
+
hasEvolutionLedgerDefaultPublication(this._resolve) &&
|
|
288
|
+
Object.getPrototypeOf(artifactPorts) ===
|
|
289
|
+
EvolutionArtifactPorts.prototype &&
|
|
290
|
+
hasOriginalMethods(
|
|
291
|
+
EvolutionRunLedgerAdapter.prototype,
|
|
292
|
+
ORIGINAL_RUN_METHODS,
|
|
293
|
+
) &&
|
|
294
|
+
captureEvolutionLedgerWholeHistoryReader(this._resolve) !== null;
|
|
295
|
+
if (
|
|
296
|
+
new.target === EvolutionRunLedgerAdapter &&
|
|
297
|
+
this.#appendNextEligible()
|
|
298
|
+
) {
|
|
299
|
+
APPEND_NEXT.set(
|
|
300
|
+
this,
|
|
301
|
+
Object.freeze({
|
|
302
|
+
eligible: this.#appendNextEligible,
|
|
303
|
+
append: Object.freeze((input) => this.#appendNext(input)),
|
|
304
|
+
}),
|
|
305
|
+
);
|
|
306
|
+
}
|
|
181
307
|
const load = this.load.bind(this);
|
|
182
308
|
const verify = this._verify;
|
|
183
309
|
const checkpoints = new WeakSet();
|
|
@@ -258,7 +384,10 @@ export class EvolutionRunLedgerAdapter {
|
|
|
258
384
|
}
|
|
259
385
|
|
|
260
386
|
_domainEvents() {
|
|
261
|
-
|
|
387
|
+
return this.#filterDomainEvents(this._read());
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
#filterDomainEvents(events) {
|
|
262
391
|
if (!Array.isArray(events)) {
|
|
263
392
|
fail(
|
|
264
393
|
EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
|
|
@@ -275,6 +404,17 @@ export class EvolutionRunLedgerAdapter {
|
|
|
275
404
|
}
|
|
276
405
|
|
|
277
406
|
_resolveEvent(domainEvent) {
|
|
407
|
+
return this.#resolveEventWithIdentity(domainEvent, this._verify());
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
#resolveEventWithIdentity(domainEvent, identity) {
|
|
411
|
+
return this.#parseResolvedEvent(
|
|
412
|
+
domainEvent,
|
|
413
|
+
this._resolve(this.#eventRequest(domainEvent, identity)),
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
#eventRequest(domainEvent, identity) {
|
|
278
418
|
if (
|
|
279
419
|
!domainEvent?.subjectRef ||
|
|
280
420
|
typeof domainEvent.subjectRef.ref !== "string" ||
|
|
@@ -285,13 +425,15 @@ export class EvolutionRunLedgerAdapter {
|
|
|
285
425
|
"EvolutionRun ledger subject reference is invalid",
|
|
286
426
|
);
|
|
287
427
|
}
|
|
288
|
-
|
|
289
|
-
const resolution = this._resolve({
|
|
428
|
+
return {
|
|
290
429
|
epoch: identity.epoch,
|
|
291
430
|
ledgerId: identity.ledgerId,
|
|
292
431
|
ref: domainEvent.subjectRef,
|
|
293
432
|
tenantId: this.descriptor.artifactTenantId,
|
|
294
|
-
}
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
#parseResolvedEvent(domainEvent, resolution) {
|
|
295
437
|
if (
|
|
296
438
|
resolution?.ref !== domainEvent.subjectRef.ref ||
|
|
297
439
|
resolution.digest !== domainEvent.subjectRef.digest
|
|
@@ -305,10 +447,106 @@ export class EvolutionRunLedgerAdapter {
|
|
|
305
447
|
}
|
|
306
448
|
|
|
307
449
|
_entries() {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
450
|
+
return this.#readEntriesWithAuthority().entries;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
#readEntriesWithAuthority() {
|
|
454
|
+
// Authenticate one frontier around the complete synchronous read. Verifying
|
|
455
|
+
// the full ledger once for every Run event made each load quadratic in its
|
|
456
|
+
// history. Artifact bytes and current authority are still checked for each
|
|
457
|
+
// item; the identity is scoped to this read and is never caller supplied.
|
|
458
|
+
// Original ledgers can supply authority and events from one locked load.
|
|
459
|
+
// Custom/subclass ports keep their established calls and override behavior.
|
|
460
|
+
const history =
|
|
461
|
+
this.#verifiedHistory &&
|
|
462
|
+
this._read === this.#originalRead &&
|
|
463
|
+
this._verify === this.#originalVerify &&
|
|
464
|
+
this._domainEvents === ORIGINAL_DOMAIN_EVENTS
|
|
465
|
+
? this.#verifiedHistory()
|
|
466
|
+
: null;
|
|
467
|
+
const { verifiedAt: _beforeObservation, ...before } = clone(
|
|
468
|
+
history === null ? this._verify() : history.authority,
|
|
469
|
+
);
|
|
470
|
+
const domainEvents =
|
|
471
|
+
history === null
|
|
472
|
+
? this._domainEvents()
|
|
473
|
+
: this.#filterDomainEvents(history.events);
|
|
474
|
+
const entries = [];
|
|
475
|
+
try {
|
|
476
|
+
// Original ports can seal the complete history between two index reads.
|
|
477
|
+
// Custom ports retain their established chunk callback window. Both
|
|
478
|
+
// paths freshly authenticate each payload and its current authority.
|
|
479
|
+
const readWholeHistory =
|
|
480
|
+
history !== null
|
|
481
|
+
? captureEvolutionLedgerWholeHistoryReader(this._resolve)
|
|
482
|
+
: null;
|
|
483
|
+
if (domainEvents.length > 0 && readWholeHistory !== null) {
|
|
484
|
+
const resolutions = readWholeHistory(
|
|
485
|
+
domainEvents.map((event) => this.#eventRequest(event, before)),
|
|
486
|
+
);
|
|
487
|
+
if (
|
|
488
|
+
!Array.isArray(resolutions) ||
|
|
489
|
+
resolutions.length !== domainEvents.length
|
|
490
|
+
) {
|
|
491
|
+
fail(
|
|
492
|
+
EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
|
|
493
|
+
"EvolutionRun artifact history is incomplete",
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
for (let index = 0; index < domainEvents.length; index += 1) {
|
|
497
|
+
const domainEvent = domainEvents[index];
|
|
498
|
+
entries.push({
|
|
499
|
+
domainEvent,
|
|
500
|
+
event: this.#parseResolvedEvent(domainEvent, resolutions[index]),
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
} else if (domainEvents.length > 0)
|
|
504
|
+
this.#readBatches((resolveBatch) => {
|
|
505
|
+
for (let offset = 0; offset < domainEvents.length; offset += 128) {
|
|
506
|
+
const batch = domainEvents.slice(offset, offset + 128);
|
|
507
|
+
const resolutions = resolveBatch(
|
|
508
|
+
batch.map((event) => this.#eventRequest(event, before)),
|
|
509
|
+
);
|
|
510
|
+
if (
|
|
511
|
+
!Array.isArray(resolutions) ||
|
|
512
|
+
resolutions.length !== batch.length
|
|
513
|
+
) {
|
|
514
|
+
fail(
|
|
515
|
+
EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
|
|
516
|
+
"EvolutionRun artifact batch is incomplete",
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
entries.push(
|
|
520
|
+
...batch.map((domainEvent, index) => ({
|
|
521
|
+
domainEvent,
|
|
522
|
+
event: this.#parseResolvedEvent(
|
|
523
|
+
domainEvent,
|
|
524
|
+
resolutions[index],
|
|
525
|
+
),
|
|
526
|
+
})),
|
|
527
|
+
);
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
} catch (cause) {
|
|
531
|
+
// A concurrent append can invalidate the batch index before the normal
|
|
532
|
+
// final frontier check. Preserve the established conflict classification
|
|
533
|
+
// only when a fresh successful verification proves that frontier changed.
|
|
534
|
+
let afterFailure = null;
|
|
535
|
+
try {
|
|
536
|
+
const { verifiedAt: _observation, ...identity } = clone(this._verify());
|
|
537
|
+
afterFailure = identity;
|
|
538
|
+
} catch {
|
|
539
|
+
/* Unverified state must not reclassify an artifact failure. */
|
|
540
|
+
}
|
|
541
|
+
if (afterFailure !== null && !same(before, afterFailure)) {
|
|
542
|
+
fail(
|
|
543
|
+
EVOLUTION_RUN_LEDGER_CONFLICT_CODE,
|
|
544
|
+
"EvolutionRun ledger frontier changed during recovery",
|
|
545
|
+
{ cause },
|
|
546
|
+
);
|
|
547
|
+
}
|
|
548
|
+
throw cause;
|
|
549
|
+
}
|
|
312
550
|
entries.sort((left, right) => left.event.sequence - right.event.sequence);
|
|
313
551
|
for (let index = 0; index < entries.length; index += 1) {
|
|
314
552
|
const entry = entries[index];
|
|
@@ -353,7 +591,14 @@ export class EvolutionRunLedgerAdapter {
|
|
|
353
591
|
runId: this.descriptor.runId,
|
|
354
592
|
});
|
|
355
593
|
}
|
|
356
|
-
|
|
594
|
+
const { verifiedAt: _afterObservation, ...after } = clone(this._verify());
|
|
595
|
+
if (!same(before, after)) {
|
|
596
|
+
fail(
|
|
597
|
+
EVOLUTION_RUN_LEDGER_CONFLICT_CODE,
|
|
598
|
+
"EvolutionRun ledger frontier changed during recovery",
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
return { entries, authority: after };
|
|
357
602
|
}
|
|
358
603
|
|
|
359
604
|
load() {
|
|
@@ -374,6 +619,24 @@ export class EvolutionRunLedgerAdapter {
|
|
|
374
619
|
appendEvent(input) {
|
|
375
620
|
const event = normalizeEvent(input, this.descriptor);
|
|
376
621
|
const before = this._entries();
|
|
622
|
+
return this.#appendPrepared(event, before, false);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
#appendNext(input) {
|
|
626
|
+
const captured = normalizeNextEvent(input, this.descriptor);
|
|
627
|
+
if (!this.#appendNextEligible()) {
|
|
628
|
+
const current = this.load();
|
|
629
|
+
return this.appendEvent({
|
|
630
|
+
...captured,
|
|
631
|
+
sequence: current.events.length + 1,
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
const before = this._entries();
|
|
635
|
+
const event = Object.freeze({ ...captured, sequence: before.length + 1 });
|
|
636
|
+
return this.#appendPrepared(event, before, true);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
#appendPrepared(event, before, allowPrivateHeadProof) {
|
|
377
640
|
const duplicate = before.find(
|
|
378
641
|
({ event: stored }) => stored.eventId === event.eventId,
|
|
379
642
|
);
|
|
@@ -419,8 +682,17 @@ export class EvolutionRunLedgerAdapter {
|
|
|
419
682
|
"EvolutionRun event persistence was not durably confirmed",
|
|
420
683
|
);
|
|
421
684
|
}
|
|
422
|
-
|
|
423
|
-
|
|
685
|
+
let head, currentBeforeAppend;
|
|
686
|
+
if (allowPrivateHeadProof && this.#appendNextEligible()) {
|
|
687
|
+
// This authority comes from the same complete post-publication read,
|
|
688
|
+
// including its final frontier comparison. It never survives this call.
|
|
689
|
+
const current = this.#readEntriesWithAuthority();
|
|
690
|
+
head = current.authority;
|
|
691
|
+
currentBeforeAppend = current.entries;
|
|
692
|
+
} else {
|
|
693
|
+
head = this._verify();
|
|
694
|
+
currentBeforeAppend = this._entries();
|
|
695
|
+
}
|
|
424
696
|
if (
|
|
425
697
|
currentBeforeAppend.length !== before.length ||
|
|
426
698
|
currentBeforeAppend.some(
|
|
@@ -493,6 +765,21 @@ export class EvolutionRunLedgerAdapter {
|
|
|
493
765
|
}
|
|
494
766
|
}
|
|
495
767
|
|
|
768
|
+
const ORIGINAL_DOMAIN_EVENTS =
|
|
769
|
+
EvolutionRunLedgerAdapter.prototype._domainEvents;
|
|
770
|
+
const ORIGINAL_RUN_METHODS = Object.freeze({
|
|
771
|
+
load: EvolutionRunLedgerAdapter.prototype.load,
|
|
772
|
+
appendEvent: EvolutionRunLedgerAdapter.prototype.appendEvent,
|
|
773
|
+
_entries: EvolutionRunLedgerAdapter.prototype._entries,
|
|
774
|
+
_domainEvents: ORIGINAL_DOMAIN_EVENTS,
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
/** Optional original-port composition; no caller sequence or authority input. */
|
|
778
|
+
export function captureEvolutionRunAppendNext(adapter) {
|
|
779
|
+
const capability = APPEND_NEXT.get(adapter);
|
|
780
|
+
return capability?.eligible() ? capability.append : null;
|
|
781
|
+
}
|
|
782
|
+
|
|
496
783
|
/** Read-only capability registered only by the real Run adapter constructor. */
|
|
497
784
|
export function captureEvolutionRunEvidenceReader(adapter) {
|
|
498
785
|
const reader = EVIDENCE_READERS.get(adapter);
|