@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.
Files changed (354) hide show
  1. package/README.de.md +1 -1
  2. package/README.ja.md +1 -1
  3. package/README.ko.md +1 -1
  4. package/README.md +1 -1
  5. package/README.ru.md +1 -1
  6. package/README.tr.md +252 -0
  7. package/README.zh-CN.md +1 -1
  8. package/dist/assets/index-DF8TTVHl.css +32 -0
  9. package/dist/assets/index-DbZAcc9z.js +1262 -0
  10. package/dist/index.html +2 -2
  11. package/dist-server/server/claude-sdk.js +13 -8
  12. package/dist-server/server/claude-sdk.js.map +1 -1
  13. package/dist-server/server/cursor-cli.js +7 -7
  14. package/dist-server/server/cursor-cli.js.map +1 -1
  15. package/dist-server/server/gemini-cli.js +5 -5
  16. package/dist-server/server/gemini-cli.js.map +1 -1
  17. package/dist-server/server/gemini-response-handler.js +2 -2
  18. package/dist-server/server/gemini-response-handler.js.map +1 -1
  19. package/dist-server/server/index.js +139 -977
  20. package/dist-server/server/index.js.map +1 -1
  21. package/dist-server/server/middleware/auth.js +1 -1
  22. package/dist-server/server/middleware/auth.js.map +1 -1
  23. package/dist-server/server/modules/database/connection.js +125 -0
  24. package/dist-server/server/modules/database/connection.js.map +1 -0
  25. package/dist-server/server/modules/database/index.js +13 -0
  26. package/dist-server/server/modules/database/index.js.map +1 -0
  27. package/dist-server/server/modules/database/init-db.js +18 -0
  28. package/dist-server/server/modules/database/init-db.js.map +1 -0
  29. package/dist-server/server/modules/database/migrations.js +370 -0
  30. package/dist-server/server/modules/database/migrations.js.map +1 -0
  31. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  32. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  33. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  34. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  35. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  36. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  37. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  38. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  39. package/dist-server/server/modules/database/repositories/notification-preferences.js +72 -0
  40. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  41. package/dist-server/server/modules/database/repositories/projects.db.integration.test.js +64 -0
  42. package/dist-server/server/modules/database/repositories/projects.db.integration.test.js.map +1 -0
  43. package/dist-server/server/modules/database/repositories/projects.db.js +160 -0
  44. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  45. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  46. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  47. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  48. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  49. package/dist-server/server/modules/database/repositories/sessions.db.js +109 -0
  50. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  51. package/dist-server/server/modules/database/repositories/users.js +88 -0
  52. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  53. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  54. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  55. package/dist-server/server/modules/database/schema.js +143 -0
  56. package/dist-server/server/modules/database/schema.js.map +1 -0
  57. package/dist-server/server/modules/projects/index.js +4 -0
  58. package/dist-server/server/modules/projects/index.js.map +1 -0
  59. package/dist-server/server/modules/projects/projects.routes.js +188 -0
  60. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  61. package/dist-server/server/modules/projects/services/project-clone.service.js +219 -0
  62. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  63. package/dist-server/server/modules/projects/services/project-delete.service.js +65 -0
  64. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  65. package/dist-server/server/modules/projects/services/project-management.service.js +93 -0
  66. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  67. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  68. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  69. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
  70. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  71. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +169 -0
  72. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  73. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
  74. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  75. package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
  76. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  77. package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
  78. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  79. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
  80. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  81. package/dist-server/server/modules/providers/index.js +4 -0
  82. package/dist-server/server/modules/providers/index.js.map +1 -0
  83. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +103 -0
  84. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  85. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  86. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  87. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +63 -0
  88. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
  89. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +403 -0
  90. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  91. package/dist-server/server/modules/providers/list/claude/claude.provider.js +15 -0
  92. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  93. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  94. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  95. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  96. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  97. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +71 -0
  98. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  99. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +494 -0
  100. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  101. package/dist-server/server/modules/providers/list/codex/codex.provider.js +15 -0
  102. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  103. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  104. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  105. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  106. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  107. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +127 -0
  108. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  109. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +369 -0
  110. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  111. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +15 -0
  112. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  113. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +131 -0
  114. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -0
  115. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js +82 -0
  116. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js.map +1 -0
  117. package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js +296 -0
  118. package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js.map +1 -0
  119. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js +474 -0
  120. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js.map +1 -0
  121. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js +15 -0
  122. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js.map +1 -0
  123. package/dist-server/server/modules/providers/provider.registry.js +31 -0
  124. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  125. package/dist-server/server/modules/providers/provider.routes.js +331 -0
  126. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  127. package/dist-server/server/modules/providers/services/mcp.service.js +69 -0
  128. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  129. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  130. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  131. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +868 -0
  132. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  133. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +56 -0
  134. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  135. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +234 -0
  136. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  137. package/dist-server/server/modules/providers/services/sessions.service.js +104 -0
  138. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  139. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +14 -0
  140. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  141. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  142. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  143. package/dist-server/server/modules/providers/tests/mcp.test.js +250 -0
  144. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  145. package/dist-server/server/modules/websocket/index.js +3 -0
  146. package/dist-server/server/modules/websocket/index.js.map +1 -0
  147. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +188 -0
  148. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  149. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  150. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  151. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +334 -0
  152. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  153. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +32 -0
  154. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  155. package/dist-server/server/modules/websocket/services/websocket-server.service.js +36 -0
  156. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  157. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  158. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  159. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  160. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  161. package/dist-server/server/openai-codex.js +5 -5
  162. package/dist-server/server/openai-codex.js.map +1 -1
  163. package/dist-server/server/routes/agent.js +10 -17
  164. package/dist-server/server/routes/agent.js.map +1 -1
  165. package/dist-server/server/routes/auth.js +3 -1
  166. package/dist-server/server/routes/auth.js.map +1 -1
  167. package/dist-server/server/routes/commands.js +1 -45
  168. package/dist-server/server/routes/commands.js.map +1 -1
  169. package/dist-server/server/routes/cursor.js +9 -489
  170. package/dist-server/server/routes/cursor.js.map +1 -1
  171. package/dist-server/server/routes/gemini.js +2 -2
  172. package/dist-server/server/routes/gemini.js.map +1 -1
  173. package/dist-server/server/routes/git.js +33 -29
  174. package/dist-server/server/routes/git.js.map +1 -1
  175. package/dist-server/server/routes/mcp-utils.js +1 -18
  176. package/dist-server/server/routes/mcp-utils.js.map +1 -1
  177. package/dist-server/server/routes/settings.js +11 -1
  178. package/dist-server/server/routes/settings.js.map +1 -1
  179. package/dist-server/server/routes/taskmaster.js +97 -569
  180. package/dist-server/server/routes/taskmaster.js.map +1 -1
  181. package/dist-server/server/routes/user.js +1 -1
  182. package/dist-server/server/routes/user.js.map +1 -1
  183. package/dist-server/server/services/notification-orchestrator.js +2 -2
  184. package/dist-server/server/services/notification-orchestrator.js.map +1 -1
  185. package/dist-server/server/services/vapid-keys.js +2 -1
  186. package/dist-server/server/services/vapid-keys.js.map +1 -1
  187. package/dist-server/server/shared/interfaces.js +2 -0
  188. package/dist-server/server/shared/interfaces.js.map +1 -0
  189. package/dist-server/server/shared/types.js +2 -0
  190. package/dist-server/server/shared/types.js.map +1 -0
  191. package/dist-server/server/shared/utils.js +551 -0
  192. package/dist-server/server/shared/utils.js.map +1 -0
  193. package/dist-server/server/utils/mcp-detector.js +0 -49
  194. package/dist-server/server/utils/mcp-detector.js.map +1 -1
  195. package/dist-server/server/utils/taskmaster-websocket.js +18 -12
  196. package/dist-server/server/utils/taskmaster-websocket.js.map +1 -1
  197. package/dist-server/shared/modelConstants.js +3 -1
  198. package/dist-server/shared/modelConstants.js.map +1 -1
  199. package/package.json +7 -2
  200. package/server/claude-sdk.js +14 -8
  201. package/server/cursor-cli.js +7 -7
  202. package/server/gemini-cli.js +5 -5
  203. package/server/gemini-response-handler.js +2 -2
  204. package/server/index.js +173 -1035
  205. package/server/middleware/auth.js +1 -1
  206. package/server/modules/database/connection.ts +143 -0
  207. package/server/modules/database/index.ts +12 -0
  208. package/server/modules/database/init-db.ts +17 -0
  209. package/server/modules/database/migrations.ts +442 -0
  210. package/server/modules/database/repositories/api-keys.ts +119 -0
  211. package/server/modules/database/repositories/app-config.ts +53 -0
  212. package/server/modules/database/repositories/credentials.ts +106 -0
  213. package/server/modules/database/repositories/github-tokens.ts +100 -0
  214. package/server/modules/database/repositories/notification-preferences.ts +103 -0
  215. package/server/modules/database/repositories/projects.db.integration.test.ts +72 -0
  216. package/server/modules/database/repositories/projects.db.ts +183 -0
  217. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  218. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  219. package/server/modules/database/repositories/sessions.db.ts +174 -0
  220. package/server/modules/database/repositories/users.ts +140 -0
  221. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  222. package/server/modules/database/schema.ts +152 -0
  223. package/server/modules/projects/index.ts +6 -0
  224. package/server/modules/projects/projects.routes.ts +247 -0
  225. package/server/modules/projects/services/project-clone.service.ts +321 -0
  226. package/server/modules/projects/services/project-delete.service.ts +75 -0
  227. package/server/modules/projects/services/project-management.service.ts +150 -0
  228. package/server/modules/projects/services/project-star.service.ts +78 -0
  229. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
  230. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +285 -0
  231. package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
  232. package/server/modules/projects/tests/project-management.service.test.ts +117 -0
  233. package/server/modules/projects/tests/project-star.service.test.ts +123 -0
  234. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
  235. package/server/modules/providers/index.ts +4 -0
  236. package/server/modules/providers/list/claude/claude-auth.provider.ts +123 -0
  237. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  238. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +110 -0
  239. package/server/modules/providers/list/claude/claude-sessions.provider.ts +475 -0
  240. package/server/modules/providers/list/claude/claude.provider.ts +17 -0
  241. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  242. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  243. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +119 -0
  244. package/server/modules/providers/list/codex/codex-sessions.provider.ts +564 -0
  245. package/server/modules/providers/list/codex/codex.provider.ts +17 -0
  246. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  247. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  248. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +176 -0
  249. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -0
  250. package/server/modules/providers/list/cursor/cursor.provider.ts +17 -0
  251. package/server/modules/providers/list/gemini/gemini-auth.provider.ts +151 -0
  252. package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -0
  253. package/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.ts +401 -0
  254. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +541 -0
  255. package/server/modules/providers/list/gemini/gemini.provider.ts +17 -0
  256. package/server/modules/providers/provider.registry.ts +36 -0
  257. package/server/modules/providers/provider.routes.ts +425 -0
  258. package/server/modules/providers/services/mcp.service.ts +94 -0
  259. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  260. package/server/modules/providers/services/session-conversations-search.service.ts +1167 -0
  261. package/server/modules/providers/services/session-synchronizer.service.ts +74 -0
  262. package/server/modules/providers/services/sessions-watcher.service.ts +283 -0
  263. package/server/modules/providers/services/sessions.service.ts +130 -0
  264. package/server/modules/providers/shared/base/abstract.provider.ts +27 -0
  265. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  266. package/server/modules/providers/tests/mcp.test.ts +293 -0
  267. package/server/modules/websocket/README.md +267 -0
  268. package/server/modules/websocket/index.ts +2 -0
  269. package/server/modules/websocket/services/chat-websocket.service.ts +271 -0
  270. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  271. package/server/modules/websocket/services/shell-websocket.service.ts +453 -0
  272. package/server/modules/websocket/services/websocket-auth.service.ts +54 -0
  273. package/server/modules/websocket/services/websocket-server.service.ts +58 -0
  274. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  275. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  276. package/server/openai-codex.js +5 -5
  277. package/server/routes/agent.js +11 -16
  278. package/server/routes/auth.js +4 -2
  279. package/server/routes/commands.js +1 -50
  280. package/server/routes/cursor.js +15 -527
  281. package/server/routes/gemini.js +3 -2
  282. package/server/routes/git.js +33 -28
  283. package/server/routes/mcp-utils.js +2 -19
  284. package/server/routes/settings.js +11 -1
  285. package/server/routes/taskmaster.js +107 -602
  286. package/server/routes/user.js +1 -1
  287. package/server/services/notification-orchestrator.js +3 -2
  288. package/server/services/vapid-keys.js +2 -1
  289. package/server/shared/interfaces.ts +92 -0
  290. package/server/shared/types.ts +327 -0
  291. package/server/shared/utils.ts +669 -0
  292. package/server/tsconfig.json +6 -3
  293. package/server/utils/mcp-detector.js +0 -51
  294. package/server/utils/taskmaster-websocket.js +19 -13
  295. package/shared/modelConstants.js +3 -1
  296. package/dist/assets/index-BBAE1OJ_.css +0 -32
  297. package/dist/assets/index-Ci1GOyV7.js +0 -1262
  298. package/dist-server/server/database/db.js +0 -535
  299. package/dist-server/server/database/db.js.map +0 -1
  300. package/dist-server/server/database/schema.js +0 -97
  301. package/dist-server/server/database/schema.js.map +0 -1
  302. package/dist-server/server/projects.js +0 -2325
  303. package/dist-server/server/projects.js.map +0 -1
  304. package/dist-server/server/providers/claude/adapter.js +0 -266
  305. package/dist-server/server/providers/claude/adapter.js.map +0 -1
  306. package/dist-server/server/providers/claude/status.js +0 -121
  307. package/dist-server/server/providers/claude/status.js.map +0 -1
  308. package/dist-server/server/providers/codex/adapter.js +0 -232
  309. package/dist-server/server/providers/codex/adapter.js.map +0 -1
  310. package/dist-server/server/providers/codex/status.js +0 -70
  311. package/dist-server/server/providers/codex/status.js.map +0 -1
  312. package/dist-server/server/providers/cursor/adapter.js +0 -342
  313. package/dist-server/server/providers/cursor/adapter.js.map +0 -1
  314. package/dist-server/server/providers/cursor/status.js +0 -118
  315. package/dist-server/server/providers/cursor/status.js.map +0 -1
  316. package/dist-server/server/providers/gemini/adapter.js +0 -174
  317. package/dist-server/server/providers/gemini/adapter.js.map +0 -1
  318. package/dist-server/server/providers/gemini/status.js +0 -104
  319. package/dist-server/server/providers/gemini/status.js.map +0 -1
  320. package/dist-server/server/providers/registry.js +0 -58
  321. package/dist-server/server/providers/registry.js.map +0 -1
  322. package/dist-server/server/providers/types.js +0 -117
  323. package/dist-server/server/providers/types.js.map +0 -1
  324. package/dist-server/server/providers/utils.js +0 -28
  325. package/dist-server/server/providers/utils.js.map +0 -1
  326. package/dist-server/server/routes/cli-auth.js +0 -25
  327. package/dist-server/server/routes/cli-auth.js.map +0 -1
  328. package/dist-server/server/routes/codex.js +0 -294
  329. package/dist-server/server/routes/codex.js.map +0 -1
  330. package/dist-server/server/routes/mcp.js +0 -480
  331. package/dist-server/server/routes/mcp.js.map +0 -1
  332. package/dist-server/server/routes/messages.js +0 -56
  333. package/dist-server/server/routes/messages.js.map +0 -1
  334. package/dist-server/server/routes/projects.js +0 -505
  335. package/dist-server/server/routes/projects.js.map +0 -1
  336. package/server/database/db.js +0 -593
  337. package/server/database/schema.js +0 -102
  338. package/server/projects.js +0 -2555
  339. package/server/providers/claude/adapter.js +0 -278
  340. package/server/providers/claude/status.js +0 -136
  341. package/server/providers/codex/adapter.js +0 -248
  342. package/server/providers/codex/status.js +0 -78
  343. package/server/providers/cursor/adapter.js +0 -348
  344. package/server/providers/cursor/status.js +0 -128
  345. package/server/providers/gemini/adapter.js +0 -186
  346. package/server/providers/gemini/status.js +0 -111
  347. package/server/providers/registry.js +0 -67
  348. package/server/providers/types.js +0 -132
  349. package/server/providers/utils.js +0 -29
  350. package/server/routes/cli-auth.js +0 -27
  351. package/server/routes/codex.js +0 -329
  352. package/server/routes/mcp.js +0 -552
  353. package/server/routes/messages.js +0 -61
  354. package/server/routes/projects.js +0 -548
