@cloudcli-ai/cloudcli 1.36.2 → 1.37.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 (539) hide show
  1. package/dist/assets/index-DSlds633.css +32 -0
  2. package/dist/assets/{index-CDGzV0LN.js → index-eGqPeIEu.js} +375 -267
  3. package/dist/index.html +2 -2
  4. package/dist-server/server/constants/config.js.map +1 -1
  5. package/dist-server/server/index.js +73 -1224
  6. package/dist-server/server/index.js.map +1 -1
  7. package/dist-server/server/load-env.js +17 -4
  8. package/dist-server/server/load-env.js.map +1 -1
  9. package/dist-server/server/modules/agent/agent.module.js +37 -0
  10. package/dist-server/server/modules/agent/agent.module.js.map +1 -0
  11. package/dist-server/server/modules/agent/agent.routes.js +1161 -0
  12. package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
  13. package/dist-server/server/modules/agent/index.js +3 -0
  14. package/dist-server/server/modules/agent/index.js.map +1 -0
  15. package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
  16. package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
  17. package/dist-server/server/modules/assets/assets.routes.js +56 -15
  18. package/dist-server/server/modules/assets/assets.routes.js.map +1 -1
  19. package/dist-server/server/modules/assets/index.js +2 -2
  20. package/dist-server/server/modules/assets/index.js.map +1 -1
  21. package/dist-server/server/modules/assets/services/image-assets.service.js +39 -1
  22. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -1
  23. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +21 -1
  24. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -1
  25. package/dist-server/server/{middleware/auth.js → modules/auth/auth.middleware.js} +30 -8
  26. package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
  27. package/dist-server/server/modules/auth/auth.module.js +29 -0
  28. package/dist-server/server/modules/auth/auth.module.js.map +1 -0
  29. package/dist-server/server/modules/auth/auth.routes.js +45 -0
  30. package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
  31. package/dist-server/server/modules/auth/auth.service.js +113 -0
  32. package/dist-server/server/modules/auth/auth.service.js.map +1 -0
  33. package/dist-server/server/modules/auth/index.js +9 -0
  34. package/dist-server/server/modules/auth/index.js.map +1 -0
  35. package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
  36. package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
  37. package/dist-server/server/{browser-use-mcp.js → modules/browser-use/browser-use-mcp.js} +3 -1
  38. package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
  39. package/dist-server/server/modules/browser-use/browser-use.service.js +3 -4
  40. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
  41. package/dist-server/server/modules/browser-use/index.js +9 -0
  42. package/dist-server/server/modules/browser-use/index.js.map +1 -0
  43. package/dist-server/server/modules/cli/cli.js +11 -0
  44. package/dist-server/server/modules/cli/cli.js.map +1 -0
  45. package/dist-server/server/modules/cli/cli.module.js +86 -0
  46. package/dist-server/server/modules/cli/cli.module.js.map +1 -0
  47. package/dist-server/server/modules/cli/cli.service.js +244 -0
  48. package/dist-server/server/modules/cli/cli.service.js.map +1 -0
  49. package/dist-server/server/modules/cli/index.js +3 -0
  50. package/dist-server/server/modules/cli/index.js.map +1 -0
  51. package/dist-server/server/modules/cli/sandbox.service.js +332 -0
  52. package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
  53. package/dist-server/server/modules/cli/tests/cli.service.test.js +78 -0
  54. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
  55. package/dist-server/server/modules/cli/tests/sandbox.service.test.js +55 -0
  56. package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
  57. package/dist-server/server/modules/commands/commands.module.js +20 -0
  58. package/dist-server/server/modules/commands/commands.module.js.map +1 -0
  59. package/dist-server/server/modules/commands/commands.routes.js +497 -0
  60. package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
  61. package/dist-server/server/modules/commands/index.js +3 -0
  62. package/dist-server/server/modules/commands/index.js.map +1 -0
  63. package/dist-server/server/modules/commands/tests/commands.test.js +96 -0
  64. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  65. package/dist-server/server/modules/database/index.js +1 -0
  66. package/dist-server/server/modules/database/index.js.map +1 -1
  67. package/dist-server/server/modules/database/migrations.js +13 -0
  68. package/dist-server/server/modules/database/migrations.js.map +1 -1
  69. package/dist-server/server/modules/database/repositories/sessions.db.js +14 -1
  70. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
  71. package/dist-server/server/modules/database/schema.js +4 -0
  72. package/dist-server/server/modules/database/schema.js.map +1 -1
  73. package/dist-server/server/modules/file-tree/file-tree.module.js +91 -0
  74. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  75. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  76. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  77. package/dist-server/server/modules/file-tree/file-tree.service.js +544 -0
  78. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  79. package/dist-server/server/modules/file-tree/index.js +3 -0
  80. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  81. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  82. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  83. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +184 -0
  84. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  85. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  86. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  87. package/dist-server/server/modules/git/git.module.js +14 -0
  88. package/dist-server/server/modules/git/git.module.js.map +1 -0
  89. package/dist-server/server/modules/git/git.routes.js +1339 -0
  90. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  91. package/dist-server/server/modules/git/index.js +3 -0
  92. package/dist-server/server/modules/git/index.js.map +1 -0
  93. package/dist-server/server/modules/git/tests/git-init.routes.test.js +48 -0
  94. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  95. package/dist-server/server/{routes → modules/git/tests}/git.test.js +1 -1
  96. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  97. package/dist-server/server/modules/notifications/index.js +15 -1
  98. package/dist-server/server/modules/notifications/index.js.map +1 -1
  99. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  100. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  101. package/dist-server/server/{services/vapid-keys.js → modules/notifications/vapid-keys.service.js} +3 -2
  102. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  103. package/dist-server/server/modules/plugins/index.js +9 -0
  104. package/dist-server/server/modules/plugins/index.js.map +1 -0
  105. package/dist-server/server/{utils/plugin-process-manager.js → modules/plugins/plugin-process.service.js} +3 -2
  106. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  107. package/dist-server/server/{utils/plugin-loader.js → modules/plugins/plugin-registry.service.js} +2 -1
  108. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  109. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  110. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  111. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  112. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  113. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  114. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  115. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  116. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  117. package/dist-server/server/modules/projects/index.js +5 -0
  118. package/dist-server/server/modules/projects/index.js.map +1 -1
  119. package/dist-server/server/modules/providers/index.js +3 -0
  120. package/dist-server/server/modules/providers/index.js.map +1 -1
  121. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +6 -0
  122. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
  123. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +1 -4
  124. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
  125. package/dist-server/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +62 -41
  126. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
  127. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +6 -4
  128. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -1
  129. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +23 -4
  130. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -1
  131. package/dist-server/server/modules/providers/list/claude/claude.provider.js +2 -0
  132. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -1
  133. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +1 -4
  134. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
  135. package/dist-server/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +48 -34
  136. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  137. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +19 -1
  138. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
  139. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +290 -6
  140. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
  141. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +5 -0
  142. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -1
  143. package/dist-server/server/modules/providers/list/codex/codex.provider.js +2 -0
  144. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -1
  145. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +1 -4
  146. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
  147. package/dist-server/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +40 -28
  148. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  149. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +21 -14
  150. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -1
  151. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +2 -0
  152. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -1
  153. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +7 -5
  154. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
  155. package/dist-server/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +38 -25
  156. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  157. package/dist-server/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +27 -4
  158. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  159. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +11 -5
  160. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -1
  161. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +2 -0
  162. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -1
  163. package/dist-server/server/modules/providers/provider.routes.js +33 -9
  164. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  165. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +5 -1
  166. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
  167. package/dist-server/server/modules/providers/services/provider-models.service.js +110 -15
  168. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  169. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  170. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  171. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
  172. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  173. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +2 -0
  174. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
  175. package/dist-server/server/modules/providers/services/sessions.service.js +54 -0
  176. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
  177. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +2 -3
  178. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -1
  179. package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
  180. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  181. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
  182. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  183. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +70 -0
  184. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
  185. package/dist-server/server/modules/providers/tests/{provider-image-history.test.js → provider-attachment-history.test.js} +60 -2
  186. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  187. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +148 -61
  188. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
  189. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +130 -0
  190. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  191. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +165 -0
  192. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  193. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  194. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  195. package/dist-server/server/modules/providers/tests/skills.test.js +4 -2
  196. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
  197. package/dist-server/server/modules/settings/index.js +3 -0
  198. package/dist-server/server/modules/settings/index.js.map +1 -0
  199. package/dist-server/server/modules/settings/settings.module.js +35 -0
  200. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  201. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  202. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  203. package/dist-server/server/modules/settings/settings.service.js +116 -0
  204. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  205. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  206. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  207. package/dist-server/server/modules/system/index.js +3 -0
  208. package/dist-server/server/modules/system/index.js.map +1 -0
  209. package/dist-server/server/modules/system/system.module.js +44 -0
  210. package/dist-server/server/modules/system/system.module.js.map +1 -0
  211. package/dist-server/server/modules/system/system.routes.js +16 -0
  212. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  213. package/dist-server/server/modules/system/system.service.js +45 -0
  214. package/dist-server/server/modules/system/system.service.js.map +1 -0
  215. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  216. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  217. package/dist-server/server/modules/taskmaster/index.js +3 -0
  218. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  219. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  220. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  221. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  222. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  223. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  224. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  225. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
  226. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  227. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  228. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  229. package/dist-server/server/modules/user/index.js +3 -0
  230. package/dist-server/server/modules/user/index.js.map +1 -0
  231. package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
  232. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  233. package/dist-server/server/modules/user/user.module.js +47 -0
  234. package/dist-server/server/modules/user/user.module.js.map +1 -0
  235. package/dist-server/server/modules/user/user.routes.js +44 -0
  236. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  237. package/dist-server/server/modules/user/user.service.js +59 -0
  238. package/dist-server/server/modules/user/user.service.js.map +1 -0
  239. package/dist-server/server/modules/voice/index.js +3 -0
  240. package/dist-server/server/modules/voice/index.js.map +1 -0
  241. package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
  242. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  243. package/dist-server/server/modules/voice/voice.module.js +44 -0
  244. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  245. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  246. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  247. package/dist-server/server/modules/voice/voice.service.js +148 -0
  248. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  249. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +2 -2
  250. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +40 -29
  251. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  252. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +76 -8
  253. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
  254. package/dist-server/server/modules/websocket/services/websocket-server.service.js +51 -20
  255. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
  256. package/dist-server/server/modules/websocket/tests/{chat-image-filter.test.js → chat-attachment-filter.test.js} +10 -3
  257. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  258. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +97 -0
  259. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  260. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  261. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  262. package/dist-server/server/modules/worktrees/index.js +3 -0
  263. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  264. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  265. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  266. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  267. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  268. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  269. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  270. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  271. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  272. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  273. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  274. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  275. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  276. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  277. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  278. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  279. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  280. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  281. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  282. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  283. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  284. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  285. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  286. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  287. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  288. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  289. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  290. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  291. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  292. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  293. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  294. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  295. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  296. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  297. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  298. package/dist-server/server/shared/image-attachments.js +90 -17
  299. package/dist-server/server/shared/image-attachments.js.map +1 -1
  300. package/dist-server/server/shared/tests/image-attachments.test.js +43 -1
  301. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -1
  302. package/dist-server/server/shared/utils.js +66 -142
  303. package/dist-server/server/shared/utils.js.map +1 -1
  304. package/electron/localServer.js +1 -2
  305. package/package.json +8 -4
  306. package/server/index.ts +401 -0
  307. package/server/{load-env.js → load-env.ts} +18 -5
  308. package/server/modules/agent/agent.module.ts +51 -0
  309. package/server/modules/agent/agent.routes.ts +1287 -0
  310. package/server/modules/agent/index.ts +2 -0
  311. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  312. package/server/modules/assets/assets.routes.ts +63 -16
  313. package/server/modules/assets/index.ts +2 -2
  314. package/server/modules/assets/services/image-assets.service.ts +46 -1
  315. package/server/modules/assets/tests/image-assets.service.test.ts +28 -0
  316. package/server/{middleware/auth.js → modules/auth/auth.middleware.ts} +38 -7
  317. package/server/modules/auth/auth.module.ts +38 -0
  318. package/server/modules/auth/auth.routes.ts +57 -0
  319. package/server/modules/auth/auth.service.ts +155 -0
  320. package/server/modules/auth/index.ts +9 -0
  321. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  322. package/server/{browser-use-mcp.ts → modules/browser-use/browser-use-mcp.ts} +3 -1
  323. package/server/modules/browser-use/browser-use.service.ts +3 -4
  324. package/server/modules/browser-use/index.ts +8 -0
  325. package/server/modules/cli/cli.module.ts +96 -0
  326. package/server/modules/cli/cli.service.ts +281 -0
  327. package/server/modules/cli/cli.ts +13 -0
  328. package/server/modules/cli/index.ts +2 -0
  329. package/server/modules/cli/sandbox.service.ts +413 -0
  330. package/server/modules/cli/tests/cli.service.test.ts +91 -0
  331. package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
  332. package/server/modules/commands/commands.module.ts +22 -0
  333. package/server/{routes/commands.js → modules/commands/commands.routes.ts} +44 -36
  334. package/server/modules/commands/index.ts +2 -0
  335. package/server/modules/commands/tests/commands.test.ts +119 -0
  336. package/server/modules/database/index.ts +1 -0
  337. package/server/modules/database/migrations.ts +15 -0
  338. package/server/modules/database/repositories/sessions.db.ts +19 -1
  339. package/server/modules/database/schema.ts +4 -0
  340. package/server/modules/file-tree/file-tree.module.ts +112 -0
  341. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  342. package/server/modules/file-tree/file-tree.service.ts +616 -0
  343. package/server/modules/file-tree/index.ts +2 -0
  344. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  345. package/server/modules/file-tree/tests/file-tree.service.test.ts +220 -0
  346. package/server/modules/git/git-parsing.service.ts +66 -0
  347. package/server/modules/git/git.module.ts +22 -0
  348. package/server/{routes/git.js → modules/git/git.routes.ts} +91 -132
  349. package/server/modules/git/index.ts +2 -0
  350. package/server/modules/git/tests/git-init.routes.test.ts +52 -0
  351. package/server/{routes/git.test.js → modules/git/tests/git.test.ts} +3 -3
  352. package/server/modules/notifications/index.ts +9 -0
  353. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  354. package/server/{services/vapid-keys.js → modules/notifications/vapid-keys.service.ts} +3 -1
  355. package/server/modules/plugins/index.ts +9 -0
  356. package/server/{utils/plugin-process-manager.js → modules/plugins/plugin-process.service.ts} +3 -1
  357. package/server/{utils/plugin-loader.js → modules/plugins/plugin-registry.service.ts} +1 -0
  358. package/server/modules/plugins/plugins.module.ts +33 -0
  359. package/server/modules/plugins/plugins.routes.ts +66 -0
  360. package/server/modules/plugins/plugins.service.ts +147 -0
  361. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  362. package/server/modules/projects/index.ts +5 -0
  363. package/server/modules/providers/README.md +41 -9
  364. package/server/modules/providers/index.ts +4 -0
  365. package/server/modules/providers/list/claude/claude-auth.provider.ts +8 -0
  366. package/server/modules/providers/list/claude/claude-models.provider.ts +1 -12
  367. package/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +66 -44
  368. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +6 -4
  369. package/server/modules/providers/list/claude/claude-sessions.provider.ts +27 -4
  370. package/server/modules/providers/list/claude/claude.provider.ts +3 -0
  371. package/server/modules/providers/list/codex/codex-models.provider.ts +0 -9
  372. package/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +54 -36
  373. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +21 -1
  374. package/server/modules/providers/list/codex/codex-sessions.provider.ts +331 -7
  375. package/server/modules/providers/list/codex/codex-skills.provider.ts +5 -0
  376. package/server/modules/providers/list/codex/codex.provider.ts +3 -0
  377. package/server/modules/providers/list/cursor/cursor-models.provider.ts +0 -9
  378. package/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +58 -27
  379. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +26 -15
  380. package/server/modules/providers/list/cursor/cursor.provider.ts +3 -0
  381. package/server/modules/providers/list/opencode/opencode-models.provider.ts +7 -10
  382. package/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +56 -28
  383. package/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +41 -3
  384. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +13 -5
  385. package/server/modules/providers/list/opencode/opencode.provider.ts +3 -0
  386. package/server/modules/providers/provider.routes.ts +47 -10
  387. package/server/modules/providers/services/provider-capabilities.service.ts +7 -1
  388. package/server/modules/providers/services/provider-models.service.ts +131 -23
  389. package/server/modules/providers/services/provider-runtime.service.ts +109 -0
  390. package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
  391. package/server/modules/providers/services/sessions-watcher.service.ts +2 -0
  392. package/server/modules/providers/services/sessions.service.ts +79 -0
  393. package/server/modules/providers/shared/base/abstract.provider.ts +4 -3
  394. package/server/modules/providers/tests/claude-auth.test.ts +150 -0
  395. package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
  396. package/server/modules/providers/tests/codex-sessions.test.ts +81 -0
  397. package/server/modules/providers/tests/{provider-image-history.test.ts → provider-attachment-history.test.ts} +68 -1
  398. package/server/modules/providers/tests/provider-models.service.test.ts +450 -349
  399. package/server/modules/providers/tests/provider-runtime.service.test.ts +142 -0
  400. package/server/modules/providers/tests/provider-token-usage.service.test.ts +185 -0
  401. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  402. package/server/modules/providers/tests/skills.test.ts +9 -2
  403. package/server/modules/settings/index.ts +2 -0
  404. package/server/modules/settings/settings.module.ts +50 -0
  405. package/server/modules/settings/settings.routes.ts +51 -0
  406. package/server/modules/settings/settings.service.ts +186 -0
  407. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  408. package/server/modules/system/index.ts +2 -0
  409. package/server/modules/system/system.module.ts +62 -0
  410. package/server/modules/system/system.routes.ts +21 -0
  411. package/server/modules/system/system.service.ts +76 -0
  412. package/server/modules/system/tests/system.service.test.ts +118 -0
  413. package/server/modules/taskmaster/index.ts +2 -0
  414. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  415. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
  416. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  417. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
  418. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  419. package/server/modules/user/index.ts +2 -0
  420. package/server/modules/user/tests/user.service.test.ts +61 -0
  421. package/server/modules/user/user.module.ts +58 -0
  422. package/server/modules/user/user.routes.ts +50 -0
  423. package/server/modules/user/user.service.ts +85 -0
  424. package/server/modules/voice/index.ts +2 -0
  425. package/server/modules/voice/tests/voice.service.test.ts +98 -0
  426. package/server/modules/voice/voice.module.ts +47 -0
  427. package/server/modules/voice/voice.routes.ts +113 -0
  428. package/server/modules/voice/voice.service.ts +192 -0
  429. package/server/modules/websocket/README.md +7 -7
  430. package/server/modules/websocket/services/chat-session-writer.service.ts +2 -2
  431. package/server/modules/websocket/services/chat-websocket.service.ts +73 -61
  432. package/server/modules/websocket/services/shell-websocket.service.ts +88 -12
  433. package/server/modules/websocket/services/websocket-server.service.ts +63 -19
  434. package/server/modules/websocket/tests/{chat-image-filter.test.ts → chat-attachment-filter.test.ts} +17 -2
  435. package/server/modules/websocket/tests/shell-websocket.service.test.ts +119 -0
  436. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  437. package/server/modules/worktrees/index.ts +2 -0
  438. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  439. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  440. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  441. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  442. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  443. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  444. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  445. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  446. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  447. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  448. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  449. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  450. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  451. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  452. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  453. package/server/modules/worktrees/worktrees.module.ts +113 -0
  454. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  455. package/server/shared/image-attachments.ts +112 -18
  456. package/server/shared/interfaces.ts +29 -19
  457. package/server/shared/tests/image-attachments.test.ts +55 -0
  458. package/server/shared/types.ts +658 -21
  459. package/server/shared/utils.ts +77 -212
  460. package/dist/assets/index-DLmhQ15L.css +0 -32
  461. package/dist-server/server/browser-use-mcp.js.map +0 -1
  462. package/dist-server/server/claude-sdk.js.map +0 -1
  463. package/dist-server/server/cli.js +0 -647
  464. package/dist-server/server/cli.js.map +0 -1
  465. package/dist-server/server/cursor-cli.js.map +0 -1
  466. package/dist-server/server/middleware/auth.js.map +0 -1
  467. package/dist-server/server/modules/providers/tests/provider-image-history.test.js.map +0 -1
  468. package/dist-server/server/modules/websocket/tests/chat-image-filter.test.js.map +0 -1
  469. package/dist-server/server/openai-codex.js.map +0 -1
  470. package/dist-server/server/opencode-cli.js.map +0 -1
  471. package/dist-server/server/opencode-cli.test.js.map +0 -1
  472. package/dist-server/server/routes/agent.js +0 -1155
  473. package/dist-server/server/routes/agent.js.map +0 -1
  474. package/dist-server/server/routes/auth.js +0 -119
  475. package/dist-server/server/routes/auth.js.map +0 -1
  476. package/dist-server/server/routes/commands.js +0 -492
  477. package/dist-server/server/routes/commands.js.map +0 -1
  478. package/dist-server/server/routes/cursor.js +0 -49
  479. package/dist-server/server/routes/cursor.js.map +0 -1
  480. package/dist-server/server/routes/git.js +0 -1389
  481. package/dist-server/server/routes/git.js.map +0 -1
  482. package/dist-server/server/routes/git.test.js.map +0 -1
  483. package/dist-server/server/routes/mcp-utils.js +0 -29
  484. package/dist-server/server/routes/mcp-utils.js.map +0 -1
  485. package/dist-server/server/routes/plugins.js +0 -266
  486. package/dist-server/server/routes/plugins.js.map +0 -1
  487. package/dist-server/server/routes/settings.js +0 -249
  488. package/dist-server/server/routes/settings.js.map +0 -1
  489. package/dist-server/server/routes/taskmaster.js +0 -1362
  490. package/dist-server/server/routes/taskmaster.js.map +0 -1
  491. package/dist-server/server/routes/tests/commands.test.js +0 -76
  492. package/dist-server/server/routes/tests/commands.test.js.map +0 -1
  493. package/dist-server/server/routes/user.js +0 -116
  494. package/dist-server/server/routes/user.js.map +0 -1
  495. package/dist-server/server/services/notification-orchestrator.js +0 -2
  496. package/dist-server/server/services/notification-orchestrator.js.map +0 -1
  497. package/dist-server/server/services/tests/notification-orchestrator.test.js +0 -64
  498. package/dist-server/server/services/tests/notification-orchestrator.test.js.map +0 -1
  499. package/dist-server/server/services/vapid-keys.js.map +0 -1
  500. package/dist-server/server/utils/colors.js +0 -20
  501. package/dist-server/server/utils/colors.js.map +0 -1
  502. package/dist-server/server/utils/commandParser.js +0 -255
  503. package/dist-server/server/utils/commandParser.js.map +0 -1
  504. package/dist-server/server/utils/gitConfig.js +0 -37
  505. package/dist-server/server/utils/gitConfig.js.map +0 -1
  506. package/dist-server/server/utils/mcp-detector.js +0 -134
  507. package/dist-server/server/utils/mcp-detector.js.map +0 -1
  508. package/dist-server/server/utils/plugin-loader.js.map +0 -1
  509. package/dist-server/server/utils/plugin-process-manager.js.map +0 -1
  510. package/dist-server/server/utils/runtime-paths.js +0 -30
  511. package/dist-server/server/utils/runtime-paths.js.map +0 -1
  512. package/dist-server/server/utils/taskmaster-websocket.js +0 -124
  513. package/dist-server/server/utils/taskmaster-websocket.js.map +0 -1
  514. package/dist-server/server/utils/url-detection.js +0 -58
  515. package/dist-server/server/utils/url-detection.js.map +0 -1
  516. package/dist-server/server/voice-proxy.js +0 -226
  517. package/dist-server/server/voice-proxy.js.map +0 -1
  518. package/server/cli.js +0 -695
  519. package/server/index.js +0 -1651
  520. package/server/routes/agent.js +0 -1257
  521. package/server/routes/auth.js +0 -137
  522. package/server/routes/cursor.js +0 -52
  523. package/server/routes/mcp-utils.js +0 -31
  524. package/server/routes/plugins.js +0 -307
  525. package/server/routes/settings.js +0 -282
  526. package/server/routes/taskmaster.js +0 -1470
  527. package/server/routes/tests/commands.test.js +0 -82
  528. package/server/routes/user.js +0 -124
  529. package/server/services/notification-orchestrator.js +0 -7
  530. package/server/services/tests/notification-orchestrator.test.js +0 -80
  531. package/server/utils/colors.js +0 -21
  532. package/server/utils/commandParser.js +0 -305
  533. package/server/utils/gitConfig.js +0 -35
  534. package/server/utils/mcp-detector.js +0 -147
  535. package/server/utils/runtime-paths.js +0 -37
  536. package/server/utils/taskmaster-websocket.js +0 -135
  537. package/server/utils/url-detection.js +0 -71
  538. package/server/voice-proxy.js +0 -224
  539. /package/server/constants/{config.js → config.ts} +0 -0
