@cloudcli-ai/cloudcli 1.36.3 → 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 (535) hide show
  1. package/dist/assets/index-DSlds633.css +32 -0
  2. package/dist/assets/{index-CcCsKitq.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-sessions.provider.js +290 -6
  138. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
  139. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +5 -0
  140. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -1
  141. package/dist-server/server/modules/providers/list/codex/codex.provider.js +2 -0
  142. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -1
  143. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +1 -4
  144. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
  145. package/dist-server/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +40 -28
  146. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  147. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +21 -14
  148. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -1
  149. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +2 -0
  150. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -1
  151. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +7 -5
  152. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
  153. package/dist-server/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +38 -25
  154. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  155. package/dist-server/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +27 -4
  156. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  157. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +11 -5
  158. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -1
  159. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +2 -0
  160. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -1
  161. package/dist-server/server/modules/providers/provider.routes.js +33 -9
  162. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  163. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +5 -1
  164. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
  165. package/dist-server/server/modules/providers/services/provider-models.service.js +110 -15
  166. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  167. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  168. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  169. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
  170. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  171. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +2 -0
  172. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
  173. package/dist-server/server/modules/providers/services/sessions.service.js +54 -0
  174. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
  175. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +2 -3
  176. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -1
  177. package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
  178. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  179. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
  180. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  181. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +36 -0
  182. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
  183. package/dist-server/server/modules/providers/tests/{provider-image-history.test.js → provider-attachment-history.test.js} +60 -2
  184. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  185. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +148 -61
  186. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
  187. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +130 -0
  188. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  189. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +165 -0
  190. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  191. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  192. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  193. package/dist-server/server/modules/providers/tests/skills.test.js +4 -2
  194. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
  195. package/dist-server/server/modules/settings/index.js +3 -0
  196. package/dist-server/server/modules/settings/index.js.map +1 -0
  197. package/dist-server/server/modules/settings/settings.module.js +35 -0
  198. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  199. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  200. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  201. package/dist-server/server/modules/settings/settings.service.js +116 -0
  202. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  203. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  204. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  205. package/dist-server/server/modules/system/index.js +3 -0
  206. package/dist-server/server/modules/system/index.js.map +1 -0
  207. package/dist-server/server/modules/system/system.module.js +44 -0
  208. package/dist-server/server/modules/system/system.module.js.map +1 -0
  209. package/dist-server/server/modules/system/system.routes.js +16 -0
  210. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  211. package/dist-server/server/modules/system/system.service.js +45 -0
  212. package/dist-server/server/modules/system/system.service.js.map +1 -0
  213. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  214. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  215. package/dist-server/server/modules/taskmaster/index.js +3 -0
  216. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  217. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  218. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  219. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  220. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  221. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  222. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  223. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
  224. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  225. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  226. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  227. package/dist-server/server/modules/user/index.js +3 -0
  228. package/dist-server/server/modules/user/index.js.map +1 -0
  229. package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
  230. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  231. package/dist-server/server/modules/user/user.module.js +47 -0
  232. package/dist-server/server/modules/user/user.module.js.map +1 -0
  233. package/dist-server/server/modules/user/user.routes.js +44 -0
  234. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  235. package/dist-server/server/modules/user/user.service.js +59 -0
  236. package/dist-server/server/modules/user/user.service.js.map +1 -0
  237. package/dist-server/server/modules/voice/index.js +3 -0
  238. package/dist-server/server/modules/voice/index.js.map +1 -0
  239. package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
  240. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  241. package/dist-server/server/modules/voice/voice.module.js +44 -0
  242. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  243. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  244. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  245. package/dist-server/server/modules/voice/voice.service.js +148 -0
  246. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  247. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +2 -2
  248. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +40 -29
  249. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  250. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +76 -8
  251. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
  252. package/dist-server/server/modules/websocket/services/websocket-server.service.js +51 -20
  253. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
  254. package/dist-server/server/modules/websocket/tests/{chat-image-filter.test.js → chat-attachment-filter.test.js} +10 -3
  255. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  256. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +97 -0
  257. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  258. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  259. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  260. package/dist-server/server/modules/worktrees/index.js +3 -0
  261. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  262. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  263. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  264. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  265. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  266. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  267. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  268. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  269. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  270. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  271. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  272. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  273. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  274. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  275. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  276. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  277. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  278. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  279. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  280. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  281. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  282. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  283. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  284. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  285. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  286. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  287. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  288. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  289. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  290. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  291. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  292. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  293. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  294. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  295. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  296. package/dist-server/server/shared/image-attachments.js +90 -17
  297. package/dist-server/server/shared/image-attachments.js.map +1 -1
  298. package/dist-server/server/shared/tests/image-attachments.test.js +43 -1
  299. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -1
  300. package/dist-server/server/shared/utils.js +66 -142
  301. package/dist-server/server/shared/utils.js.map +1 -1
  302. package/package.json +8 -4
  303. package/server/index.ts +401 -0
  304. package/server/{load-env.js → load-env.ts} +18 -5
  305. package/server/modules/agent/agent.module.ts +51 -0
  306. package/server/modules/agent/agent.routes.ts +1287 -0
  307. package/server/modules/agent/index.ts +2 -0
  308. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  309. package/server/modules/assets/assets.routes.ts +63 -16
  310. package/server/modules/assets/index.ts +2 -2
  311. package/server/modules/assets/services/image-assets.service.ts +46 -1
  312. package/server/modules/assets/tests/image-assets.service.test.ts +28 -0
  313. package/server/{middleware/auth.js → modules/auth/auth.middleware.ts} +38 -7
  314. package/server/modules/auth/auth.module.ts +38 -0
  315. package/server/modules/auth/auth.routes.ts +57 -0
  316. package/server/modules/auth/auth.service.ts +155 -0
  317. package/server/modules/auth/index.ts +9 -0
  318. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  319. package/server/{browser-use-mcp.ts → modules/browser-use/browser-use-mcp.ts} +3 -1
  320. package/server/modules/browser-use/browser-use.service.ts +3 -4
  321. package/server/modules/browser-use/index.ts +8 -0
  322. package/server/modules/cli/cli.module.ts +96 -0
  323. package/server/modules/cli/cli.service.ts +281 -0
  324. package/server/modules/cli/cli.ts +13 -0
  325. package/server/modules/cli/index.ts +2 -0
  326. package/server/modules/cli/sandbox.service.ts +413 -0
  327. package/server/modules/cli/tests/cli.service.test.ts +91 -0
  328. package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
  329. package/server/modules/commands/commands.module.ts +22 -0
  330. package/server/{routes/commands.js → modules/commands/commands.routes.ts} +44 -36
  331. package/server/modules/commands/index.ts +2 -0
  332. package/server/modules/commands/tests/commands.test.ts +119 -0
  333. package/server/modules/database/index.ts +1 -0
  334. package/server/modules/database/migrations.ts +15 -0
  335. package/server/modules/database/repositories/sessions.db.ts +19 -1
  336. package/server/modules/database/schema.ts +4 -0
  337. package/server/modules/file-tree/file-tree.module.ts +112 -0
  338. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  339. package/server/modules/file-tree/file-tree.service.ts +616 -0
  340. package/server/modules/file-tree/index.ts +2 -0
  341. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  342. package/server/modules/file-tree/tests/file-tree.service.test.ts +220 -0
  343. package/server/modules/git/git-parsing.service.ts +66 -0
  344. package/server/modules/git/git.module.ts +22 -0
  345. package/server/{routes/git.js → modules/git/git.routes.ts} +91 -132
  346. package/server/modules/git/index.ts +2 -0
  347. package/server/modules/git/tests/git-init.routes.test.ts +52 -0
  348. package/server/{routes/git.test.js → modules/git/tests/git.test.ts} +3 -3
  349. package/server/modules/notifications/index.ts +9 -0
  350. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  351. package/server/{services/vapid-keys.js → modules/notifications/vapid-keys.service.ts} +3 -1
  352. package/server/modules/plugins/index.ts +9 -0
  353. package/server/{utils/plugin-process-manager.js → modules/plugins/plugin-process.service.ts} +3 -1
  354. package/server/{utils/plugin-loader.js → modules/plugins/plugin-registry.service.ts} +1 -0
  355. package/server/modules/plugins/plugins.module.ts +33 -0
  356. package/server/modules/plugins/plugins.routes.ts +66 -0
  357. package/server/modules/plugins/plugins.service.ts +147 -0
  358. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  359. package/server/modules/projects/index.ts +5 -0
  360. package/server/modules/providers/README.md +41 -9
  361. package/server/modules/providers/index.ts +4 -0
  362. package/server/modules/providers/list/claude/claude-auth.provider.ts +8 -0
  363. package/server/modules/providers/list/claude/claude-models.provider.ts +1 -12
  364. package/server/{claude-sdk.js → modules/providers/list/claude/claude-runtime.provider.js} +66 -44
  365. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +6 -4
  366. package/server/modules/providers/list/claude/claude-sessions.provider.ts +27 -4
  367. package/server/modules/providers/list/claude/claude.provider.ts +3 -0
  368. package/server/modules/providers/list/codex/codex-models.provider.ts +0 -9
  369. package/server/{openai-codex.js → modules/providers/list/codex/codex-runtime.provider.js} +54 -36
  370. package/server/modules/providers/list/codex/codex-sessions.provider.ts +331 -7
  371. package/server/modules/providers/list/codex/codex-skills.provider.ts +5 -0
  372. package/server/modules/providers/list/codex/codex.provider.ts +3 -0
  373. package/server/modules/providers/list/cursor/cursor-models.provider.ts +0 -9
  374. package/server/{cursor-cli.js → modules/providers/list/cursor/cursor-runtime.provider.js} +58 -27
  375. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +26 -15
  376. package/server/modules/providers/list/cursor/cursor.provider.ts +3 -0
  377. package/server/modules/providers/list/opencode/opencode-models.provider.ts +7 -10
  378. package/server/{opencode-cli.js → modules/providers/list/opencode/opencode-runtime.provider.js} +56 -28
  379. package/server/{opencode-cli.test.js → modules/providers/list/opencode/opencode-runtime.provider.test.js} +41 -3
  380. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +13 -5
  381. package/server/modules/providers/list/opencode/opencode.provider.ts +3 -0
  382. package/server/modules/providers/provider.routes.ts +47 -10
  383. package/server/modules/providers/services/provider-capabilities.service.ts +7 -1
  384. package/server/modules/providers/services/provider-models.service.ts +131 -23
  385. package/server/modules/providers/services/provider-runtime.service.ts +109 -0
  386. package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
  387. package/server/modules/providers/services/sessions-watcher.service.ts +2 -0
  388. package/server/modules/providers/services/sessions.service.ts +79 -0
  389. package/server/modules/providers/shared/base/abstract.provider.ts +4 -3
  390. package/server/modules/providers/tests/claude-auth.test.ts +150 -0
  391. package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
  392. package/server/modules/providers/tests/codex-sessions.test.ts +40 -0
  393. package/server/modules/providers/tests/{provider-image-history.test.ts → provider-attachment-history.test.ts} +68 -1
  394. package/server/modules/providers/tests/provider-models.service.test.ts +450 -349
  395. package/server/modules/providers/tests/provider-runtime.service.test.ts +142 -0
  396. package/server/modules/providers/tests/provider-token-usage.service.test.ts +185 -0
  397. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  398. package/server/modules/providers/tests/skills.test.ts +9 -2
  399. package/server/modules/settings/index.ts +2 -0
  400. package/server/modules/settings/settings.module.ts +50 -0
  401. package/server/modules/settings/settings.routes.ts +51 -0
  402. package/server/modules/settings/settings.service.ts +186 -0
  403. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  404. package/server/modules/system/index.ts +2 -0
  405. package/server/modules/system/system.module.ts +62 -0
  406. package/server/modules/system/system.routes.ts +21 -0
  407. package/server/modules/system/system.service.ts +76 -0
  408. package/server/modules/system/tests/system.service.test.ts +118 -0
  409. package/server/modules/taskmaster/index.ts +2 -0
  410. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  411. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
  412. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  413. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
  414. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  415. package/server/modules/user/index.ts +2 -0
  416. package/server/modules/user/tests/user.service.test.ts +61 -0
  417. package/server/modules/user/user.module.ts +58 -0
  418. package/server/modules/user/user.routes.ts +50 -0
  419. package/server/modules/user/user.service.ts +85 -0
  420. package/server/modules/voice/index.ts +2 -0
  421. package/server/modules/voice/tests/voice.service.test.ts +98 -0
  422. package/server/modules/voice/voice.module.ts +47 -0
  423. package/server/modules/voice/voice.routes.ts +113 -0
  424. package/server/modules/voice/voice.service.ts +192 -0
  425. package/server/modules/websocket/README.md +7 -7
  426. package/server/modules/websocket/services/chat-session-writer.service.ts +2 -2
  427. package/server/modules/websocket/services/chat-websocket.service.ts +73 -61
  428. package/server/modules/websocket/services/shell-websocket.service.ts +88 -12
  429. package/server/modules/websocket/services/websocket-server.service.ts +63 -19
  430. package/server/modules/websocket/tests/{chat-image-filter.test.ts → chat-attachment-filter.test.ts} +17 -2
  431. package/server/modules/websocket/tests/shell-websocket.service.test.ts +119 -0
  432. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  433. package/server/modules/worktrees/index.ts +2 -0
  434. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  435. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  436. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  437. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  438. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  439. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  440. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  441. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  442. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  443. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  444. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  445. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  446. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  447. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  448. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  449. package/server/modules/worktrees/worktrees.module.ts +113 -0
  450. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  451. package/server/shared/image-attachments.ts +112 -18
  452. package/server/shared/interfaces.ts +29 -19
  453. package/server/shared/tests/image-attachments.test.ts +55 -0
  454. package/server/shared/types.ts +658 -21
  455. package/server/shared/utils.ts +77 -212
  456. package/dist/assets/index-DLmhQ15L.css +0 -32
  457. package/dist-server/server/browser-use-mcp.js.map +0 -1
  458. package/dist-server/server/claude-sdk.js.map +0 -1
  459. package/dist-server/server/cli.js +0 -647
  460. package/dist-server/server/cli.js.map +0 -1
  461. package/dist-server/server/cursor-cli.js.map +0 -1
  462. package/dist-server/server/middleware/auth.js.map +0 -1
  463. package/dist-server/server/modules/providers/tests/provider-image-history.test.js.map +0 -1
  464. package/dist-server/server/modules/websocket/tests/chat-image-filter.test.js.map +0 -1
  465. package/dist-server/server/openai-codex.js.map +0 -1
  466. package/dist-server/server/opencode-cli.js.map +0 -1
  467. package/dist-server/server/opencode-cli.test.js.map +0 -1
  468. package/dist-server/server/routes/agent.js +0 -1155
  469. package/dist-server/server/routes/agent.js.map +0 -1
  470. package/dist-server/server/routes/auth.js +0 -119
  471. package/dist-server/server/routes/auth.js.map +0 -1
  472. package/dist-server/server/routes/commands.js +0 -492
  473. package/dist-server/server/routes/commands.js.map +0 -1
  474. package/dist-server/server/routes/cursor.js +0 -49
  475. package/dist-server/server/routes/cursor.js.map +0 -1
  476. package/dist-server/server/routes/git.js +0 -1389
  477. package/dist-server/server/routes/git.js.map +0 -1
  478. package/dist-server/server/routes/git.test.js.map +0 -1
  479. package/dist-server/server/routes/mcp-utils.js +0 -29
  480. package/dist-server/server/routes/mcp-utils.js.map +0 -1
  481. package/dist-server/server/routes/plugins.js +0 -266
  482. package/dist-server/server/routes/plugins.js.map +0 -1
  483. package/dist-server/server/routes/settings.js +0 -249
  484. package/dist-server/server/routes/settings.js.map +0 -1
  485. package/dist-server/server/routes/taskmaster.js +0 -1362
  486. package/dist-server/server/routes/taskmaster.js.map +0 -1
  487. package/dist-server/server/routes/tests/commands.test.js +0 -76
  488. package/dist-server/server/routes/tests/commands.test.js.map +0 -1
  489. package/dist-server/server/routes/user.js +0 -116
  490. package/dist-server/server/routes/user.js.map +0 -1
  491. package/dist-server/server/services/notification-orchestrator.js +0 -2
  492. package/dist-server/server/services/notification-orchestrator.js.map +0 -1
  493. package/dist-server/server/services/tests/notification-orchestrator.test.js +0 -64
  494. package/dist-server/server/services/tests/notification-orchestrator.test.js.map +0 -1
  495. package/dist-server/server/services/vapid-keys.js.map +0 -1
  496. package/dist-server/server/utils/colors.js +0 -20
  497. package/dist-server/server/utils/colors.js.map +0 -1
  498. package/dist-server/server/utils/commandParser.js +0 -255
  499. package/dist-server/server/utils/commandParser.js.map +0 -1
  500. package/dist-server/server/utils/gitConfig.js +0 -37
  501. package/dist-server/server/utils/gitConfig.js.map +0 -1
  502. package/dist-server/server/utils/mcp-detector.js +0 -134
  503. package/dist-server/server/utils/mcp-detector.js.map +0 -1
  504. package/dist-server/server/utils/plugin-loader.js.map +0 -1
  505. package/dist-server/server/utils/plugin-process-manager.js.map +0 -1
  506. package/dist-server/server/utils/runtime-paths.js +0 -30
  507. package/dist-server/server/utils/runtime-paths.js.map +0 -1
  508. package/dist-server/server/utils/taskmaster-websocket.js +0 -124
  509. package/dist-server/server/utils/taskmaster-websocket.js.map +0 -1
  510. package/dist-server/server/utils/url-detection.js +0 -58
  511. package/dist-server/server/utils/url-detection.js.map +0 -1
  512. package/dist-server/server/voice-proxy.js +0 -226
  513. package/dist-server/server/voice-proxy.js.map +0 -1
  514. package/server/cli.js +0 -695
  515. package/server/index.js +0 -1651
  516. package/server/routes/agent.js +0 -1257
  517. package/server/routes/auth.js +0 -137
  518. package/server/routes/cursor.js +0 -52
  519. package/server/routes/mcp-utils.js +0 -31
  520. package/server/routes/plugins.js +0 -307
  521. package/server/routes/settings.js +0 -282
  522. package/server/routes/taskmaster.js +0 -1470
  523. package/server/routes/tests/commands.test.js +0 -82
  524. package/server/routes/user.js +0 -124
  525. package/server/services/notification-orchestrator.js +0 -7
  526. package/server/services/tests/notification-orchestrator.test.js +0 -80
  527. package/server/utils/colors.js +0 -21
  528. package/server/utils/commandParser.js +0 -305
  529. package/server/utils/gitConfig.js +0 -35
  530. package/server/utils/mcp-detector.js +0 -147
  531. package/server/utils/runtime-paths.js +0 -37
  532. package/server/utils/taskmaster-websocket.js +0 -135
  533. package/server/utils/url-detection.js +0 -71
  534. package/server/voice-proxy.js +0 -224
  535. /package/server/constants/{config.js → config.ts} +0 -0
@@ -19,19 +19,20 @@ import path from 'path';
19
19
 
20
20
  import { query } from '@anthropic-ai/claude-agent-sdk';
21
21
 
22
- import { buildClaudeUserContent, normalizeImageDescriptors } from './shared/image-attachments.js';
23
- import { CLAUDE_FALLBACK_MODELS } from './modules/providers/list/claude/claude-models.provider.js';
24
- import { providerModelsService } from './modules/providers/services/provider-models.service.js';
25
- import { resolveClaudeCodeExecutablePath } from './shared/claude-cli-path.js';
22
+ import {
23
+ appendFilesInputTag,
24
+ buildClaudeUserContent,
25
+ normalizeImageDescriptors
26
+ } from '@/shared/image-attachments.js';
27
+ import { CLAUDE_FALLBACK_MODELS } from '@/modules/providers/list/claude/claude-models.provider.js';
28
+ import { resolveClaudeCodeExecutablePath } from '@/shared/claude-cli-path.js';
26
29
  import {
27
30
  createNotificationEvent,
28
31
  notifyRunFailed,
29
32
  notifyRunStopped,
30
33
  notifyUserIfEnabled
31
- } from './services/notification-orchestrator.js';
32
- import { sessionsService } from './modules/providers/services/sessions.service.js';
33
- import { providerAuthService } from './modules/providers/services/provider-auth.service.js';
34
- import { createCompleteMessage, createNormalizedMessage } from './shared/utils.js';
34
+ } from '@/modules/notifications/index.js';
35
+ import { createCompleteMessage, createNormalizedMessage } from '@/shared/utils.js';
35
36
 
