@cloudcli-ai/cloudcli 1.37.1 → 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 +1 -1
- package/dist/assets/abnfDiagram-N423BO3Z-CJntskwA.js +1 -0
- package/dist/assets/arc-CIfH4uMN.js +1 -0
- package/dist/assets/architectureDiagram-T3A2C74G-_IpEkukg.js +36 -0
- package/dist/assets/blockDiagram-VBNYF7ZC-BttxrpgZ.js +132 -0
- package/dist/assets/c4Diagram-5PPSVZJV-g51dSRr1.js +10 -0
- package/dist/assets/channel-C5xU9jMw.js +1 -0
- package/dist/assets/chunk-2GRJ4B5K-D_-LbQUa.js +1 -0
- package/dist/assets/chunk-2Q5K7J3B-BtlHzwaO.js +1 -0
- package/dist/assets/chunk-5RXB4S5H-UzkpvpAT.js +231 -0
- package/dist/assets/chunk-5VM5RSS4-BKwx5Gag.js +15 -0
- package/dist/assets/chunk-6Q2QTUOP-D_KEBH5f.js +88 -0
- package/dist/assets/chunk-GF5L2VYU-rK2DGyto.js +206 -0
- package/dist/assets/chunk-JWPE2WC7-CeBl_N9i.js +1 -0
- package/dist/assets/chunk-KBJHAD2P-BiQLWVIr.js +1 -0
- package/dist/assets/chunk-RYQCIY6F-C1knVGV5.js +1 -0
- package/dist/assets/chunk-XXDRQBXY-CtKbJkvF.js +1 -0
- 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-DjX8y40Z.js +1 -0
- package/dist/assets/cynefin-VYW2F7L2-DM6YeRba.js +178 -0
- package/dist/assets/cynefinDiagram-MW4NZA55-wZJ-vy5B.js +62 -0
- package/dist/assets/cytoscape.esm-C10L9Icf.js +331 -0
- package/dist/assets/dagre-VZM6K2ZE-BzP0ejkH.js +4 -0
- package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/assets/diagram-7IWD3JNH-BTL_j23J.js +30 -0
- package/dist/assets/diagram-B4RE2ZJO-Cf1Norgu.js +3 -0
- package/dist/assets/diagram-LBJQPF4R-DPiUEKr-.js +24 -0
- package/dist/assets/diagram-Q27KOJAE-CTcTpiz5.js +24 -0
- package/dist/assets/diagram-UB23O5K3-DPMSdYm0.js +41 -0
- package/dist/assets/ebnfDiagram-BXEA7PRR-7yvD6uiF.js +1 -0
- package/dist/assets/erDiagram-JOGREHBK-CfgeDoV6.js +85 -0
- package/dist/assets/flowDiagram-UKHOOZJN-B27ng5zu.js +156 -0
- package/dist/assets/ganttDiagram-PKOTCBZU-CcC6b_7t.js +292 -0
- package/dist/assets/gitGraphDiagram-DS77QQ5N-BX5kPGrO.js +106 -0
- package/dist/assets/graph-Cx-EqisW.js +1 -0
- package/dist/assets/index-BTDHQ6Id.css +32 -0
- package/dist/assets/index-sFfz8iBR.js +4931 -0
- package/dist/assets/infoDiagram-6WML65LV-CUP-SlN4.js +2 -0
- package/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dist/assets/ishikawaDiagram-WSZJBQD7-BTTDhOpX.js +70 -0
- package/dist/assets/journeyDiagram-NVQOT4AX-ARXcc61m.js +139 -0
- package/dist/assets/kanban-definition-27J2QSJJ-BieMpqMA.js +89 -0
- package/dist/assets/layout-D6BstSzF.js +1 -0
- package/dist/assets/linear-61vxjRnP.js +1 -0
- package/dist/assets/map-CV9uif0g.js +1 -0
- package/dist/assets/mermaid.core-nhnwkfQx.js +312 -0
- package/dist/assets/mindmap-definition-FAOFIHXS-Cm6x5vT1.js +96 -0
- package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/assets/pegDiagram-VL7TDLO6-CcYBq_9H.js +1 -0
- package/dist/assets/pieDiagram-7S7Q4E2Y-CfvIjfzo.js +39 -0
- package/dist/assets/quadrantDiagram-CIZ2JOQS-SgYoWPNb.js +7 -0
- package/dist/assets/railroadDiagram-AXF67PYL-D2Mu5E_f.js +1 -0
- package/dist/assets/requirementDiagram-LRYGKXZP-Azwe_k4Q.js +84 -0
- package/dist/assets/sankeyDiagram-W5VNT64P-DN1Ju3PA.js +40 -0
- package/dist/assets/sequenceDiagram-SI44F4Z6-Bj4qC34S.js +162 -0
- package/dist/assets/server.browser-CtX3Hdl5.js +27 -0
- package/dist/assets/sizeCapture-X5ZJPWSS-Co4PdklG.js +1 -0
- package/dist/assets/stateDiagram-OKZ733FA-nOvL9dRC.js +1 -0
- package/dist/assets/stateDiagram-v2-UEYNNEHI-DNv8ppw7.js +1 -0
- package/dist/assets/swimlanes-SLNWSIFB-CCK3wMid.js +2 -0
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DnfbNQEp.js +8 -0
- package/dist/assets/timeline-definition-Z64GVDOM-BC29RNFm.js +120 -0
- package/dist/assets/{vendor-codemirror-OwyKSvPE.js → vendor-codemirror-CYrSt7-U.js} +18 -18
- package/dist/assets/vennDiagram-T6HMQDX7-pZlZCtEo.js +34 -0
- package/dist/assets/wardleyDiagram-T6FBY63Y-De8k2-zM.js +78 -0
- package/dist/assets/xychartDiagram-ELKLHX3M-Bk8ykH0w.js +7 -0
- package/dist/index.html +3 -3
- package/dist-server/server/index.js +8 -5
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/agent/agent.module.js +2 -1
- package/dist-server/server/modules/agent/agent.module.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/auth/auth.middleware.js +1 -1
- package/dist-server/server/modules/auth/auth.middleware.js.map +1 -1
- package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
- package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
- 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/browser-use/browser-use.service.js +3 -6
- package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
- package/dist-server/server/modules/browser-use/index.js +2 -0
- package/dist-server/server/modules/browser-use/index.js.map +1 -1
- package/dist-server/server/modules/cli/cli.js +9 -3
- package/dist-server/server/modules/cli/cli.js.map +1 -1
- package/dist-server/server/modules/cli/cli.module.js +0 -1
- package/dist-server/server/modules/cli/cli.module.js.map +1 -1
- package/dist-server/server/modules/cli/cli.service.js +0 -18
- package/dist-server/server/modules/cli/cli.service.js.map +1 -1
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/cli.service.test.js +0 -3
- package/dist-server/server/modules/cli/tests/cli.service.test.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/file-tree/file-tree.service.js +18 -10
- package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -1
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +62 -11
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -1
- package/dist-server/server/modules/git/git-branch.service.js +15 -0
- package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
- package/dist-server/server/modules/git/git.routes.js +15 -7
- package/dist-server/server/modules/git/git.routes.js.map +1 -1
- package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
- package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js +84 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -1
- package/dist-server/server/modules/notifications/index.js +3 -1
- package/dist-server/server/modules/notifications/index.js.map +1 -1
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +22 -1
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -1
- 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 +422 -86
- 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 +29 -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-conversations-search.service.js +63 -7
- package/dist-server/server/modules/providers/services/session-conversations-search.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/provider.routes.test.js +35 -0
- package/dist-server/server/modules/providers/tests/provider.routes.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 +42 -0
- package/dist-server/server/shared/utils.js.map +1 -1
- package/package.json +23 -16
- package/scripts/promote-dist-server.mjs +50 -0
- package/server/index.ts +12 -6
- package/server/modules/agent/agent.module.ts +2 -1
- package/server/modules/agent/agent.routes.ts +2 -2
- package/server/modules/agent/tests/agent.routes.test.ts +33 -1
- package/server/modules/auth/auth.middleware.ts +2 -2
- package/server/modules/browser-use/browser-use-runtime.ts +10 -0
- package/server/modules/browser-use/browser-use.routes.ts +96 -33
- package/server/modules/browser-use/browser-use.service.ts +5 -8
- package/server/modules/browser-use/index.ts +3 -0
- package/server/modules/cli/cli.module.ts +0 -1
- package/server/modules/cli/cli.service.ts +0 -20
- package/server/modules/cli/cli.ts +9 -3
- package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
- package/server/modules/cli/tests/cli.service.test.ts +0 -3
- 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/file-tree/file-tree.service.ts +21 -10
- package/server/modules/file-tree/tests/file-tree.service.test.ts +65 -11
- package/server/modules/git/git-branch.service.ts +43 -0
- package/server/modules/git/git.routes.ts +16 -9
- package/server/modules/git/tests/git-branch.service.test.ts +60 -0
- package/server/modules/git/tests/git-init.routes.test.ts +83 -0
- package/server/modules/notifications/index.ts +2 -0
- package/server/modules/notifications/services/notification-orchestrator.service.js +24 -1
- 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 +463 -93
- 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 +36 -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-conversations-search.service.ts +94 -7
- 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/provider.routes.test.ts +61 -0
- 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 -3
- package/server/shared/utils.ts +50 -0
- package/server/tsconfig.json +6 -2
- package/README.de.md +0 -257
- package/README.ja.md +0 -249
- package/README.ko.md +0 -249
- package/README.ru.md +0 -257
- package/README.tr.md +0 -258
- package/README.zh-CN.md +0 -249
- package/README.zh-TW.md +0 -249
- package/dist/assets/index-D3jfzuKN.css +0 -32
- package/dist/assets/index-DTMWjJj8.js +0 -1550
- package/dist-server/server/constants/config.js +0 -6
- package/dist-server/server/constants/config.js.map +0 -1
- package/server/constants/config.ts +0 -5
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { projectsDb, sessionsDb } from '../../../modules/database/index.js';
|
|
3
|
-
import { generateDisplayName } from '../../../modules/projects/index.js';
|
|
1
|
+
import { sessionsDb } from '../../../modules/database/index.js';
|
|
4
2
|
import { ChatSessionWriter } from '../../../modules/websocket/services/chat-session-writer.service.js';
|
|
5
|
-
import {
|
|
3
|
+
import { broadcastSessionUpserted } from '../../../modules/websocket/services/session-upsert-broadcast.service.js';
|
|
6
4
|
/**
|
|
7
5
|
* How long a completed run stays available for replay. Covers the window
|
|
8
6
|
* between a run finishing and the client refreshing history over REST (for
|
|
@@ -24,44 +22,6 @@ const MAX_BUFFERED_EVENTS_PER_RUN = 5000;
|
|
|
24
22
|
* path all consult it instead of asking each provider runtime individually.
|
|
25
23
|
*/
|
|
26
24
|
const runs = new Map();
|
|
27
|
-
async function broadcastCanonicalSessionUpsert(appSessionId) {
|
|
28
|
-
const row = sessionsDb.getSessionById(appSessionId);
|
|
29
|
-
if (!row || row.isArchived) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const projectPath = row.project_path;
|
|
33
|
-
const project = projectPath ? projectsDb.getProjectPath(projectPath) : null;
|
|
34
|
-
const displayName = project?.custom_project_name?.trim()
|
|
35
|
-
? project.custom_project_name
|
|
36
|
-
: await generateDisplayName(path.basename(projectPath ?? '') || (projectPath ?? ''), projectPath);
|
|
37
|
-
const payload = JSON.stringify({
|
|
38
|
-
kind: 'session_upserted',
|
|
39
|
-
sessionId: row.session_id,
|
|
40
|
-
providerSessionId: row.provider_session_id,
|
|
41
|
-
provider: row.provider,
|
|
42
|
-
session: {
|
|
43
|
-
id: row.session_id,
|
|
44
|
-
summary: row.custom_name || '',
|
|
45
|
-
messageCount: 0,
|
|
46
|
-
lastActivity: row.updated_at ?? row.created_at ?? new Date().toISOString(),
|
|
47
|
-
},
|
|
48
|
-
project: project
|
|
49
|
-
? {
|
|
50
|
-
projectId: project.project_id,
|
|
51
|
-
path: project.project_path,
|
|
52
|
-
fullPath: project.project_path,
|
|
53
|
-
displayName,
|
|
54
|
-
isStarred: Boolean(project.isStarred),
|
|
55
|
-
}
|
|
56
|
-
: null,
|
|
57
|
-
timestamp: new Date().toISOString(),
|
|
58
|
-
});
|
|
59
|
-
connectedClients.forEach((client) => {
|
|
60
|
-
if (client.readyState === WS_OPEN_STATE) {
|
|
61
|
-
client.send(payload);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
25
|
function evictRunLater(appSessionId) {
|
|
66
26
|
const timer = setTimeout(() => {
|
|
67
27
|
const run = runs.get(appSessionId);
|
|
@@ -126,7 +86,7 @@ function recordProviderSessionId(run, providerSessionId) {
|
|
|
126
86
|
run.providerSessionId = providerSessionId;
|
|
127
87
|
try {
|
|
128
88
|
sessionsDb.assignProviderSessionId(run.appSessionId, providerSessionId);
|
|
129
|
-
void
|
|
89
|
+
void broadcastSessionUpserted(run.appSessionId).catch((error) => {
|
|
130
90
|
const message = error instanceof Error ? error.message : String(error);
|
|
131
91
|
console.error('[ChatRunRegistry] Failed to broadcast canonical session mapping', {
|
|
132
92
|
appSessionId: run.appSessionId,
|
|
@@ -203,11 +163,17 @@ export const chatRunRegistry = {
|
|
|
203
163
|
}));
|
|
204
164
|
},
|
|
205
165
|
/**
|
|
206
|
-
*
|
|
166
|
+
* Adds a websocket connection to a run's live audience.
|
|
207
167
|
*
|
|
208
168
|
* This is the generic replacement for the Claude-only writer reconnect:
|
|
209
169
|
* after a page refresh the new socket subscribes and immediately starts
|
|
210
170
|
* receiving the still-running stream, for every provider.
|
|
171
|
+
*
|
|
172
|
+
* Subscribing does not take the stream away from sockets that were already
|
|
173
|
+
* watching — a session open in two places stays live in both, and the
|
|
174
|
+
* refreshed tab's abandoned socket is dropped when the next event finds it
|
|
175
|
+
* closed. Replay stays per-connection because each client sends its own
|
|
176
|
+
* `lastSeq` with `chat.subscribe`.
|
|
211
177
|
*/
|
|
212
178
|
attachConnection(appSessionId, connection) {
|
|
213
179
|
const run = runs.get(appSessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-run-registry.service.js","sourceRoot":"","sources":["../../../../../server/modules/websocket/services/chat-run-registry.service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"chat-run-registry.service.js","sourceRoot":"","sources":["../../../../../server/modules/websocket/services/chat-run-registry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,6 @@ import { createCompleteMessage, readObjectRecord } from '../../../shared/utils.j
|
|
|
17
17
|
* intercepted and recorded as the provider-id mapping as well.
|
|
18
18
|
*/
|
|
19
19
|
export class ChatSessionWriter {
|
|
20
|
-
ws;
|
|
21
20
|
userId;
|
|
22
21
|
/**
|
|
23
22
|
* Some runtimes feature-detect their writer with this flag; keep it so the
|
|
@@ -25,6 +24,17 @@ export class ChatSessionWriter {
|
|
|
25
24
|
*/
|
|
26
25
|
isWebSocketWriter = true;
|
|
27
26
|
options;
|
|
27
|
+
/**
|
|
28
|
+
* Every socket currently watching this run, not just the one that started
|
|
29
|
+
* it. A session can legitimately be open in more than one place — a second
|
|
30
|
+
* browser tab, a phone alongside a laptop, the desktop app beside the web
|
|
31
|
+
* app — and each of those subscribes through `attachConnection`.
|
|
32
|
+
*
|
|
33
|
+
* Holding a single connection here meant the newest subscriber took the
|
|
34
|
+
* stream away from everyone before it, so a second tab silently froze
|
|
35
|
+
* mid-run and only caught up on the next REST history refresh.
|
|
36
|
+
*/
|
|
37
|
+
connections = new Set();
|
|
28
38
|
/**
|
|
29
39
|
* The provider-native session id as the runtime knows it. Kept locally
|
|
30
40
|
* (besides the registry) because runtimes read it back via `getSessionId()`
|
|
@@ -34,7 +44,12 @@ export class ChatSessionWriter {
|
|
|
34
44
|
providerSessionId;
|
|
35
45
|
constructor(options) {
|
|
36
46
|
this.options = options;
|
|
37
|
-
|
|
47
|
+
// A run started by a timer has no audience yet. Everything still goes
|
|
48
|
+
// through `decorateOutboundEvent` into the run's replay buffer, so a
|
|
49
|
+
// client that subscribes mid-run catches up from the beginning.
|
|
50
|
+
if (options.connection) {
|
|
51
|
+
this.connections.add(options.connection);
|
|
52
|
+
}
|
|
38
53
|
this.userId = options.userId;
|
|
39
54
|
this.providerSessionId = options.providerSessionId;
|
|
40
55
|
}
|
|
@@ -80,8 +95,13 @@ export class ChatSessionWriter {
|
|
|
80
95
|
this.forward(outbound);
|
|
81
96
|
}
|
|
82
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Adds a socket to the run's live audience. Named for the `WebSocketWriter`
|
|
100
|
+
* method it stands in for, so runtime adapters keep working unchanged —
|
|
101
|
+
* but it adds rather than replaces.
|
|
102
|
+
*/
|
|
83
103
|
updateWebSocket(newConnection) {
|
|
84
|
-
this.
|
|
104
|
+
this.connections.add(newConnection);
|
|
85
105
|
}
|
|
86
106
|
setSessionId(sessionId) {
|
|
87
107
|
this.captureProviderSessionId(sessionId);
|
|
@@ -97,8 +117,18 @@ export class ChatSessionWriter {
|
|
|
97
117
|
this.options.onProviderSessionId(providerSessionId);
|
|
98
118
|
}
|
|
99
119
|
forward(message) {
|
|
100
|
-
|
|
101
|
-
|
|
120
|
+
const payload = JSON.stringify(message);
|
|
121
|
+
// Sending is also when dead sockets get collected: a refreshed tab leaves
|
|
122
|
+
// its old connection behind, and without dropping it here the set would
|
|
123
|
+
// grow for the whole life of the run. Deleting during iteration is safe
|
|
124
|
+
// for a Set — the removed entry is simply not revisited.
|
|
125
|
+
for (const connection of this.connections) {
|
|
126
|
+
if (connection.readyState === WS_OPEN_STATE) {
|
|
127
|
+
connection.send(payload);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.connections.delete(connection);
|
|
131
|
+
}
|
|
102
132
|
}
|
|
103
133
|
}
|
|
104
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-session-writer.service.js","sourceRoot":"","sources":["../../../../../server/modules/websocket/services/chat-session-writer.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAMxF,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAuB5E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,iBAAiB;IAC5B,
|
|
1
|
+
{"version":3,"file":"chat-session-writer.service.js","sourceRoot":"","sources":["../../../../../server/modules/websocket/services/chat-session-writer.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { sessionsDb } from '../../../modules/database/index.js';
|
|
3
|
-
import { providerModelsService } from '../../../modules/providers/index.js';
|
|
3
|
+
import { providerModelsService, sessionsService } from '../../../modules/providers/index.js';
|
|
4
4
|
import { chatRunRegistry } from '../../../modules/websocket/services/chat-run-registry.service.js';
|
|
5
5
|
import { connectedClients, WS_OPEN_STATE } from '../../../modules/websocket/services/websocket-state.service.js';
|
|
6
6
|
import { getGlobalImageAssetsDir, isImageAttachmentDescriptor, normalizeAttachmentDescriptors, } from '../../../shared/image-attachments.js';
|
|
@@ -84,21 +84,42 @@ function readRequiredSessionId(data) {
|
|
|
84
84
|
* registers the run, and dispatches to the provider runtime.
|
|
85
85
|
*/
|
|
86
86
|
async function handleChatSend(ws, userId, data, dependencies) {
|
|
87
|
+
const resolved = resolveSendTarget(ws, data, dependencies, 'chat.send');
|
|
88
|
+
if (!resolved) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await dispatchRun(ws, userId, resolved.sessionId, resolved.session, data, dependencies);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Shared front half of `chat.send` and `chat.edit-send`: the session row and
|
|
95
|
+
* provider come from the database, never from the client.
|
|
96
|
+
*/
|
|
97
|
+
function resolveSendTarget(ws, data, dependencies, frameName) {
|
|
87
98
|
const sessionId = readRequiredSessionId(data);
|
|
88
99
|
if (!sessionId) {
|
|
89
|
-
sendProtocolError(ws, 'SESSION_ID_REQUIRED',
|
|
90
|
-
return;
|
|
100
|
+
sendProtocolError(ws, 'SESSION_ID_REQUIRED', `${frameName} requires a sessionId.`);
|
|
101
|
+
return null;
|
|
91
102
|
}
|
|
92
103
|
const session = sessionsDb.getSessionById(sessionId);
|
|
93
104
|
if (!session) {
|
|
94
105
|
sendProtocolError(ws, 'SESSION_NOT_FOUND', `Session "${sessionId}" was not found. Create it via POST /api/providers/sessions first.`, sessionId);
|
|
95
|
-
return;
|
|
106
|
+
return null;
|
|
96
107
|
}
|
|
97
108
|
const provider = session.provider;
|
|
98
109
|
if (!dependencies.runtime.hasRuntime(provider)) {
|
|
99
110
|
sendProtocolError(ws, 'UNSUPPORTED_PROVIDER', `Provider "${provider}" is not available.`, sessionId);
|
|
100
|
-
return;
|
|
111
|
+
return null;
|
|
101
112
|
}
|
|
113
|
+
return { sessionId, session, provider };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Registers the run and hands the turn to the provider runtime.
|
|
117
|
+
*
|
|
118
|
+
* `extraRuntimeOptions` is how an edited message asks the provider to resume
|
|
119
|
+
* partway instead of continuing from the tip; a normal send passes nothing.
|
|
120
|
+
*/
|
|
121
|
+
async function dispatchRun(ws, userId, sessionId, session, data, dependencies, extraRuntimeOptions = {}, beforeRun) {
|
|
122
|
+
const provider = session.provider;
|
|
102
123
|
const run = chatRunRegistry.startRun({
|
|
103
124
|
appSessionId: sessionId,
|
|
104
125
|
provider,
|
|
@@ -107,8 +128,10 @@ async function handleChatSend(ws, userId, data, dependencies) {
|
|
|
107
128
|
userId,
|
|
108
129
|
});
|
|
109
130
|
if (!run) {
|
|
110
|
-
|
|
111
|
-
|
|
131
|
+
if (ws) {
|
|
132
|
+
sendProtocolError(ws, 'RUN_IN_PROGRESS', `Session "${sessionId}" already has a run in progress.`, sessionId);
|
|
133
|
+
}
|
|
134
|
+
return { started: false, error: 'A run is already in progress for this session.' };
|
|
112
135
|
}
|
|
113
136
|
const clientOptions = (data.options ?? {});
|
|
114
137
|
const command = typeof data.content === 'string' ? data.content : '';
|
|
@@ -136,6 +159,7 @@ async function handleChatSend(ws, userId, data, dependencies) {
|
|
|
136
159
|
// app session id.
|
|
137
160
|
const runtimeOptions = {
|
|
138
161
|
...clientOptions,
|
|
162
|
+
...extraRuntimeOptions,
|
|
139
163
|
// Attachments are re-validated server-side: only direct children of the
|
|
140
164
|
// global upload store may reach provider runtimes or their file tools.
|
|
141
165
|
attachments: uniqueAttachments,
|
|
@@ -145,12 +169,18 @@ async function handleChatSend(ws, userId, data, dependencies) {
|
|
|
145
169
|
cwd: clientOptions.cwd ?? session.project_path ?? undefined,
|
|
146
170
|
projectPath: session.project_path ?? clientOptions.projectPath,
|
|
147
171
|
};
|
|
172
|
+
let failure = null;
|
|
148
173
|
try {
|
|
174
|
+
// Runs only now that the session is reserved, because an edit rewinds the
|
|
175
|
+
// conversation here and a rewind for a run that was never admitted cannot
|
|
176
|
+
// be taken back. Inside the try so a rewind that throws still releases the
|
|
177
|
+
// run instead of leaving the session processing forever.
|
|
178
|
+
await beforeRun?.(run);
|
|
149
179
|
await dependencies.runtime.run(provider, command, runtimeOptions, run.writer);
|
|
150
180
|
}
|
|
151
181
|
catch (error) {
|
|
152
|
-
|
|
153
|
-
console.error(`[Chat] Provider runtime "${provider}" failed`, { sessionId, error:
|
|
182
|
+
failure = error instanceof Error ? error.message : String(error);
|
|
183
|
+
console.error(`[Chat] Provider runtime "${provider}" failed`, { sessionId, error: failure });
|
|
154
184
|
}
|
|
155
185
|
finally {
|
|
156
186
|
// Safety net: a runtime that crashed (or resolved) without emitting its
|
|
@@ -160,6 +190,90 @@ async function handleChatSend(ws, userId, data, dependencies) {
|
|
|
160
190
|
// settles, and the session-keyed completeRun would kill that new run.
|
|
161
191
|
chatRunRegistry.completeRunIfCurrent(run, { exitCode: 1 });
|
|
162
192
|
}
|
|
193
|
+
return { started: true, error: failure };
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Handles `chat.edit-send`: replaces an already-sent message and everything
|
|
197
|
+
* after it with a new turn.
|
|
198
|
+
*
|
|
199
|
+
* Nothing is deleted. The provider resumes the conversation partway and
|
|
200
|
+
* appends the replacement, so the abandoned attempt stays in the transcript
|
|
201
|
+
* file and is simply no longer part of the live conversation — the same shape
|
|
202
|
+
* Claude Code's rewind and Codex's fork-with-cut-point produce.
|
|
203
|
+
*/
|
|
204
|
+
async function handleChatEditSend(ws, userId, data, dependencies) {
|
|
205
|
+
const resolved = resolveSendTarget(ws, data, dependencies, 'chat.edit-send');
|
|
206
|
+
if (!resolved) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const { sessionId, session, provider } = resolved;
|
|
210
|
+
const anchorId = typeof data.anchorId === 'string' ? data.anchorId.trim() : '';
|
|
211
|
+
if (!anchorId) {
|
|
212
|
+
sendProtocolError(ws, 'ANCHOR_REQUIRED', 'chat.edit-send requires the anchorId of the message being replaced.', sessionId);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
let resumeThroughId;
|
|
216
|
+
try {
|
|
217
|
+
const anchor = await sessionsService.resolveEditAnchor(sessionId, anchorId);
|
|
218
|
+
if (!anchor) {
|
|
219
|
+
sendProtocolError(ws, 'EDIT_NOT_SUPPORTED', `Provider "${provider}" cannot replace an already-sent message.`, sessionId);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (!anchor.found) {
|
|
223
|
+
sendProtocolError(ws, 'ANCHOR_NOT_FOUND', 'That message is no longer in the transcript.', sessionId);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
resumeThroughId = anchor.resumeThroughId;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
230
|
+
sendProtocolError(ws, 'ANCHOR_LOOKUP_FAILED', `Could not read the transcript: ${message}`, sessionId);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
// Providers split here on what their runtime can do. Claude resumes its
|
|
234
|
+
// transcript partway, so the anchor rides along as a run option. Codex
|
|
235
|
+
// cannot — a thread only grows — so the conversation is rewound on disk and
|
|
236
|
+
// the run that follows is an ordinary resume of whatever the session then
|
|
237
|
+
// points at. Which of the two applies is decided here; the rewind itself
|
|
238
|
+
// waits until the run has actually been admitted.
|
|
239
|
+
const rewinds = sessionsService.providerRewindsForEdit(sessionId);
|
|
240
|
+
await dispatchRun(ws, userId, sessionId, session, data, dependencies,
|
|
241
|
+
// `null` is meaningful: the edited turn was the first prompt, so the
|
|
242
|
+
// conversation starts over instead of resuming.
|
|
243
|
+
rewinds
|
|
244
|
+
? {}
|
|
245
|
+
: { resumeAnchorId: resumeThroughId ?? undefined, resumeFromScratch: resumeThroughId === null }, async (run) => {
|
|
246
|
+
// Emitted through the run's writer so it is sequenced and replayed like
|
|
247
|
+
// any other event — a second tab watching this session has to truncate
|
|
248
|
+
// too.
|
|
249
|
+
//
|
|
250
|
+
// Before the rewind, not after it. A rewind that has to branch spawns a
|
|
251
|
+
// process and waits on a JSON-RPC round trip, and holding the frame
|
|
252
|
+
// until that came back left the message the user had just edited away
|
|
253
|
+
// sitting on screen for about a second — the very flicker this feature
|
|
254
|
+
// exists to avoid. Announcing first is safe because a rewind that fails
|
|
255
|
+
// still ends the run, and the terminal `complete` makes every client
|
|
256
|
+
// re-read the transcript, which puts back anything that turned out not
|
|
257
|
+
// to have been replaced after all.
|
|
258
|
+
run.writer.send({
|
|
259
|
+
kind: 'history_truncated',
|
|
260
|
+
provider,
|
|
261
|
+
sessionId,
|
|
262
|
+
anchorId,
|
|
263
|
+
});
|
|
264
|
+
if (rewinds) {
|
|
265
|
+
try {
|
|
266
|
+
await sessionsService.rewindSessionForEdit(sessionId, resumeThroughId);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
270
|
+
sendProtocolError(ws, 'EDIT_REWIND_FAILED', `Could not rewind the conversation: ${message}`, sessionId);
|
|
271
|
+
// Ends the run before the provider is asked to continue a
|
|
272
|
+
// conversation that was not rewound after all.
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
});
|
|
163
277
|
}
|
|
164
278
|
/**
|
|
165
279
|
* Handles `chat.abort`: cancels the run for one app session and emits the
|
|
@@ -266,6 +380,46 @@ function handlePermissionResponse(data, dependencies) {
|
|
|
266
380
|
* (`chat_subscribed`, `session_upserted`, `loading_progress`,
|
|
267
381
|
* `protocol_error`).
|
|
268
382
|
*/
|
|
383
|
+
/**
|
|
384
|
+
* Runs a turn for a session with no client attached.
|
|
385
|
+
*
|
|
386
|
+
* Used by scheduled messages, which fire from a timer: there is no socket to
|
|
387
|
+
* report errors to and no audience to stream to. The run is registered exactly
|
|
388
|
+
* like an interactive one, so anyone who opens the session while it is going
|
|
389
|
+
* subscribes and replays it from the start, and the session shows as busy
|
|
390
|
+
* everywhere in the meantime.
|
|
391
|
+
*
|
|
392
|
+
* Resolves when the provider run settles. Returns false when the session has
|
|
393
|
+
* gone away or is busy without `interruptActiveRun`, which the caller reports
|
|
394
|
+
* on the schedule.
|
|
395
|
+
*/
|
|
396
|
+
export async function runDetachedChatTurn(input, dependencies) {
|
|
397
|
+
const session = sessionsDb.getSessionById(input.sessionId);
|
|
398
|
+
if (!session) {
|
|
399
|
+
return { started: false, error: 'The session no longer exists.' };
|
|
400
|
+
}
|
|
401
|
+
const provider = session.provider;
|
|
402
|
+
if (!dependencies.runtime.hasRuntime(provider)) {
|
|
403
|
+
return { started: false, error: `Provider "${provider}" is not available.` };
|
|
404
|
+
}
|
|
405
|
+
const activeRun = chatRunRegistry.getRun(input.sessionId);
|
|
406
|
+
if (activeRun && activeRun.status === 'running') {
|
|
407
|
+
if (!input.interruptActiveRun) {
|
|
408
|
+
return { started: false, error: 'A run was already in progress for this session.' };
|
|
409
|
+
}
|
|
410
|
+
// Same shape as `chat.abort`: cancel the provider run and emit the
|
|
411
|
+
// terminal `complete` on its behalf, so every watching client sees the
|
|
412
|
+
// interrupted run end before this turn's stream begins. The interrupted
|
|
413
|
+
// run's own dispatch settles later through completeRunIfCurrent, which is
|
|
414
|
+
// scoped to that run and cannot touch the one started here.
|
|
415
|
+
const aborted = await dependencies.runtime.abort(activeRun.provider, input.sessionId);
|
|
416
|
+
chatRunRegistry.completeRun(input.sessionId, {
|
|
417
|
+
exitCode: aborted ? 0 : 1,
|
|
418
|
+
aborted: true,
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
return dispatchRun(null, input.userId, input.sessionId, session, { sessionId: input.sessionId, content: input.content, options: input.options ?? {} }, dependencies);
|
|
422
|
+
}
|
|
269
423
|
export function handleChatConnection(ws, request, dependencies) {
|
|
270
424
|
console.log('[INFO] Chat WebSocket connected');
|
|
271
425
|
connectedClients.add(ws);
|
|
@@ -279,6 +433,9 @@ export function handleChatConnection(ws, request, dependencies) {
|
|
|
279
433
|
const data = parsed;
|
|
280
434
|
const messageType = typeof data.type === 'string' ? data.type : '';
|
|
281
435
|
switch (messageType) {
|
|
436
|
+
case 'chat.edit-send':
|
|
437
|
+
await handleChatEditSend(ws, userId, data, dependencies);
|
|
438
|
+
return;
|
|
282
439
|
case 'chat.send':
|
|
283
440
|
await handleChatSend(ws, userId, data, dependencies);
|
|
284
441
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-websocket.service.js","sourceRoot":"","sources":["../../../../../server/modules/websocket/services/chat-websocket.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat-websocket.service.js","sourceRoot":"","sources":["../../../../../server/modules/websocket/services/chat-websocket.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { projectsDb, sessionsDb } from '../../../modules/database/index.js';
|
|
3
|
+
import { generateDisplayName } from '../../../modules/projects/index.js';
|
|
4
|
+
import { connectedClients, WS_OPEN_STATE } from '../../../modules/websocket/services/websocket-state.service.js';
|
|
5
|
+
/**
|
|
6
|
+
* The single producer of the `session_upserted` delta.
|
|
7
|
+
*
|
|
8
|
+
* The event carries everything a sidebar needs to upsert a session in place
|
|
9
|
+
* (its summary plus the owning project's metadata), so clients never refetch
|
|
10
|
+
* the whole project list because one transcript changed on disk.
|
|
11
|
+
*
|
|
12
|
+
* It used to be built in two places — the on-disk sessions watcher and the
|
|
13
|
+
* chat run registry — and only the registry's copy set `providerSessionId`.
|
|
14
|
+
* That field is how the client notices a row it is showing has been merged
|
|
15
|
+
* into its canonical app-session row, so a merge announced by any other path
|
|
16
|
+
* left a stale duplicate in the sidebar. One builder, one shape.
|
|
17
|
+
*/
|
|
18
|
+
async function buildSessionUpsertedEvent(sessionIdOrProviderSessionId) {
|
|
19
|
+
// Resolving by provider id first covers the watcher, which only ever sees
|
|
20
|
+
// the id written in the transcript. For a row where the two ids are equal
|
|
21
|
+
// — legacy rows, and any session indexed from disk before its mapping
|
|
22
|
+
// existed — both lookups land on the same row anyway.
|
|
23
|
+
const row = sessionsDb.getSessionByProviderSessionId(sessionIdOrProviderSessionId)
|
|
24
|
+
?? sessionsDb.getSessionById(sessionIdOrProviderSessionId);
|
|
25
|
+
if (!row || row.isArchived) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const projectPath = row.project_path;
|
|
29
|
+
const project = projectPath ? projectsDb.getProjectPath(projectPath) : null;
|
|
30
|
+
const displayName = project?.custom_project_name?.trim()
|
|
31
|
+
? project.custom_project_name
|
|
32
|
+
: await generateDisplayName(path.basename(projectPath ?? '') || (projectPath ?? ''), projectPath);
|
|
33
|
+
return {
|
|
34
|
+
kind: 'session_upserted',
|
|
35
|
+
sessionId: row.session_id,
|
|
36
|
+
providerSessionId: row.provider_session_id ?? null,
|
|
37
|
+
// The column is a plain TEXT and typed as `string` on the row, but only
|
|
38
|
+
// provider adapters ever write it.
|
|
39
|
+
provider: row.provider,
|
|
40
|
+
session: {
|
|
41
|
+
id: row.session_id,
|
|
42
|
+
summary: row.custom_name || '',
|
|
43
|
+
messageCount: 0,
|
|
44
|
+
lastActivity: row.updated_at ?? row.created_at ?? new Date().toISOString(),
|
|
45
|
+
},
|
|
46
|
+
project: project
|
|
47
|
+
? {
|
|
48
|
+
projectId: project.project_id,
|
|
49
|
+
path: project.project_path,
|
|
50
|
+
fullPath: project.project_path,
|
|
51
|
+
displayName,
|
|
52
|
+
isStarred: Boolean(project.isStarred),
|
|
53
|
+
}
|
|
54
|
+
: null,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function sendToConnectedClients(payloads) {
|
|
59
|
+
if (payloads.length === 0) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
connectedClients.forEach((client) => {
|
|
63
|
+
if (client.readyState === WS_OPEN_STATE) {
|
|
64
|
+
for (const payload of payloads) {
|
|
65
|
+
client.send(payload);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Announces one session. Used by the chat run registry when a run reports its provider-native id. */
|
|
71
|
+
export async function broadcastSessionUpserted(sessionIdOrProviderSessionId) {
|
|
72
|
+
const event = await buildSessionUpsertedEvent(sessionIdOrProviderSessionId);
|
|
73
|
+
if (event) {
|
|
74
|
+
sendToConnectedClients([JSON.stringify(event)]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Announces a batch of sessions. Used by the providers module's sessions
|
|
79
|
+
* watcher, whose debounced flush can carry dozens of ids at once — the client
|
|
80
|
+
* set is walked once for the whole batch rather than once per session.
|
|
81
|
+
*/
|
|
82
|
+
export async function broadcastSessionUpsertedBatch(sessionIds) {
|
|
83
|
+
const payloads = [];
|
|
84
|
+
for (const sessionId of sessionIds) {
|
|
85
|
+
const event = await buildSessionUpsertedEvent(sessionId);
|
|
86
|
+
if (event) {
|
|
87
|
+
payloads.push(JSON.stringify(event));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
sendToConnectedClients(payloads);
|
|
91
|
+
}
|
|
92
|
+
/** @internal Exported for the broadcast tests, which assert the payload shape directly. */
|
|
93
|
+
export { buildSessionUpsertedEvent };
|
|
94
|
+
//# sourceMappingURL=session-upsert-broadcast.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-upsert-broadcast.service.js","sourceRoot":"","sources":["../../../../../server/modules/websocket/services/session-upsert-broadcast.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -149,12 +149,18 @@ function buildShellCommand(message, dependencies) {
|
|
|
149
149
|
}
|
|
150
150
|
return initialCommand || 'opencode';
|
|
151
151
|
}
|
|
152
|
-
|
|
152
|
+
// Launching with the flag is what unlocks "bypass permissions" in the CLI's
|
|
153
|
+
// shift+tab permission-mode cycle; it cannot be enabled from inside a
|
|
154
|
+
// session started without it.
|
|
155
|
+
const bypassFlag = readBoolean(message.bypassPermissions)
|
|
156
|
+
? ' --dangerously-skip-permissions'
|
|
157
|
+
: '';
|
|
158
|
+
const command = initialCommand || `claude${bypassFlag}`;
|
|
153
159
|
if (resumeSessionId) {
|
|
154
160
|
if (os.platform() === 'win32') {
|
|
155
|
-
return `claude --resume "${resumeSessionId}"; if ($LASTEXITCODE -ne 0) { claude }`;
|
|
161
|
+
return `claude --resume "${resumeSessionId}"${bypassFlag}; if ($LASTEXITCODE -ne 0) { claude${bypassFlag} }`;
|
|
156
162
|
}
|
|
157
|
-
return `claude --resume "${resumeSessionId}" || claude`;
|
|
163
|
+
return `claude --resume "${resumeSessionId}"${bypassFlag} || claude${bypassFlag}`;
|
|
158
164
|
}
|
|
159
165
|
return command;
|
|
160
166
|
}
|