@@ -0,0 +1,147 @@
1
+ import { AppError } from '@/shared/utils.js';
2
+
3
+ type PluginManifest = Record<string, unknown> & {
4
+ name: string;
5
+ dirName?: string;
6
+ enabled?: boolean;
7
+ server?: unknown;
8
+ };
9
+
10
+ type PluginConfig = Record<string, { enabled?: boolean; secrets?: Record<string, unknown> }>;
11
+
12
+ type PluginDependencies = {
13
+ scanPlugins(): PluginManifest[];
14
+ readConfig(): PluginConfig;
15
+ saveConfig(config: PluginConfig): void;
16
+ getPluginDirectory(pluginName: string): string | null;
17
+ getPluginsDirectory(): string;
18
+ resolveAsset(pluginName: string, assetPath: string): string | null;
19
+ assetIsFile(assetPath: string): boolean;
20
+ contentType(assetPath: string): string;
21
+ install(url: string): Promise<unknown>;
22
+ update(pluginName: string): Promise<unknown>;
23
+ uninstall(pluginName: string): Promise<unknown>;
24
+ startServer(pluginName: string, pluginDirectory: string, serverConfig: unknown): Promise<number>;
25
+ stopServer(pluginName: string): Promise<void>;
26
+ getServerPort(pluginName: string): number | undefined;
27
+ isServerRunning(pluginName: string): boolean;
28
+ joinPath(...parts: string[]): string;
29
+ logError(message: string, error: unknown): void;
30
+ };
31
+
32
+ function validatePluginName(pluginName: string): void {
33
+ if (!/^[a-zA-Z0-9_-]+$/.test(pluginName)) {
34
+ throw new AppError('Invalid plugin name', { code: 'INVALID_PLUGIN_NAME', statusCode: 400 });
35
+ }
36
+ }
37
+
38
+ function normalizePluginManifest(value: unknown): PluginManifest {
39
+ if (typeof value !== 'object' || value === null) {
40
+ throw new AppError('Plugin manifest is invalid', {
41
+ code: 'INVALID_PLUGIN_MANIFEST',
42
+ statusCode: 400,
43
+ });
44
+ }
45
+ const manifest = value as Record<string, unknown>;
46
+ if (typeof manifest.name !== 'string') {
47
+ throw new AppError('Plugin manifest is missing its name', {
48
+ code: 'INVALID_PLUGIN_MANIFEST',
49
+ statusCode: 400,
50
+ });
51
+ }
52
+ return manifest as PluginManifest;
53
+ }
54
+
55
+ /** Creates plugin-management workflows around loader and process adapters. */
56
+ export function createPluginsService(dependencies: PluginDependencies) {
57
+ async function startServerIfAvailable(plugin: PluginManifest): Promise<void> {
58
+ if (!plugin.server || dependencies.isServerRunning(plugin.name)) return;
59
+ const pluginDirectory = dependencies.getPluginDirectory(plugin.name);
60
+ if (!pluginDirectory) return;
61
+ try {
62
+ await dependencies.startServer(plugin.name, pluginDirectory, plugin.server);
63
+ } catch (error) {
64
+ dependencies.logError(`Failed to start plugin server for ${plugin.name}`, error);
65
+ }
66
+ }
67
+
68
+ return {
69
+ list() {
70
+ return {
71
+ plugins: dependencies.scanPlugins().map((plugin) => ({
72
+ ...plugin,
73
+ serverRunning: plugin.server ? dependencies.isServerRunning(plugin.name) : false,
74
+ })),
75
+ };
76
+ },
77
+ getManifest(pluginName: string) {
78
+ validatePluginName(pluginName);
79
+ const plugin = dependencies.scanPlugins().find((candidate) => candidate.name === pluginName);
80
+ if (!plugin) throw new AppError('Plugin not found', { code: 'PLUGIN_NOT_FOUND', statusCode: 404 });
81
+ return plugin;
82
+ },
83
+ resolveAsset(pluginName: string, assetPath: string) {
84
+ validatePluginName(pluginName);
85
+ if (!assetPath) throw new AppError('No asset path specified', { code: 'PLUGIN_ASSET_REQUIRED', statusCode: 400 });
86
+ const resolvedPath = dependencies.resolveAsset(pluginName, assetPath);
87
+ if (!resolvedPath || !dependencies.assetIsFile(resolvedPath)) {
88
+ throw new AppError('Asset not found', { code: 'PLUGIN_ASSET_NOT_FOUND', statusCode: 404 });
89
+ }
90
+ return { path: resolvedPath, contentType: dependencies.contentType(resolvedPath) };
91
+ },
92
+ async setEnabled(pluginName: string, enabled: unknown) {
93
+ validatePluginName(pluginName);
94
+ if (typeof enabled !== 'boolean') {
95
+ throw new AppError('"enabled" must be a boolean', { code: 'INVALID_PLUGIN_ENABLED', statusCode: 400 });
96
+ }
97
+ const plugin = this.getManifest(pluginName);
98
+ const config = dependencies.readConfig();
99
+ config[pluginName] = { ...config[pluginName], enabled };
100
+ dependencies.saveConfig(config);
101
+ if (plugin.server && enabled) await startServerIfAvailable(plugin);
102
+ if (plugin.server && !enabled && dependencies.isServerRunning(pluginName)) {
103
+ await dependencies.stopServer(pluginName);
104
+ }
105
+ return { success: true, name: pluginName, enabled };
106
+ },
107
+ async install(urlInput: unknown) {
108
+ const url = typeof urlInput === 'string' ? urlInput.trim() : '';
109
+ if (!url || (!url.startsWith('https://') && !url.startsWith('git@'))) {
110
+ throw new AppError('URL must start with https:// or git@', { code: 'INVALID_PLUGIN_URL', statusCode: 400 });
111
+ }
112
+ const plugin = normalizePluginManifest(await dependencies.install(url));
113
+ await startServerIfAvailable(plugin);
114
+ return { success: true, plugin };
115
+ },
116
+ async update(pluginName: string) {
117
+ validatePluginName(pluginName);
118
+ const wasRunning = dependencies.isServerRunning(pluginName);
119
+ if (wasRunning) await dependencies.stopServer(pluginName);
120
+ const plugin = normalizePluginManifest(await dependencies.update(pluginName));
121
+ if (wasRunning) await startServerIfAvailable(plugin);
122
+ return { success: true, plugin };
123
+ },
124
+ async prepareRpc(pluginName: string) {
125
+ validatePluginName(pluginName);
126
+ let port = dependencies.getServerPort(pluginName);
127
+ if (!port) {
128
+ const plugin = this.getManifest(pluginName);
129
+ if (!plugin.server) throw new AppError('Plugin server is not running', { code: 'PLUGIN_SERVER_UNAVAILABLE', statusCode: 503 });
130
+ if (!plugin.enabled) throw new AppError('Plugin is disabled', { code: 'PLUGIN_DISABLED', statusCode: 503 });
131
+ const pluginDirectory = dependencies.joinPath(
132
+ dependencies.getPluginsDirectory(),
133
+ plugin.dirName ?? plugin.name,
134
+ );
135
+ port = await dependencies.startServer(pluginName, pluginDirectory, plugin.server);
136
+ }
137
+ const secrets = dependencies.readConfig()[pluginName]?.secrets ?? {};
138
+ return { port, secrets };
139
+ },
140
+ async uninstall(pluginName: string) {
141
+ validatePluginName(pluginName);
142
+ if (dependencies.isServerRunning(pluginName)) await dependencies.stopServer(pluginName);
143
+ await dependencies.uninstall(pluginName);
144
+ return { success: true, name: pluginName };
145
+ },
146
+ };
147
+ }
@@ -0,0 +1,32 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+
4
+ import { createPluginsService } from '../plugins.service.js';
5
+
6
+ type Dependencies = Parameters<typeof createPluginsService>[0];
7
+
8
+ function dependencies(overrides: Partial<Dependencies> = {}): Dependencies {
9
+ return {
10
+ scanPlugins: () => [], readConfig: () => ({}), saveConfig: () => undefined,
11
+ getPluginDirectory: () => null, getPluginsDirectory: () => '/plugins',
12
+ resolveAsset: () => null, assetIsFile: () => false, contentType: () => 'text/plain',
13
+ install: async () => ({ name: 'plugin', dirName: 'plugin' }),
14
+ update: async () => ({ name: 'plugin', dirName: 'plugin' }),
15
+ uninstall: async () => undefined, startServer: async () => 4000,
16
+ stopServer: async () => undefined, getServerPort: () => undefined,
17
+ isServerRunning: () => false, joinPath: (...parts) => parts.join('/'),
18
+ logError: () => undefined, ...overrides,
19
+ };
20
+ }
21
+
22
+ test('setEnabled persists configuration and starts an enabled plugin server', async () => {
23
+ const operations: string[] = [];
24
+ const service = createPluginsService(dependencies({
25
+ scanPlugins: () => [{ name: 'demo', dirName: 'demo', server: { entry: 'server.js' } }],
26
+ getPluginDirectory: () => '/plugins/demo',
27
+ saveConfig: () => operations.push('save'),
28
+ startServer: async () => { operations.push('start'); return 4000; },
29
+ }));
30
+ await service.setEnabled('demo', true);
31
+ assert.deepEqual(operations, ['save', 'start']);
32
+ });
@@ -3,4 +3,9 @@ export {
3
3
  getProjectsWithSessions,
4
4
  } from './services/projects-with-sessions-fetch.service.js';
