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
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "./message-adapter.js";
|
|
13
13
|
import { JsonlSessionContextPort } from "./jsonl-session-context-port.js";
|
|
14
14
|
import { createCliContextMemoryRuntime } from "./runtime.js";
|
|
15
|
+
import { imageTransportEstimate } from "../image-token-estimate.js";
|
|
15
16
|
import { projectRuntimeTokenUsage } from "../runtime-usage-ledger.js";
|
|
16
17
|
import {
|
|
17
18
|
projectCanonicalResumeMessages,
|
|
@@ -37,8 +38,14 @@ function estimatedTokens(messages) {
|
|
|
37
38
|
typeof message?.content === "string"
|
|
38
39
|
? message.content
|
|
39
40
|
: JSON.stringify(message?.content ?? "");
|
|
41
|
+
const image = imageTransportEstimate([message]);
|
|
40
42
|
return (
|
|
41
|
-
total +
|
|
43
|
+
total +
|
|
44
|
+
Math.max(
|
|
45
|
+
1,
|
|
46
|
+
Math.ceil((Buffer.byteLength(content, "utf8") - image.bytes) / 4) +
|
|
47
|
+
image.tokens,
|
|
48
|
+
)
|
|
42
49
|
);
|
|
43
50
|
}, 0),
|
|
44
51
|
);
|
|
@@ -75,6 +82,7 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
|
|
|
75
82
|
summaryStats,
|
|
76
83
|
head,
|
|
77
84
|
physicalAuthority,
|
|
85
|
+
allowExternalization = false,
|
|
78
86
|
}) {
|
|
79
87
|
const initialHead =
|
|
80
88
|
head ||
|
|
@@ -87,10 +95,14 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
|
|
|
87
95
|
sessionId,
|
|
88
96
|
head: initialHead,
|
|
89
97
|
memoryRevision,
|
|
90
|
-
items: messagesToContextItems(messages, {
|
|
98
|
+
items: messagesToContextItems(messages, {
|
|
99
|
+
sessionId,
|
|
100
|
+
allowExternalization,
|
|
101
|
+
}),
|
|
91
102
|
},
|
|
92
103
|
]);
|
|
93
104
|
this.commit = commit;
|
|
105
|
+
this.sessionId = sessionId;
|
|
94
106
|
this.expectedMessages = [...messages];
|
|
95
107
|
this.trigger = trigger;
|
|
96
108
|
this.summaryStats = summaryStats;
|
|
@@ -102,7 +114,9 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
|
|
|
102
114
|
if (!snapshot || snapshot.head !== expectedHead) {
|
|
103
115
|
return { ok: false, currentHead: snapshot?.head || null };
|
|
104
116
|
}
|
|
105
|
-
const outputMessages = contextItemsToMessages(event.outputItems
|
|
117
|
+
const outputMessages = contextItemsToMessages(event.outputItems, {
|
|
118
|
+
sessionId: this.sessionId,
|
|
119
|
+
});
|
|
106
120
|
const stats = compactionStats(
|
|
107
121
|
event,
|
|
108
122
|
outputMessages,
|
|
@@ -143,10 +157,15 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
|
|
|
143
157
|
}
|
|
144
158
|
}
|
|
145
159
|
|
|
146
|
-
function kernelBudget(compressor, ephemeralTokens = 0) {
|
|
160
|
+
function kernelBudget(compressor, ephemeralTokens = 0, messages = []) {
|
|
147
161
|
const inputBudget = Math.max(
|
|
148
162
|
256,
|
|
149
|
-
Math.trunc(
|
|
163
|
+
Math.trunc(
|
|
164
|
+
Number(
|
|
165
|
+
compressor?.getCompactionTokenBudget?.(messages) ??
|
|
166
|
+
compressor?.maxTokens,
|
|
167
|
+
),
|
|
168
|
+
) || 16_384,
|
|
150
169
|
);
|
|
151
170
|
const reservedOutputTokens = Math.max(
|
|
152
171
|
1,
|
|
@@ -269,6 +288,7 @@ export async function compactLiveMessagesCanonical(
|
|
|
269
288
|
commit: options.commit,
|
|
270
289
|
trigger,
|
|
271
290
|
summaryStats: () => summaryStats,
|
|
291
|
+
allowExternalization: persistentSession,
|
|
272
292
|
...(verifiedAuthoritySnapshot?.head
|
|
273
293
|
? { head: verifiedAuthoritySnapshot.head, physicalAuthority: true }
|
|
274
294
|
: {}),
|
|
@@ -304,7 +324,10 @@ export async function compactLiveMessagesCanonical(
|
|
|
304
324
|
"chainlesschain.cli-live-session-head/v1",
|
|
305
325
|
),
|
|
306
326
|
memoryRevision: await bootstrapRuntime.memoryPort.getRevision(),
|
|
307
|
-
items: messagesToContextItems(messages, {
|
|
327
|
+
items: messagesToContextItems(messages, {
|
|
328
|
+
sessionId,
|
|
329
|
+
allowExternalization: false,
|
|
330
|
+
}),
|
|
308
331
|
},
|
|
309
332
|
]);
|
|
310
333
|
runtime = createCliContextMemoryRuntime({
|
|
@@ -327,7 +350,10 @@ export async function compactLiveMessagesCanonical(
|
|
|
327
350
|
const authority =
|
|
328
351
|
verifiedAuthoritySnapshot ||
|
|
329
352
|
(await runtime.sessionPort.readSnapshot(sessionId));
|
|
330
|
-
const inputItems = messagesToContextItems(messages, {
|
|
353
|
+
const inputItems = messagesToContextItems(messages, {
|
|
354
|
+
sessionId,
|
|
355
|
+
allowExternalization: true,
|
|
356
|
+
});
|
|
331
357
|
const inputDigest = canonicalDigest(
|
|
332
358
|
inputItems.map((item) => item.digest),
|
|
333
359
|
"chainlesschain.cli-live-message-set/v1",
|
|
@@ -368,8 +394,9 @@ export async function compactLiveMessagesCanonical(
|
|
|
368
394
|
compressor,
|
|
369
395
|
messagesToContextItems(
|
|
370
396
|
ephemeralMessages.map(({ message }) => message),
|
|
371
|
-
{ sessionId },
|
|
397
|
+
{ sessionId, allowExternalization: false },
|
|
372
398
|
).reduce((total, item) => total + item.tokenEstimate, 0),
|
|
399
|
+
messages,
|
|
373
400
|
),
|
|
374
401
|
sink: provider,
|
|
375
402
|
scopeAdmissions: [{ scope: "session", scopeId: sessionId }],
|
|
@@ -386,7 +413,9 @@ export async function compactLiveMessagesCanonical(
|
|
|
386
413
|
model,
|
|
387
414
|
},
|
|
388
415
|
summarizer: async (droppedItems, context) => {
|
|
389
|
-
const droppedMessages = contextItemsToMessages(droppedItems
|
|
416
|
+
const droppedMessages = contextItemsToMessages(droppedItems, {
|
|
417
|
+
sessionId,
|
|
418
|
+
});
|
|
390
419
|
const result = await compressor.compress(droppedMessages, {
|
|
391
420
|
preserveToolPairs: true,
|
|
392
421
|
...(options.compressOptions || {}),
|
|
@@ -402,6 +431,7 @@ export async function compactLiveMessagesCanonical(
|
|
|
402
431
|
parents: droppedItems,
|
|
403
432
|
operationId: context.operationId,
|
|
404
433
|
now: operationNow,
|
|
434
|
+
allowExternalization: persistentSession,
|
|
405
435
|
})
|
|
406
436
|
: null;
|
|
407
437
|
return {
|
|
@@ -492,7 +522,7 @@ export async function compactLiveMessagesCanonical(
|
|
|
492
522
|
ephemeralMessages[ephemeralIndex].sequence <= sequence
|
|
493
523
|
)
|
|
494
524
|
restoredMessages.push(ephemeralMessages[ephemeralIndex++].message);
|
|
495
|
-
restoredMessages.push(...contextItemsToMessages([item]));
|
|
525
|
+
restoredMessages.push(...contextItemsToMessages([item], { sessionId }));
|
|
496
526
|
}
|
|
497
527
|
restoredMessages.push(
|
|
498
528
|
...ephemeralMessages.slice(ephemeralIndex).map(({ message }) => message),
|
|
@@ -7,6 +7,12 @@ import {
|
|
|
7
7
|
getDurableSystemMessageProvenance,
|
|
8
8
|
markDurableSystemMessage,
|
|
9
9
|
} from "../session-message-provenance.js";
|
|
10
|
+
import { imageTransportEstimate } from "../image-token-estimate.js";
|
|
11
|
+
import {
|
|
12
|
+
SESSION_MESSAGE_BUNDLE_MAX_INLINE_BYTES,
|
|
13
|
+
readSessionMessageBundle,
|
|
14
|
+
storeSessionMessageBundle,
|
|
15
|
+
} from "./message-bundle-store.js";
|
|
10
16
|
|
|
11
17
|
const MESSAGE_BUNDLE_SCHEMA = "chainlesschain.cli-context-message-bundle/v1";
|
|
12
18
|
const DEFAULT_ALLOWED_SINKS = Object.freeze(["*"]);
|
|
@@ -102,6 +108,27 @@ function priorityForBundle(messages, sequence, pendingTool) {
|
|
|
102
108
|
return Math.min(999_999, rolePriority + Math.min(sequence, 99_999));
|
|
103
109
|
}
|
|
104
110
|
|
|
111
|
+
function contentStorageFields(
|
|
112
|
+
content,
|
|
113
|
+
sessionId,
|
|
114
|
+
allowExternalization = false,
|
|
115
|
+
) {
|
|
116
|
+
if (
|
|
117
|
+
Buffer.byteLength(content, "utf8") <=
|
|
118
|
+
SESSION_MESSAGE_BUNDLE_MAX_INLINE_BYTES
|
|
119
|
+
) {
|
|
120
|
+
return { content };
|
|
121
|
+
}
|
|
122
|
+
if (allowExternalization !== true) {
|
|
123
|
+
const error = new Error(
|
|
124
|
+
"Large image context bundles require an explicitly saved session",
|
|
125
|
+
);
|
|
126
|
+
error.code = "CC_CONTEXT_IMAGE_TRANSPORT_INVALID";
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
return { contentRef: storeSessionMessageBundle({ sessionId, content }) };
|
|
130
|
+
}
|
|
131
|
+
|
|
105
132
|
function createItem({
|
|
106
133
|
sessionId,
|
|
107
134
|
messages,
|
|
@@ -110,9 +137,11 @@ function createItem({
|
|
|
110
137
|
toolGroupId = null,
|
|
111
138
|
allowedSinks,
|
|
112
139
|
trustedSystemPolicy = false,
|
|
140
|
+
allowExternalization = false,
|
|
113
141
|
}) {
|
|
114
142
|
const payload = bundlePayload(messages);
|
|
115
143
|
const content = canonicalJson(payload);
|
|
144
|
+
const image = imageTransportEstimate(messages);
|
|
116
145
|
const sourceDigest = canonicalDigest(
|
|
117
146
|
{ sessionId, sequence, content },
|
|
118
147
|
"chainlesschain.cli-context-source/v1",
|
|
@@ -142,12 +171,13 @@ function createItem({
|
|
|
142
171
|
allowedSinks: allowedSinks || DEFAULT_ALLOWED_SINKS,
|
|
143
172
|
tokenEstimate: Math.max(
|
|
144
173
|
1,
|
|
145
|
-
Math.ceil(Buffer.byteLength(content, "utf8") / 4)
|
|
174
|
+
Math.ceil((Buffer.byteLength(content, "utf8") - image.bytes) / 4) +
|
|
175
|
+
image.tokens,
|
|
146
176
|
),
|
|
147
177
|
priority: priorityForBundle(messages, sequence, pendingTool),
|
|
148
178
|
pinned: false,
|
|
149
179
|
createdAt: new Date(sequence).toISOString(),
|
|
150
|
-
content,
|
|
180
|
+
...contentStorageFields(content, sessionId, allowExternalization),
|
|
151
181
|
...(pendingTool
|
|
152
182
|
? {
|
|
153
183
|
binding: {
|
|
@@ -212,6 +242,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
|
|
|
212
242
|
pendingTool: pending,
|
|
213
243
|
toolGroupId: `tool-group-${groupDigest.slice(7, 39)}`,
|
|
214
244
|
allowedSinks,
|
|
245
|
+
allowExternalization: options.allowExternalization === true,
|
|
215
246
|
}),
|
|
216
247
|
);
|
|
217
248
|
index = cursor - 1;
|
|
@@ -231,6 +262,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
|
|
|
231
262
|
pendingTool: true,
|
|
232
263
|
toolGroupId: `tool-orphan-${orphanDigest.slice(7, 39)}`,
|
|
233
264
|
allowedSinks,
|
|
265
|
+
allowExternalization: options.allowExternalization === true,
|
|
234
266
|
}),
|
|
235
267
|
);
|
|
236
268
|
continue;
|
|
@@ -242,6 +274,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
|
|
|
242
274
|
messages: [message],
|
|
243
275
|
sequence: index,
|
|
244
276
|
allowedSinks,
|
|
277
|
+
allowExternalization: options.allowExternalization === true,
|
|
245
278
|
trustedSystemPolicy:
|
|
246
279
|
(options.trustCurrentSystemPolicy === true && index === 0) ||
|
|
247
280
|
trustedSystemIndexes.has(index),
|
|
@@ -258,7 +291,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
|
|
|
258
291
|
);
|
|
259
292
|
const last = items[lastIndex];
|
|
260
293
|
if (last) {
|
|
261
|
-
const payload = JSON.parse(last
|
|
294
|
+
const payload = JSON.parse(loadBundleContent(last, sessionId));
|
|
262
295
|
if (payload.messages.at(-1)?.role === "user") {
|
|
263
296
|
const protectedItem = { ...last };
|
|
264
297
|
delete protectedItem.digest;
|
|
@@ -326,13 +359,34 @@ export function memoryRecordsToContextItems(recordsInput, options = {}) {
|
|
|
326
359
|
});
|
|
327
360
|
}
|
|
328
361
|
|
|
329
|
-
function
|
|
330
|
-
|
|
362
|
+
function loadBundleContent(item, expectedSessionId) {
|
|
363
|
+
let content = item?.content;
|
|
364
|
+
if (item?.contentRef !== undefined) {
|
|
365
|
+
if (
|
|
366
|
+
item.scope !== "session" ||
|
|
367
|
+
typeof item.scopeId !== "string" ||
|
|
368
|
+
(expectedSessionId !== undefined && expectedSessionId !== item.scopeId)
|
|
369
|
+
) {
|
|
370
|
+
throw new TypeError(
|
|
371
|
+
`ContextItem ${item?.itemId || "unknown"} contentRef is outside its session scope`,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
content = readSessionMessageBundle(
|
|
375
|
+
item.contentRef,
|
|
376
|
+
expectedSessionId || item.scopeId,
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
if (typeof content !== "string") {
|
|
331
380
|
throw new TypeError(
|
|
332
381
|
`ContextItem ${item?.itemId || "unknown"} has no inline content`,
|
|
333
382
|
);
|
|
334
383
|
}
|
|
335
|
-
|
|
384
|
+
return content;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function decodeBundle(item, expectedSessionId) {
|
|
388
|
+
const content = loadBundleContent(item, expectedSessionId);
|
|
389
|
+
const payload = JSON.parse(content);
|
|
336
390
|
if (
|
|
337
391
|
!payload ||
|
|
338
392
|
payload.schema !== MESSAGE_BUNDLE_SCHEMA ||
|
|
@@ -357,8 +411,10 @@ function decodeBundle(item) {
|
|
|
357
411
|
}
|
|
358
412
|
|
|
359
413
|
/** Restore replay messages in transcript order, independent of planner rank. */
|
|
360
|
-
export function contextItemsToMessages(itemsInput) {
|
|
414
|
+
export function contextItemsToMessages(itemsInput, options = {}) {
|
|
361
415
|
if (!Array.isArray(itemsInput)) throw new TypeError("items must be an array");
|
|
416
|
+
const expectedSessionId =
|
|
417
|
+
options.sessionId == null ? undefined : String(options.sessionId);
|
|
362
418
|
return [...itemsInput]
|
|
363
419
|
.map(normalizeContextItem)
|
|
364
420
|
.sort(
|
|
@@ -367,7 +423,7 @@ export function contextItemsToMessages(itemsInput) {
|
|
|
367
423
|
(right.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER) ||
|
|
368
424
|
left.itemId.localeCompare(right.itemId, "en"),
|
|
369
425
|
)
|
|
370
|
-
.flatMap(decodeBundle);
|
|
426
|
+
.flatMap((item) => decodeBundle(item, expectedSessionId));
|
|
371
427
|
}
|
|
372
428
|
|
|
373
429
|
function intersectAllowedSinks(items) {
|
|
@@ -386,6 +442,7 @@ export function createSummaryContextItem({
|
|
|
386
442
|
parents: parentInput,
|
|
387
443
|
operationId,
|
|
388
444
|
now,
|
|
445
|
+
allowExternalization = false,
|
|
389
446
|
}) {
|
|
390
447
|
const parents = parentInput.map(normalizeContextItem);
|
|
391
448
|
if (parents.length === 0) throw new TypeError("summary parents are required");
|
|
@@ -410,6 +467,17 @@ export function createSummaryContextItem({
|
|
|
410
467
|
);
|
|
411
468
|
if (summaryMessages.length === 0) return null;
|
|
412
469
|
const content = canonicalJson(bundlePayload(summaryMessages));
|
|
470
|
+
const contentFields =
|
|
471
|
+
scope === "session" && scopeId
|
|
472
|
+
? contentStorageFields(content, scopeId, allowExternalization)
|
|
473
|
+
: Buffer.byteLength(content, "utf8") <=
|
|
474
|
+
SESSION_MESSAGE_BUNDLE_MAX_INLINE_BYTES
|
|
475
|
+
? { content }
|
|
476
|
+
: (() => {
|
|
477
|
+
throw new TypeError(
|
|
478
|
+
"Large compaction summary content is supported only for a session-scoped canonical image bundle",
|
|
479
|
+
);
|
|
480
|
+
})();
|
|
413
481
|
const parentDigests = parents.map((item) => item.digest).sort();
|
|
414
482
|
const digest = canonicalDigest(
|
|
415
483
|
{ operationId, parentDigests, content },
|
|
@@ -434,6 +502,7 @@ export function createSummaryContextItem({
|
|
|
434
502
|
(item) => item.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER,
|
|
435
503
|
),
|
|
436
504
|
);
|
|
505
|
+
const image = imageTransportEstimate(summaryMessages);
|
|
437
506
|
return normalizeContextItem({
|
|
438
507
|
schemaVersion: 1,
|
|
439
508
|
itemId: `cli-summary-${digest.slice(7, 39)}`,
|
|
@@ -456,12 +525,13 @@ export function createSummaryContextItem({
|
|
|
456
525
|
allowedSinks,
|
|
457
526
|
tokenEstimate: Math.max(
|
|
458
527
|
1,
|
|
459
|
-
Math.ceil(Buffer.byteLength(content, "utf8") / 4)
|
|
528
|
+
Math.ceil((Buffer.byteLength(content, "utf8") - image.bytes) / 4) +
|
|
529
|
+
image.tokens,
|
|
460
530
|
),
|
|
461
531
|
priority: Math.max(...parents.map((item) => item.priority)),
|
|
462
532
|
pinned: false,
|
|
463
533
|
createdAt: new Date(now).toISOString(),
|
|
464
|
-
|
|
534
|
+
...contentFields,
|
|
465
535
|
});
|
|
466
536
|
}
|
|
467
537
|
|