@@ -0,0 +1,425 @@
1
+ import express, { type Request, type Response } from 'express';
2
+
3
+ import { providerAuthService } from '@/modules/providers/services/provider-auth.service.js';
4
+ import { providerMcpService } from '@/modules/providers/services/mcp.service.js';
5
+ import { sessionConversationsSearchService } from '@/modules/providers/services/session-conversations-search.service.js';
6
+ import { sessionsService } from '@/modules/providers/services/sessions.service.js';
7
+ import type { LLMProvider, McpScope, McpTransport, UpsertProviderMcpServerInput } from '@/shared/types.js';
8
+ import { AppError, asyncHandler, createApiSuccessResponse } from '@/shared/utils.js';
9
+
10
+ const router = express.Router();
11
+
12
+ const readPathParam = (value: unknown, name: string): string => {
13
+ if (typeof value === 'string') {
14
+ return value;
15
+ }
16
+
17
+ if (Array.isArray(value) && typeof value[0] === 'string') {
18
+ return value[0];
19
+ }
20
+
21
+ throw new AppError(`${name} path parameter is invalid.`, {
22
+ code: 'INVALID_PATH_PARAMETER',
23
+ statusCode: 400,
24
+ });
25
+ };
26
+
27
+ const normalizeProviderParam = (value: unknown): string =>
28
+ readPathParam(value, 'provider').trim().toLowerCase();
29
+
30
+ const SESSION_ID_PATTERN = /^[a-zA-Z0-9._-]{1,120}$/;
31
+
32
+ const parseSessionId = (value: unknown): string => {
33
+ const sessionId = readPathParam(value, 'sessionId').trim();
34
+ if (!SESSION_ID_PATTERN.test(sessionId)) {
35
+ throw new AppError('Invalid sessionId.', {
36
+ code: 'INVALID_SESSION_ID',
37
+ statusCode: 400,
38
+ });
39
+ }
40
+
41
+ return sessionId;
42
+ };
43
+
44
+ const readOptionalQueryString = (value: unknown): string | undefined => {
45
+ if (typeof value !== 'string') {
46
+ return undefined;
47
+ }
48
+
49
+ const normalized = value.trim();
50
+ return normalized.length > 0 ? normalized : undefined;
51
+ };
52
+
53
+ const parseOptionalBooleanQuery = (value: unknown, name: string): boolean | undefined => {
54
+ if (value === undefined) {
55
+ return undefined;
56
+ }
57
+
58
+ const normalized = readOptionalQueryString(value);
59
+ if (!normalized) {
60
+ return undefined;
61
+ }
62
+
63
+ if (normalized === 'true') {
64
+ return true;
65
+ }
66
+ if (normalized === 'false') {
67
+ return false;
68
+ }
69
+
70
+ throw new AppError(`${name} must be "true" or "false".`, {
71
+ code: 'INVALID_QUERY_PARAMETER',
72
+ statusCode: 400,
73
+ });
74
+ };
75
+
76
+ const parseMcpScope = (value: unknown): McpScope | undefined => {
77
+ if (value === undefined) {
78
+ return undefined;
79
+ }
80
+
81
+ const normalized = readOptionalQueryString(value);
82
+ if (!normalized) {
83
+ return undefined;
84
+ }
85
+
86
+ if (normalized === 'user' || normalized === 'local' || normalized === 'project') {
87
+ return normalized;
88
+ }
89
+
90
+ throw new AppError(`Unsupported MCP scope "${normalized}".`, {
91
+ code: 'INVALID_MCP_SCOPE',
92
+ statusCode: 400,
93
+ });
94
+ };
95
+
96
+ const parseMcpTransport = (value: unknown): McpTransport => {
97
+ const normalized = readOptionalQueryString(value);
98
+ if (!normalized) {
99
+ throw new AppError('transport is required.', {
100
+ code: 'MCP_TRANSPORT_REQUIRED',
101
+ statusCode: 400,
102
+ });
103
+ }
104
+
105
+ if (normalized === 'stdio' || normalized === 'http' || normalized === 'sse') {
106
+ return normalized;
107
+ }
108
+
109
+ throw new AppError(`Unsupported MCP transport "${normalized}".`, {
110
+ code: 'INVALID_MCP_TRANSPORT',
111
+ statusCode: 400,
112
+ });
113
+ };
114
+
115
+ const parseMcpUpsertPayload = (payload: unknown): UpsertProviderMcpServerInput => {
116
+ if (!payload || typeof payload !== 'object') {
117
+ throw new AppError('Request body must be an object.', {
118
+ code: 'INVALID_REQUEST_BODY',
119
+ statusCode: 400,
120
+ });
121
+ }
122
+
123
+ const body = payload as Record<string, unknown>;
124
+ const name = readOptionalQueryString(body.name);
125
+ if (!name) {
126
+ throw new AppError('name is required.', {
127
+ code: 'MCP_NAME_REQUIRED',
128
+ statusCode: 400,
129
+ });
130
+ }
131
+
132
+ const transport = parseMcpTransport(body.transport);
133
+ const scope = parseMcpScope(body.scope);
134
+ const workspacePath = readOptionalQueryString(body.workspacePath);
135
+
136
+ return {
137
+ name,
138
+ transport,
139
+ scope,
140
+ workspacePath,
141
+ command: readOptionalQueryString(body.command),
142
+ args: Array.isArray(body.args) ? body.args.filter((entry): entry is string => typeof entry === 'string') : undefined,
143
+ env: typeof body.env === 'object' && body.env !== null
144
+ ? Object.fromEntries(
145
+ Object.entries(body.env as Record<string, unknown>).filter(
146
+ (entry): entry is [string, string] => typeof entry[1] === 'string',
147
+ ),
148
+ )
149
+ : undefined,
150
+ cwd: readOptionalQueryString(body.cwd),
151
+ url: readOptionalQueryString(body.url),
152
+ headers: typeof body.headers === 'object' && body.headers !== null
153
+ ? Object.fromEntries(
154
+ Object.entries(body.headers as Record<string, unknown>).filter(
155
+ (entry): entry is [string, string] => typeof entry[1] === 'string',
156
+ ),
157
+ )
158
+ : undefined,
159
+ envVars: Array.isArray(body.envVars)
160
+ ? body.envVars.filter((entry): entry is string => typeof entry === 'string')
161
+ : undefined,
162
+ bearerTokenEnvVar: readOptionalQueryString(body.bearerTokenEnvVar),
163
+ envHttpHeaders: typeof body.envHttpHeaders === 'object' && body.envHttpHeaders !== null
164
+ ? Object.fromEntries(
165
+ Object.entries(body.envHttpHeaders as Record<string, unknown>).filter(
166
+ (entry): entry is [string, string] => typeof entry[1] === 'string',
167
+ ),
168
+ )
169
+ : undefined,
170
+ };
171
+ };
172
+
173
+ const parseProvider = (value: unknown): LLMProvider => {
174
+ const normalized = normalizeProviderParam(value);
175
+ if (normalized === 'claude' || normalized === 'codex' || normalized === 'cursor' || normalized === 'gemini') {
176
+ return normalized;
177
+ }
178
+
179
+ throw new AppError(`Unsupported provider "${normalized}".`, {
180
+ code: 'UNSUPPORTED_PROVIDER',
181
+ statusCode: 400,
182
+ });
183
+ };
184
+
185
+ const parseSessionRenameSummary = (payload: unknown): string => {
186
+ if (!payload || typeof payload !== 'object') {
187
+ throw new AppError('Request body must be an object.', {
188
+ code: 'INVALID_REQUEST_BODY',
189
+ statusCode: 400,
190
+ });
191
+ }
192
+
193
+ const body = payload as Record<string, unknown>;
194
+ const summary = typeof body.summary === 'string' ? body.summary.trim() : '';
195
+ if (!summary) {
196
+ throw new AppError('Summary is required.', {
197
+ code: 'INVALID_SESSION_SUMMARY',
198
+ statusCode: 400,
199
+ });
200
+ }
201
+
202
+ if (summary.length > 500) {
203
+ throw new AppError('Summary must not exceed 500 characters.', {
204
+ code: 'INVALID_SESSION_SUMMARY',
205
+ statusCode: 400,
206
+ });
207
+ }
208
+
209
+ return summary;
210
+ };
211
+
212
+ const parseSessionSearchQuery = (value: unknown): string => {
213
+ const query = readOptionalQueryString(value) ?? '';
214
+ if (query.length < 2) {
215
+ throw new AppError('Query must be at least 2 characters', {
216
+ code: 'INVALID_SEARCH_QUERY',
217
+ statusCode: 400,
218
+ });
219
+ }
220
+
221
+ return query;
222
+ };
223
+
224
+ const parseSessionSearchLimit = (value: unknown): number => {
225
+ const raw = readOptionalQueryString(value);
226
+ if (!raw) {
227
+ return 50;
228
+ }
229
+
230
+ const parsed = Number.parseInt(raw, 10);
231
+ if (Number.isNaN(parsed)) {
232
+ throw new AppError('limit must be a valid integer.', {
233
+ code: 'INVALID_QUERY_PARAMETER',
234
+ statusCode: 400,
235
+ });
236
+ }
237
+
238
+ return Math.max(1, Math.min(parsed, 100));
239
+ };
240
+
241
+ router.get(
242
+ '/:provider/auth/status',
243
+ asyncHandler(async (req: Request, res: Response) => {
244
+ const provider = parseProvider(req.params.provider);
245
+ const status = await providerAuthService.getProviderAuthStatus(provider);
246
+ res.json(createApiSuccessResponse(status));
247
+ }),
248
+ );
249
+
250
+ // ----------------- MCP routes -----------------
251
+ router.get(
252
+ '/:provider/mcp/servers',
253
+ asyncHandler(async (req: Request, res: Response) => {
254
+ const provider = parseProvider(req.params.provider);
255
+ const workspacePath = readOptionalQueryString(req.query.workspacePath);
256
+ const scope = parseMcpScope(req.query.scope);
257
+
258
+ if (scope) {
259
+ const servers = await providerMcpService.listProviderMcpServersForScope(provider, scope, { workspacePath });
260
+ res.json(createApiSuccessResponse({ provider, scope, servers }));
261
+ return;
262
+ }
263
+
264
+ const groupedServers = await providerMcpService.listProviderMcpServers(provider, { workspacePath });
265
+ res.json(createApiSuccessResponse({ provider, scopes: groupedServers }));
266
+ }),
267
+ );
268
+
269
+ router.post(
270
+ '/:provider/mcp/servers',
271
+ asyncHandler(async (req: Request, res: Response) => {
272
+ const provider = parseProvider(req.params.provider);
273
+ const payload = parseMcpUpsertPayload(req.body);
274
+ const server = await providerMcpService.upsertProviderMcpServer(provider, payload);
275
+ res.status(201).json(createApiSuccessResponse({ server }));
276
+ }),
277
+ );
278
+
279
+ router.delete(
280
+ '/:provider/mcp/servers/:name',
281
+ asyncHandler(async (req: Request, res: Response) => {
282
+ const provider = parseProvider(req.params.provider);
283
+ const scope = parseMcpScope(req.query.scope);
284
+ const workspacePath = readOptionalQueryString(req.query.workspacePath);
285
+ const result = await providerMcpService.removeProviderMcpServer(provider, {
286
+ name: readPathParam(req.params.name, 'name'),
287
+ scope,
288
+ workspacePath,
289
+ });
290
+ res.json(createApiSuccessResponse(result));
291
+ }),
292
+ );
293
+
294
+ router.post(
295
+ '/mcp/servers/global',
296
+ asyncHandler(async (req: Request, res: Response) => {
297
+ const payload = parseMcpUpsertPayload(req.body);
298
+ if (payload.scope === 'local') {
299
+ throw new AppError('Global MCP add supports only "user" or "project" scopes.', {
300
+ code: 'INVALID_GLOBAL_MCP_SCOPE',
301
+ statusCode: 400,
302
+ });
303
+ }
304
+
305
+ const results = await providerMcpService.addMcpServerToAllProviders({
306
+ ...payload,
307
+ scope: payload.scope === 'user' ? 'user' : 'project',
308
+ });
309
+ res.status(201).json(createApiSuccessResponse({ results }));
310
+ }),
311
+ );
312
+
313
+ // ----------------- Session routes -----------------
314
+ router.delete(
315
+ '/sessions/:sessionId',
316
+ asyncHandler(async (req: Request, res: Response) => {
317
+ const sessionId = parseSessionId(req.params.sessionId);
318
+ const deletedFromDisk = parseOptionalBooleanQuery(req.query.deletedFromDisk, 'deletedFromDisk') ?? false;
319
+ const result = await sessionsService.deleteSessionById(sessionId, deletedFromDisk);
320
+ res.json(createApiSuccessResponse(result));
321
+ }),
322
+ );
323
+
324
+ router.put(
325
+ '/sessions/:sessionId',
326
+ asyncHandler(async (req: Request, res: Response) => {
327
+ const sessionId = parseSessionId(req.params.sessionId);
328
+ const summary = parseSessionRenameSummary(req.body);
329
+ const result = sessionsService.renameSessionById(sessionId, summary);
330
+ res.json(createApiSuccessResponse(result));
331
+ }),
332
+ );
333
+
334
+ router.get(
335
+ '/sessions/:sessionId/messages',
336
+ asyncHandler(async (req: Request, res: Response) => {
337
+ const sessionId = parseSessionId(req.params.sessionId);
338
+ const limitRaw = readOptionalQueryString(req.query.limit);
339
+ const offsetRaw = readOptionalQueryString(req.query.offset);
340
+
341
+ let limit: number | null = null;
342
+ if (limitRaw !== undefined) {
343
+ const parsedLimit = Number.parseInt(limitRaw, 10);
344
+ if (Number.isNaN(parsedLimit) || parsedLimit < 0) {
345
+ throw new AppError('limit must be a non-negative integer.', {
346
+ code: 'INVALID_QUERY_PARAMETER',
347
+ statusCode: 400,
348
+ });
349
+ }
350
+ limit = parsedLimit;
351
+ }
352
+
353
+ let offset = 0;
354
+ if (offsetRaw !== undefined) {
355
+ const parsedOffset = Number.parseInt(offsetRaw, 10);
356
+ if (Number.isNaN(parsedOffset) || parsedOffset < 0) {
357
+ throw new AppError('offset must be a non-negative integer.', {
358
+ code: 'INVALID_QUERY_PARAMETER',
359
+ statusCode: 400,
360
+ });
361
+ }
362
+ offset = parsedOffset;
363
+ }
364
+
365
+ const result = await sessionsService.fetchHistory(sessionId, {
366
+ limit,
367
+ offset,
368
+ });
369
+ res.json(result);
370
+ }),
371
+ );
372
+
373
+ router.get('/search/sessions', asyncHandler(async (req: Request, res: Response) => {
374
+ const query = parseSessionSearchQuery(req.query.q);
375
+ const limit = parseSessionSearchLimit(req.query.limit);
376
+
377
+ res.writeHead(200, {
378
+ 'Content-Type': 'text/event-stream',
379
+ 'Cache-Control': 'no-cache',
380
+ Connection: 'keep-alive',
381
+ 'X-Accel-Buffering': 'no',
382
+ });
383
+
384
+ let closed = false;
385
+ const abortController = new AbortController();
386
+ req.on('close', () => {
387
+ closed = true;
388
+ abortController.abort();
389
+ });
390
+
391
+ try {
392
+ await sessionConversationsSearchService.search({
393
+ query,
394
+ limit,
395
+ signal: abortController.signal,
396
+ onProgress: ({ projectResult, totalMatches, scannedProjects, totalProjects }) => {
397
+ if (closed) {
398
+ return;
399
+ }
400
+
401
+ if (projectResult) {
402
+ res.write(`event: result\ndata: ${JSON.stringify({ projectResult, totalMatches, scannedProjects, totalProjects })}\n\n`);
403
+ return;
404
+ }
405
+
406
+ res.write(`event: progress\ndata: ${JSON.stringify({ totalMatches, scannedProjects, totalProjects })}\n\n`);
407
+ },
408
+ });
409
+
410
+ if (!closed) {
411
+ res.write('event: done\ndata: {}\n\n');
412
+ }
413
+ } catch (error) {
414
+ console.error('Error searching conversations:', error);
415
+ if (!closed) {
416
+ res.write(`event: error\ndata: ${JSON.stringify({ error: 'Search failed' })}\n\n`);
417
+ }
418
+ } finally {
419
+ if (!closed) {
420
+ res.end();
421
+ }
422
+ }
423
+ }));
424
+
425
+ export default router;
@@ -0,0 +1,94 @@
1
+ import os from 'node:os';
2
+
3
+ import { providerRegistry } from '@/modules/providers/provider.registry.js';
4
+ import type { LLMProvider, McpScope, ProviderMcpServer, UpsertProviderMcpServerInput } from '@/shared/types.js';
5
+ import { AppError } from '@/shared/utils.js';
6
+
7
+ /** Cursor MCP is not supported on Windows hosts (no Cursor CLI integration). */
8
+ function includeProviderInGlobalMcp(providerId: LLMProvider): boolean {
9
+ if (providerId === 'cursor' && os.platform() === 'win32') {
10
+ return false;
11
+ }
12
+
13
+ return true;
14
+ }
15
+
16
+
17
+ export const providerMcpService = {
18
+ /**
19
+ * Lists MCP servers for one provider grouped by supported scopes.
20
+ */
21
+ async listProviderMcpServers(
22
+ providerName: string,
23
+ options?: { workspacePath?: string },
24
+ ): Promise<Record<McpScope, ProviderMcpServer[]>> {
25
+ const provider = providerRegistry.resolveProvider(providerName);
26
+ return provider.mcp.listServers(options);
27
+ },
28
+
29
+ /**
30
+ * Lists MCP servers for one provider scope.
31
+ */
32
+ async listProviderMcpServersForScope(
33
+ providerName: string,
34
+ scope: McpScope,
35
+ options?: { workspacePath?: string },
36
+ ): Promise<ProviderMcpServer[]> {
37
+ const provider = providerRegistry.resolveProvider(providerName);
38
+ return provider.mcp.listServersForScope(scope, options);
39
+ },
40
+
41
+ /**
42
+ * Adds or updates one provider MCP server.
43
+ */
44
+ async upsertProviderMcpServer(
45
+ providerName: string,
46
+ input: UpsertProviderMcpServerInput,
47
+ ): Promise<ProviderMcpServer> {
48
+ const provider = providerRegistry.resolveProvider(providerName);
49
+ return provider.mcp.upsertServer(input);
50
+ },
51
+
52
+ /**
53
+ * Removes one provider MCP server.
54
+ */
55
+ async removeProviderMcpServer(
56
+ providerName: string,
57
+ input: { name: string; scope?: McpScope; workspacePath?: string },
58
+ ): Promise<{ removed: boolean; provider: LLMProvider; name: string; scope: McpScope }> {
59
+ const provider = providerRegistry.resolveProvider(providerName);
60
+ return provider.mcp.removeServer(input);
61
+ },
62
+
63
+ /**
64
+ * Adds one HTTP/stdio MCP server to every provider.
65
+ */
66
+ async addMcpServerToAllProviders(
67
+ input: Omit<UpsertProviderMcpServerInput, 'scope'> & { scope?: Exclude<McpScope, 'local'> },
68
+ ): Promise<Array<{ provider: LLMProvider; created: boolean; error?: string }>> {
69
+ if (input.transport !== 'stdio' && input.transport !== 'http') {
70
+ throw new AppError('Global MCP add supports only "stdio" and "http".', {
71
+ code: 'INVALID_GLOBAL_MCP_TRANSPORT',
72
+ statusCode: 400,
73
+ });
74
+ }
75
+
76
+ const scope = input.scope ?? 'project';
77
+ const results: Array<{ provider: LLMProvider; created: boolean; error?: string }> = [];
78
+ const providers = providerRegistry.listProviders().filter((p) => includeProviderInGlobalMcp(p.id));
79
+ for (const provider of providers) {
80
+ try {
81
+ await provider.mcp.upsertServer({ ...input, scope });
82
+ results.push({ provider: provider.id, created: true });
83
+ } catch (error) {
84
+ results.push({
85
+ provider: provider.id,
86
+ created: false,
87
+ error: error instanceof Error ? error.message : 'Unknown error',
88
+ });
89
+ }
90
+ }
91
+
92
+ return results;
93
+ },
94
+ };
@@ -0,0 +1,26 @@
1
+ import { providerRegistry } from '@/modules/providers/provider.registry.js';
2
+ import type { LLMProvider, ProviderAuthStatus } from '@/shared/types.js';
3
+
4
+ export const providerAuthService = {
5
+ /**
6
+ * Resolves a provider and returns its installation/authentication status.
7
+ */
8
+ async getProviderAuthStatus(providerName: string): Promise<ProviderAuthStatus> {
9
+ const provider = providerRegistry.resolveProvider(providerName);
10
+ return provider.auth.getStatus();
11
+ },
12
+
13
+ /**
14
+ * Returns whether a provider runtime appears installed.
15
+ * Falls back to true if status lookup itself fails so callers preserve the
16
+ * original runtime error instead of replacing it with a status-check failure.
17
+ */
18
+ async isProviderInstalled(providerName: LLMProvider): Promise<boolean> {
19
+ try {
20
+ const status = await this.getProviderAuthStatus(providerName);
21
+ return status.installed;
22
+ } catch {
23
+ return true;
24
+ }
25
+ },
26
+ };