5
5
  export { updateProjectDisplayName } from './services/project-management.service.js';
6
+ // createProject: used by the worktrees module to register a worktree directory as a switchable project.
7
+ export { createProject } from './services/project-management.service.js';
8
+ // deleteOrArchiveProject: used by Projects routes and Worktrees cleanup to hide or permanently remove a project.
6
9
  export { deleteOrArchiveProject, deleteSessionJsonlFilesForProjectPath } from './services/project-delete.service.js';
10
+ // restoreArchivedProject: used by the worktrees module to re-activate an archived project when its worktree is reopened.
11
+ export { restoreArchivedProject } from './services/project-delete.service.js';
@@ -7,8 +7,10 @@ without guessing which files need to move.
7
7
 
8
8
  ## Current Provider Shape
9
9
 
10
- Every provider wrapper exposes five facets:
10
+ Every provider wrapper exposes seven facets:
11
11
 
12
+ - `runtime`
13
+ - `models`
12
14
  - `auth`
13
15
  - `mcp`
14
16
  - `skills`
@@ -17,6 +19,8 @@ Every provider wrapper exposes five facets:
17
19
 
18
20
  These correspond to the shared interfaces in `server/shared/interfaces.ts`:
19
21
 
22
+ - `IProviderRuntime`
23
+ - `IProviderModels`
20
24
  - `IProviderAuth`
