@cloudcli-ai/cloudcli 1.36.3 → 1.37.1

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 (569) hide show
  1. package/dist/assets/index-D3jfzuKN.css +32 -0
  2. package/dist/assets/index-DTMWjJj8.js +1550 -0
  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 +91 -0
  64. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  65. package/dist-server/server/modules/database/index.js +3 -0
  66. package/dist-server/server/modules/database/index.js.map +1 -1
  67. package/dist-server/server/modules/database/migrations.js +31 -1
  68. package/dist-server/server/modules/database/migrations.js.map +1 -1
  69. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  70. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  71. package/dist-server/server/modules/database/repositories/sessions.db.js +76 -7
  72. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
  73. package/dist-server/server/modules/database/schema.js +29 -0
  74. package/dist-server/server/modules/database/schema.js.map +1 -1
  75. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  76. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  77. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -1
  78. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -1
  79. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +22 -0
  80. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -1
  81. package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
  82. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  83. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  84. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  85. package/dist-server/server/modules/file-tree/file-tree.service.js +576 -0
  86. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  87. package/dist-server/server/modules/file-tree/index.js +3 -0
  88. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  89. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  90. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  91. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +260 -0
  92. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  93. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  94. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  95. package/dist-server/server/modules/git/git.module.js +14 -0
  96. package/dist-server/server/modules/git/git.module.js.map +1 -0
  97. package/dist-server/server/modules/git/git.routes.js +1339 -0
  98. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  99. package/dist-server/server/modules/git/index.js +3 -0
  100. package/dist-server/server/modules/git/index.js.map +1 -0
  101. package/dist-server/server/modules/git/tests/git-init.routes.test.js +48 -0
  102. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  103. package/dist-server/server/{routes → modules/git/tests}/git.test.js +1 -1
  104. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  105. package/dist-server/server/modules/notifications/index.js +15 -1
  106. package/dist-server/server/modules/notifications/index.js.map +1 -1
  107. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  108. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  109. package/dist-server/server/{services/vapid-keys.js → modules/notifications/vapid-keys.service.js} +3 -2
  110. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  111. package/dist-server/server/modules/plugins/index.js +9 -0
  112. package/dist-server/server/modules/plugins/index.js.map +1 -0
  113. package/dist-server/server/{utils/plugin-process-manager.js → modules/plugins/plugin-process.service.js} +3 -2
  114. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  115. package/dist-server/server/{utils/plugin-loader.js → modules/plugins/plugin-registry.service.js} +2 -1
  116. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  117. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  118. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  119. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  120. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  121. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  122. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  123. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  124. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  125. package/dist-server/server/modules/projects/index.js +5 -0
  126. package/dist-server/server/modules/projects/index.js.map +1 -1
  127. package/dist-server/server/modules/providers/index.js +3 -0
  128. package/dist-server/server/modules/providers/index.js.map +1 -1
  129. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +6 -0
  130. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
  131. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +47 -18
  132. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
  133. package/dist-server/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +69 -55
  134. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
  135. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +6 -4
  136. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -1
  137. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +23 -4
  138. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -1
  139. package/dist-server/server/modules/providers/list/claude/claude.provider.js +2 -0
  140. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -1
  141. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +59 -75
  142. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
  143. package/dist-server/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +48 -34
  144. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  145. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +1 -54
  146. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
  147. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +290 -6
  148. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
  149. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +5 -0
  150. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -1
  151. package/dist-server/server/modules/providers/list/codex/codex.provider.js +2 -0
  152. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -1
  153. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +33 -673
  154. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
  155. package/dist-server/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +40 -28
  156. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  157. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +21 -14
  158. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -1
  159. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +2 -0
  160. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -1
  161. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +112 -333
  162. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
  163. package/dist-server/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +38 -25
  164. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  165. package/dist-server/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +27 -4
  166. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  167. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +0 -12
  168. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -1
  169. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +11 -5
  170. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -1
  171. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +2 -0
  172. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -1
  173. package/dist-server/server/modules/providers/provider.routes.js +169 -37
  174. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  175. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +5 -1
  176. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
  177. package/dist-server/server/modules/providers/services/provider-models.service.js +247 -184
  178. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  179. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  180. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  181. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
  182. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  183. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +12 -4
  184. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -1
  185. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +2 -0
  186. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
  187. package/dist-server/server/modules/providers/services/sessions.service.js +116 -3
  188. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
  189. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +2 -3
  190. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -1
  191. package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
  192. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  193. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
  194. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  195. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +76 -4
  196. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
  197. package/dist-server/server/modules/providers/tests/opencode-models.test.js +15 -126
  198. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
  199. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +5 -5
  200. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -1
  201. package/dist-server/server/modules/providers/tests/{provider-image-history.test.js → provider-attachment-history.test.js} +60 -2
  202. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  203. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +241 -271
  204. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
  205. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
  206. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  207. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +166 -0
  208. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  209. package/dist-server/server/modules/providers/tests/provider.routes.test.js +126 -0
  210. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  211. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  212. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  213. package/dist-server/server/modules/providers/tests/sessions.service.test.js +87 -0
  214. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  215. package/dist-server/server/modules/providers/tests/skills.test.js +4 -2
  216. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
  217. package/dist-server/server/modules/settings/index.js +3 -0
  218. package/dist-server/server/modules/settings/index.js.map +1 -0
  219. package/dist-server/server/modules/settings/settings.module.js +35 -0
  220. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  221. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  222. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  223. package/dist-server/server/modules/settings/settings.service.js +116 -0
  224. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  225. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  226. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  227. package/dist-server/server/modules/system/index.js +3 -0
  228. package/dist-server/server/modules/system/index.js.map +1 -0
  229. package/dist-server/server/modules/system/system.module.js +44 -0
  230. package/dist-server/server/modules/system/system.module.js.map +1 -0
  231. package/dist-server/server/modules/system/system.routes.js +16 -0
  232. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  233. package/dist-server/server/modules/system/system.service.js +45 -0
  234. package/dist-server/server/modules/system/system.service.js.map +1 -0
  235. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  236. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  237. package/dist-server/server/modules/taskmaster/index.js +3 -0
  238. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  239. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  240. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  241. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  242. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  243. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  244. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  245. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
  246. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  247. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  248. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  249. package/dist-server/server/modules/user/index.js +3 -0
  250. package/dist-server/server/modules/user/index.js.map +1 -0
  251. package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
  252. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  253. package/dist-server/server/modules/user/user.module.js +47 -0
  254. package/dist-server/server/modules/user/user.module.js.map +1 -0
  255. package/dist-server/server/modules/user/user.routes.js +44 -0
  256. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  257. package/dist-server/server/modules/user/user.service.js +59 -0
  258. package/dist-server/server/modules/user/user.service.js.map +1 -0
  259. package/dist-server/server/modules/voice/index.js +3 -0
  260. package/dist-server/server/modules/voice/index.js.map +1 -0
  261. package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
  262. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  263. package/dist-server/server/modules/voice/voice.module.js +44 -0
  264. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  265. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  266. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  267. package/dist-server/server/modules/voice/voice.service.js +148 -0
  268. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  269. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +2 -2
  270. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +44 -29
  271. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  272. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +76 -8
  273. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
  274. package/dist-server/server/modules/websocket/services/websocket-server.service.js +51 -20
  275. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
  276. package/dist-server/server/modules/websocket/tests/{chat-image-filter.test.js → chat-attachment-filter.test.js} +10 -3
  277. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  278. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +97 -0
  279. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  280. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  281. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  282. package/dist-server/server/modules/worktrees/index.js +3 -0
  283. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  284. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  285. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  286. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  287. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  288. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  289. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  290. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  291. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  292. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  293. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  294. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  295. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  296. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  297. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  298. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  299. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  300. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  301. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  302. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  303. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  304. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  305. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  306. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  307. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  308. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  309. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  310. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  311. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  312. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  313. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  314. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  315. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  316. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  317. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  318. package/dist-server/server/shared/image-attachments.js +90 -17
  319. package/dist-server/server/shared/image-attachments.js.map +1 -1
  320. package/dist-server/server/shared/tests/image-attachments.test.js +43 -1
  321. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -1
  322. package/dist-server/server/shared/utils.js +66 -142
  323. package/dist-server/server/shared/utils.js.map +1 -1
  324. package/package.json +9 -5
  325. package/server/index.ts +401 -0
  326. package/server/{load-env.js → load-env.ts} +18 -5
  327. package/server/modules/agent/agent.module.ts +51 -0
  328. package/server/modules/agent/agent.routes.ts +1287 -0
  329. package/server/modules/agent/index.ts +2 -0
  330. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  331. package/server/modules/assets/assets.routes.ts +63 -16
  332. package/server/modules/assets/index.ts +2 -2
  333. package/server/modules/assets/services/image-assets.service.ts +46 -1
  334. package/server/modules/assets/tests/image-assets.service.test.ts +28 -0
  335. package/server/{middleware/auth.js → modules/auth/auth.middleware.ts} +38 -7
  336. package/server/modules/auth/auth.module.ts +38 -0
  337. package/server/modules/auth/auth.routes.ts +57 -0
  338. package/server/modules/auth/auth.service.ts +155 -0
  339. package/server/modules/auth/index.ts +9 -0
  340. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  341. package/server/{browser-use-mcp.ts → modules/browser-use/browser-use-mcp.ts} +3 -1
  342. package/server/modules/browser-use/browser-use.service.ts +3 -4
  343. package/server/modules/browser-use/index.ts +8 -0
  344. package/server/modules/cli/cli.module.ts +96 -0
  345. package/server/modules/cli/cli.service.ts +281 -0
  346. package/server/modules/cli/cli.ts +13 -0
  347. package/server/modules/cli/index.ts +2 -0
  348. package/server/modules/cli/sandbox.service.ts +413 -0
  349. package/server/modules/cli/tests/cli.service.test.ts +91 -0
  350. package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
  351. package/server/modules/commands/commands.module.ts +22 -0
  352. package/server/{routes/commands.js → modules/commands/commands.routes.ts} +46 -38
  353. package/server/modules/commands/index.ts +2 -0
  354. package/server/modules/commands/tests/commands.test.ts +114 -0
  355. package/server/modules/database/index.ts +3 -0
  356. package/server/modules/database/migrations.ts +35 -0
  357. package/server/modules/database/repositories/provider-models.ts +168 -0
  358. package/server/modules/database/repositories/sessions.db.ts +103 -8
  359. package/server/modules/database/schema.ts +30 -0
  360. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  361. package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -1
  362. package/server/modules/database/tests/sessions.db.integration.test.ts +32 -0
  363. package/server/modules/file-tree/file-tree.module.ts +116 -0
  364. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  365. package/server/modules/file-tree/file-tree.service.ts +664 -0
  366. package/server/modules/file-tree/index.ts +2 -0
  367. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  368. package/server/modules/file-tree/tests/file-tree.service.test.ts +317 -0
  369. package/server/modules/git/git-parsing.service.ts +66 -0
  370. package/server/modules/git/git.module.ts +22 -0
  371. package/server/{routes/git.js → modules/git/git.routes.ts} +91 -132
  372. package/server/modules/git/index.ts +2 -0
  373. package/server/modules/git/tests/git-init.routes.test.ts +52 -0
  374. package/server/{routes/git.test.js → modules/git/tests/git.test.ts} +3 -3
  375. package/server/modules/notifications/index.ts +9 -0
  376. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  377. package/server/{services/vapid-keys.js → modules/notifications/vapid-keys.service.ts} +3 -1
  378. package/server/modules/plugins/index.ts +9 -0
  379. package/server/{utils/plugin-process-manager.js → modules/plugins/plugin-process.service.ts} +3 -1
  380. package/server/{utils/plugin-loader.js → modules/plugins/plugin-registry.service.ts} +1 -0
  381. package/server/modules/plugins/plugins.module.ts +33 -0
  382. package/server/modules/plugins/plugins.routes.ts +66 -0
  383. package/server/modules/plugins/plugins.service.ts +147 -0
  384. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  385. package/server/modules/projects/index.ts +5 -0
  386. package/server/modules/providers/README.md +41 -9
  387. package/server/modules/providers/index.ts +4 -0
  388. package/server/modules/providers/list/claude/claude-auth.provider.ts +8 -0
  389. package/server/modules/providers/list/claude/claude-models.provider.ts +47 -26
  390. package/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +73 -59
  391. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +6 -4
  392. package/server/modules/providers/list/claude/claude-sessions.provider.ts +27 -4
  393. package/server/modules/providers/list/claude/claude.provider.ts +3 -0
  394. package/server/modules/providers/list/codex/codex-models.provider.ts +58 -108
  395. package/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +54 -36
  396. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +1 -60
  397. package/server/modules/providers/list/codex/codex-sessions.provider.ts +331 -7
  398. package/server/modules/providers/list/codex/codex-skills.provider.ts +5 -0
  399. package/server/modules/providers/list/codex/codex.provider.ts +3 -0
  400. package/server/modules/providers/list/cursor/cursor-models.provider.ts +32 -719
  401. package/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +58 -27
  402. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +26 -15
  403. package/server/modules/providers/list/cursor/cursor.provider.ts +3 -0
  404. package/server/modules/providers/list/opencode/opencode-models.provider.ts +112 -423
  405. package/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +56 -28
  406. package/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +41 -3
  407. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +0 -13
  408. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +13 -5
  409. package/server/modules/providers/list/opencode/opencode.provider.ts +3 -0
  410. package/server/modules/providers/provider.routes.ts +228 -39
  411. package/server/modules/providers/services/provider-capabilities.service.ts +7 -1
  412. package/server/modules/providers/services/provider-models.service.ts +312 -269
  413. package/server/modules/providers/services/provider-runtime.service.ts +108 -0
  414. package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
  415. package/server/modules/providers/services/session-conversations-search.service.ts +12 -4
  416. package/server/modules/providers/services/sessions-watcher.service.ts +2 -0
  417. package/server/modules/providers/services/sessions.service.ts +166 -3
  418. package/server/modules/providers/shared/base/abstract.provider.ts +4 -3
  419. package/server/modules/providers/tests/claude-auth.test.ts +150 -0
  420. package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
  421. package/server/modules/providers/tests/codex-sessions.test.ts +83 -4
  422. package/server/modules/providers/tests/opencode-models.test.ts +34 -135
  423. package/server/modules/providers/tests/opencode-sessions.test.ts +5 -5
  424. package/server/modules/providers/tests/{provider-image-history.test.ts → provider-attachment-history.test.ts} +68 -1
  425. package/server/modules/providers/tests/provider-models.service.test.ts +300 -296
  426. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
  427. package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -0
  428. package/server/modules/providers/tests/provider.routes.test.ts +183 -0
  429. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  430. package/server/modules/providers/tests/sessions.service.test.ts +127 -0
  431. package/server/modules/providers/tests/skills.test.ts +9 -2
  432. package/server/modules/settings/index.ts +2 -0
  433. package/server/modules/settings/settings.module.ts +50 -0
  434. package/server/modules/settings/settings.routes.ts +51 -0
  435. package/server/modules/settings/settings.service.ts +186 -0
  436. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  437. package/server/modules/system/index.ts +2 -0
  438. package/server/modules/system/system.module.ts +62 -0
  439. package/server/modules/system/system.routes.ts +21 -0
  440. package/server/modules/system/system.service.ts +76 -0
  441. package/server/modules/system/tests/system.service.test.ts +118 -0
  442. package/server/modules/taskmaster/index.ts +2 -0
  443. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  444. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
  445. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  446. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
  447. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  448. package/server/modules/user/index.ts +2 -0
  449. package/server/modules/user/tests/user.service.test.ts +61 -0
  450. package/server/modules/user/user.module.ts +58 -0
  451. package/server/modules/user/user.routes.ts +50 -0
  452. package/server/modules/user/user.service.ts +85 -0
  453. package/server/modules/voice/index.ts +2 -0
  454. package/server/modules/voice/tests/voice.service.test.ts +98 -0
  455. package/server/modules/voice/voice.module.ts +47 -0
  456. package/server/modules/voice/voice.routes.ts +113 -0
  457. package/server/modules/voice/voice.service.ts +192 -0
  458. package/server/modules/websocket/README.md +7 -7
  459. package/server/modules/websocket/services/chat-session-writer.service.ts +2 -2
  460. package/server/modules/websocket/services/chat-websocket.service.ts +77 -61
  461. package/server/modules/websocket/services/shell-websocket.service.ts +88 -12
  462. package/server/modules/websocket/services/websocket-server.service.ts +63 -19
  463. package/server/modules/websocket/tests/{chat-image-filter.test.ts → chat-attachment-filter.test.ts} +17 -2
  464. package/server/modules/websocket/tests/shell-websocket.service.test.ts +119 -0
  465. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  466. package/server/modules/worktrees/index.ts +2 -0
  467. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  468. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  469. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  470. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  471. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  472. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  473. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  474. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  475. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  476. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  477. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  478. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  479. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  480. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  481. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  482. package/server/modules/worktrees/worktrees.module.ts +113 -0
  483. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  484. package/server/shared/image-attachments.ts +112 -18
  485. package/server/shared/interfaces.ts +33 -25
  486. package/server/shared/tests/image-attachments.test.ts +55 -0
  487. package/server/shared/types.ts +685 -36
  488. package/server/shared/utils.ts +77 -212
  489. package/dist/assets/index-CcCsKitq.js +0 -1423
  490. package/dist/assets/index-DLmhQ15L.css +0 -32
  491. package/dist-server/server/browser-use-mcp.js.map +0 -1
  492. package/dist-server/server/claude-sdk.js.map +0 -1
  493. package/dist-server/server/cli.js +0 -647
  494. package/dist-server/server/cli.js.map +0 -1
  495. package/dist-server/server/cursor-cli.js.map +0 -1
  496. package/dist-server/server/middleware/auth.js.map +0 -1
  497. package/dist-server/server/modules/providers/tests/provider-image-history.test.js.map +0 -1
  498. package/dist-server/server/modules/websocket/tests/chat-image-filter.test.js.map +0 -1
  499. package/dist-server/server/openai-codex.js.map +0 -1
  500. package/dist-server/server/opencode-cli.js.map +0 -1
  501. package/dist-server/server/opencode-cli.test.js.map +0 -1
  502. package/dist-server/server/routes/agent.js +0 -1155
  503. package/dist-server/server/routes/agent.js.map +0 -1
  504. package/dist-server/server/routes/auth.js +0 -119
  505. package/dist-server/server/routes/auth.js.map +0 -1
  506. package/dist-server/server/routes/commands.js +0 -492
  507. package/dist-server/server/routes/commands.js.map +0 -1
  508. package/dist-server/server/routes/cursor.js +0 -49
  509. package/dist-server/server/routes/cursor.js.map +0 -1
  510. package/dist-server/server/routes/git.js +0 -1389
  511. package/dist-server/server/routes/git.js.map +0 -1
  512. package/dist-server/server/routes/git.test.js.map +0 -1
  513. package/dist-server/server/routes/mcp-utils.js +0 -29
  514. package/dist-server/server/routes/mcp-utils.js.map +0 -1
  515. package/dist-server/server/routes/plugins.js +0 -266
  516. package/dist-server/server/routes/plugins.js.map +0 -1
  517. package/dist-server/server/routes/settings.js +0 -249
  518. package/dist-server/server/routes/settings.js.map +0 -1
  519. package/dist-server/server/routes/taskmaster.js +0 -1362
  520. package/dist-server/server/routes/taskmaster.js.map +0 -1
  521. package/dist-server/server/routes/tests/commands.test.js +0 -76
  522. package/dist-server/server/routes/tests/commands.test.js.map +0 -1
  523. package/dist-server/server/routes/user.js +0 -116
  524. package/dist-server/server/routes/user.js.map +0 -1
  525. package/dist-server/server/services/notification-orchestrator.js +0 -2
  526. package/dist-server/server/services/notification-orchestrator.js.map +0 -1
  527. package/dist-server/server/services/tests/notification-orchestrator.test.js +0 -64
  528. package/dist-server/server/services/tests/notification-orchestrator.test.js.map +0 -1
  529. package/dist-server/server/services/vapid-keys.js.map +0 -1
  530. package/dist-server/server/utils/colors.js +0 -20
  531. package/dist-server/server/utils/colors.js.map +0 -1
  532. package/dist-server/server/utils/commandParser.js +0 -255
  533. package/dist-server/server/utils/commandParser.js.map +0 -1
  534. package/dist-server/server/utils/gitConfig.js +0 -37
  535. package/dist-server/server/utils/gitConfig.js.map +0 -1
  536. package/dist-server/server/utils/mcp-detector.js +0 -134
  537. package/dist-server/server/utils/mcp-detector.js.map +0 -1
  538. package/dist-server/server/utils/plugin-loader.js.map +0 -1
  539. package/dist-server/server/utils/plugin-process-manager.js.map +0 -1
  540. package/dist-server/server/utils/runtime-paths.js +0 -30
  541. package/dist-server/server/utils/runtime-paths.js.map +0 -1
  542. package/dist-server/server/utils/taskmaster-websocket.js +0 -124
  543. package/dist-server/server/utils/taskmaster-websocket.js.map +0 -1
  544. package/dist-server/server/utils/url-detection.js +0 -58
  545. package/dist-server/server/utils/url-detection.js.map +0 -1
  546. package/dist-server/server/voice-proxy.js +0 -226
  547. package/dist-server/server/voice-proxy.js.map +0 -1
  548. package/server/cli.js +0 -695
  549. package/server/index.js +0 -1651
  550. package/server/routes/agent.js +0 -1257
  551. package/server/routes/auth.js +0 -137
  552. package/server/routes/cursor.js +0 -52
  553. package/server/routes/mcp-utils.js +0 -31
  554. package/server/routes/plugins.js +0 -307
  555. package/server/routes/settings.js +0 -282
  556. package/server/routes/taskmaster.js +0 -1470
  557. package/server/routes/tests/commands.test.js +0 -82
  558. package/server/routes/user.js +0 -124
  559. package/server/services/notification-orchestrator.js +0 -7
  560. package/server/services/tests/notification-orchestrator.test.js +0 -80
  561. package/server/utils/colors.js +0 -21
  562. package/server/utils/commandParser.js +0 -305
  563. package/server/utils/gitConfig.js +0 -35
  564. package/server/utils/mcp-detector.js +0 -147
  565. package/server/utils/runtime-paths.js +0 -37
  566. package/server/utils/taskmaster-websocket.js +0 -135
  567. package/server/utils/url-detection.js +0 -71
  568. package/server/voice-proxy.js +0 -224
  569. /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,23 +3,18 @@ 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
