@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,541 @@
1
+ import fsSync from 'node:fs';
2
+ import fs from 'node:fs/promises';
3
+ import readline from 'node:readline';
4
+
5
+ import { sessionsDb } from '@/modules/database/index.js';
6
+ import type { IProviderSessions } from '@/shared/interfaces.js';
7
+ import type { AnyRecord, FetchHistoryOptions, FetchHistoryResult, NormalizedMessage } from '@/shared/types.js';
8
+ import { createNormalizedMessage, generateMessageId, readObjectRecord } from '@/shared/utils.js';
9
+
10
+ const PROVIDER = 'gemini';
11
+
12
+ type GeminiHistoryResult = {
13
+ messages: AnyRecord[];
14
+ tokenUsage?: unknown;
15
+ };
16
+
17
+ function mapGeminiRole(value: unknown): 'user' | 'assistant' | null {
18
+ if (value === 'user') {
19
+ return 'user';
20
+ }
21
+
22
+ if (value === 'gemini' || value === 'assistant') {
23
+ return 'assistant';
24
+ }
25
+
26
+ return null;
27
+ }
28
+
29
+ function extractGeminiTextContent(content: unknown): string {
30
+ if (typeof content === 'string') {
31
+ return content;
32
+ }
33
+
34
+ if (!Array.isArray(content)) {
35
+ return '';
36
+ }
37
+
38
+ return content
39
+ .map((part) => {
40
+ if (typeof part === 'string') {
41
+ return part;
42
+ }
43
+ if (!part || typeof part !== 'object') {
44
+ return '';
45
+ }
46
+
47
+ const record = part as AnyRecord;
48
+ if (typeof record.text === 'string') {
49
+ return record.text;
50
+ }
51
+
52
+ return '';
53
+ })
54
+ .filter(Boolean)
55
+ .join('\n');
56
+ }
57
+
58
+ function extractGeminiThoughts(thoughts: unknown): string {
59
+ if (!Array.isArray(thoughts)) {
60
+ return '';
61
+ }
62
+
63
+ return thoughts
64
+ .map((item) => {
65
+ if (!item || typeof item !== 'object') {
66
+ return '';
67
+ }
68
+
69
+ const record = item as AnyRecord;
70
+ const subject = typeof record.subject === 'string' ? record.subject.trim() : '';
71
+ const description = typeof record.description === 'string' ? record.description.trim() : '';
72
+
73
+ if (subject && description) {
74
+ return `${subject}: ${description}`;
75
+ }
76
+
77
+ return description || subject;
78
+ })
79
+ .filter(Boolean)
80
+ .join('\n');
81
+ }
82
+
83
+ function buildGeminiTokenUsage(tokens: unknown): AnyRecord | undefined {
84
+ if (!tokens || typeof tokens !== 'object') {
85
+ return undefined;
86
+ }
87
+
88
+ const record = tokens as AnyRecord;
89
+ const input = Number(record.input || 0);
90
+ const output = Number(record.output || 0);
91
+ const cached = Number(record.cached || 0);
92
+ const thoughts = Number(record.thoughts || 0);
93
+ const tool = Number(record.tool || 0);
94
+
95
+ const totalFromFields = input + output + cached + thoughts + tool;
96
+ const total = Number(record.total || totalFromFields || 0);
97
+
98
+ return {
99
+ used: total,
100
+ total: total,
101
+ breakdown: {
102
+ input,
103
+ output,
104
+ cached,
105
+ thoughts,
106
+ tool,
107
+ },
108
+ };
109
+ }
110
+
111
+ async function getGeminiLegacySessionMessages(sessionFilePath: string): Promise<GeminiHistoryResult> {
112
+ try {
113
+ const data = await fs.readFile(sessionFilePath, 'utf8');
114
+ const session = JSON.parse(data) as AnyRecord;
115
+ const sourceMessages = Array.isArray(session.messages) ? session.messages : [];
116
+
117
+ const messages: AnyRecord[] = [];
118
+ for (const msg of sourceMessages) {
119
+ const role = mapGeminiRole(msg.type ?? msg.role);
120
+ if (!role) {
121
+ continue;
122
+ }
123
+
124
+ messages.push({
125
+ type: 'message',
126
+ uuid: typeof msg.id === 'string' ? msg.id : undefined,
127
+ message: { role, content: msg.content },
128
+ timestamp: msg.timestamp || null,
129
+ });
130
+ }
131
+
132
+ return { messages };
133
+ } catch {
134
+ return { messages: [] };
135
+ }
136
+ }
137
+
138
+ async function getGeminiJsonlSessionMessages(sessionFilePath: string): Promise<GeminiHistoryResult> {
139
+ const messages: AnyRecord[] = [];
140
+ let tokenUsage: AnyRecord | undefined;
141
+
142
+ try {
143
+ const fileStream = fsSync.createReadStream(sessionFilePath);
144
+ const lineReader = readline.createInterface({
145
+ input: fileStream,
146
+ crlfDelay: Infinity,
147
+ });
148
+
149
+ for await (const line of lineReader) {
150
+ const trimmed = line.trim();
151
+ if (!trimmed) {
152
+ continue;
153
+ }
154
+
155
+ let entry: AnyRecord;
156
+ try {
157
+ entry = JSON.parse(trimmed) as AnyRecord;
158
+ } catch {
159
+ continue;
160
+ }
161
+
162
+ // Metadata/update lines (e.g. {$set:{lastUpdated:...}}) do not represent chat messages.
163
+ if (entry.$set) {
164
+ continue;
165
+ }
166
+
167
+ const role = mapGeminiRole(entry.type);
168
+ if (role) {
169
+ const textContent = extractGeminiTextContent(entry.content);
170
+ if (textContent.trim()) {
171
+ messages.push({
172
+ type: 'message',
173
+ uuid: typeof entry.id === 'string' ? entry.id : undefined,
174
+ message: { role, content: textContent },
175
+ timestamp: entry.timestamp || null,
176
+ });
177
+ }
178
+
179
+ const thinkingContent = extractGeminiThoughts(entry.thoughts);
180
+ if (thinkingContent.trim()) {
181
+ messages.push({
182
+ type: 'thinking',
183
+ uuid: typeof entry.id === 'string' ? `${entry.id}_thinking` : undefined,
184
+ message: { role: 'assistant', content: thinkingContent },
185
+ timestamp: entry.timestamp || null,
186
+ isReasoning: true,
187
+ });
188
+ }
189
+
190
+ if (role === 'assistant') {
191
+ const usage = buildGeminiTokenUsage(entry.tokens);
192
+ if (usage) {
193
+ tokenUsage = usage;
194
+ }
195
+ }
196
+
197
+ continue;
198
+ }
199
+
200
+ if (entry.type === 'tool_use') {
201
+ messages.push({
202
+ type: 'tool_use',
203
+ uuid: typeof entry.id === 'string' ? entry.id : undefined,
204
+ timestamp: entry.timestamp || null,
205
+ toolName: entry.tool_name || entry.name || 'Tool',
206
+ toolInput: entry.parameters ?? entry.input ?? entry.arguments ?? '',
207
+ toolCallId: entry.tool_id || entry.toolCallId || entry.id,
208
+ });
209
+ continue;
210
+ }
211
+
212
+ if (entry.type === 'tool_result') {
213
+ messages.push({
214
+ type: 'tool_result',
215
+ uuid: typeof entry.id === 'string' ? entry.id : undefined,
216
+ timestamp: entry.timestamp || null,
217
+ toolCallId: entry.tool_id || entry.toolCallId || entry.id || '',
218
+ output: entry.output ?? entry.result ?? '',
219
+ isError: Boolean(entry.error) || entry.status === 'error',
220
+ });
221
+ }
222
+ }
223
+ } catch {
224
+ return { messages: [] };
225
+ }
226
+
227
+ messages.sort(
228
+ (a, b) => new Date(a.timestamp || 0).getTime() - new Date(b.timestamp || 0).getTime(),
229
+ );
230
+
231
+ return { messages, tokenUsage };
232
+ }
233
+
234
+ async function getGeminiCliSessionMessages(sessionId: string): Promise<GeminiHistoryResult> {
235
+ const sessionFilePath = sessionsDb.getSessionById(sessionId)?.jsonl_path;
236
+ if (!sessionFilePath) {
237
+ return { messages: [] };
238
+ }
239
+
240
+ if (sessionFilePath.endsWith('.jsonl')) {
241
+ return getGeminiJsonlSessionMessages(sessionFilePath);
242
+ }
243
+
244
+ return getGeminiLegacySessionMessages(sessionFilePath);
245
+ }
246
+
247
+ export class GeminiSessionsProvider implements IProviderSessions {
248
+ /**
249
+ * Normalizes live Gemini stream-json events into the shared message shape.
250
+ *
251
+ * Gemini history uses a different session file shape, so fetchHistory handles
252
+ * that separately after loading raw persisted messages.
253
+ */
254
+ normalizeMessage(rawMessage: unknown, sessionId: string | null): NormalizedMessage[] {
255
+ const raw = readObjectRecord(rawMessage);
256
+ if (!raw) {
257
+ return [];
258
+ }
259
+
260
+ const ts = raw.timestamp || new Date().toISOString();
261
+ const baseId = raw.uuid || generateMessageId('gemini');
262
+
263
+ if (raw.type === 'message' && raw.role === 'assistant') {
264
+ const content = raw.content || '';
265
+ const messages: NormalizedMessage[] = [];
266
+ if (content) {
267
+ messages.push(createNormalizedMessage({
268
+ id: baseId,
269
+ sessionId,
270
+ timestamp: ts,
271
+ provider: PROVIDER,
272
+ kind: 'stream_delta',
273
+ content,
274
+ }));
275
+ }
276
+ if (raw.delta !== true) {
277
+ messages.push(createNormalizedMessage({
278
+ sessionId,
279
+ timestamp: ts,
280
+ provider: PROVIDER,
281
+ kind: 'stream_end',
282
+ }));
283
+ }
284
+ return messages;
285
+ }
286
+
287
+ if (raw.type === 'tool_use') {
288
+ return [createNormalizedMessage({
289
+ id: baseId,
290
+ sessionId,
291
+ timestamp: ts,
292
+ provider: PROVIDER,
293
+ kind: 'tool_use',
294
+ toolName: raw.tool_name,
295
+ toolInput: raw.parameters || {},
296
+ toolId: raw.tool_id || baseId,
297
+ })];
298
+ }
299
+
300
+ if (raw.type === 'tool_result') {
301
+ return [createNormalizedMessage({
302
+ id: baseId,
303
+ sessionId,
304
+ timestamp: ts,
305
+ provider: PROVIDER,
306
+ kind: 'tool_result',
307
+ toolId: raw.tool_id || '',
308
+ content: raw.output === undefined ? '' : String(raw.output),
309
+ isError: raw.status === 'error',
310
+ })];
311
+ }
312
+
313
+ if (raw.type === 'result') {
314
+ const messages = [createNormalizedMessage({
315
+ sessionId,
316
+ timestamp: ts,
317
+ provider: PROVIDER,
318
+ kind: 'stream_end',
319
+ })];
320
+ if (raw.stats?.total_tokens) {
321
+ messages.push(createNormalizedMessage({
322
+ sessionId,
323
+ timestamp: ts,
324
+ provider: PROVIDER,
325
+ kind: 'status',
326
+ text: 'Complete',
327
+ tokens: raw.stats.total_tokens,
328
+ canInterrupt: false,
329
+ }));
330
+ }
331
+ return messages;
332
+ }
333
+
334
+ if (raw.type === 'error') {
335
+ return [createNormalizedMessage({
336
+ id: baseId,
337
+ sessionId,
338
+ timestamp: ts,
339
+ provider: PROVIDER,
340
+ kind: 'error',
341
+ content: raw.error || raw.message || 'Unknown Gemini streaming error',
342
+ })];
343
+ }
344
+
345
+ return [];
346
+ }
347
+
348
+ /**
349
+ * Loads Gemini history from Gemini CLI session files on disk.
350
+ */
351
+ async fetchHistory(
352
+ sessionId: string,
353
+ options: FetchHistoryOptions = {},
354
+ ): Promise<FetchHistoryResult> {
355
+ const { limit = null, offset = 0 } = options;
356
+
357
+ let result: GeminiHistoryResult;
358
+ try {
359
+ result = await getGeminiCliSessionMessages(sessionId);
360
+ } catch (error) {
361
+ const message = error instanceof Error ? error.message : String(error);
362
+ console.warn(`[GeminiProvider] Failed to load session ${sessionId}:`, message);
363
+ return { messages: [], total: 0, hasMore: false, offset: 0, limit: null };
364
+ }
365
+
366
+ const rawMessages = result.messages;
367
+ const normalized: NormalizedMessage[] = [];
368
+
369
+ for (let i = 0; i < rawMessages.length; i++) {
370
+ const raw = rawMessages[i];
371
+ const ts = raw.timestamp || new Date().toISOString();
372
+ const baseId = raw.uuid || generateMessageId('gemini');
373
+
374
+ if (raw.type === 'thinking' || raw.isReasoning) {
375
+ const thinkingContent = typeof raw.message?.content === 'string'
376
+ ? raw.message.content
377
+ : typeof raw.content === 'string'
378
+ ? raw.content
379
+ : '';
380
+
381
+ if (thinkingContent.trim()) {
382
+ normalized.push(createNormalizedMessage({
383
+ id: baseId,
384
+ sessionId,
385
+ timestamp: ts,
386
+ provider: PROVIDER,
387
+ kind: 'thinking',
388
+ content: thinkingContent,
389
+ }));
390
+ }
391
+ continue;
392
+ }
393
+
394
+ if (raw.type === 'tool_use' || raw.toolName) {
395
+ normalized.push(createNormalizedMessage({
396
+ id: baseId,
397
+ sessionId,
398
+ timestamp: ts,
399
+ provider: PROVIDER,
400
+ kind: 'tool_use',
401
+ toolName: raw.toolName || 'Tool',
402
+ toolInput: raw.toolInput,
403
+ toolId: raw.toolCallId || baseId,
404
+ }));
405
+ continue;
406
+ }
407
+
408
+ if (raw.type === 'tool_result') {
409
+ normalized.push(createNormalizedMessage({
410
+ id: baseId,
411
+ sessionId,
412
+ timestamp: ts,
413
+ provider: PROVIDER,
414
+ kind: 'tool_result',
415
+ toolId: raw.toolCallId || '',
416
+ content: raw.output === undefined ? '' : String(raw.output),
417
+ isError: Boolean(raw.isError),
418
+ }));
419
+ continue;
420
+ }
421
+
422
+ const role = raw.message?.role || raw.role;
423
+ const content = raw.message?.content || raw.content;
424
+ if (!role || !content) {
425
+ continue;
426
+ }
427
+
428
+ const normalizedRole = role === 'user' ? 'user' : 'assistant';
429
+
430
+ if (Array.isArray(content)) {
431
+ for (let partIdx = 0; partIdx < content.length; partIdx++) {
432
+ const part = content[partIdx] as AnyRecord | string;
433
+
434
+ if (typeof part === 'string' && part.trim()) {
435
+ normalized.push(createNormalizedMessage({
436
+ id: `${baseId}_${partIdx}`,
437
+ sessionId,
438
+ timestamp: ts,
439
+ provider: PROVIDER,
440
+ kind: 'text',
441
+ role: normalizedRole,
442
+ content: part,
443
+ }));
444
+ continue;
445
+ }
446
+
447
+ if (!part || typeof part !== 'object') {
448
+ continue;
449
+ }
450
+
451
+ if ((part.type === 'text' || !part.type) && typeof part.text === 'string' && part.text.trim()) {
452
+ normalized.push(createNormalizedMessage({
453
+ id: `${baseId}_${partIdx}`,
454
+ sessionId,
455
+ timestamp: ts,
456
+ provider: PROVIDER,
457
+ kind: 'text',
458
+ role: normalizedRole,
459
+ content: part.text,
460
+ }));
461
+ } else if (part.type === 'tool_use') {
462
+ normalized.push(createNormalizedMessage({
463
+ id: `${baseId}_${partIdx}`,
464
+ sessionId,
465
+ timestamp: ts,
466
+ provider: PROVIDER,
467
+ kind: 'tool_use',
468
+ toolName: part.name,
469
+ toolInput: part.input,
470
+ toolId: part.id || generateMessageId('gemini_tool'),
471
+ }));
472
+ } else if (part.type === 'tool_result') {
473
+ normalized.push(createNormalizedMessage({
474
+ id: `${baseId}_${partIdx}`,
475
+ sessionId,
476
+ timestamp: ts,
477
+ provider: PROVIDER,
478
+ kind: 'tool_result',
479
+ toolId: part.tool_use_id || '',
480
+ content: part.content === undefined ? '' : String(part.content),
481
+ isError: Boolean(part.is_error),
482
+ }));
483
+ }
484
+ }
485
+ } else if (typeof content === 'string' && content.trim()) {
486
+ normalized.push(createNormalizedMessage({
487
+ id: baseId,
488
+ sessionId,
489
+ timestamp: ts,
490
+ provider: PROVIDER,
491
+ kind: 'text',
492
+ role: normalizedRole,
493
+ content,
494
+ }));
495
+ } else {
496
+ const textContent = extractGeminiTextContent(content);
497
+ if (textContent.trim()) {
498
+ normalized.push(createNormalizedMessage({
499
+ id: baseId,
500
+ sessionId,
501
+ timestamp: ts,
502
+ provider: PROVIDER,
503
+ kind: 'text',
504
+ role: normalizedRole,
505
+ content: textContent,
506
+ }));
507
+ }
508
+ }
509
+ }
510
+
511
+ const toolResultMap = new Map<string, NormalizedMessage>();
512
+ for (const msg of normalized) {
513
+ if (msg.kind === 'tool_result' && msg.toolId) {
514
+ toolResultMap.set(msg.toolId, msg);
515
+ }
516
+ }
517
+ for (const msg of normalized) {
518
+ if (msg.kind === 'tool_use' && msg.toolId && toolResultMap.has(msg.toolId)) {
519
+ const toolResult = toolResultMap.get(msg.toolId);
520
+ if (toolResult) {
521
+ msg.toolResult = { content: toolResult.content, isError: toolResult.isError };
522
+ }
523
+ }
524
+ }
525
+
526
+ const start = Math.max(0, offset);
527
+ const pageLimit = limit === null ? null : Math.max(0, limit);
528
+ const messages = pageLimit === null
529
+ ? normalized.slice(start)
530
+ : normalized.slice(start, start + pageLimit);
531
+
532
+ return {
533
+ messages,
534
+ total: normalized.length,
535
+ hasMore: pageLimit === null ? false : start + pageLimit < normalized.length,
536
+ offset: start,
537
+ limit: pageLimit,
538
+ tokenUsage: result.tokenUsage,
539
+ };
540
+ }
541
+ }
@@ -0,0 +1,17 @@
1
+ import { AbstractProvider } from '@/modules/providers/shared/base/abstract.provider.js';
2
+ import { GeminiProviderAuth } from '@/modules/providers/list/gemini/gemini-auth.provider.js';
3
+ import { GeminiMcpProvider } from '@/modules/providers/list/gemini/gemini-mcp.provider.js';
4
+ import { GeminiSessionSynchronizer } from '@/modules/providers/list/gemini/gemini-session-synchronizer.provider.js';
5
+ import { GeminiSessionsProvider } from '@/modules/providers/list/gemini/gemini-sessions.provider.js';
6
+ import type { IProviderAuth, IProviderSessionSynchronizer, IProviderSessions } from '@/shared/interfaces.js';
7
+
8
+ export class GeminiProvider extends AbstractProvider {
9
+ readonly mcp = new GeminiMcpProvider();
10
+ readonly auth: IProviderAuth = new GeminiProviderAuth();
11
+ readonly sessions: IProviderSessions = new GeminiSessionsProvider();
12
+ readonly sessionSynchronizer: IProviderSessionSynchronizer = new GeminiSessionSynchronizer();
13
+
14
+ constructor() {
15
+ super('gemini');
16
+ }
17
+ }
@@ -0,0 +1,36 @@
1
+ import { ClaudeProvider } from '@/modules/providers/list/claude/claude.provider.js';
2
+ import { CodexProvider } from '@/modules/providers/list/codex/codex.provider.js';
3
+ import { CursorProvider } from '@/modules/providers/list/cursor/cursor.provider.js';
4
+ import { GeminiProvider } from '@/modules/providers/list/gemini/gemini.provider.js';
5
+ import type { IProvider } from '@/shared/interfaces.js';
6
+ import type { LLMProvider } from '@/shared/types.js';
7
+ import { AppError } from '@/shared/utils.js';
8
+
9
+ const providers: Record<LLMProvider, IProvider> = {
10
+ claude: new ClaudeProvider(),
11
+ codex: new CodexProvider(),
12
+ cursor: new CursorProvider(),
13
+ gemini: new GeminiProvider(),
14
+ };
15
+
16
+ /**
17
+ * Central registry for resolving concrete provider implementations by id.
18
+ */
19
+ export const providerRegistry = {
20
+ listProviders(): IProvider[] {
21
+ return Object.values(providers);
22
+ },
23
+
24
+ resolveProvider(provider: string): IProvider {
25
+ const key = provider as LLMProvider;
26
+ const resolvedProvider = providers[key];
27
+ if (!resolvedProvider) {
28
+ throw new AppError(`Unsupported provider "${provider}".`, {
29
+ code: 'UNSUPPORTED_PROVIDER',
30
+ statusCode: 400,
31
+ });
32
+ }
33
+
34
+ return resolvedProvider;
35
+ },
36
+ };