@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
@@ -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_PREDEFINED_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();
@@ -44,7 +45,7 @@ const TOOL_APPROVAL_TIMEOUT_MS = parseInt(process.env.CLAUDE_TOOL_APPROVAL_TIMEO
44
45
 
45
46
  const TOOLS_REQUIRING_INTERACTION = new Set(['AskUserQuestion', 'ExitPlanMode']);
46
47
 
47
- function resolveClaudeEffort(model, effort, modelsDefinition = CLAUDE_FALLBACK_MODELS) {
48
+ function resolveClaudeEffort(model, effort, modelsDefinition = CLAUDE_PREDEFINED_MODELS) {
48
49
  const selectedModel = modelsDefinition?.OPTIONS?.find((option) => option.value === model) || null;
49
50
  const allowedEfforts = selectedModel?.effort?.values
50
51
  ?.map((value) => value.value) || [];
@@ -158,12 +159,15 @@ 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
 
165
166
  // Forward all host env vars (e.g. ANTHROPIC_BASE_URL) to the subprocess.
166
167
  // Since SDK 0.2.113, options.env replaces process.env instead of overlaying it.
168
+ // This snapshot is also how CLI-side knobs reach the child: e.g. how long the CLI waits for
169
+ // still-running background agents after a turn ends is set by CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS
170
+ // (default 600000 ms; 0 = wait indefinitely) on this server's own environment.
167
171
  sdkOptions.env = { ...process.env };
168
172
 
169
173
  // Resolve the executable eagerly on Windows because the SDK uses raw child_process.spawn,
@@ -208,12 +212,12 @@ function mapCliOptionsToSDK(options = {}) {
208
212
 
209
213
  sdkOptions.disallowedTools = settings.disallowedTools || [];
210
214
 
211
- sdkOptions.model = options.model || CLAUDE_FALLBACK_MODELS.DEFAULT;
215
+ sdkOptions.model = options.model || CLAUDE_PREDEFINED_MODELS.DEFAULT;
212
216
 
213
217
  const resolvedEffort = resolveClaudeEffort(
214
218
  sdkOptions.model,
215
219
  effort,
216
- options.effortModels || CLAUDE_FALLBACK_MODELS,
220
+ options.effortModels || CLAUDE_PREDEFINED_MODELS,
217
221
  );
218
222
  if (resolvedEffort) {
219
223
  sdkOptions.effort = resolvedEffort;
@@ -226,8 +230,9 @@ function mapCliOptionsToSDK(options = {}) {
226
230
 
227
231
  sdkOptions.settingSources = ['project', 'user', 'local'];
228
232
 
229
- if (sessionId) {
230
- sdkOptions.resume = sessionId;
233
+ // The SDK resumes with the provider-native session id, never the app id.
234
+ if (providerSessionId) {
235
+ sdkOptions.resume = providerSessionId;
231
236
  }
232
237
 
233
238
  return sdkOptions;
@@ -371,15 +376,17 @@ function extractTokenBudget(sdkMessage) {
371
376
  *
372
377
  * @param {string} command - User prompt
373
378
  * @param {Array} images - Image descriptors ({ path, name?, mimeType? })
374
- * @param {string} cwd - Project working directory image paths resolve against
379
+ * @param {Array} files - Non-image attachment descriptors
380
+ * @param {string} cwd - Project working directory attachment paths resolve against
375
381
  * @returns {Promise<string|AsyncIterable>} SDK prompt payload
376
382
  */
377
- async function buildPromptPayload(command, images, cwd) {
383
+ async function buildPromptPayload(command, images, files, cwd) {
384
+ const promptWithFiles = appendFilesInputTag(command, files);
378
385
  if (normalizeImageDescriptors(images).length === 0) {
379
- return command;
386
+ return promptWithFiles;
380
387
  }
381
388
 
382
- const content = await buildClaudeUserContent(command, images, cwd);
389
+ const content = await buildClaudeUserContent(promptWithFiles, images, cwd);
383
390
  return (async function* () {
384
391
  yield {
385
392
  type: 'user',
@@ -455,12 +462,21 @@ async function loadMcpConfig(cwd) {
455
462
  * @param {string} command - User prompt/command
456
463
  * @param {Object} options - Query options
457
464
  * @param {Object} ws - WebSocket connection
465
+ * @param {Object} context - Provider-scoped model, session, and auth lookups
458
466
  * @returns {Promise<void>}
459
467
  */
460
- async function queryClaudeSDK(command, options = {}, ws) {
468
+ async function queryClaudeSDK(command, options = {}, ws, context) {
461
469
  const { sessionId, sessionSummary } = options;
462
- let capturedSessionId = sessionId;
470
+ // Callers pass the stable app session id; the SDK only understands the
471
+ // provider-native id recorded on the session row.
472
+ const providerSessionId = context.resolveProviderSessionId(sessionId);
473
+ // Provider-native id as the SDK reports it (starts as the resume id, or is
474
+ // captured from the stream for brand-new sessions).
475
+ let capturedSessionId = providerSessionId;
463
476
  let sessionCreatedSent = false;
477
+ // Process-map key: the app session id when the caller supplied one, else
478
+ // the provider-native id once captured (legacy/direct API callers).
479
+ const sessionKey = () => sessionId || capturedSessionId || null;
464
480
 
465
481
  const emitNotification = (event) => {
466
482
  notifyUserIfEnabled({
@@ -471,20 +487,17 @@ async function queryClaudeSDK(command, options = {}, ws) {
471
487
  };
472
488
 
473
489
  try {
474
- const resolvedModel = await providerModelsService.resolveResumeModel(
475
- 'claude',
476
- sessionId,
477
- options.model,
478
- );
479
- let effortModels = CLAUDE_FALLBACK_MODELS;
490
+ const resolvedModel = await context.resolveResumeModel(sessionId, options.model);
491
+ let effortModels = CLAUDE_PREDEFINED_MODELS;
480
492
  try {
481
- effortModels = (await providerModelsService.getProviderModels('claude')).models;
493
+ effortModels = await context.getProviderModels();
482
494
  } catch (error) {
483
495
  console.warn('[Claude SDK] Unable to load provider models for effort validation:', error);
484
496
  }
485
497
 
486
498
  const sdkOptions = mapCliOptionsToSDK({
487
499
  ...options,
500
+ providerSessionId,
488
501
  model: resolvedModel || options.model,
489
502
  effortModels,
490
503
  });
@@ -497,22 +510,23 @@ async function queryClaudeSDK(command, options = {}, ws) {
497
510
  // Turns with image attachments switch to streaming input so the images
498
511
  // ride along as real content blocks. Built per query attempt because an
499
512
  // async generator cannot be replayed once consumed.
500
- const createPrompt = () => buildPromptPayload(command, options.images, options.cwd);
513
+ const createPrompt = () => buildPromptPayload(command, options.images, options.files, options.cwd);
501
514
 
502
515
  sdkOptions.hooks = {
503
516
  Notification: [{
504
517
  matcher: '',
505
518
  hooks: [async (input) => {
506
519
  const message = typeof input?.message === 'string' ? input.message : 'Claude requires your attention.';
520
+ // Notifications are app-facing, so they carry the app session id.
507
521
  emitNotification(createNotificationEvent({
508
522
  provider: 'claude',
509
- sessionId: capturedSessionId || sessionId || null,
523
+ sessionId: sessionId || capturedSessionId || null,
510
524
  kind: 'action_required',
511
525
  code: 'agent.notification',
512
526
  meta: { message, sessionName: sessionSummary },
513
527
  severity: 'warning',
514
528
  requiresUserAction: true,
515
- dedupeKey: `claude:hook:notification:${capturedSessionId || sessionId || 'none'}:${message}`
529
+ dedupeKey: `claude:hook:notification:${sessionId || capturedSessionId || 'none'}:${message}`
516
530
  }));
517
531
  return {};
518
532
  }]
@@ -552,20 +566,22 @@ async function queryClaudeSDK(command, options = {}, ws) {
552
566
  ws.send(createNormalizedMessage({ kind: 'permission_request', requestId, toolName, input, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
553
567
  emitNotification(createNotificationEvent({
554
568
  provider: 'claude',
555
- sessionId: capturedSessionId || sessionId || null,
569
+ sessionId: sessionId || capturedSessionId || null,
556
570
  kind: 'action_required',
557
571
  code: 'permission.required',
558
572
  meta: { toolName, sessionName: sessionSummary },
559
573
  severity: 'warning',
560
574
  requiresUserAction: true,
561
- dedupeKey: `claude:permission:${capturedSessionId || sessionId || 'none'}:${requestId}`
575
+ dedupeKey: `claude:permission:${sessionId || capturedSessionId || 'none'}:${requestId}`
562
576
  }));
563
577
 
564
578
  const decision = await waitForToolApproval(requestId, {
565
579
  timeoutMs: requiresInteraction ? 0 : undefined,
566
580
  signal: context?.signal,
567
581
  metadata: {
568
- _sessionId: capturedSessionId || sessionId || null,
582
+ // Keyed by the app session id so `chat.subscribe` can look pending
583
+ // approvals up directly; provider id only for legacy callers.
584
+ _sessionId: sessionId || capturedSessionId || null,
569
585
  _toolName: toolName,
570
586
  _input: input,
571
587
  _receivedAt: new Date(),
@@ -597,10 +613,6 @@ async function queryClaudeSDK(command, options = {}, ws) {
597
613
  return { behavior: 'deny', message: decision.message ?? 'User denied tool use' };
598
614
  };
599
615
 
600
- // Query constructor reads this synchronously.
601
- const prevStreamTimeout = process.env.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT;
602
- process.env.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT = '300000';
603
-
604
616
  let queryInstance;
605
617
  try {
606
618
  queryInstance = query({
@@ -618,16 +630,9 @@ async function queryClaudeSDK(command, options = {}, ws) {
618
630
  });
619
631
  }
620
632
 
621
- // Restore immediately — Query constructor already captured the value
622
- if (prevStreamTimeout !== undefined) {
623
- process.env.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT = prevStreamTimeout;
624
- } else {
625
- delete process.env.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT;
626
- }
627
-
628
633
  // Track the query instance for abort capability
629
- if (capturedSessionId) {
630
- addSession(capturedSessionId, queryInstance, ws);
634
+ if (sessionKey()) {
635
+ addSession(sessionKey(), queryInstance, ws);
631
636
  }
632
637
 
633
638
  // Process streaming messages
@@ -637,15 +642,15 @@ async function queryClaudeSDK(command, options = {}, ws) {
637
642
  if (message.session_id && !capturedSessionId) {
638
643
 
639
644
  capturedSessionId = message.session_id;
640
- addSession(capturedSessionId, queryInstance, ws);
645
+ addSession(sessionKey(), queryInstance, ws);
641
646
 
642
647
  // Set session ID on writer
643
648
  if (ws.setSessionId && typeof ws.setSessionId === 'function') {
644
649
  ws.setSessionId(capturedSessionId);
645
650
  }
646
651
 
647
- // Send session-created event only once for new sessions
648
- if (!sessionId && !sessionCreatedSent) {
652
+ // Send session-created event only once for sessions with nothing to resume
653
+ if (!providerSessionId && !sessionCreatedSent) {
649
654
  sessionCreatedSent = true;
650
655
  ws.send(createNormalizedMessage({ kind: 'session_created', newSessionId: capturedSessionId, sessionId: capturedSessionId, provider: 'claude' }));
651
656
  }
@@ -658,7 +663,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
658
663
  const sid = capturedSessionId || sessionId || null;
659
664
 
660
665
  // Use adapter to normalize SDK events into NormalizedMessage[]
661
- const normalized = sessionsService.normalizeMessage('claude', transformedMessage, sid);
666
+ const normalized = context.normalizeMessage(transformedMessage, sid);
662
667
  for (const msg of normalized) {
663
668
  // Preserve parentToolUseId from SDK wrapper for subagent tool grouping
664
669
  if (transformedMessage.parentToolUseId && !msg.parentToolUseId) {
@@ -675,20 +680,20 @@ async function queryClaudeSDK(command, options = {}, ws) {
675
680
  }
676
681
 
677
682
  // Clean up session on completion
678
- if (capturedSessionId) {
679
- removeSession(capturedSessionId);
683
+ if (sessionKey()) {
684
+ removeSession(sessionKey());
680
685
  }
681
686
 
682
687
  // Send the terminal completion event — skipped for aborted runs, whose
683
688
  // terminal `complete` (aborted: true) was already sent by abort-session.
684
- const wasAborted = capturedSessionId ? abortedSessionIds.delete(capturedSessionId) : false;
689
+ const wasAborted = sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
685
690
  if (!wasAborted) {
686
691
  ws.send(createCompleteMessage({ provider: 'claude', sessionId: capturedSessionId || sessionId || null, exitCode: 0 }));
687
692
  }
688
693
  notifyRunStopped({
689
694
  userId: ws?.userId || null,
690
695
  provider: 'claude',
691
- sessionId: capturedSessionId || sessionId || null,
696
+ sessionId: sessionId || capturedSessionId || null,
692
697
  sessionName: sessionSummary,
693
698
  stopReason: wasAborted ? 'aborted' : 'completed'
694
699
  });
@@ -698,11 +703,11 @@ async function queryClaudeSDK(command, options = {}, ws) {
698
703
  console.error('SDK query error:', error);
699
704
 
700
705
  // Clean up session on error
701
- if (capturedSessionId) {
702
- removeSession(capturedSessionId);
706
+ if (sessionKey()) {
707
+ removeSession(sessionKey());
703
708
  }
704
709
 
705
- const wasAborted = capturedSessionId ? abortedSessionIds.delete(capturedSessionId) : false;
710
+ const wasAborted = sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
706
711
  if (wasAborted) {
707
712
  // The abort already produced the terminal complete; a generator throw
708
713
  // caused by interrupt() is expected noise, not a user-facing error.
@@ -710,7 +715,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
710
715
  }
711
716
 
712
717
  // Check if Claude CLI is installed for a clearer error message
713
- const installed = await providerAuthService.isProviderInstalled('claude');
718
+ const installed = await context.isProviderInstalled();
714
719
  const errorContent = !installed
715
720
  ? 'Claude Code is not installed. Please install it first: https://docs.anthropic.com/en/docs/claude-code'
716
721
  : error.message;
@@ -721,7 +726,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
721
726
  notifyRunFailed({
722
727
  userId: ws?.userId || null,
723
728
  provider: 'claude',
724
- sessionId: capturedSessionId || sessionId || null,
729
+ sessionId: sessionId || capturedSessionId || null,
725
730
  sessionName: sessionSummary,
726
731
  error
727
732
  });
@@ -821,6 +826,15 @@ function reconnectSessionWriter(sessionId, newRawWs) {
821
826
  return true;
822
827
  }
823
828
 
829
+ export const claudeRuntime = {
830
+ run: queryClaudeSDK,
831
+ abort: abortClaudeSDKSession,
832
+ permissions: {
833
+ resolve: resolveToolApproval,
834
+ listPending: getPendingApprovalsForSession,
835
+ },
836
+ };
837
+
824
838
  // Export public API
825
839
  export {
826
840
  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();