@cloudcli-ai/cloudcli 1.29.5 → 1.31.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/README.de.md +1 -1
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.ru.md +1 -1
- package/README.tr.md +252 -0
- package/README.zh-CN.md +1 -1
- package/dist/assets/index-DF8TTVHl.css +32 -0
- package/dist/assets/index-DbZAcc9z.js +1262 -0
- package/dist/index.html +2 -2
- package/dist-server/server/claude-sdk.js +13 -8
- package/dist-server/server/claude-sdk.js.map +1 -1
- package/dist-server/server/cursor-cli.js +7 -7
- package/dist-server/server/cursor-cli.js.map +1 -1
- package/dist-server/server/gemini-cli.js +5 -5
- package/dist-server/server/gemini-cli.js.map +1 -1
- package/dist-server/server/gemini-response-handler.js +2 -2
- package/dist-server/server/gemini-response-handler.js.map +1 -1
- package/dist-server/server/index.js +139 -977
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/middleware/auth.js +1 -1
- package/dist-server/server/middleware/auth.js.map +1 -1
- package/dist-server/server/modules/database/connection.js +125 -0
- package/dist-server/server/modules/database/connection.js.map +1 -0
- package/dist-server/server/modules/database/index.js +13 -0
- package/dist-server/server/modules/database/index.js.map +1 -0
- package/dist-server/server/modules/database/init-db.js +18 -0
- package/dist-server/server/modules/database/init-db.js.map +1 -0
- package/dist-server/server/modules/database/migrations.js +370 -0
- package/dist-server/server/modules/database/migrations.js.map +1 -0
- package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
- package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
- package/dist-server/server/modules/database/repositories/app-config.js +47 -0
- package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
- package/dist-server/server/modules/database/repositories/credentials.js +68 -0
- package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
- package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
- package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
- package/dist-server/server/modules/database/repositories/notification-preferences.js +72 -0
- package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
- package/dist-server/server/modules/database/repositories/projects.db.integration.test.js +64 -0
- package/dist-server/server/modules/database/repositories/projects.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/repositories/projects.db.js +160 -0
- package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
- package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
- package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
- package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js +109 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/users.js +88 -0
- package/dist-server/server/modules/database/repositories/users.js.map +1 -0
- package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
- package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
- package/dist-server/server/modules/database/schema.js +143 -0
- package/dist-server/server/modules/database/schema.js.map +1 -0
- package/dist-server/server/modules/projects/index.js +4 -0
- package/dist-server/server/modules/projects/index.js.map +1 -0
- package/dist-server/server/modules/projects/projects.routes.js +188 -0
- package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-clone.service.js +219 -0
- package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-delete.service.js +65 -0
- package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-management.service.js +93 -0
- package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
- package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
- package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +169 -0
- package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
- package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
- package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
- package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/index.js +4 -0
- package/dist-server/server/modules/providers/index.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +103 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +63 -0
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +403 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js +15 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +71 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +494 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js +15 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +127 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +369 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +15 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +131 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js +82 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js +296 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js +474 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini.provider.js +15 -0
- package/dist-server/server/modules/providers/list/gemini/gemini.provider.js.map +1 -0
- package/dist-server/server/modules/providers/provider.registry.js +31 -0
- package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
- package/dist-server/server/modules/providers/provider.routes.js +331 -0
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
- package/dist-server/server/modules/providers/services/mcp.service.js +69 -0
- package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js +868 -0
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js +56 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js +234 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions.service.js +104 -0
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js +14 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js +250 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
- package/dist-server/server/modules/websocket/index.js +3 -0
- package/dist-server/server/modules/websocket/index.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +188 -0
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
- package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js +334 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-auth.service.js +32 -0
- package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-server.service.js +36 -0
- package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
- package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
- package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
- package/dist-server/server/openai-codex.js +5 -5
- package/dist-server/server/openai-codex.js.map +1 -1
- package/dist-server/server/routes/agent.js +10 -17
- package/dist-server/server/routes/agent.js.map +1 -1
- package/dist-server/server/routes/auth.js +3 -1
- package/dist-server/server/routes/auth.js.map +1 -1
- package/dist-server/server/routes/commands.js +1 -45
- package/dist-server/server/routes/commands.js.map +1 -1
- package/dist-server/server/routes/cursor.js +9 -489
- package/dist-server/server/routes/cursor.js.map +1 -1
- package/dist-server/server/routes/gemini.js +2 -2
- package/dist-server/server/routes/gemini.js.map +1 -1
- package/dist-server/server/routes/git.js +33 -29
- package/dist-server/server/routes/git.js.map +1 -1
- package/dist-server/server/routes/mcp-utils.js +1 -18
- package/dist-server/server/routes/mcp-utils.js.map +1 -1
- package/dist-server/server/routes/settings.js +11 -1
- package/dist-server/server/routes/settings.js.map +1 -1
- package/dist-server/server/routes/taskmaster.js +97 -569
- package/dist-server/server/routes/taskmaster.js.map +1 -1
- package/dist-server/server/routes/user.js +1 -1
- package/dist-server/server/routes/user.js.map +1 -1
- package/dist-server/server/services/notification-orchestrator.js +2 -2
- package/dist-server/server/services/notification-orchestrator.js.map +1 -1
- package/dist-server/server/services/vapid-keys.js +2 -1
- package/dist-server/server/services/vapid-keys.js.map +1 -1
- package/dist-server/server/shared/interfaces.js +2 -0
- package/dist-server/server/shared/interfaces.js.map +1 -0
- package/dist-server/server/shared/types.js +2 -0
- package/dist-server/server/shared/types.js.map +1 -0
- package/dist-server/server/shared/utils.js +551 -0
- package/dist-server/server/shared/utils.js.map +1 -0
- package/dist-server/server/utils/mcp-detector.js +0 -49
- package/dist-server/server/utils/mcp-detector.js.map +1 -1
- package/dist-server/server/utils/taskmaster-websocket.js +18 -12
- package/dist-server/server/utils/taskmaster-websocket.js.map +1 -1
- package/dist-server/shared/modelConstants.js +3 -1
- package/dist-server/shared/modelConstants.js.map +1 -1
- package/package.json +7 -2
- package/server/claude-sdk.js +14 -8
- package/server/cursor-cli.js +7 -7
- package/server/gemini-cli.js +5 -5
- package/server/gemini-response-handler.js +2 -2
- package/server/index.js +173 -1035
- package/server/middleware/auth.js +1 -1
- package/server/modules/database/connection.ts +143 -0
- package/server/modules/database/index.ts +12 -0
- package/server/modules/database/init-db.ts +17 -0
- package/server/modules/database/migrations.ts +442 -0
- package/server/modules/database/repositories/api-keys.ts +119 -0
- package/server/modules/database/repositories/app-config.ts +53 -0
- package/server/modules/database/repositories/credentials.ts +106 -0
- package/server/modules/database/repositories/github-tokens.ts +100 -0
- package/server/modules/database/repositories/notification-preferences.ts +103 -0
- package/server/modules/database/repositories/projects.db.integration.test.ts +72 -0
- package/server/modules/database/repositories/projects.db.ts +183 -0
- package/server/modules/database/repositories/push-subscriptions.ts +80 -0
- package/server/modules/database/repositories/scan-state.db.ts +42 -0
- package/server/modules/database/repositories/sessions.db.ts +174 -0
- package/server/modules/database/repositories/users.ts +140 -0
- package/server/modules/database/repositories/vapid-keys.ts +57 -0
- package/server/modules/database/schema.ts +152 -0
- package/server/modules/projects/index.ts +6 -0
- package/server/modules/projects/projects.routes.ts +247 -0
- package/server/modules/projects/services/project-clone.service.ts +321 -0
- package/server/modules/projects/services/project-delete.service.ts +75 -0
- package/server/modules/projects/services/project-management.service.ts +150 -0
- package/server/modules/projects/services/project-star.service.ts +78 -0
- package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
- package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +285 -0
- package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
- package/server/modules/projects/tests/project-management.service.test.ts +117 -0
- package/server/modules/projects/tests/project-star.service.test.ts +123 -0
- package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
- package/server/modules/providers/index.ts +4 -0
- package/server/modules/providers/list/claude/claude-auth.provider.ts +123 -0
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
- package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +110 -0
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +475 -0
- package/server/modules/providers/list/claude/claude.provider.ts +17 -0
- package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +119 -0
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +564 -0
- package/server/modules/providers/list/codex/codex.provider.ts +17 -0
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +176 -0
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -0
- package/server/modules/providers/list/cursor/cursor.provider.ts +17 -0
- package/server/modules/providers/list/gemini/gemini-auth.provider.ts +151 -0
- package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -0
- package/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.ts +401 -0
- package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +541 -0
- package/server/modules/providers/list/gemini/gemini.provider.ts +17 -0
- package/server/modules/providers/provider.registry.ts +36 -0
- package/server/modules/providers/provider.routes.ts +425 -0
- package/server/modules/providers/services/mcp.service.ts +94 -0
- package/server/modules/providers/services/provider-auth.service.ts +26 -0
- package/server/modules/providers/services/session-conversations-search.service.ts +1167 -0
- package/server/modules/providers/services/session-synchronizer.service.ts +74 -0
- package/server/modules/providers/services/sessions-watcher.service.ts +283 -0
- package/server/modules/providers/services/sessions.service.ts +130 -0
- package/server/modules/providers/shared/base/abstract.provider.ts +27 -0
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
- package/server/modules/providers/tests/mcp.test.ts +293 -0
- package/server/modules/websocket/README.md +267 -0
- package/server/modules/websocket/index.ts +2 -0
- package/server/modules/websocket/services/chat-websocket.service.ts +271 -0
- package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
- package/server/modules/websocket/services/shell-websocket.service.ts +453 -0
- package/server/modules/websocket/services/websocket-auth.service.ts +54 -0
- package/server/modules/websocket/services/websocket-server.service.ts +58 -0
- package/server/modules/websocket/services/websocket-state.service.ts +16 -0
- package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
- package/server/openai-codex.js +5 -5
- package/server/routes/agent.js +11 -16
- package/server/routes/auth.js +4 -2
- package/server/routes/commands.js +1 -50
- package/server/routes/cursor.js +15 -527
- package/server/routes/gemini.js +3 -2
- package/server/routes/git.js +33 -28
- package/server/routes/mcp-utils.js +2 -19
- package/server/routes/settings.js +11 -1
- package/server/routes/taskmaster.js +107 -602
- package/server/routes/user.js +1 -1
- package/server/services/notification-orchestrator.js +3 -2
- package/server/services/vapid-keys.js +2 -1
- package/server/shared/interfaces.ts +92 -0
- package/server/shared/types.ts +327 -0
- package/server/shared/utils.ts +669 -0
- package/server/tsconfig.json +6 -3
- package/server/utils/mcp-detector.js +0 -51
- package/server/utils/taskmaster-websocket.js +19 -13
- package/shared/modelConstants.js +3 -1
- package/dist/assets/index-BBAE1OJ_.css +0 -32
- package/dist/assets/index-Ci1GOyV7.js +0 -1262
- package/dist-server/server/database/db.js +0 -535
- package/dist-server/server/database/db.js.map +0 -1
- package/dist-server/server/database/schema.js +0 -97
- package/dist-server/server/database/schema.js.map +0 -1
- package/dist-server/server/projects.js +0 -2325
- package/dist-server/server/projects.js.map +0 -1
- package/dist-server/server/providers/claude/adapter.js +0 -266
- package/dist-server/server/providers/claude/adapter.js.map +0 -1
- package/dist-server/server/providers/claude/status.js +0 -121
- package/dist-server/server/providers/claude/status.js.map +0 -1
- package/dist-server/server/providers/codex/adapter.js +0 -232
- package/dist-server/server/providers/codex/adapter.js.map +0 -1
- package/dist-server/server/providers/codex/status.js +0 -70
- package/dist-server/server/providers/codex/status.js.map +0 -1
- package/dist-server/server/providers/cursor/adapter.js +0 -342
- package/dist-server/server/providers/cursor/adapter.js.map +0 -1
- package/dist-server/server/providers/cursor/status.js +0 -118
- package/dist-server/server/providers/cursor/status.js.map +0 -1
- package/dist-server/server/providers/gemini/adapter.js +0 -174
- package/dist-server/server/providers/gemini/adapter.js.map +0 -1
- package/dist-server/server/providers/gemini/status.js +0 -104
- package/dist-server/server/providers/gemini/status.js.map +0 -1
- package/dist-server/server/providers/registry.js +0 -58
- package/dist-server/server/providers/registry.js.map +0 -1
- package/dist-server/server/providers/types.js +0 -117
- package/dist-server/server/providers/types.js.map +0 -1
- package/dist-server/server/providers/utils.js +0 -28
- package/dist-server/server/providers/utils.js.map +0 -1
- package/dist-server/server/routes/cli-auth.js +0 -25
- package/dist-server/server/routes/cli-auth.js.map +0 -1
- package/dist-server/server/routes/codex.js +0 -294
- package/dist-server/server/routes/codex.js.map +0 -1
- package/dist-server/server/routes/mcp.js +0 -480
- package/dist-server/server/routes/mcp.js.map +0 -1
- package/dist-server/server/routes/messages.js +0 -56
- package/dist-server/server/routes/messages.js.map +0 -1
- package/dist-server/server/routes/projects.js +0 -505
- package/dist-server/server/routes/projects.js.map +0 -1
- package/server/database/db.js +0 -593
- package/server/database/schema.js +0 -102
- package/server/projects.js +0 -2555
- package/server/providers/claude/adapter.js +0 -278
- package/server/providers/claude/status.js +0 -136
- package/server/providers/codex/adapter.js +0 -248
- package/server/providers/codex/status.js +0 -78
- package/server/providers/cursor/adapter.js +0 -348
- package/server/providers/cursor/status.js +0 -128
- package/server/providers/gemini/adapter.js +0 -186
- package/server/providers/gemini/status.js +0 -111
- package/server/providers/registry.js +0 -67
- package/server/providers/types.js +0 -132
- package/server/providers/utils.js +0 -29
- package/server/routes/cli-auth.js +0 -27
- package/server/routes/codex.js +0 -329
- package/server/routes/mcp.js +0 -552
- package/server/routes/messages.js +0 -61
- package/server/routes/projects.js +0 -548
package/server/routes/cursor.js
CHANGED
|
@@ -2,563 +2,51 @@ import express from 'express';
|
|
|
2
2
|
import { promises as fs } from 'fs';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import os from 'os';
|
|
5
|
-
import Database from 'better-sqlite3';
|
|
6
|
-
import crypto from 'crypto';
|
|
7
5
|
import { CURSOR_MODELS } from '../../shared/modelConstants.js';
|
|
8
|
-
import { applyCustomSessionNames } from '../database/db.js';
|
|
9
6
|
|
|
10
7
|
const router = express.Router();
|
|
11
8
|
|
|
12
|
-
// GET /api/cursor/config - Read Cursor CLI configuration
|
|
9
|
+
// GET /api/cursor/config - Read Cursor CLI configuration.
|
|
13
10
|
router.get('/config', async (req, res) => {
|
|
14
11
|
try {
|
|
15
12
|
const configPath = path.join(os.homedir(), '.cursor', 'cli-config.json');
|
|
16
|
-
|
|
13
|
+
|
|
17
14
|
try {
|
|
18
15
|
const configContent = await fs.readFile(configPath, 'utf8');
|
|
19
16
|
const config = JSON.parse(configContent);
|
|
20
|
-
|
|
17
|
+
|
|
21
18
|
res.json({
|
|
22
19
|
success: true,
|
|
23
|
-
config
|
|
24
|
-
path: configPath
|
|
20
|
+
config,
|
|
21
|
+
path: configPath,
|
|
25
22
|
});
|
|
26
23
|
} catch (error) {
|
|
27
|
-
// Config doesn't exist or is invalid
|
|
24
|
+
// Config doesn't exist or is invalid, so return the UI default shape.
|
|
28
25
|
console.log('Cursor config not found or invalid:', error.message);
|
|
29
|
-
|
|
30
|
-
// Return default config
|
|
26
|
+
|
|
31
27
|
res.json({
|
|
32
28
|
success: true,
|
|
33
29
|
config: {
|
|
34
30
|
version: 1,
|
|
35
31
|
model: {
|
|
36
32
|
modelId: CURSOR_MODELS.DEFAULT,
|
|
37
|
-
displayName:
|
|
33
|
+
displayName: 'GPT-5',
|
|
38
34
|
},
|
|
39
35
|
permissions: {
|
|
40
36
|
allow: [],
|
|
41
|
-
deny: []
|
|
42
|
-
}
|
|
37
|
+
deny: [],
|
|
38
|
+
},
|
|
43
39
|
},
|
|
44
|
-
isDefault: true
|
|
40
|
+
isDefault: true,
|
|
45
41
|
});
|
|
46
42
|
}
|
|
47
43
|
} catch (error) {
|
|
48
44
|
console.error('Error reading Cursor config:', error);
|
|
49
|
-
res.status(500).json({
|
|
50
|
-
error: 'Failed to read Cursor configuration',
|
|
51
|
-
details: error.message
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// POST /api/cursor/config - Update Cursor CLI configuration
|
|
57
|
-
router.post('/config', async (req, res) => {
|
|
58
|
-
try {
|
|
59
|
-
const { permissions, model } = req.body;
|
|
60
|
-
const configPath = path.join(os.homedir(), '.cursor', 'cli-config.json');
|
|
61
|
-
|
|
62
|
-
// Read existing config or create default
|
|
63
|
-
let config = {
|
|
64
|
-
version: 1,
|
|
65
|
-
editor: {
|
|
66
|
-
vimMode: false
|
|
67
|
-
},
|
|
68
|
-
hasChangedDefaultModel: false,
|
|
69
|
-
privacyCache: {
|
|
70
|
-
ghostMode: false,
|
|
71
|
-
privacyMode: 3,
|
|
72
|
-
updatedAt: Date.now()
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
try {
|
|
77
|
-
const existing = await fs.readFile(configPath, 'utf8');
|
|
78
|
-
config = JSON.parse(existing);
|
|
79
|
-
} catch (error) {
|
|
80
|
-
// Config doesn't exist, use defaults
|
|
81
|
-
console.log('Creating new Cursor config');
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Update permissions if provided
|
|
85
|
-
if (permissions) {
|
|
86
|
-
config.permissions = {
|
|
87
|
-
allow: permissions.allow || [],
|
|
88
|
-
deny: permissions.deny || []
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Update model if provided
|
|
93
|
-
if (model) {
|
|
94
|
-
config.model = model;
|
|
95
|
-
config.hasChangedDefaultModel = true;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Ensure directory exists
|
|
99
|
-
const configDir = path.dirname(configPath);
|
|
100
|
-
await fs.mkdir(configDir, { recursive: true });
|
|
101
|
-
|
|
102
|
-
// Write updated config
|
|
103
|
-
await fs.writeFile(configPath, JSON.stringify(config, null, 2));
|
|
104
|
-
|
|
105
|
-
res.json({
|
|
106
|
-
success: true,
|
|
107
|
-
config: config,
|
|
108
|
-
message: 'Cursor configuration updated successfully'
|
|
109
|
-
});
|
|
110
|
-
} catch (error) {
|
|
111
|
-
console.error('Error updating Cursor config:', error);
|
|
112
|
-
res.status(500).json({
|
|
113
|
-
error: 'Failed to update Cursor configuration',
|
|
114
|
-
details: error.message
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
// GET /api/cursor/mcp - Read Cursor MCP servers configuration
|
|
120
|
-
router.get('/mcp', async (req, res) => {
|
|
121
|
-
try {
|
|
122
|
-
const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
const mcpContent = await fs.readFile(mcpPath, 'utf8');
|
|
126
|
-
const mcpConfig = JSON.parse(mcpContent);
|
|
127
|
-
|
|
128
|
-
// Convert to UI-friendly format
|
|
129
|
-
const servers = [];
|
|
130
|
-
if (mcpConfig.mcpServers && typeof mcpConfig.mcpServers === 'object') {
|
|
131
|
-
for (const [name, config] of Object.entries(mcpConfig.mcpServers)) {
|
|
132
|
-
const server = {
|
|
133
|
-
id: name,
|
|
134
|
-
name: name,
|
|
135
|
-
type: 'stdio',
|
|
136
|
-
scope: 'cursor',
|
|
137
|
-
config: {},
|
|
138
|
-
raw: config
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
// Determine transport type and extract config
|
|
142
|
-
if (config.command) {
|
|
143
|
-
server.type = 'stdio';
|
|
144
|
-
server.config.command = config.command;
|
|
145
|
-
server.config.args = config.args || [];
|
|
146
|
-
server.config.env = config.env || {};
|
|
147
|
-
} else if (config.url) {
|
|
148
|
-
server.type = config.transport || 'http';
|
|
149
|
-
server.config.url = config.url;
|
|
150
|
-
server.config.headers = config.headers || {};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
servers.push(server);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
res.json({
|
|
158
|
-
success: true,
|
|
159
|
-
servers: servers,
|
|
160
|
-
path: mcpPath
|
|
161
|
-
});
|
|
162
|
-
} catch (error) {
|
|
163
|
-
// MCP config doesn't exist
|
|
164
|
-
console.log('Cursor MCP config not found:', error.message);
|
|
165
|
-
res.json({
|
|
166
|
-
success: true,
|
|
167
|
-
servers: [],
|
|
168
|
-
isDefault: true
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
} catch (error) {
|
|
172
|
-
console.error('Error reading Cursor MCP config:', error);
|
|
173
|
-
res.status(500).json({
|
|
174
|
-
error: 'Failed to read Cursor MCP configuration',
|
|
175
|
-
details: error.message
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
// POST /api/cursor/mcp/add - Add MCP server to Cursor configuration
|
|
181
|
-
router.post('/mcp/add', async (req, res) => {
|
|
182
|
-
try {
|
|
183
|
-
const { name, type = 'stdio', command, args = [], url, headers = {}, env = {} } = req.body;
|
|
184
|
-
const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
|
|
185
|
-
|
|
186
|
-
console.log(`➕ Adding MCP server to Cursor config: ${name}`);
|
|
187
|
-
|
|
188
|
-
// Read existing config or create new
|
|
189
|
-
let mcpConfig = { mcpServers: {} };
|
|
190
|
-
|
|
191
|
-
try {
|
|
192
|
-
const existing = await fs.readFile(mcpPath, 'utf8');
|
|
193
|
-
mcpConfig = JSON.parse(existing);
|
|
194
|
-
if (!mcpConfig.mcpServers) {
|
|
195
|
-
mcpConfig.mcpServers = {};
|
|
196
|
-
}
|
|
197
|
-
} catch (error) {
|
|
198
|
-
console.log('Creating new Cursor MCP config');
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Build server config based on type
|
|
202
|
-
let serverConfig = {};
|
|
203
|
-
|
|
204
|
-
if (type === 'stdio') {
|
|
205
|
-
serverConfig = {
|
|
206
|
-
command: command,
|
|
207
|
-
args: args,
|
|
208
|
-
env: env
|
|
209
|
-
};
|
|
210
|
-
} else if (type === 'http' || type === 'sse') {
|
|
211
|
-
serverConfig = {
|
|
212
|
-
url: url,
|
|
213
|
-
transport: type,
|
|
214
|
-
headers: headers
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Add server to config
|
|
219
|
-
mcpConfig.mcpServers[name] = serverConfig;
|
|
220
|
-
|
|
221
|
-
// Ensure directory exists
|
|
222
|
-
const mcpDir = path.dirname(mcpPath);
|
|
223
|
-
await fs.mkdir(mcpDir, { recursive: true });
|
|
224
|
-
|
|
225
|
-
// Write updated config
|
|
226
|
-
await fs.writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2));
|
|
227
|
-
|
|
228
|
-
res.json({
|
|
229
|
-
success: true,
|
|
230
|
-
message: `MCP server "${name}" added to Cursor configuration`,
|
|
231
|
-
config: mcpConfig
|
|
232
|
-
});
|
|
233
|
-
} catch (error) {
|
|
234
|
-
console.error('Error adding MCP server to Cursor:', error);
|
|
235
|
-
res.status(500).json({
|
|
236
|
-
error: 'Failed to add MCP server',
|
|
237
|
-
details: error.message
|
|
45
|
+
res.status(500).json({
|
|
46
|
+
error: 'Failed to read Cursor configuration',
|
|
47
|
+
details: error.message,
|
|
238
48
|
});
|
|
239
49
|
}
|
|
240
50
|
});
|
|
241
51
|
|
|
242
|
-
|
|
243
|
-
router.delete('/mcp/:name', async (req, res) => {
|
|
244
|
-
try {
|
|
245
|
-
const { name } = req.params;
|
|
246
|
-
const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
|
|
247
|
-
|
|
248
|
-
console.log(`🗑️ Removing MCP server from Cursor config: ${name}`);
|
|
249
|
-
|
|
250
|
-
// Read existing config
|
|
251
|
-
let mcpConfig = { mcpServers: {} };
|
|
252
|
-
|
|
253
|
-
try {
|
|
254
|
-
const existing = await fs.readFile(mcpPath, 'utf8');
|
|
255
|
-
mcpConfig = JSON.parse(existing);
|
|
256
|
-
} catch (error) {
|
|
257
|
-
return res.status(404).json({
|
|
258
|
-
error: 'Cursor MCP configuration not found'
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Check if server exists
|
|
263
|
-
if (!mcpConfig.mcpServers || !mcpConfig.mcpServers[name]) {
|
|
264
|
-
return res.status(404).json({
|
|
265
|
-
error: `MCP server "${name}" not found in Cursor configuration`
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Remove server from config
|
|
270
|
-
delete mcpConfig.mcpServers[name];
|
|
271
|
-
|
|
272
|
-
// Write updated config
|
|
273
|
-
await fs.writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2));
|
|
274
|
-
|
|
275
|
-
res.json({
|
|
276
|
-
success: true,
|
|
277
|
-
message: `MCP server "${name}" removed from Cursor configuration`,
|
|
278
|
-
config: mcpConfig
|
|
279
|
-
});
|
|
280
|
-
} catch (error) {
|
|
281
|
-
console.error('Error removing MCP server from Cursor:', error);
|
|
282
|
-
res.status(500).json({
|
|
283
|
-
error: 'Failed to remove MCP server',
|
|
284
|
-
details: error.message
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
// POST /api/cursor/mcp/add-json - Add MCP server using JSON format
|
|
290
|
-
router.post('/mcp/add-json', async (req, res) => {
|
|
291
|
-
try {
|
|
292
|
-
const { name, jsonConfig } = req.body;
|
|
293
|
-
const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
|
|
294
|
-
|
|
295
|
-
console.log(`➕ Adding MCP server to Cursor config via JSON: ${name}`);
|
|
296
|
-
|
|
297
|
-
// Validate and parse JSON config
|
|
298
|
-
let parsedConfig;
|
|
299
|
-
try {
|
|
300
|
-
parsedConfig = typeof jsonConfig === 'string' ? JSON.parse(jsonConfig) : jsonConfig;
|
|
301
|
-
} catch (parseError) {
|
|
302
|
-
return res.status(400).json({
|
|
303
|
-
error: 'Invalid JSON configuration',
|
|
304
|
-
details: parseError.message
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// Read existing config or create new
|
|
309
|
-
let mcpConfig = { mcpServers: {} };
|
|
310
|
-
|
|
311
|
-
try {
|
|
312
|
-
const existing = await fs.readFile(mcpPath, 'utf8');
|
|
313
|
-
mcpConfig = JSON.parse(existing);
|
|
314
|
-
if (!mcpConfig.mcpServers) {
|
|
315
|
-
mcpConfig.mcpServers = {};
|
|
316
|
-
}
|
|
317
|
-
} catch (error) {
|
|
318
|
-
console.log('Creating new Cursor MCP config');
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// Add server to config
|
|
322
|
-
mcpConfig.mcpServers[name] = parsedConfig;
|
|
323
|
-
|
|
324
|
-
// Ensure directory exists
|
|
325
|
-
const mcpDir = path.dirname(mcpPath);
|
|
326
|
-
await fs.mkdir(mcpDir, { recursive: true });
|
|
327
|
-
|
|
328
|
-
// Write updated config
|
|
329
|
-
await fs.writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2));
|
|
330
|
-
|
|
331
|
-
res.json({
|
|
332
|
-
success: true,
|
|
333
|
-
message: `MCP server "${name}" added to Cursor configuration via JSON`,
|
|
334
|
-
config: mcpConfig
|
|
335
|
-
});
|
|
336
|
-
} catch (error) {
|
|
337
|
-
console.error('Error adding MCP server to Cursor via JSON:', error);
|
|
338
|
-
res.status(500).json({
|
|
339
|
-
error: 'Failed to add MCP server',
|
|
340
|
-
details: error.message
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
// GET /api/cursor/sessions - Get Cursor sessions from SQLite database
|
|
346
|
-
router.get('/sessions', async (req, res) => {
|
|
347
|
-
try {
|
|
348
|
-
const { projectPath } = req.query;
|
|
349
|
-
|
|
350
|
-
// Calculate cwdID hash for the project path (Cursor uses MD5 hash)
|
|
351
|
-
const cwdId = crypto.createHash('md5').update(projectPath || process.cwd()).digest('hex');
|
|
352
|
-
const cursorChatsPath = path.join(os.homedir(), '.cursor', 'chats', cwdId);
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
// Check if the directory exists
|
|
356
|
-
try {
|
|
357
|
-
await fs.access(cursorChatsPath);
|
|
358
|
-
} catch (error) {
|
|
359
|
-
// No sessions for this project
|
|
360
|
-
return res.json({
|
|
361
|
-
success: true,
|
|
362
|
-
sessions: [],
|
|
363
|
-
cwdId: cwdId,
|
|
364
|
-
path: cursorChatsPath
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// List all session directories
|
|
369
|
-
const sessionDirs = await fs.readdir(cursorChatsPath);
|
|
370
|
-
const sessions = [];
|
|
371
|
-
|
|
372
|
-
for (const sessionId of sessionDirs) {
|
|
373
|
-
const sessionPath = path.join(cursorChatsPath, sessionId);
|
|
374
|
-
const storeDbPath = path.join(sessionPath, 'store.db');
|
|
375
|
-
let dbStatMtimeMs = null;
|
|
376
|
-
|
|
377
|
-
try {
|
|
378
|
-
// Check if store.db exists
|
|
379
|
-
await fs.access(storeDbPath);
|
|
380
|
-
|
|
381
|
-
// Capture store.db mtime as a reliable fallback timestamp (last activity)
|
|
382
|
-
try {
|
|
383
|
-
const stat = await fs.stat(storeDbPath);
|
|
384
|
-
dbStatMtimeMs = stat.mtimeMs;
|
|
385
|
-
} catch (_) {}
|
|
386
|
-
|
|
387
|
-
// Open SQLite database
|
|
388
|
-
const db = new Database(storeDbPath, { readonly: true, fileMustExist: true });
|
|
389
|
-
|
|
390
|
-
// Get metadata from meta table
|
|
391
|
-
const metaRows = db.prepare('SELECT key, value FROM meta').all();
|
|
392
|
-
|
|
393
|
-
let sessionData = {
|
|
394
|
-
id: sessionId,
|
|
395
|
-
name: 'Untitled Session',
|
|
396
|
-
createdAt: null,
|
|
397
|
-
mode: null,
|
|
398
|
-
projectPath: projectPath,
|
|
399
|
-
lastMessage: null,
|
|
400
|
-
messageCount: 0
|
|
401
|
-
};
|
|
402
|
-
|
|
403
|
-
// Parse meta table entries
|
|
404
|
-
for (const row of metaRows) {
|
|
405
|
-
if (row.value) {
|
|
406
|
-
try {
|
|
407
|
-
// Try to decode as hex-encoded JSON
|
|
408
|
-
const hexMatch = row.value.toString().match(/^[0-9a-fA-F]+$/);
|
|
409
|
-
if (hexMatch) {
|
|
410
|
-
const jsonStr = Buffer.from(row.value, 'hex').toString('utf8');
|
|
411
|
-
const data = JSON.parse(jsonStr);
|
|
412
|
-
|
|
413
|
-
if (row.key === 'agent') {
|
|
414
|
-
sessionData.name = data.name || sessionData.name;
|
|
415
|
-
// Normalize createdAt to ISO string in milliseconds
|
|
416
|
-
let createdAt = data.createdAt;
|
|
417
|
-
if (typeof createdAt === 'number') {
|
|
418
|
-
if (createdAt < 1e12) {
|
|
419
|
-
createdAt = createdAt * 1000; // seconds -> ms
|
|
420
|
-
}
|
|
421
|
-
sessionData.createdAt = new Date(createdAt).toISOString();
|
|
422
|
-
} else if (typeof createdAt === 'string') {
|
|
423
|
-
const n = Number(createdAt);
|
|
424
|
-
if (!Number.isNaN(n)) {
|
|
425
|
-
const ms = n < 1e12 ? n * 1000 : n;
|
|
426
|
-
sessionData.createdAt = new Date(ms).toISOString();
|
|
427
|
-
} else {
|
|
428
|
-
// Assume it's already an ISO/date string
|
|
429
|
-
const d = new Date(createdAt);
|
|
430
|
-
sessionData.createdAt = isNaN(d.getTime()) ? null : d.toISOString();
|
|
431
|
-
}
|
|
432
|
-
} else {
|
|
433
|
-
sessionData.createdAt = sessionData.createdAt || null;
|
|
434
|
-
}
|
|
435
|
-
sessionData.mode = data.mode;
|
|
436
|
-
sessionData.agentId = data.agentId;
|
|
437
|
-
sessionData.latestRootBlobId = data.latestRootBlobId;
|
|
438
|
-
}
|
|
439
|
-
} else {
|
|
440
|
-
// If not hex, use raw value for simple keys
|
|
441
|
-
if (row.key === 'name') {
|
|
442
|
-
sessionData.name = row.value.toString();
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
} catch (e) {
|
|
446
|
-
console.log(`Could not parse meta value for key ${row.key}:`, e.message);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Get message count from JSON blobs only (actual messages, not DAG structure)
|
|
452
|
-
try {
|
|
453
|
-
const blobCount = db.prepare(`SELECT COUNT(*) as count FROM blobs WHERE substr(data, 1, 1) = X'7B'`).get();
|
|
454
|
-
sessionData.messageCount = blobCount.count;
|
|
455
|
-
|
|
456
|
-
// Get the most recent JSON blob for preview (actual message, not DAG structure)
|
|
457
|
-
const lastBlob = db.prepare(`SELECT data FROM blobs WHERE substr(data, 1, 1) = X'7B' ORDER BY rowid DESC LIMIT 1`).get();
|
|
458
|
-
|
|
459
|
-
if (lastBlob && lastBlob.data) {
|
|
460
|
-
try {
|
|
461
|
-
// Try to extract readable preview from blob (may contain binary with embedded JSON)
|
|
462
|
-
const raw = lastBlob.data.toString('utf8');
|
|
463
|
-
let preview = '';
|
|
464
|
-
// Attempt direct JSON parse
|
|
465
|
-
try {
|
|
466
|
-
const parsed = JSON.parse(raw);
|
|
467
|
-
if (parsed?.content) {
|
|
468
|
-
if (Array.isArray(parsed.content)) {
|
|
469
|
-
const firstText = parsed.content.find(p => p?.type === 'text' && p.text)?.text || '';
|
|
470
|
-
preview = firstText;
|
|
471
|
-
} else if (typeof parsed.content === 'string') {
|
|
472
|
-
preview = parsed.content;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
} catch (_) {}
|
|
476
|
-
if (!preview) {
|
|
477
|
-
// Strip non-printable and try to find JSON chunk
|
|
478
|
-
const cleaned = raw.replace(/[^\x09\x0A\x0D\x20-\x7E]/g, '');
|
|
479
|
-
const s = cleaned;
|
|
480
|
-
const start = s.indexOf('{');
|
|
481
|
-
const end = s.lastIndexOf('}');
|
|
482
|
-
if (start !== -1 && end > start) {
|
|
483
|
-
const jsonStr = s.slice(start, end + 1);
|
|
484
|
-
try {
|
|
485
|
-
const parsed = JSON.parse(jsonStr);
|
|
486
|
-
if (parsed?.content) {
|
|
487
|
-
if (Array.isArray(parsed.content)) {
|
|
488
|
-
const firstText = parsed.content.find(p => p?.type === 'text' && p.text)?.text || '';
|
|
489
|
-
preview = firstText;
|
|
490
|
-
} else if (typeof parsed.content === 'string') {
|
|
491
|
-
preview = parsed.content;
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
} catch (_) {
|
|
495
|
-
preview = s;
|
|
496
|
-
}
|
|
497
|
-
} else {
|
|
498
|
-
preview = s;
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
if (preview && preview.length > 0) {
|
|
502
|
-
sessionData.lastMessage = preview.substring(0, 100) + (preview.length > 100 ? '...' : '');
|
|
503
|
-
}
|
|
504
|
-
} catch (e) {
|
|
505
|
-
console.log('Could not parse blob data:', e.message);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
} catch (e) {
|
|
509
|
-
console.log('Could not read blobs:', e.message);
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
db.close();
|
|
513
|
-
|
|
514
|
-
// Finalize createdAt: use parsed meta value when valid, else fall back to store.db mtime
|
|
515
|
-
if (!sessionData.createdAt) {
|
|
516
|
-
if (dbStatMtimeMs && Number.isFinite(dbStatMtimeMs)) {
|
|
517
|
-
sessionData.createdAt = new Date(dbStatMtimeMs).toISOString();
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
sessions.push(sessionData);
|
|
522
|
-
|
|
523
|
-
} catch (error) {
|
|
524
|
-
console.log(`Could not read session ${sessionId}:`, error.message);
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
// Fallback: ensure createdAt is a valid ISO string (use session directory mtime as last resort)
|
|
529
|
-
for (const s of sessions) {
|
|
530
|
-
if (!s.createdAt) {
|
|
531
|
-
try {
|
|
532
|
-
const sessionDir = path.join(cursorChatsPath, s.id);
|
|
533
|
-
const st = await fs.stat(sessionDir);
|
|
534
|
-
s.createdAt = new Date(st.mtimeMs).toISOString();
|
|
535
|
-
} catch {
|
|
536
|
-
s.createdAt = new Date().toISOString();
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
// Sort sessions by creation date (newest first)
|
|
541
|
-
sessions.sort((a, b) => {
|
|
542
|
-
if (!a.createdAt) return 1;
|
|
543
|
-
if (!b.createdAt) return -1;
|
|
544
|
-
return new Date(b.createdAt) - new Date(a.createdAt);
|
|
545
|
-
});
|
|
546
|
-
|
|
547
|
-
applyCustomSessionNames(sessions, 'cursor');
|
|
548
|
-
|
|
549
|
-
res.json({
|
|
550
|
-
success: true,
|
|
551
|
-
sessions: sessions,
|
|
552
|
-
cwdId: cwdId,
|
|
553
|
-
path: cursorChatsPath
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
} catch (error) {
|
|
557
|
-
console.error('Error reading Cursor sessions:', error);
|
|
558
|
-
res.status(500).json({
|
|
559
|
-
error: 'Failed to read Cursor sessions',
|
|
560
|
-
details: error.message
|
|
561
|
-
});
|
|
562
|
-
}
|
|
563
|
-
});
|
|
564
|
-
export default router;
|
|
52
|
+
export default router;
|
package/server/routes/gemini.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
+
|
|
2
3
|
import sessionManager from '../sessionManager.js';
|
|
3
|
-
import {
|
|
4
|
+
import { sessionsDb } from '../modules/database/index.js';
|
|
4
5
|
|
|
5
6
|
const router = express.Router();
|
|
6
7
|
|
|
@@ -13,7 +14,7 @@ router.delete('/sessions/:sessionId', async (req, res) => {
|
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
await sessionManager.deleteSession(sessionId);
|
|
16
|
-
|
|
17
|
+
sessionsDb.deleteSessionById(sessionId);
|
|
17
18
|
res.json({ success: true });
|
|
18
19
|
} catch (error) {
|
|
19
20
|
console.error(`Error deleting Gemini session ${req.params.sessionId}:`, error);
|