@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,131 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import spawn from 'cross-spawn';
5
+ import { readObjectRecord, readOptionalString } from '../../../../shared/utils.js';
6
+ export class GeminiProviderAuth {
7
+ /**
8
+ * Checks whether the Gemini CLI is available on this host.
9
+ */
10
+ checkInstalled() {
11
+ const cliPath = process.env.GEMINI_PATH || 'gemini';
12
+ try {
13
+ spawn.sync(cliPath, ['--version'], { stdio: 'ignore', timeout: 5000 });
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ /**
21
+ * Returns Gemini CLI installation and credential status.
22
+ */
23
+ async getStatus() {
24
+ const installed = this.checkInstalled();
25
+ if (!installed) {
26
+ return {
27
+ installed,
28
+ provider: 'gemini',
29
+ authenticated: false,
30
+ email: null,
31
+ method: null,
32
+ error: 'Gemini CLI is not installed',
33
+ };
34
+ }
35
+ const credentials = await this.checkCredentials();
36
+ return {
37
+ installed,
38
+ provider: 'gemini',
39
+ authenticated: credentials.authenticated,
40
+ email: credentials.email,
41
+ method: credentials.method,
42
+ error: credentials.authenticated ? undefined : credentials.error || 'Not authenticated',
43
+ };
44
+ }
45
+ /**
46
+ * Checks Gemini credentials from API key env vars or local OAuth credential files.
47
+ */
48
+ async checkCredentials() {
49
+ if (process.env.GEMINI_API_KEY?.trim()) {
50
+ return { authenticated: true, email: 'API Key Auth', method: 'api_key' };
51
+ }
52
+ try {
53
+ const credsPath = path.join(os.homedir(), '.gemini', 'oauth_creds.json');
54
+ const content = await readFile(credsPath, 'utf8');
55
+ const creds = readObjectRecord(JSON.parse(content)) ?? {};
56
+ const accessToken = readOptionalString(creds.access_token);
57
+ if (!accessToken) {
58
+ return {
59
+ authenticated: false,
60
+ email: null,
61
+ method: null,
62
+ error: 'No valid tokens found in oauth_creds',
63
+ };
64
+ }
65
+ const refreshToken = readOptionalString(creds.refresh_token);
66
+ const tokenInfo = await this.getTokenInfoEmail(accessToken);
67
+ if (tokenInfo.valid) {
68
+ return {
69
+ authenticated: true,
70
+ email: tokenInfo.email || 'OAuth Session',
71
+ method: 'credentials_file',
72
+ };
73
+ }
74
+ if (!refreshToken) {
75
+ return {
76
+ authenticated: false,
77
+ email: null,
78
+ method: 'credentials_file',
79
+ error: 'Access token invalid and no refresh token found',
80
+ };
81
+ }
82
+ return {
83
+ authenticated: true,
84
+ email: await this.getActiveAccountEmail() || 'OAuth Session',
85
+ method: 'credentials_file',
86
+ };
87
+ }
88
+ catch {
89
+ return {
90
+ authenticated: false,
91
+ email: null,
92
+ method: null,
93
+ error: 'Gemini CLI not configured',
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * Validates a Gemini OAuth access token and returns an email when Google reports one.
99
+ */
100
+ async getTokenInfoEmail(accessToken) {
101
+ try {
102
+ const tokenRes = await fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${accessToken}`);
103
+ if (!tokenRes.ok) {
104
+ return { valid: false, email: null };
105
+ }
106
+ const tokenInfo = readObjectRecord(await tokenRes.json());
107
+ return {
108
+ valid: true,
109
+ email: readOptionalString(tokenInfo?.email) ?? null,
110
+ };
111
+ }
112
+ catch {
113
+ return { valid: false, email: null };
114
+ }
115
+ }
116
+ /**
117
+ * Reads Gemini's active local Google account as an offline fallback for display.
118
+ */
119
+ async getActiveAccountEmail() {
120
+ try {
121
+ const accPath = path.join(os.homedir(), '.gemini', 'google_accounts.json');
122
+ const accContent = await readFile(accPath, 'utf8');
123
+ const accounts = readObjectRecord(JSON.parse(accContent));
124
+ return readOptionalString(accounts?.active) ?? null;
125
+ }
126
+ catch {
127
+ return null;
128
+ }
129
+ }
130
+ }
131
+ //# sourceMappingURL=gemini-auth.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-auth.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/gemini/gemini-auth.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { McpProvider } from '../../../../modules/providers/shared/mcp/mcp.provider.js';
4
+ import { AppError, readJsonConfig, readObjectRecord, readOptionalString, readStringArray, readStringRecord, writeJsonConfig, } from '../../../../shared/utils.js';
5
+ export class GeminiMcpProvider extends McpProvider {
6
+ constructor() {
7
+ super('gemini', ['user', 'project'], ['stdio', 'http', 'sse']);
8
+ }
9
+ async readScopedServers(scope, workspacePath) {
10
+ const filePath = scope === 'user'
11
+ ? path.join(os.homedir(), '.gemini', 'settings.json')
12
+ : path.join(workspacePath, '.gemini', 'settings.json');
13
+ const config = await readJsonConfig(filePath);
14
+ return readObjectRecord(config.mcpServers) ?? {};
15
+ }
16
+ async writeScopedServers(scope, workspacePath, servers) {
17
+ const filePath = scope === 'user'
18
+ ? path.join(os.homedir(), '.gemini', 'settings.json')
19
+ : path.join(workspacePath, '.gemini', 'settings.json');
20
+ const config = await readJsonConfig(filePath);
21
+ config.mcpServers = servers;
22
+ await writeJsonConfig(filePath, config);
23
+ }
24
+ buildServerConfig(input) {
25
+ if (input.transport === 'stdio') {
26
+ if (!input.command?.trim()) {
27
+ throw new AppError('command is required for stdio MCP servers.', {
28
+ code: 'MCP_COMMAND_REQUIRED',
29
+ statusCode: 400,
30
+ });
31
+ }
32
+ return {
33
+ command: input.command,
34
+ args: input.args ?? [],
35
+ env: input.env ?? {},
36
+ cwd: input.cwd,
37
+ };
38
+ }
39
+ if (!input.url?.trim()) {
40
+ throw new AppError('url is required for http/sse MCP servers.', {
41
+ code: 'MCP_URL_REQUIRED',
42
+ statusCode: 400,
43
+ });
44
+ }
45
+ return {
46
+ type: input.transport,
47
+ url: input.url,
48
+ headers: input.headers ?? {},
49
+ };
50
+ }
51
+ normalizeServerConfig(scope, name, rawConfig) {
52
+ if (!rawConfig || typeof rawConfig !== 'object') {
53
+ return null;
54
+ }
55
+ const config = rawConfig;
56
+ if (typeof config.command === 'string') {
57
+ return {
58
+ provider: 'gemini',
59
+ name,
60
+ scope,
61
+ transport: 'stdio',
62
+ command: config.command,
63
+ args: readStringArray(config.args),
64
+ env: readStringRecord(config.env),
65
+ cwd: readOptionalString(config.cwd),
66
+ };
67
+ }
68
+ if (typeof config.url === 'string') {
69
+ const transport = readOptionalString(config.type) === 'sse' ? 'sse' : 'http';
70
+ return {
71
+ provider: 'gemini',
72
+ name,
73
+ scope,
74
+ transport,
75
+ url: config.url,
76
+ headers: readStringRecord(config.headers),
77
+ };
78
+ }
79
+ return null;
80
+ }
81
+ }
82
+ //# sourceMappingURL=gemini-mcp.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-mcp.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/gemini/gemini-mcp.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,296 @@
1
+ import crypto from 'node:crypto';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { projectsDb, sessionsDb } from '../../../../modules/database/index.js';
6
+ import { findFilesRecursivelyCreatedAfter, normalizeProjectPath, normalizeSessionName, readFileTimestamps, } from '../../../../shared/utils.js';
7
+ /**
8
+ * Session indexer for Gemini transcript artifacts.
9
+ */
10
+ export class GeminiSessionSynchronizer {
11
+ provider = 'gemini';
12
+ geminiHome = path.join(os.homedir(), '.gemini');
13
+ /**
14
+ * Scans Gemini legacy JSON and new JSONL artifacts and upserts sessions into DB.
15
+ */
16
+ async synchronize(since) {
17
+ const projectHashLookup = this.buildProjectHashLookup();
18
+ const legacySessionFiles = await findFilesRecursivelyCreatedAfter(path.join(this.geminiHome, 'sessions'), '.json', since ?? null);
19
+ const legacyTempFiles = await findFilesRecursivelyCreatedAfter(path.join(this.geminiHome, 'tmp'), '.json', since ?? null);
20
+ const jsonlSessionFiles = await findFilesRecursivelyCreatedAfter(path.join(this.geminiHome, 'sessions'), '.jsonl', since ?? null);
21
+ const jsonlTempFiles = await findFilesRecursivelyCreatedAfter(path.join(this.geminiHome, 'tmp'), '.jsonl', since ?? null);
22
+ // Process legacy JSON first, then JSONL. If both exist for a session id,
23
+ // the JSONL artifact becomes the canonical jsonl_path via upsert.
24
+ const files = [
25
+ ...legacySessionFiles,
26
+ ...legacyTempFiles,
27
+ ...jsonlSessionFiles,
28
+ ...jsonlTempFiles,
29
+ ];
30
+ let processed = 0;
31
+ for (const filePath of files) {
32
+ if (this.shouldSkipTempArtifact(filePath)) {
33
+ continue;
34
+ }
35
+ const parsed = filePath.endsWith('.jsonl')
36
+ ? await this.processJsonlSessionFile(filePath, projectHashLookup)
37
+ : await this.processLegacySessionFile(filePath);
38
+ if (!parsed) {
39
+ continue;
40
+ }
41
+ const timestamps = await readFileTimestamps(filePath);
42
+ sessionsDb.createSession(parsed.sessionId, this.provider, parsed.projectPath, parsed.sessionName, timestamps.createdAt, timestamps.updatedAt, filePath);
43
+ processed += 1;
44
+ }
45
+ return processed;
46
+ }
47
+ /**
48
+ * Parses and upserts one Gemini legacy JSON or JSONL artifact.
49
+ */
50
+ async synchronizeFile(filePath) {
51
+ if (!filePath.endsWith('.json') && !filePath.endsWith('.jsonl')) {
52
+ return null;
53
+ }
54
+ if (this.shouldSkipTempArtifact(filePath)) {
55
+ return null;
56
+ }
57
+ const parsed = filePath.endsWith('.jsonl')
58
+ ? await this.processJsonlSessionFile(filePath, this.buildProjectHashLookup())
59
+ : await this.processLegacySessionFile(filePath);
60
+ if (!parsed) {
61
+ return null;
62
+ }
63
+ const timestamps = await readFileTimestamps(filePath);
64
+ return sessionsDb.createSession(parsed.sessionId, this.provider, parsed.projectPath, parsed.sessionName, timestamps.createdAt, timestamps.updatedAt, filePath);
65
+ }
66
+ /**
67
+ * Extracts session metadata from one Gemini legacy JSON artifact.
68
+ */
69
+ async processLegacySessionFile(filePath) {
70
+ try {
71
+ const content = await readFile(filePath, 'utf8');
72
+ const data = JSON.parse(content);
73
+ const sessionId = typeof data.sessionId === 'string'
74
+ ? data.sessionId
75
+ : typeof data.id === 'string'
76
+ ? data.id
77
+ : undefined;
78
+ if (!sessionId) {
79
+ return null;
80
+ }
81
+ const workspaceProjectPath = await this.resolveProjectPathFromChatWorkspace(filePath);
82
+ const projectPath = typeof data.projectPath === 'string' && data.projectPath.trim().length > 0
83
+ ? data.projectPath
84
+ : workspaceProjectPath;
85
+ if (!projectPath) {
86
+ return null;
87
+ }
88
+ const messages = Array.isArray(data.messages) ? data.messages : [];
89
+ const firstMessage = messages[0];
90
+ let rawName;
91
+ if (Array.isArray(firstMessage?.content) && typeof firstMessage.content[0]?.text === 'string') {
92
+ rawName = firstMessage.content[0].text;
93
+ }
94
+ else if (typeof firstMessage?.content === 'string') {
95
+ rawName = firstMessage.content;
96
+ }
97
+ return {
98
+ sessionId,
99
+ projectPath,
100
+ sessionName: normalizeSessionName(rawName, 'New Gemini Chat'),
101
+ };
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ /**
108
+ * Extracts session metadata from one Gemini JSONL artifact.
109
+ */
110
+ async processJsonlSessionFile(filePath, projectHashLookup) {
111
+ const metadata = await this.extractJsonlMetadata(filePath);
112
+ if (!metadata) {
113
+ return null;
114
+ }
115
+ let projectPath = typeof metadata.projectPath === 'string' ? metadata.projectPath.trim() : '';
116
+ if (!projectPath) {
117
+ const workspaceProjectPath = await this.resolveProjectPathFromChatWorkspace(filePath);
118
+ if (workspaceProjectPath) {
119
+ projectPath = workspaceProjectPath;
120
+ }
121
+ }
122
+ if (!projectPath && typeof metadata.projectHash === 'string') {
123
+ projectPath = projectHashLookup.get(metadata.projectHash.trim().toLowerCase()) ?? '';
124
+ }
125
+ if (!projectPath) {
126
+ return null;
127
+ }
128
+ // Once we resolve a project hash/path pair, keep it in-memory for this sync run.
129
+ if (typeof metadata.projectHash === 'string' && metadata.projectHash.trim()) {
130
+ projectHashLookup.set(metadata.projectHash.trim().toLowerCase(), projectPath);
131
+ }
132
+ return {
133
+ sessionId: metadata.sessionId,
134
+ projectPath,
135
+ sessionName: normalizeSessionName(metadata.firstUserMessage, 'New Gemini Chat'),
136
+ };
137
+ }
138
+ /**
139
+ * Reads first useful metadata from Gemini JSONL files.
140
+ */
141
+ async extractJsonlMetadata(filePath) {
142
+ try {
143
+ const content = await readFile(filePath, 'utf8');
144
+ const lines = content.split('\n');
145
+ let sessionId;
146
+ let projectPath;
147
+ let projectHash;
148
+ let firstUserMessage;
149
+ for (const line of lines) {
150
+ const trimmed = line.trim();
151
+ if (!trimmed) {
152
+ continue;
153
+ }
154
+ let parsed;
155
+ try {
156
+ parsed = JSON.parse(trimmed);
157
+ }
158
+ catch {
159
+ continue;
160
+ }
161
+ if (!sessionId && typeof parsed.sessionId === 'string') {
162
+ sessionId = parsed.sessionId;
163
+ }
164
+ if (!projectPath && typeof parsed.projectPath === 'string') {
165
+ projectPath = parsed.projectPath;
166
+ }
167
+ if (!projectHash && typeof parsed.projectHash === 'string') {
168
+ projectHash = parsed.projectHash;
169
+ }
170
+ if (!firstUserMessage && parsed.type === 'user') {
171
+ firstUserMessage = this.extractGeminiTextContent(parsed.content);
172
+ }
173
+ if (sessionId && (projectPath || projectHash) && firstUserMessage) {
174
+ break;
175
+ }
176
+ }
177
+ if (!sessionId) {
178
+ return null;
179
+ }
180
+ return {
181
+ sessionId,
182
+ projectPath,
183
+ projectHash,
184
+ firstUserMessage,
185
+ };
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ /**
192
+ * Tries to resolve project root from Gemini tmp chat workspaces.
193
+ */
194
+ async resolveProjectPathFromChatWorkspace(filePath) {
195
+ if (!filePath.includes(`${path.sep}chats${path.sep}`)) {
196
+ return '';
197
+ }
198
+ const chatsDir = path.dirname(filePath);
199
+ const workspaceDir = path.dirname(chatsDir);
200
+ const projectRootPath = path.join(workspaceDir, '.project_root');
201
+ try {
202
+ const rootContent = await readFile(projectRootPath, 'utf8');
203
+ return rootContent.trim();
204
+ }
205
+ catch {
206
+ return '';
207
+ }
208
+ }
209
+ /**
210
+ * Builds a hash->path lookup for Gemini JSONL metadata that stores projectHash.
211
+ */
212
+ buildProjectHashLookup() {
213
+ const lookup = new Map();
214
+ const knownPaths = new Set();
215
+ for (const project of projectsDb.getProjectPaths()) {
216
+ if (typeof project.project_path === 'string' && project.project_path.trim()) {
217
+ knownPaths.add(project.project_path.trim());
218
+ }
219
+ }
220
+ for (const session of sessionsDb.getAllSessions()) {
221
+ if (session.provider === this.provider && typeof session.project_path === 'string' && session.project_path.trim()) {
222
+ knownPaths.add(session.project_path.trim());
223
+ }
224
+ }
225
+ for (const knownPath of knownPaths) {
226
+ this.addProjectHashCandidates(lookup, knownPath);
227
+ }
228
+ return lookup;
229
+ }
230
+ /**
231
+ * Adds likely Gemini hash variants for one project path.
232
+ */
233
+ addProjectHashCandidates(lookup, projectPath) {
234
+ const trimmed = projectPath.trim();
235
+ if (!trimmed) {
236
+ return;
237
+ }
238
+ const normalized = normalizeProjectPath(trimmed);
239
+ const resolved = path.resolve(trimmed);
240
+ const resolvedNormalized = normalizeProjectPath(resolved);
241
+ const candidates = new Set([
242
+ trimmed,
243
+ normalized,
244
+ resolved,
245
+ resolvedNormalized,
246
+ ]);
247
+ if (process.platform === 'win32') {
248
+ for (const candidate of [...candidates]) {
249
+ candidates.add(candidate.toLowerCase());
250
+ }
251
+ }
252
+ for (const candidate of candidates) {
253
+ if (!candidate) {
254
+ continue;
255
+ }
256
+ const hash = this.sha256(candidate);
257
+ if (!lookup.has(hash)) {
258
+ lookup.set(hash, trimmed);
259
+ }
260
+ }
261
+ }
262
+ /**
263
+ * Returns first user text from Gemini content payload shapes.
264
+ */
265
+ extractGeminiTextContent(content) {
266
+ if (typeof content === 'string' && content.trim().length > 0) {
267
+ return content;
268
+ }
269
+ if (!Array.isArray(content)) {
270
+ return undefined;
271
+ }
272
+ for (const part of content) {
273
+ if (typeof part === 'string' && part.trim().length > 0) {
274
+ return part;
275
+ }
276
+ if (part && typeof part === 'object' && typeof part.text === 'string') {
277
+ const text = part.text;
278
+ if (text.trim().length > 0) {
279
+ return text;
280
+ }
281
+ }
282
+ }
283
+ return undefined;
284
+ }
285
+ /**
286
+ * Keeps tmp scanning scoped to chat artifacts only.
287
+ */
288
+ shouldSkipTempArtifact(filePath) {
289
+ return (filePath.startsWith(path.join(this.geminiHome, 'tmp'))
290
+ && !filePath.includes(`${path.sep}chats${path.sep}`));
291
+ }
292
+ sha256(value) {
293
+ return crypto.createHash('sha256').update(value).digest('hex');
294
+ }
295
+ }
296
+ //# sourceMappingURL=gemini-session-synchronizer.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-session-synchronizer.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/gemini/gemini-session-synchronizer.provider.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,gCAAgC,EAChC,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAiB3B;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACnB,QAAQ,GAAG,QAAiB,CAAC;IAC7B,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAEjE;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAY;QAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAExD,MAAM,kBAAkB,GAAG,MAAM,gCAAgC,CAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EACtC,OAAO,EACP,KAAK,IAAI,IAAI,CACd,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,gCAAgC,CAC5D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EACjC,OAAO,EACP,KAAK,IAAI,IAAI,CACd,CAAC;QACF,MAAM,iBAAiB,GAAG,MAAM,gCAAgC,CAC9D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EACtC,QAAQ,EACR,KAAK,IAAI,IAAI,CACd,CAAC;QACF,MAAM,cAAc,GAAG,MAAM,gCAAgC,CAC3D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EACjC,QAAQ,EACR,KAAK,IAAI,IAAI,CACd,CAAC;QAEF,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,KAAK,GAAG;YACZ,GAAG,kBAAkB;YACrB,GAAG,eAAe;YAClB,GAAG,iBAAiB;YACpB,GAAG,cAAc;SAClB,CAAC;QAEF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACxC,CAAC,CAAC,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,iBAAiB,CAAC;gBACjE,CAAC,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACtD,UAAU,CAAC,aAAa,CACtB,MAAM,CAAC,SAAS,EAChB,IAAI,CAAC,QAAQ,EACb,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,EAClB,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,SAAS,EACpB,QAAQ,CACT,CAAC;YACF,SAAS,IAAI,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACxC,CAAC,CAAC,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC7E,CAAC,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,UAAU,CAAC,aAAa,CAC7B,MAAM,CAAC,SAAS,EAChB,IAAI,CAAC,QAAQ,EACb,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,EAClB,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,SAAS,EACpB,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,wBAAwB,CAAC,QAAgB;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;YAE9C,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;gBAChC,CAAC,CAAC,IAAI,CAAC,SAAS;gBAChB,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;oBAC3B,CAAC,CAAC,IAAI,CAAC,EAAE;oBACT,CAAC,CAAC,SAAS,CAAC;YAClB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,QAAQ,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAC5F,CAAC,CAAC,IAAI,CAAC,WAAW;gBAClB,CAAC,CAAC,oBAAoB,CAAC;YACzB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAA0B,CAAC;YAC1D,IAAI,OAA2B,CAAC;YAEhC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9F,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzC,CAAC;iBAAM,IAAI,OAAO,YAAY,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;YACjC,CAAC;YAED,OAAO;gBACL,SAAS;gBACT,WAAW;gBACX,WAAW,EAAE,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,CAAC;aAC9D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CACnC,QAAgB,EAChB,iBAAsC;QAEtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,WAAW,GAAG,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,QAAQ,CAAC,CAAC;YACtF,IAAI,oBAAoB,EAAE,CAAC;gBACzB,WAAW,GAAG,oBAAoB,CAAC;YACrC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7D,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iFAAiF;QACjF,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5E,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;QAChF,CAAC;QAED,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,WAAW;YACX,WAAW,EAAE,oBAAoB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;SAChF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,QAAgB;QACjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,SAA6B,CAAC;YAClC,IAAI,WAA+B,CAAC;YACpC,IAAI,WAA+B,CAAC;YACpC,IAAI,gBAAoC,CAAC;YAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBAED,IAAI,MAAiB,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBACvD,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC/B,CAAC;gBACD,IAAI,CAAC,WAAW,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC3D,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;gBACnC,CAAC;gBACD,IAAI,CAAC,WAAW,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC3D,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;gBACnC,CAAC;gBAED,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAChD,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnE,CAAC;gBAED,IAAI,SAAS,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,gBAAgB,EAAE,CAAC;oBAClE,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,SAAS;gBACT,WAAW;gBACX,WAAW;gBACX,gBAAgB;aACjB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mCAAmC,CAAC,QAAgB;QAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAC5D,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC;YACnD,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5E,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClH,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,MAA2B,EAAE,WAAmB;QAC/E,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAE1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS;YACjC,OAAO;YACP,UAAU;YACV,QAAQ;YACR,kBAAkB;SACnB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;gBACxC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,OAAgB;QAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAQ,IAAkB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrF,MAAM,IAAI,GAAI,IAAkB,CAAC,IAAI,CAAC;gBACtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,QAAgB;QAC7C,OAAO,CACL,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;eACnD,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,CACrD,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,KAAa;QAC1B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;CACF"}