21
25
  - `IProviderMcp`
22
26
  - `IProviderSkills`
@@ -25,12 +29,16 @@ These correspond to the shared interfaces in `server/shared/interfaces.ts`:
25
29
 
26
30
  The services that consume them are:
27
31
 
32
+ - `providerModelsService`
28
33
  - `providerAuthService`
29
34
  - `providerMcpService`
30
35
  - `providerSkillsService`
31
36
  - `sessionsService`
32
37
  - `sessionSynchronizerService`
33
38
 
39
+ Live execution is consumed through `providerRuntimeService`, which resolves the
40
+ provider-owned runtime through the same `providerRegistry` as every other facet.
41
+
34
42
  Current provider ids in this repo are:
35
43
 
36
44
  - `claude`
@@ -48,7 +56,9 @@ Each provider lives under its own folder in `server/modules/providers/list/`:
48
56
  ```text
49
57
  server/modules/providers/list/<provider>/
50
58
  <provider>.provider.ts
59
+ <provider>-runtime.provider.js
51
60
  <provider>-auth.provider.ts
61
+ <provider>-models.provider.ts
52
62
  <provider>-mcp.provider.ts
53
63
  <provider>-skills.provider.ts
54
64
  <provider>-sessions.provider.ts
@@ -57,10 +67,19 @@ server/modules/providers/list/<provider>/
57
67
 
58
68
  The existing provider folders are `claude`, `codex`, `cursor`, and `opencode`.
59
69
 
70
+ Each provider wrapper owns its SDK/CLI runtime alongside its auth, model, and
71
+ session facets. Runtime adapters receive registry-backed model and session
72
+ lookups from `providerRuntimeService` at execution time instead of importing
73
+ those services themselves. This keeps `providerRegistry` as the only provider
74
+ mapping without creating a circular dependency. Application-level consumers
75
+ import the service from `server/modules/providers/index.ts`.
76
+
60
77
  ## What Each Facet Does
61
78
 
62
79
  | Facet | Responsibility | Base / Service |
63
80
  | --- | --- | --- |
81
+ | `runtime` | Run and abort live SDK/CLI sessions | `IProviderRuntime` -> `providerRuntimeService` |
82
+ | `models` | Resolve supported and active models | `IProviderModels` -> `providerModelsService` |
64
83
  | `auth` | Report install/auth state for the provider runtime | `IProviderAuth` -> `providerAuthService` |
65
84
  | `mcp` | Read, list, write, and remove provider-native MCP config | `McpProvider` -> `providerMcpService` |
66
85
  | `skills` | Discover provider-native skill markdown files | `SkillsProvider` -> `providerSkillsService` |
@@ -79,8 +98,8 @@ The existing provider folders are `claude`, `codex`, `cursor`, and `opencode`.
79
98
  - Update `server/shared/types.ts` `LLMProvider`.
80
99
  - Update `src/types/app.ts` `LLMProvider` if the frontend should know about it.
81
100
  - Update `server/modules/providers/provider.routes.ts`.
82
- - Update `server/routes/agent.js` if the provider is launchable from the agent runtime.
83
- - Update `server/index.js` if the provider needs runtime boot or shutdown wiring.
101
+ - Update `server/modules/agent/agent.routes.ts` if the provider is launchable from the agent runtime.
102
+ - Update `server/index.ts` if the provider needs runtime boot or shutdown wiring.
84
103
  - Update the `PROVIDER_ORDER` list in `public/api-docs.html` if the provider should appear in the public API docs.
85
104
  - Update `src/components/chat/hooks/useChatProviderState.ts` and
86
105
  `src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx` if
@@ -91,6 +110,8 @@ The existing provider folders are `claude`, `codex`, `cursor`, and `opencode`.
91
110
  2. Create the wrapper class.
92
111
 
93
112
  - Add `server/modules/providers/list/<provider>/<provider>.provider.ts`.
113
+ - Add `server/modules/providers/list/<provider>/<provider>-runtime.provider.js`
114
+ when the provider supports live SDK/CLI execution.
94
115
  - Extend `AbstractProvider`.
95
116
  - Expose readonly `auth`, `mcp`, `skills`, `sessions`, and `sessionSynchronizer`.
96
117
  - Call `super('<provider>')`.
@@ -198,8 +219,10 @@ Current session sync roots are:
198
219
 
199
220
  If the provider can run live chat sessions, update the runtime entrypoints too:
200
221
 
201
- - `server/routes/agent.js`
202
- - `server/index.js`
222
+ - `server/modules/providers/list/<provider>/<provider>-runtime.provider.js`
223
+ - `server/modules/providers/list/<provider>/<provider>.provider.ts`
224
+ - `server/modules/agent/agent.routes.ts`
225
+ - `server/index.ts`
203
226
 
204
227
  If the provider is visible in the UI, update:
205
228
 
@@ -214,19 +237,25 @@ If the provider is visible in the UI, update:
214
237
  ```ts
