@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,10 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+
4
+ import { browserUseService } from '@/modules/browser-use/browser-use.service.js';
5
+
6
+ test('browser monitor list starts empty without agent sessions', async () => {
7
+ const sessions = await browserUseService.listSessions();
8
+
9
+ assert.deepEqual(sessions, []);
10
+ });
@@ -0,0 +1,67 @@
1
+ import {
2
+ captureScreenshot,
3
+ executor,
4
+ type ExecutorTarget,
5
+ } from '@/modules/computer-use/computer-executor.js';
6
+ import type { RawActionResult, RawComputerAction, RawActionTarget } from '@/modules/computer-use/actions/raw-action-types.js';
7
+
8
+ const DEFAULT_WAIT_MS = 1000;
9
+ const MAX_WAIT_MS = 10_000;
10
+
11
+ function normalizeWaitMs(ms: number | undefined): number {
12
+ if (ms === undefined) {
13
+ return DEFAULT_WAIT_MS;
14
+ }
15
+ if (!Number.isFinite(ms)) {
16
+ throw new Error('Computer Use wait duration must be a finite number.');
17
+ }
18
+ return Math.trunc(Math.max(0, Math.min(ms, MAX_WAIT_MS)));
19
+ }
20
+
21
+ async function snapshot(target: RawActionTarget): Promise<RawActionResult> {
22
+ const { dataUrl, size } = await captureScreenshot();
23
+ return { screenshotDataUrl: dataUrl, displaySize: size || target.displaySize };
24
+ }
25
+
26
+ export async function runRawComputerAction(
27
+ action: RawComputerAction,
28
+ target: RawActionTarget,
29
+ ): Promise<RawActionResult> {
30
+ const executorTarget: ExecutorTarget = {
31
+ displaySize: target.displaySize,
32
+ };
33
+
34
+ switch (action.type) {
35
+ case 'screenshot':
36
+ return snapshot(target);
37
+ case 'cursor_position': {
38
+ const position = await executor.cursorPosition(executorTarget);
39
+ return { ...(await snapshot(target)), position, cursor: position };
40
+ }
41
+ case 'mouse_move':
42
+ await executor.moveTo(executorTarget, action.point);
43
+ return { ...(await snapshot(target)), cursor: action.point };
44
+ case 'click':
45
+ await executor.click(executorTarget, action.button, action.point, action.double === true);
46
+ return { ...(await snapshot(target)), cursor: action.point ?? null };
47
+ case 'drag':
48
+ await executor.drag(executorTarget, action.from, action.to, action.button ?? 'left');
49
+ return { ...(await snapshot(target)), cursor: action.to };
50
+ case 'type':
51
+ await executor.type(action.text);
52
+ return snapshot(target);
53
+ case 'key':
54
+ await executor.pressChord(action.key);
55
+ return snapshot(target);
56
+ case 'scroll':
57
+ await executor.scroll(executorTarget, action.direction, action.amount ?? 3, action.point);
58
+ return { ...(await snapshot(target)), cursor: action.point ?? null };
59
+ case 'wait':
60
+ await new Promise((resolve) => setTimeout(resolve, normalizeWaitMs(action.ms)));
61
+ return snapshot(target);
62
+ default: {
63
+ const exhaustive: never = action;
64
+ throw new Error(`Unsupported computer action: ${(exhaustive as { type?: string }).type || 'unknown'}`);
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,28 @@
1
+ import type {
2
+ ClickButton,
3
+ DisplaySize,
4
+ Point,
5
+ ScrollDirection,
6
+ } from '@/modules/computer-use/computer-executor.js';
7
+
8
+ export type RawComputerAction =
9
+ | { type: 'screenshot' }
10
+ | { type: 'cursor_position' }
11
+ | { type: 'mouse_move'; point: Point }
12
+ | { type: 'click'; button: ClickButton; point?: Point; double?: boolean }
13
+ | { type: 'drag'; from: Point; to: Point; button?: ClickButton }
14
+ | { type: 'type'; text: string }
15
+ | { type: 'key'; key: string }
16
+ | { type: 'scroll'; direction: ScrollDirection; amount?: number; point?: Point }
17
+ | { type: 'wait'; ms?: number };
18
+
19
+ export type RawActionTarget = {
20
+ displaySize: DisplaySize | null;
21
+ };
22
+
23
+ export type RawActionResult = {
24
+ screenshotDataUrl?: string | null;
25
+ displaySize?: DisplaySize | null;
26
+ cursor?: Point | null;
27
+ position?: Point | null;
28
+ };
@@ -0,0 +1,242 @@
1
+ import { createRequire } from 'node:module';
2
+
3
+ const require = createRequire(import.meta.url);
4
+
5
+ export type Point = { x: number; y: number };
6
+ export type ClickButton = 'left' | 'right' | 'middle';
7
+ export type ScrollDirection = 'up' | 'down' | 'left' | 'right';
8
+ export type DisplaySize = { width: number; height: number };
9
+
10
+ export type RuntimeReadiness = {
11
+ nut: any | null;
12
+ screenshot: any | null;
13
+ nutInstalled: boolean;
14
+ screenshotInstalled: boolean;
15
+ };
16
+
17
+ /**
18
+ * Coordinate space the executor reports/accepts. The screenshot pixel space is
19
+ * the canonical space agents and users address; it is mapped to the nut-js
20
+ * logical mouse space before any action runs.
21
+ */
22
+ export type ExecutorTarget = {
23
+ displaySize: DisplaySize | null;
24
+ };
25
+
26
+ export function getNut(): any | null {
27
+ try {
28
+ return require('@nut-tree-fork/nut-js');
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ export function getScreenshot(): any | null {
35
+ try {
36
+ const mod = require('screenshot-desktop');
37
+ return mod?.default || mod;
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+
43
+ export function getRuntimeReadiness(): RuntimeReadiness {
44
+ const nut = getNut();
45
+ const screenshot = getScreenshot();
46
+ return {
47
+ nut,
48
+ screenshot,
49
+ nutInstalled: Boolean(nut),
50
+ screenshotInstalled: typeof screenshot === 'function',
51
+ };
52
+ }
53
+
54
+ /** Reads the pixel dimensions from a PNG/JPEG buffer header without decoding it. */
55
+ export function readImageSize(buffer: Buffer): DisplaySize | null {
56
+ // PNG: 8-byte signature, then IHDR chunk with width/height as big-endian uint32.
57
+ if (buffer.length >= 24 && buffer[0] === 0x89 && buffer[1] === 0x50) {
58
+ return { width: buffer.readUInt32BE(16), height: buffer.readUInt32BE(20) };
59
+ }
60
+ // JPEG: scan for a Start-Of-Frame marker (0xFFC0..0xFFCF, excluding C4/C8/CC).
61
+ if (buffer.length >= 4 && buffer[0] === 0xff && buffer[1] === 0xd8) {
62
+ let offset = 2;
63
+ while (offset + 9 < buffer.length) {
64
+ if (buffer[offset] !== 0xff) {
65
+ offset += 1;
66
+ continue;
67
+ }
68
+ const marker = buffer[offset + 1];
69
+ if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
70
+ return { height: buffer.readUInt16BE(offset + 5), width: buffer.readUInt16BE(offset + 7) };
71
+ }
72
+ offset += 2 + buffer.readUInt16BE(offset + 2);
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+
78
+ export async function captureScreenshot(): Promise<{ dataUrl: string; size: DisplaySize | null }> {
79
+ const screenshot = getScreenshot();
80
+ if (typeof screenshot !== 'function') {
81
+ throw new Error('Computer Use runtime is not available.');
82
+ }
83
+ const buffer: Buffer = await screenshot({ format: 'png' });
84
+ return {
85
+ dataUrl: `data:image/png;base64,${buffer.toString('base64')}`,
86
+ size: readImageSize(buffer),
87
+ };
88
+ }
89
+
90
+ /** Returns the mouse coordinate space size (logical screen pixels). */
91
+ export async function getMouseSpaceSize(): Promise<DisplaySize> {
92
+ const nut = getNut();
93
+ if (!nut) {
94
+ throw new Error('Computer Use runtime is not available.');
95
+ }
96
+ const width = await nut.screen.width();
97
+ const height = await nut.screen.height();
98
+ return { width, height };
99
+ }
100
+
101
+ /** Maps a point from screenshot/image space to the mouse coordinate space. */
102
+ export async function toMouseSpace(target: ExecutorTarget, point: Point): Promise<Point> {
103
+ const mouseSize = await getMouseSpaceSize();
104
+ const image = target.displaySize || mouseSize;
105
+ const scaleX = image.width ? mouseSize.width / image.width : 1;
106
+ const scaleY = image.height ? mouseSize.height / image.height : 1;
107
+ return {
108
+ x: Math.round(point.x * scaleX),
109
+ y: Math.round(point.y * scaleY),
110
+ };
111
+ }
112
+
113
+ /** Maps a point from the mouse coordinate space back to screenshot/image space. */
114
+ export function toImageSpace(target: ExecutorTarget, point: Point, mouseSize: DisplaySize): Point {
115
+ const image = target.displaySize || mouseSize;
116
+ const scaleX = mouseSize.width ? image.width / mouseSize.width : 1;
117
+ const scaleY = mouseSize.height ? image.height / mouseSize.height : 1;
118
+ return {
119
+ x: Math.round(point.x * scaleX),
120
+ y: Math.round(point.y * scaleY),
121
+ };
122
+ }
123
+
124
+ function nutButton(nut: any, button: ClickButton) {
125
+ if (button === 'right') return nut.Button.RIGHT;
126
+ if (button === 'middle') return nut.Button.MIDDLE;
127
+ return nut.Button.LEFT;
128
+ }
129
+
130
+ /** Maps a key name (xdotool-style, as Anthropic's computer tool emits) to a nut-js Key. */
131
+ function nutKey(nut: any, token: string): any {
132
+ const map: Record<string, string> = {
133
+ return: 'Enter', enter: 'Enter', esc: 'Escape', escape: 'Escape', tab: 'Tab',
134
+ space: 'Space', backspace: 'Backspace', delete: 'Delete', del: 'Delete', insert: 'Insert',
135
+ up: 'Up', down: 'Down', left: 'Left', right: 'Right',
136
+ home: 'Home', end: 'End', pageup: 'PageUp', page_up: 'PageUp', pagedown: 'PageDown', page_down: 'PageDown',
137
+ ctrl: 'LeftControl', control: 'LeftControl', alt: 'LeftAlt', shift: 'LeftShift',
138
+ meta: 'LeftSuper', super: 'LeftSuper', cmd: 'LeftSuper', win: 'LeftSuper',
139
+ capslock: 'CapsLock',
140
+ };
141
+ const lower = token.toLowerCase();
142
+ if (map[lower]) {
143
+ return nut.Key[map[lower]];
144
+ }
145
+ if (/^f([1-9]|1[0-9]|2[0-4])$/.test(lower)) {
146
+ return nut.Key[`F${lower.slice(1)}`];
147
+ }
148
+ if (token.length === 1) {
149
+ const upper = token.toUpperCase();
150
+ if (nut.Key[upper] !== undefined) {
151
+ return nut.Key[upper];
152
+ }
153
+ if (nut.Key[`Num${token}`] !== undefined && /[0-9]/.test(token)) {
154
+ return nut.Key[`Num${token}`];
155
+ }
156
+ }
157
+ throw new Error(`Unsupported key: ${token}`);
158
+ }
159
+
160
+ /**
161
+ * The cross-platform OS executor. It is intentionally free of any server,
162
+ * database, or session dependencies so it can run both inside the local server
163
+ * process (OSS mode) and inside the standalone desktop agent (cloud relay).
164
+ */
165
+ export const executor = {
166
+ async configure() {
167
+ const nut = getNut();
168
+ if (nut) {
169
+ // Make actions responsive; the agent loop already paces itself with screenshots.
170
+ nut.mouse.config.autoDelayMs = 2;
171
+ nut.keyboard.config.autoDelayMs = 2;
172
+ }
173
+ return nut;
174
+ },
175
+
176
+ async cursorPosition(target: ExecutorTarget): Promise<Point> {
177
+ const nut = await this.configure();
178
+ const mouseSize = await getMouseSpaceSize();
179
+ const pos = await nut.mouse.getPosition();
180
+ return toImageSpace(target, { x: pos.x, y: pos.y }, mouseSize);
181
+ },
182
+
183
+ async moveTo(target: ExecutorTarget, point: Point): Promise<void> {
184
+ const nut = await this.configure();
185
+ const dest = await toMouseSpace(target, point);
186
+ await nut.mouse.setPosition(new nut.Point(dest.x, dest.y));
187
+ },
188
+
189
+ async click(target: ExecutorTarget, button: ClickButton, point?: Point, doubleClick = false): Promise<void> {
190
+ const nut = await this.configure();
191
+ if (point) {
192
+ await this.moveTo(target, point);
193
+ }
194
+ if (doubleClick) {
195
+ await nut.mouse.doubleClick(nutButton(nut, button));
196
+ } else {
197
+ await nut.mouse.click(nutButton(nut, button));
198
+ }
199
+ },
200
+
201
+ async drag(target: ExecutorTarget, from: Point, to: Point, button: ClickButton = 'left'): Promise<void> {
202
+ const nut = await this.configure();
203
+ const start = await toMouseSpace(target, from);
204
+ const end = await toMouseSpace(target, to);
205
+ await nut.mouse.setPosition(new nut.Point(start.x, start.y));
206
+ await nut.mouse.pressButton(nutButton(nut, button));
207
+ await nut.mouse.setPosition(new nut.Point(end.x, end.y));
208
+ await nut.mouse.releaseButton(nutButton(nut, button));
209
+ },
210
+
211
+ async type(text: string): Promise<void> {
212
+ const nut = await this.configure();
213
+ await nut.keyboard.type(text);
214
+ },
215
+
216
+ async pressChord(chord: string): Promise<void> {
217
+ const nut = await this.configure();
218
+ const tokens = chord.split('+').map((token) => token.trim()).filter(Boolean);
219
+ if (tokens.length === 0) {
220
+ return;
221
+ }
222
+ const keys = tokens.map((token) => nutKey(nut, token));
223
+ for (const key of keys) {
224
+ await nut.keyboard.pressKey(key);
225
+ }
226
+ for (const key of [...keys].reverse()) {
227
+ await nut.keyboard.releaseKey(key);
228
+ }
229
+ },
230
+
231
+ async scroll(target: ExecutorTarget, direction: ScrollDirection, amount: number, point?: Point): Promise<void> {
232
+ const nut = await this.configure();
233
+ if (point) {
234
+ await this.moveTo(target, point);
235
+ }
236
+ const steps = Math.max(1, Math.round(amount));
237
+ if (direction === 'up') await nut.mouse.scrollUp(steps);
238
+ else if (direction === 'down') await nut.mouse.scrollDown(steps);
239
+ else if (direction === 'left') await nut.mouse.scrollLeft(steps);
240
+ else await nut.mouse.scrollRight(steps);
241
+ },
242
+ };