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
|
@@ -39,21 +39,62 @@ function projectNotification(notification) {
|
|
|
39
39
|
if (method === "turn/started") {
|
|
40
40
|
return { method: "turn/started", params: { turn: params.turn } };
|
|
41
41
|
}
|
|
42
|
+
const deltaKinds = {
|
|
43
|
+
"item/agentMessage/delta": "assistant_message",
|
|
44
|
+
"item/commandExecution/outputDelta": "tool",
|
|
45
|
+
"item/fileChange/outputDelta": "tool",
|
|
46
|
+
"item/reasoning/textDelta": "reasoning",
|
|
47
|
+
"item/reasoning/summaryTextDelta": "reasoning",
|
|
48
|
+
};
|
|
49
|
+
if (Object.hasOwn(deltaKinds, method)) {
|
|
50
|
+
return {
|
|
51
|
+
method: "item/delta",
|
|
52
|
+
params: {
|
|
53
|
+
item: {
|
|
54
|
+
id: params.itemId,
|
|
55
|
+
kind: deltaKinds[method],
|
|
56
|
+
status: "streaming",
|
|
57
|
+
delta: params.delta || "",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
...(method === "item/agentMessage/delta"
|
|
61
|
+
? {
|
|
62
|
+
outputDelta: String(params.delta || ""),
|
|
63
|
+
outputItemId: params.itemId,
|
|
64
|
+
}
|
|
65
|
+
: {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (method === "thread/tokenUsage/updated") {
|
|
69
|
+
return {
|
|
70
|
+
method: "thread/usage",
|
|
71
|
+
params: { tokenUsage: params.tokenUsage },
|
|
72
|
+
usage: params.tokenUsage?.last || null,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
42
75
|
if (["item/started", "item/updated", "item/completed"].includes(method)) {
|
|
43
76
|
const item = params.item || {};
|
|
44
|
-
const
|
|
77
|
+
const tool = item.type === "commandExecution" || item.type === "fileChange";
|
|
78
|
+
let status = method === "item/completed" ? "completed" : "streaming";
|
|
79
|
+
// item/completed means lifecycle closure, not successful execution. A
|
|
80
|
+
// declined approval still closes the tool item before interrupting the
|
|
81
|
+
// turn. Preserve that outcome and never infer success for unknown states.
|
|
82
|
+
if (method === "item/completed" && tool) {
|
|
83
|
+
status = ["completed", "failed", "declined"].includes(item.status)
|
|
84
|
+
? item.status
|
|
85
|
+
: "unknown";
|
|
86
|
+
}
|
|
45
87
|
return {
|
|
46
88
|
method: method === "item/updated" ? "item/delta" : method,
|
|
47
89
|
params: {
|
|
48
90
|
item: {
|
|
49
91
|
id: item.id,
|
|
50
92
|
kind:
|
|
51
|
-
item.type === "
|
|
93
|
+
item.type === "agentMessage"
|
|
52
94
|
? "assistant_message"
|
|
53
95
|
: item.type === "reasoning"
|
|
54
96
|
? "reasoning"
|
|
55
|
-
:
|
|
56
|
-
item.type === "file_change"
|
|
97
|
+
: tool
|
|
57
98
|
? "tool"
|
|
58
99
|
: "artifact",
|
|
59
100
|
status,
|
|
@@ -61,9 +102,10 @@ function projectNotification(notification) {
|
|
|
61
102
|
},
|
|
62
103
|
},
|
|
63
104
|
output:
|
|
64
|
-
method === "item/completed" && item.type === "
|
|
105
|
+
method === "item/completed" && item.type === "agentMessage"
|
|
65
106
|
? String(item.text || "")
|
|
66
|
-
:
|
|
107
|
+
: undefined,
|
|
108
|
+
outputItemId: item.id,
|
|
67
109
|
};
|
|
68
110
|
}
|
|
69
111
|
if (method === "turn/completed" || method === "turn/failed") {
|
|
@@ -160,44 +202,97 @@ export class CodexAppServerAdapter extends EventEmitter {
|
|
|
160
202
|
}
|
|
161
203
|
const notifications = [];
|
|
162
204
|
const unknownMethods = new Set();
|
|
163
|
-
|
|
205
|
+
const outputItems = new Map();
|
|
206
|
+
let usage = null;
|
|
164
207
|
let activeThreadId = threadId;
|
|
208
|
+
let activeTurnId = null;
|
|
165
209
|
let submissionStarted = false;
|
|
166
210
|
let admissionObserved = false;
|
|
167
211
|
let observedTerminal = null;
|
|
168
212
|
let terminalResolve;
|
|
169
|
-
|
|
170
|
-
const terminal = new Promise((resolve, reject) => {
|
|
213
|
+
const terminal = new Promise((resolve) => {
|
|
171
214
|
terminalResolve = resolve;
|
|
172
|
-
terminalReject = reject;
|
|
173
215
|
});
|
|
216
|
+
let deadlineReject;
|
|
217
|
+
const deadline = new Promise((_, reject) => {
|
|
218
|
+
deadlineReject = reject;
|
|
219
|
+
});
|
|
220
|
+
// Attach immediately: startup/RPC may hang or reject before terminal await.
|
|
221
|
+
deadline.catch(() => {});
|
|
174
222
|
const timer = setTimeout(
|
|
175
223
|
() =>
|
|
176
|
-
|
|
224
|
+
deadlineReject(
|
|
177
225
|
adapterError(
|
|
178
226
|
"CC_CODEX_APP_SERVER_TIMEOUT",
|
|
179
|
-
"Codex App Server
|
|
227
|
+
"Codex App Server request timed out",
|
|
180
228
|
),
|
|
181
229
|
),
|
|
182
230
|
this.timeoutMs,
|
|
183
231
|
);
|
|
184
232
|
timer.unref?.();
|
|
233
|
+
const withinDeadline = (pending) => Promise.race([pending, deadline]);
|
|
234
|
+
let buffered = [];
|
|
235
|
+
let retainedBytes = 0;
|
|
236
|
+
let eventFailure = null;
|
|
237
|
+
const retain = (notification) => {
|
|
238
|
+
retainedBytes += Buffer.byteLength(JSON.stringify(notification));
|
|
239
|
+
if (
|
|
240
|
+
retainedBytes > 4 * 1024 * 1024 ||
|
|
241
|
+
notifications.length + buffered.length >= 4096
|
|
242
|
+
) {
|
|
243
|
+
eventFailure = adapterError(
|
|
244
|
+
"CC_CODEX_APP_SERVER_EVENT_LIMIT",
|
|
245
|
+
"Codex App Server event retention limit exceeded",
|
|
246
|
+
);
|
|
247
|
+
deadlineReject(eventFailure);
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
return true;
|
|
251
|
+
};
|
|
185
252
|
const onNotification = (notification) => {
|
|
253
|
+
if (observedTerminal || eventFailure || !submissionStarted) return;
|
|
254
|
+
const params = notification?.params || {};
|
|
255
|
+
const eventThread =
|
|
256
|
+
params.threadId ||
|
|
257
|
+
(notification.method === "thread/started" ? params.thread?.id : null);
|
|
258
|
+
if (!eventThread || eventThread !== activeThreadId) return;
|
|
259
|
+
if (!activeTurnId) {
|
|
260
|
+
if (retain(notification)) buffered.push(notification);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const eventTurn = params.turnId || params.turn?.id;
|
|
264
|
+
// Thread-wide events carry no turn. Only thread/started is safe to
|
|
265
|
+
// project here; usage and terminal events require the exact turn ID.
|
|
266
|
+
if (
|
|
267
|
+
notification.method !== "thread/started" &&
|
|
268
|
+
eventTurn !== activeTurnId
|
|
269
|
+
)
|
|
270
|
+
return;
|
|
271
|
+
if (!retain(notification)) return;
|
|
186
272
|
const projected = projectNotification(notification);
|
|
187
|
-
if (projected.unknownMethod)
|
|
188
|
-
|
|
273
|
+
if (projected.unknownMethod) {
|
|
274
|
+
if (unknownMethods.size < 64)
|
|
275
|
+
unknownMethods.add(projected.unknownMethod);
|
|
276
|
+
} else {
|
|
277
|
+
projected.params = {
|
|
278
|
+
...projected.params,
|
|
279
|
+
threadId: activeThreadId,
|
|
280
|
+
turnId: activeTurnId,
|
|
281
|
+
};
|
|
189
282
|
notifications.push(projected);
|
|
190
283
|
this.emit("notification", projected);
|
|
191
284
|
}
|
|
192
|
-
if (
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
285
|
+
if (projected.outputItemId) {
|
|
286
|
+
if (projected.output !== undefined)
|
|
287
|
+
outputItems.set(projected.outputItemId, projected.output);
|
|
288
|
+
else if (projected.outputDelta)
|
|
289
|
+
outputItems.set(
|
|
290
|
+
projected.outputItemId,
|
|
291
|
+
(outputItems.get(projected.outputItemId) || "") +
|
|
292
|
+
projected.outputDelta,
|
|
293
|
+
);
|
|
199
294
|
}
|
|
200
|
-
if (projected.
|
|
295
|
+
if (projected.usage) usage = projected.usage;
|
|
201
296
|
if (projected.terminal) {
|
|
202
297
|
observedTerminal = projected;
|
|
203
298
|
terminalResolve(projected);
|
|
@@ -208,10 +303,11 @@ export class CodexAppServerAdapter extends EventEmitter {
|
|
|
208
303
|
Object.freeze({
|
|
209
304
|
protocol: CODEX_APP_SERVER_PROTOCOL,
|
|
210
305
|
threadId: activeThreadId,
|
|
306
|
+
turnId: activeTurnId,
|
|
211
307
|
terminal: terminalEvent.terminal,
|
|
212
|
-
output,
|
|
308
|
+
output: [...outputItems.values()].join("\n"),
|
|
213
309
|
error: terminalEvent.error || null,
|
|
214
|
-
usage: terminalEvent.usage ||
|
|
310
|
+
usage: terminalEvent.usage || usage,
|
|
215
311
|
notifications: Object.freeze(notifications),
|
|
216
312
|
unknownMethods: Object.freeze([...unknownMethods].sort()),
|
|
217
313
|
fallback: false,
|
|
@@ -219,13 +315,14 @@ export class CodexAppServerAdapter extends EventEmitter {
|
|
|
219
315
|
});
|
|
220
316
|
try {
|
|
221
317
|
if (!this.client.running && typeof this.client.start === "function") {
|
|
222
|
-
await this.client.start();
|
|
318
|
+
await withinDeadline(this.client.start());
|
|
223
319
|
}
|
|
224
320
|
if (!activeThreadId) {
|
|
225
|
-
const started = await
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
321
|
+
const started = await withinDeadline(
|
|
322
|
+
this.client.request("thread/start", {
|
|
323
|
+
ephemeral: false,
|
|
324
|
+
}),
|
|
325
|
+
);
|
|
229
326
|
activeThreadId = started?.thread?.id;
|
|
230
327
|
}
|
|
231
328
|
if (!activeThreadId) {
|
|
@@ -238,20 +335,49 @@ export class CodexAppServerAdapter extends EventEmitter {
|
|
|
238
335
|
// the server did not accept the input. Never launch a second execution
|
|
239
336
|
// path from that ambiguous state.
|
|
240
337
|
submissionStarted = true;
|
|
241
|
-
const started = await
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
338
|
+
const started = await withinDeadline(
|
|
339
|
+
this.client.request("turn/start", {
|
|
340
|
+
threadId: activeThreadId,
|
|
341
|
+
input: [{ type: "text", text: String(prompt || "") }],
|
|
342
|
+
}),
|
|
343
|
+
);
|
|
344
|
+
activeTurnId = started?.turn?.id;
|
|
345
|
+
if (typeof activeTurnId !== "string" || !activeTurnId) {
|
|
346
|
+
throw adapterError(
|
|
347
|
+
"CC_CODEX_APP_SERVER_PROTOCOL_FAILED",
|
|
348
|
+
"Codex App Server did not return a turn identity",
|
|
349
|
+
);
|
|
350
|
+
}
|
|
245
351
|
admissionObserved = true;
|
|
352
|
+
if (eventFailure) throw eventFailure;
|
|
353
|
+
const early = buffered;
|
|
354
|
+
buffered = [];
|
|
355
|
+
retainedBytes = 0;
|
|
356
|
+
for (const notification of early) onNotification(notification);
|
|
357
|
+
if (eventFailure) throw eventFailure;
|
|
358
|
+
// Some servers finish before writing the RPC response, including items
|
|
359
|
+
// in the response without separate item notifications.
|
|
360
|
+
if (!observedTerminal)
|
|
361
|
+
for (const item of started.turn.items || []) {
|
|
362
|
+
onNotification({
|
|
363
|
+
method: "item/completed",
|
|
364
|
+
params: { threadId: activeThreadId, turnId: activeTurnId, item },
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
if (eventFailure) throw eventFailure;
|
|
246
368
|
const initialStatus = String(started?.turn?.status || "");
|
|
247
369
|
const terminalEvent = ["completed", "failed", "interrupted"].includes(
|
|
248
370
|
initialStatus,
|
|
249
371
|
)
|
|
250
372
|
? projectNotification({
|
|
251
373
|
method: "turn/completed",
|
|
252
|
-
params: {
|
|
374
|
+
params: {
|
|
375
|
+
threadId: activeThreadId,
|
|
376
|
+
turn: started.turn,
|
|
377
|
+
usage: started.turn.usage || null,
|
|
378
|
+
},
|
|
253
379
|
})
|
|
254
|
-
: await terminal;
|
|
380
|
+
: await withinDeadline(terminal);
|
|
255
381
|
return buildResult(terminalEvent);
|
|
256
382
|
} catch (error) {
|
|
257
383
|
if (!submissionStarted) {
|
package/src/lib/cost-budget.js
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import { estimateCost } from "./llm-pricing.js";
|
|
21
|
+
import { projectUsagePricingContext } from "./usage-pricing-context.js";
|
|
21
22
|
|
|
22
23
|
/** Parse a `--max-budget-usd` value into a positive number, or null when unset. */
|
|
23
24
|
export function parseBudgetUsd(value) {
|
|
@@ -64,6 +65,7 @@ export class CostBudget {
|
|
|
64
65
|
// or it undercounts real spend on a cached Anthropic run and stops too late.
|
|
65
66
|
const cacheReadTokens = usage?.cache_read_input_tokens || 0;
|
|
66
67
|
const cacheCreationTokens = usage?.cache_creation_input_tokens || 0;
|
|
68
|
+
const pricingContext = projectUsagePricingContext(usage || {});
|
|
67
69
|
const est = estimateCost({
|
|
68
70
|
provider,
|
|
69
71
|
model,
|
|
@@ -71,6 +73,8 @@ export class CostBudget {
|
|
|
71
73
|
outputTokens: usage?.output_tokens || 0,
|
|
72
74
|
cacheReadTokens,
|
|
73
75
|
cacheCreationTokens,
|
|
76
|
+
serviceTier: pricingContext.service_tier ?? "standard",
|
|
77
|
+
regionalProcessing: pricingContext.regional_processing === true,
|
|
74
78
|
table: this.table,
|
|
75
79
|
});
|
|
76
80
|
const tokens =
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
rmSync,
|
|
27
27
|
} from "node:fs";
|
|
28
28
|
import { join, basename } from "node:path";
|
|
29
|
+
import { release as kernelRelease } from "node:os";
|
|
29
30
|
import { getHomeDir, getConfigPath } from "./paths.js";
|
|
30
31
|
import { inspectPrivatePaths, repairPrivatePaths } from "./secure-fs.js";
|
|
31
32
|
import executionBroker from "./process-execution-broker/index.js";
|
|
@@ -68,6 +69,7 @@ export const _deps = {
|
|
|
68
69
|
spawnSync: (...args) => executionBroker.spawnSync(...args),
|
|
69
70
|
now: () => Date.now(),
|
|
70
71
|
platform: () => process.platform,
|
|
72
|
+
kernelRelease,
|
|
71
73
|
};
|
|
72
74
|
|
|
73
75
|
function check(id, name, level, detail = "", fix = null) {
|
|
@@ -1242,12 +1244,39 @@ async function runtimeSection(opts, deps) {
|
|
|
1242
1244
|
|
|
1243
1245
|
// ── execution context (P1-7) ───────────────────────────────────────────────
|
|
1244
1246
|
// "任务在哪执行是 Session 一等属性": surface the DETECTED execution location and
|
|
1245
|
-
// the fail-closed permission posture it implies. Read-only
|
|
1246
|
-
//
|
|
1247
|
+
// the fail-closed permission posture it implies. Read-only diagnosis; this does
|
|
1248
|
+
// not change execution authority. A remote/unknown environment is a WARN
|
|
1247
1249
|
// because a session there fails closed to read-only unless powers are granted
|
|
1248
1250
|
// explicitly (and any policy violation from the pure model is listed).
|
|
1249
1251
|
async function executionSection(opts, deps) {
|
|
1250
1252
|
const checks = [];
|
|
1253
|
+
try {
|
|
1254
|
+
// WSL1 lacks STATX_BTIME: Node substitutes mutable ctime for birthtime.
|
|
1255
|
+
// Do not silently drop generation from workspace identity, reset consent,
|
|
1256
|
+
// or claim that a different kernel establishes filesystem trust support.
|
|
1257
|
+
if (
|
|
1258
|
+
deps.platform() === "linux" &&
|
|
1259
|
+
/^4\.4\..*-Microsoft$/iu.test(deps.kernelRelease())
|
|
1260
|
+
) {
|
|
1261
|
+
checks.push(
|
|
1262
|
+
check(
|
|
1263
|
+
"workspace-trust-identity",
|
|
1264
|
+
"Workspace trust filesystem identity",
|
|
1265
|
+
CHECK_LEVELS.ERR,
|
|
1266
|
+
"WSL1 reports mutable change time as creation time; workspace consent can be lost after directory edits or moves. Use the native Windows CLI for workspace trust operations. There is no safe automatic repair.",
|
|
1267
|
+
),
|
|
1268
|
+
);
|
|
1269
|
+
}
|
|
1270
|
+
} catch {
|
|
1271
|
+
checks.push(
|
|
1272
|
+
check(
|
|
1273
|
+
"workspace-trust-identity",
|
|
1274
|
+
"Workspace trust filesystem identity",
|
|
1275
|
+
CHECK_LEVELS.ERR,
|
|
1276
|
+
"Kernel information is unavailable; the WSL1 workspace trust limitation could not be checked.",
|
|
1277
|
+
),
|
|
1278
|
+
);
|
|
1279
|
+
}
|
|
1251
1280
|
try {
|
|
1252
1281
|
const {
|
|
1253
1282
|
detectAmbientLocation,
|
|
@@ -48,7 +48,12 @@ export function readSecurityStore(filePath, label) {
|
|
|
48
48
|
|
|
49
49
|
export function writeSecurityStore(filePath, label, store) {
|
|
50
50
|
const directory = path.dirname(filePath);
|
|
51
|
-
|
|
51
|
+
// A caller may already hold a Linux directory through /proc/self/fd/N.
|
|
52
|
+
// WSL1 refuses mkdir on that existing descriptor alias; keep all later
|
|
53
|
+
// writes and fsync bound to the held directory without reopening its path.
|
|
54
|
+
if (!fs.statSync(directory, { throwIfNoEntry: false })?.isDirectory()) {
|
|
55
|
+
fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
56
|
+
}
|
|
52
57
|
const temporaryPath = path.join(
|
|
53
58
|
directory,
|
|
54
59
|
`.${path.basename(filePath)}.${process.pid}.${crypto.randomUUID()}.tmp`,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
|
|
3
|
+
// WSL1's stat fallback reports ctime as birthtime. Creating an index or child
|
|
4
|
+
// directory changes that value without replacing the object. It supplies no
|
|
5
|
+
// creation-time identity; keep device/inode and the caller's no-link, physical
|
|
6
|
+
// containment and descriptor checks. WSL2 and other platforms retain birthtime.
|
|
7
|
+
export function artifactPhysicalIdentity(
|
|
8
|
+
stat,
|
|
9
|
+
{ platform = process.platform, kernelRelease = os.release() } = {},
|
|
10
|
+
) {
|
|
11
|
+
const birthtimeMs = Number(stat.birthtimeMs);
|
|
12
|
+
const wsl1CtimeFallback =
|
|
13
|
+
platform === "linux" &&
|
|
14
|
+
/^4\.4\..*-Microsoft$/iu.test(kernelRelease) &&
|
|
15
|
+
birthtimeMs === Number(stat.ctimeMs);
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
birthtimeMs: wsl1CtimeFallback ? null : birthtimeMs,
|
|
18
|
+
dev: String(stat.dev),
|
|
19
|
+
ino: String(stat.ino),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -13,6 +13,7 @@ import fs from "node:fs";
|
|
|
13
13
|
import path from "node:path";
|
|
14
14
|
import { types as utilTypes } from "node:util";
|
|
15
15
|
import { ArtifactStore } from "../artifact-store.js";
|
|
16
|
+
import { artifactPhysicalIdentity as physicalIdentity } from "./evolution-artifact-identity.js";
|
|
16
17
|
import { withEvolutionFileIdentity } from "./evolution-file-identity.js";
|
|
17
18
|
import {
|
|
18
19
|
EVOLUTION_ARTIFACT_REF_SCHEMA,
|
|
@@ -1060,19 +1061,12 @@ function isContained(root, candidate) {
|
|
|
1060
1061
|
);
|
|
1061
1062
|
}
|
|
1062
1063
|
|
|
1063
|
-
function physicalIdentity(stat) {
|
|
1064
|
-
return Object.freeze({
|
|
1065
|
-
birthtimeMs: Number(stat.birthtimeMs),
|
|
1066
|
-
dev: String(stat.dev),
|
|
1067
|
-
ino: String(stat.ino),
|
|
1068
|
-
});
|
|
1069
|
-
}
|
|
1070
|
-
|
|
1071
1064
|
function samePhysicalIdentity(stat, expected) {
|
|
1065
|
+
const actual = physicalIdentity(stat);
|
|
1072
1066
|
return (
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1067
|
+
actual.dev === expected.dev &&
|
|
1068
|
+
actual.ino === expected.ino &&
|
|
1069
|
+
actual.birthtimeMs === expected.birthtimeMs
|
|
1076
1070
|
);
|
|
1077
1071
|
}
|
|
1078
1072
|
|