215
238
  import { AbstractProvider } from '@/modules/providers/shared/base/abstract.provider.js';
216
239
  import { <Provider>ProviderAuth } from './<provider>-auth.provider.js';
240
+ import { <Provider>ProviderModels } from './<provider>-models.provider.js';
217
241
  import { <Provider>McpProvider } from './<provider>-mcp.provider.js';
242
+ import { <provider>Runtime } from './<provider>-runtime.provider.js';
218
243
  import { <Provider>SkillsProvider } from './<provider>-skills.provider.js';
219
244
  import { <Provider>SessionsProvider } from './<provider>-sessions.provider.js';
220
245
  import { <Provider>SessionSynchronizer } from './<provider>-session-synchronizer.provider.js';
221
246
  import type {
222
247
  IProviderAuth,
223
248
  IProviderMcp,
249
+ IProviderModels,
250
+ IProviderRuntime,
224
251
  IProviderSessionSynchronizer,
225
252
  IProviderSessions,
226
253
  IProviderSkills,
227
254
  } from '@/shared/interfaces.js';
228
255
 
229
256
  export class <Provider>Provider extends AbstractProvider {
257
+ readonly runtime: IProviderRuntime = <provider>Runtime;
258
+ readonly models: IProviderModels = new <Provider>ProviderModels();
230
259
  readonly auth: IProviderAuth = new <Provider>ProviderAuth();
231
260
  readonly mcp: IProviderMcp = new <Provider>McpProvider();
232
261
  readonly skills: IProviderSkills = new <Provider>SkillsProvider();
@@ -290,15 +319,17 @@ Add a new provider "<provider>" using the current provider module architecture.
290
319
 
291
320
  Requirements:
292
321
  1) Create:
