@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,564 @@
1
+ import fsSync from 'node:fs';
2
+ import readline from 'node:readline';
3
+
4
+ import { sessionsDb } from '@/modules/database/index.js';
5
+ import type { IProviderSessions } from '@/shared/interfaces.js';
6
+ import type { AnyRecord, FetchHistoryOptions, FetchHistoryResult, NormalizedMessage } from '@/shared/types.js';
7
+ import { createNormalizedMessage, generateMessageId, readObjectRecord } from '@/shared/utils.js';
8
+
9
+ const PROVIDER = 'codex';
10
+
11
+ type CodexHistoryResult =
12
+ | AnyRecord[]
13
+ | {
14
+ messages?: AnyRecord[];
15
+ total?: number;
16
+ hasMore?: boolean;
17
+ offset?: number;
18
+ limit?: number | null;
19
+ tokenUsage?: unknown;
20
+ };
21
+
22
+ function isVisibleCodexUserMessage(payload: AnyRecord | null | undefined): boolean {
23
+ if (!payload || payload.type !== 'user_message') {
24
+ return false;
25
+ }
26
+
27
+ if (payload.kind && payload.kind !== 'plain') {
28
+ return false;
29
+ }
30
+
31
+ return typeof payload.message === 'string' && payload.message.trim().length > 0;
32
+ }
33
+
34
+ function extractCodexTextContent(content: unknown): string {
35
+ if (!Array.isArray(content)) {
36
+ return typeof content === 'string' ? content : '';
37
+ }
38
+
39
+ return content
40
+ .map((item) => {
41
+ if (!item || typeof item !== 'object') {
42
+ return '';
43
+ }
44
+
45
+ const record = item as AnyRecord;
46
+ if (
47
+ (record.type === 'input_text' || record.type === 'output_text' || record.type === 'text')
48
+ && typeof record.text === 'string'
49
+ ) {
50
+ return record.text;
51
+ }
52
+
53
+ return '';
54
+ })
55
+ .filter(Boolean)
56
+ .join('\n');
57
+ }
58
+
59
+ async function getCodexSessionMessages(
60
+ sessionId: string,
61
+ limit: number | null = null,
62
+ offset = 0,
63
+ ): Promise<CodexHistoryResult> {
64
+ try {
65
+ const sessionFilePath = sessionsDb.getSessionById(sessionId)?.jsonl_path;
66
+
67
+ if (!sessionFilePath) {
68
+ console.warn(`Codex session file not found for session ${sessionId}`);
69
+ return { messages: [], total: 0, hasMore: false };
70
+ }
71
+
72
+ const messages: AnyRecord[] = [];
73
+ let tokenUsage: AnyRecord | null = null;
74
+ const fileStream = fsSync.createReadStream(sessionFilePath);
75
+ const rl = readline.createInterface({
76
+ input: fileStream,
77
+ crlfDelay: Infinity,
78
+ });
79
+
80
+ for await (const line of rl) {
81
+ if (!line.trim()) {
82
+ continue;
83
+ }
84
+
85
+ try {
86
+ const entry = JSON.parse(line) as AnyRecord;
87
+
88
+ if (entry.type === 'event_msg' && entry.payload?.type === 'token_count' && entry.payload?.info) {
89
+ const info = entry.payload.info as AnyRecord;
90
+ if (info.total_token_usage) {
91
+ const usage = info.total_token_usage as AnyRecord;
92
+ tokenUsage = {
93
+ used: usage.total_tokens || 0,
94
+ total: info.model_context_window || 200000,
95
+ };
96
+ }
97
+ }
98
+
99
+ if (entry.type === 'event_msg' && isVisibleCodexUserMessage(entry.payload as AnyRecord)) {
100
+ messages.push({
101
+ type: 'user',
102
+ timestamp: entry.timestamp,
103
+ message: {
104
+ role: 'user',
105
+ content: entry.payload.message,
106
+ },
107
+ });
108
+ }
109
+
110
+ if (
111
+ entry.type === 'response_item' &&
112
+ entry.payload?.type === 'message' &&
113
+ entry.payload.role === 'assistant'
114
+ ) {
115
+ const textContent = extractCodexTextContent(entry.payload.content);
116
+ if (textContent.trim()) {
117
+ messages.push({
118
+ type: 'assistant',
119
+ timestamp: entry.timestamp,
120
+ message: {
121
+ role: 'assistant',
122
+ content: textContent,
123
+ },
124
+ });
125
+ }
126
+ }
127
+
128
+ if (entry.type === 'response_item' && entry.payload?.type === 'reasoning') {
129
+ const summaryText = Array.isArray(entry.payload.summary)
130
+ ? entry.payload.summary
131
+ .map((item: AnyRecord) => item?.text)
132
+ .filter(Boolean)
133
+ .join('\n')
134
+ : '';
135
+
136
+ if (summaryText.trim()) {
137
+ messages.push({
138
+ type: 'thinking',
139
+ timestamp: entry.timestamp,
140
+ message: {
141
+ role: 'assistant',
142
+ content: summaryText,
143
+ },
144
+ });
145
+ }
146
+ }
147
+
148
+ if (entry.type === 'response_item' && entry.payload?.type === 'function_call') {
149
+ let toolName = entry.payload.name;
150
+ let toolInput = entry.payload.arguments;
151
+
152
+ if (toolName === 'shell_command') {
153
+ toolName = 'Bash';
154
+ try {
155
+ const args = JSON.parse(entry.payload.arguments) as AnyRecord;
156
+ toolInput = JSON.stringify({ command: args.command });
157
+ } catch {
158
+ // Keep original arguments when parsing fails.
159
+ }
160
+ }
161
+
162
+ messages.push({
163
+ type: 'tool_use',
164
+ timestamp: entry.timestamp,
165
+ toolName,
166
+ toolInput,
167
+ toolCallId: entry.payload.call_id,
168
+ });
169
+ }
170
+
171
+ if (entry.type === 'response_item' && entry.payload?.type === 'function_call_output') {
172
+ messages.push({
173
+ type: 'tool_result',
174
+ timestamp: entry.timestamp,
175
+ toolCallId: entry.payload.call_id,
176
+ output: entry.payload.output,
177
+ });
178
+ }
179
+
180
+ if (entry.type === 'response_item' && entry.payload?.type === 'custom_tool_call') {
181
+ const toolName = entry.payload.name || 'custom_tool';
182
+ const input = entry.payload.input || '';
183
+
184
+ if (toolName === 'apply_patch') {
185
+ const fileMatch = String(input).match(/\*\*\* Update File: (.+)/);
186
+ const filePath = fileMatch ? fileMatch[1].trim() : 'unknown';
187
+ const lines = String(input).split('\n');
188
+ const oldLines: string[] = [];
189
+ const newLines: string[] = [];
190
+
191
+ for (const lineContent of lines) {
192
+ if (lineContent.startsWith('-') && !lineContent.startsWith('---')) {
193
+ oldLines.push(lineContent.slice(1));
194
+ } else if (lineContent.startsWith('+') && !lineContent.startsWith('+++')) {
195
+ newLines.push(lineContent.slice(1));
196
+ }
197
+ }
198
+
199
+ messages.push({
200
+ type: 'tool_use',
201
+ timestamp: entry.timestamp,
202
+ toolName: 'Edit',
203
+ toolInput: JSON.stringify({
204
+ file_path: filePath,
205
+ old_string: oldLines.join('\n'),
206
+ new_string: newLines.join('\n'),
207
+ }),
208
+ toolCallId: entry.payload.call_id,
209
+ });
210
+ } else {
211
+ messages.push({
212
+ type: 'tool_use',
213
+ timestamp: entry.timestamp,
214
+ toolName,
215
+ toolInput: input,
216
+ toolCallId: entry.payload.call_id,
217
+ });
218
+ }
219
+ }
220
+
221
+ if (entry.type === 'response_item' && entry.payload?.type === 'custom_tool_call_output') {
222
+ messages.push({
223
+ type: 'tool_result',
224
+ timestamp: entry.timestamp,
225
+ toolCallId: entry.payload.call_id,
226
+ output: entry.payload.output || '',
227
+ });
228
+ }
229
+ } catch {
230
+ // Skip malformed lines.
231
+ }
232
+ }
233
+
234
+ messages.sort(
235
+ (a, b) => new Date(a.timestamp || 0).getTime() - new Date(b.timestamp || 0).getTime(),
236
+ );
237
+ const total = messages.length;
238
+
239
+ if (limit !== null) {
240
+ const startIndex = Math.max(0, total - offset - limit);
241
+ const endIndex = total - offset;
242
+ const paginatedMessages = messages.slice(startIndex, endIndex);
243
+ const hasMore = startIndex > 0;
244
+
245
+ return {
246
+ messages: paginatedMessages,
247
+ total,
248
+ hasMore,
249
+ offset,
250
+ limit,
251
+ tokenUsage,
252
+ };
253
+ }
254
+
255
+ return { messages, tokenUsage };
256
+ } catch (error) {
257
+ console.error(`Error reading Codex session messages for ${sessionId}:`, error);
258
+ return { messages: [], total: 0, hasMore: false };
259
+ }
260
+ }
261
+
262
+ export class CodexSessionsProvider implements IProviderSessions {
263
+ /**
264
+ * Normalizes a persisted Codex JSONL entry.
265
+ *
266
+ * Live Codex SDK events are transformed before they reach normalizeMessage(),
267
+ * while history entries already use a compact message/tool shape from projects.js.
268
+ */
269
+ private normalizeHistoryEntry(raw: AnyRecord, sessionId: string | null): NormalizedMessage[] {
270
+ const ts = raw.timestamp || new Date().toISOString();
271
+ const baseId = raw.uuid || generateMessageId('codex');
272
+
273
+ if (raw.type === 'thinking' || raw.isReasoning) {
274
+ const thinkingContent = typeof raw.message?.content === 'string'
275
+ ? raw.message.content
276
+ : '';
277
+ if (!thinkingContent.trim()) {
278
+ return [];
279
+ }
280
+ return [createNormalizedMessage({
281
+ id: baseId,
282
+ sessionId,
283
+ timestamp: ts,
284
+ provider: PROVIDER,
285
+ kind: 'thinking',
286
+ content: thinkingContent,
287
+ })];
288
+ }
289
+
290
+ if (raw.message?.role === 'user') {
291
+ const content = typeof raw.message.content === 'string'
292
+ ? raw.message.content
293
+ : Array.isArray(raw.message.content)
294
+ ? raw.message.content
295
+ .map((part: string | AnyRecord) => typeof part === 'string' ? part : part?.text || '')
296
+ .filter(Boolean)
297
+ .join('\n')
298
+ : String(raw.message.content || '');
299
+ if (!content.trim()) {
300
+ return [];
301
+ }
302
+ return [createNormalizedMessage({
303
+ id: baseId,
304
+ sessionId,
305
+ timestamp: ts,
306
+ provider: PROVIDER,
307
+ kind: 'text',
308
+ role: 'user',
309
+ content,
310
+ })];
311
+ }
312
+
313
+ if (raw.message?.role === 'assistant') {
314
+ const content = typeof raw.message.content === 'string'
315
+ ? raw.message.content
316
+ : Array.isArray(raw.message.content)
317
+ ? raw.message.content
318
+ .map((part: string | AnyRecord) => typeof part === 'string' ? part : part?.text || '')
319
+ .filter(Boolean)
320
+ .join('\n')
321
+ : '';
322
+ if (!content.trim()) {
323
+ return [];
324
+ }
325
+ return [createNormalizedMessage({
326
+ id: baseId,
327
+ sessionId,
328
+ timestamp: ts,
329
+ provider: PROVIDER,
330
+ kind: 'text',
331
+ role: 'assistant',
332
+ content,
333
+ })];
334
+ }
335
+
336
+ if (raw.type === 'tool_use' || raw.toolName) {
337
+ return [createNormalizedMessage({
338
+ id: baseId,
339
+ sessionId,
340
+ timestamp: ts,
341
+ provider: PROVIDER,
342
+ kind: 'tool_use',
343
+ toolName: raw.toolName || 'Unknown',
344
+ toolInput: raw.toolInput,
345
+ toolId: raw.toolCallId || baseId,
346
+ })];
347
+ }
348
+
349
+ if (raw.type === 'tool_result') {
350
+ return [createNormalizedMessage({
351
+ id: baseId,
352
+ sessionId,
353
+ timestamp: ts,
354
+ provider: PROVIDER,
355
+ kind: 'tool_result',
356
+ toolId: raw.toolCallId || '',
357
+ content: raw.output || '',
358
+ isError: Boolean(raw.isError),
359
+ })];
360
+ }
361
+
362
+ return [];
363
+ }
364
+
365
+ /**
366
+ * Normalizes either a Codex history entry or a transformed live SDK event.
367
+ */
368
+ normalizeMessage(rawMessage: unknown, sessionId: string | null): NormalizedMessage[] {
369
+ const raw = readObjectRecord(rawMessage);
370
+ if (!raw) {
371
+ return [];
372
+ }
373
+
374
+ if (raw.message?.role) {
375
+ return this.normalizeHistoryEntry(raw, sessionId);
376
+ }
377
+
378
+ const ts = raw.timestamp || new Date().toISOString();
379
+ const baseId = raw.uuid || generateMessageId('codex');
380
+
381
+ if (raw.type === 'item') {
382
+ switch (raw.itemType) {
383
+ case 'agent_message':
384
+ return [createNormalizedMessage({
385
+ id: baseId,
386
+ sessionId,
387
+ timestamp: ts,
388
+ provider: PROVIDER,
389
+ kind: 'text',
390
+ role: 'assistant',
391
+ content: raw.message?.content || '',
392
+ })];
393
+ case 'reasoning':
394
+ return [createNormalizedMessage({
395
+ id: baseId,
396
+ sessionId,
397
+ timestamp: ts,
398
+ provider: PROVIDER,
399
+ kind: 'thinking',
400
+ content: raw.message?.content || '',
401
+ })];
402
+ case 'command_execution':
403
+ return [createNormalizedMessage({
404
+ id: baseId,
405
+ sessionId,
406
+ timestamp: ts,
407
+ provider: PROVIDER,
408
+ kind: 'tool_use',
409
+ toolName: 'Bash',
410
+ toolInput: { command: raw.command },
411
+ toolId: baseId,
412
+ output: raw.output,
413
+ exitCode: raw.exitCode,
414
+ status: raw.status,
415
+ })];
416
+ case 'file_change':
417
+ return [createNormalizedMessage({
418
+ id: baseId,
419
+ sessionId,
420
+ timestamp: ts,
421
+ provider: PROVIDER,
422
+ kind: 'tool_use',
423
+ toolName: 'FileChanges',
424
+ toolInput: raw.changes,
425
+ toolId: baseId,
426
+ status: raw.status,
427
+ })];
428
+ case 'mcp_tool_call':
429
+ return [createNormalizedMessage({
430
+ id: baseId,
431
+ sessionId,
432
+ timestamp: ts,
433
+ provider: PROVIDER,
434
+ kind: 'tool_use',
435
+ toolName: raw.tool || 'MCP',
436
+ toolInput: raw.arguments,
437
+ toolId: baseId,
438
+ server: raw.server,
439
+ result: raw.result,
440
+ error: raw.error,
441
+ status: raw.status,
442
+ })];
443
+ case 'web_search':
444
+ return [createNormalizedMessage({
445
+ id: baseId,
446
+ sessionId,
447
+ timestamp: ts,
448
+ provider: PROVIDER,
449
+ kind: 'tool_use',
450
+ toolName: 'WebSearch',
451
+ toolInput: { query: raw.query },
452
+ toolId: baseId,
453
+ })];
454
+ case 'todo_list':
455
+ return [createNormalizedMessage({
456
+ id: baseId,
457
+ sessionId,
458
+ timestamp: ts,
459
+ provider: PROVIDER,
460
+ kind: 'tool_use',
461
+ toolName: 'TodoList',
462
+ toolInput: { items: raw.items },
463
+ toolId: baseId,
464
+ })];
465
+ case 'error':
466
+ return [createNormalizedMessage({
467
+ id: baseId,
468
+ sessionId,
469
+ timestamp: ts,
470
+ provider: PROVIDER,
471
+ kind: 'error',
472
+ content: raw.message?.content || 'Unknown error',
473
+ })];
474
+ default:
475
+ return [createNormalizedMessage({
476
+ id: baseId,
477
+ sessionId,
478
+ timestamp: ts,
479
+ provider: PROVIDER,
480
+ kind: 'tool_use',
481
+ toolName: raw.itemType || 'Unknown',
482
+ toolInput: raw.item || raw,
483
+ toolId: baseId,
484
+ })];
485
+ }
486
+ }
487
+
488
+ if (raw.type === 'turn_complete') {
489
+ return [createNormalizedMessage({
490
+ id: baseId,
491
+ sessionId,
492
+ timestamp: ts,
493
+ provider: PROVIDER,
494
+ kind: 'complete',
495
+ })];
496
+ }
497
+ if (raw.type === 'turn_failed') {
498
+ return [createNormalizedMessage({
499
+ id: baseId,
500
+ sessionId,
501
+ timestamp: ts,
502
+ provider: PROVIDER,
503
+ kind: 'error',
504
+ content: raw.error?.message || 'Turn failed',
505
+ })];
506
+ }
507
+
508
+ return [];
509
+ }
510
+
511
+ /**
512
+ * Loads Codex JSONL history and keeps token usage metadata when projects.js
513
+ * provides it.
514
+ */
515
+ async fetchHistory(
516
+ sessionId: string,
517
+ options: FetchHistoryOptions = {},
518
+ ): Promise<FetchHistoryResult> {
519
+ const { limit = null, offset = 0 } = options;
520
+
521
+ let result: CodexHistoryResult;
522
+ try {
523
+ result = await getCodexSessionMessages(sessionId, limit, offset);
524
+ } catch (error) {
525
+ const message = error instanceof Error ? error.message : String(error);
526
+ console.warn(`[CodexProvider] Failed to load session ${sessionId}:`, message);
527
+ return { messages: [], total: 0, hasMore: false, offset: 0, limit: null };
528
+ }
529
+
530
+ const rawMessages = Array.isArray(result) ? result : (result.messages || []);
531
+ const total = Array.isArray(result) ? rawMessages.length : (result.total || 0);
532
+ const hasMore = Array.isArray(result) ? false : Boolean(result.hasMore);
533
+ const tokenUsage = Array.isArray(result) ? undefined : result.tokenUsage;
534
+
535
+ const normalized: NormalizedMessage[] = [];
536
+ for (const raw of rawMessages) {
537
+ normalized.push(...this.normalizeHistoryEntry(raw, sessionId));
538
+ }
539
+
540
+ const toolResultMap = new Map<string, NormalizedMessage>();
541
+ for (const msg of normalized) {
542
+ if (msg.kind === 'tool_result' && msg.toolId) {
543
+ toolResultMap.set(msg.toolId, msg);
544
+ }
545
+ }
546
+ for (const msg of normalized) {
547
+ if (msg.kind === 'tool_use' && msg.toolId && toolResultMap.has(msg.toolId)) {
548
+ const toolResult = toolResultMap.get(msg.toolId);
549
+ if (toolResult) {
550
+ msg.toolResult = { content: toolResult.content, isError: toolResult.isError };
551
+ }
552
+ }
553
+ }
554
+
555
+ return {
556
+ messages: normalized,
557
+ total,
558
+ hasMore,
559
+ offset,
560
+ limit,
561
+ tokenUsage,
562
+ };
563
+ }
564
+ }
@@ -0,0 +1,17 @@
1
+ import { AbstractProvider } from '@/modules/providers/shared/base/abstract.provider.js';
2
+ import { CodexProviderAuth } from '@/modules/providers/list/codex/codex-auth.provider.js';
3
+ import { CodexMcpProvider } from '@/modules/providers/list/codex/codex-mcp.provider.js';
4
+ import { CodexSessionSynchronizer } from '@/modules/providers/list/codex/codex-session-synchronizer.provider.js';
5
+ import { CodexSessionsProvider } from '@/modules/providers/list/codex/codex-sessions.provider.js';
6
+ import type { IProviderAuth, IProviderSessionSynchronizer, IProviderSessions } from '@/shared/interfaces.js';
7
+
8
+ export class CodexProvider extends AbstractProvider {
9
+ readonly mcp = new CodexMcpProvider();
10
+ readonly auth: IProviderAuth = new CodexProviderAuth();
11
+ readonly sessions: IProviderSessions = new CodexSessionsProvider();
12
+ readonly sessionSynchronizer: IProviderSessionSynchronizer = new CodexSessionSynchronizer();
13
+
14
+ constructor() {
15
+ super('codex');
16
+ }
17
+ }