@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
@@ -6,24 +6,69 @@ 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
- ProviderModelOption,
12
10
  ProviderModelsDefinition,
13
- ProviderSessionActiveModelChange,
14
11
  } from '@/shared/types.js';
15
12
  import {
16
13
  buildDefaultProviderCurrentActiveModel,
17
14
  readObjectRecord,
18
15
  readOptionalString,
19
- writeProviderSessionActiveModelChange,
20
16
  } from '@/shared/utils.js';
21
17
 
22
- export const CODEX_FALLBACK_MODELS: ProviderModelsDefinition = {
18
+ /** Curated Codex catalog shipped as immutable CloudCLI defaults. */
19
+ export const CODEX_PREDEFINED_MODELS: ProviderModelsDefinition = {
23
20
  OPTIONS: [
21
+ {
22
+ value: 'gpt-5.6-sol',
23
+ label: 'GPT-5.6 Sol',
24
+ description: 'Latest frontier agentic coding model.',
25
+ effort: {
26
+ default: 'low',
27
+ values: [
28
+ { value: 'low' },
29
+ { value: 'medium' },
30
+ { value: 'high' },
31
+ { value: 'xhigh' },
32
+ { value: 'max' },
33
+ { value: 'ultra' },
34
+ ],
35
+ },
36
+ },
37
+ {
38
+ value: 'gpt-5.6-terra',
39
+ label: 'GPT-5.6 Terra',
40
+ description: 'Balanced agentic coding model for everyday work.',
41
+ effort: {
42
+ default: 'medium',
43
+ values: [
44
+ { value: 'low' },
45
+ { value: 'medium' },
46
+ { value: 'high' },
47
+ { value: 'xhigh' },
48
+ { value: 'max' },
49
+ { value: 'ultra' },
50
+ ],
51
+ },
52
+ },
53
+ {
54
+ value: 'gpt-5.6-luna',
55
+ label: 'GPT-5.6 Luna',
56
+ description: 'Fast and affordable agentic coding model.',
57
+ effort: {
58
+ default: 'medium',
59
+ values: [
60
+ { value: 'low' },
61
+ { value: 'medium' },
62
+ { value: 'high' },
63
+ { value: 'xhigh' },
64
+ { value: 'max' },
65
+ ],
66
+ },
67
+ },
24
68
  {
25
69
  value: 'gpt-5.5',
26
- label: 'gpt-5.5',
70
+ label: 'GPT-5.5',
71
+ description: 'Frontier model for complex coding, research, and real-world work.',
27
72
  effort: {
28
73
  default: 'medium',
29
74
  values: [{ value: 'low' }, { value: 'medium' }, { value: 'high' }, { value: 'xhigh' }],
@@ -31,7 +76,8 @@ export const CODEX_FALLBACK_MODELS: ProviderModelsDefinition = {
31
76
  },
32
77
  {
33
78
  value: 'gpt-5.4',
34
- label: 'gpt-5.4',
79
+ label: 'GPT-5.4',
80
+ description: 'Strong model for everyday coding.',
35
81
  effort: {
36
82
  default: 'medium',
37
83
  values: [{ value: 'low' }, { value: 'medium' }, { value: 'high' }, { value: 'xhigh' }],
@@ -39,113 +85,23 @@ export const CODEX_FALLBACK_MODELS: ProviderModelsDefinition = {
39
85
  },
40
86
  {
41
87
  value: 'gpt-5.4-mini',
42
- label: 'gpt-5.4-mini',
88
+ label: 'GPT-5.4 Mini',
89
+ description: 'Small, fast, and cost-efficient model for simpler coding tasks.',
43
90
  effort: {
44
91
  default: 'medium',
45
92
  values: [{ value: 'low' }, { value: 'medium' }, { value: 'high' }, { value: 'xhigh' }],
46
93
  },
47
94
  },
48
95
  ],
49
- DEFAULT: 'gpt-5.4',
50
- };
51
-
52
- type CodexCachedModel = {
53
- slug?: string;
54
- display_name?: string;
55
- description?: string;
56
- priority?: number;
57
- visibility?: string;
58
- supported_in_api?: boolean;
59
- default_reasoning_level?: string;
60
- supported_reasoning_levels?: Array<{
61
- effort?: string;
62
- description?: string;
63
- }>;
96
+ DEFAULT: 'gpt-5.6-sol',
64
97
  };
65
98
 
66
- const CODEX_MODELS_CACHE_PATH = path.join(os.homedir(), '.codex', 'models_cache.json');
67
99
  const CODEX_CONFIG_PATH = path.join(os.homedir(), '.codex', 'config.toml');
68
100
 
69
- const isCodexCachedModel = (value: unknown): value is CodexCachedModel => {
70
- const record = readObjectRecord(value);
71
- return Boolean(record && readOptionalString(record.slug));
72
- };
73
-
74
- const readCodexPriority = (value: unknown): number => (
75
- typeof value === 'number' && Number.isFinite(value) ? value : Number.MAX_SAFE_INTEGER
76
- );
77
-
78
- const mapCodexModel = (model: CodexCachedModel): ProviderModelOption => {
79
- const effortValues = Array.isArray(model.supported_reasoning_levels)
80
- ? model.supported_reasoning_levels
81
- .map((level) => {
82
- const value = readOptionalString(level?.effort);
83
- if (!value) {
84
- return null;
85
- }
86
-
87
- return {
88
- value,
89
- description: readOptionalString(level?.description),
90
- };
91
- })
92
- .filter((level): level is NonNullable<typeof level> => Boolean(level))
93
- : [];
94
-
95
- return {
96
- value: model.slug as string,
97
- label: readOptionalString(model.display_name) ?? (model.slug as string),
98
- description: readOptionalString(model.description),
99
- effort: effortValues.length > 0
100
- ? {
101
- default: readOptionalString(model.default_reasoning_level) ?? undefined,
102
- values: effortValues,
103
- }
104
- : undefined,
105
- };
106
- };
107
-
108
- const buildCodexModelsDefinition = (models: CodexCachedModel[]): ProviderModelsDefinition => {
109
- const sortedModels = [...models]
110
- .filter((model) => model.visibility === 'list' && model.supported_in_api !== false)
111
- .sort((left, right) => readCodexPriority(left.priority) - readCodexPriority(right.priority));
112
-
113
- const options: ProviderModelOption[] = [];
114
- const seenValues = new Set<string>();
115
-
116
- for (const model of sortedModels) {
117
- const mappedModel = mapCodexModel(model);
118
- if (seenValues.has(mappedModel.value)) {
119
- continue;
120
- }
121
-
122
- seenValues.add(mappedModel.value);
123
- options.push(mappedModel);
124
- }
125
-
126
- if (options.length === 0) {
127
- return CODEX_FALLBACK_MODELS;
128
- }
129
-
130
- return {
131
- OPTIONS: options,
132
- DEFAULT: options[0]?.value ?? CODEX_FALLBACK_MODELS.DEFAULT,
133
- };
134
- };
135
-
101
+ /** Provider registry model adapter for Codex predefined models and active config. */
136
102
  export class CodexProviderModels implements IProviderModels {
137
103
  async getSupportedModels(): Promise<ProviderModelsDefinition> {
138
- try {
139
- const raw = await readFile(CODEX_MODELS_CACHE_PATH, 'utf8');
140
- const parsed = readObjectRecord(JSON.parse(raw));
141
- const models = Array.isArray(parsed?.models)
142
- ? parsed.models.filter(isCodexCachedModel)
143
- : [];
144
-
145
- return buildCodexModelsDefinition(models);
146
- } catch {
147
- return CODEX_FALLBACK_MODELS;
148
- }
104
+ return CODEX_PREDEFINED_MODELS;
149
105
  }
150
106
 
151
107
  async getCurrentActiveModel(): Promise<ProviderCurrentActiveModel> {
@@ -164,10 +120,4 @@ export class CodexProviderModels implements IProviderModels {
164
120
  return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
165
121
  }
166
122
  }
167
-
168
- async changeActiveModel(
169
- input: ProviderChangeActiveModelInput,
170
- ): Promise<ProviderSessionActiveModelChange> {
171
- return writeProviderSessionActiveModelChange('codex', input);
172
- }
173
123
  }
@@ -3,11 +3,11 @@
3
3
  * =============================
4
4
  *
5
5
  * This module provides integration with the OpenAI Codex SDK for non-interactive
6
- * chat sessions. It mirrors the pattern used in claude-sdk.js for consistency.
6
+ * chat sessions. It mirrors the Claude runtime adapter for consistency.
7
7
  *
8
8
  * ## Usage
9
9
  *
10
- * - queryCodex(command, options, ws) - Execute a prompt with streaming via WebSocket
10
+ * - codexRuntime.run(command, options, writer, context) - Execute a streamed prompt
11
11
  * - abortCodexSession(sessionId) - Cancel an active session
12
12
  * - isCodexSessionActive(sessionId) - Check if a session is running
13
13
  * - getActiveCodexSessions() - List all active sessions
@@ -15,12 +15,13 @@
15
15
 
16
16
  import { Codex } from '@openai/codex-sdk';
17
17
 
18
- import { buildCodexInputItems, normalizeImageDescriptors } from './shared/image-attachments.js';
19
- import { notifyRunFailed, notifyRunStopped } from './services/notification-orchestrator.js';
20
- import { sessionsService } from './modules/providers/services/sessions.service.js';
21
- import { providerAuthService } from './modules/providers/services/provider-auth.service.js';
22
- import { providerModelsService } from './modules/providers/services/provider-models.service.js';
23
- import { createCompleteMessage, createNormalizedMessage } from './shared/utils.js';
18
+ import {
19
+ appendFilesInputTag,
20
+ buildCodexInputItems,
21
+ normalizeImageDescriptors
22
+ } from '@/shared/image-attachments.js';
23
+ import { notifyRunFailed, notifyRunStopped } from '@/modules/notifications/index.js';
24
+ import { createCompleteMessage, createNormalizedMessage } from '@/shared/utils.js';
24
25
 
25
26
  const activeCodexSessions = new Map();
26
27
 
@@ -222,7 +223,7 @@ function mapPermissionModeToCodexOptions(permissionMode) {
222
223
  * @param {object} options - Options including cwd, sessionId, model, permissionMode
223
224
  * @param {WebSocket|object} ws - WebSocket connection or response writer
224
225
  */
225
- export async function queryCodex(command, options = {}, ws) {
226
+ export async function queryCodex(command, options = {}, ws, context) {
226
227
  const {
227
228
  sessionId,
228
229
  sessionSummary,
@@ -231,18 +232,19 @@ export async function queryCodex(command, options = {}, ws) {
231
232
  model,
232
233
  effort,
233
234
  images,
235
+ files,
234
236
  permissionMode = 'default'
235
237
  } = options;
236
238
 
237
- const resolvedModel = await providerModelsService.resolveResumeModel(
238
- 'codex',
239
- sessionId,
240
- model,
241
- );
239
+ // Callers pass the stable app session id; the SDK resumes threads with the
240
+ // provider-native id recorded on the session row.
241
+ const providerSessionId = context.resolveProviderSessionId(sessionId);
242
+
243
+ const resolvedModel = await context.resolveResumeModel(sessionId, model);
242
244
 
243
245
  const workingDirectory = cwd || projectPath || process.cwd();
244
246
  const { sandboxMode, approvalPolicy } = mapPermissionModeToCodexOptions(permissionMode);
245
- const catalog = (await providerModelsService.getProviderModels('codex')).models;
247
+ const catalog = await context.getProviderModels();
246
248
  const selectedModel = catalog.OPTIONS.find((option) => option.value === resolvedModel) || null;
247
249
  const allowedEfforts = selectedModel?.effort?.values?.map((value) => value.value) || [];
248
250
  const resolvedEffort = typeof effort === 'string' && effort !== 'default' && allowedEfforts.includes(effort)
@@ -251,10 +253,15 @@ export async function queryCodex(command, options = {}, ws) {
251
253
 
252
254
  let codex;
253
255
  let thread;
254
- let capturedSessionId = sessionId;
256
+ // Provider-native thread id (starts as the resume id, or is captured from
257
+ // the stream for brand-new sessions).
258
+ let capturedSessionId = providerSessionId;
255
259
  let sessionCreatedSent = false;
256
260
  let terminalFailure = null;
257
261
  const abortController = new AbortController();
262
+ // Session-map key: the app session id when the caller supplied one, else
263
+ // the provider-native thread id once captured (legacy/direct API callers).
264
+ const sessionKey = () => sessionId || capturedSessionId || null;
258
265
 
259
266
  try {
260
267
  codex = new Codex();
@@ -268,8 +275,8 @@ export async function queryCodex(command, options = {}, ws) {
268
275
  modelReasoningEffort: resolvedEffort,
269
276
  };
270
277
 
271
- if (sessionId) {
272
- thread = codex.resumeThread(sessionId, threadOptions);
278
+ if (providerSessionId) {
279
+ thread = codex.resumeThread(providerSessionId, threadOptions);
273
280
  } else {
274
281
  thread = codex.startThread(threadOptions);
275
282
  }
@@ -287,15 +294,16 @@ export async function queryCodex(command, options = {}, ws) {
287
294
  });
288
295
  };
289
296
 
290
- if (capturedSessionId) {
291
- registerSession(capturedSessionId);
297
+ if (sessionKey()) {
298
+ registerSession(sessionKey());
292
299
  }
293
300
 
294
301
  // Execute with streaming. Turns with image attachments send structured
295
302
  // input items so Codex reads the images from their local asset paths.
303
+ const promptWithFiles = appendFilesInputTag(command, files);
296
304
  const turnInput = normalizeImageDescriptors(images).length > 0
297
- ? buildCodexInputItems(command, images, workingDirectory)
298
- : command;
305
+ ? buildCodexInputItems(promptWithFiles, images, workingDirectory)
306
+ : promptWithFiles;
299
307
  const streamedTurn = await thread.runStreamed(turnInput, {
300
308
  signal: abortController.signal
301
309
  });
@@ -306,13 +314,13 @@ export async function queryCodex(command, options = {}, ws) {
306
314
  const discoveredSessionId = event.thread_id || event.id || null;
307
315
  if (discoveredSessionId && !capturedSessionId) {
308
316
  capturedSessionId = discoveredSessionId;
309
- registerSession(capturedSessionId);
317
+ registerSession(sessionKey());
310
318
 
311
319
  if (ws.setSessionId && typeof ws.setSessionId === 'function') {
312
320
  ws.setSessionId(capturedSessionId);
313
321
  }
314
322
 
315
- if (!sessionId && !sessionCreatedSent) {
323
+ if (!providerSessionId && !sessionCreatedSent) {
316
324
  sessionCreatedSent = true;
317
325
  sendMessage(ws, createNormalizedMessage({ kind: 'session_created', newSessionId: capturedSessionId, sessionId: capturedSessionId, provider: 'codex' }));
318
326
  }
@@ -323,8 +331,8 @@ export async function queryCodex(command, options = {}, ws) {
323
331
  if (abortController.signal.aborted) {
324
332
  break;
325
333
  }
326
- if (capturedSessionId) {
327
- const session = activeCodexSessions.get(capturedSessionId);
334
+ if (sessionKey()) {
335
+ const session = activeCodexSessions.get(sessionKey());
328
336
  if (session?.status === 'aborted') {
329
337
  break;
330
338
  }
@@ -337,17 +345,18 @@ export async function queryCodex(command, options = {}, ws) {
337
345
  const transformed = transformCodexEvent(event);
338
346
 
339
347
  // Normalize the transformed event into NormalizedMessage(s) via adapter
340
- const normalizedMsgs = sessionsService.normalizeMessage('codex', transformed, capturedSessionId || sessionId || null);
348
+ const normalizedMsgs = context.normalizeMessage(transformed, capturedSessionId || sessionId || null);
341
349
  for (const msg of normalizedMsgs) {
342
350
  sendMessage(ws, msg);
343
351
  }
344
352
 
345
353
  if (event.type === 'turn.failed' && !terminalFailure) {
346
354
  terminalFailure = event.error || new Error('Turn failed');
355
+ // Notifications are app-facing, so they carry the app session id.
347
356
  notifyRunFailed({
348
357
  userId: ws?.userId || null,
349
358
  provider: 'codex',
350
- sessionId: capturedSessionId || sessionId || null,
359
+ sessionId: sessionId || capturedSessionId || null,
351
360
  sessionName: sessionSummary,
352
361
  error: terminalFailure
353
362
  });
@@ -364,7 +373,7 @@ export async function queryCodex(command, options = {}, ws) {
364
373
 
365
374
  // Send the terminal completion event — skipped for aborted runs, whose
366
375
  // terminal `complete` (aborted: true) was already sent by abort-session.
367
- const runSession = capturedSessionId ? activeCodexSessions.get(capturedSessionId) : null;
376
+ const runSession = sessionKey() ? activeCodexSessions.get(sessionKey()) : null;
368
377
  const runAborted = runSession?.status === 'aborted' || abortController.signal.aborted;
369
378
  if (!runAborted) {
370
379
  sendMessage(ws, createCompleteMessage({
@@ -377,7 +386,7 @@ export async function queryCodex(command, options = {}, ws) {
377
386
  notifyRunStopped({
378
387
  userId: ws?.userId || null,
379
388
  provider: 'codex',
380
- sessionId: capturedSessionId || sessionId || null,
389
+ sessionId: sessionId || capturedSessionId || null,
381
390
  sessionName: sessionSummary,
382
391
  stopReason: 'completed'
383
392
  });
@@ -385,7 +394,7 @@ export async function queryCodex(command, options = {}, ws) {
385
394
  }
386
395
 
387
396
  } catch (error) {
388
- const session = capturedSessionId ? activeCodexSessions.get(capturedSessionId) : null;
397
+ const session = sessionKey() ? activeCodexSessions.get(sessionKey()) : null;
389
398
  const wasAborted =
390
399
  session?.status === 'aborted' ||
391
400
  error?.name === 'AbortError' ||
@@ -395,7 +404,7 @@ export async function queryCodex(command, options = {}, ws) {
395
404
  console.error('[Codex] Error:', error);
396
405
 
397
406
  // Check if Codex SDK is available for a clearer error message
398
- const installed = await providerAuthService.isProviderInstalled('codex');
407
+ const installed = await context.isProviderInstalled();
399
408
  const errorContent = !installed
400
409
  ? 'Codex CLI is not configured. Please set up authentication first.'
401
410
  : error.message;
@@ -410,7 +419,7 @@ export async function queryCodex(command, options = {}, ws) {
410
419
  notifyRunFailed({
411
420
  userId: ws?.userId || null,
412
421
  provider: 'codex',
413
- sessionId: capturedSessionId || sessionId || null,
422
+ sessionId: sessionId || capturedSessionId || null,
414
423
  sessionName: sessionSummary,
415
424
  error
416
425
  });
@@ -419,8 +428,8 @@ export async function queryCodex(command, options = {}, ws) {
419
428
 
420
429
  } finally {
421
430
  // Update session status
422
- if (capturedSessionId) {
423
- const session = activeCodexSessions.get(capturedSessionId);
431
+ if (sessionKey()) {
432
+ const session = activeCodexSessions.get(sessionKey());
424
433
  if (session) {
425
434
  session.status = session.status === 'aborted' ? 'aborted' : 'completed';
426
435
  }
@@ -480,6 +489,11 @@ export function getActiveCodexSessions() {
480
489
  return sessions;
481
490
  }
482
491
 
492
+ export const codexRuntime = {
493
+ run: queryCodex,
494
+ abort: abortCodexSession,
495
+ };
496
+
483
497
  /**
484
498
  * Helper to send message via WebSocket or writer
485
499
  * @param {WebSocket|object} ws - WebSocket or response writer
@@ -500,7 +514,7 @@ function sendMessage(ws, data) {
500
514
  }
501
515
 
502
516
  // Clean up old completed sessions periodically
503
- setInterval(() => {
517
+ const completedSessionCleanupTimer = setInterval(() => {
504
518
  const now = Date.now();
505
519
  const maxAge = 30 * 60 * 1000; // 30 minutes
506
520
 
@@ -513,3 +527,7 @@ setInterval(() => {
513
527
  }
514
528
  }
515
529
  }, 5 * 60 * 1000); // Every 5 minutes
530
+
531
+ // Runtime cleanup should not keep focused tests or one-off scripts alive after
532
+ // their provider work has completed.
533
+ completedSessionCleanupTimer.unref?.();
@@ -134,23 +134,7 @@ export class CodexSessionSynchronizer implements IProviderSessionSynchronizer {
134
134
  };
135
135
  }
136
136
 
137
- // Sessions started by sending a message from cloudcli carry a distinct
138
- // app-allocated session_id mapped to the provider id. For these we title the
139
- // conversation from the first user message the user typed, instead of the
140
- // generic "Untitled Codex Session" placeholder. Sessions discovered purely
141
- // by indexing (session_id === provider_session_id) keep the existing
142
- // thread_name/last-agent-message setup below.
143
- const isAppCreated =
144
- existingSession != null &&
145
- existingSession.provider_session_id != null &&
146
- existingSession.session_id !== existingSession.provider_session_id;
147
-
148
- let sessionName = isAppCreated
149
- ? await this.extractFirstUserMessageFromStart(filePath)
150
- : undefined;
151
- if (!sessionName) {
152
- sessionName = nameMap.get(parsed.sessionId);
153
- }
137
+ let sessionName = nameMap.get(parsed.sessionId);
154
138
  if (!sessionName) {
155
139
  sessionName = await this.extractLastAgentMessageFromEnd(filePath);
156
140
  }
@@ -180,49 +164,6 @@ export class CodexSessionSynchronizer implements IProviderSessionSynchronizer {
180
164
  return typeof source === 'object' && source !== null && 'subagent' in source;
181
165
  }
182
166
 
183
- /**
184
- * Returns the first user message text in a Codex transcript, used to title
185
- * app-created sessions from the prompt the user sent from cloudcli.
186
- *
187
- * Reads the `event_msg`/`user_message` payload rather than the raw
188
- * `response_item` user turn so injected `<environment_context>` boilerplate is
189
- * never mistaken for the user's prompt.
190
- */
191
- private async extractFirstUserMessageFromStart(filePath: string): Promise<string | undefined> {
192
- try {
193
- const content = await readFile(filePath, 'utf8');
194
- const lines = content.split(/\r?\n/);
195
-
196
- for (const rawLine of lines) {
197
- const line = rawLine.trim();
198
- if (!line) {
199
- continue;
200
- }
201
-
202
- let parsed: unknown;
203
- try {
204
- parsed = JSON.parse(line);
205
- } catch {
206
- continue;
207
- }
208
-
209
- const data = parsed as Record<string, unknown>;
210
- const eventType = typeof data.type === 'string' ? data.type : undefined;
211
- const payload = data.payload as Record<string, unknown> | undefined;
212
- const payloadType = typeof payload?.type === 'string' ? payload.type : undefined;
213
- const message = typeof payload?.message === 'string' ? payload.message : undefined;
214
-
215
- if (eventType === 'event_msg' && payloadType === 'user_message' && message?.trim()) {
216
- return message;
217
- }
218
- }
219
- } catch {
220
- // Ignore missing/unreadable files so sync can continue.
221
- }
222
-
223
- return undefined;
224
- }
225
-
226
167
  private async extractLastAgentMessageFromEnd(filePath: string): Promise<string | undefined> {
227
168
  try {
228
169
  const content = await readFile(filePath, 'utf8');