293
- - server/modules/providers/list/<provider>/<provider>.provider.ts
322
+ - server/modules/providers/list/<provider>/<provider>.provider.ts
323
+ - server/modules/providers/list/<provider>/<provider>-runtime.provider.js
294
324
  - server/modules/providers/list/<provider>/<provider>-auth.provider.ts
325
+ - server/modules/providers/list/<provider>/<provider>-models.provider.ts
295
326
  - server/modules/providers/list/<provider>/<provider>-mcp.provider.ts
296
327
  - server/modules/providers/list/<provider>/<provider>-skills.provider.ts
297
328
  - server/modules/providers/list/<provider>/<provider>-sessions.provider.ts
298
329
  - server/modules/providers/list/<provider>/<provider>-session-synchronizer.provider.ts
299
330
  2) Register in:
300
- - server/modules/providers/provider.registry.ts
301
- - server/modules/providers/provider.routes.ts
331
+ - server/modules/providers/provider.registry.ts
332
+ - server/modules/providers/provider.routes.ts
302
333
  - server/shared/types.ts LLMProvider
303
334
  - src/types/app.ts LLMProvider
304
335
  3) Mirror the nearest existing provider implementation for file naming, style,
@@ -334,9 +365,10 @@ alongside the implementation.
334
365
 
