@cloudcli-ai/cloudcli 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/README.de.md +9 -1
  2. package/README.ja.md +8 -0
  3. package/README.ko.md +9 -1
  4. package/README.md +16 -3
  5. package/README.ru.md +9 -1
  6. package/README.tr.md +8 -1
  7. package/README.zh-CN.md +9 -1
  8. package/README.zh-TW.md +9 -1
  9. package/dist/api-docs.html +36 -18
  10. package/dist/assets/index-CtwxqzGG.js +1407 -0
  11. package/dist/assets/index-DlvtxFyt.css +32 -0
  12. package/dist/index.html +2 -2
  13. package/dist-server/server/browser-use-mcp.js +350 -0
  14. package/dist-server/server/browser-use-mcp.js.map +1 -0
  15. package/dist-server/server/claude-sdk.js +25 -5
  16. package/dist-server/server/claude-sdk.js.map +1 -1
  17. package/dist-server/server/cli.js +14 -6
  18. package/dist-server/server/cli.js.map +1 -1
  19. package/dist-server/server/computer-use-agent.js +242 -0
  20. package/dist-server/server/computer-use-agent.js.map +1 -0
  21. package/dist-server/server/computer-use-mcp.js +519 -0
  22. package/dist-server/server/computer-use-mcp.js.map +1 -0
  23. package/dist-server/server/cursor-cli.js +27 -11
  24. package/dist-server/server/cursor-cli.js.map +1 -1
  25. package/dist-server/server/gemini-cli.js +17 -2
  26. package/dist-server/server/gemini-cli.js.map +1 -1
  27. package/dist-server/server/index.js +149 -40
  28. package/dist-server/server/index.js.map +1 -1
  29. package/dist-server/server/load-env.js +1 -1
  30. package/dist-server/server/load-env.js.map +1 -1
  31. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
  32. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
  33. package/dist-server/server/modules/browser-use/browser-use.routes.js +93 -0
  34. package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
  35. package/dist-server/server/modules/browser-use/browser-use.service.js +688 -0
  36. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
  37. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
  38. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
  39. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js +55 -0
  40. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js.map +1 -0
  41. package/dist-server/server/modules/computer-use/actions/raw-action-types.js +2 -0
  42. package/dist-server/server/modules/computer-use/actions/raw-action-types.js.map +1 -0
  43. package/dist-server/server/modules/computer-use/computer-executor.js +212 -0
  44. package/dist-server/server/modules/computer-use/computer-executor.js.map +1 -0
  45. package/dist-server/server/modules/computer-use/computer-semantics.service.js +422 -0
  46. package/dist-server/server/modules/computer-use/computer-semantics.service.js.map +1 -0
  47. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js +126 -0
  48. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js.map +1 -0
  49. package/dist-server/server/modules/computer-use/computer-use.routes.js +196 -0
  50. package/dist-server/server/modules/computer-use/computer-use.routes.js.map +1 -0
  51. package/dist-server/server/modules/computer-use/computer-use.service.js +759 -0
  52. package/dist-server/server/modules/computer-use/computer-use.service.js.map +1 -0
  53. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js +126 -0
  54. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js.map +1 -0
  55. package/dist-server/server/modules/computer-use/index.js +3 -0
  56. package/dist-server/server/modules/computer-use/index.js.map +1 -0
  57. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js +59 -0
  58. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js.map +1 -0
  59. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js +5 -0
  60. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js.map +1 -0
  61. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js +2 -0
  62. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js.map +1 -0
  63. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js +5 -0
  64. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js.map +1 -0
  65. package/dist-server/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  66. package/dist-server/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  67. package/dist-server/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  68. package/dist-server/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  69. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js +106 -0
  70. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js.map +1 -0
  71. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js +78 -0
  72. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js.map +1 -0
  73. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js +68 -0
  74. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js.map +1 -0
  75. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js +16 -0
  76. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js.map +1 -0
  77. package/dist-server/server/modules/computer-use/semantics/semantic-types.js +2 -0
  78. package/dist-server/server/modules/computer-use/semantics/semantic-types.js.map +1 -0
  79. package/dist-server/server/modules/database/index.js +1 -0
  80. package/dist-server/server/modules/database/index.js.map +1 -1
  81. package/dist-server/server/modules/database/migrations.js +23 -1
  82. package/dist-server/server/modules/database/migrations.js.map +1 -1
  83. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
  84. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
  85. package/dist-server/server/modules/database/repositories/notification-preferences.js +8 -0
  86. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -1
  87. package/dist-server/server/modules/database/repositories/sessions.db.js +173 -17
  88. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
  89. package/dist-server/server/modules/database/schema.js +26 -0
  90. package/dist-server/server/modules/database/schema.js.map +1 -1
  91. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
  92. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +78 -0
  93. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
  94. package/dist-server/server/modules/database/{repositories → tests}/sessions.db.integration.test.js +10 -0
  95. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
  96. package/dist-server/server/modules/notifications/index.js +4 -0
  97. package/dist-server/server/modules/notifications/index.js.map +1 -0
  98. package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
  99. package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
  100. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
  101. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
  102. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +229 -0
  103. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
  104. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
  105. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
  106. package/dist-server/server/modules/projects/services/project-management.service.js +0 -4
  107. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -1
  108. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +10 -38
  109. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -1
  110. package/dist-server/server/modules/providers/index.js +1 -0
  111. package/dist-server/server/modules/providers/index.js.map +1 -1
  112. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +24 -1
  113. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -1
  114. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +9 -12
  115. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -1
  116. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +7 -0
  117. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -1
  118. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +7 -3
  119. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
  120. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +3 -9
  121. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
  122. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +7 -0
  123. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -1
  124. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +13 -22
  125. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -1
  126. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +7 -0
  127. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -1
  128. package/dist-server/server/modules/providers/list/gemini/gemini-models.provider.js +5 -8
  129. package/dist-server/server/modules/providers/list/gemini/gemini-models.provider.js.map +1 -1
  130. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js +6 -6
  131. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js.map +1 -1
  132. package/dist-server/server/modules/providers/list/gemini/gemini-skills.provider.js +7 -0
  133. package/dist-server/server/modules/providers/list/gemini/gemini-skills.provider.js.map +1 -1
  134. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +17 -3
  135. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -1
  136. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +9 -10
  137. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -1
  138. package/dist-server/server/modules/providers/provider.routes.js +123 -1
  139. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  140. package/dist-server/server/modules/providers/services/mcp.service.js +23 -0
  141. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -1
  142. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +65 -0
  143. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
  144. package/dist-server/server/modules/providers/services/provider-models.service.js +1 -1
  145. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  146. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +62 -23
  147. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
  148. package/dist-server/server/modules/providers/services/sessions.service.js +62 -4
  149. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
  150. package/dist-server/server/modules/providers/services/skills.service.js +11 -0
  151. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -1
  152. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +163 -1
  153. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -1
  154. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +45 -0
  155. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -1
  156. package/dist-server/server/modules/providers/tests/skills.test.js +160 -0
  157. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
  158. package/dist-server/server/modules/websocket/index.js +1 -0
  159. package/dist-server/server/modules/websocket/index.js.map +1 -1
  160. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +252 -0
  161. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
  162. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +105 -0
  163. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
  164. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +218 -156
  165. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  166. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js +39 -0
  167. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js.map +1 -0
  168. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +83 -31
  169. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
  170. package/dist-server/server/modules/websocket/services/websocket-server.service.js +10 -0
  171. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
  172. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +216 -0
  173. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
  174. package/dist-server/server/openai-codex.js +24 -14
  175. package/dist-server/server/openai-codex.js.map +1 -1
  176. package/dist-server/server/opencode-cli.js +21 -8
  177. package/dist-server/server/opencode-cli.js.map +1 -1
  178. package/dist-server/server/opencode-cli.test.js +19 -1
  179. package/dist-server/server/opencode-cli.test.js.map +1 -1
  180. package/dist-server/server/routes/settings.js +1 -1
  181. package/dist-server/server/routes/settings.js.map +1 -1
  182. package/dist-server/server/services/notification-orchestrator.js +1 -176
  183. package/dist-server/server/services/notification-orchestrator.js.map +1 -1
  184. package/dist-server/server/services/tests/notification-orchestrator.test.js +64 -0
  185. package/dist-server/server/services/tests/notification-orchestrator.test.js.map +1 -0
  186. package/dist-server/server/shared/{claude-cli-path.test.js → tests/claude-cli-path.test.js} +1 -1
  187. package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
  188. package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
  189. package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
  190. package/dist-server/server/shared/utils.js +73 -1
  191. package/dist-server/server/shared/utils.js.map +1 -1
  192. package/dist-server/server/voice-proxy.js +226 -0
  193. package/dist-server/server/voice-proxy.js.map +1 -0
  194. package/electron/assets/logo-macos.icns +0 -0
  195. package/electron/assets/logo-macos.png +0 -0
  196. package/electron/assets/logo-windows.ico +0 -0
  197. package/electron/cloud.js +260 -0
  198. package/electron/computerAgent.js +290 -0
  199. package/electron/desktopNotifications.js +378 -0
  200. package/electron/desktopWindow.js +781 -0
  201. package/electron/launcher/index.html +14 -0
  202. package/electron/launcher/launcher.css +801 -0
  203. package/electron/launcher/launcher.js +829 -0
  204. package/electron/localServer.js +550 -0
  205. package/electron/main.js +1060 -0
  206. package/electron/preload.cjs +63 -0
  207. package/electron/scripts/generate-macos-icon.js +62 -0
  208. package/electron/serverInstaller.js +277 -0
  209. package/electron/tabs.js +87 -0
  210. package/electron/viewHost.js +331 -0
  211. package/package.json +86 -5
  212. package/public/api-docs.html +36 -18
  213. package/scripts/build-computer-semantics.mjs +133 -0
  214. package/scripts/copy-computer-semantics-bin.mjs +24 -0
  215. package/scripts/release/build-server-bundle.js +176 -0
  216. package/scripts/release/prepare-desktop-app.js +158 -0
  217. package/server/browser-use-mcp.ts +384 -0
  218. package/server/claude-sdk.js +27 -5
  219. package/server/cli.js +15 -6
  220. package/server/computer-use-agent.ts +279 -0
  221. package/server/computer-use-mcp.ts +574 -0
  222. package/server/cursor-cli.js +27 -11
  223. package/server/gemini-cli.js +17 -2
  224. package/server/index.js +151 -47
  225. package/server/load-env.js +1 -1
  226. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
  227. package/server/modules/browser-use/browser-use.routes.ts +96 -0
  228. package/server/modules/browser-use/browser-use.service.ts +836 -0
  229. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
  230. package/server/modules/computer-use/actions/raw-action-dispatcher.ts +67 -0
  231. package/server/modules/computer-use/actions/raw-action-types.ts +28 -0
  232. package/server/modules/computer-use/computer-executor.ts +242 -0
  233. package/server/modules/computer-use/computer-semantics.service.ts +460 -0
  234. package/server/modules/computer-use/computer-use-mcp.routes.ts +141 -0
  235. package/server/modules/computer-use/computer-use.routes.ts +211 -0
  236. package/server/modules/computer-use/computer-use.service.ts +920 -0
  237. package/server/modules/computer-use/desktop-agent-relay.service.ts +158 -0
  238. package/server/modules/computer-use/index.ts +2 -0
  239. package/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.ts +82 -0
  240. package/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.ts +5 -0
  241. package/server/modules/computer-use/semantics/adapters/semantic-adapter.ts +23 -0
  242. package/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.ts +5 -0
  243. package/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  244. package/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  245. package/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  246. package/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  247. package/server/modules/computer-use/semantics/helpers/macos/CloudCLISemantics.swift +467 -0
  248. package/server/modules/computer-use/semantics/helpers/semantic-helper-process.ts +124 -0
  249. package/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.ts +97 -0
  250. package/server/modules/computer-use/semantics/helpers/windows/CloudCLISemantics.csproj +11 -0
  251. package/server/modules/computer-use/semantics/helpers/windows/Program.cs +534 -0
  252. package/server/modules/computer-use/semantics/semantic-session-store.ts +87 -0
  253. package/server/modules/computer-use/semantics/semantic-tool-dispatcher.ts +17 -0
  254. package/server/modules/computer-use/semantics/semantic-types.ts +58 -0
  255. package/server/modules/database/index.ts +1 -0
  256. package/server/modules/database/migrations.ts +25 -0
  257. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
  258. package/server/modules/database/repositories/notification-preferences.ts +12 -1
  259. package/server/modules/database/repositories/sessions.db.ts +227 -23
  260. package/server/modules/database/schema.ts +27 -0
  261. package/server/modules/database/tests/sessions-provider-mapping.test.ts +108 -0
  262. package/server/modules/database/{repositories → tests}/sessions.db.integration.test.ts +12 -0
  263. package/server/modules/notifications/index.ts +13 -0
  264. package/server/modules/notifications/notifications.routes.ts +127 -0
  265. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
  266. package/server/modules/notifications/services/notification-orchestrator.service.js +288 -0
  267. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
  268. package/server/modules/projects/services/project-management.service.ts +0 -8
  269. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +12 -53
  270. package/server/modules/providers/README.md +1 -1
  271. package/server/modules/providers/index.ts +1 -0
  272. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +26 -1
  273. package/server/modules/providers/list/claude/claude-sessions.provider.ts +9 -14
  274. package/server/modules/providers/list/claude/claude-skills.provider.ts +8 -0
  275. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +7 -3
  276. package/server/modules/providers/list/codex/codex-sessions.provider.ts +3 -12
  277. package/server/modules/providers/list/codex/codex-skills.provider.ts +8 -0
  278. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +13 -22
  279. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +8 -0
  280. package/server/modules/providers/list/gemini/gemini-models.provider.ts +5 -8
  281. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +6 -6
  282. package/server/modules/providers/list/gemini/gemini-skills.provider.ts +8 -0
  283. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +18 -4
  284. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +9 -12
  285. package/server/modules/providers/provider.routes.ts +167 -1
  286. package/server/modules/providers/services/mcp.service.ts +26 -0
  287. package/server/modules/providers/services/provider-capabilities.service.ts +91 -0
  288. package/server/modules/providers/services/provider-models.service.ts +1 -1
  289. package/server/modules/providers/services/sessions-watcher.service.ts +71 -25
  290. package/server/modules/providers/services/sessions.service.ts +79 -4
  291. package/server/modules/providers/services/skills.service.ts +25 -1
  292. package/server/modules/providers/shared/skills/skills.provider.ts +223 -0
  293. package/server/modules/providers/tests/opencode-sessions.test.ts +49 -0
  294. package/server/modules/providers/tests/skills.test.ts +212 -0
  295. package/server/modules/websocket/README.md +33 -27
  296. package/server/modules/websocket/index.ts +1 -0
  297. package/server/modules/websocket/services/chat-run-registry.service.ts +327 -0
  298. package/server/modules/websocket/services/chat-session-writer.service.ts +145 -0
  299. package/server/modules/websocket/services/chat-websocket.service.ts +292 -207
  300. package/server/modules/websocket/services/desktop-agent-websocket.service.ts +51 -0
  301. package/server/modules/websocket/services/shell-websocket.service.ts +108 -32
  302. package/server/modules/websocket/services/websocket-server.service.ts +12 -0
  303. package/server/modules/websocket/tests/chat-run-registry.test.ts +244 -0
  304. package/server/openai-codex.js +24 -14
  305. package/server/opencode-cli.js +21 -8
  306. package/server/opencode-cli.test.js +20 -1
  307. package/server/routes/settings.js +6 -1
  308. package/server/services/notification-orchestrator.js +3 -224
  309. package/server/services/tests/notification-orchestrator.test.js +80 -0
  310. package/server/shared/interfaces.ts +15 -0
  311. package/server/shared/tests/slice-tail-page.test.ts +42 -0
  312. package/server/shared/types.ts +84 -1
  313. package/server/shared/utils.ts +95 -1
  314. package/server/voice-proxy.js +224 -0
  315. package/dist/assets/index-73Xw3i9v.css +0 -32
  316. package/dist/assets/index-BIHaviaA.js +0 -1361
  317. package/dist/modelConstants.js +0 -854
  318. package/dist-server/server/modules/database/repositories/projects.db.integration.test.js.map +0 -1
  319. package/dist-server/server/modules/database/repositories/sessions.db.integration.test.js.map +0 -1
  320. package/dist-server/server/shared/claude-cli-path.test.js.map +0 -1
  321. package/public/modelConstants.js +0 -854
  322. /package/dist-server/server/modules/database/{repositories → tests}/projects.db.integration.test.js +0 -0
  323. /package/server/modules/database/{repositories → tests}/projects.db.integration.test.ts +0 -0
  324. /package/server/shared/{claude-cli-path.test.ts → tests/claude-cli-path.test.ts} +0 -0
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ const rootDir = path.resolve(__dirname, '..');
8
+ const sourceDir = path.join(rootDir, 'server', 'modules', 'computer-use', 'semantics', 'bin');
9
+ const targetDir = path.join(rootDir, 'dist-server', 'server', 'modules', 'computer-use', 'semantics', 'bin');
10
+
11
+ async function pathExists(filePath) {
12
+ try {
13
+ await fs.access(filePath);
14
+ return true;
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
19
+
20
+ if (await pathExists(sourceDir)) {
21
+ await fs.mkdir(path.dirname(targetDir), { recursive: true });
22
+ await fs.cp(sourceDir, targetDir, { recursive: true });
23
+ console.log(`Copied Computer Use semantic helpers to ${path.relative(rootDir, targetDir)}`);
24
+ }
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ import crypto from 'node:crypto';
3
+ import { createReadStream, readFileSync } from 'node:fs';
4
+ import fs from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { spawn } from 'node:child_process';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ const rootDir = path.resolve(__dirname, '..', '..');
11
+ const packageJson = JSON.parse(
12
+ await fs.readFile(path.join(rootDir, 'package.json'), 'utf8'),
13
+ );
14
+
15
+ function getElectronVersion() {
16
+ try {
17
+ return JSON.parse(
18
+ readFileSync(path.join(rootDir, 'node_modules', 'electron', 'package.json'), 'utf8'),
19
+ ).version;
20
+ } catch {
21
+ try {
22
+ return JSON.parse(
23
+ readFileSync(path.join(rootDir, 'package-lock.json'), 'utf8'),
24
+ ).packages['node_modules/electron'].version;
25
+ } catch {
26
+ throw new Error('Could not resolve an exact Electron version for server native rebuild.');
27
+ }
28
+ }
29
+ }
30
+
31
+ function mapArch(arch = process.arch) {
32
+ return arch === 'arm64' ? 'arm64' : 'x64';
33
+ }
34
+
35
+ function mapPlatform(platform = process.platform) {
36
+ if (platform === 'darwin') return 'mac';
37
+ if (platform === 'win32') return 'win';
38
+ return 'linux';
39
+ }
40
+
41
+ function run(command, args, options = {}) {
42
+ return new Promise((resolve, reject) => {
43
+ const child = spawn(command, args, {
44
+ stdio: 'inherit',
45
+ shell: process.platform === 'win32',
46
+ ...options,
47
+ });
48
+ child.once('error', reject);
49
+ child.once('exit', (code) => {
50
+ if (code === 0) resolve();
51
+ else reject(new Error(`${command} ${args.join(' ')} exited with code ${code}`));
52
+ });
53
+ });
54
+ }
55
+
56
+ async function pathExists(filePath) {
57
+ try {
58
+ await fs.access(filePath);
59
+ return true;
60
+ } catch {
61
+ return false;
62
+ }
63
+ }
64
+
65
+ async function copyRequired(stageDir, relativePath) {
66
+ const from = path.join(rootDir, relativePath);
67
+ if (!(await pathExists(from))) {
68
+ throw new Error(`Required server bundle input is missing: ${relativePath}`);
69
+ }
70
+ await fs.cp(from, path.join(stageDir, relativePath), { recursive: true });
71
+ }
72
+
73
+ async function copyIfExists(stageDir, relativePath) {
74
+ const from = path.join(rootDir, relativePath);
75
+ if (!(await pathExists(from))) return;
76
+ await fs.cp(from, path.join(stageDir, relativePath), { recursive: true });
77
+ }
78
+
79
+ async function writeServerPackageJson(stageDir) {
80
+ const stagedPackageJson = {
81
+ ...packageJson,
82
+ scripts: {
83
+ ...(packageJson.scripts || {}),
84
+ },
85
+ };
86
+ // The bundle stage is not a git checkout with dev dependencies, so lifecycle
87
+ // scripts such as Husky prepare must not run there. Dependency install scripts
88
+ // still run; native modules need them before the Electron ABI rebuild below.
89
+ delete stagedPackageJson.scripts.postinstall;
90
+ delete stagedPackageJson.scripts.prepare;
91
+ delete stagedPackageJson.scripts.prepublishOnly;
92
+ await fs.writeFile(
93
+ path.join(stageDir, 'package.json'),
94
+ `${JSON.stringify(stagedPackageJson, null, 2)}\n`,
95
+ 'utf8',
96
+ );
97
+ }
98
+
99
+ function sha256(filePath) {
100
+ return new Promise((resolve, reject) => {
101
+ const hash = crypto.createHash('sha256');
102
+ const stream = createReadStream(filePath);
103
+ stream.on('data', (chunk) => hash.update(chunk));
104
+ stream.on('end', () => resolve(hash.digest('hex')));
105
+ stream.on('error', reject);
106
+ });
107
+ }
108
+
109
+ const platform = mapPlatform(process.env.CLOUDCLI_BUNDLE_PLATFORM || process.platform);
110
+ const arch = mapArch(process.env.CLOUDCLI_BUNDLE_ARCH || process.arch);
111
+ const version = packageJson.version;
112
+ const bundleName = `cloudcli-local-server-${version}-${platform}-${arch}.tar.gz`;
113
+ const bundleRoot = path.join(rootDir, 'release', 'local-server');
114
+ const stageDir = path.join(bundleRoot, `.stage-${version}-${platform}-${arch}`);
115
+ const archivePath = path.join(bundleRoot, bundleName);
116
+
117
+ await fs.rm(stageDir, { recursive: true, force: true });
118
+ await fs.mkdir(stageDir, { recursive: true });
119
+ await fs.mkdir(bundleRoot, { recursive: true });
120
+
121
+ await copyRequired(stageDir, 'dist');
122
+ await copyRequired(stageDir, 'dist-server');
123
+ await copyRequired(stageDir, 'public');
124
+ await copyRequired(stageDir, 'shared');
125
+ await copyRequired(stageDir, 'package-lock.json');
126
+ await copyIfExists(stageDir, 'scripts/fix-node-pty.js');
127
+ await writeServerPackageJson(stageDir);
128
+
129
+ console.log('Installing production server dependencies into bundle stage...');
130
+ await run('npm', ['ci', '--omit=dev'], {
131
+ cwd: stageDir,
132
+ env: {
133
+ ...process.env,
134
+ npm_config_audit: 'false',
135
+ npm_config_fund: 'false',
136
+ },
137
+ });
138
+
139
+ const electronVersion = getElectronVersion();
140
+ const electronRebuild = process.platform === 'win32'
141
+ ? path.join(rootDir, 'node_modules', '.bin', 'electron-rebuild.cmd')
142
+ : path.join(rootDir, 'node_modules', '.bin', 'electron-rebuild');
143
+ console.log(`Rebuilding native server dependencies for Electron ${electronVersion} (${arch})...`);
144
+ await run(electronRebuild, ['--version', electronVersion, '--module-dir', stageDir, '--arch', arch, '--force'], {
145
+ cwd: rootDir,
146
+ env: {
147
+ ...process.env,
148
+ npm_config_audit: 'false',
149
+ npm_config_fund: 'false',
150
+ },
151
+ });
152
+
153
+ if (await pathExists(path.join(stageDir, 'scripts', 'fix-node-pty.js'))) {
154
+ await run(process.execPath, ['scripts/fix-node-pty.js'], { cwd: stageDir });
155
+ }
156
+
157
+ await fs.writeFile(
158
+ path.join(stageDir, '.installed.json'),
159
+ JSON.stringify({ version, platform, arch, builtAt: new Date().toISOString() }, null, 2),
160
+ 'utf8',
161
+ );
162
+
163
+ await fs.rm(archivePath, { force: true });
164
+ const tarArgs = process.platform === 'win32'
165
+ ? ['-czf', archivePath, '-C', stageDir, '.']
166
+ : ['-czf', archivePath, '-C', stageDir, '.'];
167
+ await run('tar', tarArgs);
168
+
169
+ const digest = await sha256(archivePath);
170
+ const checksumPath = `${archivePath}.sha256`;
171
+ await fs.writeFile(checksumPath, `${digest} ${bundleName}\n`, 'utf8');
172
+ await fs.rm(stageDir, { recursive: true, force: true });
173
+
174
+ const size = (await fs.stat(archivePath)).size / 1024 / 1024;
175
+ console.log(`Wrote ${path.relative(rootDir, archivePath)} (${size.toFixed(1)} MB)`);
176
+ console.log(`Wrote ${path.relative(rootDir, checksumPath)}`);
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'node:fs';
3
+ import fs from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const rootDir = path.resolve(__dirname, '..', '..');
9
+ const stageDir = path.join(rootDir, '.desktop-build', 'desktop-app');
10
+
11
+ const packageJson = JSON.parse(
12
+ await fs.readFile(path.join(rootDir, 'package.json'), 'utf8'),
13
+ );
14
+
15
+ function getElectronVersion() {
16
+ try {
17
+ return JSON.parse(
18
+ readFileSync(path.join(rootDir, 'node_modules', 'electron', 'package.json'), 'utf8'),
19
+ ).version;
20
+ } catch {
21
+ try {
22
+ return JSON.parse(
23
+ readFileSync(path.join(rootDir, 'package-lock.json'), 'utf8'),
24
+ ).packages['node_modules/electron'].version;
25
+ } catch {
26
+ throw new Error('Could not resolve an exact Electron version for desktop packaging.');
27
+ }
28
+ }
29
+ }
30
+
31
+ async function pathExists(filePath) {
32
+ try {
33
+ await fs.access(filePath);
34
+ return true;
35
+ } catch {
36
+ return false;
37
+ }
38
+ }
39
+
40
+ async function copyRequired(relativePath) {
41
+ const from = path.join(rootDir, relativePath);
42
+ const to = path.join(stageDir, relativePath);
43
+ if (!(await pathExists(from))) {
44
+ throw new Error(`Required desktop build input is missing: ${relativePath}`);
45
+ }
46
+ await fs.cp(from, to, { recursive: true });
47
+ }
48
+
49
+ async function copyIfExists(relativePath) {
50
+ const from = path.join(rootDir, relativePath);
51
+ if (!(await pathExists(from))) return false;
52
+ await fs.cp(from, path.join(stageDir, relativePath), { recursive: true });
53
+ return true;
54
+ }
55
+
56
+ async function copyNodeModule(packageName) {
57
+ const parts = packageName.split('/');
58
+ const source = path.join(rootDir, 'node_modules', ...parts);
59
+ if (!(await pathExists(source))) return false;
60
+
61
+ const target = path.join(stageDir, 'node_modules', ...parts);
62
+ await fs.mkdir(path.dirname(target), { recursive: true });
63
+ await fs.cp(source, target, { recursive: true });
64
+ return true;
65
+ }
66
+
67
+ function buildDesktopPackageJson(copiedOptionalDependencies) {
68
+ return {
69
+ name: `${packageJson.name}-desktop`,
70
+ version: packageJson.version,
71
+ productName: packageJson.productName,
72
+ description: `${packageJson.productName} desktop shell`,
73
+ author: packageJson.author,
74
+ license: packageJson.license,
75
+ type: 'module',
76
+ main: 'electron/main.js',
77
+ dependencies: {
78
+ ws: packageJson.dependencies.ws,
79
+ },
80
+ optionalDependencies: copiedOptionalDependencies,
81
+ build: {
82
+ appId: packageJson.build.appId,
83
+ productName: packageJson.build.productName,
84
+ asar: packageJson.build.asar,
85
+ artifactName: packageJson.build.artifactName,
86
+ electronVersion: getElectronVersion(),
87
+ directories: {
88
+ output: '../../release/desktop',
89
+ },
90
+ extraMetadata: {
91
+ main: 'electron/main.js',
92
+ },
93
+ files: [
94
+ 'electron/**',
95
+ 'public/**',
96
+ 'dist/**',
97
+ 'dist-server/**',
98
+ 'node_modules/**',
99
+ 'package.json',
100
+ ],
101
+ protocols: packageJson.build.protocols,
102
+ mac: packageJson.build.mac,
103
+ win: packageJson.build.win,
104
+ nsis: packageJson.build.nsis,
105
+ },
106
+ };
107
+ }
108
+
109
+ await fs.rm(stageDir, { recursive: true, force: true });
110
+ await fs.mkdir(stageDir, { recursive: true });
111
+
112
+ await copyRequired('electron');
113
+ await copyRequired('dist');
114
+ await copyRequired('public');
115
+
116
+ // The desktop app still ships the standalone Computer Use desktop agent, but
117
+ // not the full local server. Local CloudCLI is downloaded on demand.
118
+ await copyRequired('dist-server/server/computer-use-agent.js');
119
+ await copyIfExists('dist-server/server/computer-use-agent.js.map');
120
+ await copyRequired('dist-server/server/modules/computer-use');
121
+
122
+ const copiedRuntimeDependencies = [];
123
+ if (await copyNodeModule('ws')) {
124
+ copiedRuntimeDependencies.push('ws');
125
+ } else {
126
+ throw new Error('Required desktop dependency is missing from node_modules: ws');
127
+ }
128
+
129
+ const copiedOptionalDependencies = {};
130
+ for (const [name, version] of Object.entries(packageJson.optionalDependencies || {})) {
131
+ if (await copyNodeModule(name)) {
132
+ copiedOptionalDependencies[name] = version;
133
+ }
134
+ }
135
+
136
+ for (const name of [
137
+ '@nut-tree-fork/default-clipboard-provider',
138
+ '@nut-tree-fork/libnut',
139
+ '@nut-tree-fork/provider-interfaces',
140
+ '@nut-tree-fork/shared',
141
+ 'jimp',
142
+ 'node-abort-controller',
143
+ 'temp',
144
+ ]) {
145
+ await copyNodeModule(name);
146
+ }
147
+
148
+ await fs.writeFile(
149
+ path.join(stageDir, 'package.json'),
150
+ `${JSON.stringify(buildDesktopPackageJson(copiedOptionalDependencies), null, 2)}\n`,
151
+ 'utf8',
152
+ );
153
+
154
+ console.log(`Prepared thin desktop app at ${path.relative(rootDir, stageDir)}`);
155
+ console.log(`Runtime dependencies: ${copiedRuntimeDependencies.join(', ')}`);
156
+ if (Object.keys(copiedOptionalDependencies).length) {
157
+ console.log(`Optional dependencies: ${Object.keys(copiedOptionalDependencies).join(', ')}`);
158
+ }