@cloudcli-ai/cloudcli 1.36.3 → 1.37.0
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/dist/assets/index-DSlds633.css +32 -0
- package/dist/assets/{index-CcCsKitq.js → index-eGqPeIEu.js} +375 -267
- package/dist/index.html +2 -2
- package/dist-server/server/constants/config.js.map +1 -1
- package/dist-server/server/index.js +73 -1224
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/load-env.js +17 -4
- package/dist-server/server/load-env.js.map +1 -1
- package/dist-server/server/modules/agent/agent.module.js +37 -0
- package/dist-server/server/modules/agent/agent.module.js.map +1 -0
- package/dist-server/server/modules/agent/agent.routes.js +1161 -0
- package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
- package/dist-server/server/modules/agent/index.js +3 -0
- package/dist-server/server/modules/agent/index.js.map +1 -0
- package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
- package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
- package/dist-server/server/modules/assets/assets.routes.js +56 -15
- package/dist-server/server/modules/assets/assets.routes.js.map +1 -1
- package/dist-server/server/modules/assets/index.js +2 -2
- package/dist-server/server/modules/assets/index.js.map +1 -1
- package/dist-server/server/modules/assets/services/image-assets.service.js +39 -1
- package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -1
- package/dist-server/server/modules/assets/tests/image-assets.service.test.js +21 -1
- package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -1
- package/dist-server/server/{middleware/auth.js → modules/auth/auth.middleware.js} +30 -8
- package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
- package/dist-server/server/modules/auth/auth.module.js +29 -0
- package/dist-server/server/modules/auth/auth.module.js.map +1 -0
- package/dist-server/server/modules/auth/auth.routes.js +45 -0
- package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
- package/dist-server/server/modules/auth/auth.service.js +113 -0
- package/dist-server/server/modules/auth/auth.service.js.map +1 -0
- package/dist-server/server/modules/auth/index.js +9 -0
- package/dist-server/server/modules/auth/index.js.map +1 -0
- package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
- package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
- package/dist-server/server/{browser-use-mcp.js → modules/browser-use/browser-use-mcp.js} +3 -1
- package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use.service.js +3 -4
- package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
- package/dist-server/server/modules/browser-use/index.js +9 -0
- package/dist-server/server/modules/browser-use/index.js.map +1 -0
- package/dist-server/server/modules/cli/cli.js +11 -0
- package/dist-server/server/modules/cli/cli.js.map +1 -0
- package/dist-server/server/modules/cli/cli.module.js +86 -0
- package/dist-server/server/modules/cli/cli.module.js.map +1 -0
- package/dist-server/server/modules/cli/cli.service.js +244 -0
- package/dist-server/server/modules/cli/cli.service.js.map +1 -0
- package/dist-server/server/modules/cli/index.js +3 -0
- package/dist-server/server/modules/cli/index.js.map +1 -0
- package/dist-server/server/modules/cli/sandbox.service.js +332 -0
- package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
- package/dist-server/server/modules/cli/tests/cli.service.test.js +78 -0
- package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/sandbox.service.test.js +55 -0
- package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
- package/dist-server/server/modules/commands/commands.module.js +20 -0
- package/dist-server/server/modules/commands/commands.module.js.map +1 -0
- package/dist-server/server/modules/commands/commands.routes.js +497 -0
- package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
- package/dist-server/server/modules/commands/index.js +3 -0
- package/dist-server/server/modules/commands/index.js.map +1 -0
- package/dist-server/server/modules/commands/tests/commands.test.js +96 -0
- package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
- package/dist-server/server/modules/database/index.js +1 -0
- package/dist-server/server/modules/database/index.js.map +1 -1
- package/dist-server/server/modules/database/migrations.js +13 -0
- package/dist-server/server/modules/database/migrations.js.map +1 -1
- package/dist-server/server/modules/database/repositories/sessions.db.js +14 -1
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
- package/dist-server/server/modules/database/schema.js +4 -0
- package/dist-server/server/modules/database/schema.js.map +1 -1
- package/dist-server/server/modules/file-tree/file-tree.module.js +91 -0
- package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
- package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.service.js +544 -0
- package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
- package/dist-server/server/modules/file-tree/index.js +3 -0
- package/dist-server/server/modules/file-tree/index.js.map +1 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +184 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
- package/dist-server/server/modules/git/git-parsing.service.js +61 -0
- package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
- package/dist-server/server/modules/git/git.module.js +14 -0
- package/dist-server/server/modules/git/git.module.js.map +1 -0
- package/dist-server/server/modules/git/git.routes.js +1339 -0
- package/dist-server/server/modules/git/git.routes.js.map +1 -0
- package/dist-server/server/modules/git/index.js +3 -0
- package/dist-server/server/modules/git/index.js.map +1 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js +48 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
- package/dist-server/server/{routes → modules/git/tests}/git.test.js +1 -1
- package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
- package/dist-server/server/modules/notifications/index.js +15 -1
- package/dist-server/server/modules/notifications/index.js.map +1 -1
- package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
- package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
- package/dist-server/server/{services/vapid-keys.js → modules/notifications/vapid-keys.service.js} +3 -2
- package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
- package/dist-server/server/modules/plugins/index.js +9 -0
- package/dist-server/server/modules/plugins/index.js.map +1 -0
- package/dist-server/server/{utils/plugin-process-manager.js → modules/plugins/plugin-process.service.js} +3 -2
- package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
- package/dist-server/server/{utils/plugin-loader.js → modules/plugins/plugin-registry.service.js} +2 -1
- package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.module.js +30 -0
- package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
- package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.service.js +123 -0
- package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
- package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
- package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/index.js +5 -0
- package/dist-server/server/modules/projects/index.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 +6 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +1 -4
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
- package/dist-server/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +62 -41
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +6 -4
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +23 -4
- package/dist-server/server/modules/providers/list/claude/claude-sessions.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-models.provider.js +1 -4
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +48 -34
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +290 -6
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +5 -0
- package/dist-server/server/modules/providers/list/codex/codex-skills.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-models.provider.js +1 -4
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
- package/dist-server/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +40 -28
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +21 -14
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +2 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +7 -5
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
- package/dist-server/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +38 -25
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
- package/dist-server/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +27 -4
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +11 -5
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +2 -0
- package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +33 -9
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js +5 -1
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-models.service.js +110 -15
- package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js +2 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/sessions.service.js +54 -0
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js +2 -3
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +36 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/{provider-image-history.test.js → provider-attachment-history.test.js} +60 -2
- package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js +148 -61
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +130 -0
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +165 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
- package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/skills.test.js +4 -2
- package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
- package/dist-server/server/modules/settings/index.js +3 -0
- package/dist-server/server/modules/settings/index.js.map +1 -0
- package/dist-server/server/modules/settings/settings.module.js +35 -0
- package/dist-server/server/modules/settings/settings.module.js.map +1 -0
- package/dist-server/server/modules/settings/settings.routes.js +34 -0
- package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
- package/dist-server/server/modules/settings/settings.service.js +116 -0
- package/dist-server/server/modules/settings/settings.service.js.map +1 -0
- package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
- package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
- package/dist-server/server/modules/system/index.js +3 -0
- package/dist-server/server/modules/system/index.js.map +1 -0
- package/dist-server/server/modules/system/system.module.js +44 -0
- package/dist-server/server/modules/system/system.module.js.map +1 -0
- package/dist-server/server/modules/system/system.routes.js +16 -0
- package/dist-server/server/modules/system/system.routes.js.map +1 -0
- package/dist-server/server/modules/system/system.service.js +45 -0
- package/dist-server/server/modules/system/system.service.js.map +1 -0
- package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
- package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/index.js +3 -0
- package/dist-server/server/modules/taskmaster/index.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
- package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
- package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
- package/dist-server/server/modules/user/index.js +3 -0
- package/dist-server/server/modules/user/index.js.map +1 -0
- package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
- package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
- package/dist-server/server/modules/user/user.module.js +47 -0
- package/dist-server/server/modules/user/user.module.js.map +1 -0
- package/dist-server/server/modules/user/user.routes.js +44 -0
- package/dist-server/server/modules/user/user.routes.js.map +1 -0
- package/dist-server/server/modules/user/user.service.js +59 -0
- package/dist-server/server/modules/user/user.service.js.map +1 -0
- package/dist-server/server/modules/voice/index.js +3 -0
- package/dist-server/server/modules/voice/index.js.map +1 -0
- package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
- package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
- package/dist-server/server/modules/voice/voice.module.js +44 -0
- package/dist-server/server/modules/voice/voice.module.js.map +1 -0
- package/dist-server/server/modules/voice/voice.routes.js +87 -0
- package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
- package/dist-server/server/modules/voice/voice.service.js +148 -0
- package/dist-server/server/modules/voice/voice.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +2 -2
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +40 -29
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js +76 -8
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/websocket-server.service.js +51 -20
- package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/{chat-image-filter.test.js → chat-attachment-filter.test.js} +10 -3
- package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +97 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
- package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/index.js +3 -0
- package/dist-server/server/modules/worktrees/index.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
- package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
- package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
- package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
- package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
- package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
- package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
- package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
- package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
- package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
- package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
- package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
- package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
- package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
- package/dist-server/server/shared/image-attachments.js +90 -17
- package/dist-server/server/shared/image-attachments.js.map +1 -1
- package/dist-server/server/shared/tests/image-attachments.test.js +43 -1
- package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -1
- package/dist-server/server/shared/utils.js +66 -142
- package/dist-server/server/shared/utils.js.map +1 -1
- package/package.json +8 -4
- package/server/index.ts +401 -0
- package/server/{load-env.js → load-env.ts} +18 -5
- package/server/modules/agent/agent.module.ts +51 -0
- package/server/modules/agent/agent.routes.ts +1287 -0
- package/server/modules/agent/index.ts +2 -0
- package/server/modules/agent/tests/agent.routes.test.ts +205 -0
- package/server/modules/assets/assets.routes.ts +63 -16
- package/server/modules/assets/index.ts +2 -2
- package/server/modules/assets/services/image-assets.service.ts +46 -1
- package/server/modules/assets/tests/image-assets.service.test.ts +28 -0
- package/server/{middleware/auth.js → modules/auth/auth.middleware.ts} +38 -7
- package/server/modules/auth/auth.module.ts +38 -0
- package/server/modules/auth/auth.routes.ts +57 -0
- package/server/modules/auth/auth.service.ts +155 -0
- package/server/modules/auth/index.ts +9 -0
- package/server/modules/auth/tests/auth.service.test.ts +95 -0
- package/server/{browser-use-mcp.ts → modules/browser-use/browser-use-mcp.ts} +3 -1
- package/server/modules/browser-use/browser-use.service.ts +3 -4
- package/server/modules/browser-use/index.ts +8 -0
- package/server/modules/cli/cli.module.ts +96 -0
- package/server/modules/cli/cli.service.ts +281 -0
- package/server/modules/cli/cli.ts +13 -0
- package/server/modules/cli/index.ts +2 -0
- package/server/modules/cli/sandbox.service.ts +413 -0
- package/server/modules/cli/tests/cli.service.test.ts +91 -0
- package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
- package/server/modules/commands/commands.module.ts +22 -0
- package/server/{routes/commands.js → modules/commands/commands.routes.ts} +44 -36
- package/server/modules/commands/index.ts +2 -0
- package/server/modules/commands/tests/commands.test.ts +119 -0
- package/server/modules/database/index.ts +1 -0
- package/server/modules/database/migrations.ts +15 -0
- package/server/modules/database/repositories/sessions.db.ts +19 -1
- package/server/modules/database/schema.ts +4 -0
- package/server/modules/file-tree/file-tree.module.ts +112 -0
- package/server/modules/file-tree/file-tree.routes.ts +258 -0
- package/server/modules/file-tree/file-tree.service.ts +616 -0
- package/server/modules/file-tree/index.ts +2 -0
- package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
- package/server/modules/file-tree/tests/file-tree.service.test.ts +220 -0
- package/server/modules/git/git-parsing.service.ts +66 -0
- package/server/modules/git/git.module.ts +22 -0
- package/server/{routes/git.js → modules/git/git.routes.ts} +91 -132
- package/server/modules/git/index.ts +2 -0
- package/server/modules/git/tests/git-init.routes.test.ts +52 -0
- package/server/{routes/git.test.js → modules/git/tests/git.test.ts} +3 -3
- package/server/modules/notifications/index.ts +9 -0
- package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
- package/server/{services/vapid-keys.js → modules/notifications/vapid-keys.service.ts} +3 -1
- package/server/modules/plugins/index.ts +9 -0
- package/server/{utils/plugin-process-manager.js → modules/plugins/plugin-process.service.ts} +3 -1
- package/server/{utils/plugin-loader.js → modules/plugins/plugin-registry.service.ts} +1 -0
- package/server/modules/plugins/plugins.module.ts +33 -0
- package/server/modules/plugins/plugins.routes.ts +66 -0
- package/server/modules/plugins/plugins.service.ts +147 -0
- package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
- package/server/modules/projects/index.ts +5 -0
- package/server/modules/providers/README.md +41 -9
- package/server/modules/providers/index.ts +4 -0
- package/server/modules/providers/list/claude/claude-auth.provider.ts +8 -0
- package/server/modules/providers/list/claude/claude-models.provider.ts +1 -12
- package/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +66 -44
- package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +6 -4
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +27 -4
- package/server/modules/providers/list/claude/claude.provider.ts +3 -0
- package/server/modules/providers/list/codex/codex-models.provider.ts +0 -9
- package/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +54 -36
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +331 -7
- package/server/modules/providers/list/codex/codex-skills.provider.ts +5 -0
- package/server/modules/providers/list/codex/codex.provider.ts +3 -0
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +0 -9
- package/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +58 -27
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +26 -15
- package/server/modules/providers/list/cursor/cursor.provider.ts +3 -0
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +7 -10
- package/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +56 -28
- package/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +41 -3
- package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +13 -5
- package/server/modules/providers/list/opencode/opencode.provider.ts +3 -0
- package/server/modules/providers/provider.routes.ts +47 -10
- package/server/modules/providers/services/provider-capabilities.service.ts +7 -1
- package/server/modules/providers/services/provider-models.service.ts +131 -23
- package/server/modules/providers/services/provider-runtime.service.ts +109 -0
- package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
- package/server/modules/providers/services/sessions-watcher.service.ts +2 -0
- package/server/modules/providers/services/sessions.service.ts +79 -0
- package/server/modules/providers/shared/base/abstract.provider.ts +4 -3
- package/server/modules/providers/tests/claude-auth.test.ts +150 -0
- package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +40 -0
- package/server/modules/providers/tests/{provider-image-history.test.ts → provider-attachment-history.test.ts} +68 -1
- package/server/modules/providers/tests/provider-models.service.test.ts +450 -349
- package/server/modules/providers/tests/provider-runtime.service.test.ts +142 -0
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +185 -0
- package/server/modules/providers/tests/sessions-details.test.ts +73 -0
- package/server/modules/providers/tests/skills.test.ts +9 -2
- package/server/modules/settings/index.ts +2 -0
- package/server/modules/settings/settings.module.ts +50 -0
- package/server/modules/settings/settings.routes.ts +51 -0
- package/server/modules/settings/settings.service.ts +186 -0
- package/server/modules/settings/tests/settings.service.test.ts +54 -0
- package/server/modules/system/index.ts +2 -0
- package/server/modules/system/system.module.ts +62 -0
- package/server/modules/system/system.routes.ts +21 -0
- package/server/modules/system/system.service.ts +76 -0
- package/server/modules/system/tests/system.service.test.ts +118 -0
- package/server/modules/taskmaster/index.ts +2 -0
- package/server/modules/taskmaster/taskmaster.module.ts +24 -0
- package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
- package/server/modules/taskmaster/taskmaster.service.ts +132 -0
- package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
- package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
- package/server/modules/user/index.ts +2 -0
- package/server/modules/user/tests/user.service.test.ts +61 -0
- package/server/modules/user/user.module.ts +58 -0
- package/server/modules/user/user.routes.ts +50 -0
- package/server/modules/user/user.service.ts +85 -0
- package/server/modules/voice/index.ts +2 -0
- package/server/modules/voice/tests/voice.service.test.ts +98 -0
- package/server/modules/voice/voice.module.ts +47 -0
- package/server/modules/voice/voice.routes.ts +113 -0
- package/server/modules/voice/voice.service.ts +192 -0
- package/server/modules/websocket/README.md +7 -7
- package/server/modules/websocket/services/chat-session-writer.service.ts +2 -2
- package/server/modules/websocket/services/chat-websocket.service.ts +73 -61
- package/server/modules/websocket/services/shell-websocket.service.ts +88 -12
- package/server/modules/websocket/services/websocket-server.service.ts +63 -19
- package/server/modules/websocket/tests/{chat-image-filter.test.ts → chat-attachment-filter.test.ts} +17 -2
- package/server/modules/websocket/tests/shell-websocket.service.test.ts +119 -0
- package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
- package/server/modules/worktrees/index.ts +2 -0
- package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
- package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
- package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
- package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
- package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
- package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
- package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
- package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
- package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
- package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
- package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
- package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
- package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
- package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
- package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
- package/server/modules/worktrees/worktrees.module.ts +113 -0
- package/server/modules/worktrees/worktrees.routes.ts +116 -0
- package/server/shared/image-attachments.ts +112 -18
- package/server/shared/interfaces.ts +29 -19
- package/server/shared/tests/image-attachments.test.ts +55 -0
- package/server/shared/types.ts +658 -21
- package/server/shared/utils.ts +77 -212
- package/dist/assets/index-DLmhQ15L.css +0 -32
- package/dist-server/server/browser-use-mcp.js.map +0 -1
- package/dist-server/server/claude-sdk.js.map +0 -1
- package/dist-server/server/cli.js +0 -647
- package/dist-server/server/cli.js.map +0 -1
- package/dist-server/server/cursor-cli.js.map +0 -1
- package/dist-server/server/middleware/auth.js.map +0 -1
- package/dist-server/server/modules/providers/tests/provider-image-history.test.js.map +0 -1
- package/dist-server/server/modules/websocket/tests/chat-image-filter.test.js.map +0 -1
- package/dist-server/server/openai-codex.js.map +0 -1
- package/dist-server/server/opencode-cli.js.map +0 -1
- package/dist-server/server/opencode-cli.test.js.map +0 -1
- package/dist-server/server/routes/agent.js +0 -1155
- package/dist-server/server/routes/agent.js.map +0 -1
- package/dist-server/server/routes/auth.js +0 -119
- package/dist-server/server/routes/auth.js.map +0 -1
- package/dist-server/server/routes/commands.js +0 -492
- package/dist-server/server/routes/commands.js.map +0 -1
- package/dist-server/server/routes/cursor.js +0 -49
- package/dist-server/server/routes/cursor.js.map +0 -1
- package/dist-server/server/routes/git.js +0 -1389
- package/dist-server/server/routes/git.js.map +0 -1
- package/dist-server/server/routes/git.test.js.map +0 -1
- package/dist-server/server/routes/mcp-utils.js +0 -29
- package/dist-server/server/routes/mcp-utils.js.map +0 -1
- package/dist-server/server/routes/plugins.js +0 -266
- package/dist-server/server/routes/plugins.js.map +0 -1
- package/dist-server/server/routes/settings.js +0 -249
- package/dist-server/server/routes/settings.js.map +0 -1
- package/dist-server/server/routes/taskmaster.js +0 -1362
- package/dist-server/server/routes/taskmaster.js.map +0 -1
- package/dist-server/server/routes/tests/commands.test.js +0 -76
- package/dist-server/server/routes/tests/commands.test.js.map +0 -1
- package/dist-server/server/routes/user.js +0 -116
- package/dist-server/server/routes/user.js.map +0 -1
- package/dist-server/server/services/notification-orchestrator.js +0 -2
- package/dist-server/server/services/notification-orchestrator.js.map +0 -1
- package/dist-server/server/services/tests/notification-orchestrator.test.js +0 -64
- package/dist-server/server/services/tests/notification-orchestrator.test.js.map +0 -1
- package/dist-server/server/services/vapid-keys.js.map +0 -1
- package/dist-server/server/utils/colors.js +0 -20
- package/dist-server/server/utils/colors.js.map +0 -1
- package/dist-server/server/utils/commandParser.js +0 -255
- package/dist-server/server/utils/commandParser.js.map +0 -1
- package/dist-server/server/utils/gitConfig.js +0 -37
- package/dist-server/server/utils/gitConfig.js.map +0 -1
- package/dist-server/server/utils/mcp-detector.js +0 -134
- package/dist-server/server/utils/mcp-detector.js.map +0 -1
- package/dist-server/server/utils/plugin-loader.js.map +0 -1
- package/dist-server/server/utils/plugin-process-manager.js.map +0 -1
- package/dist-server/server/utils/runtime-paths.js +0 -30
- package/dist-server/server/utils/runtime-paths.js.map +0 -1
- package/dist-server/server/utils/taskmaster-websocket.js +0 -124
- package/dist-server/server/utils/taskmaster-websocket.js.map +0 -1
- package/dist-server/server/utils/url-detection.js +0 -58
- package/dist-server/server/utils/url-detection.js.map +0 -1
- package/dist-server/server/voice-proxy.js +0 -226
- package/dist-server/server/voice-proxy.js.map +0 -1
- package/server/cli.js +0 -695
- package/server/index.js +0 -1651
- package/server/routes/agent.js +0 -1257
- package/server/routes/auth.js +0 -137
- package/server/routes/cursor.js +0 -52
- package/server/routes/mcp-utils.js +0 -31
- package/server/routes/plugins.js +0 -307
- package/server/routes/settings.js +0 -282
- package/server/routes/taskmaster.js +0 -1470
- package/server/routes/tests/commands.test.js +0 -82
- package/server/routes/user.js +0 -124
- package/server/services/notification-orchestrator.js +0 -7
- package/server/services/tests/notification-orchestrator.test.js +0 -80
- package/server/utils/colors.js +0 -21
- package/server/utils/commandParser.js +0 -305
- package/server/utils/gitConfig.js +0 -35
- package/server/utils/mcp-detector.js +0 -147
- package/server/utils/runtime-paths.js +0 -37
- package/server/utils/taskmaster-websocket.js +0 -135
- package/server/utils/url-detection.js +0 -71
- package/server/voice-proxy.js +0 -224
- /package/server/constants/{config.js → config.ts} +0 -0
|
@@ -19,19 +19,20 @@ import path from 'path';
|
|
|
19
19
|
|
|
20
20
|
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
21
21
|
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
import {
|
|
23
|
+
appendFilesInputTag,
|
|
24
|
+
buildClaudeUserContent,
|
|
25
|
+
normalizeImageDescriptors
|
|
26
|
+
} from '@/shared/image-attachments.js';
|
|
27
|
+
import { CLAUDE_FALLBACK_MODELS } from '@/modules/providers/list/claude/claude-models.provider.js';
|
|
28
|
+
import { resolveClaudeCodeExecutablePath } from '@/shared/claude-cli-path.js';
|
|
26
29
|
import {
|
|
27
30
|
createNotificationEvent,
|
|
28
31
|
notifyRunFailed,
|
|
29
32
|
notifyRunStopped,
|
|
30
33
|
notifyUserIfEnabled
|
|
31
|
-
} from '
|
|
32
|
-
import {
|
|
33
|
-
import { providerAuthService } from './modules/providers/services/provider-auth.service.js';
|
|
34
|
-
import { createCompleteMessage, createNormalizedMessage } from './shared/utils.js';
|
|
34
|
+
} from '@/modules/notifications/index.js';
|
|
35
|
+
import { createCompleteMessage, createNormalizedMessage } from '@/shared/utils.js';
|
|
35
36
|
|
|
36
37
|
const activeSessions = new Map();
|
|
37
38
|
const pendingToolApprovals = new Map();
|
|
@@ -158,7 +159,7 @@ function matchesToolPermission(entry, toolName, input) {
|
|
|
158
159
|
}
|
|
159
160
|
|
|
160
161
|
function mapCliOptionsToSDK(options = {}) {
|
|
161
|
-
const {
|
|
162
|
+
const { providerSessionId, cwd, toolsSettings, permissionMode, effort } = options;
|
|
162
163
|
|
|
163
164
|
const sdkOptions = {};
|
|
164
165
|
|
|
@@ -226,8 +227,9 @@ function mapCliOptionsToSDK(options = {}) {
|
|
|
226
227
|
|
|
227
228
|
sdkOptions.settingSources = ['project', 'user', 'local'];
|
|
228
229
|
|
|
229
|
-
|
|
230
|
-
|
|
230
|
+
// The SDK resumes with the provider-native session id, never the app id.
|
|
231
|
+
if (providerSessionId) {
|
|
232
|
+
sdkOptions.resume = providerSessionId;
|
|
231
233
|
}
|
|
232
234
|
|
|
233
235
|
return sdkOptions;
|
|
@@ -371,15 +373,17 @@ function extractTokenBudget(sdkMessage) {
|
|
|
371
373
|
*
|
|
372
374
|
* @param {string} command - User prompt
|
|
373
375
|
* @param {Array} images - Image descriptors ({ path, name?, mimeType? })
|
|
374
|
-
* @param {
|
|
376
|
+
* @param {Array} files - Non-image attachment descriptors
|
|
377
|
+
* @param {string} cwd - Project working directory attachment paths resolve against
|
|
375
378
|
* @returns {Promise<string|AsyncIterable>} SDK prompt payload
|
|
376
379
|
*/
|
|
377
|
-
async function buildPromptPayload(command, images, cwd) {
|
|
380
|
+
async function buildPromptPayload(command, images, files, cwd) {
|
|
381
|
+
const promptWithFiles = appendFilesInputTag(command, files);
|
|
378
382
|
if (normalizeImageDescriptors(images).length === 0) {
|
|
379
|
-
return
|
|
383
|
+
return promptWithFiles;
|
|
380
384
|
}
|
|
381
385
|
|
|
382
|
-
const content = await buildClaudeUserContent(
|
|
386
|
+
const content = await buildClaudeUserContent(promptWithFiles, images, cwd);
|
|
383
387
|
return (async function* () {
|
|
384
388
|
yield {
|
|
385
389
|
type: 'user',
|
|
@@ -455,12 +459,21 @@ async function loadMcpConfig(cwd) {
|
|
|
455
459
|
* @param {string} command - User prompt/command
|
|
456
460
|
* @param {Object} options - Query options
|
|
457
461
|
* @param {Object} ws - WebSocket connection
|
|
462
|
+
* @param {Object} context - Provider-scoped model, session, and auth lookups
|
|
458
463
|
* @returns {Promise<void>}
|
|
459
464
|
*/
|
|
460
|
-
async function queryClaudeSDK(command, options = {}, ws) {
|
|
465
|
+
async function queryClaudeSDK(command, options = {}, ws, context) {
|
|
461
466
|
const { sessionId, sessionSummary } = options;
|
|
462
|
-
|
|
467
|
+
// Callers pass the stable app session id; the SDK only understands the
|
|
468
|
+
// provider-native id recorded on the session row.
|
|
469
|
+
const providerSessionId = context.resolveProviderSessionId(sessionId);
|
|
470
|
+
// Provider-native id as the SDK reports it (starts as the resume id, or is
|
|
471
|
+
// captured from the stream for brand-new sessions).
|
|
472
|
+
let capturedSessionId = providerSessionId;
|
|
463
473
|
let sessionCreatedSent = false;
|
|
474
|
+
// Process-map key: the app session id when the caller supplied one, else
|
|
475
|
+
// the provider-native id once captured (legacy/direct API callers).
|
|
476
|
+
const sessionKey = () => sessionId || capturedSessionId || null;
|
|
464
477
|
|
|
465
478
|
const emitNotification = (event) => {
|
|
466
479
|
notifyUserIfEnabled({
|
|
@@ -471,20 +484,17 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
471
484
|
};
|
|
472
485
|
|
|
473
486
|
try {
|
|
474
|
-
const resolvedModel = await
|
|
475
|
-
'claude',
|
|
476
|
-
sessionId,
|
|
477
|
-
options.model,
|
|
478
|
-
);
|
|
487
|
+
const resolvedModel = await context.resolveResumeModel(sessionId, options.model);
|
|
479
488
|
let effortModels = CLAUDE_FALLBACK_MODELS;
|
|
480
489
|
try {
|
|
481
|
-
effortModels =
|
|
490
|
+
effortModels = await context.getProviderModels();
|
|
482
491
|
} catch (error) {
|
|
483
492
|
console.warn('[Claude SDK] Unable to load provider models for effort validation:', error);
|
|
484
493
|
}
|
|
485
494
|
|
|
486
495
|
const sdkOptions = mapCliOptionsToSDK({
|
|
487
496
|
...options,
|
|
497
|
+
providerSessionId,
|
|
488
498
|
model: resolvedModel || options.model,
|
|
489
499
|
effortModels,
|
|
490
500
|
});
|
|
@@ -497,22 +507,23 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
497
507
|
// Turns with image attachments switch to streaming input so the images
|
|
498
508
|
// ride along as real content blocks. Built per query attempt because an
|
|
499
509
|
// async generator cannot be replayed once consumed.
|
|
500
|
-
const createPrompt = () => buildPromptPayload(command, options.images, options.cwd);
|
|
510
|
+
const createPrompt = () => buildPromptPayload(command, options.images, options.files, options.cwd);
|
|
501
511
|
|
|
502
512
|
sdkOptions.hooks = {
|
|
503
513
|
Notification: [{
|
|
504
514
|
matcher: '',
|
|
505
515
|
hooks: [async (input) => {
|
|
506
516
|
const message = typeof input?.message === 'string' ? input.message : 'Claude requires your attention.';
|
|
517
|
+
// Notifications are app-facing, so they carry the app session id.
|
|
507
518
|
emitNotification(createNotificationEvent({
|
|
508
519
|
provider: 'claude',
|
|
509
|
-
sessionId:
|
|
520
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
510
521
|
kind: 'action_required',
|
|
511
522
|
code: 'agent.notification',
|
|
512
523
|
meta: { message, sessionName: sessionSummary },
|
|
513
524
|
severity: 'warning',
|
|
514
525
|
requiresUserAction: true,
|
|
515
|
-
dedupeKey: `claude:hook:notification:${
|
|
526
|
+
dedupeKey: `claude:hook:notification:${sessionId || capturedSessionId || 'none'}:${message}`
|
|
516
527
|
}));
|
|
517
528
|
return {};
|
|
518
529
|
}]
|
|
@@ -552,20 +563,22 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
552
563
|
ws.send(createNormalizedMessage({ kind: 'permission_request', requestId, toolName, input, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
553
564
|
emitNotification(createNotificationEvent({
|
|
554
565
|
provider: 'claude',
|
|
555
|
-
sessionId:
|
|
566
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
556
567
|
kind: 'action_required',
|
|
557
568
|
code: 'permission.required',
|
|
558
569
|
meta: { toolName, sessionName: sessionSummary },
|
|
559
570
|
severity: 'warning',
|
|
560
571
|
requiresUserAction: true,
|
|
561
|
-
dedupeKey: `claude:permission:${
|
|
572
|
+
dedupeKey: `claude:permission:${sessionId || capturedSessionId || 'none'}:${requestId}`
|
|
562
573
|
}));
|
|
563
574
|
|
|
564
575
|
const decision = await waitForToolApproval(requestId, {
|
|
565
576
|
timeoutMs: requiresInteraction ? 0 : undefined,
|
|
566
577
|
signal: context?.signal,
|
|
567
578
|
metadata: {
|
|
568
|
-
|
|
579
|
+
// Keyed by the app session id so `chat.subscribe` can look pending
|
|
580
|
+
// approvals up directly; provider id only for legacy callers.
|
|
581
|
+
_sessionId: sessionId || capturedSessionId || null,
|
|
569
582
|
_toolName: toolName,
|
|
570
583
|
_input: input,
|
|
571
584
|
_receivedAt: new Date(),
|
|
@@ -626,8 +639,8 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
626
639
|
}
|
|
627
640
|
|
|
628
641
|
// Track the query instance for abort capability
|
|
629
|
-
if (
|
|
630
|
-
addSession(
|
|
642
|
+
if (sessionKey()) {
|
|
643
|
+
addSession(sessionKey(), queryInstance, ws);
|
|
631
644
|
}
|
|
632
645
|
|
|
633
646
|
// Process streaming messages
|
|
@@ -637,15 +650,15 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
637
650
|
if (message.session_id && !capturedSessionId) {
|
|
638
651
|
|
|
639
652
|
capturedSessionId = message.session_id;
|
|
640
|
-
addSession(
|
|
653
|
+
addSession(sessionKey(), queryInstance, ws);
|
|
641
654
|
|
|
642
655
|
// Set session ID on writer
|
|
643
656
|
if (ws.setSessionId && typeof ws.setSessionId === 'function') {
|
|
644
657
|
ws.setSessionId(capturedSessionId);
|
|
645
658
|
}
|
|
646
659
|
|
|
647
|
-
// Send session-created event only once for
|
|
648
|
-
if (!
|
|
660
|
+
// Send session-created event only once for sessions with nothing to resume
|
|
661
|
+
if (!providerSessionId && !sessionCreatedSent) {
|
|
649
662
|
sessionCreatedSent = true;
|
|
650
663
|
ws.send(createNormalizedMessage({ kind: 'session_created', newSessionId: capturedSessionId, sessionId: capturedSessionId, provider: 'claude' }));
|
|
651
664
|
}
|
|
@@ -658,7 +671,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
658
671
|
const sid = capturedSessionId || sessionId || null;
|
|
659
672
|
|
|
660
673
|
// Use adapter to normalize SDK events into NormalizedMessage[]
|
|
661
|
-
const normalized =
|
|
674
|
+
const normalized = context.normalizeMessage(transformedMessage, sid);
|
|
662
675
|
for (const msg of normalized) {
|
|
663
676
|
// Preserve parentToolUseId from SDK wrapper for subagent tool grouping
|
|
664
677
|
if (transformedMessage.parentToolUseId && !msg.parentToolUseId) {
|
|
@@ -675,20 +688,20 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
675
688
|
}
|
|
676
689
|
|
|
677
690
|
// Clean up session on completion
|
|
678
|
-
if (
|
|
679
|
-
removeSession(
|
|
691
|
+
if (sessionKey()) {
|
|
692
|
+
removeSession(sessionKey());
|
|
680
693
|
}
|
|
681
694
|
|
|
682
695
|
// Send the terminal completion event — skipped for aborted runs, whose
|
|
683
696
|
// terminal `complete` (aborted: true) was already sent by abort-session.
|
|
684
|
-
const wasAborted =
|
|
697
|
+
const wasAborted = sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
|
|
685
698
|
if (!wasAborted) {
|
|
686
699
|
ws.send(createCompleteMessage({ provider: 'claude', sessionId: capturedSessionId || sessionId || null, exitCode: 0 }));
|
|
687
700
|
}
|
|
688
701
|
notifyRunStopped({
|
|
689
702
|
userId: ws?.userId || null,
|
|
690
703
|
provider: 'claude',
|
|
691
|
-
sessionId:
|
|
704
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
692
705
|
sessionName: sessionSummary,
|
|
693
706
|
stopReason: wasAborted ? 'aborted' : 'completed'
|
|
694
707
|
});
|
|
@@ -698,11 +711,11 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
698
711
|
console.error('SDK query error:', error);
|
|
699
712
|
|
|
700
713
|
// Clean up session on error
|
|
701
|
-
if (
|
|
702
|
-
removeSession(
|
|
714
|
+
if (sessionKey()) {
|
|
715
|
+
removeSession(sessionKey());
|
|
703
716
|
}
|
|
704
717
|
|
|
705
|
-
const wasAborted =
|
|
718
|
+
const wasAborted = sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
|
|
706
719
|
if (wasAborted) {
|
|
707
720
|
// The abort already produced the terminal complete; a generator throw
|
|
708
721
|
// caused by interrupt() is expected noise, not a user-facing error.
|
|
@@ -710,7 +723,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
710
723
|
}
|
|
711
724
|
|
|
712
725
|
// Check if Claude CLI is installed for a clearer error message
|
|
713
|
-
const installed = await
|
|
726
|
+
const installed = await context.isProviderInstalled();
|
|
714
727
|
const errorContent = !installed
|
|
715
728
|
? 'Claude Code is not installed. Please install it first: https://docs.anthropic.com/en/docs/claude-code'
|
|
716
729
|
: error.message;
|
|
@@ -721,7 +734,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
|
|
|
721
734
|
notifyRunFailed({
|
|
722
735
|
userId: ws?.userId || null,
|
|
723
736
|
provider: 'claude',
|
|
724
|
-
sessionId:
|
|
737
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
725
738
|
sessionName: sessionSummary,
|
|
726
739
|
error
|
|
727
740
|
});
|
|
@@ -821,6 +834,15 @@ function reconnectSessionWriter(sessionId, newRawWs) {
|
|
|
821
834
|
return true;
|
|
822
835
|
}
|
|
823
836
|
|
|
837
|
+
export const claudeRuntime = {
|
|
838
|
+
run: queryClaudeSDK,
|
|
839
|
+
abort: abortClaudeSDKSession,
|
|
840
|
+
permissions: {
|
|
841
|
+
resolve: resolveToolApproval,
|
|
842
|
+
listPending: getPendingApprovalsForSession,
|
|
843
|
+
},
|
|
844
|
+
};
|
|
845
|
+
|
|
824
846
|
// Export public API
|
|
825
847
|
export {
|
|
826
848
|
queryClaudeSDK,
|
|
@@ -26,10 +26,11 @@ export class ClaudeSessionSynchronizer implements IProviderSessionSynchronizer {
|
|
|
26
26
|
private readonly claudeHome = path.join(os.homedir(), '.claude');
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
|
-
* Returns true when a JSONL file is a subagent transcript
|
|
30
|
-
* top-level session.
|
|
29
|
+
* Returns true when a JSONL file is a subagent transcript or tool result
|
|
30
|
+
* rather than a top-level session.
|
|
31
31
|
*
|
|
32
|
-
* Claude stores subagent transcripts under a `subagents/` directory
|
|
32
|
+
* Claude stores subagent transcripts under a `subagents/` directory and
|
|
33
|
+
* tool results under a `tool-results/` directory, e.g.
|
|
33
34
|
* `~/.claude/projects/<encoded-cwd>/<session-id>/subagents/agent-<id>.jsonl`.
|
|
34
35
|
* Those files repeat the parent session's `sessionId`, so indexing them as
|
|
35
36
|
* standalone sessions overwrites the parent row's `jsonl_path` and corrupts
|
|
@@ -37,7 +38,8 @@ export class ClaudeSessionSynchronizer implements IProviderSessionSynchronizer {
|
|
|
37
38
|
* them, so both entry points must skip them.
|
|
38
39
|
*/
|
|
39
40
|
private isSubagentTranscript(filePath: string): boolean {
|
|
40
|
-
|
|
41
|
+
const pathParts = path.normalize(filePath).split(path.sep);
|
|
42
|
+
return pathParts.includes('subagents') || pathParts.includes('tool-results');
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
/**
|
|
@@ -5,6 +5,7 @@ import readline from 'node:readline';
|
|
|
5
5
|
|
|
6
6
|
import type { IProviderSessions } from '@/shared/interfaces.js';
|
|
7
7
|
import type { AnyRecord, FetchHistoryOptions, FetchHistoryResult, NormalizedMessage } from '@/shared/types.js';
|
|
8
|
+
import { parseFilesInputTag } from '@/shared/image-attachments.js';
|
|
8
9
|
import { createNormalizedMessage, generateMessageId, readObjectRecord, sliceTailPage } from '@/shared/utils.js';
|
|
9
10
|
import { sessionsDb } from '@/modules/database/index.js';
|
|
10
11
|
|
|
@@ -211,11 +212,19 @@ async function getSessionMessages(
|
|
|
211
212
|
* - local command payloads (`<command-name>...`) and stdout wrappers
|
|
212
213
|
* (`<local-command-stdout>...`) should be remapped into normal chat messages
|
|
213
214
|
* instead of being discarded as internal content
|
|
215
|
+
*
|
|
216
|
+
* Skill bodies belong in the first group. When a skill is invoked, Claude
|
|
217
|
+
* injects the entire SKILL.md as a synthetic user turn. Persisted transcripts
|
|
218
|
+
* tag it `isMeta: true`, but the live SDK stream does not, so without a
|
|
219
|
+
* content-level check the same payload renders as a huge user bubble during the
|
|
220
|
+
* run and then vanishes on reload. The skill is already represented by the
|
|
221
|
+
* `Skill` tool call, so it is never user-visible content.
|
|
214
222
|
*/
|
|
215
223
|
const INTERNAL_CONTENT_PREFIXES = [
|
|
216
224
|
'<system-reminder>',
|
|
217
225
|
'Caveat:',
|
|
218
226
|
'[Request interrupted',
|
|
227
|
+
'Base directory for this skill:',
|
|
219
228
|
] as const;
|
|
220
229
|
|
|
221
230
|
function isInternalContent(content: string): boolean {
|
|
@@ -324,6 +333,7 @@ export class ClaudeSessionsProvider implements IProviderSessions {
|
|
|
324
333
|
}
|
|
325
334
|
}
|
|
326
335
|
let imagesAttached = false;
|
|
336
|
+
let filesAttached = false;
|
|
327
337
|
|
|
328
338
|
for (let partIndex = 0; partIndex < raw.message.content.length; partIndex++) {
|
|
329
339
|
const part = raw.message.content[partIndex];
|
|
@@ -342,7 +352,11 @@ export class ClaudeSessionsProvider implements IProviderSessions {
|
|
|
342
352
|
}));
|
|
343
353
|
} else if (part.type === 'text') {
|
|
344
354
|
const text = part.text || '';
|
|
345
|
-
|
|
355
|
+
const parsedFiles = parseFilesInputTag(text);
|
|
356
|
+
if (
|
|
357
|
+
(parsedFiles.text || parsedFiles.attachments.length > 0)
|
|
358
|
+
&& !isInternalContent(parsedFiles.text)
|
|
359
|
+
) {
|
|
346
360
|
messages.push(createNormalizedMessage({
|
|
347
361
|
id: `${baseId}_text_${partIndex}`,
|
|
348
362
|
sessionId,
|
|
@@ -350,10 +364,14 @@ export class ClaudeSessionsProvider implements IProviderSessions {
|
|
|
350
364
|
provider: PROVIDER,
|
|
351
365
|
kind: 'text',
|
|
352
366
|
role: 'user',
|
|
353
|
-
content: text,
|
|
367
|
+
content: parsedFiles.text,
|
|
354
368
|
images: !imagesAttached && imageAttachments.length > 0 ? imageAttachments : undefined,
|
|
369
|
+
files: !filesAttached && parsedFiles.attachments.length > 0
|
|
370
|
+
? parsedFiles.attachments
|
|
371
|
+
: undefined,
|
|
355
372
|
}));
|
|
356
373
|
imagesAttached = true;
|
|
374
|
+
filesAttached = filesAttached || parsedFiles.attachments.length > 0;
|
|
357
375
|
}
|
|
358
376
|
}
|
|
359
377
|
}
|
|
@@ -468,7 +486,11 @@ export class ClaudeSessionsProvider implements IProviderSessions {
|
|
|
468
486
|
return messages;
|
|
469
487
|
}
|
|
470
488
|
|
|
471
|
-
|
|
489
|
+
const parsedFiles = parseFilesInputTag(text);
|
|
490
|
+
if (
|
|
491
|
+
(parsedFiles.text || parsedFiles.attachments.length > 0)
|
|
492
|
+
&& !isInternalContent(parsedFiles.text)
|
|
493
|
+
) {
|
|
472
494
|
messages.push(createNormalizedMessage({
|
|
473
495
|
id: baseId,
|
|
474
496
|
sessionId,
|
|
@@ -476,7 +498,8 @@ export class ClaudeSessionsProvider implements IProviderSessions {
|
|
|
476
498
|
provider: PROVIDER,
|
|
477
499
|
kind: 'text',
|
|
478
500
|
role: 'user',
|
|
479
|
-
content: text,
|
|
501
|
+
content: parsedFiles.text,
|
|
502
|
+
files: parsedFiles.attachments.length > 0 ? parsedFiles.attachments : undefined,
|
|
480
503
|
}));
|
|
481
504
|
}
|
|
482
505
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AbstractProvider } from '@/modules/providers/shared/base/abstract.provider.js';
|
|
2
2
|
import { ClaudeProviderAuth } from '@/modules/providers/list/claude/claude-auth.provider.js';
|
|
3
3
|
import { ClaudeProviderModels } from '@/modules/providers/list/claude/claude-models.provider.js';
|
|
4
|
+
import { claudeRuntime } from '@/modules/providers/list/claude/claude-runtime.provider.js';
|
|
4
5
|
import { ClaudeMcpProvider } from '@/modules/providers/list/claude/claude-mcp.provider.js';
|
|
5
6
|
import { ClaudeSessionSynchronizer } from '@/modules/providers/list/claude/claude-session-synchronizer.provider.js';
|
|
6
7
|
import { ClaudeSessionsProvider } from '@/modules/providers/list/claude/claude-sessions.provider.js';
|
|
@@ -8,12 +9,14 @@ import { ClaudeSkillsProvider } from '@/modules/providers/list/claude/claude-ski
|
|
|
8
9
|
import type {
|
|
9
10
|
IProviderAuth,
|
|
10
11
|
IProviderModels,
|
|
12
|
+
IProviderRuntime,
|
|
11
13
|
IProviderSessionSynchronizer,
|
|
12
14
|
IProviderSkills,
|
|
13
15
|
IProviderSessions,
|
|
14
16
|
} from '@/shared/interfaces.js';
|
|
15
17
|
|
|
16
18
|
export class ClaudeProvider extends AbstractProvider {
|
|
19
|
+
readonly runtime: IProviderRuntime = claudeRuntime;
|
|
17
20
|
readonly models: IProviderModels = new ClaudeProviderModels();
|
|
18
21
|
readonly mcp = new ClaudeMcpProvider();
|
|
19
22
|
readonly auth: IProviderAuth = new ClaudeProviderAuth();
|
|
@@ -6,17 +6,14 @@ import TOML from '@iarna/toml';
|
|
|
6
6
|
|
|
7
7
|
import type { IProviderModels } from '@/shared/interfaces.js';
|
|
8
8
|
import type {
|
|
9
|
-
ProviderChangeActiveModelInput,
|
|
10
9
|
ProviderCurrentActiveModel,
|
|
11
10
|
ProviderModelOption,
|
|
12
11
|
ProviderModelsDefinition,
|
|
13
|
-
ProviderSessionActiveModelChange,
|
|
14
12
|
} from '@/shared/types.js';
|
|
15
13
|
import {
|
|
16
14
|
buildDefaultProviderCurrentActiveModel,
|
|
17
15
|
readObjectRecord,
|
|
18
16
|
readOptionalString,
|
|
19
|
-
writeProviderSessionActiveModelChange,
|
|
20
17
|
} from '@/shared/utils.js';
|
|
21
18
|
|
|
22
19
|
export const CODEX_FALLBACK_MODELS: ProviderModelsDefinition = {
|
|
@@ -164,10 +161,4 @@ export class CodexProviderModels implements IProviderModels {
|
|
|
164
161
|
return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
|
|
165
162
|
}
|
|
166
163
|
}
|
|
167
|
-
|
|
168
|
-
async changeActiveModel(
|
|
169
|
-
input: ProviderChangeActiveModelInput,
|
|
170
|
-
): Promise<ProviderSessionActiveModelChange> {
|
|
171
|
-
return writeProviderSessionActiveModelChange('codex', input);
|
|
172
|
-
}
|
|
173
164
|
}
|