335
366
  - Adding provider files but forgetting `provider.registry.ts` or
336
367
  `provider.routes.ts`.
368
+ - Adding a live runtime without exposing it from the provider wrapper.
337
369
  - Updating backend provider ids but not `src/types/app.ts` or the frontend
338
370
  provider constants.
339
- - Omitting `skills` or `sessionSynchronizer` from the wrapper.
371
+ - Omitting `runtime`, `skills`, or `sessionSynchronizer` from the wrapper.
340
372
  - Returning duplicate normalized message ids for split content.
341
373
  - Treating `limit === 0` as unbounded history.
342
374
  - Building file paths from raw session ids without validation.
@@ -1,6 +1,10 @@
1
1
  export { sessionSynchronizerService } from './services/session-synchronizer.service.js';
2
2
  export { providerSkillsService } from './services/skills.service.js';
3
3
  export { providerMcpService } from './services/mcp.service.js';
4
+ export { providerRuntimeService } from './services/provider-runtime.service.js';
5
+
6
+ // providerModelsService: used by Commands to list models and resolve the active session model.
7
+ export { providerModelsService } from './services/provider-models.service.js';
4
8
 
5
9
  export { initializeSessionsWatcher } from './services/sessions-watcher.service.js';
6
10
  export { closeSessionsWatcher } from './services/sessions-watcher.service.js';
