@cloudcli-ai/cloudcli 1.36.3 → 1.37.1
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-D3jfzuKN.css +32 -0
- package/dist/assets/index-DTMWjJj8.js +1550 -0
- 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 +91 -0
- package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
- package/dist-server/server/modules/database/index.js +3 -0
- package/dist-server/server/modules/database/index.js.map +1 -1
- package/dist-server/server/modules/database/migrations.js +31 -1
- package/dist-server/server/modules/database/migrations.js.map +1 -1
- package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
- package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js +76 -7
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
- package/dist-server/server/modules/database/schema.js +29 -0
- package/dist-server/server/modules/database/schema.js.map +1 -1
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -1
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +22 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -1
- package/dist-server/server/modules/file-tree/file-tree.module.js +95 -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 +576 -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 +260 -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 +47 -18
- 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} +69 -55
- 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 +59 -75
- 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-session-synchronizer.provider.js +1 -54
- 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 +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 +33 -673
- 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 +112 -333
- 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-session-synchronizer.provider.js +0 -12
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -1
- 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 +169 -37
- 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 +247 -184
- 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/session-conversations-search.service.js +12 -4
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -1
- 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 +116 -3
- 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 +76 -4
- 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 +15 -126
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +5 -5
- package/dist-server/server/modules/providers/tests/opencode-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 +241 -271
- 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 +126 -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 +166 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +126 -0
- package/dist-server/server/modules/providers/tests/provider.routes.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/sessions.service.test.js +87 -0
- package/dist-server/server/modules/providers/tests/sessions.service.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 +44 -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 +9 -5
- 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} +46 -38
- package/server/modules/commands/index.ts +2 -0
- package/server/modules/commands/tests/commands.test.ts +114 -0
- package/server/modules/database/index.ts +3 -0
- package/server/modules/database/migrations.ts +35 -0
- package/server/modules/database/repositories/provider-models.ts +168 -0
- package/server/modules/database/repositories/sessions.db.ts +103 -8
- package/server/modules/database/schema.ts +30 -0
- package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -1
- package/server/modules/database/tests/sessions.db.integration.test.ts +32 -0
- package/server/modules/file-tree/file-tree.module.ts +116 -0
- package/server/modules/file-tree/file-tree.routes.ts +258 -0
- package/server/modules/file-tree/file-tree.service.ts +664 -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 +317 -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 +47 -26
- package/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +73 -59
- 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 +58 -108
- package/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +54 -36
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +1 -60
- 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 +32 -719
- 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 +112 -423
- 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-session-synchronizer.provider.ts +0 -13
- 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 +228 -39
- package/server/modules/providers/services/provider-capabilities.service.ts +7 -1
- package/server/modules/providers/services/provider-models.service.ts +312 -269
- package/server/modules/providers/services/provider-runtime.service.ts +108 -0
- package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
- package/server/modules/providers/services/session-conversations-search.service.ts +12 -4
- package/server/modules/providers/services/sessions-watcher.service.ts +2 -0
- package/server/modules/providers/services/sessions.service.ts +166 -3
- 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 +83 -4
- package/server/modules/providers/tests/opencode-models.test.ts +34 -135
- package/server/modules/providers/tests/opencode-sessions.test.ts +5 -5
- 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 +300 -296
- package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -0
- package/server/modules/providers/tests/provider.routes.test.ts +183 -0
- package/server/modules/providers/tests/sessions-details.test.ts +73 -0
- package/server/modules/providers/tests/sessions.service.test.ts +127 -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 +77 -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 +33 -25
- package/server/shared/tests/image-attachments.test.ts +55 -0
- package/server/shared/types.ts +685 -36
- package/server/shared/utils.ts +77 -212
- package/dist/assets/index-CcCsKitq.js +0 -1423
- 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
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP SERVER DETECTION UTILITY
|
|
3
|
-
* ============================
|
|
4
|
-
*
|
|
5
|
-
* Centralized utility for detecting MCP server configurations.
|
|
6
|
-
* Used across TaskMaster integration and other MCP-dependent features.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { promises as fsPromises } from 'fs';
|
|
10
|
-
import path from 'path';
|
|
11
|
-
import os from 'os';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Check if task-master-ai MCP server is configured
|
|
15
|
-
* Reads directly from Claude configuration files like claude-cli.js does
|
|
16
|
-
* @returns {Promise<Object>} MCP detection result
|
|
17
|
-
*/
|
|
18
|
-
export async function detectTaskMasterMCPServer() {
|
|
19
|
-
try {
|
|
20
|
-
// Read Claude configuration files directly (same logic as mcp.js)
|
|
21
|
-
const homeDir = os.homedir();
|
|
22
|
-
const configPaths = [
|
|
23
|
-
path.join(homeDir, '.claude.json'),
|
|
24
|
-
path.join(homeDir, '.claude', 'settings.json')
|
|
25
|
-
];
|
|
26
|
-
|
|
27
|
-
let configData = null;
|
|
28
|
-
let configPath = null;
|
|
29
|
-
|
|
30
|
-
// Try to read from either config file
|
|
31
|
-
for (const filepath of configPaths) {
|
|
32
|
-
try {
|
|
33
|
-
const fileContent = await fsPromises.readFile(filepath, 'utf8');
|
|
34
|
-
configData = JSON.parse(fileContent);
|
|
35
|
-
configPath = filepath;
|
|
36
|
-
break;
|
|
37
|
-
} catch (error) {
|
|
38
|
-
// File doesn't exist or is not valid JSON, try next
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (!configData) {
|
|
44
|
-
return {
|
|
45
|
-
hasMCPServer: false,
|
|
46
|
-
reason: 'No Claude configuration file found',
|
|
47
|
-
hasConfig: false
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Look for task-master-ai in user-scoped MCP servers
|
|
52
|
-
let taskMasterServer = null;
|
|
53
|
-
if (configData.mcpServers && typeof configData.mcpServers === 'object') {
|
|
54
|
-
const serverEntry = Object.entries(configData.mcpServers).find(([name, config]) =>
|
|
55
|
-
name === 'task-master-ai' ||
|
|
56
|
-
name.includes('task-master') ||
|
|
57
|
-
(config && config.command && config.command.includes('task-master'))
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
if (serverEntry) {
|
|
61
|
-
const [name, config] = serverEntry;
|
|
62
|
-
taskMasterServer = {
|
|
63
|
-
name,
|
|
64
|
-
scope: 'user',
|
|
65
|
-
config,
|
|
66
|
-
type: config.command ? 'stdio' : (config.url ? 'http' : 'unknown')
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Also check project-specific MCP servers if not found globally
|
|
72
|
-
if (!taskMasterServer && configData.projects) {
|
|
73
|
-
for (const [projectPath, projectConfig] of Object.entries(configData.projects)) {
|
|
74
|
-
if (projectConfig.mcpServers && typeof projectConfig.mcpServers === 'object') {
|
|
75
|
-
const serverEntry = Object.entries(projectConfig.mcpServers).find(([name, config]) =>
|
|
76
|
-
name === 'task-master-ai' ||
|
|
77
|
-
name.includes('task-master') ||
|
|
78
|
-
(config && config.command && config.command.includes('task-master'))
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
if (serverEntry) {
|
|
82
|
-
const [name, config] = serverEntry;
|
|
83
|
-
taskMasterServer = {
|
|
84
|
-
name,
|
|
85
|
-
scope: 'local',
|
|
86
|
-
projectPath,
|
|
87
|
-
config,
|
|
88
|
-
type: config.command ? 'stdio' : (config.url ? 'http' : 'unknown')
|
|
89
|
-
};
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (taskMasterServer) {
|
|
97
|
-
const isValid = !!(taskMasterServer.config &&
|
|
98
|
-
(taskMasterServer.config.command || taskMasterServer.config.url));
|
|
99
|
-
const hasEnvVars = !!(taskMasterServer.config &&
|
|
100
|
-
taskMasterServer.config.env &&
|
|
101
|
-
Object.keys(taskMasterServer.config.env).length > 0);
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
hasMCPServer: true,
|
|
105
|
-
isConfigured: isValid,
|
|
106
|
-
hasApiKeys: hasEnvVars,
|
|
107
|
-
scope: taskMasterServer.scope,
|
|
108
|
-
config: {
|
|
109
|
-
command: taskMasterServer.config?.command,
|
|
110
|
-
args: taskMasterServer.config?.args || [],
|
|
111
|
-
url: taskMasterServer.config?.url,
|
|
112
|
-
envVars: hasEnvVars ? Object.keys(taskMasterServer.config.env) : [],
|
|
113
|
-
type: taskMasterServer.type
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
} else {
|
|
117
|
-
// Get list of available servers for debugging
|
|
118
|
-
const availableServers = [];
|
|
119
|
-
if (configData.mcpServers) {
|
|
120
|
-
availableServers.push(...Object.keys(configData.mcpServers));
|
|
121
|
-
}
|
|
122
|
-
if (configData.projects) {
|
|
123
|
-
for (const projectConfig of Object.values(configData.projects)) {
|
|
124
|
-
if (projectConfig.mcpServers) {
|
|
125
|
-
availableServers.push(...Object.keys(projectConfig.mcpServers).map(name => `local:${name}`));
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return {
|
|
131
|
-
hasMCPServer: false,
|
|
132
|
-
reason: 'task-master-ai not found in configured MCP servers',
|
|
133
|
-
hasConfig: true,
|
|
134
|
-
configPath,
|
|
135
|
-
availableServers
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
} catch (error) {
|
|
139
|
-
console.error('Error detecting MCP server config:', error);
|
|
140
|
-
return {
|
|
141
|
-
hasMCPServer: false,
|
|
142
|
-
reason: `Error checking MCP config: ${error.message}`,
|
|
143
|
-
hasConfig: false
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
|
|
4
|
-
export function getModuleDir(importMetaUrl) {
|
|
5
|
-
return path.dirname(fileURLToPath(importMetaUrl));
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function findServerRoot(startDir) {
|
|
9
|
-
// Source files live under /server, while compiled files live under /dist-server/server.
|
|
10
|
-
// Walking up to the nearest "server" folder gives every backend module one stable anchor
|
|
11
|
-
// that works in both layouts instead of relying on fragile "../.." assumptions.
|
|
12
|
-
let currentDir = startDir;
|
|
13
|
-
|
|
14
|
-
while (path.basename(currentDir) !== 'server') {
|
|
15
|
-
const parentDir = path.dirname(currentDir);
|
|
16
|
-
|
|
17
|
-
if (parentDir === currentDir) {
|
|
18
|
-
throw new Error(`Could not resolve the backend server root from "${startDir}".`);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
currentDir = parentDir;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return currentDir;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function findAppRoot(startDir) {
|
|
28
|
-
const serverRoot = findServerRoot(startDir);
|
|
29
|
-
const parentOfServerRoot = path.dirname(serverRoot);
|
|
30
|
-
|
|
31
|
-
// Source files live at <app>/server, while compiled files live at <app>/dist-server/server.
|
|
32
|
-
// When the nearest server folder sits inside dist-server we need to hop one extra level up
|
|
33
|
-
// so repo-level files still resolve from the real app root instead of the build directory.
|
|
34
|
-
return path.basename(parentOfServerRoot) === 'dist-server'
|
|
35
|
-
? path.dirname(parentOfServerRoot)
|
|
36
|
-
: parentOfServerRoot;
|
|
37
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TASKMASTER WEBSOCKET UTILITIES
|
|
3
|
-
* ==============================
|
|
4
|
-
*
|
|
5
|
-
* Utilities for broadcasting TaskMaster state changes via WebSocket.
|
|
6
|
-
* Integrates with the existing WebSocket system to provide real-time updates.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Broadcast TaskMaster project update to all connected clients.
|
|
11
|
-
*
|
|
12
|
-
* The payload key is `projectId` post-migration so frontend listeners can
|
|
13
|
-
* match notifications against the DB-assigned project identifier they
|
|
14
|
-
* already use everywhere else.
|
|
15
|
-
*
|
|
16
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
17
|
-
* @param {string} projectId - DB id of the updated project
|
|
18
|
-
* @param {Object} taskMasterData - Updated TaskMaster data
|
|
19
|
-
*/
|
|
20
|
-
export function broadcastTaskMasterProjectUpdate(wss, projectId, taskMasterData) {
|
|
21
|
-
if (!wss || !projectId) {
|
|
22
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectId');
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const message = {
|
|
27
|
-
type: 'taskmaster-project-updated',
|
|
28
|
-
projectId,
|
|
29
|
-
taskMasterData,
|
|
30
|
-
timestamp: new Date().toISOString()
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
wss.clients.forEach((client) => {
|
|
35
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
36
|
-
try {
|
|
37
|
-
client.send(JSON.stringify(message));
|
|
38
|
-
} catch (error) {
|
|
39
|
-
console.error('Error sending TaskMaster project update:', error);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Broadcast TaskMaster tasks update for a specific project.
|
|
47
|
-
*
|
|
48
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
49
|
-
* @param {string} projectId - DB id of the project with updated tasks
|
|
50
|
-
* @param {Object} tasksData - Updated tasks data
|
|
51
|
-
*/
|
|
52
|
-
export function broadcastTaskMasterTasksUpdate(wss, projectId, tasksData) {
|
|
53
|
-
if (!wss || !projectId) {
|
|
54
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectId');
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const message = {
|
|
59
|
-
type: 'taskmaster-tasks-updated',
|
|
60
|
-
projectId,
|
|
61
|
-
tasksData,
|
|
62
|
-
timestamp: new Date().toISOString()
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
wss.clients.forEach((client) => {
|
|
67
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
68
|
-
try {
|
|
69
|
-
client.send(JSON.stringify(message));
|
|
70
|
-
} catch (error) {
|
|
71
|
-
console.error('Error sending TaskMaster tasks update:', error);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Broadcast MCP server status change
|
|
79
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
80
|
-
* @param {Object} mcpStatus - Updated MCP server status
|
|
81
|
-
*/
|
|
82
|
-
export function broadcastMCPStatusChange(wss, mcpStatus) {
|
|
83
|
-
if (!wss) {
|
|
84
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss');
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const message = {
|
|
89
|
-
type: 'taskmaster-mcp-status-changed',
|
|
90
|
-
mcpStatus,
|
|
91
|
-
timestamp: new Date().toISOString()
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
wss.clients.forEach((client) => {
|
|
96
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
97
|
-
try {
|
|
98
|
-
client.send(JSON.stringify(message));
|
|
99
|
-
} catch (error) {
|
|
100
|
-
console.error('Error sending TaskMaster MCP status update:', error);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Broadcast general TaskMaster update notification
|
|
108
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
109
|
-
* @param {string} updateType - Type of update (e.g., 'initialization', 'configuration')
|
|
110
|
-
* @param {Object} data - Additional data about the update
|
|
111
|
-
*/
|
|
112
|
-
export function broadcastTaskMasterUpdate(wss, updateType, data = {}) {
|
|
113
|
-
if (!wss || !updateType) {
|
|
114
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss or updateType');
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const message = {
|
|
119
|
-
type: 'taskmaster-update',
|
|
120
|
-
updateType,
|
|
121
|
-
data,
|
|
122
|
-
timestamp: new Date().toISOString()
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
wss.clients.forEach((client) => {
|
|
127
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
128
|
-
try {
|
|
129
|
-
client.send(JSON.stringify(message));
|
|
130
|
-
} catch (error) {
|
|
131
|
-
console.error('Error sending TaskMaster update:', error);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
const ANSI_ESCAPE_SEQUENCE_REGEX = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1B\\))/g;
|
|
2
|
-
const TRAILING_URL_PUNCTUATION_REGEX = /[)\]}>.,;:!?]+$/;
|
|
3
|
-
|
|
4
|
-
function stripAnsiSequences(value = '') {
|
|
5
|
-
return value.replace(ANSI_ESCAPE_SEQUENCE_REGEX, '');
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function normalizeDetectedUrl(url) {
|
|
9
|
-
if (!url || typeof url !== 'string') return null;
|
|
10
|
-
|
|
11
|
-
const cleaned = url.trim().replace(TRAILING_URL_PUNCTUATION_REGEX, '');
|
|
12
|
-
if (!cleaned) return null;
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
const parsed = new URL(cleaned);
|
|
16
|
-
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
return parsed.toString();
|
|
20
|
-
} catch {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function extractUrlsFromText(value = '') {
|
|
26
|
-
const directMatches = value.match(/https?:\/\/[^\s<>"'`\\\x1b\x07]+/gi) || [];
|
|
27
|
-
|
|
28
|
-
// Handle wrapped terminal URLs split across lines by terminal width.
|
|
29
|
-
const wrappedMatches = [];
|
|
30
|
-
const continuationRegex = /^[A-Za-z0-9\-._~:/?#\[\]@!$&'()*+,;=%]+$/;
|
|
31
|
-
const lines = value.split(/\r?\n/);
|
|
32
|
-
for (let i = 0; i < lines.length; i++) {
|
|
33
|
-
const line = lines[i].trim();
|
|
34
|
-
const startMatch = line.match(/https?:\/\/[^\s<>"'`\\\x1b\x07]+/i);
|
|
35
|
-
if (!startMatch) continue;
|
|
36
|
-
|
|
37
|
-
let combined = startMatch[0];
|
|
38
|
-
let j = i + 1;
|
|
39
|
-
while (j < lines.length) {
|
|
40
|
-
const continuation = lines[j].trim();
|
|
41
|
-
if (!continuation) break;
|
|
42
|
-
if (!continuationRegex.test(continuation)) break;
|
|
43
|
-
combined += continuation;
|
|
44
|
-
j++;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
wrappedMatches.push(combined.replace(/\r?\n\s*/g, ''));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return Array.from(new Set([...directMatches, ...wrappedMatches]));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function shouldAutoOpenUrlFromOutput(value = '') {
|
|
54
|
-
const normalized = value.toLowerCase();
|
|
55
|
-
return (
|
|
56
|
-
normalized.includes('browser didn\'t open') ||
|
|
57
|
-
normalized.includes('open this url') ||
|
|
58
|
-
normalized.includes('continue in your browser') ||
|
|
59
|
-
normalized.includes('press enter to open') ||
|
|
60
|
-
normalized.includes('open_url:')
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export {
|
|
65
|
-
ANSI_ESCAPE_SEQUENCE_REGEX,
|
|
66
|
-
TRAILING_URL_PUNCTUATION_REGEX,
|
|
67
|
-
stripAnsiSequences,
|
|
68
|
-
normalizeDetectedUrl,
|
|
69
|
-
extractUrlsFromText,
|
|
70
|
-
shouldAutoOpenUrlFromOutput
|
|
71
|
-
};
|
package/server/voice-proxy.js
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
// Optional voice proxy — forwards STT/TTS to an OpenAI-compatible audio backend.
|
|
2
|
-
//
|
|
3
|
-
// The backend is whatever the user points at: OpenAI, Groq, or a local server
|
|
4
|
-
// (LocalAI / Speaches / Kokoro-FastAPI / openedai-speech / etc.). It must expose the
|
|
5
|
-
// standard OpenAI audio endpoints:
|
|
6
|
-
// POST {base}/audio/transcriptions (multipart 'file' + 'model') -> { text }
|
|
7
|
-
// POST {base}/audio/speech ({ model, voice, input }) -> audio bytes
|
|
8
|
-
//
|
|
9
|
-
// Config is resolved per-request from headers (set by the client's voice settings),
|
|
10
|
-
// falling back to server env defaults. Mounted at /api/voice behind authenticateToken.
|
|
11
|
-
import { Readable } from 'node:stream';
|
|
12
|
-
|
|
13
|
-
import express from 'express';
|
|
14
|
-
|
|
15
|
-
const ENV = {
|
|
16
|
-
baseUrl: (process.env.VOICE_API_BASE_URL || '').replace(/\/$/, ''),
|
|
17
|
-
apiKey: process.env.VOICE_API_KEY || '',
|
|
18
|
-
sttModel: process.env.VOICE_STT_MODEL || 'whisper-1',
|
|
19
|
-
ttsModel: process.env.VOICE_TTS_MODEL || 'tts-1',
|
|
20
|
-
ttsVoice: process.env.VOICE_TTS_VOICE || 'alloy',
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Resolve the voice backend config for a request. Client headers (set from the
|
|
25
|
-
* user's in-app voice settings) take precedence over the server env defaults.
|
|
26
|
-
* @param {import('express').Request} req
|
|
27
|
-
* @returns {{baseUrl: string, apiKey: string, sttModel: string, ttsModel: string, ttsVoice: string, ttsFormat: string}}
|
|
28
|
-
*/
|
|
29
|
-
function resolveConfig(req) {
|
|
30
|
-
const h = req.headers;
|
|
31
|
-
return {
|
|
32
|
-
// Security: do not allow clients to control the outbound backend host.
|
|
33
|
-
// Always use the server-side configured base URL.
|
|
34
|
-
baseUrl: ENV.baseUrl,
|
|
35
|
-
apiKey: String(h['x-voice-api-key'] || '') || ENV.apiKey,
|
|
36
|
-
sttModel: String(h['x-voice-stt-model'] || '') || ENV.sttModel,
|
|
37
|
-
ttsModel: String(h['x-voice-tts-model'] || '') || ENV.ttsModel,
|
|
38
|
-
ttsVoice: String(h['x-voice-tts-voice'] || '') || ENV.ttsVoice,
|
|
39
|
-
ttsFormat: String(h['x-voice-tts-format'] || '').trim(),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const router = express.Router();
|
|
44
|
-
|
|
45
|
-
// Generous by default — local TTS can synthesize long messages at ~real-time on CPU.
|
|
46
|
-
// Guard against a non-numeric/zero override that would make setTimeout fire immediately.
|
|
47
|
-
const DEFAULT_VOICE_TIMEOUT_MS = 300000;
|
|
48
|
-
const _parsedTimeout = Number(process.env.VOICE_TIMEOUT_MS);
|
|
49
|
-
const VOICE_TIMEOUT_MS = Number.isFinite(_parsedTimeout) && _parsedTimeout > 0
|
|
50
|
-
? _parsedTimeout
|
|
51
|
-
: DEFAULT_VOICE_TIMEOUT_MS;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* fetch() with an AbortController timeout so a stalled backend can't hold the
|
|
55
|
-
* request open indefinitely. Aborts after VOICE_TIMEOUT_MS.
|
|
56
|
-
* @param {string} url
|
|
57
|
-
* @param {RequestInit} [options]
|
|
58
|
-
* @returns {Promise<Response>}
|
|
59
|
-
*/
|
|
60
|
-
async function fetchWithTimeout(url, options = {}) {
|
|
61
|
-
const parsed = new URL(url);
|
|
62
|
-
if (!['http:', 'https:'].includes(parsed.protocol) || !isAllowedBackendUrl(parsed.origin)) {
|
|
63
|
-
throw new Error('Blocked outbound voice backend URL');
|
|
64
|
-
}
|
|
65
|
-
const controller = new AbortController();
|
|
66
|
-
const timer = setTimeout(() => controller.abort(), VOICE_TIMEOUT_MS);
|
|
67
|
-
try {
|
|
68
|
-
return await fetch(parsed.toString(), { redirect: 'manual', ...options, signal: controller.signal });
|
|
69
|
-
} finally {
|
|
70
|
-
clearTimeout(timer);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Turn a backend fetch failure into a clear, actionable client response:
|
|
76
|
-
* 504 on timeout (AbortError), 502 otherwise.
|
|
77
|
-
* @param {import('express').Response} res
|
|
78
|
-
* @param {Error} e
|
|
79
|
-
*/
|
|
80
|
-
function backendError(res, e) {
|
|
81
|
-
if (e && e.name === 'AbortError') {
|
|
82
|
-
return res.status(504).json({
|
|
83
|
-
error: `Voice backend timed out after ${Math.round(VOICE_TIMEOUT_MS / 1000)}s. Check your voice backend.`,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return res.status(502).json({ error: `Voice backend unreachable: ${e.message}` });
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* SSRF guard for the user-configurable backend URL: allow http/https only and
|
|
91
|
-
* block the link-local / cloud-metadata range (169.254.x). localhost and private
|
|
92
|
-
* ranges are allowed on purpose so users can point at a local voice server
|
|
93
|
-
* (LocalAI, Speaches, Kokoro-FastAPI, etc.).
|
|
94
|
-
* @param {string} raw
|
|
95
|
-
* @returns {boolean}
|
|
96
|
-
*/
|
|
97
|
-
function isAllowedBackendUrl(raw) {
|
|
98
|
-
let u;
|
|
99
|
-
try {
|
|
100
|
-
u = new URL(raw);
|
|
101
|
-
} catch {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
if (u.protocol !== 'http:' && u.protocol !== 'https:') return false;
|
|
105
|
-
if (u.hostname === '169.254.169.254' || u.hostname.startsWith('169.254.')) return false;
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Relay an upstream (backend) error to the client without making an upstream
|
|
111
|
-
* 401/403 look like the user's own app login failed.
|
|
112
|
-
* @param {import('express').Response} res
|
|
113
|
-
* @param {number} status
|
|
114
|
-
* @param {string} [text]
|
|
115
|
-
*/
|
|
116
|
-
function upstreamError(res, status, text) {
|
|
117
|
-
if (status === 401 || status === 403) {
|
|
118
|
-
return res.status(502).json({ error: 'Voice backend rejected the request (check the API key).' });
|
|
119
|
-
}
|
|
120
|
-
return res.status(status).json({ error: text || 'voice backend error' });
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
let _upload = null;
|
|
124
|
-
/**
|
|
125
|
-
* Lazily build a memory-storage multer instance (25 MB cap) for audio uploads,
|
|
126
|
-
* so multer is only imported when the voice feature is actually used.
|
|
127
|
-
* @returns {Promise<import('multer').Multer>}
|
|
128
|
-
*/
|
|
129
|
-
async function getUpload() {
|
|
130
|
-
if (!_upload) {
|
|
131
|
-
const multer = (await import('multer')).default;
|
|
132
|
-
_upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 25 * 1024 * 1024 } });
|
|
133
|
-
}
|
|
134
|
-
return _upload;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Build the Authorization header for the backend, or an empty object when no
|
|
139
|
-
* key is configured (e.g. a local server that needs none).
|
|
140
|
-
* @param {string} apiKey
|
|
141
|
-
* @returns {Record<string, string>}
|
|
142
|
-
*/
|
|
143
|
-
function authHeader(apiKey) {
|
|
144
|
-
return apiKey ? { Authorization: `Bearer ${apiKey}` } : {};
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* GET /api/voice/health -> { configured } (true when a backend base URL is set).
|
|
149
|
-
*/
|
|
150
|
-
router.get('/health', (req, res) => {
|
|
151
|
-
res.json({ configured: Boolean(resolveConfig(req).baseUrl) });
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* POST /api/voice/transcribe (multipart 'audio') -> { text }.
|
|
156
|
-
* Forwards the uploaded audio to the backend's /audio/transcriptions endpoint.
|
|
157
|
-
*/
|
|
158
|
-
router.post('/transcribe', async (req, res) => {
|
|
159
|
-
const cfg = resolveConfig(req);
|
|
160
|
-
if (!cfg.baseUrl) return res.status(503).json({ error: 'No voice backend configured' });
|
|
161
|
-
if (!isAllowedBackendUrl(cfg.baseUrl)) return res.status(400).json({ error: 'Invalid voice backend URL.' });
|
|
162
|
-
const upload = await getUpload();
|
|
163
|
-
upload.single('audio')(req, res, async (err) => {
|
|
164
|
-
if (err) return res.status(400).json({ error: err.message });
|
|
165
|
-
if (!req.file) return res.status(400).json({ error: 'No audio uploaded' });
|
|
166
|
-
try {
|
|
167
|
-
const fd = new FormData();
|
|
168
|
-
fd.append(
|
|
169
|
-
'file',
|
|
170
|
-
new Blob([req.file.buffer], { type: req.file.mimetype || 'audio/webm' }),
|
|
171
|
-
req.file.originalname || 'recording.webm',
|
|
172
|
-
);
|
|
173
|
-
fd.append('model', cfg.sttModel);
|
|
174
|
-
const r = await fetchWithTimeout(`${cfg.baseUrl}/audio/transcriptions`, {
|
|
175
|
-
method: 'POST',
|
|
176
|
-
headers: authHeader(cfg.apiKey),
|
|
177
|
-
body: fd,
|
|
178
|
-
});
|
|
179
|
-
const text = await r.text();
|
|
180
|
-
if (!r.ok) return upstreamError(res, r.status, text);
|
|
181
|
-
let data;
|
|
182
|
-
try { data = JSON.parse(text); } catch { data = { text }; }
|
|
183
|
-
res.json({ text: data.text ?? '' });
|
|
184
|
-
} catch (e) {
|
|
185
|
-
backendError(res, e);
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* POST /api/voice/tts { text } -> audio bytes.
|
|
192
|
-
* Forwards the text to the backend's /audio/speech endpoint and streams the audio back.
|
|
193
|
-
*/
|
|
194
|
-
router.post('/tts', async (req, res) => {
|
|
195
|
-
const cfg = resolveConfig(req);
|
|
196
|
-
if (!cfg.baseUrl) return res.status(503).json({ error: 'No voice backend configured' });
|
|
197
|
-
if (!isAllowedBackendUrl(cfg.baseUrl)) return res.status(400).json({ error: 'Invalid voice backend URL.' });
|
|
198
|
-
const text = req.body?.text;
|
|
199
|
-
if (typeof text !== 'string' || !text.trim()) return res.status(400).json({ error: 'text required' });
|
|
200
|
-
try {
|
|
201
|
-
const r = await fetchWithTimeout(`${cfg.baseUrl}/audio/speech`, {
|
|
202
|
-
method: 'POST',
|
|
203
|
-
headers: { 'Content-Type': 'application/json', ...authHeader(cfg.apiKey) },
|
|
204
|
-
body: JSON.stringify({
|
|
205
|
-
model: cfg.ttsModel,
|
|
206
|
-
voice: cfg.ttsVoice,
|
|
207
|
-
input: text,
|
|
208
|
-
...(cfg.ttsFormat ? { response_format: cfg.ttsFormat } : {}),
|
|
209
|
-
}),
|
|
210
|
-
});
|
|
211
|
-
if (!r.ok) {
|
|
212
|
-
const errText = await r.text().catch(() => 'tts failed');
|
|
213
|
-
return upstreamError(res, r.status, errText);
|
|
214
|
-
}
|
|
215
|
-
res.setHeader('Content-Type', r.headers.get('content-type') || 'audio/mpeg');
|
|
216
|
-
res.setHeader('Cache-Control', 'no-store');
|
|
217
|
-
if (!r.body) return res.end();
|
|
218
|
-
Readable.fromWeb(r.body).on('error', (error) => res.destroy(error)).pipe(res);
|
|
219
|
-
} catch (e) {
|
|
220
|
-
backendError(res, e);
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
export default router;
|
|
File without changes
|