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
package/src/lib/token-tracker.js
CHANGED
|
@@ -7,45 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { createHash } from "crypto";
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
* Pricing data per million tokens (USD)
|
|
12
|
-
*/
|
|
13
|
-
const PRICING = {
|
|
14
|
-
ollama: { input: 0, output: 0 },
|
|
15
|
-
openai: {
|
|
16
|
-
"gpt-4o": { input: 2.5, output: 10 },
|
|
17
|
-
"gpt-4o-mini": { input: 0.15, output: 0.6 },
|
|
18
|
-
"gpt-4-turbo": { input: 10, output: 30 },
|
|
19
|
-
"gpt-3.5-turbo": { input: 0.5, output: 1.5 },
|
|
20
|
-
o1: { input: 15, output: 60 },
|
|
21
|
-
_default: { input: 2.5, output: 10 },
|
|
22
|
-
},
|
|
23
|
-
anthropic: {
|
|
24
|
-
// Current Anthropic list prices (USD/1M), verified 2026-06-21 vs the
|
|
25
|
-
// claude-api reference. Lookup is EXACT-key (calculateCost), so keep current
|
|
26
|
-
// model ids listed or they fall back to the Sonnet _default and mis-price —
|
|
27
|
-
// e.g. claude-opus-4-8 would otherwise be billed at $3/$15 not $5/$25. The
|
|
28
|
-
// Opus tier dropped to $5/$25 with Opus 4.5; Haiku 4.5 is $1/$5.
|
|
29
|
-
"claude-opus-4-8": { input: 5, output: 25 },
|
|
30
|
-
"claude-opus-4-7": { input: 5, output: 25 },
|
|
31
|
-
"claude-opus-4-6": { input: 5, output: 25 },
|
|
32
|
-
"claude-opus-4-5": { input: 5, output: 25 },
|
|
33
|
-
"claude-sonnet-4-6": { input: 3, output: 15 },
|
|
34
|
-
"claude-haiku-4-5": { input: 1, output: 5 },
|
|
35
|
-
"claude-haiku-4-5-20251001": { input: 1, output: 5 },
|
|
36
|
-
"claude-fable-5": { input: 10, output: 50 },
|
|
37
|
-
_default: { input: 3, output: 15 },
|
|
38
|
-
},
|
|
39
|
-
deepseek: {
|
|
40
|
-
"deepseek-chat": { input: 0.14, output: 0.28 },
|
|
41
|
-
_default: { input: 0.14, output: 0.28 },
|
|
42
|
-
},
|
|
43
|
-
dashscope: {
|
|
44
|
-
"qwen-turbo": { input: 0.3, output: 0.6 },
|
|
45
|
-
"qwen-plus": { input: 0.8, output: 2 },
|
|
46
|
-
_default: { input: 0.3, output: 0.6 },
|
|
47
|
-
},
|
|
48
|
-
};
|
|
10
|
+
import { estimateCost } from "./llm-pricing.js";
|
|
49
11
|
|
|
50
12
|
function ensureTokenTable(db) {
|
|
51
13
|
db.exec(`
|
|
@@ -67,19 +29,22 @@ function ensureTokenTable(db) {
|
|
|
67
29
|
/**
|
|
68
30
|
* Calculate cost for a given usage
|
|
69
31
|
*/
|
|
70
|
-
export function calculateCost(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
32
|
+
export function calculateCost(
|
|
33
|
+
provider,
|
|
34
|
+
model,
|
|
35
|
+
inputTokens,
|
|
36
|
+
outputTokens,
|
|
37
|
+
options = {},
|
|
38
|
+
) {
|
|
39
|
+
const estimate = estimateCost({
|
|
40
|
+
...options,
|
|
41
|
+
provider,
|
|
42
|
+
model,
|
|
43
|
+
inputTokens,
|
|
44
|
+
outputTokens,
|
|
45
|
+
});
|
|
46
|
+
// SQL NULL represents unpriced usage; it must never be confused with free.
|
|
47
|
+
return estimate.matched ? estimate.totalCost : null;
|
|
83
48
|
}
|
|
84
49
|
|
|
85
50
|
/**
|
|
@@ -98,7 +63,13 @@ export function recordUsage(db, params) {
|
|
|
98
63
|
} = params;
|
|
99
64
|
|
|
100
65
|
const totalTokens = inputTokens + outputTokens;
|
|
101
|
-
const costUsd = calculateCost(
|
|
66
|
+
const costUsd = calculateCost(
|
|
67
|
+
provider,
|
|
68
|
+
model,
|
|
69
|
+
inputTokens,
|
|
70
|
+
outputTokens,
|
|
71
|
+
params,
|
|
72
|
+
);
|
|
102
73
|
|
|
103
74
|
const id = createHash("sha256")
|
|
104
75
|
.update(`${Date.now()}-${Math.random()}`)
|
|
@@ -120,7 +91,7 @@ export function recordUsage(db, params) {
|
|
|
120
91
|
endpoint,
|
|
121
92
|
);
|
|
122
93
|
|
|
123
|
-
return { id, totalTokens, costUsd };
|
|
94
|
+
return { id, totalTokens, costUsd, priced: costUsd !== null };
|
|
124
95
|
}
|
|
125
96
|
|
|
126
97
|
/**
|
|
@@ -132,6 +103,7 @@ export function getUsageStats(db, options = {}) {
|
|
|
132
103
|
const { startDate, endDate, provider, model } = options;
|
|
133
104
|
let sql = `SELECT
|
|
134
105
|
COUNT(*) as total_calls,
|
|
106
|
+
COUNT(cost_usd) as priced_calls,
|
|
135
107
|
COALESCE(SUM(input_tokens), 0) as total_input_tokens,
|
|
136
108
|
COALESCE(SUM(output_tokens), 0) as total_output_tokens,
|
|
137
109
|
COALESCE(SUM(total_tokens), 0) as total_tokens,
|
|
@@ -165,6 +137,11 @@ export function getUsageStats(db, options = {}) {
|
|
|
165
137
|
total_tokens: result?.total_tokens || 0,
|
|
166
138
|
total_cost_usd: result?.total_cost_usd || 0,
|
|
167
139
|
avg_response_time_ms: result?.avg_response_time_ms || 0,
|
|
140
|
+
unpriced_calls: Math.max(
|
|
141
|
+
0,
|
|
142
|
+
(result?.total_calls || 0) -
|
|
143
|
+
(result?.priced_calls ?? result?.total_calls ?? 0),
|
|
144
|
+
),
|
|
168
145
|
};
|
|
169
146
|
}
|
|
170
147
|
|
|
@@ -178,6 +155,7 @@ export function getCostBreakdown(db) {
|
|
|
178
155
|
.prepare(
|
|
179
156
|
`SELECT provider, model,
|
|
180
157
|
COUNT(*) as calls,
|
|
158
|
+
COUNT(*) - COUNT(cost_usd) as unpriced_calls,
|
|
181
159
|
SUM(input_tokens) as input_tokens,
|
|
182
160
|
SUM(output_tokens) as output_tokens,
|
|
183
161
|
SUM(total_tokens) as total_tokens,
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DOCUMENTED_OPENAI_MODELS,
|
|
3
|
+
GPT6_PRICING_TERMS,
|
|
4
|
+
} from "./model-context-catalog.js";
|
|
5
|
+
|
|
6
|
+
/** Only bounded, non-secret pricing labels may enter the durable usage ledger. */
|
|
7
|
+
export function projectUsagePricingContext(usage = {}) {
|
|
8
|
+
const projected = {};
|
|
9
|
+
for (const [key, alias] of [
|
|
10
|
+
["service_tier", "serviceTier"],
|
|
11
|
+
["regional_processing", "regionalProcessing"],
|
|
12
|
+
]) {
|
|
13
|
+
if (!Object.hasOwn(usage, key) && !Object.hasOwn(usage, alias)) continue;
|
|
14
|
+
if (
|
|
15
|
+
Object.hasOwn(usage, key) &&
|
|
16
|
+
Object.hasOwn(usage, alias) &&
|
|
17
|
+
usage[key] !== usage[alias]
|
|
18
|
+
) {
|
|
19
|
+
throw new TypeError(`usage pricing aliases conflict: ${key}`);
|
|
20
|
+
}
|
|
21
|
+
const value = Object.hasOwn(usage, key) ? usage[key] : usage[alias];
|
|
22
|
+
if (key === "service_tier") {
|
|
23
|
+
projected[key] =
|
|
24
|
+
typeof value === "string" &&
|
|
25
|
+
Object.hasOwn(GPT6_PRICING_TERMS.serviceMultipliers, value)
|
|
26
|
+
? value
|
|
27
|
+
: "unknown";
|
|
28
|
+
} else {
|
|
29
|
+
if (typeof value !== "boolean")
|
|
30
|
+
throw new TypeError("usage regional processing must be boolean");
|
|
31
|
+
projected[key] = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return projected;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Preserve per-request thresholds in a bounded set of aggregate price buckets. */
|
|
38
|
+
export function mergeUsagePricingBucket(entry, usage) {
|
|
39
|
+
if (
|
|
40
|
+
String(entry.provider).toLowerCase() !== "openai" ||
|
|
41
|
+
!DOCUMENTED_OPENAI_MODELS[String(entry.model).toLowerCase()]?.pricing
|
|
42
|
+
)
|
|
43
|
+
return;
|
|
44
|
+
const metadata = projectUsagePricingContext(usage);
|
|
45
|
+
const promptTokens =
|
|
46
|
+
usage.requestInputTokens ??
|
|
47
|
+
usage.inputTokens +
|
|
48
|
+
(usage.cacheReadTokens || 0) +
|
|
49
|
+
(usage.cacheCreationTokens || 0);
|
|
50
|
+
const long = promptTokens > GPT6_PRICING_TERMS.longContext.threshold;
|
|
51
|
+
const serviceTier = metadata.service_tier || "standard";
|
|
52
|
+
const regionalProcessing = metadata.regional_processing === true;
|
|
53
|
+
entry.pricingBuckets ||= [];
|
|
54
|
+
let bucket = entry.pricingBuckets.find(
|
|
55
|
+
(item) =>
|
|
56
|
+
item.serviceTier === serviceTier &&
|
|
57
|
+
item.regionalProcessing === regionalProcessing &&
|
|
58
|
+
item.requestInputTokens > GPT6_PRICING_TERMS.longContext.threshold ===
|
|
59
|
+
long,
|
|
60
|
+
);
|
|
61
|
+
if (!bucket) {
|
|
62
|
+
bucket = {
|
|
63
|
+
inputTokens: 0,
|
|
64
|
+
outputTokens: 0,
|
|
65
|
+
cacheReadTokens: 0,
|
|
66
|
+
cacheCreationTokens: 0,
|
|
67
|
+
totalTokens: 0,
|
|
68
|
+
calls: 0,
|
|
69
|
+
serviceTier,
|
|
70
|
+
regionalProcessing,
|
|
71
|
+
requestInputTokens: promptTokens,
|
|
72
|
+
};
|
|
73
|
+
entry.pricingBuckets.push(bucket);
|
|
74
|
+
}
|
|
75
|
+
for (const key of [
|
|
76
|
+
"inputTokens",
|
|
77
|
+
"outputTokens",
|
|
78
|
+
"cacheReadTokens",
|
|
79
|
+
"cacheCreationTokens",
|
|
80
|
+
"totalTokens",
|
|
81
|
+
"calls",
|
|
82
|
+
]) {
|
|
83
|
+
const value = usage[key] ?? (key === "calls" ? 1 : 0);
|
|
84
|
+
if (
|
|
85
|
+
!Number.isSafeInteger(value) ||
|
|
86
|
+
value < 0 ||
|
|
87
|
+
!Number.isSafeInteger(bucket[key] + value)
|
|
88
|
+
) {
|
|
89
|
+
throw new TypeError(`invalid pricing bucket ${key}`);
|
|
90
|
+
}
|
|
91
|
+
bucket[key] += value;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -6637,34 +6637,55 @@ async function executeToolInner(
|
|
|
6637
6637
|
);
|
|
6638
6638
|
}
|
|
6639
6639
|
await admitShellDispatch();
|
|
6640
|
-
const {
|
|
6641
|
-
|
|
6642
|
-
|
|
6643
|
-
|
|
6644
|
-
|
|
6645
|
-
|
|
6640
|
+
const {
|
|
6641
|
+
assessAgentSandboxCapabilities,
|
|
6642
|
+
executeDockerEgressShell,
|
|
6643
|
+
executeSandboxedShell,
|
|
6644
|
+
sandboxSummary,
|
|
6645
|
+
} = await import("../lib/agent-sandbox.js");
|
|
6646
|
+
// Keep the proxy on a separate event loop: the legacy sandbox dispatch
|
|
6647
|
+
// below is synchronous. The sandbox still refuses domain-restricted
|
|
6648
|
+
// execution until a non-bypassable network backend is available.
|
|
6646
6649
|
const sboxPolicy = shellSandbox.policy || {};
|
|
6647
6650
|
const needsEgress =
|
|
6648
6651
|
shellSandbox.network === true &&
|
|
6649
6652
|
(sboxPolicy.allowedDomains?.length || 0) +
|
|
6650
6653
|
(sboxPolicy.deniedDomains?.length || 0) >
|
|
6651
6654
|
0;
|
|
6655
|
+
const dockerEgress = shellSandbox.engine === "docker-egress";
|
|
6652
6656
|
let egressProxy = null;
|
|
6653
6657
|
let proxyHandle = null;
|
|
6658
|
+
let privateSocketDir = null;
|
|
6659
|
+
let dockerEgressSession = null;
|
|
6660
|
+
let proxyFailed = false;
|
|
6654
6661
|
if (needsEgress) {
|
|
6655
6662
|
try {
|
|
6656
|
-
const {
|
|
6657
|
-
await import("../lib/sandbox-egress-
|
|
6658
|
-
|
|
6663
|
+
const { startEgressProxyWorker } =
|
|
6664
|
+
await import("../lib/sandbox-egress-worker.js");
|
|
6665
|
+
if (dockerEgress) {
|
|
6666
|
+
privateSocketDir = fs.mkdtempSync(
|
|
6667
|
+
path.join(os.tmpdir(), "cc-egress-"),
|
|
6668
|
+
);
|
|
6669
|
+
fs.chmodSync(privateSocketDir, 0o700);
|
|
6670
|
+
}
|
|
6671
|
+
proxyHandle = await startEgressProxyWorker(
|
|
6659
6672
|
{
|
|
6660
6673
|
allowedDomains: sboxPolicy.allowedDomains || [],
|
|
6661
6674
|
deniedDomains: sboxPolicy.deniedDomains || [],
|
|
6662
6675
|
allowPrivate: sboxPolicy.allowPrivate === true,
|
|
6663
6676
|
},
|
|
6664
|
-
{
|
|
6677
|
+
{
|
|
6678
|
+
bindHost: "127.0.0.1",
|
|
6679
|
+
...(privateSocketDir
|
|
6680
|
+
? { socketPath: path.join(privateSocketDir, "broker.sock") }
|
|
6681
|
+
: {}),
|
|
6682
|
+
onFailure() {
|
|
6683
|
+
proxyFailed = true;
|
|
6684
|
+
void dockerEgressSession?.close().catch(() => {});
|
|
6685
|
+
},
|
|
6686
|
+
},
|
|
6665
6687
|
);
|
|
6666
|
-
|
|
6667
|
-
egressProxy = { port: listened.port };
|
|
6688
|
+
if (proxyHandle.port) egressProxy = { port: proxyHandle.port };
|
|
6668
6689
|
} catch {
|
|
6669
6690
|
// If the proxy can't start, leave egressProxy null so the sandbox
|
|
6670
6691
|
// fails closed (refuses) rather than running without enforcement.
|
|
@@ -6687,15 +6708,72 @@ async function executeToolInner(
|
|
|
6687
6708
|
error.pluginBinFailClosed = true;
|
|
6688
6709
|
throw error;
|
|
6689
6710
|
}
|
|
6690
|
-
|
|
6691
|
-
|
|
6692
|
-
|
|
6693
|
-
|
|
6694
|
-
|
|
6695
|
-
|
|
6696
|
-
|
|
6697
|
-
|
|
6711
|
+
if (dockerEgress && !proxyHandle?.socketPath) {
|
|
6712
|
+
result = {
|
|
6713
|
+
stdout: "",
|
|
6714
|
+
stderr: "Docker egress policy broker is unavailable",
|
|
6715
|
+
exitCode: 1,
|
|
6716
|
+
failedToStart: true,
|
|
6717
|
+
sandboxCapabilities: assessAgentSandboxCapabilities(
|
|
6718
|
+
shellSandbox,
|
|
6719
|
+
{
|
|
6720
|
+
execution: { attempted: true, started: false },
|
|
6721
|
+
availability: {
|
|
6722
|
+
available: false,
|
|
6723
|
+
reason: "egress-broker-unavailable",
|
|
6724
|
+
},
|
|
6725
|
+
},
|
|
6726
|
+
),
|
|
6727
|
+
};
|
|
6728
|
+
} else if (dockerEgress) {
|
|
6729
|
+
result = await executeDockerEgressShell(
|
|
6730
|
+
args.command,
|
|
6731
|
+
shellSandbox,
|
|
6732
|
+
{
|
|
6733
|
+
cwd: args.cwd || cwd,
|
|
6734
|
+
timeoutMs: _resolveShellTimeout(args.timeout),
|
|
6735
|
+
brokerSocketPath: proxyHandle.socketPath,
|
|
6736
|
+
env: sandboxChildEnvironment,
|
|
6737
|
+
auditContext: createShellProcessAuditContext(),
|
|
6738
|
+
onSession(session) {
|
|
6739
|
+
dockerEgressSession = session;
|
|
6740
|
+
if (proxyFailed) void session.close().catch(() => {});
|
|
6741
|
+
},
|
|
6742
|
+
async beforeStart() {
|
|
6743
|
+
await shellDispatchPolicyAuthority?.revalidate?.();
|
|
6744
|
+
refreshPluginExecutionAuthority();
|
|
6745
|
+
if (
|
|
6746
|
+
proxyFailed ||
|
|
6747
|
+
proxyHandle.revision !== 0 ||
|
|
6748
|
+
pluginBinSandboxPolicy
|
|
6749
|
+
) {
|
|
6750
|
+
const error = new Error(
|
|
6751
|
+
"Docker egress authority changed before target start",
|
|
6752
|
+
);
|
|
6753
|
+
error.code = "CC_DOCKER_EGRESS_AUTHORITY_CHANGED";
|
|
6754
|
+
throw error;
|
|
6755
|
+
}
|
|
6756
|
+
},
|
|
6757
|
+
},
|
|
6758
|
+
);
|
|
6759
|
+
} else {
|
|
6760
|
+
result = executeSandboxedShell(args.command, shellSandbox, {
|
|
6761
|
+
cwd: args.cwd || cwd,
|
|
6762
|
+
timeout: _resolveShellTimeout(args.timeout),
|
|
6763
|
+
maxBuffer: 1024 * 1024,
|
|
6764
|
+
egressProxy,
|
|
6765
|
+
env: sandboxChildEnvironment,
|
|
6766
|
+
auditContext: createShellProcessAuditContext(),
|
|
6767
|
+
});
|
|
6768
|
+
}
|
|
6698
6769
|
} finally {
|
|
6770
|
+
if (dockerEgressSession) {
|
|
6771
|
+
try {
|
|
6772
|
+
await dockerEgressSession.close();
|
|
6773
|
+
} catch {
|
|
6774
|
+
/* execution result retains its cleanup status */
|
|
6775
|
+
}
|
|
6776
|
+
}
|
|
6699
6777
|
if (proxyHandle) {
|
|
6700
6778
|
try {
|
|
6701
6779
|
await proxyHandle.close();
|
|
@@ -6703,10 +6781,26 @@ async function executeToolInner(
|
|
|
6703
6781
|
/* best-effort teardown */
|
|
6704
6782
|
}
|
|
6705
6783
|
}
|
|
6784
|
+
if (privateSocketDir) {
|
|
6785
|
+
try {
|
|
6786
|
+
fs.rmSync(path.join(privateSocketDir, "broker.sock"), {
|
|
6787
|
+
force: true,
|
|
6788
|
+
});
|
|
6789
|
+
fs.rmdirSync(privateSocketDir);
|
|
6790
|
+
} catch {
|
|
6791
|
+
/* a failed broker cleanup remains visible via failed-to-start */
|
|
6792
|
+
}
|
|
6793
|
+
}
|
|
6706
6794
|
}
|
|
6707
6795
|
const common = {
|
|
6708
6796
|
sandbox: sandboxSummary(shellSandbox),
|
|
6709
6797
|
sandboxCapabilities: result.sandboxCapabilities || null,
|
|
6798
|
+
...(result.executionOutcome
|
|
6799
|
+
? {
|
|
6800
|
+
executionOutcome: result.executionOutcome,
|
|
6801
|
+
retrySafe: result.retrySafe,
|
|
6802
|
+
}
|
|
6803
|
+
: {}),
|
|
6710
6804
|
shellCommandPolicy: shellPolicy,
|
|
6711
6805
|
approval: approvalOutcome,
|
|
6712
6806
|
policyTrace: ["shell-policy", "approval", "sandbox"],
|
|
@@ -11740,7 +11834,33 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
11740
11834
|
throw new Error("Invalid API response: no choices returned");
|
|
11741
11835
|
}
|
|
11742
11836
|
const choice = data.choices[0];
|
|
11743
|
-
const
|
|
11837
|
+
const providerMessage = choice.message;
|
|
11838
|
+
if (
|
|
11839
|
+
!providerMessage ||
|
|
11840
|
+
typeof providerMessage !== "object" ||
|
|
11841
|
+
Array.isArray(providerMessage) ||
|
|
11842
|
+
providerMessage.role !== "assistant" ||
|
|
11843
|
+
(providerMessage.content !== null &&
|
|
11844
|
+
providerMessage.content !== undefined &&
|
|
11845
|
+
typeof providerMessage.content !== "string") ||
|
|
11846
|
+
(Object.hasOwn(providerMessage, "tool_calls") &&
|
|
11847
|
+
!Array.isArray(providerMessage.tool_calls)) ||
|
|
11848
|
+
(Object.hasOwn(providerMessage, "reasoning_content") &&
|
|
11849
|
+
providerMessage.reasoning_content !== null &&
|
|
11850
|
+
typeof providerMessage.reasoning_content !== "string") ||
|
|
11851
|
+
Object.keys(providerMessage).some(
|
|
11852
|
+
(key) =>
|
|
11853
|
+
!["role", "content", "tool_calls", "reasoning_content"].includes(key),
|
|
11854
|
+
)
|
|
11855
|
+
) {
|
|
11856
|
+
throw new TypeError("Invalid API response: unsupported assistant message");
|
|
11857
|
+
}
|
|
11858
|
+
// Provider reasoning text is not part of the governed replay protocol.
|
|
11859
|
+
const message = { role: "assistant", content: providerMessage.content };
|
|
11860
|
+
if (Object.hasOwn(providerMessage, "tool_calls")) {
|
|
11861
|
+
message.tool_calls = providerMessage.tool_calls;
|
|
11862
|
+
}
|
|
11863
|
+
const out = { message };
|
|
11744
11864
|
const providerReceipt = supportsOpenAIRequestIdentity
|
|
11745
11865
|
? _openAIProviderRequestReceipt(response, data, providerRequestId)
|
|
11746
11866
|
: null;
|