chainlesschain 0.166.77 → 0.166.78
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 +16 -7
- 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-DSyZEY2G.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CnU-Xvx-.js → ActionButton-DhNyZ577.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BJW-CNtf.js → Analytics-HMMpxmyi.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-UFQJL3G9.js → AppLayout-CwKMM5Ie.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Dr_IUDoY.js → Artifacts-CNzDmph7.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-aglWo6rr.js → Audit-DxWpUW3V.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Dm_TCiXC.js → BackgroundAgents-C1R2ST-P.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DUdX4-gA.js → Backup-B6biTaEV.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BTcLjy1o.js → BaseInput-CVnkD2Z5.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Bhy9qZrl.js → Chat-Dbewl4Je.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D0WrJQaQ.js → ChatBubbleRenderer-DVZ6SwC5.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CblrPa21.js → Checkbox-BqqiF1JE.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-SEAHzOlr.js → Codegen-BVMkGumc.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DJz8iFOR.js → Col-DmiRHy96.js} +1 -1
- package/src/assets/web-panel/assets/{Community-RufKhcQt.js → Community-BDlpygqA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dlifx08U.js → Compact-B2NME_m-.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DdhQWcHh.js → Compliance-BlzDLE-R.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BLNn6oOm.js → Cowork-C8raPybB.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dv-JWY2d.js → Cron-DA8Py0zP.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-k7Pz7O-b.js → Crosschain-DU2XyHqB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C_10syUW.js → DID-Df098fT_.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CMyH6Szx.js → Dashboard-D1rT702x.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DjmD2Saa.js → Dropdown-BweXGo1O.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-36_IRUSo.js → EmailListRenderer-B9ShbgJH.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DEgf9kyP.js → FamilyGuardDashboard-DrznZFVs.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DGO1wQls.js → Federation-DQZ2adIA.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Doj1FmKW.js → FormItemContext-DN30Dowh.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-GzOU27iT.js → GenericCardRenderer-DRdt0j1e.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Dd7D1EDK.js → Git-wwRgStzk.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-6IY8LcjI.js → Governance-CI4Uw0Nh.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BB9gl8q1.js → Inference-5TuE2AJI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CeCed5wd.js → KnowledgeGraph-oXyvmFSR.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CYOeHuaI.js → Logs-ewudSWuv.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Bk8Zqc2R.js → MarkdownRenderer-Cz5nyufm.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-D-_xgHgM.js → Marketplace-DcZeWFrs.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-NnaUTF5t.js → McpTools-BcV9p1RS.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CndN9pMt.js → Memory-CMhYvugt.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BXblFmhY.js → MobileBridge-5RP2uwvT.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CC26Dm2k.js → MobileProjects-BIuM9Ze4.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BhaqWCiW.js → Mtc-DmBszTDe.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-D6fktM2w.js → MtcAudit-Czdp5ZGt.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CFvahz7s.js → Multisig-DRWUuNr-.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Co73Ivya.js → NLProgramming-IRQQN0-c.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-B4g33L1o.js → Notes-CGhD1lW9.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-lXd17EbN.js → NotificationSettings-BtyPgQAh.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BiOB0GIi.js → OrderTableRenderer-yUaqwCty.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-JQ7_wQIA.js → Organization-C3kTVn5i.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-gwgJgozQ.js → Overflow-C2-0iZhq.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D9L_0gie.js → P2P-CISoEUxA.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CbOPsFE9.js → PdhVaultBrowser-NfTVtvKQ.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-Cz42HNQf.js → Permissions-CfK0jJhm.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DjorYtrF.js → PersonalDataHub-OsVxxh_j.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DyWPhmm5.js → Pipeline-DEmK_Ch2.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DyfLMl2j.js → Privacy-D61s73b0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyqDx1OE.js → ProjectInit-DkLF5gHb.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DsBw0Csy.js → ProjectSettings-BA7odTrI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CRaSI25Z.js → Projects-CdI1GcAG.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CCI_klN-.js → Providers-D9BYyP1r.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DNsnlDdS.js → QrScannerModal-CXMItUDD.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-B9r2iaee.js → QuickAsk-8-tF9ffZ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BJDe03GR.js → Recommend-C2QGWOSi.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-J7JR3rRo.js → RemoteSession-B1M_v1lx.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DR39AJeV.js → Reputation-D0WZHgv1.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Dh77m3NZ.js → Row-D6nf9-c-.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BUdg28nJ.js → RssFeed-ClZ6M-mN.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BNC7sGhj.js → Search-ZWkt8vuO.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DISENGI7.js → Security-BUlQut2m.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BBBGpJ1-.js → Services-Cd_3xJOc.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DMcIoIv2.js → Skeleton-C8e2-cHW.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-QAyFbI3r.js → Skills-DucVRJp1.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CSg5wLH7.js → Sla-Csr5pUwI.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DMPxTc5x.js → SpeechSettings-CXvyaRAT.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CPG7l30y.js → SyncSettings-KdsIcV5h.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Y1kOVvVL.js → Tasks-B-eHmJm9.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-jt9NagL0.js → Templates-BglVeaLK.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauuJICx.js → Tenant-BBbQ8qan.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-E9rnKeGq.js → Terminal-Ca_pCVBi.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Cc7z2APG.js → TimelineRenderer-YD6XG_vZ.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CV0UthRA.js → Tokens-2lRoeVli.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BFcJJGfu.js → Trigger-C-3XNAU9.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BAydbNJA.js → Trust-k-1PxdLG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DcOS6sqL.js → UkeySign-FG-qW646.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BLHJZvif.js → VideoEditing-BNOe1cmd.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-4QFLKHwW.js → Wallet-D5C3i2Kw.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BocEOOSj.js → WebAuthn-BOpztqd3.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DCfF7D0B.js → WorkflowEditor-BpVrpUEv.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CxvfsYGr.js → chat-DIuMHb38.js} +1 -1
- package/src/assets/web-panel/assets/{colors-KtQB9DmQ.js → colors-CTFJPyzQ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dx4J6arN.js → compact-item-CONfmJcW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Cq0olgzo.js → createContext-RkW5CRrz.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Bf9-h3D-.js → hasIn-CW4XOjDC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK2U_AHi.js → index-7wMSBCU7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMR-keCL.js → index-Akmg1WdH.js} +1 -1
- package/src/assets/web-panel/assets/{index-6dDDSCHD.js → index-B54qoVff.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmQuG0fr.js → index-B8r2t0Ch.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClUfSChI.js → index-B9XoBoty.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3xfiItB.js → index-B9aS2VLu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQDR-_ai.js → index-BFs1Tznc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZWjYfWt.js → index-BKgaRT0b.js} +1 -1
- package/src/assets/web-panel/assets/{index-nmyDOh_b.js → index-BM7bOUvu.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_8UcDan.js → index-BMg2JFmW.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9yaUHm9.js → index-BRZsPxNn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz7f4Jaq.js → index-Bf19fKef.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpO6DKuu.js → index-BkAbfBF-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFdEDvFn.js → index-CBjb2A5R.js} +1 -1
- package/src/assets/web-panel/assets/{index-gt5N6VM_.js → index-CEZWQthY.js} +1 -1
- package/src/assets/web-panel/assets/{index-0fi8DIVQ.js → index-CFGLf88d.js} +1 -1
- package/src/assets/web-panel/assets/{index-hSzyoXri.js → index-CLUa68JH.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cy865Hhq.js → index-CM2X25Er.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDAe1UmZ.js → index-CX4T2uKN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMcC4cbj.js → index-CixqfdRk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsCdl2Od.js → index-CkRojEip.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnU-dUWd.js → index-Cvmc3f25.js} +1 -1
- package/src/assets/web-panel/assets/{index-Br1mDMfO.js → index-D-lpTPS8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIclw-E.js → index-D59GbWCN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBRlZdZj.js → index-DAESljiJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8WuPI-h.js → index-DDHUx4Yz.js} +1 -1
- package/src/assets/web-panel/assets/index-DG1mcYTa.js +1 -0
- package/src/assets/web-panel/assets/{index-D2BfSIrn.js → index-DP5pPedy.js} +1 -1
- package/src/assets/web-panel/assets/index-DRs5Pe8u.js +1 -0
- package/src/assets/web-panel/assets/{index-CqnggDos.js → index-DSlXL6Ju.js} +1 -1
- package/src/assets/web-panel/assets/{index-_FIz-0tp.js → index-DWCJnn2O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKtQyb2o.js → index-DWY7YwDu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfrFNMvz.js → index-DZTwP364.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHmdMKYl.js → index-DidrMvOx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO6XvO-C.js → index-Dj3K5kHs.js} +1 -1
- package/src/assets/web-panel/assets/{index-iE9tqEN5.js → index-YaeGscSw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI5bRqNG.js → index-YlMnFNOi.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cfsn7N18.js → index-asWsB34i.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeYP_kT9.js → index-gkjiFjQd.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DvzKJ6o5.js → initDefaultProps-BOr4igh3.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D1yTvmxW.js → motion-CK469n2j.js} +1 -1
- package/src/assets/web-panel/assets/{move-DxtSIF8K.js → move-DzjudlYQ.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDsQgIHY.js → mtc-parser-BQaKUxC6.js} +1 -1
- package/src/assets/web-panel/assets/{omit-UVBJW8kh.js → omit-MciovCFD.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D4QqtTyX.js → pickAttrs-DDPJ4zAz.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-QXmu6vBf.js → placementArrow-Cznyb-jI.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D-PmXO9M.js → responsiveObserve-AJK3SLzJ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CKbGxEZJ.js → slide-CPQ28wu7.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BbgXPkXm.js → statusUtils-CFjzvqf_.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DOr9rk68.js → styleChecker-BPyFfTuR.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-B2wO2r36.js → useFlexGapSupport-Dq7N6R05.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-SeVGBK34.js → useFs-C3GS0uTc.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DUJBCxjD.js → usePersonalDataHub-BhgIVzP_.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CF4EYsig.js → vnode-4ZD9-MDr.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-pRUs5pqI.js → zoom-Bx4MRVNW.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 +13 -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/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/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/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/headless-stream.js +202 -4
- package/src/assets/web-panel/assets/EvolutionSettings-CmtU0XmM.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
|
+
}
|
|
@@ -52,6 +52,12 @@ import {
|
|
|
52
52
|
} from "../lib/policy-decision-event.js";
|
|
53
53
|
import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
|
|
54
54
|
import { bootstrap } from "./bootstrap.js";
|
|
55
|
+
import {
|
|
56
|
+
appendSessionInputWithReceipt,
|
|
57
|
+
readSessionInputReceipt,
|
|
58
|
+
inputSubmissionDigest,
|
|
59
|
+
validateClientMessageId,
|
|
60
|
+
} from "../lib/session-input-receipt.js";
|
|
55
61
|
import {
|
|
56
62
|
buildSystemPrompt,
|
|
57
63
|
chatWithTools as coreChatWithTools,
|
|
@@ -78,6 +84,7 @@ import {
|
|
|
78
84
|
buildUserContent,
|
|
79
85
|
resolveVisionLlm,
|
|
80
86
|
} from "../lib/image-input.js";
|
|
87
|
+
import { MAX_INPUT_IMAGES } from "../lib/image-file-boundary.js";
|
|
81
88
|
import {
|
|
82
89
|
buildIdePromptContext,
|
|
83
90
|
expandIdeMentions,
|
|
@@ -115,6 +122,7 @@ import { IterationBudget } from "../lib/iteration-budget.js";
|
|
|
115
122
|
import { CostBudget } from "../lib/cost-budget.js";
|
|
116
123
|
import {
|
|
117
124
|
resolvePermissionMode,
|
|
125
|
+
normalizePermissionMode,
|
|
118
126
|
resolveEnabledTools,
|
|
119
127
|
parseToolList,
|
|
120
128
|
installPipeSafety,
|
|
@@ -171,6 +179,10 @@ import { createMcpHostRecoveryRuntime } from "../lib/mcp-host-recovery-runtime.j
|
|
|
171
179
|
import { operationIdempotencyKey } from "../lib/idempotency.js";
|
|
172
180
|
import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
|
|
173
181
|
import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
|
|
182
|
+
import {
|
|
183
|
+
transcriptMessageEventId,
|
|
184
|
+
transcriptResultReferences,
|
|
185
|
+
} from "../lib/session-transcript-reference.js";
|
|
174
186
|
import { getPlanModeManager } from "../lib/plan-mode.js";
|
|
175
187
|
import {
|
|
176
188
|
SESSION_SLASH_COMMANDS,
|
|
@@ -710,6 +722,14 @@ export function parseInputEvent(line) {
|
|
|
710
722
|
};
|
|
711
723
|
}
|
|
712
724
|
const msg = obj && typeof obj === "object" ? obj.message || obj : {};
|
|
725
|
+
let clientMessageId;
|
|
726
|
+
if (obj?.client_message_id !== undefined) {
|
|
727
|
+
try {
|
|
728
|
+
clientMessageId = validateClientMessageId(obj.client_message_id);
|
|
729
|
+
} catch (error) {
|
|
730
|
+
return { error: error.message };
|
|
731
|
+
}
|
|
732
|
+
}
|
|
713
733
|
let content = msg.content ?? obj.text ?? obj.prompt;
|
|
714
734
|
if (Array.isArray(content)) {
|
|
715
735
|
content = content
|
|
@@ -738,7 +758,9 @@ export function parseInputEvent(line) {
|
|
|
738
758
|
content = detected.text;
|
|
739
759
|
}
|
|
740
760
|
}
|
|
741
|
-
images = [...new Set(images)]
|
|
761
|
+
images = [...new Set(images)];
|
|
762
|
+
if (images.length > MAX_INPUT_IMAGES)
|
|
763
|
+
return { error: `Attach at most ${MAX_INPUT_IMAGES} images per message` };
|
|
742
764
|
// §3.5.10 接线6: optional per-turn LLM override (PDH privacy-tier switch) —
|
|
743
765
|
// {"type":"user","text":…,"llm":{"provider","model","baseUrl"?,"apiKey"?}}.
|
|
744
766
|
// Switches THIS turn's model (e.g. cloud → your own PC Ollama) without
|
|
@@ -750,6 +772,7 @@ export function parseInputEvent(line) {
|
|
|
750
772
|
// An image-only turn is valid — give the model something to act on.
|
|
751
773
|
if (images.length) {
|
|
752
774
|
const r = { text: "Please look at the attached image(s).", images };
|
|
775
|
+
if (clientMessageId) r.clientMessageId = clientMessageId;
|
|
753
776
|
if (obj.worklog_session_id !== undefined)
|
|
754
777
|
r.worklogSessionId = obj.worklog_session_id;
|
|
755
778
|
if (llm) r.llm = llm;
|
|
@@ -758,6 +781,7 @@ export function parseInputEvent(line) {
|
|
|
758
781
|
return null;
|
|
759
782
|
}
|
|
760
783
|
const result = images.length ? { text: content, images } : { text: content };
|
|
784
|
+
if (clientMessageId) result.clientMessageId = clientMessageId;
|
|
761
785
|
if (obj.worklog_session_id !== undefined)
|
|
762
786
|
result.worklogSessionId = obj.worklog_session_id;
|
|
763
787
|
if (llm) result.llm = llm;
|
|
@@ -2085,6 +2109,12 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2085
2109
|
sessionExists: deps.sessionExists || jsonlSessionExists,
|
|
2086
2110
|
startSession: deps.startSession || jsonlStartSession,
|
|
2087
2111
|
appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
|
|
2112
|
+
appendInputWithReceipt:
|
|
2113
|
+
deps.appendInputWithReceipt ||
|
|
2114
|
+
(hasInjectedSessionStore ? null : appendSessionInputWithReceipt),
|
|
2115
|
+
readInputReceipt:
|
|
2116
|
+
deps.readInputReceipt ||
|
|
2117
|
+
(hasInjectedSessionStore ? null : readSessionInputReceipt),
|
|
2088
2118
|
appendAssistantMessage:
|
|
2089
2119
|
deps.appendAssistantMessage || jsonlAppendAssistantMessage,
|
|
2090
2120
|
appendTokenUsage: deps.appendTokenUsage || jsonlAppendTokenUsage,
|
|
@@ -3106,10 +3136,37 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3106
3136
|
protocol_version: STREAM_PROTOCOL_VERSION,
|
|
3107
3137
|
session_id: sessionId,
|
|
3108
3138
|
session_persistence: persist,
|
|
3139
|
+
input_receipts: {
|
|
3140
|
+
version:
|
|
3141
|
+
persist && store.appendInputWithReceipt && store.readInputReceipt
|
|
3142
|
+
? 1
|
|
3143
|
+
: 0,
|
|
3144
|
+
},
|
|
3109
3145
|
task_worklog: taskWorklog ? { version: 1, path: taskWorklog.file } : null,
|
|
3110
3146
|
model,
|
|
3111
3147
|
provider,
|
|
3112
3148
|
permission_mode: options.permissionMode || "default",
|
|
3149
|
+
// Correlates display state with this exact IDE child. This echo grants no
|
|
3150
|
+
// authority: effective mode is derived only from validated CLI options.
|
|
3151
|
+
...(/^[a-zA-Z0-9-]{1,80}$/.test(process.env.CC_IDE_MODE_REQUEST_ID || "")
|
|
3152
|
+
? {
|
|
3153
|
+
permission_mode_state: {
|
|
3154
|
+
correlation_id: process.env.CC_IDE_MODE_REQUEST_ID,
|
|
3155
|
+
requested: ["default", "acceptEdits", "bypassPermissions"].includes(
|
|
3156
|
+
process.env.CC_IDE_REQUESTED_MODE,
|
|
3157
|
+
)
|
|
3158
|
+
? process.env.CC_IDE_REQUESTED_MODE
|
|
3159
|
+
: "default",
|
|
3160
|
+
effective: normalizePermissionMode(options.permissionMode),
|
|
3161
|
+
policy_revision: computePolicyDigest({
|
|
3162
|
+
permissionMode: options.permissionMode,
|
|
3163
|
+
allowedTools: options.allowedTools,
|
|
3164
|
+
disallowedTools: disabledTools,
|
|
3165
|
+
permissionRules,
|
|
3166
|
+
}),
|
|
3167
|
+
},
|
|
3168
|
+
}
|
|
3169
|
+
: {}),
|
|
3113
3170
|
tools: enabledToolNames,
|
|
3114
3171
|
tools_hash: computeToolsHash(enabledToolNames),
|
|
3115
3172
|
policy_digest: computePolicyDigest({
|
|
@@ -4087,6 +4144,89 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4087
4144
|
continue;
|
|
4088
4145
|
}
|
|
4089
4146
|
|
|
4147
|
+
// Bind the receipt to the submitted input, before commands, hooks, file
|
|
4148
|
+
// expansion or image reads can change it. A repeated ID never replays work.
|
|
4149
|
+
const inputSubmission = parsed.clientMessageId
|
|
4150
|
+
? {
|
|
4151
|
+
text: parsed.text,
|
|
4152
|
+
images: parsed.images || [],
|
|
4153
|
+
llm: parsed.llm || null,
|
|
4154
|
+
worklogSessionId: parsed.worklogSessionId || null,
|
|
4155
|
+
}
|
|
4156
|
+
: null;
|
|
4157
|
+
const acknowledgeInput = (receipt) => {
|
|
4158
|
+
emit({
|
|
4159
|
+
type: "system",
|
|
4160
|
+
subtype: "input_accepted",
|
|
4161
|
+
session_id: sessionId,
|
|
4162
|
+
client_message_id: parsed.clientMessageId,
|
|
4163
|
+
receipt,
|
|
4164
|
+
});
|
|
4165
|
+
if (receipt.duplicate)
|
|
4166
|
+
emit({
|
|
4167
|
+
type: "result",
|
|
4168
|
+
subtype: "input_already_accepted",
|
|
4169
|
+
is_error: false,
|
|
4170
|
+
session_id: sessionId,
|
|
4171
|
+
client_message_id: parsed.clientMessageId,
|
|
4172
|
+
execution_status: "not-reexecuted",
|
|
4173
|
+
result:
|
|
4174
|
+
"Input was already accepted. No work was re-executed; inspect the session for its outcome.",
|
|
4175
|
+
});
|
|
4176
|
+
};
|
|
4177
|
+
if (parsed.clientMessageId) {
|
|
4178
|
+
if (
|
|
4179
|
+
!persist ||
|
|
4180
|
+
!store.appendInputWithReceipt ||
|
|
4181
|
+
!store.readInputReceipt
|
|
4182
|
+
) {
|
|
4183
|
+
emit({
|
|
4184
|
+
type: "result",
|
|
4185
|
+
subtype: "error_input_receipt",
|
|
4186
|
+
is_error: true,
|
|
4187
|
+
session_id: sessionId,
|
|
4188
|
+
client_message_id: parsed.clientMessageId,
|
|
4189
|
+
acceptance: "rejected",
|
|
4190
|
+
error: "Durable input receipts require canonical session persistence",
|
|
4191
|
+
});
|
|
4192
|
+
sawError = true;
|
|
4193
|
+
continue;
|
|
4194
|
+
}
|
|
4195
|
+
try {
|
|
4196
|
+
const prior = requireSynchronousRecoveryResult(
|
|
4197
|
+
store.readInputReceipt(sessionId, parsed.clientMessageId),
|
|
4198
|
+
"readInputReceipt",
|
|
4199
|
+
);
|
|
4200
|
+
if (prior?.accepted) {
|
|
4201
|
+
const receipt = prior.receipt;
|
|
4202
|
+
if (
|
|
4203
|
+
!/^[a-f0-9]{64}$/u.test(receipt?.eventHash || "") ||
|
|
4204
|
+
receipt.sessionId !== sessionId ||
|
|
4205
|
+
receipt.clientMessageId !== parsed.clientMessageId ||
|
|
4206
|
+
receipt.inputDigest !== inputSubmissionDigest(inputSubmission)
|
|
4207
|
+
)
|
|
4208
|
+
throw new Error("Input receipt conflicts with submission");
|
|
4209
|
+
acknowledgeInput({ ...receipt, duplicate: true });
|
|
4210
|
+
continue;
|
|
4211
|
+
}
|
|
4212
|
+
if (prior?.accepted !== false)
|
|
4213
|
+
throw new Error("Invalid input receipt lookup");
|
|
4214
|
+
} catch {
|
|
4215
|
+
emit({
|
|
4216
|
+
type: "result",
|
|
4217
|
+
subtype: "error_input_receipt",
|
|
4218
|
+
is_error: true,
|
|
4219
|
+
session_id: sessionId,
|
|
4220
|
+
client_message_id: parsed.clientMessageId,
|
|
4221
|
+
acceptance: "unknown",
|
|
4222
|
+
error:
|
|
4223
|
+
"Cannot verify input acceptance; inspect the canonical session before sending again",
|
|
4224
|
+
});
|
|
4225
|
+
sawError = true;
|
|
4226
|
+
continue;
|
|
4227
|
+
}
|
|
4228
|
+
}
|
|
4229
|
+
|
|
4090
4230
|
// Manual `/compact` uses the same provider-backed structured handoff as the
|
|
4091
4231
|
// other long-lived hosts. Provider/schema failures degrade to the shared
|
|
4092
4232
|
// extractive handoff instead of silently dropping all but recent turns.
|
|
@@ -4879,11 +5019,38 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4879
5019
|
else turnContent = [{ type: "text", text: historyPart }, ...turnContent];
|
|
4880
5020
|
}
|
|
4881
5021
|
updateWorklog((log) => log.user(parsed.text));
|
|
4882
|
-
messages.push({ role: "user", content: turnContent });
|
|
4883
5022
|
let persistenceFailure = null;
|
|
5023
|
+
let inputReceipt = null;
|
|
5024
|
+
let userEventId = null;
|
|
4884
5025
|
if (persist) {
|
|
4885
5026
|
try {
|
|
4886
|
-
|
|
5027
|
+
if (parsed.clientMessageId) {
|
|
5028
|
+
if (!store.appendInputWithReceipt)
|
|
5029
|
+
throw new Error("Durable input receipts are unavailable");
|
|
5030
|
+
inputReceipt = requireSynchronousRecoveryResult(
|
|
5031
|
+
store.appendInputWithReceipt(
|
|
5032
|
+
sessionId,
|
|
5033
|
+
turnContent,
|
|
5034
|
+
parsed.clientMessageId,
|
|
5035
|
+
inputSubmission,
|
|
5036
|
+
),
|
|
5037
|
+
"appendInputWithReceipt",
|
|
5038
|
+
);
|
|
5039
|
+
if (
|
|
5040
|
+
!/^[a-f0-9]{64}$/u.test(inputReceipt?.eventHash || "") ||
|
|
5041
|
+
inputReceipt.sessionId !== sessionId ||
|
|
5042
|
+
inputReceipt.clientMessageId !== parsed.clientMessageId ||
|
|
5043
|
+
inputReceipt.inputDigest !==
|
|
5044
|
+
inputSubmissionDigest(inputSubmission) ||
|
|
5045
|
+
typeof inputReceipt.duplicate !== "boolean"
|
|
5046
|
+
)
|
|
5047
|
+
throw new Error("Invalid durable input receipt");
|
|
5048
|
+
userEventId = inputReceipt.eventHash;
|
|
5049
|
+
} else {
|
|
5050
|
+
userEventId = transcriptMessageEventId(
|
|
5051
|
+
store.appendUserMessage(sessionId, turnContent),
|
|
5052
|
+
);
|
|
5053
|
+
}
|
|
4887
5054
|
} catch (error) {
|
|
4888
5055
|
const persistenceError = createSessionPersistenceFailure(error, {
|
|
4889
5056
|
sessionId,
|
|
@@ -4893,6 +5060,20 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4893
5060
|
persistenceError,
|
|
4894
5061
|
{ phase: "before-model" },
|
|
4895
5062
|
);
|
|
5063
|
+
if (parsed.clientMessageId && !persistenceFailure) {
|
|
5064
|
+
emit({
|
|
5065
|
+
type: "result",
|
|
5066
|
+
subtype: "error_input_receipt",
|
|
5067
|
+
is_error: true,
|
|
5068
|
+
session_id: sessionId,
|
|
5069
|
+
client_message_id: parsed.clientMessageId,
|
|
5070
|
+
acceptance: "unknown",
|
|
5071
|
+
error:
|
|
5072
|
+
"Cannot verify durable input append; inspect the canonical session before sending again",
|
|
5073
|
+
});
|
|
5074
|
+
sawError = true;
|
|
5075
|
+
break;
|
|
5076
|
+
}
|
|
4896
5077
|
if (persistenceFailure) {
|
|
4897
5078
|
try {
|
|
4898
5079
|
deps.onPersistenceFailure?.(persistenceFailure);
|
|
@@ -4902,6 +5083,11 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4902
5083
|
}
|
|
4903
5084
|
}
|
|
4904
5085
|
}
|
|
5086
|
+
if (inputReceipt && !persistenceFailure) {
|
|
5087
|
+
acknowledgeInput(inputReceipt);
|
|
5088
|
+
if (inputReceipt.duplicate) continue; // Never re-run an accepted input.
|
|
5089
|
+
}
|
|
5090
|
+
messages.push({ role: "user", content: turnContent });
|
|
4905
5091
|
turns += 1;
|
|
4906
5092
|
approvalGrantLedger.beginTurn(turns);
|
|
4907
5093
|
if (persistenceFailure) {
|
|
@@ -5215,9 +5401,12 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5215
5401
|
|
|
5216
5402
|
// Grow the conversation so the next turn has context.
|
|
5217
5403
|
messages.push({ role: "assistant", content: outcome.finalText });
|
|
5404
|
+
let assistantEventId = null;
|
|
5218
5405
|
if (persist) {
|
|
5219
5406
|
try {
|
|
5220
|
-
|
|
5407
|
+
assistantEventId = transcriptMessageEventId(
|
|
5408
|
+
store.appendAssistantMessage(sessionId, outcome.finalText),
|
|
5409
|
+
);
|
|
5221
5410
|
} catch (error) {
|
|
5222
5411
|
const persistenceError = createSessionPersistenceFailure(error, {
|
|
5223
5412
|
sessionId,
|
|
@@ -5248,6 +5437,14 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5248
5437
|
outcome.endReason === "no-response" ||
|
|
5249
5438
|
Boolean(persistenceFailure);
|
|
5250
5439
|
if (isError) sawError = true;
|
|
5440
|
+
const transcriptRefs = !persistenceFailure
|
|
5441
|
+
? transcriptResultReferences({
|
|
5442
|
+
sessionId,
|
|
5443
|
+
userEventId,
|
|
5444
|
+
assistantEventId,
|
|
5445
|
+
clientMessageId: parsed.clientMessageId || null,
|
|
5446
|
+
})
|
|
5447
|
+
: null;
|
|
5251
5448
|
|
|
5252
5449
|
if (costStopped) {
|
|
5253
5450
|
emit({
|
|
@@ -5275,6 +5472,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5275
5472
|
session_id: sessionId,
|
|
5276
5473
|
turn: turns,
|
|
5277
5474
|
usage: outcome.usage,
|
|
5475
|
+
...(transcriptRefs ? { transcript_refs: transcriptRefs } : {}),
|
|
5278
5476
|
...(persistenceFailure ? { persistence: persistenceFailure } : {}),
|
|
5279
5477
|
});
|
|
5280
5478
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as r,J as T,U as c,c as a,K as o,S as L,V as C,o as M,r as k,a as V,b as I,P as R,Q as d,R as m,F as H,Z as W}from"./vendor-Bn1JzzAn.js";import{_ as A,u as N,d as i}from"./index-hSzyoXri.js";import{R as F}from"./icons-DG5UD-6K.js";function B(P){return["ask","agent"].map(t=>{const n=P?.readiness?.[t],e=n?.state==="admitted",f=n?.scope==="deployment-admission"&&n.runtimeVerification==="not_checked"&&Array.isArray(n.requiredCommands)&&n.requiredCommands.includes(t)&&(e?n.ready===!0&&n.taskReady===null:["not_configured","disabled","invalid","command_not_allowed"].includes(n.state)&&n.ready===!1&&n.taskReady===!1);return{command:t,state:f?n.state:"unknown",summary:f?e?"部署准入通过":"部署准入被阻断":"未提供准入诊断",detail:f&&typeof n.detail=="string"?n.detail:"当前 CLI 未提供可识别的部署准入诊断,请更新 CLI。",remediation:f&&typeof n.remediation=="string"?n.remediation:""}})}function U(P,t){for(const n of Object.keys(P))delete P[n];Object.assign(P,{source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[],readiness:null},t||{})}const J={__name:"EvolutionSettings",setup(P,{expose:t}){t();const n=N(),e=k(!1),f=k(!1),S=k(!1),p=k(!1),w=k(!1),g=k(""),_=k(""),E=k(""),v=V({source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[]}),x=I(()=>e.value||f.value||S.value||p.value||w.value),h=I(()=>B(v));function b(s){U(v,s),_.value=v.descriptorPath||"",E.value=v.trustRootPath||"",g.value=v.modulePath||g.value||""}async function u(s,z=3e4){return await n.waitConnected(8e3),(await n.sendRaw(s,z)).result}async function y(){e.value=!0;try{b(await u({type:"evolution.deployment.status"}))}catch(s){i.error("读取配置失败:"+s.message)}finally{e.value=!1}}async function D(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写描述符和信任根公钥的绝对路径");return}f.value=!0;try{b(await u({type:"evolution.deployment.configure",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("签名校验通过,配置已保存并启用;自动发布仍为 HOLD")}catch(s){i.error("配置失败:"+s.message)}finally{f.value=!1}}async function O(){if(!g.value.trim()){i.warning("请填写测试部署宿主模块的服务器绝对路径");return}p.value=!0;try{b(await u({type:"evolution.deployment.init-test",modulePath:g.value.trim()},6e4)),i.success("TEST 测试开发环境已生成并启用;禁止用于生产")}catch(s){i.error("生成测试环境失败:"+s.message)}finally{p.value=!1}}async function l(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写正式描述符和正式信任根公钥的绝对路径");return}w.value=!0;try{b(await u({type:"evolution.deployment.replace-test",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("测试根已安全轮换为正式受管证书;请重启 cc ui、IDE 或 Desktop 长驻进程后做正式验证")}catch(s){i.error("替换失败:"+s.message)}finally{w.value=!1}}async function q(){S.value=!0;try{b(await u({type:"evolution.deployment.set-enabled",enabled:!v.profileEnabled})),i.success(v.profileEnabled?"已启用":"已停用")}catch(s){i.error("更新失败:"+s.message)}finally{S.value=!1}}M(y);const j={ws:n,loading:e,saving:f,toggling:S,initializingTest:p,replacingTest:w,modulePath:g,descriptorPath:_,trustRootPath:E,status:v,busy:x,readinessRows:h,apply:b,request:u,loadStatus:y,save:D,initTest:O,replaceTest:l,toggle:q,computed:I,onMounted:M,reactive:V,ref:k,get ReloadOutlined(){return F},get message(){return i},get useWsStore(){return N},get deploymentReadinessRows(){return B},get replaceDeploymentStatus(){return U}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},Z={class:"page-head"},K={class:"mono"},Q={class:"mono"},Y={class:"admission-status","aria-live":"polite"},G=["data-admission-command"],X={class:"mono"},$={key:0,class:"mono"};function ee(P,t,n,e,f,S){const p=r("a-button"),w=r("a-alert"),g=r("a-input"),_=r("a-form-item"),E=r("a-divider"),v=r("a-space"),x=r("a-form"),h=r("a-card"),b=r("a-col"),u=r("a-tag"),y=r("a-descriptions-item"),D=r("a-descriptions"),O=r("a-row");return R(),T("div",null,[c("div",Z,[t[4]||(t[4]=c("div",null,[c("h2",{class:"page-title"},"Skill 自进化配置"),c("p",{class:"page-sub"},"统一配置受治理部署;CLI、IDE 插件与 cc ui 共享。")],-1)),a(p,{loading:e.loading,onClick:e.loadStatus},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[3]||(t[3]=d("刷新 ",-1))]),_:1},8,["loading"])]),a(w,{message:"不会开启自动发布",description:"此开关只启用经过签名的 Skill 自进化运行时。候选项进入 active 前仍需人工审核,自动发布始终保持 HOLD。",type:"warning","show-icon":"",class:"notice"}),e.status.deploymentMode==="test"?(R(),L(w,{key:0,message:"当前为 TEST 测试开发环境",description:"本机自动生成的测试密钥不能用于生产。正式 descriptor 和 trust root 到位后,请使用下方“一键替换测试证书并转正式”。",type:"error","show-icon":"",class:"notice"})):C("v-if",!0),a(O,{gutter:16},{default:o(()=>[a(b,{xs:24,xl:15},{default:o(()=>[a(h,{title:"上线前测试与正式部署",class:"panel-card"},{default:o(()=>[a(x,{layout:"vertical"},{default:o(()=>[a(_,{label:"测试部署宿主模块"},{extra:o(()=>[...t[5]||(t[5]=[d("首次填写后点击一次即可生成 Ed25519 测试密钥、签名描述符并启用;宿主模块修改后再次点击可刷新。",-1)])]),default:o(()=>[a(g,{value:e.modulePath,"onUpdate:value":t[0]||(t[0]=l=>e.modulePath=l),disabled:e.busy,placeholder:"运行 cc ui 的机器上 deployment host .mjs/.js 的绝对路径"},null,8,["value","disabled"])]),_:1}),a(p,{type:"primary",loading:e.initializingTest,onClick:e.initTest},{default:o(()=>[...t[6]||(t[6]=[d("一键生成/刷新测试环境",-1)])]),_:1},8,["loading"]),a(E),a(_,{label:"签名部署描述符"},{extra:o(()=>[...t[7]||(t[7]=[d("Web 页面不能读取本机文件选择器,请填写运行 cc ui 的机器上的绝对路径。",-1)])]),default:o(()=>[a(g,{value:e.descriptorPath,"onUpdate:value":t[1]||(t[1]=l=>e.descriptorPath=l),disabled:e.busy,placeholder:"deployment descriptor JSON 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(_,{label:"Ed25519 信任根公钥"},{default:o(()=>[a(g,{value:e.trustRootPath,"onUpdate:value":t[2]||(t[2]=l=>e.trustRootPath=l),disabled:e.busy,placeholder:"信任根 public key 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(v,null,{default:o(()=>[a(p,{type:"primary",loading:e.saving,onClick:e.save},{default:o(()=>[...t[8]||(t[8]=[d("校验、保存并启用",-1)])]),_:1},8,["loading"]),a(p,{danger:e.status.profileEnabled,disabled:!e.status.descriptorPath,loading:e.toggling,onClick:e.toggle},{default:o(()=>[d(m(e.status.profileEnabled?"停用":"启用"),1)]),_:1},8,["danger","disabled","loading"]),e.status.deploymentMode==="test"?(R(),L(p,{key:0,loading:e.replacingTest,onClick:e.replaceTest},{default:o(()=>[...t[9]||(t[9]=[d("一键替换测试证书并转正式",-1)])]),_:1},8,["loading"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})]),_:1}),a(b,{xs:24,xl:9},{default:o(()=>[a(h,{title:"治理状态",class:"panel-card status-card"},{default:o(()=>[a(D,{column:1,size:"small"},{default:o(()=>[a(y,{label:"部署模式"},{default:o(()=>[a(u,{color:e.status.deploymentMode==="test"?"red":"blue"},{default:o(()=>[d(m(e.status.deploymentMode==="test"?"TEST(仅限上线前联调)":e.status.deploymentMode||"none"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效状态"},{default:o(()=>[a(u,{color:e.status.effectiveEnabled?"green":"default"},{default:o(()=>[d(m(e.status.effectiveEnabled?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效来源"},{default:o(()=>[d(m(e.status.source||"none"),1)]),_:1}),a(y,{label:"签名校验"},{default:o(()=>[a(u,{color:e.status.verified?"green":"red"},{default:o(()=>[d(m(e.status.verified?"已通过":"未通过"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"自动发布"},{default:o(()=>[a(u,{color:"orange"},{default:o(()=>[...t[10]||(t[10]=[d("HOLD",-1)])]),_:1})]),_:1}),a(y,{label:"配置文件"},{default:o(()=>[c("span",K,m(e.status.profilePath||"—"),1)]),_:1}),a(y,{label:"允许命令"},{default:o(()=>[c("span",Q,m((e.status.commands||[]).join(", ")||"—"),1)]),_:1})]),_:1}),c("section",Y,[t[11]||(t[11]=c("h3",null,"模型命令部署准入",-1)),t[12]||(t[12]=c("p",null,"这里只检查部署准入,实际任务运行尚未验证。",-1)),(R(!0),T(H,null,W(e.readinessRows,l=>(R(),T("div",{key:l.command,"data-admission-command":l.command},[c("strong",null,m(l.command)+":"+m(l.summary),1),c("p",X,m(l.detail),1),l.remediation?(R(),T("p",$,m(l.remediation),1)):C("v-if",!0)],8,G))),128))]),e.status.error?(R(),L(w,{key:0,message:e.status.error,type:"error","show-icon":"",class:"error"},null,8,["message"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})])}const le=A(J,[["render",ee],["__scopeId","data-v-5a42105e"],["__file","/tmp/cc-web-panel-6ZYRLD/repo/packages/web-panel/src/views/EvolutionSettings.vue"]]);export{le as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-hSzyoXri.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DJz8iFOR.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-Dh77m3NZ.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-D-PmXO9M.js";import"./useFlexGapSupport-B2wO2r36.js";import"./styleChecker-DOr9rk68.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|