chainlesschain 0.166.77 → 0.166.79
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 +9 -8
- package/completions/_cc +1 -1
- package/completions/cc.bash +1 -1
- package/completions/cc.fish +1 -1
- package/completions/cc.ps1 +1 -1
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +10 -0
- package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
- package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
- package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
- package/src/assets/web-panel/assets/{AIOps-CpiCBhRh.js → AIOps-CwD6Pm_Y.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CnU-Xvx-.js → ActionButton-Du5Rp-O6.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BJW-CNtf.js → Analytics-DY9l72ma.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-UFQJL3G9.js → AppLayout-7t1WIaCJ.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Dr_IUDoY.js → Artifacts-BLIA5yny.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-aglWo6rr.js → Audit-BC_N0QTg.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Dm_TCiXC.js → BackgroundAgents-CA7SxDtg.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DUdX4-gA.js → Backup-BZ4AzS1_.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BTcLjy1o.js → BaseInput-BhiggGaH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Bhy9qZrl.js → Chat-CDdBoIBI.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-hsBsrl31.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CblrPa21.js → Checkbox-asoMKSEK.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-SEAHzOlr.js → Codegen-B0gElLdm.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DJz8iFOR.js → Col-DrNzLpF6.js} +1 -1
- package/src/assets/web-panel/assets/{Community-RufKhcQt.js → Community-DCzB5qkI.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dlifx08U.js → Compact-Db-Eua_j.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DdhQWcHh.js → Compliance-B76NByjl.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BLNn6oOm.js → Cowork-C-nK6Qpk.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dv-JWY2d.js → Cron-C-GlQO19.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-k7Pz7O-b.js → Crosschain-Cuuz9IIh.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C_10syUW.js → DID-gwFaT973.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CMyH6Szx.js → Dashboard-DHDt5jEf.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DjmD2Saa.js → Dropdown-CJ9kog-Y.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-36_IRUSo.js → EmailListRenderer-DOSXFRiQ.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-CmtU0XmM.js → EvolutionSettings-CHYMP7rR.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DEgf9kyP.js → FamilyGuardDashboard-C1gzG5EK.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DGO1wQls.js → Federation-CEdNVWUw.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Doj1FmKW.js → FormItemContext-CwVOWPX8.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-GzOU27iT.js → GenericCardRenderer-CgNUs3kT.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Dd7D1EDK.js → Git-DM4MNnQo.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-6IY8LcjI.js → Governance-DdOtjkvd.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BB9gl8q1.js → Inference-28PidFfr.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CeCed5wd.js → KnowledgeGraph-Bpj_qNUK.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CYOeHuaI.js → Logs-C6Ix19Ay.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Bk8Zqc2R.js → MarkdownRenderer-Bj6mtPbf.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-D-_xgHgM.js → Marketplace-DqkhRSMP.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-NnaUTF5t.js → McpTools-1WQ2SjaE.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CndN9pMt.js → Memory-BWTi7v6R.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BXblFmhY.js → MobileBridge-DB4wu3UE.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CC26Dm2k.js → MobileProjects-Bh9pWx2f.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BhaqWCiW.js → Mtc-BVF1Wrno.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-D6fktM2w.js → MtcAudit-DtNfslPf.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CFvahz7s.js → Multisig-4qcXP0bf.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Co73Ivya.js → NLProgramming-BRJl5Ehw.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-B4g33L1o.js → Notes-BRY_bgMk.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-lXd17EbN.js → NotificationSettings-DirXMFz4.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BiOB0GIi.js → OrderTableRenderer-BlrY8lwu.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-JQ7_wQIA.js → Organization-CVzQ1vO-.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-gwgJgozQ.js → Overflow-A3rXTPG4.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D9L_0gie.js → P2P-Db9ABWz0.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CbOPsFE9.js → PdhVaultBrowser-CPv0H2OZ.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Cz42HNQf.js → Permissions-COnW4sIR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DjorYtrF.js → PersonalDataHub-C1hG7rp7.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DyWPhmm5.js → Pipeline---GLRDEe.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DyfLMl2j.js → Privacy-aaN9R3Lu.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyqDx1OE.js → ProjectInit-C-kw49hE.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DsBw0Csy.js → ProjectSettings-y5tTkBTC.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DZHlhyPB.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CCI_klN-.js → Providers-LqxnV72o.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DNsnlDdS.js → QrScannerModal-D_q-Y5F0.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-B9r2iaee.js → QuickAsk-_E_KB5o8.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BJDe03GR.js → Recommend-BN8S5WJA.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-J7JR3rRo.js → RemoteSession-BFzrY_aW.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DR39AJeV.js → Reputation-C1HCLaTV.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Dh77m3NZ.js → Row-B8T2-Qv7.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BUdg28nJ.js → RssFeed-CNQLk8v1.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BNC7sGhj.js → Search-BOx720Kc.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DISENGI7.js → Security-Ds8z6PF6.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BBBGpJ1-.js → Services-C0-YkRSF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DMcIoIv2.js → Skeleton-DUHlSySD.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-QAyFbI3r.js → Skills-C8CBbbh0.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CSg5wLH7.js → Sla-lQltyYfB.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DMPxTc5x.js → SpeechSettings-B5vyOma-.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CPG7l30y.js → SyncSettings-BKDPu_y-.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Y1kOVvVL.js → Tasks-Bgvf7LTx.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-jt9NagL0.js → Templates-BMZyYYS7.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauuJICx.js → Tenant-7PYTig8f.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-E9rnKeGq.js → Terminal-C2W0LMdR.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Cc7z2APG.js → TimelineRenderer-CqREew_l.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CV0UthRA.js → Tokens-BhTyxTuD.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BFcJJGfu.js → Trigger-DxNSSZy_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BAydbNJA.js → Trust-Dy_wfbIh.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DcOS6sqL.js → UkeySign-DJC5ANqx.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BLHJZvif.js → VideoEditing-CNFevrO4.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-4QFLKHwW.js → Wallet-CXzuS1YK.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BocEOOSj.js → WebAuthn-BWS6HP8c.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DCfF7D0B.js → WorkflowEditor-swiN_7Vj.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CxvfsYGr.js → chat-NwH7qlBs.js} +1 -1
- package/src/assets/web-panel/assets/{colors-KtQB9DmQ.js → colors-h6nRhBTw.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dx4J6arN.js → compact-item-BQ6B6rP2.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Cq0olgzo.js → createContext-CQkJuRcG.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Bz6vqBGV.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Bf9-h3D-.js → hasIn-Diwl1WyI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpO6DKuu.js → index-0ZztPzIm.js} +1 -1
- package/src/assets/web-panel/assets/index-1b7DEw-w.js +1 -0
- package/src/assets/web-panel/assets/{index-DQDR-_ai.js → index-AzeSQJDK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMcC4cbj.js → index-B3QgcUBV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO6XvO-C.js → index-B5gj_uCC.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClUfSChI.js → index-BI3ALCgN.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3xfiItB.js → index-BRl3KUj0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFdEDvFn.js → index-BYYb8oeV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqnggDos.js → index-BcKDUGYf.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_8UcDan.js → index-BcjlIMP9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmQuG0fr.js → index-BheCvudN.js} +1 -1
- package/src/assets/web-panel/assets/{index-iE9tqEN5.js → index-BjcARUtr.js} +1 -1
- package/src/assets/web-panel/assets/{index-nmyDOh_b.js → index-BnQUin2K.js} +1 -1
- package/src/assets/web-panel/assets/{index-Br1mDMfO.js → index-Bs6HyCfP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZWjYfWt.js → index-BvPz6vZ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-0fi8DIVQ.js → index-C3Ye1ISy.js} +1 -1
- package/src/assets/web-panel/assets/{index-hSzyoXri.js → index-C7-T-u0L.js} +3 -3
- package/src/assets/web-panel/assets/{index-DfrFNMvz.js → index-CRWpixu2.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9yaUHm9.js → index-CatBQDSQ.js} +1 -1
- package/src/assets/web-panel/assets/index-CfD4tMuW.js +1 -0
- package/src/assets/web-panel/assets/{index-DMR-keCL.js → index-CqH-oOR3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cy865Hhq.js → index-CwsoVDi-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI5bRqNG.js → index-CyBtEVLM.js} +1 -1
- package/src/assets/web-panel/assets/{index-gt5N6VM_.js → index-D5P498Rk.js} +1 -1
- package/src/assets/web-panel/assets/{index-6dDDSCHD.js → index-DKaB4xTf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKtQyb2o.js → index-DQYZa1Ci.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIclw-E.js → index-DZ9CNcbJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-_FIz-0tp.js → index-DZAsByy4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBRlZdZj.js → index-D_HY0nyN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsCdl2Od.js → index-Da8frO_A.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cfsn7N18.js → index-DjB8IC9D.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeYP_kT9.js → index-Dwpthe2b.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8WuPI-h.js → index-Fm95dO4u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK2U_AHi.js → index-GTefQSbY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnU-dUWd.js → index-OEWSrqit.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDAe1UmZ.js → index-TYMmUsxZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2BfSIrn.js → index-iHNOr_wL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz7f4Jaq.js → index-mxxZtsHp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHmdMKYl.js → index-pYwYBVeQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DvzKJ6o5.js → initDefaultProps-BeUrpC_H.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D1yTvmxW.js → motion-CHW5EXt1.js} +1 -1
- package/src/assets/web-panel/assets/{move-DxtSIF8K.js → move-CWaoWJvF.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDsQgIHY.js → mtc-parser-CEC6Us1u.js} +1 -1
- package/src/assets/web-panel/assets/{omit-UVBJW8kh.js → omit-1D-kP_Qj.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D4QqtTyX.js → pickAttrs-CsS0myLl.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-QXmu6vBf.js → placementArrow-bMThOvkI.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D-PmXO9M.js → responsiveObserve-B72knbW8.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CKbGxEZJ.js → slide-C3bI_2yy.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BbgXPkXm.js → statusUtils-0-FmcCAS.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DOr9rk68.js → styleChecker-DXUyqoWY.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-B2wO2r36.js → useFlexGapSupport-BSSnL3f1.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-SeVGBK34.js → useFs-B0Cvvl0S.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DUJBCxjD.js → usePersonalDataHub-6D-d4WU5.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CF4EYsig.js → vnode-zjIrlxT_.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-pRUs5pqI.js → zoom-Hw7NEisu.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/command-manifest.json +1 -1
- package/src/commands/checkpoint.js +42 -7
- package/src/commands/orchestrate.js +85 -25
- package/src/commands/session-location.js +5 -0
- package/src/commands/session-show.js +109 -1
- package/src/commands/session.js +26 -2
- package/src/commands/tokens.js +9 -4
- package/src/data/changelog.json +26 -0
- package/src/generated/cc-agent-protocol.schema.json +71 -0
- package/src/harness/jsonl-session-store.js +357 -114
- package/src/harness/mcp-client.js +44 -1
- package/src/lib/agent-router.js +35 -7
- package/src/lib/agent-sandbox.js +302 -2
- package/src/lib/app-server/server.js +14 -0
- package/src/lib/background-agent-supervisor.js +14 -4
- package/src/lib/causal-observability.js +64 -1
- package/src/lib/checkpoint-summary-projection.js +98 -0
- package/src/lib/checkpoint-timeline-authority.js +15 -51
- package/src/lib/claude-code-bridge.js +302 -60
- package/src/lib/codex-app-server-adapter.js +161 -35
- package/src/lib/cost-budget.js +4 -0
- package/src/lib/doctor-checkup.js +31 -2
- package/src/lib/durable-security-store.js +6 -1
- package/src/lib/evolution/evolution-artifact-identity.js +21 -0
- package/src/lib/evolution/evolution-artifact-ports.js +5 -11
- package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
- package/src/lib/execution-location-failure-site.js +63 -0
- package/src/lib/execution-location-target.js +102 -8
- package/src/lib/external-agent-adapters.js +2 -0
- package/src/lib/image-file-boundary.js +154 -0
- package/src/lib/image-input.js +16 -3
- package/src/lib/llm-pricing.js +114 -8
- package/src/lib/lsp/code-intelligence.js +7 -1
- package/src/lib/mcp-call-ledger-store.js +7 -2
- package/src/lib/model-capabilities.js +21 -10
- package/src/lib/model-context-catalog.js +60 -1
- package/src/lib/openai-responses.js +7 -1
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/process-execution-broker/index.js +93 -1
- package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
- package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
- package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
- package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
- package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
- package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
- package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
- package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
- package/src/lib/runtime-usage-ledger.js +3 -0
- package/src/lib/sandbox-docker-egress.js +507 -0
- package/src/lib/sandbox-egress-proxy.js +167 -10
- package/src/lib/sandbox-egress-worker-thread.js +38 -0
- package/src/lib/sandbox-egress-worker.js +196 -0
- package/src/lib/secure-fs.js +158 -42
- package/src/lib/session-branch-history.js +240 -0
- package/src/lib/session-history-origins.js +285 -0
- package/src/lib/session-input-receipt.js +110 -0
- package/src/lib/session-resource-budget.js +8 -8
- package/src/lib/session-transcript-history.js +456 -0
- package/src/lib/session-transcript-page.js +164 -0
- package/src/lib/session-transcript-reference.js +38 -0
- package/src/lib/session-usage.js +8 -0
- package/src/lib/token-tracker.js +32 -54
- package/src/lib/usage-pricing-context.js +93 -0
- package/src/runtime/agent-core.js +141 -21
- package/src/runtime/headless-stream.js +202 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-D0WrJQaQ.js +0 -1
- package/src/assets/web-panel/assets/Projects-CRaSI25Z.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CmgDNkoO.js +0 -1
- package/src/assets/web-panel/assets/index-BpIZ2S01.js +0 -1
- package/src/assets/web-panel/assets/index-C-VmKuyv.js +0 -1
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { canonicalDigest } from "@chainlesschain/context-memory-kernel";
|
|
2
|
+
import {
|
|
3
|
+
contextItemsToMessages,
|
|
4
|
+
messagesToContextItems,
|
|
5
|
+
} from "./context-memory-kernel/message-adapter.js";
|
|
6
|
+
import {
|
|
7
|
+
decodeVerifiedPersistedMessage,
|
|
8
|
+
encodePersistedMessage,
|
|
9
|
+
getDurableSystemMessageProvenance,
|
|
10
|
+
DURABLE_SYSTEM_MESSAGE_KINDS,
|
|
11
|
+
} from "./session-message-provenance.js";
|
|
12
|
+
import {
|
|
13
|
+
HISTORY_SUMMARY_SCHEMA,
|
|
14
|
+
projectCheckpointSummary,
|
|
15
|
+
} from "./checkpoint-summary-projection.js";
|
|
16
|
+
|
|
17
|
+
export const HISTORY_PREFIX_SCHEMA = "chainlesschain.session-history-prefix/v1";
|
|
18
|
+
const MAX_CONTEXT_BYTES = 8 * 1024 * 1024;
|
|
19
|
+
const MAX_CONTEXT_MESSAGES = 32768;
|
|
20
|
+
const displayable = (message) =>
|
|
21
|
+
["user", "assistant", "tool"].includes(message?.role);
|
|
22
|
+
const derivedSystemKinds = new Set([
|
|
23
|
+
DURABLE_SYSTEM_MESSAGE_KINDS.COMPACT_SUMMARY,
|
|
24
|
+
DURABLE_SYSTEM_MESSAGE_KINDS.COMPACT_TOOL_COLLAPSE,
|
|
25
|
+
DURABLE_SYSTEM_MESSAGE_KINDS.CHECKPOINT_SUMMARY,
|
|
26
|
+
DURABLE_SYSTEM_MESSAGE_KINDS.MIGRATION_SUMMARY,
|
|
27
|
+
]);
|
|
28
|
+
const historyBearing = (entry) =>
|
|
29
|
+
displayable(entry.message) ||
|
|
30
|
+
Boolean(entry.origin) ||
|
|
31
|
+
derivedSystemKinds.has(
|
|
32
|
+
getDurableSystemMessageProvenance(entry.message)?.kind,
|
|
33
|
+
);
|
|
34
|
+
const fingerprint = (messages) =>
|
|
35
|
+
canonicalDigest(messages.map(encodePersistedMessage));
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Origins belong to positions in the current display history, never to equal
|
|
39
|
+
* text. Only indexed, digest-checked compaction sources can carry them forward.
|
|
40
|
+
* The optional mapping is bounded independently of the display page; losing it
|
|
41
|
+
* forces a later rewind to use its explicit snapshot.
|
|
42
|
+
*/
|
|
43
|
+
export function createSessionHistoryOrigins() {
|
|
44
|
+
let context = [];
|
|
45
|
+
let bytes = 0;
|
|
46
|
+
|
|
47
|
+
function replace(entries) {
|
|
48
|
+
context = [];
|
|
49
|
+
bytes = 0;
|
|
50
|
+
for (const entry of entries) {
|
|
51
|
+
append(entry.message, entry.origin);
|
|
52
|
+
if (!context) break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function append(message, origin) {
|
|
56
|
+
if (!context || typeof message?.role !== "string") return;
|
|
57
|
+
bytes += Buffer.byteLength(JSON.stringify(message));
|
|
58
|
+
if (bytes > MAX_CONTEXT_BYTES || context.length >= MAX_CONTEXT_MESSAGES) {
|
|
59
|
+
context = null;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
context.push({ message, origin });
|
|
63
|
+
}
|
|
64
|
+
function span(entries) {
|
|
65
|
+
const visible = entries.filter(historyBearing);
|
|
66
|
+
if (visible.length === 0) return null;
|
|
67
|
+
if (visible.some((entry) => !entry.origin)) return null;
|
|
68
|
+
return {
|
|
69
|
+
first: Math.min(...visible.map((entry) => entry.origin.first)),
|
|
70
|
+
last: Math.max(...visible.map((entry) => entry.origin.last)),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const api = {
|
|
75
|
+
appendPersisted(message, ordinal) {
|
|
76
|
+
if (!context) return;
|
|
77
|
+
append(
|
|
78
|
+
decodeVerifiedPersistedMessage(message),
|
|
79
|
+
displayable(message) ? { first: ordinal, last: ordinal } : null,
|
|
80
|
+
);
|
|
81
|
+
},
|
|
82
|
+
appendMappedPersisted(message, origin) {
|
|
83
|
+
append(decodeVerifiedPersistedMessage(message), origin);
|
|
84
|
+
},
|
|
85
|
+
branchPrefix(messages, head, count) {
|
|
86
|
+
if (!context) return null;
|
|
87
|
+
const cutoff = api.rewind(
|
|
88
|
+
{
|
|
89
|
+
prevHash: head,
|
|
90
|
+
data: {
|
|
91
|
+
action: "restore-conversation",
|
|
92
|
+
messages: messages.map(encodePersistedMessage),
|
|
93
|
+
historyPrefix: {
|
|
94
|
+
schema: HISTORY_PREFIX_SCHEMA,
|
|
95
|
+
sourceHead: head,
|
|
96
|
+
sourceMessageCount: context.length,
|
|
97
|
+
retainedMessageCount: messages.length,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
count,
|
|
102
|
+
);
|
|
103
|
+
return cutoff === null
|
|
104
|
+
? null
|
|
105
|
+
: {
|
|
106
|
+
cutoff,
|
|
107
|
+
entries: context.map((entry) => ({
|
|
108
|
+
message: entry.message,
|
|
109
|
+
origin: entry.origin ? { ...entry.origin } : null,
|
|
110
|
+
})),
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
snapshot(messages) {
|
|
114
|
+
let ordinal = 0;
|
|
115
|
+
replace(
|
|
116
|
+
messages.map((message) => ({
|
|
117
|
+
message: decodeVerifiedPersistedMessage(message),
|
|
118
|
+
origin: displayable(message)
|
|
119
|
+
? { first: ordinal, last: ordinal++ }
|
|
120
|
+
: null,
|
|
121
|
+
})),
|
|
122
|
+
);
|
|
123
|
+
},
|
|
124
|
+
compact(data) {
|
|
125
|
+
const canonical = data.canonical;
|
|
126
|
+
let entries = null;
|
|
127
|
+
try {
|
|
128
|
+
if (context) {
|
|
129
|
+
const originals = messagesToContextItems(
|
|
130
|
+
context.map((entry) => entry.message),
|
|
131
|
+
{ sessionId: canonical.sessionId },
|
|
132
|
+
);
|
|
133
|
+
const byDigest = new Map(
|
|
134
|
+
originals.map((item) => [item.digest, item]),
|
|
135
|
+
);
|
|
136
|
+
const bySequence = new Map(
|
|
137
|
+
originals.map((item) => [item.sourceRef.eventSequence, item]),
|
|
138
|
+
);
|
|
139
|
+
const itemEntries = (item) =>
|
|
140
|
+
context.slice(
|
|
141
|
+
item.sourceRef.eventSequence,
|
|
142
|
+
item.sourceRef.eventSequence +
|
|
143
|
+
contextItemsToMessages([item]).length,
|
|
144
|
+
);
|
|
145
|
+
entries = [...canonical.outputItems]
|
|
146
|
+
.sort(
|
|
147
|
+
(left, right) =>
|
|
148
|
+
(left.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER) -
|
|
149
|
+
(right.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER) ||
|
|
150
|
+
left.itemId.localeCompare(right.itemId, "en"),
|
|
151
|
+
)
|
|
152
|
+
.flatMap((item) => {
|
|
153
|
+
const messages = contextItemsToMessages([item]);
|
|
154
|
+
const source = bySequence.get(item.sourceRef.eventSequence);
|
|
155
|
+
if (
|
|
156
|
+
item.sourceRef.store === "cli-jsonl-session" &&
|
|
157
|
+
source?.sourceRef.digest === item.sourceRef.digest &&
|
|
158
|
+
source.content === item.content
|
|
159
|
+
) {
|
|
160
|
+
return itemEntries(source);
|
|
161
|
+
}
|
|
162
|
+
let origin = null;
|
|
163
|
+
if (
|
|
164
|
+
item.sourceRef.store === "cli-context-summary" &&
|
|
165
|
+
item.provenance?.parentDigests?.length > 0
|
|
166
|
+
) {
|
|
167
|
+
const digests = item.provenance.parentDigests;
|
|
168
|
+
if (
|
|
169
|
+
digests.length <= originals.length &&
|
|
170
|
+
new Set(digests).size === digests.length
|
|
171
|
+
) {
|
|
172
|
+
const parents = digests.map((digest) => byDigest.get(digest));
|
|
173
|
+
if (parents.every(Boolean))
|
|
174
|
+
origin = span(parents.flatMap(itemEntries));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return messages.map((message) => ({ message, origin }));
|
|
178
|
+
});
|
|
179
|
+
const persisted = data.messages.map(decodeVerifiedPersistedMessage);
|
|
180
|
+
if (
|
|
181
|
+
fingerprint(entries.map((entry) => entry.message)) !==
|
|
182
|
+
fingerprint(persisted)
|
|
183
|
+
)
|
|
184
|
+
entries = null;
|
|
185
|
+
}
|
|
186
|
+
} catch {
|
|
187
|
+
entries = null;
|
|
188
|
+
}
|
|
189
|
+
replace(
|
|
190
|
+
entries ||
|
|
191
|
+
data.messages.map((message) => ({
|
|
192
|
+
message: decodeVerifiedPersistedMessage(message),
|
|
193
|
+
origin: null,
|
|
194
|
+
})),
|
|
195
|
+
);
|
|
196
|
+
},
|
|
197
|
+
summarize(event) {
|
|
198
|
+
const data = event.data;
|
|
199
|
+
const certificate = data.historySummary;
|
|
200
|
+
if (
|
|
201
|
+
!context ||
|
|
202
|
+
certificate?.schema !== HISTORY_SUMMARY_SCHEMA ||
|
|
203
|
+
!/^[a-f0-9]{64}$/u.test(certificate.sourceHead) ||
|
|
204
|
+
certificate.sourceHead !== event.prevHash ||
|
|
205
|
+
certificate.sourceMessageCount !== context.length
|
|
206
|
+
)
|
|
207
|
+
return false;
|
|
208
|
+
try {
|
|
209
|
+
const projected = projectCheckpointSummary({
|
|
210
|
+
messages: context.map((entry) => entry.message),
|
|
211
|
+
action: data.action,
|
|
212
|
+
turnId: data.turnId,
|
|
213
|
+
start: certificate.start,
|
|
214
|
+
end: certificate.end,
|
|
215
|
+
});
|
|
216
|
+
if (
|
|
217
|
+
fingerprint(projected.map((entry) => entry.message)) !==
|
|
218
|
+
fingerprint(data.messages.map(decodeVerifiedPersistedMessage))
|
|
219
|
+
)
|
|
220
|
+
return false;
|
|
221
|
+
const entries = projected.map(({ message, sourceIndexes }) => ({
|
|
222
|
+
message,
|
|
223
|
+
origin: span(sourceIndexes.map((index) => context[index])),
|
|
224
|
+
}));
|
|
225
|
+
replace(entries);
|
|
226
|
+
return true;
|
|
227
|
+
} catch {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
rewind(event, count) {
|
|
232
|
+
const data = event.data;
|
|
233
|
+
const prefix = data.historyPrefix;
|
|
234
|
+
if (
|
|
235
|
+
!context ||
|
|
236
|
+
prefix?.schema !== HISTORY_PREFIX_SCHEMA ||
|
|
237
|
+
!/^[a-f0-9]{64}$/u.test(prefix.sourceHead) ||
|
|
238
|
+
prefix.sourceHead !== event.prevHash ||
|
|
239
|
+
prefix.sourceMessageCount !== context.length ||
|
|
240
|
+
!["restore-conversation", "restore-both"].includes(data.action) ||
|
|
241
|
+
!Number.isSafeInteger(prefix.retainedMessageCount) ||
|
|
242
|
+
prefix.retainedMessageCount < 0 ||
|
|
243
|
+
prefix.retainedMessageCount >= context.length
|
|
244
|
+
)
|
|
245
|
+
return null;
|
|
246
|
+
const retained = context.slice(0, prefix.retainedMessageCount);
|
|
247
|
+
const removed = context.slice(prefix.retainedMessageCount);
|
|
248
|
+
const anchor = removed[0];
|
|
249
|
+
if (
|
|
250
|
+
anchor.message.role !== "user" ||
|
|
251
|
+
!anchor.origin ||
|
|
252
|
+
anchor.origin.first !== anchor.origin.last
|
|
253
|
+
)
|
|
254
|
+
return null;
|
|
255
|
+
const cutoff = anchor.origin.first;
|
|
256
|
+
if (
|
|
257
|
+
cutoff < 0 ||
|
|
258
|
+
cutoff > count ||
|
|
259
|
+
retained.some(
|
|
260
|
+
(entry) =>
|
|
261
|
+
historyBearing(entry) &&
|
|
262
|
+
(!entry.origin || entry.origin.last >= cutoff),
|
|
263
|
+
) ||
|
|
264
|
+
removed.some(
|
|
265
|
+
(entry) =>
|
|
266
|
+
historyBearing(entry) &&
|
|
267
|
+
(!entry.origin || entry.origin.first < cutoff),
|
|
268
|
+
)
|
|
269
|
+
)
|
|
270
|
+
return null;
|
|
271
|
+
try {
|
|
272
|
+
if (
|
|
273
|
+
fingerprint(retained.map((entry) => entry.message)) !==
|
|
274
|
+
fingerprint(data.messages.map(decodeVerifiedPersistedMessage))
|
|
275
|
+
)
|
|
276
|
+
return null;
|
|
277
|
+
} catch {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
replace(retained);
|
|
281
|
+
return cutoff;
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
return api;
|
|
285
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
appendAuthorityEventWithVerifiedProjection,
|
|
4
|
+
readVerifiedProjection,
|
|
5
|
+
} from "../harness/jsonl-session-store.js";
|
|
6
|
+
|
|
7
|
+
export function validateClientMessageId(value) {
|
|
8
|
+
if (typeof value !== "string" || !/^[a-zA-Z0-9_-]{1,80}$/u.test(value)) {
|
|
9
|
+
throw new TypeError(
|
|
10
|
+
"client_message_id must be 1–80 ASCII letters, digits, _ or -",
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function inputSubmissionDigest(input) {
|
|
17
|
+
return createHash("sha256").update(JSON.stringify(input)).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function receiptProjection(sessionId, clientMessageId) {
|
|
21
|
+
let receipt = null;
|
|
22
|
+
return {
|
|
23
|
+
accept(event) {
|
|
24
|
+
if (
|
|
25
|
+
event.type !== "user_message" ||
|
|
26
|
+
event.data?.clientMessageId !== clientMessageId
|
|
27
|
+
)
|
|
28
|
+
return;
|
|
29
|
+
const next = {
|
|
30
|
+
sessionId,
|
|
31
|
+
clientMessageId,
|
|
32
|
+
inputDigest: event.data.inputDigest,
|
|
33
|
+
eventHash: event.hash,
|
|
34
|
+
};
|
|
35
|
+
if (
|
|
36
|
+
!/^[a-f0-9]{64}$/u.test(next.inputDigest || "") ||
|
|
37
|
+
!/^[a-f0-9]{64}$/u.test(next.eventHash || "") ||
|
|
38
|
+
receipt
|
|
39
|
+
) {
|
|
40
|
+
throw new Error("Invalid or repeated durable input receipt");
|
|
41
|
+
}
|
|
42
|
+
receipt = next;
|
|
43
|
+
},
|
|
44
|
+
finish() {
|
|
45
|
+
return receipt;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function readSessionInputReceipt(sessionId, clientMessageId) {
|
|
51
|
+
validateClientMessageId(clientMessageId);
|
|
52
|
+
const receipt = readVerifiedProjection(sessionId, () =>
|
|
53
|
+
receiptProjection(sessionId, clientMessageId),
|
|
54
|
+
);
|
|
55
|
+
return {
|
|
56
|
+
schema: "chainlesschain.input-receipt/v1",
|
|
57
|
+
sessionId,
|
|
58
|
+
clientMessageId,
|
|
59
|
+
accepted: !!receipt,
|
|
60
|
+
receipt,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Acceptance and deduplication share the existing canonical writer authority. */
|
|
65
|
+
export function appendSessionInputWithReceipt(
|
|
66
|
+
sessionId,
|
|
67
|
+
content,
|
|
68
|
+
clientMessageId,
|
|
69
|
+
submission = content,
|
|
70
|
+
) {
|
|
71
|
+
validateClientMessageId(clientMessageId);
|
|
72
|
+
const inputDigest = inputSubmissionDigest(submission);
|
|
73
|
+
let duplicate = null;
|
|
74
|
+
try {
|
|
75
|
+
const appended = appendAuthorityEventWithVerifiedProjection(
|
|
76
|
+
sessionId,
|
|
77
|
+
"user_message",
|
|
78
|
+
{
|
|
79
|
+
role: "user",
|
|
80
|
+
content,
|
|
81
|
+
clientMessageId,
|
|
82
|
+
inputDigest,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
createProjection: () => receiptProjection(sessionId, clientMessageId),
|
|
86
|
+
validateProjection: (receipt) => {
|
|
87
|
+
if (!receipt) return;
|
|
88
|
+
if (receipt.inputDigest !== inputDigest)
|
|
89
|
+
throw new Error(
|
|
90
|
+
"client_message_id was already used for different input",
|
|
91
|
+
);
|
|
92
|
+
// The store has verified the full chain and anchor before invoking
|
|
93
|
+
// this callback. Rejecting here means no append can have started.
|
|
94
|
+
duplicate = receipt;
|
|
95
|
+
throw new Error("Input already accepted");
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
);
|
|
99
|
+
return {
|
|
100
|
+
sessionId,
|
|
101
|
+
clientMessageId,
|
|
102
|
+
inputDigest,
|
|
103
|
+
eventHash: appended.hash,
|
|
104
|
+
duplicate: false,
|
|
105
|
+
};
|
|
106
|
+
} catch (error) {
|
|
107
|
+
if (duplicate) return { ...duplicate, duplicate: true };
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
18
18
|
import { createHash, randomUUID } from "node:crypto";
|
|
19
19
|
import { CostBudget } from "./cost-budget.js";
|
|
20
|
+
import { projectUsagePricingContext } from "./usage-pricing-context.js";
|
|
20
21
|
|
|
21
22
|
export const SESSION_RESOURCE_BUDGET_VERSION = 1;
|
|
22
23
|
export const SESSION_BUDGET_RECOVERY_ADJUDICATION_SCHEMA =
|
|
@@ -123,6 +124,7 @@ function normalizeRecoveryIdentity(field, raw) {
|
|
|
123
124
|
typeof raw !== "string" ||
|
|
124
125
|
raw.length < 1 ||
|
|
125
126
|
raw.length > 256 ||
|
|
127
|
+
// eslint-disable-next-line no-control-regex -- Recovery IDs forbid exactly C0 and DEL.
|
|
126
128
|
/[\u0000-\u001f\u007f]/u.test(raw)
|
|
127
129
|
) {
|
|
128
130
|
throw new TypeError(`invalid session budget recovery ${field}`);
|
|
@@ -256,10 +258,7 @@ function cloneCostBudget(cost) {
|
|
|
256
258
|
return clone;
|
|
257
259
|
}
|
|
258
260
|
|
|
259
|
-
function calculateUsageAccounting(
|
|
260
|
-
{ tokens, cost, unpricedUsage },
|
|
261
|
-
usageInput,
|
|
262
|
-
) {
|
|
261
|
+
function calculateUsageAccounting({ tokens, cost, unpricedUsage }, usageInput) {
|
|
263
262
|
const { tokenCount, pricedRecords } = normalizeUsageAccounting(usageInput);
|
|
264
263
|
const nextTokens = tokens + tokenCount;
|
|
265
264
|
if (!Number.isSafeInteger(nextTokens)) {
|
|
@@ -293,7 +292,10 @@ function canonicalRecoveryUsageRecord(record, field) {
|
|
|
293
292
|
return {
|
|
294
293
|
provider: normalizeRecoveryIdentity(`${field} provider`, record.provider),
|
|
295
294
|
model: normalizeRecoveryIdentity(`${field} model`, record.model),
|
|
296
|
-
usage:
|
|
295
|
+
usage: {
|
|
296
|
+
...normalizeUsageTokens(record.usage).fields,
|
|
297
|
+
...projectUsagePricingContext(record.usage),
|
|
298
|
+
},
|
|
297
299
|
};
|
|
298
300
|
}
|
|
299
301
|
|
|
@@ -1832,9 +1834,7 @@ export class SessionResourceBudget {
|
|
|
1832
1834
|
const sortedAbandoned = [...abandonedIds].sort();
|
|
1833
1835
|
const sortedSettlements = normalizedSettlements
|
|
1834
1836
|
.map((record) => record.canonical)
|
|
1835
|
-
.sort((left, right) =>
|
|
1836
|
-
left.authorityId.localeCompare(right.authorityId),
|
|
1837
|
-
);
|
|
1837
|
+
.sort((left, right) => left.authorityId.localeCompare(right.authorityId));
|
|
1838
1838
|
const tokenDelta = accounting.tokens - this.tokens;
|
|
1839
1839
|
const spentUsdDelta = accounting.cost.spentUsd - this.cost.spentUsd;
|
|
1840
1840
|
const adjudicationCore = {
|