cowork-os 0.3.21

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 (526) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1638 -0
  3. package/bin/cowork.js +42 -0
  4. package/build/entitlements.mac.plist +16 -0
  5. package/build/icon.icns +0 -0
  6. package/build/icon.png +0 -0
  7. package/dist/electron/electron/activity/ActivityRepository.js +190 -0
  8. package/dist/electron/electron/agent/browser/browser-service.js +639 -0
  9. package/dist/electron/electron/agent/context-manager.js +225 -0
  10. package/dist/electron/electron/agent/custom-skill-loader.js +566 -0
  11. package/dist/electron/electron/agent/daemon.js +975 -0
  12. package/dist/electron/electron/agent/executor.js +3561 -0
  13. package/dist/electron/electron/agent/llm/anthropic-provider.js +155 -0
  14. package/dist/electron/electron/agent/llm/bedrock-provider.js +202 -0
  15. package/dist/electron/electron/agent/llm/gemini-provider.js +375 -0
  16. package/dist/electron/electron/agent/llm/index.js +34 -0
  17. package/dist/electron/electron/agent/llm/ollama-provider.js +263 -0
  18. package/dist/electron/electron/agent/llm/openai-oauth.js +101 -0
  19. package/dist/electron/electron/agent/llm/openai-provider.js +657 -0
  20. package/dist/electron/electron/agent/llm/openrouter-provider.js +232 -0
  21. package/dist/electron/electron/agent/llm/pricing.js +160 -0
  22. package/dist/electron/electron/agent/llm/provider-factory.js +880 -0
  23. package/dist/electron/electron/agent/llm/types.js +178 -0
  24. package/dist/electron/electron/agent/queue-manager.js +378 -0
  25. package/dist/electron/electron/agent/sandbox/docker-sandbox.js +402 -0
  26. package/dist/electron/electron/agent/sandbox/macos-sandbox.js +407 -0
  27. package/dist/electron/electron/agent/sandbox/runner.js +410 -0
  28. package/dist/electron/electron/agent/sandbox/sandbox-factory.js +228 -0
  29. package/dist/electron/electron/agent/sandbox/security-utils.js +258 -0
  30. package/dist/electron/electron/agent/search/brave-provider.js +119 -0
  31. package/dist/electron/electron/agent/search/google-provider.js +100 -0
  32. package/dist/electron/electron/agent/search/index.js +28 -0
  33. package/dist/electron/electron/agent/search/provider-factory.js +395 -0
  34. package/dist/electron/electron/agent/search/serpapi-provider.js +112 -0
  35. package/dist/electron/electron/agent/search/tavily-provider.js +90 -0
  36. package/dist/electron/electron/agent/search/types.js +40 -0
  37. package/dist/electron/electron/agent/security/index.js +12 -0
  38. package/dist/electron/electron/agent/security/input-sanitizer.js +303 -0
  39. package/dist/electron/electron/agent/security/output-filter.js +217 -0
  40. package/dist/electron/electron/agent/skill-eligibility.js +281 -0
  41. package/dist/electron/electron/agent/skill-registry.js +396 -0
  42. package/dist/electron/electron/agent/skills/document.js +878 -0
  43. package/dist/electron/electron/agent/skills/image-generator.js +225 -0
  44. package/dist/electron/electron/agent/skills/organizer.js +141 -0
  45. package/dist/electron/electron/agent/skills/presentation.js +367 -0
  46. package/dist/electron/electron/agent/skills/spreadsheet.js +165 -0
  47. package/dist/electron/electron/agent/tools/browser-tools.js +523 -0
  48. package/dist/electron/electron/agent/tools/builtin-settings.js +384 -0
  49. package/dist/electron/electron/agent/tools/canvas-tools.js +530 -0
  50. package/dist/electron/electron/agent/tools/cron-tools.js +577 -0
  51. package/dist/electron/electron/agent/tools/edit-tools.js +194 -0
  52. package/dist/electron/electron/agent/tools/file-tools.js +719 -0
  53. package/dist/electron/electron/agent/tools/glob-tools.js +283 -0
  54. package/dist/electron/electron/agent/tools/grep-tools.js +387 -0
  55. package/dist/electron/electron/agent/tools/image-tools.js +111 -0
  56. package/dist/electron/electron/agent/tools/mention-tools.js +282 -0
  57. package/dist/electron/electron/agent/tools/node-tools.js +476 -0
  58. package/dist/electron/electron/agent/tools/registry.js +2719 -0
  59. package/dist/electron/electron/agent/tools/search-tools.js +91 -0
  60. package/dist/electron/electron/agent/tools/shell-tools.js +574 -0
  61. package/dist/electron/electron/agent/tools/skill-tools.js +274 -0
  62. package/dist/electron/electron/agent/tools/system-tools.js +578 -0
  63. package/dist/electron/electron/agent/tools/web-fetch-tools.js +444 -0
  64. package/dist/electron/electron/agent/tools/x-tools.js +264 -0
  65. package/dist/electron/electron/agents/AgentRoleRepository.js +420 -0
  66. package/dist/electron/electron/agents/HeartbeatService.js +356 -0
  67. package/dist/electron/electron/agents/MentionRepository.js +197 -0
  68. package/dist/electron/electron/agents/TaskSubscriptionRepository.js +168 -0
  69. package/dist/electron/electron/agents/WorkingStateRepository.js +229 -0
  70. package/dist/electron/electron/canvas/canvas-manager.js +714 -0
  71. package/dist/electron/electron/canvas/canvas-preload.js +53 -0
  72. package/dist/electron/electron/canvas/canvas-protocol.js +195 -0
  73. package/dist/electron/electron/canvas/canvas-store.js +174 -0
  74. package/dist/electron/electron/canvas/index.js +13 -0
  75. package/dist/electron/electron/control-plane/client.js +364 -0
  76. package/dist/electron/electron/control-plane/handlers.js +572 -0
  77. package/dist/electron/electron/control-plane/index.js +41 -0
  78. package/dist/electron/electron/control-plane/node-manager.js +264 -0
  79. package/dist/electron/electron/control-plane/protocol.js +194 -0
  80. package/dist/electron/electron/control-plane/remote-client.js +437 -0
  81. package/dist/electron/electron/control-plane/server.js +640 -0
  82. package/dist/electron/electron/control-plane/settings.js +369 -0
  83. package/dist/electron/electron/control-plane/ssh-tunnel.js +549 -0
  84. package/dist/electron/electron/cron/index.js +30 -0
  85. package/dist/electron/electron/cron/schedule.js +190 -0
  86. package/dist/electron/electron/cron/service.js +614 -0
  87. package/dist/electron/electron/cron/store.js +155 -0
  88. package/dist/electron/electron/cron/types.js +82 -0
  89. package/dist/electron/electron/cron/webhook.js +258 -0
  90. package/dist/electron/electron/database/SecureSettingsRepository.js +444 -0
  91. package/dist/electron/electron/database/TaskLabelRepository.js +120 -0
  92. package/dist/electron/electron/database/repositories.js +1781 -0
  93. package/dist/electron/electron/database/schema.js +978 -0
  94. package/dist/electron/electron/extensions/index.js +33 -0
  95. package/dist/electron/electron/extensions/loader.js +313 -0
  96. package/dist/electron/electron/extensions/registry.js +485 -0
  97. package/dist/electron/electron/extensions/types.js +11 -0
  98. package/dist/electron/electron/gateway/channel-registry.js +1102 -0
  99. package/dist/electron/electron/gateway/channels/bluebubbles-client.js +479 -0
  100. package/dist/electron/electron/gateway/channels/bluebubbles.js +432 -0
  101. package/dist/electron/electron/gateway/channels/discord.js +975 -0
  102. package/dist/electron/electron/gateway/channels/email-client.js +593 -0
  103. package/dist/electron/electron/gateway/channels/email.js +443 -0
  104. package/dist/electron/electron/gateway/channels/google-chat.js +631 -0
  105. package/dist/electron/electron/gateway/channels/imessage-client.js +363 -0
  106. package/dist/electron/electron/gateway/channels/imessage.js +465 -0
  107. package/dist/electron/electron/gateway/channels/index.js +36 -0
  108. package/dist/electron/electron/gateway/channels/line-client.js +470 -0
  109. package/dist/electron/electron/gateway/channels/line.js +479 -0
  110. package/dist/electron/electron/gateway/channels/matrix-client.js +432 -0
  111. package/dist/electron/electron/gateway/channels/matrix.js +592 -0
  112. package/dist/electron/electron/gateway/channels/mattermost-client.js +394 -0
  113. package/dist/electron/electron/gateway/channels/mattermost.js +496 -0
  114. package/dist/electron/electron/gateway/channels/signal-client.js +500 -0
  115. package/dist/electron/electron/gateway/channels/signal.js +582 -0
  116. package/dist/electron/electron/gateway/channels/slack.js +415 -0
  117. package/dist/electron/electron/gateway/channels/teams.js +596 -0
  118. package/dist/electron/electron/gateway/channels/telegram.js +1390 -0
  119. package/dist/electron/electron/gateway/channels/twitch-client.js +502 -0
  120. package/dist/electron/electron/gateway/channels/twitch.js +396 -0
  121. package/dist/electron/electron/gateway/channels/types.js +8 -0
  122. package/dist/electron/electron/gateway/channels/whatsapp.js +953 -0
  123. package/dist/electron/electron/gateway/context-policy.js +268 -0
  124. package/dist/electron/electron/gateway/index.js +1063 -0
  125. package/dist/electron/electron/gateway/infrastructure.js +496 -0
  126. package/dist/electron/electron/gateway/router.js +2700 -0
  127. package/dist/electron/electron/gateway/security.js +375 -0
  128. package/dist/electron/electron/gateway/session.js +115 -0
  129. package/dist/electron/electron/gateway/tunnel.js +503 -0
  130. package/dist/electron/electron/guardrails/guardrail-manager.js +348 -0
  131. package/dist/electron/electron/hooks/gmail-watcher.js +300 -0
  132. package/dist/electron/electron/hooks/index.js +46 -0
  133. package/dist/electron/electron/hooks/mappings.js +381 -0
  134. package/dist/electron/electron/hooks/server.js +480 -0
  135. package/dist/electron/electron/hooks/settings.js +447 -0
  136. package/dist/electron/electron/hooks/types.js +41 -0
  137. package/dist/electron/electron/ipc/canvas-handlers.js +158 -0
  138. package/dist/electron/electron/ipc/handlers.js +3138 -0
  139. package/dist/electron/electron/ipc/mission-control-handlers.js +141 -0
  140. package/dist/electron/electron/main.js +448 -0
  141. package/dist/electron/electron/mcp/client/MCPClientManager.js +330 -0
  142. package/dist/electron/electron/mcp/client/MCPServerConnection.js +437 -0
  143. package/dist/electron/electron/mcp/client/transports/SSETransport.js +304 -0
  144. package/dist/electron/electron/mcp/client/transports/StdioTransport.js +307 -0
  145. package/dist/electron/electron/mcp/client/transports/WebSocketTransport.js +329 -0
  146. package/dist/electron/electron/mcp/host/MCPHostServer.js +354 -0
  147. package/dist/electron/electron/mcp/host/ToolAdapter.js +100 -0
  148. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +497 -0
  149. package/dist/electron/electron/mcp/settings.js +446 -0
  150. package/dist/electron/electron/mcp/types.js +59 -0
  151. package/dist/electron/electron/memory/MemoryService.js +435 -0
  152. package/dist/electron/electron/notifications/index.js +17 -0
  153. package/dist/electron/electron/notifications/service.js +118 -0
  154. package/dist/electron/electron/notifications/store.js +144 -0
  155. package/dist/electron/electron/preload.js +842 -0
  156. package/dist/electron/electron/reports/StandupReportService.js +272 -0
  157. package/dist/electron/electron/security/concurrency.js +293 -0
  158. package/dist/electron/electron/security/index.js +15 -0
  159. package/dist/electron/electron/security/policy-manager.js +435 -0
  160. package/dist/electron/electron/settings/appearance-manager.js +193 -0
  161. package/dist/electron/electron/settings/personality-manager.js +724 -0
  162. package/dist/electron/electron/settings/x-manager.js +58 -0
  163. package/dist/electron/electron/tailscale/exposure.js +188 -0
  164. package/dist/electron/electron/tailscale/index.js +28 -0
  165. package/dist/electron/electron/tailscale/settings.js +205 -0
  166. package/dist/electron/electron/tailscale/tailscale.js +355 -0
  167. package/dist/electron/electron/tray/QuickInputWindow.js +568 -0
  168. package/dist/electron/electron/tray/TrayManager.js +895 -0
  169. package/dist/electron/electron/tray/index.js +9 -0
  170. package/dist/electron/electron/updater/index.js +6 -0
  171. package/dist/electron/electron/updater/update-manager.js +418 -0
  172. package/dist/electron/electron/utils/env-migration.js +209 -0
  173. package/dist/electron/electron/utils/process.js +102 -0
  174. package/dist/electron/electron/utils/rate-limiter.js +104 -0
  175. package/dist/electron/electron/utils/validation.js +419 -0
  176. package/dist/electron/electron/utils/x-cli.js +177 -0
  177. package/dist/electron/electron/voice/VoiceService.js +507 -0
  178. package/dist/electron/electron/voice/index.js +14 -0
  179. package/dist/electron/electron/voice/voice-settings-manager.js +359 -0
  180. package/dist/electron/shared/channelMessages.js +170 -0
  181. package/dist/electron/shared/types.js +1185 -0
  182. package/package.json +159 -0
  183. package/resources/skills/1password.json +10 -0
  184. package/resources/skills/add-documentation.json +31 -0
  185. package/resources/skills/analyze-csv.json +17 -0
  186. package/resources/skills/apple-notes.json +10 -0
  187. package/resources/skills/apple-reminders.json +10 -0
  188. package/resources/skills/auto-commenter.json +10 -0
  189. package/resources/skills/bear-notes.json +10 -0
  190. package/resources/skills/bird.json +35 -0
  191. package/resources/skills/blogwatcher.json +10 -0
  192. package/resources/skills/blucli.json +10 -0
  193. package/resources/skills/bluebubbles.json +10 -0
  194. package/resources/skills/camsnap.json +10 -0
  195. package/resources/skills/clean-imports.json +18 -0
  196. package/resources/skills/code-review.json +18 -0
  197. package/resources/skills/coding-agent.json +10 -0
  198. package/resources/skills/compare-files.json +23 -0
  199. package/resources/skills/convert-code.json +34 -0
  200. package/resources/skills/create-changelog.json +24 -0
  201. package/resources/skills/debug-error.json +17 -0
  202. package/resources/skills/dependency-check.json +10 -0
  203. package/resources/skills/discord.json +10 -0
  204. package/resources/skills/eightctl.json +10 -0
  205. package/resources/skills/explain-code.json +29 -0
  206. package/resources/skills/extract-todos.json +18 -0
  207. package/resources/skills/food-order.json +10 -0
  208. package/resources/skills/gemini.json +10 -0
  209. package/resources/skills/generate-readme.json +10 -0
  210. package/resources/skills/gifgrep.json +10 -0
  211. package/resources/skills/git-commit.json +10 -0
  212. package/resources/skills/github.json +10 -0
  213. package/resources/skills/gog.json +10 -0
  214. package/resources/skills/goplaces.json +10 -0
  215. package/resources/skills/himalaya.json +10 -0
  216. package/resources/skills/imsg.json +10 -0
  217. package/resources/skills/karpathy-guidelines.json +12 -0
  218. package/resources/skills/last30days.json +26 -0
  219. package/resources/skills/local-places.json +10 -0
  220. package/resources/skills/mcporter.json +10 -0
  221. package/resources/skills/model-usage.json +10 -0
  222. package/resources/skills/nano-banana-pro.json +10 -0
  223. package/resources/skills/nano-pdf.json +10 -0
  224. package/resources/skills/notion.json +10 -0
  225. package/resources/skills/obsidian.json +10 -0
  226. package/resources/skills/openai-image-gen.json +10 -0
  227. package/resources/skills/openai-whisper-api.json +10 -0
  228. package/resources/skills/openai-whisper.json +10 -0
  229. package/resources/skills/openhue.json +10 -0
  230. package/resources/skills/oracle.json +10 -0
  231. package/resources/skills/ordercli.json +10 -0
  232. package/resources/skills/peekaboo.json +10 -0
  233. package/resources/skills/project-structure.json +10 -0
  234. package/resources/skills/proofread.json +17 -0
  235. package/resources/skills/refactor-code.json +31 -0
  236. package/resources/skills/rename-symbol.json +23 -0
  237. package/resources/skills/sag.json +10 -0
  238. package/resources/skills/security-audit.json +18 -0
  239. package/resources/skills/session-logs.json +10 -0
  240. package/resources/skills/sherpa-onnx-tts.json +10 -0
  241. package/resources/skills/skill-creator.json +15 -0
  242. package/resources/skills/skill-hub.json +29 -0
  243. package/resources/skills/slack.json +10 -0
  244. package/resources/skills/songsee.json +10 -0
  245. package/resources/skills/sonoscli.json +10 -0
  246. package/resources/skills/spotify-player.json +10 -0
  247. package/resources/skills/startup-cfo.json +55 -0
  248. package/resources/skills/summarize-folder.json +18 -0
  249. package/resources/skills/summarize.json +10 -0
  250. package/resources/skills/things-mac.json +10 -0
  251. package/resources/skills/tmux.json +10 -0
  252. package/resources/skills/translate.json +36 -0
  253. package/resources/skills/trello.json +10 -0
  254. package/resources/skills/video-frames.json +10 -0
  255. package/resources/skills/voice-call.json +10 -0
  256. package/resources/skills/wacli.json +10 -0
  257. package/resources/skills/weather.json +10 -0
  258. package/resources/skills/write-tests.json +31 -0
  259. package/src/electron/activity/ActivityRepository.ts +238 -0
  260. package/src/electron/agent/browser/browser-service.ts +721 -0
  261. package/src/electron/agent/context-manager.ts +257 -0
  262. package/src/electron/agent/custom-skill-loader.ts +634 -0
  263. package/src/electron/agent/daemon.ts +1097 -0
  264. package/src/electron/agent/executor.ts +4017 -0
  265. package/src/electron/agent/llm/anthropic-provider.ts +175 -0
  266. package/src/electron/agent/llm/bedrock-provider.ts +236 -0
  267. package/src/electron/agent/llm/gemini-provider.ts +422 -0
  268. package/src/electron/agent/llm/index.ts +9 -0
  269. package/src/electron/agent/llm/ollama-provider.ts +347 -0
  270. package/src/electron/agent/llm/openai-oauth.ts +127 -0
  271. package/src/electron/agent/llm/openai-provider.ts +686 -0
  272. package/src/electron/agent/llm/openrouter-provider.ts +273 -0
  273. package/src/electron/agent/llm/pricing.ts +180 -0
  274. package/src/electron/agent/llm/provider-factory.ts +971 -0
  275. package/src/electron/agent/llm/types.ts +291 -0
  276. package/src/electron/agent/queue-manager.ts +408 -0
  277. package/src/electron/agent/sandbox/docker-sandbox.ts +453 -0
  278. package/src/electron/agent/sandbox/macos-sandbox.ts +426 -0
  279. package/src/electron/agent/sandbox/runner.ts +453 -0
  280. package/src/electron/agent/sandbox/sandbox-factory.ts +337 -0
  281. package/src/electron/agent/sandbox/security-utils.ts +251 -0
  282. package/src/electron/agent/search/brave-provider.ts +141 -0
  283. package/src/electron/agent/search/google-provider.ts +131 -0
  284. package/src/electron/agent/search/index.ts +6 -0
  285. package/src/electron/agent/search/provider-factory.ts +450 -0
  286. package/src/electron/agent/search/serpapi-provider.ts +138 -0
  287. package/src/electron/agent/search/tavily-provider.ts +108 -0
  288. package/src/electron/agent/search/types.ts +118 -0
  289. package/src/electron/agent/security/index.ts +20 -0
  290. package/src/electron/agent/security/input-sanitizer.ts +380 -0
  291. package/src/electron/agent/security/output-filter.ts +259 -0
  292. package/src/electron/agent/skill-eligibility.ts +334 -0
  293. package/src/electron/agent/skill-registry.ts +457 -0
  294. package/src/electron/agent/skills/document.ts +1070 -0
  295. package/src/electron/agent/skills/image-generator.ts +272 -0
  296. package/src/electron/agent/skills/organizer.ts +131 -0
  297. package/src/electron/agent/skills/presentation.ts +418 -0
  298. package/src/electron/agent/skills/spreadsheet.ts +166 -0
  299. package/src/electron/agent/tools/browser-tools.ts +546 -0
  300. package/src/electron/agent/tools/builtin-settings.ts +422 -0
  301. package/src/electron/agent/tools/canvas-tools.ts +572 -0
  302. package/src/electron/agent/tools/cron-tools.ts +723 -0
  303. package/src/electron/agent/tools/edit-tools.ts +196 -0
  304. package/src/electron/agent/tools/file-tools.ts +811 -0
  305. package/src/electron/agent/tools/glob-tools.ts +303 -0
  306. package/src/electron/agent/tools/grep-tools.ts +432 -0
  307. package/src/electron/agent/tools/image-tools.ts +126 -0
  308. package/src/electron/agent/tools/mention-tools.ts +371 -0
  309. package/src/electron/agent/tools/node-tools.ts +550 -0
  310. package/src/electron/agent/tools/registry.ts +3052 -0
  311. package/src/electron/agent/tools/search-tools.ts +111 -0
  312. package/src/electron/agent/tools/shell-tools.ts +651 -0
  313. package/src/electron/agent/tools/skill-tools.ts +340 -0
  314. package/src/electron/agent/tools/system-tools.ts +665 -0
  315. package/src/electron/agent/tools/web-fetch-tools.ts +528 -0
  316. package/src/electron/agent/tools/x-tools.ts +267 -0
  317. package/src/electron/agents/AgentRoleRepository.ts +557 -0
  318. package/src/electron/agents/HeartbeatService.ts +469 -0
  319. package/src/electron/agents/MentionRepository.ts +242 -0
  320. package/src/electron/agents/TaskSubscriptionRepository.ts +231 -0
  321. package/src/electron/agents/WorkingStateRepository.ts +278 -0
  322. package/src/electron/canvas/canvas-manager.ts +818 -0
  323. package/src/electron/canvas/canvas-preload.ts +102 -0
  324. package/src/electron/canvas/canvas-protocol.ts +174 -0
  325. package/src/electron/canvas/canvas-store.ts +200 -0
  326. package/src/electron/canvas/index.ts +8 -0
  327. package/src/electron/control-plane/client.ts +527 -0
  328. package/src/electron/control-plane/handlers.ts +723 -0
  329. package/src/electron/control-plane/index.ts +51 -0
  330. package/src/electron/control-plane/node-manager.ts +322 -0
  331. package/src/electron/control-plane/protocol.ts +269 -0
  332. package/src/electron/control-plane/remote-client.ts +517 -0
  333. package/src/electron/control-plane/server.ts +853 -0
  334. package/src/electron/control-plane/settings.ts +401 -0
  335. package/src/electron/control-plane/ssh-tunnel.ts +624 -0
  336. package/src/electron/cron/index.ts +9 -0
  337. package/src/electron/cron/schedule.ts +217 -0
  338. package/src/electron/cron/service.ts +743 -0
  339. package/src/electron/cron/store.ts +165 -0
  340. package/src/electron/cron/types.ts +291 -0
  341. package/src/electron/cron/webhook.ts +303 -0
  342. package/src/electron/database/SecureSettingsRepository.ts +514 -0
  343. package/src/electron/database/TaskLabelRepository.ts +148 -0
  344. package/src/electron/database/repositories.ts +2397 -0
  345. package/src/electron/database/schema.ts +1017 -0
  346. package/src/electron/extensions/index.ts +18 -0
  347. package/src/electron/extensions/loader.ts +336 -0
  348. package/src/electron/extensions/registry.ts +546 -0
  349. package/src/electron/extensions/types.ts +372 -0
  350. package/src/electron/gateway/channel-registry.ts +1267 -0
  351. package/src/electron/gateway/channels/bluebubbles-client.ts +641 -0
  352. package/src/electron/gateway/channels/bluebubbles.ts +509 -0
  353. package/src/electron/gateway/channels/discord.ts +1150 -0
  354. package/src/electron/gateway/channels/email-client.ts +708 -0
  355. package/src/electron/gateway/channels/email.ts +516 -0
  356. package/src/electron/gateway/channels/google-chat.ts +760 -0
  357. package/src/electron/gateway/channels/imessage-client.ts +473 -0
  358. package/src/electron/gateway/channels/imessage.ts +520 -0
  359. package/src/electron/gateway/channels/index.ts +21 -0
  360. package/src/electron/gateway/channels/line-client.ts +598 -0
  361. package/src/electron/gateway/channels/line.ts +559 -0
  362. package/src/electron/gateway/channels/matrix-client.ts +632 -0
  363. package/src/electron/gateway/channels/matrix.ts +655 -0
  364. package/src/electron/gateway/channels/mattermost-client.ts +526 -0
  365. package/src/electron/gateway/channels/mattermost.ts +550 -0
  366. package/src/electron/gateway/channels/signal-client.ts +722 -0
  367. package/src/electron/gateway/channels/signal.ts +666 -0
  368. package/src/electron/gateway/channels/slack.ts +458 -0
  369. package/src/electron/gateway/channels/teams.ts +681 -0
  370. package/src/electron/gateway/channels/telegram.ts +1727 -0
  371. package/src/electron/gateway/channels/twitch-client.ts +665 -0
  372. package/src/electron/gateway/channels/twitch.ts +468 -0
  373. package/src/electron/gateway/channels/types.ts +1002 -0
  374. package/src/electron/gateway/channels/whatsapp.ts +1101 -0
  375. package/src/electron/gateway/context-policy.ts +382 -0
  376. package/src/electron/gateway/index.ts +1274 -0
  377. package/src/electron/gateway/infrastructure.ts +645 -0
  378. package/src/electron/gateway/router.ts +3206 -0
  379. package/src/electron/gateway/security.ts +422 -0
  380. package/src/electron/gateway/session.ts +144 -0
  381. package/src/electron/gateway/tunnel.ts +626 -0
  382. package/src/electron/guardrails/guardrail-manager.ts +380 -0
  383. package/src/electron/hooks/gmail-watcher.ts +355 -0
  384. package/src/electron/hooks/index.ts +30 -0
  385. package/src/electron/hooks/mappings.ts +404 -0
  386. package/src/electron/hooks/server.ts +574 -0
  387. package/src/electron/hooks/settings.ts +466 -0
  388. package/src/electron/hooks/types.ts +245 -0
  389. package/src/electron/ipc/canvas-handlers.ts +223 -0
  390. package/src/electron/ipc/handlers.ts +3661 -0
  391. package/src/electron/ipc/mission-control-handlers.ts +182 -0
  392. package/src/electron/main.ts +496 -0
  393. package/src/electron/mcp/client/MCPClientManager.ts +406 -0
  394. package/src/electron/mcp/client/MCPServerConnection.ts +514 -0
  395. package/src/electron/mcp/client/transports/SSETransport.ts +360 -0
  396. package/src/electron/mcp/client/transports/StdioTransport.ts +355 -0
  397. package/src/electron/mcp/client/transports/WebSocketTransport.ts +384 -0
  398. package/src/electron/mcp/host/MCPHostServer.ts +388 -0
  399. package/src/electron/mcp/host/ToolAdapter.ts +140 -0
  400. package/src/electron/mcp/registry/MCPRegistryManager.ts +565 -0
  401. package/src/electron/mcp/settings.ts +468 -0
  402. package/src/electron/mcp/types.ts +371 -0
  403. package/src/electron/memory/MemoryService.ts +523 -0
  404. package/src/electron/notifications/index.ts +16 -0
  405. package/src/electron/notifications/service.ts +161 -0
  406. package/src/electron/notifications/store.ts +163 -0
  407. package/src/electron/preload.ts +2845 -0
  408. package/src/electron/reports/StandupReportService.ts +356 -0
  409. package/src/electron/security/concurrency.ts +333 -0
  410. package/src/electron/security/index.ts +17 -0
  411. package/src/electron/security/policy-manager.ts +539 -0
  412. package/src/electron/settings/appearance-manager.ts +182 -0
  413. package/src/electron/settings/personality-manager.ts +800 -0
  414. package/src/electron/settings/x-manager.ts +62 -0
  415. package/src/electron/tailscale/exposure.ts +262 -0
  416. package/src/electron/tailscale/index.ts +34 -0
  417. package/src/electron/tailscale/settings.ts +218 -0
  418. package/src/electron/tailscale/tailscale.ts +379 -0
  419. package/src/electron/tray/QuickInputWindow.ts +609 -0
  420. package/src/electron/tray/TrayManager.ts +1005 -0
  421. package/src/electron/tray/index.ts +6 -0
  422. package/src/electron/updater/index.ts +1 -0
  423. package/src/electron/updater/update-manager.ts +447 -0
  424. package/src/electron/utils/env-migration.ts +203 -0
  425. package/src/electron/utils/process.ts +124 -0
  426. package/src/electron/utils/rate-limiter.ts +130 -0
  427. package/src/electron/utils/validation.ts +493 -0
  428. package/src/electron/utils/x-cli.ts +198 -0
  429. package/src/electron/voice/VoiceService.ts +583 -0
  430. package/src/electron/voice/index.ts +9 -0
  431. package/src/electron/voice/voice-settings-manager.ts +403 -0
  432. package/src/renderer/App.tsx +775 -0
  433. package/src/renderer/components/ActivityFeed.tsx +407 -0
  434. package/src/renderer/components/ActivityFeedItem.tsx +285 -0
  435. package/src/renderer/components/AgentRoleCard.tsx +343 -0
  436. package/src/renderer/components/AgentRoleEditor.tsx +805 -0
  437. package/src/renderer/components/AgentSquadSettings.tsx +295 -0
  438. package/src/renderer/components/AgentWorkingStatePanel.tsx +411 -0
  439. package/src/renderer/components/AppearanceSettings.tsx +122 -0
  440. package/src/renderer/components/ApprovalDialog.tsx +100 -0
  441. package/src/renderer/components/BlueBubblesSettings.tsx +505 -0
  442. package/src/renderer/components/BuiltinToolsSettings.tsx +307 -0
  443. package/src/renderer/components/CanvasPreview.tsx +1189 -0
  444. package/src/renderer/components/CommandOutput.tsx +202 -0
  445. package/src/renderer/components/ContextPolicySettings.tsx +523 -0
  446. package/src/renderer/components/ControlPlaneSettings.tsx +1134 -0
  447. package/src/renderer/components/DisclaimerModal.tsx +124 -0
  448. package/src/renderer/components/DiscordSettings.tsx +436 -0
  449. package/src/renderer/components/EmailSettings.tsx +606 -0
  450. package/src/renderer/components/ExtensionsSettings.tsx +542 -0
  451. package/src/renderer/components/FileViewer.tsx +224 -0
  452. package/src/renderer/components/GoogleChatSettings.tsx +535 -0
  453. package/src/renderer/components/GuardrailSettings.tsx +487 -0
  454. package/src/renderer/components/HooksSettings.tsx +581 -0
  455. package/src/renderer/components/ImessageSettings.tsx +484 -0
  456. package/src/renderer/components/LineSettings.tsx +483 -0
  457. package/src/renderer/components/MCPRegistryBrowser.tsx +386 -0
  458. package/src/renderer/components/MCPSettings.tsx +943 -0
  459. package/src/renderer/components/MainContent.tsx +2433 -0
  460. package/src/renderer/components/MatrixSettings.tsx +510 -0
  461. package/src/renderer/components/MattermostSettings.tsx +473 -0
  462. package/src/renderer/components/MemorySettings.tsx +247 -0
  463. package/src/renderer/components/MentionBadge.tsx +87 -0
  464. package/src/renderer/components/MentionInput.tsx +409 -0
  465. package/src/renderer/components/MentionList.tsx +476 -0
  466. package/src/renderer/components/MissionControlPanel.tsx +1995 -0
  467. package/src/renderer/components/NodesSettings.tsx +316 -0
  468. package/src/renderer/components/NotificationPanel.tsx +481 -0
  469. package/src/renderer/components/Onboarding/AwakeningOrb.tsx +44 -0
  470. package/src/renderer/components/Onboarding/Onboarding.tsx +443 -0
  471. package/src/renderer/components/Onboarding/TypewriterText.tsx +102 -0
  472. package/src/renderer/components/Onboarding/index.ts +3 -0
  473. package/src/renderer/components/OnboardingModal.tsx +698 -0
  474. package/src/renderer/components/PairingCodeDisplay.tsx +324 -0
  475. package/src/renderer/components/PersonalitySettings.tsx +597 -0
  476. package/src/renderer/components/QueueSettings.tsx +119 -0
  477. package/src/renderer/components/QuickTaskFAB.tsx +71 -0
  478. package/src/renderer/components/RightPanel.tsx +413 -0
  479. package/src/renderer/components/ScheduledTasksSettings.tsx +1328 -0
  480. package/src/renderer/components/SearchSettings.tsx +328 -0
  481. package/src/renderer/components/Settings.tsx +1504 -0
  482. package/src/renderer/components/Sidebar.tsx +344 -0
  483. package/src/renderer/components/SignalSettings.tsx +673 -0
  484. package/src/renderer/components/SkillHubBrowser.tsx +458 -0
  485. package/src/renderer/components/SkillParameterModal.tsx +185 -0
  486. package/src/renderer/components/SkillsSettings.tsx +451 -0
  487. package/src/renderer/components/SlackSettings.tsx +442 -0
  488. package/src/renderer/components/StandupReportViewer.tsx +614 -0
  489. package/src/renderer/components/TaskBoard.tsx +498 -0
  490. package/src/renderer/components/TaskBoardCard.tsx +357 -0
  491. package/src/renderer/components/TaskBoardColumn.tsx +211 -0
  492. package/src/renderer/components/TaskLabelManager.tsx +472 -0
  493. package/src/renderer/components/TaskQueuePanel.tsx +144 -0
  494. package/src/renderer/components/TaskQuickActions.tsx +492 -0
  495. package/src/renderer/components/TaskTimeline.tsx +216 -0
  496. package/src/renderer/components/TaskView.tsx +162 -0
  497. package/src/renderer/components/TeamsSettings.tsx +518 -0
  498. package/src/renderer/components/TelegramSettings.tsx +421 -0
  499. package/src/renderer/components/Toast.tsx +76 -0
  500. package/src/renderer/components/TraySettings.tsx +189 -0
  501. package/src/renderer/components/TwitchSettings.tsx +511 -0
  502. package/src/renderer/components/UpdateSettings.tsx +295 -0
  503. package/src/renderer/components/VoiceIndicator.tsx +270 -0
  504. package/src/renderer/components/VoiceSettings.tsx +867 -0
  505. package/src/renderer/components/WhatsAppSettings.tsx +721 -0
  506. package/src/renderer/components/WorkingStateEditor.tsx +309 -0
  507. package/src/renderer/components/WorkingStateHistory.tsx +481 -0
  508. package/src/renderer/components/WorkspaceSelector.tsx +150 -0
  509. package/src/renderer/components/XSettings.tsx +311 -0
  510. package/src/renderer/global.d.ts +9 -0
  511. package/src/renderer/hooks/useAgentContext.ts +153 -0
  512. package/src/renderer/hooks/useOnboardingFlow.ts +548 -0
  513. package/src/renderer/hooks/useVoiceInput.ts +268 -0
  514. package/src/renderer/index.html +12 -0
  515. package/src/renderer/main.tsx +10 -0
  516. package/src/renderer/public/cowork-os-logo.png +0 -0
  517. package/src/renderer/quick-input.html +164 -0
  518. package/src/renderer/styles/index.css +14504 -0
  519. package/src/renderer/utils/agentMessages.ts +749 -0
  520. package/src/renderer/utils/voice-directives.ts +169 -0
  521. package/src/shared/channelMessages.ts +213 -0
  522. package/src/shared/types.ts +3608 -0
  523. package/tsconfig.electron.json +26 -0
  524. package/tsconfig.json +26 -0
  525. package/tsconfig.node.json +10 -0
  526. package/vite.config.ts +23 -0
