@cloudcli-ai/cloudcli 1.37.2 → 1.37.3
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 +269 -0
- package/dist/assets/{abnfDiagram-N423BO3Z-C4UAoHJb.js → abnfDiagram-N423BO3Z-CJntskwA.js} +1 -1
- package/dist/assets/{arc-B8jF-ja9.js → arc-CIfH4uMN.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G-C_Wur_CU.js → architectureDiagram-T3A2C74G-_IpEkukg.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-Cq4P1i8t.js → blockDiagram-VBNYF7ZC-BttxrpgZ.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-C1wG4eUj.js → c4Diagram-5PPSVZJV-g51dSRr1.js} +1 -1
- package/dist/assets/channel-C5xU9jMw.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-B8fnBG6E.js → chunk-2GRJ4B5K-D_-LbQUa.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-WdfPooPJ.js → chunk-2Q5K7J3B-BtlHzwaO.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-DhZJuG2E.js → chunk-5RXB4S5H-UzkpvpAT.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-B0rjslal.js → chunk-5VM5RSS4-BKwx5Gag.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-CG2Oj4jL.js → chunk-6Q2QTUOP-D_KEBH5f.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-rrl2lRxY.js → chunk-GF5L2VYU-rK2DGyto.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CjVbrVMA.js → chunk-JWPE2WC7-CeBl_N9i.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-CRzKgU8S.js → chunk-KBJHAD2P-BiQLWVIr.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DBz4GTZF.js → chunk-RYQCIY6F-C1knVGV5.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-wHxalsXk.js → chunk-XXDRQBXY-CtKbJkvF.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-CRrL3vp7.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-CRrL3vp7.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-s1hygY8e.js → cose-bilkent-JH36ORCC-DjX8y40Z.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-C4LGV15i.js → cynefin-VYW2F7L2-DM6YeRba.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-C5uhu7B3.js → cynefinDiagram-MW4NZA55-wZJ-vy5B.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-B-OBTewm.js → dagre-VZM6K2ZE-BzP0ejkH.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-BjGKQxih.js → diagram-7IWD3JNH-BTL_j23J.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-BMKz1X2L.js → diagram-B4RE2ZJO-Cf1Norgu.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-DNh-GhKC.js → diagram-LBJQPF4R-DPiUEKr-.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-BaTG9jPT.js → diagram-Q27KOJAE-CTcTpiz5.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-BUwo2OvJ.js → diagram-UB23O5K3-DPMSdYm0.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-DAZgfzX2.js → ebnfDiagram-BXEA7PRR-7yvD6uiF.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-1w1CcGEb.js → erDiagram-JOGREHBK-CfgeDoV6.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-D4EII8Jj.js → flowDiagram-UKHOOZJN-B27ng5zu.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-ChvJZAgB.js → ganttDiagram-PKOTCBZU-CcC6b_7t.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-DtOn41S8.js → gitGraphDiagram-DS77QQ5N-BX5kPGrO.js} +1 -1
- package/dist/assets/index-BTDHQ6Id.css +32 -0
- package/dist/assets/index-sFfz8iBR.js +4931 -0
- package/dist/assets/{infoDiagram-6WML65LV-DN_PVEJZ.js → infoDiagram-6WML65LV-CUP-SlN4.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-DbkF1kXb.js → ishikawaDiagram-WSZJBQD7-BTTDhOpX.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-pJwmhddE.js → journeyDiagram-NVQOT4AX-ARXcc61m.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-PPAPgNp5.js → kanban-definition-27J2QSJJ-BieMpqMA.js} +1 -1
- package/dist/assets/{linear-iPR-J9f7.js → linear-61vxjRnP.js} +1 -1
- package/dist/assets/{mermaid.core-BEUL86Z6.js → mermaid.core-nhnwkfQx.js} +5 -5
- package/dist/assets/{mindmap-definition-FAOFIHXS-BvZoBib7.js → mindmap-definition-FAOFIHXS-Cm6x5vT1.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-DhYreaUd.js → pegDiagram-VL7TDLO6-CcYBq_9H.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-CrOHlyD0.js → pieDiagram-7S7Q4E2Y-CfvIjfzo.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-D4g5yH3t.js → quadrantDiagram-CIZ2JOQS-SgYoWPNb.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-Dj39lHlf.js → railroadDiagram-AXF67PYL-D2Mu5E_f.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-1AS4Zgm_.js → requirementDiagram-LRYGKXZP-Azwe_k4Q.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-CKlMn19P.js → sankeyDiagram-W5VNT64P-DN1Ju3PA.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-B_j3qyvo.js → sequenceDiagram-SI44F4Z6-Bj4qC34S.js} +1 -1
- package/dist/assets/server.browser-CtX3Hdl5.js +27 -0
- package/dist/assets/{sizeCapture-X5ZJPWSS-Bp2Op16v.js → sizeCapture-X5ZJPWSS-Co4PdklG.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-C0cN6DoY.js → stateDiagram-OKZ733FA-nOvL9dRC.js} +1 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-DNv8ppw7.js +1 -0
- package/dist/assets/{swimlanes-SLNWSIFB-BEvXOV9b.js → swimlanes-SLNWSIFB-CCK3wMid.js} +2 -2
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DnfbNQEp.js +8 -0
- package/dist/assets/{timeline-definition-Z64GVDOM-zdJQinvZ.js → timeline-definition-Z64GVDOM-BC29RNFm.js} +1 -1
- package/dist/assets/{vendor-codemirror-OwyKSvPE.js → vendor-codemirror-CYrSt7-U.js} +18 -18
- package/dist/assets/{vennDiagram-T6HMQDX7-DuF1uZMY.js → vennDiagram-T6HMQDX7-pZlZCtEo.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-B9AlLQup.js → wardleyDiagram-T6FBY63Y-De8k2-zM.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M-DTJX48Qg.js → xychartDiagram-ELKLHX3M-Bk8ykH0w.js} +1 -1
- package/dist/index.html +3 -3
- package/dist-server/server/index.js +7 -3
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/agent/agent.routes.js +2 -2
- package/dist-server/server/modules/agent/agent.routes.js.map +1 -1
- package/dist-server/server/modules/agent/tests/agent.routes.test.js +30 -1
- package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -1
- package/dist-server/server/modules/browser-use/browser-use.routes.js +39 -33
- package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -1
- package/dist-server/server/modules/database/connection.js +1 -1
- package/dist-server/server/modules/database/connection.js.map +1 -1
- package/dist-server/server/modules/database/index.js +5 -0
- package/dist-server/server/modules/database/index.js.map +1 -1
- package/dist-server/server/modules/database/migrations.js +32 -1
- package/dist-server/server/modules/database/migrations.js.map +1 -1
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js +71 -0
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js +105 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js +137 -5
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
- package/dist-server/server/modules/database/repositories/user-preferences.db.js +65 -0
- package/dist-server/server/modules/database/repositories/user-preferences.db.js.map +1 -0
- package/dist-server/server/modules/database/schema.js +92 -0
- package/dist-server/server/modules/database/schema.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +39 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js +105 -0
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-delete.service.js +12 -1
- package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -1
- package/dist-server/server/modules/projects/services/project-star.service.js +2 -2
- package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -1
- package/dist-server/server/modules/providers/index.js +3 -0
- package/dist-server/server/modules/providers/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +20 -1
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js +46 -0
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +35 -6
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +168 -38
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +388 -50
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +4 -1
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude.provider.js +2 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +204 -0
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js +32 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +16 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +60 -49
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +8 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +1565 -432
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex.provider.js +2 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +8 -6
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +258 -6
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +24 -0
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js +14 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js +139 -35
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/session-history-cache.service.js +87 -0
- package/dist-server/server/modules/providers/services/session-history-cache.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js +105 -32
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js +3 -60
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/sessions.service.js +179 -9
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-auth.test.js +52 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-models.test.js +39 -0
- package/dist-server/server/modules/providers/tests/claude-models.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js +465 -39
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js +16 -0
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js +85 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js +338 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-runtime.test.js +51 -0
- package/dist-server/server/modules/providers/tests/codex-runtime.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js +54 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +304 -15
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/opencode-models.test.js +117 -4
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +164 -1
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/session-fork.test.js +113 -0
- package/dist-server/server/modules/providers/tests/session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js +120 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js +90 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js +122 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js +45 -1
- package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/skills.test.js +15 -3
- package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
- package/dist-server/server/modules/scheduled-messages/index.js +5 -0
- package/dist-server/server/modules/scheduled-messages/index.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js +47 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js +163 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js +95 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js +255 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +23 -23
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -1
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +48 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -1
- package/dist-server/server/modules/user/tests/user.service.test.js +70 -0
- package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -1
- package/dist-server/server/modules/user/user.module.js +10 -1
- package/dist-server/server/modules/user/user.module.js.map +1 -1
- package/dist-server/server/modules/user/user.routes.js +44 -0
- package/dist-server/server/modules/user/user.routes.js.map +1 -1
- package/dist-server/server/modules/user/user.service.js +75 -0
- package/dist-server/server/modules/user/user.service.js.map +1 -1
- package/dist-server/server/modules/voice/tests/voice.service.test.js +3 -2
- package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -1
- package/dist-server/server/modules/websocket/index.js +7 -0
- package/dist-server/server/modules/websocket/index.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +10 -44
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +35 -5
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +166 -9
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js +94 -0
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js +9 -3
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js +263 -0
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +29 -3
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js +106 -0
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +80 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -1
- package/dist-server/server/shared/claude-cli-path.js +22 -5
- package/dist-server/server/shared/claude-cli-path.js.map +1 -1
- package/dist-server/server/shared/index.js +3 -0
- package/dist-server/server/shared/index.js.map +1 -0
- package/dist-server/server/shared/message-unification.js +376 -0
- package/dist-server/server/shared/message-unification.js.map +1 -0
- package/dist-server/server/shared/tests/claude-cli-path.test.js +45 -1
- package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -1
- package/dist-server/server/shared/tests/message-unification.test.js +174 -0
- package/dist-server/server/shared/tests/message-unification.test.js.map +1 -0
- package/dist-server/server/shared/utils.js +34 -0
- package/dist-server/server/shared/utils.js.map +1 -1
- package/package.json +19 -16
- package/server/index.ts +11 -4
- package/server/modules/agent/agent.routes.ts +2 -2
- package/server/modules/agent/tests/agent.routes.test.ts +33 -1
- package/server/modules/browser-use/browser-use.routes.ts +96 -33
- package/server/modules/database/connection.ts +2 -1
- package/server/modules/database/index.ts +10 -0
- package/server/modules/database/migrations.ts +37 -0
- package/server/modules/database/repositories/scheduled-messages.db.ts +127 -0
- package/server/modules/database/repositories/session-drafts.db.ts +171 -0
- package/server/modules/database/repositories/sessions.db.ts +196 -3
- package/server/modules/database/repositories/user-preferences.db.ts +80 -0
- package/server/modules/database/schema.ts +96 -0
- package/server/modules/database/tests/sessions.db.integration.test.ts +52 -0
- package/server/modules/database/tests/user-preferences.db.integration.test.ts +135 -0
- package/server/modules/projects/services/project-delete.service.ts +13 -1
- package/server/modules/projects/services/project-star.service.ts +2 -2
- package/server/modules/providers/index.ts +4 -0
- package/server/modules/providers/list/claude/claude-auth.provider.ts +21 -1
- package/server/modules/providers/list/claude/claude-fork.provider.ts +57 -0
- package/server/modules/providers/list/claude/claude-models.provider.ts +38 -6
- package/server/modules/providers/list/claude/claude-runtime.provider.js +188 -39
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +478 -54
- package/server/modules/providers/list/claude/claude-skills.provider.ts +4 -1
- package/server/modules/providers/list/claude/claude.provider.ts +3 -0
- package/server/modules/providers/list/codex/codex-app-server.client.ts +243 -0
- package/server/modules/providers/list/codex/codex-fork.provider.ts +40 -0
- package/server/modules/providers/list/codex/codex-models.provider.ts +16 -0
- package/server/modules/providers/list/codex/{codex-runtime.provider.js → codex-runtime.provider.ts} +93 -66
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +9 -0
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +1806 -477
- package/server/modules/providers/list/codex/codex.provider.ts +3 -0
- package/server/modules/providers/list/cursor/cursor-runtime.provider.js +8 -6
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +0 -1
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +279 -6
- package/server/modules/providers/provider.routes.ts +31 -0
- package/server/modules/providers/services/provider-capabilities.service.ts +23 -0
- package/server/modules/providers/services/provider-token-usage.service.ts +166 -39
- package/server/modules/providers/services/session-history-cache.service.ts +139 -0
- package/server/modules/providers/services/session-synchronizer.service.ts +125 -38
- package/server/modules/providers/services/sessions-watcher.service.ts +3 -64
- package/server/modules/providers/services/sessions.service.ts +201 -9
- package/server/modules/providers/tests/claude-auth.test.ts +58 -0
- package/server/modules/providers/tests/claude-models.test.ts +87 -0
- package/server/modules/providers/tests/claude-sessions.test.ts +552 -40
- package/server/modules/providers/tests/claude-subagent-echo.test.ts +25 -0
- package/server/modules/providers/tests/claude-token-budget.test.ts +104 -0
- package/server/modules/providers/tests/codex-message-editing.test.ts +419 -0
- package/server/modules/providers/tests/codex-runtime.test.ts +58 -0
- package/server/modules/providers/tests/codex-session-fork.test.ts +59 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +337 -15
- package/server/modules/providers/tests/opencode-models.test.ts +166 -8
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +188 -1
- package/server/modules/providers/tests/session-fork.test.ts +173 -0
- package/server/modules/providers/tests/session-history-cache.service.test.ts +143 -0
- package/server/modules/providers/tests/session-orphan-prune.test.ts +107 -0
- package/server/modules/providers/tests/session-synchronizer-coalescing.test.ts +136 -0
- package/server/modules/providers/tests/sessions.service.test.ts +67 -1
- package/server/modules/providers/tests/skills.test.ts +21 -5
- package/server/modules/scheduled-messages/index.ts +8 -0
- package/server/modules/scheduled-messages/scheduled-messages.routes.ts +68 -0
- package/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.ts +203 -0
- package/server/modules/scheduled-messages/services/scheduled-messages.service.ts +121 -0
- package/server/modules/scheduled-messages/tests/scheduled-messages.test.ts +310 -0
- package/server/modules/taskmaster/taskmaster.routes.ts +23 -33
- package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +57 -0
- package/server/modules/user/tests/user.service.test.ts +90 -0
- package/server/modules/user/user.module.ts +10 -1
- package/server/modules/user/user.routes.ts +44 -0
- package/server/modules/user/user.service.ts +105 -0
- package/server/modules/voice/tests/voice.service.test.ts +3 -2
- package/server/modules/websocket/index.ts +8 -0
- package/server/modules/websocket/services/chat-run-registry.service.ts +17 -50
- package/server/modules/websocket/services/chat-session-writer.service.ts +36 -6
- package/server/modules/websocket/services/chat-websocket.service.ts +244 -15
- package/server/modules/websocket/services/session-upsert-broadcast.service.ts +108 -0
- package/server/modules/websocket/services/shell-websocket.service.ts +10 -3
- package/server/modules/websocket/tests/chat-edit-send.test.ts +309 -0
- package/server/modules/websocket/tests/chat-run-registry.test.ts +34 -3
- package/server/modules/websocket/tests/session-upsert-broadcast.test.ts +138 -0
- package/server/modules/websocket/tests/shell-websocket.service.test.ts +108 -0
- package/server/shared/claude-cli-path.ts +24 -6
- package/server/shared/index.ts +3 -0
- package/server/shared/interfaces.ts +62 -0
- package/server/shared/message-unification.ts +449 -0
- package/server/shared/tests/claude-cli-path.test.ts +58 -1
- package/server/shared/tests/message-unification.test.ts +218 -0
- package/server/shared/types.ts +123 -2
- package/server/shared/utils.ts +40 -0
- package/dist/assets/channel-_falYbU1.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-Dn-3CfpR.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-Dn-3CfpR.js +0 -1
- package/dist/assets/index-CzPLBvXT.css +0 -32
- package/dist/assets/index-DFkBBuSA.js +0 -1549
- package/dist/assets/stateDiagram-v2-UEYNNEHI-BvBxUUrZ.js +0 -1
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CsE-x4YK.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-delete.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/project-delete.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,SAAS,4BAA4B,CACnC,QAA8C;IAE9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,qCAAqC,QAAQ,GAAG,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAAC,WAAmB;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,yCAAyC,CAAC,WAAW,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"project-delete.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/project-delete.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,SAAS,4BAA4B,CACnC,QAA8C;IAE9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,qCAAqC,QAAQ,GAAG,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAAC,WAAmB;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,yCAAyC,CAAC,WAAW,CAAC,CAAC;IACnF,4EAA4E;IAC5E,0EAA0E;IAC1E,sEAAsE;IACtE,MAAM,KAAK,GAAG,4BAA4B,CAAC;QACzC,GAAG,QAAQ;QACX,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU;aACxC,4BAA4B,CAAC,OAAO,CAAC,UAAU,CAAC;aAChD,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;KAC1C,CAAC,CAAC;IAEH,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,UAAU,CAAC,+BAA+B,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB,EAAE,KAAc;IAC5E,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,QAAQ,CAAC,sBAAsB,SAAS,EAAE,EAAE;YACpD,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,2BAA2B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,qCAAqC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC9D,UAAU,CAAC,2BAA2B,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,QAAQ,CAAC,sBAAsB,SAAS,EAAE,EAAE;YACpD,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,2BAA2B,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -27,7 +27,7 @@ export function applyLegacyStarredProjectIds(projectIds) {
|
|
|
27
27
|
if (!project) {
|
|
28
28
|
continue;
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
30
|
+
if (project.isStarred) {
|
|
31
31
|
continue;
|
|
32
32
|
}
|
|
33
33
|
projectsDb.updateProjectIsStarredById(projectId, true);
|
|
@@ -53,7 +53,7 @@ export function toggleProjectStar(projectId) {
|
|
|
53
53
|
statusCode: 404,
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
const nextStarredState = !
|
|
56
|
+
const nextStarredState = !project.isStarred;
|
|
57
57
|
projectsDb.updateProjectIsStarredById(normalizedProjectId, nextStarredState);
|
|
58
58
|
return { isStarred: nextStarredState };
|
|
59
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-star.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/project-star.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAU7C,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAoB;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAoB;IAC/D,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"project-star.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/project-star.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAU7C,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAoB;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAoB;IAC/D,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,UAAU,CAAC,0BAA0B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE;YAC1C,IAAI,EAAE,qBAAqB;YAC3B,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE;YACtC,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5C,UAAU,CAAC,0BAA0B,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IAE7E,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -4,6 +4,9 @@ export { providerMcpService } from './services/mcp.service.js';
|
|
|
4
4
|
export { providerRuntimeService } from './services/provider-runtime.service.js';
|
|
5
5
|
// providerModelsService: used by Commands to list models and resolve the active session model.
|
|
6
6
|
export { providerModelsService } from './services/provider-models.service.js';
|
|
7
|
+
// sessionsService: used by the websocket module's chat gateway to resolve an
|
|
8
|
+
// edited message's resume point, which only the providers module can read.
|
|
9
|
+
export { sessionsService } from './services/sessions.service.js';
|
|
7
10
|
export { initializeSessionsWatcher } from './services/sessions-watcher.service.js';
|
|
8
11
|
export { closeSessionsWatcher } from './services/sessions-watcher.service.js';
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/modules/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,+FAA+F;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/modules/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,+FAA+F;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,6EAA6E;AAC7E,2EAA2E;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC"}
|
|
@@ -10,7 +10,9 @@ export class ClaudeProviderAuth {
|
|
|
10
10
|
* Checks whether the Claude Code CLI is available on this host.
|
|
11
11
|
*/
|
|
12
12
|
checkInstalled() {
|
|
13
|
-
|
|
13
|
+
// cross-spawn resolves shims and PATHEXT itself, so the bare command is a
|
|
14
|
+
// usable fallback here even where the SDK's raw spawn could not use it.
|
|
15
|
+
const cliPath = resolveClaudeCodeExecutablePath(process.env.CLAUDE_CLI_PATH) ?? 'claude';
|
|
14
16
|
try {
|
|
15
17
|
spawn.sync(cliPath, ['--version'], { stdio: 'ignore', timeout: 5000 });
|
|
16
18
|
return true;
|
|
@@ -98,6 +100,23 @@ export class ClaudeProviderAuth {
|
|
|
98
100
|
method: 'credentials_file',
|
|
99
101
|
};
|
|
100
102
|
}
|
|
103
|
+
// `accessToken` is short-lived (hours). Claude Code renews it silently
|
|
104
|
+
// from `refreshToken` on the next CLI invocation, so an expired access
|
|
105
|
+
// token alongside a live refresh token is still a working login. Before
|
|
106
|
+
// this check, a still-signed-in account read as "login has expired"
|
|
107
|
+
// until something else happened to run the CLI — which is why opening
|
|
108
|
+
// the Shell tab and coming back made Settings flip to Connected.
|
|
109
|
+
const refreshToken = readOptionalString(oauth?.refreshToken);
|
|
110
|
+
const refreshTokenExpiresAt = typeof oauth?.refreshTokenExpiresAt === 'number'
|
|
111
|
+
? oauth.refreshTokenExpiresAt
|
|
112
|
+
: undefined;
|
|
113
|
+
if (refreshToken && (!refreshTokenExpiresAt || Date.now() < refreshTokenExpiresAt)) {
|
|
114
|
+
return {
|
|
115
|
+
authenticated: true,
|
|
116
|
+
email,
|
|
117
|
+
method: 'credentials_file',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
101
120
|
return {
|
|
102
121
|
authenticated: false,
|
|
103
122
|
email: null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-auth.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/claude/claude-auth.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,KAAK,MAAM,aAAa,CAAC;AAEhC,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AASzE,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,IAAY,EAAW,EAAE,CAAC,CAC9D,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CACjE,CAAC;AAEF,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACK,cAAc;QACpB,MAAM,OAAO,GAAG,+BAA+B,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-auth.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/claude/claude-auth.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { forkSession as forkClaudeSession } from '@anthropic-ai/claude-agent-sdk';
|
|
4
|
+
import { AppError } from '../../../../shared/utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* Branches a Claude conversation by copying its transcript into a new session
|
|
7
|
+
* file.
|
|
8
|
+
*
|
|
9
|
+
* The SDK owns this: it remaps every message uuid and rewrites the parentUuid
|
|
10
|
+
* chain, which is what makes the copy resumable rather than just a duplicate
|
|
11
|
+
* file. `upToMessageId` is inclusive of the row it names.
|
|
12
|
+
*/
|
|
13
|
+
export class ClaudeForkProvider {
|
|
14
|
+
async forkSession(input) {
|
|
15
|
+
// `dir` is the session's working directory, which the SDK encodes into the
|
|
16
|
+
// `~/.claude/projects/<encoded>` folder name itself — passing that folder
|
|
17
|
+
// makes it encode an already-encoded path and find nothing.
|
|
18
|
+
const { sessionId } = await forkClaudeSession(input.providerSessionId, {
|
|
19
|
+
dir: input.projectPath,
|
|
20
|
+
upToMessageId: input.upToAnchorId,
|
|
21
|
+
title: input.title,
|
|
22
|
+
});
|
|
23
|
+
if (!sessionId) {
|
|
24
|
+
throw new AppError('Claude did not return a session id for the fork.', {
|
|
25
|
+
code: 'FORK_FAILED',
|
|
26
|
+
statusCode: 502,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Confirmed rather than assumed: the caller is about to write a database
|
|
30
|
+
// row claiming this file exists, and a half-created row would show up in
|
|
31
|
+
// the sidebar as a session that can never be opened.
|
|
32
|
+
// The fork lands beside the transcript it was copied from.
|
|
33
|
+
const forkedPath = path.join(path.dirname(input.jsonlPath), `${sessionId}.jsonl`);
|
|
34
|
+
try {
|
|
35
|
+
await stat(forkedPath);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new AppError('Claude reported a fork but wrote no transcript for it.', {
|
|
39
|
+
code: 'FORK_FAILED',
|
|
40
|
+
statusCode: 502,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return { providerSessionId: sessionId, jsonlPath: forkedPath };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=claude-fork.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-fork.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/claude/claude-fork.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGlF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IAC7B,KAAK,CAAC,WAAW,CAAC,KAMjB;QACC,2EAA2E;QAC3E,0EAA0E;QAC1E,4DAA4D;QAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,iBAAiB,EAAE;YACrE,GAAG,EAAE,KAAK,CAAC,WAAW;YACtB,aAAa,EAAE,KAAK,CAAC,YAAY;YACjC,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAAC,kDAAkD,EAAE;gBACrE,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAED,yEAAyE;QACzE,yEAAyE;QACzE,qDAAqD;QACrD,2DAA2D;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;QAClF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,QAAQ,CAAC,wDAAwD,EAAE;gBAC3E,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { sessionsDb } from '../../../../modules/database/index.js';
|
|
3
3
|
import { buildDefaultProviderCurrentActiveModel } from '../../../../shared/utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Ultracode is not one of the SDK's reasoning-effort levels. Selecting it runs the turn at
|
|
6
|
+
* `xhigh` effort with standing dynamic-workflow orchestration, which the Claude runtime
|
|
7
|
+
* translates into the session-scoped `ultracode` setting. It is therefore only offered on
|
|
8
|
+
* models this catalog already marks as xhigh-capable.
|
|
9
|
+
*/
|
|
10
|
+
export const CLAUDE_ULTRACODE_EFFORT = 'ultracode';
|
|
11
|
+
const ULTRACODE_EFFORT_OPTION = {
|
|
12
|
+
value: CLAUDE_ULTRACODE_EFFORT,
|
|
13
|
+
description: 'Highest effort plus standing workflow orchestration.',
|
|
14
|
+
};
|
|
4
15
|
export const CLAUDE_PREDEFINED_MODELS = {
|
|
5
16
|
OPTIONS: [
|
|
6
17
|
{
|
|
@@ -29,6 +40,7 @@ export const CLAUDE_PREDEFINED_MODELS = {
|
|
|
29
40
|
{ value: 'high' },
|
|
30
41
|
{ value: 'xhigh' },
|
|
31
42
|
{ value: 'max' },
|
|
43
|
+
ULTRACODE_EFFORT_OPTION,
|
|
32
44
|
],
|
|
33
45
|
},
|
|
34
46
|
},
|
|
@@ -44,6 +56,7 @@ export const CLAUDE_PREDEFINED_MODELS = {
|
|
|
44
56
|
{ value: 'high' },
|
|
45
57
|
{ value: 'xhigh' },
|
|
46
58
|
{ value: 'max' },
|
|
59
|
+
ULTRACODE_EFFORT_OPTION,
|
|
47
60
|
],
|
|
48
61
|
},
|
|
49
62
|
},
|
|
@@ -59,6 +72,7 @@ export const CLAUDE_PREDEFINED_MODELS = {
|
|
|
59
72
|
{ value: 'high' },
|
|
60
73
|
{ value: 'xhigh' },
|
|
61
74
|
{ value: 'max' },
|
|
75
|
+
ULTRACODE_EFFORT_OPTION,
|
|
62
76
|
],
|
|
63
77
|
},
|
|
64
78
|
},
|
|
@@ -74,6 +88,7 @@ export const CLAUDE_PREDEFINED_MODELS = {
|
|
|
74
88
|
{ value: 'high' },
|
|
75
89
|
{ value: 'xhigh' },
|
|
76
90
|
{ value: 'max' },
|
|
91
|
+
ULTRACODE_EFFORT_OPTION,
|
|
77
92
|
],
|
|
78
93
|
},
|
|
79
94
|
},
|
|
@@ -89,6 +104,7 @@ export const CLAUDE_PREDEFINED_MODELS = {
|
|
|
89
104
|
{ value: 'high' },
|
|
90
105
|
{ value: 'xhigh' },
|
|
91
106
|
{ value: 'max' },
|
|
107
|
+
ULTRACODE_EFFORT_OPTION,
|
|
92
108
|
],
|
|
93
109
|
},
|
|
94
110
|
},
|
|
@@ -104,6 +120,7 @@ export const CLAUDE_PREDEFINED_MODELS = {
|
|
|
104
120
|
{ value: 'high' },
|
|
105
121
|
{ value: 'xhigh' },
|
|
106
122
|
{ value: 'max' },
|
|
123
|
+
ULTRACODE_EFFORT_OPTION,
|
|
107
124
|
],
|
|
108
125
|
},
|
|
109
126
|
},
|
|
@@ -124,6 +141,7 @@ export const CLAUDE_PREDEFINED_MODELS = {
|
|
|
124
141
|
{ value: 'high' },
|
|
125
142
|
{ value: 'xhigh' },
|
|
126
143
|
{ value: 'max' },
|
|
144
|
+
ULTRACODE_EFFORT_OPTION,
|
|
127
145
|
],
|
|
128
146
|
},
|
|
129
147
|
},
|
|
@@ -140,7 +158,14 @@ export const findClaudeModelOption = (model) => {
|
|
|
140
158
|
const ANSI_PATTERN = new RegExp('[\\u001B\\u009B][[\\]()#;?]*(?:'
|
|
141
159
|
+ '(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]'
|
|
142
160
|
+ '|(?:[\\dA-PR-TZcf-ntqry=><~]))', 'g');
|
|
143
|
-
|
|
161
|
+
/**
|
|
162
|
+
* Claude Code stamps locally-synthesized rows (API-error placeholders and the
|
|
163
|
+
* like) with `model: "<synthetic>"`. Angle-bracketed values are placeholders,
|
|
164
|
+
* never real model ids, and must not be surfaced as the session's model.
|
|
165
|
+
*/
|
|
166
|
+
const isPlaceholderModel = (model) => model.startsWith('<') && model.endsWith('>');
|
|
167
|
+
/** Exported for tests. */
|
|
168
|
+
export const extractClaudeEventModel = (event, sessionId) => {
|
|
144
169
|
const eventSessionId = event.sessionId ?? event.session_id;
|
|
145
170
|
if (eventSessionId && eventSessionId !== sessionId) {
|
|
146
171
|
return null;
|
|
@@ -150,11 +175,11 @@ const extractClaudeEventModel = (event, sessionId) => {
|
|
|
150
175
|
return contentModel;
|
|
151
176
|
}
|
|
152
177
|
const directModel = event.model?.trim();
|
|
153
|
-
if (directModel) {
|
|
178
|
+
if (directModel && !isPlaceholderModel(directModel)) {
|
|
154
179
|
return directModel;
|
|
155
180
|
}
|
|
156
181
|
const messageModel = event.message?.model?.trim();
|
|
157
|
-
return messageModel
|
|
182
|
+
return messageModel && !isPlaceholderModel(messageModel) ? messageModel : null;
|
|
158
183
|
};
|
|
159
184
|
const stripAnsi = (value) => value.replace(ANSI_PATTERN, '');
|
|
160
185
|
const extractTaggedContent = (content, tagName) => {
|
|
@@ -167,12 +192,14 @@ const extractClaudeModelFromTextContent = (content) => {
|
|
|
167
192
|
if (localCommandStdout !== null) {
|
|
168
193
|
const cleanedStdout = stripAnsi(localCommandStdout).replace(/\s+/g, ' ').trim();
|
|
169
194
|
const changedModel = /(?:set|changed|switched)\s+model\s+to\s+(.+?)\.?$/i.exec(cleanedStdout);
|
|
170
|
-
|
|
171
|
-
|
|
195
|
+
const stdoutModel = changedModel?.[1]?.trim();
|
|
196
|
+
// A placeholder stdout hit must not shadow a real <model> tag further down.
|
|
197
|
+
if (stdoutModel && !isPlaceholderModel(stdoutModel)) {
|
|
198
|
+
return stdoutModel;
|
|
172
199
|
}
|
|
173
200
|
}
|
|
174
201
|
const modelTag = extractTaggedContent(content, 'model')?.trim();
|
|
175
|
-
return modelTag
|
|
202
|
+
return modelTag && !isPlaceholderModel(modelTag) ? modelTag : null;
|
|
176
203
|
};
|
|
177
204
|
const extractClaudeModelFromMessageContent = (content) => {
|
|
178
205
|
if (typeof content === 'string') {
|
|
@@ -185,6 +212,8 @@ const extractClaudeModelFromMessageContent = (content) => {
|
|
|
185
212
|
if (!part || typeof part !== 'object' || !('text' in part) || typeof part.text !== 'string') {
|
|
186
213
|
continue;
|
|
187
214
|
}
|
|
215
|
+
// extractClaudeModelFromTextContent rejects placeholders, so a placeholder
|
|
216
|
+
// part yields null here and a later part can still supply the real model.
|
|
188
217
|
const model = extractClaudeModelFromTextContent(part.text);
|
|
189
218
|
if (model) {
|
|
190
219
|
return model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-models.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/claude/claude-models.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAOzD,OAAO,EAAE,sCAAsC,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,CAAC,MAAM,wBAAwB,GAA6B;IAChE,OAAO,EAAE;QACP;YACE,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,uBAAuB;YAC9B,WAAW,EAAE,mEAAmE;YAChF,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE;oBACN,EAAE,KAAK,EAAE,KAAK,EAAE;oBAChB,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACnB,EAAE,KAAK,EAAE,MAAM,EAAE;oBACjB,EAAE,KAAK,EAAE,KAAK,EAAE;iBACjB;aACF;SACF;QACD;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,8DAA8D;YAC3E,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE;oBACN,EAAE,KAAK,EAAE,KAAK,EAAE;oBAChB,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACnB,EAAE,KAAK,EAAE,MAAM,EAAE;oBACjB,EAAE,KAAK,EAAE,OAAO,EAAE;oBAClB,EAAE,KAAK,EAAE,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"claude-models.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/claude/claude-models.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import os from 'os';
|
|
|
17
17
|
import path from 'path';
|
|
18
18
|
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
19
19
|
import { appendFilesInputTag, buildClaudeUserContent, normalizeImageDescriptors } from '../../../../shared/image-attachments.js';
|
|
20
|
-
import { CLAUDE_PREDEFINED_MODELS } from '../../../../modules/providers/list/claude/claude-models.provider.js';
|
|
20
|
+
import { CLAUDE_PREDEFINED_MODELS, CLAUDE_ULTRACODE_EFFORT } from '../../../../modules/providers/list/claude/claude-models.provider.js';
|
|
21
21
|
import { resolveClaudeCodeExecutablePath } from '../../../../shared/claude-cli-path.js';
|
|
22
22
|
import { createNotificationEvent, notifyBackgroundWorkCompleted, notifyRunFailed, notifyRunStopped, notifyUserIfEnabled } from '../../../../modules/notifications/index.js';
|
|
23
23
|
import { createCompleteMessage, createNormalizedMessage } from '../../../../shared/utils.js';
|
|
@@ -51,6 +51,11 @@ const TOOL_APPROVAL_TIMEOUT_MS = parseInt(process.env.CLAUDE_TOOL_APPROVAL_TIMEO
|
|
|
51
51
|
// forever. The timer resets on every message, so it measures silence, not total time.
|
|
52
52
|
const BG_WAIT_CEILING_MS = 30 * 60 * 1000;
|
|
53
53
|
const TOOLS_REQUIRING_INTERACTION = new Set(['AskUserQuestion', 'ExitPlanMode']);
|
|
54
|
+
// Ultracode is a session-scoped setting rather than an SDK effort level: it pairs xhigh
|
|
55
|
+
// effort with standing dynamic-workflow orchestration, and the CLI only honours it when
|
|
56
|
+
// Workflows are enabled. The catalog offers it as an effort choice for the picker, so the
|
|
57
|
+
// selection is translated back into the two options the SDK actually understands here.
|
|
58
|
+
const ULTRACODE_SDK_EFFORT = 'xhigh';
|
|
54
59
|
function resolveClaudeEffort(model, effort, modelsDefinition = CLAUDE_PREDEFINED_MODELS) {
|
|
55
60
|
const selectedModel = modelsDefinition?.OPTIONS?.find((option) => option.value === model) || null;
|
|
56
61
|
const allowedEfforts = selectedModel?.effort?.values
|
|
@@ -59,6 +64,27 @@ function resolveClaudeEffort(model, effort, modelsDefinition = CLAUDE_PREDEFINED
|
|
|
59
64
|
? effort
|
|
60
65
|
: undefined;
|
|
61
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Writes the resolved effort choice onto the SDK options, expanding `ultracode` into the
|
|
69
|
+
* xhigh effort level plus the session-scoped settings it requires.
|
|
70
|
+
* @param {Object} sdkOptions - SDK options being built
|
|
71
|
+
* @param {string|undefined} resolvedEffort - Catalog-validated effort selection
|
|
72
|
+
*/
|
|
73
|
+
function applyClaudeEffort(sdkOptions, resolvedEffort) {
|
|
74
|
+
if (!resolvedEffort) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (resolvedEffort !== CLAUDE_ULTRACODE_EFFORT) {
|
|
78
|
+
sdkOptions.effort = resolvedEffort;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
sdkOptions.effort = ULTRACODE_SDK_EFFORT;
|
|
82
|
+
sdkOptions.settings = {
|
|
83
|
+
...(sdkOptions.settings || {}),
|
|
84
|
+
ultracode: true,
|
|
85
|
+
enableWorkflows: true
|
|
86
|
+
};
|
|
87
|
+
}
|
|
62
88
|
function createRequestId() {
|
|
63
89
|
if (typeof crypto.randomUUID === 'function') {
|
|
64
90
|
return crypto.randomUUID();
|
|
@@ -149,14 +175,19 @@ function matchesToolPermission(entry, toolName, input) {
|
|
|
149
175
|
return false;
|
|
150
176
|
}
|
|
151
177
|
function mapCliOptionsToSDK(options = {}) {
|
|
152
|
-
const { providerSessionId, cwd, toolsSettings, permissionMode, effort } = options;
|
|
178
|
+
const { providerSessionId, cwd, toolsSettings, permissionMode, effort, resumeAnchorId, resumeFromScratch } = options;
|
|
153
179
|
const sdkOptions = {};
|
|
154
180
|
// Forward all host env vars (e.g. ANTHROPIC_BASE_URL) to the subprocess.
|
|
155
181
|
// Since SDK 0.2.113, options.env replaces process.env instead of overlaying it.
|
|
156
182
|
sdkOptions.env = { ...process.env, CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS: String(BG_WAIT_CEILING_MS) };
|
|
157
183
|
// Resolve the executable eagerly on Windows because the SDK uses raw child_process.spawn,
|
|
158
184
|
// which does not reliably follow npm's shell wrappers like cross-spawn does.
|
|
159
|
-
|
|
185
|
+
// When nothing resolves the option stays unset on purpose: the SDK then falls back to the
|
|
186
|
+
// binary it ships, which beats handing it a bare `claude` that raw spawn can never launch.
|
|
187
|
+
const claudeExecutablePath = resolveClaudeCodeExecutablePath(process.env.CLAUDE_CLI_PATH);
|
|
188
|
+
if (claudeExecutablePath) {
|
|
189
|
+
sdkOptions.pathToClaudeCodeExecutable = claudeExecutablePath;
|
|
190
|
+
}
|
|
160
191
|
if (cwd) {
|
|
161
192
|
sdkOptions.cwd = cwd;
|
|
162
193
|
}
|
|
@@ -187,18 +218,25 @@ function mapCliOptionsToSDK(options = {}) {
|
|
|
187
218
|
sdkOptions.tools = { type: 'preset', preset: 'claude_code' };
|
|
188
219
|
sdkOptions.disallowedTools = settings.disallowedTools || [];
|
|
189
220
|
sdkOptions.model = options.model || CLAUDE_PREDEFINED_MODELS.DEFAULT;
|
|
190
|
-
|
|
191
|
-
if (resolvedEffort) {
|
|
192
|
-
sdkOptions.effort = resolvedEffort;
|
|
193
|
-
}
|
|
221
|
+
applyClaudeEffort(sdkOptions, resolveClaudeEffort(sdkOptions.model, effort, options.effortModels || CLAUDE_PREDEFINED_MODELS));
|
|
194
222
|
sdkOptions.systemPrompt = {
|
|
195
223
|
type: 'preset',
|
|
196
224
|
preset: 'claude_code'
|
|
197
225
|
};
|
|
198
226
|
sdkOptions.settingSources = ['project', 'user', 'local'];
|
|
199
227
|
// The SDK resumes with the provider-native session id, never the app id.
|
|
200
|
-
|
|
228
|
+
// `resumeFromScratch` is set when the very first prompt of a conversation was
|
|
229
|
+
// edited: there is nothing before it to resume through, so the turn has to
|
|
230
|
+
// start the conversation over instead.
|
|
231
|
+
if (providerSessionId && !resumeFromScratch) {
|
|
201
232
|
sdkOptions.resume = providerSessionId;
|
|
233
|
+
// Editing an already-sent message re-runs the conversation truncated just
|
|
234
|
+
// before it. `resumeSessionAt` is inclusive of the uuid it names, so the
|
|
235
|
+
// caller resolves the last row to KEEP and passes that — never the edited
|
|
236
|
+
// turn itself, which would leave the original prompt in context.
|
|
237
|
+
if (resumeAnchorId) {
|
|
238
|
+
sdkOptions.resumeSessionAt = resumeAnchorId;
|
|
239
|
+
}
|
|
202
240
|
}
|
|
203
241
|
return sdkOptions;
|
|
204
242
|
}
|
|
@@ -275,44 +313,118 @@ function transformMessage(sdkMessage) {
|
|
|
275
313
|
}
|
|
276
314
|
return sdkMessage;
|
|
277
315
|
}
|
|
316
|
+
/**
|
|
317
|
+
* True for the user bubble the SDK echoes for a subagent's own prompt.
|
|
318
|
+
*
|
|
319
|
+
* Subagent traffic carries `parent_tool_use_id`, so this echo lands in the main
|
|
320
|
+
* thread and stacks a second copy of the prompt right below the Agent tool card
|
|
321
|
+
* that already displays it. It also disappears on reload, because the transcript
|
|
322
|
+
* keeps that turn in the subagent's sidechain rather than the session file.
|
|
323
|
+
* @param {Object} message - Normalized message about to be sent to the client
|
|
324
|
+
* @returns {boolean}
|
|
325
|
+
*/
|
|
326
|
+
export function isSubagentPromptEcho(message) {
|
|
327
|
+
return Boolean(message?.parentToolUseId) && message.role === 'user' && message.kind === 'text';
|
|
328
|
+
}
|
|
278
329
|
function readNumber(value) {
|
|
279
330
|
const parsed = Number(value);
|
|
280
331
|
return Number.isFinite(parsed) ? parsed : 0;
|
|
281
332
|
}
|
|
282
333
|
/**
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
*
|
|
334
|
+
* @typedef {Object} TokenBudget
|
|
335
|
+
* @property {number} used
|
|
336
|
+
* @property {number} total
|
|
337
|
+
* @property {number} inputTokens
|
|
338
|
+
* @property {number} outputTokens
|
|
339
|
+
* @property {number} [cacheReadTokens]
|
|
340
|
+
* @property {number} [cacheCreationTokens]
|
|
341
|
+
* @property {number} [cacheTokens]
|
|
342
|
+
* @property {{ input: number, output: number }} breakdown
|
|
343
|
+
*/
|
|
344
|
+
/**
|
|
345
|
+
* Builds a context-window budget from an Anthropic-shaped usage payload.
|
|
346
|
+
*
|
|
347
|
+
* `input_tokens + cache_read + cache_creation` is one request's whole prompt,
|
|
348
|
+
* which is exactly what the context window holds at that moment.
|
|
349
|
+
* @param {Object} messageUsage - Anthropic usage payload
|
|
350
|
+
* @returns {TokenBudget} Token budget object
|
|
351
|
+
*/
|
|
352
|
+
function buildTokenBudget(messageUsage) {
|
|
353
|
+
const directInputTokens = readNumber(messageUsage.input_tokens ?? messageUsage.inputTokens);
|
|
354
|
+
const cacheCreationTokens = readNumber(messageUsage.cache_creation_input_tokens ?? messageUsage.cacheCreationInputTokens ?? messageUsage.cacheCreationTokens);
|
|
355
|
+
const cacheReadTokens = readNumber(messageUsage.cache_read_input_tokens ?? messageUsage.cacheReadInputTokens ?? messageUsage.cacheReadTokens);
|
|
356
|
+
const cacheTokens = cacheCreationTokens + cacheReadTokens;
|
|
357
|
+
const inputTokens = directInputTokens + cacheTokens;
|
|
358
|
+
const outputTokens = readNumber(messageUsage.output_tokens ?? messageUsage.outputTokens);
|
|
359
|
+
const contextWindow = parseInt(process.env.CONTEXT_WINDOW, 10) || 160000;
|
|
360
|
+
return {
|
|
361
|
+
used: inputTokens + outputTokens,
|
|
362
|
+
total: contextWindow,
|
|
363
|
+
inputTokens,
|
|
364
|
+
outputTokens,
|
|
365
|
+
cacheReadTokens,
|
|
366
|
+
cacheCreationTokens,
|
|
367
|
+
cacheTokens,
|
|
368
|
+
breakdown: {
|
|
369
|
+
input: inputTokens,
|
|
370
|
+
output: outputTokens,
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Extracts the session's context-window usage from an SDK stream message.
|
|
376
|
+
*
|
|
377
|
+
* Only assistant messages describe the context window: each one reports the
|
|
378
|
+
* prompt its own request carried. The turn-ending `result` is deliberately not
|
|
379
|
+
* a source here — see `extractCumulativeTokenBudget`.
|
|
286
380
|
* @param {Object} sdkMessage - SDK stream message
|
|
287
|
-
* @returns {
|
|
381
|
+
* @returns {TokenBudget|null} Token budget object or null
|
|
288
382
|
*/
|
|
289
383
|
function extractTokenBudget(sdkMessage) {
|
|
290
384
|
if (!sdkMessage || typeof sdkMessage !== 'object') {
|
|
291
385
|
return null;
|
|
292
386
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
387
|
+
// Subagent traffic (parent_tool_use_id set) reports the subagent's own
|
|
388
|
+
// context window, not this session's — surfacing it makes the counter drop
|
|
389
|
+
// to the subagent's number and bounce back on the next main-thread event.
|
|
390
|
+
if (sdkMessage.parent_tool_use_id) {
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
// Only assistant messages carry Anthropic-shaped usage. System
|
|
394
|
+
// task_progress/task_notification events have a top-level `usage` too, but
|
|
395
|
+
// shaped {total_tokens, tool_uses, duration_ms} — reading Anthropic keys
|
|
396
|
+
// off it yields an all-zero budget that flashes "0" in the composer.
|
|
397
|
+
if (sdkMessage.type !== 'assistant') {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
const messageUsage = sdkMessage.message?.usage;
|
|
401
|
+
if (!messageUsage || typeof messageUsage !== 'object') {
|
|
402
|
+
return null;
|
|
403
|
+
}
|
|
404
|
+
return buildTokenBudget(messageUsage);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Last-resort budget read from a turn's `result` message.
|
|
408
|
+
*
|
|
409
|
+
* `result.usage` and `result.modelUsage` are the turn's *bill*: every request
|
|
410
|
+
* the turn made, summed, including each subagent's. A turn that made four
|
|
411
|
+
* requests therefore reports roughly four times the context the conversation
|
|
412
|
+
* actually holds, so publishing it made the counter leap at the end of a turn
|
|
413
|
+
* and fall back on the next assistant message — worst with subagents running,
|
|
414
|
+
* whose requests inflate the sum without ever entering this session's context.
|
|
415
|
+
*
|
|
416
|
+
* It is still the only usage an SDK build that reports none per assistant
|
|
417
|
+
* message ever emits, so it stays available for the caller to use when a turn
|
|
418
|
+
* produced no assistant budget at all.
|
|
419
|
+
* @param {Object} sdkMessage - SDK stream message
|
|
420
|
+
* @returns {TokenBudget|null} Token budget object or null
|
|
421
|
+
*/
|
|
422
|
+
function extractCumulativeTokenBudget(sdkMessage) {
|
|
423
|
+
if (!sdkMessage || typeof sdkMessage !== 'object' || sdkMessage.type !== 'result') {
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
if (sdkMessage.usage && typeof sdkMessage.usage === 'object') {
|
|
427
|
+
return buildTokenBudget(sdkMessage.usage);
|
|
316
428
|
}
|
|
317
429
|
if (!sdkMessage.modelUsage || typeof sdkMessage.modelUsage !== 'object') {
|
|
318
430
|
return null;
|
|
@@ -512,6 +624,9 @@ async function queryClaudeSDK(command, options = {}, ws, context) {
|
|
|
512
624
|
// True while the process is being held open for background work, so a later
|
|
513
625
|
// `result` can be recognised as that work reporting back.
|
|
514
626
|
let heldForBackgroundWork = false;
|
|
627
|
+
// Set once a turn publishes a budget read from an assistant message, so the
|
|
628
|
+
// turn-ending `result` is only mined for usage when nothing better arrived.
|
|
629
|
+
let assistantBudgetSent = false;
|
|
515
630
|
// A new turn supersedes any earlier one still holding this session's process
|
|
516
631
|
// open, so held runs cannot stack up across a conversation.
|
|
517
632
|
if (sessionKey()) {
|
|
@@ -630,6 +745,12 @@ async function queryClaudeSDK(command, options = {}, ws, context) {
|
|
|
630
745
|
if (decision.cancelled) {
|
|
631
746
|
return { behavior: 'deny', message: 'Permission request cancelled' };
|
|
632
747
|
}
|
|
748
|
+
// A client answered. Announce it on the run stream so the replay buffer
|
|
749
|
+
// and every other attached tab drop the prompt — resolving happens over
|
|
750
|
+
// the inbound socket only, so without this a mid-run page refresh
|
|
751
|
+
// replays the `permission_request` with nothing to retract it and the
|
|
752
|
+
// already-answered prompt resurrects.
|
|
753
|
+
ws.send(createNormalizedMessage({ kind: 'permission_resolved', requestId, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
633
754
|
if (decision.allow) {
|
|
634
755
|
if (decision.rememberEntry && typeof decision.rememberEntry === 'string') {
|
|
635
756
|
if (!sdkOptions.allowedTools.includes(decision.rememberEntry)) {
|
|
@@ -699,11 +820,20 @@ async function queryClaudeSDK(command, options = {}, ws, context) {
|
|
|
699
820
|
if (transformedMessage.parentToolUseId && !msg.parentToolUseId) {
|
|
700
821
|
msg.parentToolUseId = transformedMessage.parentToolUseId;
|
|
701
822
|
}
|
|
823
|
+
if (isSubagentPromptEcho(msg)) {
|
|
824
|
+
continue;
|
|
825
|
+
}
|
|
702
826
|
ws.send(msg);
|
|
703
827
|
}
|
|
704
|
-
// Extract and send token budget updates from assistant
|
|
705
|
-
|
|
828
|
+
// Extract and send token budget updates from assistant usage payloads,
|
|
829
|
+
// falling back to the turn's cumulative bill only for SDK builds that
|
|
830
|
+
// report no per-assistant usage at all.
|
|
831
|
+
const tokenBudgetData = extractTokenBudget(message)
|
|
832
|
+
|| (assistantBudgetSent ? null : extractCumulativeTokenBudget(message));
|
|
706
833
|
if (tokenBudgetData) {
|
|
834
|
+
if (message.type === 'assistant') {
|
|
835
|
+
assistantBudgetSent = true;
|
|
836
|
+
}
|
|
707
837
|
ws.send(createNormalizedMessage({ kind: 'status', text: 'token_budget', tokenBudget: tokenBudgetData, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
708
838
|
}
|
|
709
839
|
if (startsBackgroundWork(message)) {
|
|
@@ -924,5 +1054,5 @@ export const claudeRuntime = {
|
|
|
924
1054
|
},
|
|
925
1055
|
};
|
|
926
1056
|
// Export public API
|
|
927
|
-
export { queryClaudeSDK, abortClaudeSDKSession, isClaudeSDKSessionActive, getActiveClaudeSDKSessions, resolveToolApproval, getPendingApprovalsForSession, reconnectSessionWriter };
|
|
1057
|
+
export { queryClaudeSDK, abortClaudeSDKSession, isClaudeSDKSessionActive, getActiveClaudeSDKSessions, resolveToolApproval, getPendingApprovalsForSession, reconnectSessionWriter, extractTokenBudget, extractCumulativeTokenBudget };
|
|
928
1058
|
//# sourceMappingURL=claude-runtime.provider.js.map
|