@@ -100,6 +100,14 @@ export class ClaudeProviderAuth implements IProviderAuth {
100
100
  return { authenticated: true, email: 'Configured via settings.json', method: 'api_key' };
101
101
  }
102
102
 
103
+ if (process.env.CLAUDE_CODE_OAUTH_TOKEN?.trim()) {
104
+ return { authenticated: true, email: 'OAuth Token (long-lived)', method: 'environment' };
105
+ }
106
+
107
+ if (readOptionalString(settingsEnv.CLAUDE_CODE_OAUTH_TOKEN)) {
108
+ return { authenticated: true, email: 'OAuth Token (long-lived)', method: 'environment' };
109
+ }
110
+
103
111
  try {
104
112
  const credPath = path.join(os.homedir(), '.claude', '.credentials.json');
105
113
  const content = await readFile(credPath, 'utf8');
@@ -3,16 +3,11 @@ import { readFile } from 'node:fs/promises';
3
3
  import { sessionsDb } from '@/modules/database/index.js';
4
4
  import type { IProviderModels } from '@/shared/interfaces.js';
5
5
  import type {
6
- ProviderChangeActiveModelInput,
7
6
  ProviderCurrentActiveModel,
8
7
  ProviderModelOption,
9
8
  ProviderModelsDefinition,
10
- ProviderSessionActiveModelChange,
11
9
  } from '@/shared/types.js';
12
- import {
13
- buildDefaultProviderCurrentActiveModel,
14
- writeProviderSessionActiveModelChange,
15
- } from '@/shared/utils.js';
10
+ import { buildDefaultProviderCurrentActiveModel } from '@/shared/utils.js';
16
11
 
17
12
  export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
18
13
  OPTIONS: [
@@ -264,10 +259,4 @@ export class ClaudeProviderModels implements IProviderModels {
264
259
 
265
260
  return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
266
261
  }
267
-
268
- async changeActiveModel(
269
- input: ProviderChangeActiveModelInput,
270
- ): Promise<ProviderSessionActiveModelChange> {
271
- return writeProviderSessionActiveModelChange('claude', input);
272
- }
273
262
  }