@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,65 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { projectsDb, sessionsDb } from '../../../modules/database/index.js';
4
+ import { AppError } from '../../../shared/utils.js';
5
+ function uniqueJsonlPathsFromSessions(sessions) {
6
+ const seen = new Set();
7
+ const result = [];
8
+ for (const row of sessions) {
9
+ const raw = row.jsonl_path?.trim();
10
+ if (!raw) {
11
+ continue;
12
+ }
13
+ const absolute = path.isAbsolute(raw) ? path.normalize(raw) : path.resolve(raw);
14
+ if (seen.has(absolute)) {
15
+ continue;
16
+ }
17
+ seen.add(absolute);
18
+ result.push(absolute);
19
+ }
20
+ return result;
21
+ }
22
+ async function unlinkJsonlIfExists(filePath) {
23
+ try {
24
+ await fs.unlink(filePath);
25
+ }
26
+ catch (error) {
27
+ const code = error.code;
28
+ if (code === 'ENOENT') {
29
+ return;
30
+ }
31
+ console.warn(`[project-delete] Failed to remove ${filePath}:`, error.message);
32
+ }
33
+ }
34
+ /**
35
+ * Loads all session rows for the project path and removes each distinct `jsonl_path` file on disk.
36
+ */
37
+ export async function deleteSessionJsonlFilesForProjectPath(projectPath) {
38
+ const sessions = sessionsDb.getSessionsByProjectPath(projectPath);
39
+ const paths = uniqueJsonlPathsFromSessions(sessions);
40
+ for (const filePath of paths) {
41
+ await unlinkJsonlIfExists(filePath);
42
+ }
43
+ }
44
+ /**
45
+ * - **Soft delete** (`force` false): set `isArchived` on the `projects` row (hide from the active list; DB only).
46
+ * - **Force** (`force` true): for each session row for that `project_path`, delete the file at `jsonl_path`
47
+ * (when set), then remove session rows and the `projects` row.
48
+ */
49
+ export async function deleteOrArchiveProject(projectId, force) {
50
+ const row = projectsDb.getProjectById(projectId);
51
+ if (!row) {
52
+ throw new AppError(`Unknown projectId: ${projectId}`, {
53
+ code: 'PROJECT_NOT_FOUND',
54
+ statusCode: 404,
55
+ });
56
+ }
57
+ if (!force) {
58
+ projectsDb.updateProjectIsArchivedById(projectId, true);
59
+ return;
60
+ }
61
+ await deleteSessionJsonlFilesForProjectPath(row.project_path);
62
+ sessionsDb.deleteSessionsByProjectPath(row.project_path);
63
+ projectsDb.deleteProjectById(projectId);
64
+ }
65
+ //# sourceMappingURL=project-delete.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-delete.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/project-delete.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,SAAS,4BAA4B,CACnC,QAA8C;IAE9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,qCAAqC,QAAQ,GAAG,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAAC,WAAmB;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IAErD,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB,EAAE,KAAc;IAC5E,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,QAAQ,CAAC,sBAAsB,SAAS,EAAE,EAAE;YACpD,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,2BAA2B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,qCAAqC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC9D,UAAU,CAAC,2BAA2B,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,93 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { projectsDb } from '../../../modules/database/index.js';
4
+ import { AppError, normalizeProjectPath, validateWorkspacePath } from '../../../shared/utils.js';
5
+ const defaultDependencies = {
6
+ validatePath: validateWorkspacePath,
7
+ ensureWorkspaceDirectory: async (projectPath) => {
8
+ await fs.mkdir(projectPath, { recursive: true });
9
+ const directoryStats = await fs.stat(projectPath);
10
+ if (!directoryStats.isDirectory()) {
11
+ throw new AppError('Path exists but is not a directory', {
12
+ code: 'PROJECT_PATH_NOT_DIRECTORY',
13
+ statusCode: 400,
14
+ });
15
+ }
16
+ },
17
+ persistProjectPath: (projectPath, customName) => projectsDb.createProjectPath(projectPath, customName),
18
+ getProjectByPath: (projectPath) => projectsDb.getProjectPath(projectPath),
19
+ };
20
+ function resolveDisplayName(customName, projectPath) {
21
+ const trimmedCustomName = typeof customName === 'string' ? customName.trim() : '';
22
+ if (trimmedCustomName.length > 0) {
23
+ return trimmedCustomName;
24
+ }
25
+ return path.basename(projectPath) || projectPath;
26
+ }
27
+ function mapProjectRowToApiView(projectRow) {
28
+ return {
29
+ projectId: projectRow.project_id,
30
+ path: projectRow.project_path,
31
+ fullPath: projectRow.project_path,
32
+ displayName: resolveDisplayName(projectRow.custom_project_name, projectRow.project_path),
33
+ customName: projectRow.custom_project_name,
34
+ isArchived: Boolean(projectRow.isArchived),
35
+ isStarred: Boolean(projectRow.isStarred),
36
+ sessions: [],
37
+ cursorSessions: [],
38
+ codexSessions: [],
39
+ geminiSessions: [],
40
+ sessionMeta: {
41
+ hasMore: false,
42
+ total: 0,
43
+ },
44
+ };
45
+ }
46
+ export async function createProject(input, dependencies = defaultDependencies) {
47
+ const normalizedPath = normalizeProjectPath(input.projectPath || '');
48
+ if (!normalizedPath) {
49
+ throw new AppError('path is required', {
50
+ code: 'PROJECT_PATH_REQUIRED',
51
+ statusCode: 400,
52
+ });
53
+ }
54
+ const pathValidation = await dependencies.validatePath(normalizedPath);
55
+ if (!pathValidation.valid || !pathValidation.resolvedPath) {
56
+ throw new AppError('Invalid project path', {
57
+ code: 'INVALID_PROJECT_PATH',
58
+ statusCode: 400,
59
+ details: pathValidation.error ?? 'Path validation failed',
60
+ });
61
+ }
62
+ const resolvedProjectPath = normalizeProjectPath(pathValidation.resolvedPath);
63
+ await dependencies.ensureWorkspaceDirectory(resolvedProjectPath);
64
+ const normalizedCustomName = resolveDisplayName(input.customName ?? null, resolvedProjectPath);
65
+ const persistedProject = dependencies.persistProjectPath(resolvedProjectPath, normalizedCustomName);
66
+ if (persistedProject.outcome === 'active_conflict') {
67
+ throw new AppError('Project path already exists and is active', {
68
+ code: 'PROJECT_ALREADY_EXISTS',
69
+ statusCode: 409,
70
+ details: `Project path already exists: ${resolvedProjectPath}`,
71
+ });
72
+ }
73
+ const projectRow = persistedProject.project ?? dependencies.getProjectByPath(resolvedProjectPath);
74
+ if (!projectRow) {
75
+ throw new AppError('Failed to resolve project after creation', {
76
+ code: 'PROJECT_CREATE_FAILED',
77
+ statusCode: 500,
78
+ });
79
+ }
80
+ // Archived rows intentionally remain archived when reused, as requested.
81
+ return {
82
+ outcome: persistedProject.outcome,
83
+ project: mapProjectRowToApiView(projectRow),
84
+ };
85
+ }
86
+ /**
87
+ * Sets `projects.custom_project_name` for the given `projectId` (or clears it when empty).
88
+ */
89
+ export function updateProjectDisplayName(projectId, newDisplayName) {
90
+ const trimmed = typeof newDisplayName === 'string' ? newDisplayName.trim() : '';
91
+ projectsDb.updateCustomProjectNameById(projectId, trimmed.length > 0 ? trimmed : null);
92
+ }
93
+ //# sourceMappingURL=project-management.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-management.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/project-management.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAMzD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAqC1F,MAAM,mBAAmB,GAA8B;IACrD,YAAY,EAAE,qBAAqB;IACnC,wBAAwB,EAAE,KAAK,EAAE,WAAmB,EAAiB,EAAE;QACrE,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,QAAQ,CAAC,oCAAoC,EAAE;gBACvD,IAAI,EAAE,4BAA4B;gBAClC,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,kBAAkB,EAAE,CAAC,WAAmB,EAAE,UAAyB,EAA2B,EAAE,CAC9F,UAAU,CAAC,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC;IACvD,gBAAgB,EAAE,CAAC,WAAmB,EAA+B,EAAE,CACrE,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC;CACzC,CAAC;AAEF,SAAS,kBAAkB,CAAC,UAAqC,EAAE,WAAmB;IACpF,MAAM,iBAAiB,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAgC;IAC9D,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,UAAU;QAChC,IAAI,EAAE,UAAU,CAAC,YAAY;QAC7B,QAAQ,EAAE,UAAU,CAAC,YAAY;QACjC,WAAW,EAAE,kBAAkB,CAAC,UAAU,CAAC,mBAAmB,EAAE,UAAU,CAAC,YAAY,CAAC;QACxF,UAAU,EAAE,UAAU,CAAC,mBAAmB;QAC1C,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;QAC1C,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;QACxC,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,EAAE;QAClB,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC;SACT;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAyB,EACzB,eAA0C,mBAAmB;IAE7D,MAAM,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE;YACrC,IAAI,EAAE,uBAAuB;YAC7B,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACvE,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QAC1D,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE;YACzC,IAAI,EAAE,sBAAsB;YAC5B,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,cAAc,CAAC,KAAK,IAAI,wBAAwB;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,YAAY,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;IAEjE,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC/F,MAAM,gBAAgB,GAAG,YAAY,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;IAEpG,IAAI,gBAAgB,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,2CAA2C,EAAE;YAC9D,IAAI,EAAE,wBAAwB;YAC9B,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,gCAAgC,mBAAmB,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,IAAI,YAAY,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAClG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAAC,0CAA0C,EAAE;YAC7D,IAAI,EAAE,uBAAuB;YAC7B,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,yEAAyE;IACzE,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,OAAO;QACjC,OAAO,EAAE,sBAAsB,CAAC,UAAU,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB,EAAE,cAAuB;IACjF,MAAM,OAAO,GAAG,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,UAAU,CAAC,2BAA2B,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { projectsDb } from '../../../modules/database/index.js';
2
+ import { AppError } from '../../../shared/utils.js';
3
+ function normalizeProjectId(projectId) {
4
+ return projectId.trim();
5
+ }
6
+ function uniqueProjectIds(projectIds) {
7
+ const uniqueIds = new Set();
8
+ for (const projectId of projectIds) {
9
+ const normalizedProjectId = normalizeProjectId(projectId);
10
+ if (!normalizedProjectId) {
11
+ continue;
12
+ }
13
+ uniqueIds.add(normalizedProjectId);
14
+ }
15
+ return [...uniqueIds];
16
+ }
17
+ /**
18
+ * Applies legacy `localStorage` stars keyed by DB `projectId` onto `projects.isStarred`.
19
+ *
20
+ * The operation is idempotent: already-starred projects are ignored, unknown ids are skipped.
21
+ */
22
+ export function applyLegacyStarredProjectIds(projectIds) {
23
+ const normalizedProjectIds = uniqueProjectIds(projectIds);
24
+ let updated = 0;
25
+ for (const projectId of normalizedProjectIds) {
26
+ const project = projectsDb.getProjectById(projectId);
27
+ if (!project) {
28
+ continue;
29
+ }
30
+ if (Boolean(project.isStarred)) {
31
+ continue;
32
+ }
33
+ projectsDb.updateProjectIsStarredById(projectId, true);
34
+ updated += 1;
35
+ }
36
+ return { updated };
37
+ }
38
+ /**
39
+ * Flips `projects.isStarred` for one project and returns the new state.
40
+ */
41
+ export function toggleProjectStar(projectId) {
42
+ const normalizedProjectId = normalizeProjectId(projectId);
43
+ if (!normalizedProjectId) {
44
+ throw new AppError('projectId is required', {
45
+ code: 'PROJECT_ID_REQUIRED',
46
+ statusCode: 400,
47
+ });
48
+ }
49
+ const project = projectsDb.getProjectById(normalizedProjectId);
50
+ if (!project) {
51
+ throw new AppError('Project not found', {
52
+ code: 'PROJECT_NOT_FOUND',
53
+ statusCode: 404,
54
+ });
55
+ }
56
+ const nextStarredState = !Boolean(project.isStarred);
57
+ projectsDb.updateProjectIsStarredById(normalizedProjectId, nextStarredState);
58
+ return { isStarred: nextStarredState };
59
+ }
60
+ //# sourceMappingURL=project-star.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-star.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/project-star.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAU7C,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAoB;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAoB;IAC/D,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,UAAU,CAAC,0BAA0B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE;YAC1C,IAAI,EAAE,qBAAqB;YAC3B,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE;YACtC,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD,UAAU,CAAC,0BAA0B,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IAE7E,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,167 @@
1
+ import { access, readFile, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { projectsDb } from '../../../modules/database/index.js';
4
+ import { AppError } from '../../../shared/utils.js';
5
+ function extractTasksFromJson(tasksData) {
6
+ if (!tasksData || typeof tasksData !== 'object') {
7
+ return [];
8
+ }
9
+ const legacyTasks = tasksData.tasks;
10
+ if (Array.isArray(legacyTasks)) {
11
+ return legacyTasks;
12
+ }
13
+ const taggedTaskCollections = [];
14
+ for (const tagValue of Object.values(tasksData)) {
15
+ if (!tagValue || typeof tagValue !== 'object') {
16
+ continue;
17
+ }
18
+ const tagTasks = tagValue.tasks;
19
+ if (Array.isArray(tagTasks)) {
20
+ taggedTaskCollections.push(...tagTasks);
21
+ }
22
+ }
23
+ return taggedTaskCollections;
24
+ }
25
+ async function detectTaskMasterFolder(projectPath) {
26
+ try {
27
+ const taskMasterPath = path.join(projectPath, '.taskmaster');
28
+ try {
29
+ const taskMasterStats = await stat(taskMasterPath);
30
+ if (!taskMasterStats.isDirectory()) {
31
+ return {
32
+ hasTaskmaster: false,
33
+ reason: '.taskmaster exists but is not a directory',
34
+ };
35
+ }
36
+ }
37
+ catch (error) {
38
+ const fileError = error;
39
+ if (fileError.code === 'ENOENT') {
40
+ return {
41
+ hasTaskmaster: false,
42
+ reason: '.taskmaster directory not found',
43
+ };
44
+ }
45
+ throw fileError;
46
+ }
47
+ const keyFiles = ['tasks/tasks.json', 'config.json'];
48
+ const fileStatus = {};
49
+ let hasEssentialFiles = true;
50
+ for (const fileName of keyFiles) {
51
+ const absoluteFilePath = path.join(taskMasterPath, fileName);
52
+ try {
53
+ await access(absoluteFilePath);
54
+ fileStatus[fileName] = true;
55
+ }
56
+ catch {
57
+ fileStatus[fileName] = false;
58
+ if (fileName === 'tasks/tasks.json') {
59
+ hasEssentialFiles = false;
60
+ }
61
+ }
62
+ }
63
+ let taskMetadata = null;
64
+ if (fileStatus['tasks/tasks.json']) {
65
+ const tasksPath = path.join(taskMasterPath, 'tasks/tasks.json');
66
+ try {
67
+ const tasksContent = await readFile(tasksPath, 'utf8');
68
+ const parsedTasksJson = JSON.parse(tasksContent);
69
+ const tasks = extractTasksFromJson(parsedTasksJson);
70
+ const stats = tasks.reduce((accumulator, currentTask) => {
71
+ accumulator.total += 1;
72
+ const normalizedTaskStatus = currentTask.status || 'pending';
73
+ accumulator.byStatus[normalizedTaskStatus] = (accumulator.byStatus[normalizedTaskStatus] || 0) + 1;
74
+ if (Array.isArray(currentTask.subtasks)) {
75
+ for (const subtask of currentTask.subtasks) {
76
+ accumulator.subtotalTasks += 1;
77
+ const normalizedSubtaskStatus = subtask.status || 'pending';
78
+ accumulator.subtaskByStatus[normalizedSubtaskStatus] =
79
+ (accumulator.subtaskByStatus[normalizedSubtaskStatus] || 0) + 1;
80
+ }
81
+ }
82
+ return accumulator;
83
+ }, {
84
+ total: 0,
85
+ subtotalTasks: 0,
86
+ byStatus: {},
87
+ subtaskByStatus: {},
88
+ });
89
+ const tasksStat = await stat(tasksPath);
90
+ taskMetadata = {
91
+ taskCount: stats.total,
92
+ subtaskCount: stats.subtotalTasks,
93
+ completed: stats.byStatus.done || 0,
94
+ pending: stats.byStatus.pending || 0,
95
+ inProgress: stats.byStatus['in-progress'] || 0,
96
+ review: stats.byStatus.review || 0,
97
+ completionPercentage: stats.total > 0 ? Math.round(((stats.byStatus.done || 0) / stats.total) * 100) : 0,
98
+ lastModified: tasksStat.mtime.toISOString(),
99
+ };
100
+ }
101
+ catch (parseError) {
102
+ console.warn('Failed to parse tasks.json:', parseError.message);
103
+ taskMetadata = {
104
+ error: 'Failed to parse tasks.json',
105
+ };
106
+ }
107
+ }
108
+ return {
109
+ hasTaskmaster: true,
110
+ hasEssentialFiles,
111
+ files: fileStatus,
112
+ metadata: taskMetadata,
113
+ path: taskMasterPath,
114
+ };
115
+ }
116
+ catch (error) {
117
+ console.error('Error detecting TaskMaster folder:', error);
118
+ return {
119
+ hasTaskmaster: false,
120
+ reason: `Error checking directory: ${error.message}`,
121
+ };
122
+ }
123
+ }
124
+ function normalizeTaskMasterInfo(taskMasterResult = null) {
125
+ const hasTaskmaster = Boolean(taskMasterResult?.hasTaskmaster);
126
+ const hasEssentialFiles = Boolean(taskMasterResult?.hasEssentialFiles);
127
+ return {
128
+ hasTaskmaster,
129
+ hasEssentialFiles,
130
+ metadata: taskMasterResult?.metadata ?? null,
131
+ status: hasTaskmaster && hasEssentialFiles ? 'configured' : 'not-configured',
132
+ };
133
+ }
134
+ const defaultDependencies = {
135
+ resolveProjectPathById: (projectId) => projectsDb.getProjectPathById(projectId),
136
+ detectTaskMasterFolder,
137
+ };
138
+ export async function getProjectTaskMasterById(projectId, dependencies = defaultDependencies) {
139
+ const projectPath = dependencies.resolveProjectPathById(projectId);
140
+ if (!projectPath) {
141
+ return null;
142
+ }
143
+ const taskMasterResult = await dependencies.detectTaskMasterFolder(projectPath);
144
+ return {
145
+ projectId,
146
+ projectPath,
147
+ taskmaster: normalizeTaskMasterInfo(taskMasterResult),
148
+ };
149
+ }
150
+ export async function getProjectTaskMaster(projectId, resolveById = getProjectTaskMasterById) {
151
+ const normalizedProjectId = projectId.trim();
152
+ if (!normalizedProjectId) {
153
+ throw new AppError('projectId is required', {
154
+ code: 'PROJECT_ID_REQUIRED',
155
+ statusCode: 400,
156
+ });
157
+ }
158
+ const taskMasterDetails = await resolveById(normalizedProjectId);
159
+ if (!taskMasterDetails) {
160
+ throw new AppError('Project not found', {
161
+ code: 'PROJECT_NOT_FOUND',
162
+ statusCode: 404,
163
+ });
164
+ }
165
+ return taskMasterDetails;
166
+ }
167
+ //# sourceMappingURL=projects-has-taskmaster.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-has-taskmaster.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/projects-has-taskmaster.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { projectsDb, sessionsDb } from '../../../modules/database/index.js';
4
+ import { sessionSynchronizerService } from '../../../modules/providers/index.js';
5
+ import { WS_OPEN_STATE, connectedClients } from '../../../modules/websocket/index.js';
6
+ import { AppError } from '../../../shared/utils.js';
7
+ const DEFAULT_PROJECT_SESSIONS_PAGE_SIZE = 20;
8
+ const MAX_PROJECT_SESSIONS_PAGE_SIZE = 200;
9
+ /**
10
+ * Generate better display name from path.
11
+ */
12
+ export async function generateDisplayName(projectName, actualProjectDir = null) {
13
+ // Use actual project directory if provided, otherwise decode from project name.
14
+ const projectPath = actualProjectDir || projectName.replace(/-/g, '/');
15
+ // Try to read package.json from the project path.
16
+ try {
17
+ const packageJsonPath = path.join(projectPath, 'package.json');
18
+ const packageData = await fs.readFile(packageJsonPath, 'utf8');
19
+ const packageJson = JSON.parse(packageData);
20
+ // Return the name from package.json if it exists.
21
+ if (packageJson.name) {
22
+ return packageJson.name;
23
+ }
24
+ }
25
+ catch {
26
+ // Fall back to path-based naming if package.json doesn't exist or can't be read.
27
+ }
28
+ // If it starts with /, it's an absolute path.
29
+ if (projectPath.startsWith('/')) {
30
+ const parts = projectPath.split('/').filter(Boolean);
31
+ // Return only the last folder name.
32
+ return parts[parts.length - 1] || projectPath;
33
+ }
34
+ return projectPath;
35
+ }
36
+ function normalizeSessionPagination(options = {}) {
37
+ const rawLimit = Number.isFinite(options.limit) ? Math.floor(Number(options.limit)) : DEFAULT_PROJECT_SESSIONS_PAGE_SIZE;
38
+ const rawOffset = Number.isFinite(options.offset) ? Math.floor(Number(options.offset)) : 0;
39
+ return {
40
+ limit: Math.min(Math.max(1, rawLimit), MAX_PROJECT_SESSIONS_PAGE_SIZE),
41
+ offset: Math.max(0, rawOffset),
42
+ };
43
+ }
44
+ function mapSessionRowToSummary(row) {
45
+ return {
46
+ id: row.session_id,
47
+ summary: row.custom_name || '',
48
+ messageCount: 0,
49
+ lastActivity: row.updated_at ?? row.created_at ?? new Date().toISOString(),
50
+ };
51
+ }
52
+ function bucketSessionRowsByProvider(rows) {
53
+ const byProvider = {
54
+ claude: [],
55
+ cursor: [],
56
+ codex: [],
57
+ gemini: [],
58
+ };
59
+ for (const row of rows) {
60
+ const provider = row.provider;
61
+ const bucket = byProvider[provider];
62
+ if (!bucket) {
63
+ continue;
64
+ }
65
+ bucket.push(mapSessionRowToSummary(row));
66
+ }
67
+ return byProvider;
68
+ }
69
+ /**
70
+ * Reads one paginated project session slice from the DB and groups rows by provider.
71
+ */
72
+ function readProjectSessionsPageByPath(projectPath, options = {}) {
73
+ const pagination = normalizeSessionPagination(options);
74
+ const rows = sessionsDb.getSessionsByProjectPathPage(projectPath, pagination.limit, pagination.offset);
75
+ const total = sessionsDb.countSessionsByProjectPath(projectPath);
76
+ return {
77
+ sessionsByProvider: bucketSessionRowsByProvider(rows),
78
+ total,
79
+ hasMore: pagination.offset + rows.length < total,
80
+ };
81
+ }
82
+ // Broadcast progress to all connected WebSocket clients
83
+ function broadcastProgress(progress) {
84
+ const message = JSON.stringify({
85
+ type: 'loading_progress',
86
+ ...progress,
87
+ });
88
+ connectedClients.forEach((client) => {
89
+ if (client.readyState === WS_OPEN_STATE) {
90
+ client.send(message);
91
+ }
92
+ });
93
+ }
94
+ /**
95
+ * Reads all projects from DB and returns provider-bucketed session summaries.
96
+ */
97
+ export async function getProjectsWithSessions(options = {}) {
98
+ if (!options.skipSynchronization) {
99
+ await sessionSynchronizerService.synchronizeSessions();
100
+ }
101
+ const projectRows = projectsDb.getProjectPaths();
102
+ const totalProjects = projectRows.length;
103
+ const projects = [];
104
+ let processedProjects = 0;
105
+ for (const row of projectRows) {
106
+ processedProjects += 1;
107
+ const projectId = row.project_id;
108
+ const projectPath = row.project_path;
109
+ broadcastProgress({
110
+ phase: 'loading',
111
+ current: processedProjects,
112
+ total: totalProjects,
113
+ currentProject: projectPath,
114
+ });
115
+ const displayName = row.custom_project_name && row.custom_project_name.trim().length > 0
116
+ ? row.custom_project_name
117
+ : await generateDisplayName(path.basename(projectPath) || projectPath, projectPath);
118
+ const sessionsPage = readProjectSessionsPageByPath(projectPath, {
119
+ limit: options.sessionsLimit,
120
+ offset: options.sessionsOffset,
121
+ });
122
+ projects.push({
123
+ projectId,
124
+ path: projectPath,
125
+ displayName,
126
+ fullPath: projectPath,
127
+ isStarred: Boolean(row.isStarred),
128
+ sessions: sessionsPage.sessionsByProvider.claude,
129
+ cursorSessions: sessionsPage.sessionsByProvider.cursor,
130
+ codexSessions: sessionsPage.sessionsByProvider.codex,
131
+ geminiSessions: sessionsPage.sessionsByProvider.gemini,
132
+ sessionMeta: {
133
+ hasMore: sessionsPage.hasMore,
134
+ total: sessionsPage.total,
135
+ },
136
+ });
137
+ }
138
+ broadcastProgress({
139
+ phase: 'complete',
140
+ current: totalProjects,
141
+ total: totalProjects,
142
+ });
143
+ return projects;
144
+ }
145
+ /**
146
+ * Loads one paginated session slice for a specific project id.
147
+ */
148
+ export async function getProjectSessionsPage(projectId, options = {}) {
149
+ const projectRow = projectsDb.getProjectById(projectId);
150
+ if (!projectRow) {
151
+ throw new AppError(`Project "${projectId}" was not found.`, {
152
+ code: 'PROJECT_NOT_FOUND',
153
+ statusCode: 404,
154
+ });
155
+ }
156
+ const sessionsPage = readProjectSessionsPageByPath(projectRow.project_path, options);
157
+ return {
158
+ projectId: projectRow.project_id,
159
+ sessions: sessionsPage.sessionsByProvider.claude,
160
+ cursorSessions: sessionsPage.sessionsByProvider.cursor,
161
+ codexSessions: sessionsPage.sessionsByProvider.codex,
162
+ geminiSessions: sessionsPage.sessionsByProvider.gemini,
163
+ sessionMeta: {
164
+ hasMore: sessionsPage.hasMore,
165
+ total: sessionsPage.total,
166
+ },
167
+ };
168
+ }
169
+ //# sourceMappingURL=projects-with-sessions-fetch.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-with-sessions-fetch.service.js","sourceRoot":"","sources":["../../../../../server/modules/projects/services/projects-with-sessions-fetch.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE/E,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAuE7C,MAAM,kCAAkC,GAAG,EAAE,CAAC;AAC9C,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,mBAAkC,IAAI;IACnG,gFAAgF;IAChF,MAAM,WAAW,GAAG,gBAAgB,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEvE,kDAAkD;IAClD,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAsB,CAAC;QAEjE,kDAAkD;QAClD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,CAAC,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iFAAiF;IACnF,CAAC;IAED,8CAA8C;IAC9C,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,oCAAoC;QACpC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC;IAChD,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,0BAA0B,CAAC,UAAoC,EAAE;IACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC;IACzH,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,8BAA8B,CAAC;QACtE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAyB;IACvD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,UAAU;QAClB,OAAO,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;QAC9B,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC3E,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,IAA4B;IAC/D,MAAM,UAAU,GAAuB;QACrC,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAoC,CAAC;QAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,6BAA6B,CACpC,WAAmB,EACnB,UAAoC,EAAE;IAEtC,MAAM,UAAU,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,UAAU,CAAC,4BAA4B,CAClD,WAAW,EACX,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,MAAM,CACQ,CAAC;IAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;IAEjE,OAAO;QACL,kBAAkB,EAAE,2BAA2B,CAAC,IAAI,CAAC;QACrD,KAAK;QACL,OAAO,EAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK;KACjD,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,SAAS,iBAAiB,CAAC,QAAwB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,EAAE,kBAAkB;QACxB,GAAG,QAAQ;KACZ,CAAC,CAAC;IAEH,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAgC,EAAE,EAAE;QAC5D,IAAI,MAAM,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAA0C,EAAE;IAE5C,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACjC,MAAM,0BAA0B,CAAC,mBAAmB,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,eAAe,EAK5C,CAAC;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;IACzC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,iBAAiB,IAAI,CAAC,CAAC;QAEvB,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC;QACjC,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC;QAErC,iBAAiB,CAAC;YAChB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,iBAAiB;YAC1B,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,WAAW;SAC5B,CAAC,CAAC;QAEH,MAAM,WAAW,GACf,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAClE,CAAC,CAAC,GAAG,CAAC,mBAAmB;YACzB,CAAC,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,EAAE,WAAW,CAAC,CAAC;QAExF,MAAM,YAAY,GAAG,6BAA6B,CAAC,WAAW,EAAE;YAC9D,KAAK,EAAE,OAAO,CAAC,aAAa;YAC5B,MAAM,EAAE,OAAO,CAAC,cAAc;SAC/B,CAAC,CAAC;QAEH,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS;YACT,IAAI,EAAE,WAAW;YACjB,WAAW;YACX,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YACjC,QAAQ,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM;YAChD,cAAc,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM;YACtD,aAAa,EAAE,YAAY,CAAC,kBAAkB,CAAC,KAAK;YACpD,cAAc,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM;YACtD,WAAW,EAAE;gBACX,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,KAAK,EAAE,YAAY,CAAC,KAAK;aAC1B;SACF,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC;QAChB,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAAiB,EACjB,UAAoC,EAAE;IAEtC,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAAC,YAAY,SAAS,kBAAkB,EAAE;YAC1D,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,6BAA6B,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrF,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,UAAU;QAChC,QAAQ,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM;QAChD,cAAc,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM;QACtD,aAAa,EAAE,YAAY,CAAC,kBAAkB,CAAC,KAAK;QACpD,cAAc,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM;QACtD,WAAW,EAAE;YACX,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,KAAK,EAAE,YAAY,CAAC,KAAK;SAC1B;KACF,CAAC;AACJ,CAAC"}