@@ -0,0 +1,572 @@
1
+ /**
2
+ * Canvas Tools
3
+ *
4
+ * Agent tools for interacting with Live Canvas visual workspace.
5
+ * Enables the agent to:
6
+ * - Create canvas sessions
7
+ * - Push HTML/CSS/JS content
8
+ * - Execute JavaScript in the canvas context
9
+ * - Take snapshots of the canvas
10
+ * - Show/hide/close canvas windows
11
+ */
12
+
13
+ import { Workspace } from '../../../shared/types';
14
+ import { AgentDaemon } from '../daemon';
15
+ import { CanvasManager } from '../../canvas/canvas-manager';
16
+ import { LLMTool } from '../llm/types';
17
+ import * as fs from 'fs/promises';
18
+ import * as path from 'path';
19
+
20
+ /**
21
+ * CanvasTools provides agent capabilities for visual content rendering
22
+ */
23
+ export class CanvasTools {
24
+ private manager: CanvasManager;
25
+ private sessionCutoff: number | null = null;
26
+
27
+ constructor(
28
+ private workspace: Workspace,
29
+ private daemon: AgentDaemon,
30
+ private taskId: string
31
+ ) {
32
+ this.manager = CanvasManager.getInstance();
33
+ }
34
+
35
+ /**
36
+ * Set a cutoff timestamp for enforcing new canvas sessions on follow-ups.
37
+ * Any canvas_push/open_url targeting sessions created before this cutoff will be rejected.
38
+ */
39
+ setSessionCutoff(cutoff: number | null): void {
40
+ this.sessionCutoff = cutoff;
41
+ }
42
+
43
+ private enforceSessionCutoff(sessionId: string, action: 'canvas_push' | 'canvas_open_url'): void {
44
+ if (!this.sessionCutoff) return;
45
+ const session = this.manager.getSession(sessionId);
46
+ if (session && session.createdAt < this.sessionCutoff) {
47
+ const message = 'Canvas session belongs to a previous run. Create a new session with canvas_create for follow-up content instead of reusing an older session.';
48
+ console.error(`[CanvasTools] ${action} blocked for stale session. sessionId=${sessionId}, createdAt=${session.createdAt}, cutoff=${this.sessionCutoff}`);
49
+ throw new Error(message);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Update the workspace for this tool
55
+ */
56
+ setWorkspace(workspace: Workspace): void {
57
+ this.workspace = workspace;
58
+ }
59
+
60
+ /**
61
+ * Create a new canvas session
62
+ */
63
+ async createCanvas(title?: string): Promise<{
64
+ sessionId: string;
65
+ sessionDir: string;
66
+ }> {
67
+ this.daemon.logEvent(this.taskId, 'tool_call', {
68
+ tool: 'canvas_create',
69
+ title,
70
+ });
71
+
72
+ try {
73
+ const session = await this.manager.createSession(
74
+ this.taskId,
75
+ this.workspace.id,
76
+ title
77
+ );
78
+
79
+ this.daemon.logEvent(this.taskId, 'tool_result', {
80
+ tool: 'canvas_create',
81
+ success: true,
82
+ sessionId: session.id,
83
+ });
84
+
85
+ return {
86
+ sessionId: session.id,
87
+ sessionDir: session.sessionDir,
88
+ };
89
+ } catch (error: unknown) {
90
+ const message = error instanceof Error ? error.message : 'Unknown error';
91
+ this.daemon.logEvent(this.taskId, 'tool_error', {
92
+ tool: 'canvas_create',
93
+ error: message,
94
+ });
95
+ throw error;
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Push content to the canvas
101
+ */
102
+ async pushContent(
103
+ sessionId: string,
104
+ content: string,
105
+ filename: string = 'index.html'
106
+ ): Promise<{ success: boolean }> {
107
+ this.enforceSessionCutoff(sessionId, 'canvas_push');
108
+ let resolvedContent = content;
109
+ const defaultMarker = 'Waiting for content...';
110
+ const contentProvided = typeof content === 'string' && content.trim().length > 0;
111
+
112
+ // Validate content parameter; if missing, attempt to reuse existing canvas file
113
+ if (resolvedContent === undefined || resolvedContent === null) {
114
+ const session = this.manager.getSession(sessionId);
115
+ if (session) {
116
+ const safeFilename = path.basename(filename || 'index.html');
117
+ const filePath = path.join(session.sessionDir, safeFilename);
118
+ try {
119
+ resolvedContent = await fs.readFile(filePath, 'utf-8');
120
+ console.warn(`[CanvasTools] canvas_push missing content; reusing existing ${safeFilename} from session ${sessionId}`);
121
+ } catch (error) {
122
+ console.error(`[CanvasTools] Failed to read existing canvas content from ${filePath}:`, error);
123
+ }
124
+ }
125
+ }
126
+
127
+ // If we still have no content or only the default placeholder, try the most recent session for this task
128
+ if (
129
+ resolvedContent === undefined ||
130
+ resolvedContent === null ||
131
+ (typeof resolvedContent === 'string' && resolvedContent.includes(defaultMarker))
132
+ ) {
133
+ const otherSessions = this.manager
134
+ .listSessionsForTask(this.taskId)
135
+ .filter((s) => s.id !== sessionId && s.status === 'active')
136
+ .sort((a, b) => (b.lastUpdatedAt || 0) - (a.lastUpdatedAt || 0));
137
+
138
+ for (const session of otherSessions) {
139
+ const safeFilename = path.basename(filename || 'index.html');
140
+ const filePath = path.join(session.sessionDir, safeFilename);
141
+ try {
142
+ const candidate = await fs.readFile(filePath, 'utf-8');
143
+ if (!candidate.includes(defaultMarker)) {
144
+ resolvedContent = candidate;
145
+ console.warn(`[CanvasTools] canvas_push missing content; copied ${safeFilename} from session ${session.id}`);
146
+ break;
147
+ }
148
+ } catch (error) {
149
+ console.error(`[CanvasTools] Failed to read canvas content from ${filePath}:`, error);
150
+ }
151
+ }
152
+ }
153
+
154
+ const isPlaceholder = typeof resolvedContent === 'string' && resolvedContent.includes(defaultMarker);
155
+
156
+ if (!contentProvided && (resolvedContent === undefined || resolvedContent === null || isPlaceholder)) {
157
+ console.error(
158
+ `[CanvasTools] canvas_push called without content and no non-placeholder HTML found. sessionId=${sessionId}, filename=${filename}`
159
+ );
160
+ throw new Error(
161
+ 'Content parameter is required for canvas_push. The agent must provide HTML content to display.'
162
+ );
163
+ }
164
+
165
+ if (resolvedContent === undefined || resolvedContent === null) {
166
+ console.error(`[CanvasTools] canvas_push called without content. sessionId=${sessionId}, filename=${filename}, content type=${typeof content}`);
167
+ throw new Error('Content parameter is required for canvas_push. The agent must provide HTML content to display.');
168
+ }
169
+
170
+ this.daemon.logEvent(this.taskId, 'tool_call', {
171
+ tool: 'canvas_push',
172
+ sessionId,
173
+ filename,
174
+ contentLength: resolvedContent.length,
175
+ });
176
+
177
+ try {
178
+ await this.manager.pushContent(sessionId, resolvedContent, filename);
179
+
180
+ this.daemon.logEvent(this.taskId, 'tool_result', {
181
+ tool: 'canvas_push',
182
+ success: true,
183
+ });
184
+
185
+ return { success: true };
186
+ } catch (error: unknown) {
187
+ const message = error instanceof Error ? error.message : 'Unknown error';
188
+ this.daemon.logEvent(this.taskId, 'tool_error', {
189
+ tool: 'canvas_push',
190
+ error: message,
191
+ });
192
+ throw error;
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Open a remote URL inside the canvas window (browser mode)
198
+ */
199
+ async openUrl(
200
+ sessionId: string,
201
+ url: string,
202
+ show: boolean = true
203
+ ): Promise<{ success: boolean; url: string }> {
204
+ this.enforceSessionCutoff(sessionId, 'canvas_open_url');
205
+ this.daemon.logEvent(this.taskId, 'tool_call', {
206
+ tool: 'canvas_open_url',
207
+ sessionId,
208
+ url,
209
+ show,
210
+ });
211
+
212
+ try {
213
+ const normalizedUrl = await this.manager.openUrl(sessionId, url, { show });
214
+
215
+ this.daemon.logEvent(this.taskId, 'tool_result', {
216
+ tool: 'canvas_open_url',
217
+ success: true,
218
+ url: normalizedUrl,
219
+ });
220
+
221
+ return { success: true, url: normalizedUrl };
222
+ } catch (error: unknown) {
223
+ const message = error instanceof Error ? error.message : 'Unknown error';
224
+ this.daemon.logEvent(this.taskId, 'tool_error', {
225
+ tool: 'canvas_open_url',
226
+ error: message,
227
+ });
228
+ throw error;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Show the canvas window
234
+ */
235
+ async showCanvas(sessionId: string): Promise<{ success: boolean }> {
236
+ this.daemon.logEvent(this.taskId, 'tool_call', {
237
+ tool: 'canvas_show',
238
+ sessionId,
239
+ });
240
+
241
+ try {
242
+ await this.manager.showCanvas(sessionId);
243
+
244
+ this.daemon.logEvent(this.taskId, 'tool_result', {
245
+ tool: 'canvas_show',
246
+ success: true,
247
+ });
248
+
249
+ return { success: true };
250
+ } catch (error: unknown) {
251
+ const message = error instanceof Error ? error.message : 'Unknown error';
252
+ this.daemon.logEvent(this.taskId, 'tool_error', {
253
+ tool: 'canvas_show',
254
+ error: message,
255
+ });
256
+ throw error;
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Hide the canvas window
262
+ */
263
+ hideCanvas(sessionId: string): { success: boolean } {
264
+ this.daemon.logEvent(this.taskId, 'tool_call', {
265
+ tool: 'canvas_hide',
266
+ sessionId,
267
+ });
268
+
269
+ try {
270
+ this.manager.hideCanvas(sessionId);
271
+
272
+ this.daemon.logEvent(this.taskId, 'tool_result', {
273
+ tool: 'canvas_hide',
274
+ success: true,
275
+ });
276
+
277
+ return { success: true };
278
+ } catch (error: unknown) {
279
+ const message = error instanceof Error ? error.message : 'Unknown error';
280
+ this.daemon.logEvent(this.taskId, 'tool_error', {
281
+ tool: 'canvas_hide',
282
+ error: message,
283
+ });
284
+ throw error;
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Close the canvas session
290
+ */
291
+ async closeCanvas(sessionId: string): Promise<{ success: boolean }> {
292
+ this.daemon.logEvent(this.taskId, 'tool_call', {
293
+ tool: 'canvas_close',
294
+ sessionId,
295
+ });
296
+
297
+ try {
298
+ await this.manager.closeSession(sessionId);
299
+
300
+ this.daemon.logEvent(this.taskId, 'tool_result', {
301
+ tool: 'canvas_close',
302
+ success: true,
303
+ });
304
+
305
+ return { success: true };
306
+ } catch (error: unknown) {
307
+ const message = error instanceof Error ? error.message : 'Unknown error';
308
+ this.daemon.logEvent(this.taskId, 'tool_error', {
309
+ tool: 'canvas_close',
310
+ error: message,
311
+ });
312
+ throw error;
313
+ }
314
+ }
315
+
316
+ /**
317
+ * Execute JavaScript in the canvas context
318
+ */
319
+ async evalScript(sessionId: string, script: string): Promise<{ result: unknown }> {
320
+ this.daemon.logEvent(this.taskId, 'tool_call', {
321
+ tool: 'canvas_eval',
322
+ sessionId,
323
+ scriptLength: script.length,
324
+ });
325
+
326
+ try {
327
+ const result = await this.manager.evalScript(sessionId, script);
328
+
329
+ this.daemon.logEvent(this.taskId, 'tool_result', {
330
+ tool: 'canvas_eval',
331
+ success: true,
332
+ });
333
+
334
+ return { result };
335
+ } catch (error: unknown) {
336
+ const message = error instanceof Error ? error.message : 'Unknown error';
337
+ this.daemon.logEvent(this.taskId, 'tool_error', {
338
+ tool: 'canvas_eval',
339
+ error: message,
340
+ });
341
+ throw error;
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Take a screenshot of the canvas
347
+ */
348
+ async takeSnapshot(sessionId: string): Promise<{
349
+ imageBase64: string;
350
+ width: number;
351
+ height: number;
352
+ }> {
353
+ this.daemon.logEvent(this.taskId, 'tool_call', {
354
+ tool: 'canvas_snapshot',
355
+ sessionId,
356
+ });
357
+
358
+ try {
359
+ const snapshot = await this.manager.takeSnapshot(sessionId);
360
+
361
+ this.daemon.logEvent(this.taskId, 'tool_result', {
362
+ tool: 'canvas_snapshot',
363
+ success: true,
364
+ width: snapshot.width,
365
+ height: snapshot.height,
366
+ });
367
+
368
+ return {
369
+ imageBase64: snapshot.imageBase64,
370
+ width: snapshot.width,
371
+ height: snapshot.height,
372
+ };
373
+ } catch (error: unknown) {
374
+ const message = error instanceof Error ? error.message : 'Unknown error';
375
+ this.daemon.logEvent(this.taskId, 'tool_error', {
376
+ tool: 'canvas_snapshot',
377
+ error: message,
378
+ });
379
+ throw error;
380
+ }
381
+ }
382
+
383
+ /**
384
+ * List all canvas sessions for the current task
385
+ */
386
+ listSessions(): {
387
+ sessions: Array<{
388
+ id: string;
389
+ title?: string;
390
+ status: string;
391
+ createdAt: number;
392
+ }>;
393
+ } {
394
+ const sessions = this.manager.listSessionsForTask(this.taskId);
395
+ return {
396
+ sessions: sessions.map((s) => ({
397
+ id: s.id,
398
+ title: s.title,
399
+ status: s.status,
400
+ createdAt: s.createdAt,
401
+ })),
402
+ };
403
+ }
404
+
405
+ /**
406
+ * Static method to get tool definitions
407
+ */
408
+ static getToolDefinitions(): LLMTool[] {
409
+ return [
410
+ {
411
+ name: 'canvas_create',
412
+ description:
413
+ 'Create a new Live Canvas session for displaying interactive HTML/CSS/JS content. ' +
414
+ 'The canvas opens in a separate window where you can render visual content. ' +
415
+ 'Returns a session ID that you use for subsequent canvas operations. ' +
416
+ 'For new user requests or follow-ups, create a NEW session instead of reusing an older one unless the user explicitly asks to update the existing canvas.',
417
+ input_schema: {
418
+ type: 'object',
419
+ properties: {
420
+ title: {
421
+ type: 'string',
422
+ description: 'Optional title for the canvas window',
423
+ },
424
+ },
425
+ required: [],
426
+ },
427
+ },
428
+ {
429
+ name: 'canvas_push',
430
+ description:
431
+ 'Push HTML/CSS/JS content to a canvas session. ' +
432
+ 'You MUST provide both session_id and content parameters. ' +
433
+ 'The content parameter must be a complete HTML string (e.g., "<!DOCTYPE html><html><body>...</body></html>"). ' +
434
+ 'Use this to display interactive visualizations, forms, dashboards, or any web content. ' +
435
+ 'Do NOT overwrite an older session on follow-ups; create a new session with canvas_create unless explicitly asked to update the existing canvas.',
436
+ input_schema: {
437
+ type: 'object',
438
+ properties: {
439
+ session_id: {
440
+ type: 'string',
441
+ description: 'The canvas session ID returned from canvas_create',
442
+ },
443
+ content: {
444
+ type: 'string',
445
+ description: 'REQUIRED: The complete HTML content to display. Must be a valid HTML string, e.g., "<!DOCTYPE html><html><head><style>body{background:#1a1a2e;color:#fff}</style></head><body><h1>Title</h1></body></html>"',
446
+ },
447
+ filename: {
448
+ type: 'string',
449
+ description: 'Filename to save (default: index.html). Use for CSS/JS files.',
450
+ },
451
+ },
452
+ required: ['session_id', 'content'],
453
+ },
454
+ },
455
+ {
456
+ name: 'canvas_show',
457
+ description:
458
+ 'OPTIONAL: Open the canvas in a separate interactive window. ' +
459
+ 'The in-app preview already shows your content automatically after canvas_push. ' +
460
+ 'Only use canvas_show when the user needs full interactivity (clicking buttons, filling forms, etc.)',
461
+ input_schema: {
462
+ type: 'object',
463
+ properties: {
464
+ session_id: {
465
+ type: 'string',
466
+ description: 'The canvas session ID',
467
+ },
468
+ },
469
+ required: ['session_id'],
470
+ },
471
+ },
472
+ {
473
+ name: 'canvas_open_url',
474
+ description:
475
+ 'Open a remote web page inside the canvas window for full in-app browsing. ' +
476
+ 'Use this for websites that cannot be embedded in iframes/webviews (to avoid blank screens). ' +
477
+ 'Pass show=true to open the interactive canvas window immediately.',
478
+ input_schema: {
479
+ type: 'object',
480
+ properties: {
481
+ session_id: {
482
+ type: 'string',
483
+ description: 'The canvas session ID returned from canvas_create',
484
+ },
485
+ url: {
486
+ type: 'string',
487
+ description: 'The URL to open (http/https). If no scheme is provided, https:// will be used.',
488
+ },
489
+ show: {
490
+ type: 'boolean',
491
+ description: 'Whether to show the interactive canvas window immediately (default: true)',
492
+ },
493
+ },
494
+ required: ['session_id', 'url'],
495
+ },
496
+ },
497
+ {
498
+ name: 'canvas_hide',
499
+ description: 'Hide the canvas window without closing the session',
500
+ input_schema: {
501
+ type: 'object',
502
+ properties: {
503
+ session_id: {
504
+ type: 'string',
505
+ description: 'The canvas session ID',
506
+ },
507
+ },
508
+ required: ['session_id'],
509
+ },
510
+ },
511
+ {
512
+ name: 'canvas_close',
513
+ description: 'Close a canvas session and its window',
514
+ input_schema: {
515
+ type: 'object',
516
+ properties: {
517
+ session_id: {
518
+ type: 'string',
519
+ description: 'The canvas session ID',
520
+ },
521
+ },
522
+ required: ['session_id'],
523
+ },
524
+ },
525
+ {
526
+ name: 'canvas_eval',
527
+ description:
528
+ 'Execute JavaScript code in the canvas context. ' +
529
+ 'Use this to interact with the rendered content, read values, or trigger updates.',
530
+ input_schema: {
531
+ type: 'object',
532
+ properties: {
533
+ session_id: {
534
+ type: 'string',
535
+ description: 'The canvas session ID',
536
+ },
537
+ script: {
538
+ type: 'string',
539
+ description: 'JavaScript code to execute in the canvas context',
540
+ },
541
+ },
542
+ required: ['session_id', 'script'],
543
+ },
544
+ },
545
+ {
546
+ name: 'canvas_snapshot',
547
+ description:
548
+ 'Take a screenshot of the canvas content. ' +
549
+ 'Returns a base64-encoded PNG image of the current visual state.',
550
+ input_schema: {
551
+ type: 'object',
552
+ properties: {
553
+ session_id: {
554
+ type: 'string',
555
+ description: 'The canvas session ID',
556
+ },
557
+ },
558
+ required: ['session_id'],
559
+ },
560
+ },
561
+ {
562
+ name: 'canvas_list',
563
+ description: 'List all active canvas sessions for the current task',
564
+ input_schema: {
565
+ type: 'object',
566
+ properties: {},
567
+ required: [],
568
+ },
569
+ },
570
+ ];
571
+ }
572
+ }