36
37
  const activeSessions = new Map();
37
38
  const pendingToolApprovals = new Map();
@@ -158,7 +159,7 @@ function matchesToolPermission(entry, toolName, input) {
158
159
  }
159
160
 
160
161
  function mapCliOptionsToSDK(options = {}) {
161
- const { sessionId, cwd, toolsSettings, permissionMode, effort } = options;
162
+ const { providerSessionId, cwd, toolsSettings, permissionMode, effort } = options;
162
163
 
163
164
  const sdkOptions = {};
164
165
 
@@ -226,8 +227,9 @@ function mapCliOptionsToSDK(options = {}) {
226
227
 
227
228
  sdkOptions.settingSources = ['project', 'user', 'local'];
228
229
 
229
- if (sessionId) {
230
- sdkOptions.resume = sessionId;
230
+ // The SDK resumes with the provider-native session id, never the app id.
231
+ if (providerSessionId) {
232
+ sdkOptions.resume = providerSessionId;
231
233
  }
232
234
 
233
235
  return sdkOptions;
@@ -371,15 +373,17 @@ function extractTokenBudget(sdkMessage) {
371
373
  *
372
374
  * @param {string} command - User prompt
373
375
  * @param {Array} images - Image descriptors ({ path, name?, mimeType? })
374
- * @param {string} cwd - Project working directory image paths resolve against
376
+ * @param {Array} files - Non-image attachment descriptors
377
+ * @param {string} cwd - Project working directory attachment paths resolve against
375
378
  * @returns {Promise<string|AsyncIterable>} SDK prompt payload
376
379
  */
377
- async function buildPromptPayload(command, images, cwd) {
380
+ async function buildPromptPayload(command, images, files, cwd) {
381
+ const promptWithFiles = appendFilesInputTag(command, files);
378
382
  if (normalizeImageDescriptors(images).length === 0) {
379
- return command;
383
+ return promptWithFiles;
380
384
  }
381
385
 
382
- const content = await buildClaudeUserContent(command, images, cwd);
386
+ const content = await buildClaudeUserContent(promptWithFiles, images, cwd);
383
387
  return (async function* () {
384
388
  yield {
385
389
  type: 'user',
@@ -455,12 +459,21 @@ async function loadMcpConfig(cwd) {
455
459
  * @param {string} command - User prompt/command
456
460
  * @param {Object} options - Query options
457
461
  * @param {Object} ws - WebSocket connection
462
+ * @param {Object} context - Provider-scoped model, session, and auth lookups
458
463
  * @returns {Promise<void>}
459
464
  */
460
- async function queryClaudeSDK(command, options = {}, ws) {
465
+ async function queryClaudeSDK(command, options = {}, ws, context) {
461
466
  const { sessionId, sessionSummary } = options;
462
- let capturedSessionId = sessionId;
467
+ // Callers pass the stable app session id; the SDK only understands the
468
+ // provider-native id recorded on the session row.
469
+ const providerSessionId = context.resolveProviderSessionId(sessionId);
470
+ // Provider-native id as the SDK reports it (starts as the resume id, or is
471
+ // captured from the stream for brand-new sessions).
472
+ let capturedSessionId = providerSessionId;
463
473
  let sessionCreatedSent = false;
474
+ // Process-map key: the app session id when the caller supplied one, else
475
+ // the provider-native id once captured (legacy/direct API callers).
476
+ const sessionKey = () => sessionId || capturedSessionId || null;
464
477
 
465
478
  const emitNotification = (event) => {
466
479
  notifyUserIfEnabled({
@@ -471,20 +484,17 @@ async function queryClaudeSDK(command, options = {}, ws) {
471
484
  };
472
485
 
473
486
  try {
474
- const resolvedModel = await providerModelsService.resolveResumeModel(
475
- 'claude',
476
- sessionId,
477
- options.model,
478
- );
487
+ const resolvedModel = await context.resolveResumeModel(sessionId, options.model);
479
488
  let effortModels = CLAUDE_FALLBACK_MODELS;
480
489
  try {
481
- effortModels = (await providerModelsService.getProviderModels('claude')).models;
490
+ effortModels = await context.getProviderModels();
482
491
  } catch (error) {
483
492
  console.warn('[Claude SDK] Unable to load provider models for effort validation:', error);
484
493
  }
485
494
 
486
495
  const sdkOptions = mapCliOptionsToSDK({
487
496
  ...options,
497
+ providerSessionId,
488
498
  model: resolvedModel || options.model,
489
499
  effortModels,
490
500
  });
@@ -497,22 +507,23 @@ async function queryClaudeSDK(command, options = {}, ws) {
497
507
  // Turns with image attachments switch to streaming input so the images
498
508
  // ride along as real content blocks. Built per query attempt because an
499
509
  // async generator cannot be replayed once consumed.
500
- const createPrompt = () => buildPromptPayload(command, options.images, options.cwd);
510
+ const createPrompt = () => buildPromptPayload(command, options.images, options.files, options.cwd);
501
511
 
502
512
  sdkOptions.hooks = {
503
513
  Notification: [{
504
514
  matcher: '',
505
515
  hooks: [async (input) => {
506
516
  const message = typeof input?.message === 'string' ? input.message : 'Claude requires your attention.';
517
+ // Notifications are app-facing, so they carry the app session id.
507
518
  emitNotification(createNotificationEvent({
508
519
  provider: 'claude',
509
- sessionId: capturedSessionId || sessionId || null,
520
+ sessionId: sessionId || capturedSessionId || null,
510
521
  kind: 'action_required',
511
522
  code: 'agent.notification',
512
523
  meta: { message, sessionName: sessionSummary },
513
524
  severity: 'warning',
514
525
  requiresUserAction: true,
515
- dedupeKey: `claude:hook:notification:${capturedSessionId || sessionId || 'none'}:${message}`
526
+ dedupeKey: `claude:hook:notification:${sessionId || capturedSessionId || 'none'}:${message}`
516
527
  }));
517
528
  return {};
518
529
  }]
@@ -552,20 +563,22 @@ async function queryClaudeSDK(command, options = {}, ws) {
552
563
  ws.send(createNormalizedMessage({ kind: 'permission_request', requestId, toolName, input, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
553
564
  emitNotification(createNotificationEvent({
554
565
  provider: 'claude',
555
- sessionId: capturedSessionId || sessionId || null,
566
+ sessionId: sessionId || capturedSessionId || null,
556
567
  kind: 'action_required',
557
568
  code: 'permission.required',
558
569
  meta: { toolName, sessionName: sessionSummary },
559
570
  severity: 'warning',
560
571
  requiresUserAction: true,
561
- dedupeKey: `claude:permission:${capturedSessionId || sessionId || 'none'}:${requestId}`
572
+ dedupeKey: `claude:permission:${sessionId || capturedSessionId || 'none'}:${requestId}`
562
573
  }));
563
574
 
564
575
  const decision = await waitForToolApproval(requestId, {
565
576
  timeoutMs: requiresInteraction ? 0 : undefined,
566
577
  signal: context?.signal,
567
578
  metadata: {
568
- _sessionId: capturedSessionId || sessionId || null,
579
+ // Keyed by the app session id so `chat.subscribe` can look pending
580
+ // approvals up directly; provider id only for legacy callers.
581
+ _sessionId: sessionId || capturedSessionId || null,
569
582
  _toolName: toolName,
570
583
  _input: input,
571
584
  _receivedAt: new Date(),
@@ -626,8 +639,8 @@ async function queryClaudeSDK(command, options = {}, ws) {
626
639
  }
627
640
 
628
641
  // Track the query instance for abort capability
629
- if (capturedSessionId) {
630
- addSession(capturedSessionId, queryInstance, ws);
642
+ if (sessionKey()) {
643
+ addSession(sessionKey(), queryInstance, ws);
631
644
  }
632
645
 
633
646
  // Process streaming messages
@@ -637,15 +650,15 @@ async function queryClaudeSDK(command, options = {}, ws) {
637
650
  if (message.session_id && !capturedSessionId) {
638
651
 
639
652
  capturedSessionId = message.session_id;
640
- addSession(capturedSessionId, queryInstance, ws);
653
+ addSession(sessionKey(), queryInstance, ws);
641
654
 
642
655
  // Set session ID on writer
643
656
  if (ws.setSessionId && typeof ws.setSessionId === 'function') {
644
657
  ws.setSessionId(capturedSessionId);
645
658
  }
646
659
 
647
- // Send session-created event only once for new sessions
648
- if (!sessionId && !sessionCreatedSent) {
660
+ // Send session-created event only once for sessions with nothing to resume
661
+ if (!providerSessionId && !sessionCreatedSent) {
649
662
  sessionCreatedSent = true;
650
663
  ws.send(createNormalizedMessage({ kind: 'session_created', newSessionId: capturedSessionId, sessionId: capturedSessionId, provider: 'claude' }));
651
664
  }
@@ -658,7 +671,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
658
671
  const sid = capturedSessionId || sessionId || null;
659
672
 
660
673
  // Use adapter to normalize SDK events into NormalizedMessage[]
661
- const normalized = sessionsService.normalizeMessage('claude', transformedMessage, sid);
674
+ const normalized = context.normalizeMessage(transformedMessage, sid);
662
675
  for (const msg of normalized) {
663
676
  // Preserve parentToolUseId from SDK wrapper for subagent tool grouping
664
677
  if (transformedMessage.parentToolUseId && !msg.parentToolUseId) {
@@ -675,20 +688,20 @@ async function queryClaudeSDK(command, options = {}, ws) {
675
688
  }
676
689
 
677
690
  // Clean up session on completion
678
- if (capturedSessionId) {
679
- removeSession(capturedSessionId);
691
+ if (sessionKey()) {
692
+ removeSession(sessionKey());
680
693
  }
681
694
 
682
695
  // Send the terminal completion event — skipped for aborted runs, whose
683
696
  // terminal `complete` (aborted: true) was already sent by abort-session.
684
- const wasAborted = capturedSessionId ? abortedSessionIds.delete(capturedSessionId) : false;
697
+ const wasAborted = sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
685
698
  if (!wasAborted) {
686
699
  ws.send(createCompleteMessage({ provider: 'claude', sessionId: capturedSessionId || sessionId || null, exitCode: 0 }));
687
700
  }
688
701
  notifyRunStopped({
689
702
  userId: ws?.userId || null,
690
703
  provider: 'claude',
691
- sessionId: capturedSessionId || sessionId || null,
704
+ sessionId: sessionId || capturedSessionId || null,
692
705
  sessionName: sessionSummary,
693
706
  stopReason: wasAborted ? 'aborted' : 'completed'
694
707
  });
@@ -698,11 +711,11 @@ async function queryClaudeSDK(command, options = {}, ws) {
698
711
  console.error('SDK query error:', error);
699
712
 
700
713
  // Clean up session on error
701
- if (capturedSessionId) {
702
- removeSession(capturedSessionId);
714
+ if (sessionKey()) {
715
+ removeSession(sessionKey());
703
716
  }
704
717
 
705
- const wasAborted = capturedSessionId ? abortedSessionIds.delete(capturedSessionId) : false;
718
+ const wasAborted = sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
706
719
  if (wasAborted) {
707
720
  // The abort already produced the terminal complete; a generator throw
708
721
  // caused by interrupt() is expected noise, not a user-facing error.
@@ -710,7 +723,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
710
723
  }
711
724
 
712
725
  // Check if Claude CLI is installed for a clearer error message
713
- const installed = await providerAuthService.isProviderInstalled('claude');
726
+ const installed = await context.isProviderInstalled();
714
727
  const errorContent = !installed
715
728
  ? 'Claude Code is not installed. Please install it first: https://docs.anthropic.com/en/docs/claude-code'
716
729
  : error.message;
@@ -721,7 +734,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
721
734
  notifyRunFailed({
722
735
  userId: ws?.userId || null,
723
736
  provider: 'claude',
724
- sessionId: capturedSessionId || sessionId || null,
737
+ sessionId: sessionId || capturedSessionId || null,
725
738
  sessionName: sessionSummary,
726
739
  error
727
740
  });
@@ -821,6 +834,15 @@ function reconnectSessionWriter(sessionId, newRawWs) {
821
834
  return true;
822
835
  }
823
836
 
837
+ export const claudeRuntime = {
838
+ run: queryClaudeSDK,
839
+ abort: abortClaudeSDKSession,
840
+ permissions: {
841
+ resolve: resolveToolApproval,
842
+ listPending: getPendingApprovalsForSession,
843
+ },
844
+ };
845
+
824
846
  // Export public API
825
847
  export {
826
848
  queryClaudeSDK,
@@ -26,10 +26,11 @@ export class ClaudeSessionSynchronizer implements IProviderSessionSynchronizer {
26
26
  private readonly claudeHome = path.join(os.homedir(), '.claude');
27
27
 
28
28
  /**
29
- * Returns true when a JSONL file is a subagent transcript rather than a
30
- * top-level session.
29
+ * Returns true when a JSONL file is a subagent transcript or tool result
30
+ * rather than a top-level session.
31
31
  *
32
- * Claude stores subagent transcripts under a `subagents/` directory, e.g.
32
+ * Claude stores subagent transcripts under a `subagents/` directory and
33
+ * tool results under a `tool-results/` directory, e.g.
33
34
  * `~/.claude/projects/<encoded-cwd>/<session-id>/subagents/agent-<id>.jsonl`.
34
35
  * Those files repeat the parent session's `sessionId`, so indexing them as
35
36
  * standalone sessions overwrites the parent row's `jsonl_path` and corrupts
@@ -37,7 +38,8 @@ export class ClaudeSessionSynchronizer implements IProviderSessionSynchronizer {
37
38
  * them, so both entry points must skip them.
38
39
  */
39
40
  private isSubagentTranscript(filePath: string): boolean {
40
- return path.normalize(filePath).split(path.sep).includes('subagents');
41
+ const pathParts = path.normalize(filePath).split(path.sep);
42
+ return pathParts.includes('subagents') || pathParts.includes('tool-results');
41
43
  }
42
44
 
43
45
  /**
@@ -5,6 +5,7 @@ import readline from 'node:readline';
5
5
 
6
6
  import type { IProviderSessions } from '@/shared/interfaces.js';
7
7
  import type { AnyRecord, FetchHistoryOptions, FetchHistoryResult, NormalizedMessage } from '@/shared/types.js';
8
+ import { parseFilesInputTag } from '@/shared/image-attachments.js';
8
9
  import { createNormalizedMessage, generateMessageId, readObjectRecord, sliceTailPage } from '@/shared/utils.js';
9
10
  import { sessionsDb } from '@/modules/database/index.js';
10
11
 
@@ -211,11 +212,19 @@ async function getSessionMessages(
211
212
  * - local command payloads (`<command-name>...`) and stdout wrappers
212
213
  * (`<local-command-stdout>...`) should be remapped into normal chat messages
213
214
  * instead of being discarded as internal content
215
+ *
216
+ * Skill bodies belong in the first group. When a skill is invoked, Claude
217
+ * injects the entire SKILL.md as a synthetic user turn. Persisted transcripts
218
+ * tag it `isMeta: true`, but the live SDK stream does not, so without a
219
+ * content-level check the same payload renders as a huge user bubble during the
220
+ * run and then vanishes on reload. The skill is already represented by the
221
+ * `Skill` tool call, so it is never user-visible content.
214
222
  */
215
223
  const INTERNAL_CONTENT_PREFIXES = [
216
224
  '<system-reminder>',
217
225
  'Caveat:',
218
226
  '[Request interrupted',
227
+ 'Base directory for this skill:',
219
228
  ] as const;
220
229
 
221
230
  function isInternalContent(content: string): boolean {
@@ -324,6 +333,7 @@ export class ClaudeSessionsProvider implements IProviderSessions {
324
333
  }
325
334
  }
326
335
  let imagesAttached = false;
336
+ let filesAttached = false;
327
337
 
328
338
  for (let partIndex = 0; partIndex < raw.message.content.length; partIndex++) {
329
339
  const part = raw.message.content[partIndex];
@@ -342,7 +352,11 @@ export class ClaudeSessionsProvider implements IProviderSessions {
342
352
  }));
343
353
  } else if (part.type === 'text') {
344
354
  const text = part.text || '';
345
- if (text && !isInternalContent(text)) {
355
+ const parsedFiles = parseFilesInputTag(text);
356
+ if (
357
+ (parsedFiles.text || parsedFiles.attachments.length > 0)
358
+ && !isInternalContent(parsedFiles.text)
359
+ ) {
346
360
  messages.push(createNormalizedMessage({
347
361
  id: `${baseId}_text_${partIndex}`,
348
362
  sessionId,
@@ -350,10 +364,14 @@ export class ClaudeSessionsProvider implements IProviderSessions {
350
364
  provider: PROVIDER,
351
365
  kind: 'text',
352
366
  role: 'user',
353
- content: text,
367
+ content: parsedFiles.text,
354
368
  images: !imagesAttached && imageAttachments.length > 0 ? imageAttachments : undefined,
369
+ files: !filesAttached && parsedFiles.attachments.length > 0
370
+ ? parsedFiles.attachments
371
+ : undefined,
355
372
  }));
356
373
  imagesAttached = true;
374
+ filesAttached = filesAttached || parsedFiles.attachments.length > 0;
357
375
  }
358
376
  }
359
377
  }
@@ -468,7 +486,11 @@ export class ClaudeSessionsProvider implements IProviderSessions {
468
486
  return messages;
469
487
  }
470
488
 
471
- if (text && !isInternalContent(text)) {
489
+ const parsedFiles = parseFilesInputTag(text);
490
+ if (
491
+ (parsedFiles.text || parsedFiles.attachments.length > 0)
492
+ && !isInternalContent(parsedFiles.text)
493
+ ) {
472
494
  messages.push(createNormalizedMessage({
473
495
  id: baseId,
474
496
  sessionId,
@@ -476,7 +498,8 @@ export class ClaudeSessionsProvider implements IProviderSessions {
476
498
  provider: PROVIDER,
477
499
  kind: 'text',
478
500
  role: 'user',
479
- content: text,
501
+ content: parsedFiles.text,
502
+ files: parsedFiles.attachments.length > 0 ? parsedFiles.attachments : undefined,
480
503
  }));
481
504
  }
482
505
  }
@@ -1,6 +1,7 @@
1
1
  import { AbstractProvider } from '@/modules/providers/shared/base/abstract.provider.js';
2
2
  import { ClaudeProviderAuth } from '@/modules/providers/list/claude/claude-auth.provider.js';
3
3
  import { ClaudeProviderModels } from '@/modules/providers/list/claude/claude-models.provider.js';
4
+ import { claudeRuntime } from '@/modules/providers/list/claude/claude-runtime.provider.js';
4
5
  import { ClaudeMcpProvider } from '@/modules/providers/list/claude/claude-mcp.provider.js';
5
6
  import { ClaudeSessionSynchronizer } from '@/modules/providers/list/claude/claude-session-synchronizer.provider.js';
6
7
  import { ClaudeSessionsProvider } from '@/modules/providers/list/claude/claude-sessions.provider.js';
@@ -8,12 +9,14 @@ import { ClaudeSkillsProvider } from '@/modules/providers/list/claude/claude-ski
8
9
  import type {
9
10
  IProviderAuth,
10
11
  IProviderModels,
12
+ IProviderRuntime,
11
13
  IProviderSessionSynchronizer,
12
14
  IProviderSkills,
13
15
  IProviderSessions,
14
16
  } from '@/shared/interfaces.js';
15
17
 
16
18
  export class ClaudeProvider extends AbstractProvider {
19
+ readonly runtime: IProviderRuntime = claudeRuntime;
17
20
  readonly models: IProviderModels = new ClaudeProviderModels();
18
21
  readonly mcp = new ClaudeMcpProvider();
19
22
  readonly auth: IProviderAuth = new ClaudeProviderAuth();
@@ -6,17 +6,14 @@ import TOML from '@iarna/toml';
6
6
 
7
7
  import type { IProviderModels } from '@/shared/interfaces.js';
8
8
  import type {
9
- ProviderChangeActiveModelInput,
10
9
  ProviderCurrentActiveModel,
11
10
  ProviderModelOption,
12
11
  ProviderModelsDefinition,
13
- ProviderSessionActiveModelChange,
14
12
  } from '@/shared/types.js';
15
13
  import {
16
14
  buildDefaultProviderCurrentActiveModel,
17
15
  readObjectRecord,
18
16
  readOptionalString,
19
- writeProviderSessionActiveModelChange,
20
17
  } from '@/shared/utils.js';
21
18
 
22
19
  export const CODEX_FALLBACK_MODELS: ProviderModelsDefinition = {
@@ -164,10 +161,4 @@ export class CodexProviderModels implements IProviderModels {
164
161
  return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
165
162
  }
166
163
  }
167
-
168
- async changeActiveModel(
169
- input: ProviderChangeActiveModelInput,
170
- ): Promise<ProviderSessionActiveModelChange> {
171
- return writeProviderSessionActiveModelChange('codex', input);
172
- }
173
164
  }