- export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
12
+ export const CLAUDE_PREDEFINED_MODELS: ProviderModelsDefinition = {
18
13
  OPTIONS: [
19
14
  {
20
15
  value: 'default',
21
16
  label: 'Default (recommended)',
22
- description: 'Use the Claude Code default model (currently Sonnet 4.6)',
17
+ description: 'Use the recommended model for your Claude account and deployment.',
23
18
  effort: {
24
19
  default: 'high',
25
20
  values: [
@@ -30,10 +25,25 @@ export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
30
25
  ],
31
26
  },
32
27
  },
28
+ {
29
+ value: 'best',
30
+ label: 'Best available',
31
+ description: 'Use Fable 5 when available, otherwise the latest Opus model.',
32
+ effort: {
33
+ default: 'high',
34
+ values: [
35
+ { value: 'low' },
36
+ { value: 'medium' },
37
+ { value: 'high' },
38
+ { value: 'xhigh' },
39
+ { value: 'max' },
40
+ ],
41
+ },
42
+ },
33
43
  {
34
44
  value: 'fable',
35
- label: 'Fable',
36
- description: 'Fable 5 · Most capable for your hardest and longest-running tasks · Uses your limits ~2× faster than Opus',
45
+ label: 'Fable 5',
46
+ description: 'Most capable Claude model for the hardest, longest-running tasks.',
37
47
  effort: {
38
48
  default: 'high',
39
49
  values: [
@@ -46,15 +56,16 @@ export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
46
56
  },
47
57
  },
48
58
  {
49
- value: "sonnet",
50
- label: "Sonnet",
51
- description: "Sonnet 4.6 · Best for everyday tasks · $3/$15 per Mtok",
59
+ value: 'sonnet',
60
+ label: 'Sonnet',
61
+ description: 'Latest Sonnet model for everyday coding tasks.',
52
62
  effort: {
53
63
  default: 'high',
54
64
  values: [
55
65
  { value: 'low' },
56
66
  { value: 'medium' },
57
67
  { value: 'high' },
68
+ { value: 'xhigh' },
58
69
  { value: 'max' },
59
70
  ],
60
71
  },
@@ -62,13 +73,14 @@ export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
62
73
  {
63
74
  value: 'sonnet[1m]',
64
75
  label: 'Sonnet (1M context)',
65
- description: 'Sonnet 4.6 for long sessions · $3/$15 per Mtok',
76
+ description: 'Latest Sonnet model with a 1M context window.',
66
77
  effort: {
67
78
  default: 'high',
68
79
  values: [
69
80
  { value: 'low' },
70
81
  { value: 'medium' },
71
82
  { value: 'high' },
83
+ { value: 'xhigh' },
72
84
  { value: 'max' },
73
85
  ],
74
86
  },
@@ -76,7 +88,7 @@ export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
76
88
  {
77
89
  value: 'opus',
78
90
  label: 'Opus',
79
- description: 'Opus 4.8 · Best for everyday, complex tasks · ~2× usage vs Sonnet',
91
+ description: 'Latest Opus model for complex reasoning and coding tasks.',
80
92
  effort: {
81
93
  default: 'high',
82
94
  values: [
@@ -90,8 +102,8 @@ export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
90
102
  },
91
103
  {
92
104
  value: 'opus[1m]',
93
- label: 'Opus 4.8 (1M context)',
94
- description: 'Opus 4.8 with 1M context · Most capable for complex work · $5/$25 per Mtok',
105
+ label: 'Opus (1M context)',
106
+ description: 'Latest Opus model with a 1M context window.',
95
107
  effort: {
96
108
  default: 'high',
97
109
  values: [
@@ -106,7 +118,22 @@ export const CLAUDE_FALLBACK_MODELS: ProviderModelsDefinition = {
106
118
  {
107
119
  value: 'haiku',
108
120
  label: 'Haiku',
109
- description: 'Haiku 4.5 · Fastest for quick answers · $1/$5 per Mtok',
121
+ description: 'Fast and efficient Claude model for simple tasks.',
122
+ },
123
+ {
124
+ value: 'opusplan',
125
+ label: 'Opus Plan',
126
+ description: 'Use Opus while planning, then switch to Sonnet for execution.',
127
+ effort: {
128
+ default: 'high',
129
+ values: [
130
+ { value: 'low' },
131
+ { value: 'medium' },
132
+ { value: 'high' },
133
+ { value: 'xhigh' },
134
+ { value: 'max' },
135
+ ],
136
+ },
110
137
  },
111
138
  ],
112
139
  DEFAULT: 'default',
@@ -118,7 +145,7 @@ export const findClaudeModelOption = (model: string | undefined | null): Provide
118
145
  return null;
119
146
  }
120
147
 
121
- return CLAUDE_FALLBACK_MODELS.OPTIONS.find((option) => option.value === normalizedModel) ?? null;
148
+ return CLAUDE_PREDEFINED_MODELS.OPTIONS.find((option) => option.value === normalizedModel) ?? null;
122
149
  };
123
150
  type ClaudeInitEvent = {
124
151
  sessionId?: string;
@@ -242,7 +269,7 @@ export class ClaudeProviderModels implements IProviderModels {
242
269
  // const supportedModels = await queryInstance.supportedModels();
243
270
  // queryInstance.close();
244
271
  // return buildClaudeModelsDefinition(supportedModels);
245
- return CLAUDE_FALLBACK_MODELS;
272
+ return CLAUDE_PREDEFINED_MODELS;
246
273
  }
247
274
 
248
275
  async getCurrentActiveModel(sessionId?: string): Promise<ProviderCurrentActiveModel> {
@@ -264,10 +291,4 @@ export class ClaudeProviderModels implements IProviderModels {
264
291
 
265
292
  return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
266
293
  }
267
-
268
- async changeActiveModel(
269
- input: ProviderChangeActiveModelInput,
270
- ): Promise<ProviderSessionActiveModelChange> {
271
- return writeProviderSessionActiveModelChange('claude', input);
272
- }
273
294
  }