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,447 @@
1
+ "use strict";
2
+ /**
3
+ * Hooks Settings Manager
4
+ *
5
+ * Manages webhook configuration with encrypted storage.
6
+ * Settings are stored encrypted in the database using SecureSettingsRepository.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.HooksSettingsManager = void 0;
46
+ exports.generateHookToken = generateHookToken;
47
+ const electron_1 = require("electron");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const crypto_1 = __importDefault(require("crypto"));
51
+ const types_1 = require("./types");
52
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
53
+ const LEGACY_SETTINGS_FILE = 'hooks-settings.json';
54
+ const MASKED_VALUE = '***configured***';
55
+ const ENCRYPTED_PREFIX = 'encrypted:';
56
+ /**
57
+ * Generate a secure random token
58
+ */
59
+ function generateHookToken(bytes = 24) {
60
+ return crypto_1.default.randomBytes(bytes).toString('hex');
61
+ }
62
+ /**
63
+ * Encrypt a secret using OS keychain via safeStorage
64
+ */
65
+ function encryptSecret(value) {
66
+ if (!value || !value.trim())
67
+ return undefined;
68
+ const trimmed = value.trim();
69
+ if (trimmed === MASKED_VALUE)
70
+ return undefined;
71
+ try {
72
+ if (electron_1.safeStorage.isEncryptionAvailable()) {
73
+ const encrypted = electron_1.safeStorage.encryptString(trimmed);
74
+ return ENCRYPTED_PREFIX + encrypted.toString('base64');
75
+ }
76
+ }
77
+ catch (error) {
78
+ console.warn('[Hooks Settings] Failed to encrypt secret, storing masked:', error);
79
+ }
80
+ // Fallback to masked value if encryption fails
81
+ return MASKED_VALUE;
82
+ }
83
+ /**
84
+ * Decrypt a secret that was encrypted with safeStorage
85
+ */
86
+ function decryptSecret(value) {
87
+ if (!value)
88
+ return undefined;
89
+ if (value === MASKED_VALUE)
90
+ return undefined;
91
+ if (value.startsWith(ENCRYPTED_PREFIX)) {
92
+ try {
93
+ if (electron_1.safeStorage.isEncryptionAvailable()) {
94
+ const encrypted = Buffer.from(value.slice(ENCRYPTED_PREFIX.length), 'base64');
95
+ const decrypted = electron_1.safeStorage.decryptString(encrypted);
96
+ return decrypted;
97
+ }
98
+ else {
99
+ console.error('[Hooks Settings] safeStorage encryption not available - cannot decrypt secrets');
100
+ }
101
+ }
102
+ catch (error) {
103
+ console.error('[Hooks Settings] Failed to decrypt secret:', error.message || error);
104
+ }
105
+ }
106
+ // If not encrypted and not masked, return as-is (for backwards compatibility)
107
+ if (value !== MASKED_VALUE && !value.startsWith(ENCRYPTED_PREFIX)) {
108
+ return value.trim() || undefined;
109
+ }
110
+ return undefined;
111
+ }
112
+ /**
113
+ * Encrypt all credentials in settings before saving to disk
114
+ */
115
+ function encryptSettings(settings) {
116
+ return {
117
+ ...settings,
118
+ token: encryptSecret(settings.token) || '',
119
+ gmail: settings.gmail ? {
120
+ ...settings.gmail,
121
+ pushToken: encryptSecret(settings.gmail.pushToken),
122
+ } : undefined,
123
+ };
124
+ }
125
+ /**
126
+ * Decrypt all credentials in settings after loading from disk
127
+ */
128
+ function decryptSettings(settings) {
129
+ return {
130
+ ...settings,
131
+ token: decryptSecret(settings.token) || '',
132
+ gmail: settings.gmail ? {
133
+ ...settings.gmail,
134
+ pushToken: decryptSecret(settings.gmail.pushToken),
135
+ } : undefined,
136
+ };
137
+ }
138
+ /**
139
+ * Hooks Settings Manager
140
+ */
141
+ class HooksSettingsManager {
142
+ /**
143
+ * Initialize the settings manager (must be called after app is ready)
144
+ */
145
+ static initialize() {
146
+ if (this.initialized)
147
+ return;
148
+ const userDataPath = electron_1.app.getPath('userData');
149
+ this.legacySettingsPath = path.join(userDataPath, LEGACY_SETTINGS_FILE);
150
+ this.initialized = true;
151
+ console.log('[Hooks Settings] Initialized');
152
+ // Migrate from legacy JSON file to encrypted database
153
+ this.migrateFromLegacyFile();
154
+ }
155
+ /**
156
+ * Migrate settings from legacy JSON file to encrypted database
157
+ */
158
+ static migrateFromLegacyFile() {
159
+ if (this.migrationCompleted)
160
+ return;
161
+ try {
162
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
163
+ console.log('[Hooks Settings] SecureSettingsRepository not yet initialized, skipping migration');
164
+ return;
165
+ }
166
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
167
+ if (repository.exists('hooks')) {
168
+ this.migrationCompleted = true;
169
+ return;
170
+ }
171
+ if (!fs.existsSync(this.legacySettingsPath)) {
172
+ console.log('[Hooks Settings] No legacy settings file found');
173
+ this.migrationCompleted = true;
174
+ return;
175
+ }
176
+ console.log('[Hooks Settings] Migrating settings from legacy JSON file to encrypted database...');
177
+ // Create backup before migration
178
+ const backupPath = this.legacySettingsPath + '.migration-backup';
179
+ fs.copyFileSync(this.legacySettingsPath, backupPath);
180
+ try {
181
+ const data = fs.readFileSync(this.legacySettingsPath, 'utf-8');
182
+ const parsed = JSON.parse(data);
183
+ const merged = {
184
+ ...types_1.DEFAULT_HOOKS_CONFIG,
185
+ ...parsed,
186
+ mappings: parsed.mappings || [],
187
+ presets: parsed.presets || [],
188
+ };
189
+ // Decrypt any existing encrypted values before saving to the new encrypted database
190
+ const decrypted = decryptSettings(merged);
191
+ repository.save('hooks', decrypted);
192
+ console.log('[Hooks Settings] Settings migrated to encrypted database');
193
+ // Migration successful - delete backup and original
194
+ fs.unlinkSync(backupPath);
195
+ fs.unlinkSync(this.legacySettingsPath);
196
+ console.log('[Hooks Settings] Migration complete, cleaned up legacy files');
197
+ this.migrationCompleted = true;
198
+ }
199
+ catch (migrationError) {
200
+ console.error('[Hooks Settings] Migration failed, backup preserved at:', backupPath);
201
+ throw migrationError;
202
+ }
203
+ }
204
+ catch (error) {
205
+ console.error('[Hooks Settings] Migration failed:', error);
206
+ }
207
+ }
208
+ /**
209
+ * Load settings from encrypted database
210
+ */
211
+ static loadSettings() {
212
+ this.ensureInitialized();
213
+ if (this.cachedSettings) {
214
+ return this.cachedSettings;
215
+ }
216
+ try {
217
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
218
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
219
+ const stored = repository.load('hooks');
220
+ if (stored) {
221
+ const merged = {
222
+ ...types_1.DEFAULT_HOOKS_CONFIG,
223
+ ...stored,
224
+ mappings: stored.mappings || [],
225
+ presets: stored.presets || [],
226
+ };
227
+ this.cachedSettings = merged;
228
+ console.log('[Hooks Settings] Loaded settings from encrypted database');
229
+ return this.cachedSettings;
230
+ }
231
+ }
232
+ }
233
+ catch (error) {
234
+ console.error('[Hooks Settings] Failed to load settings:', error);
235
+ }
236
+ console.log('[Hooks Settings] No settings found, using defaults');
237
+ this.cachedSettings = { ...types_1.DEFAULT_HOOKS_CONFIG };
238
+ return this.cachedSettings;
239
+ }
240
+ /**
241
+ * Save settings to encrypted database
242
+ */
243
+ static saveSettings(settings) {
244
+ this.ensureInitialized();
245
+ try {
246
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
247
+ throw new Error('SecureSettingsRepository not initialized');
248
+ }
249
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
250
+ repository.save('hooks', settings);
251
+ this.cachedSettings = settings;
252
+ console.log('[Hooks Settings] Saved settings to encrypted database');
253
+ }
254
+ catch (error) {
255
+ console.error('[Hooks Settings] Failed to save settings:', error);
256
+ throw error;
257
+ }
258
+ }
259
+ /**
260
+ * Clear the settings cache (forces reload on next access)
261
+ */
262
+ static clearCache() {
263
+ this.cachedSettings = null;
264
+ }
265
+ /**
266
+ * Get default settings
267
+ */
268
+ static getDefaults() {
269
+ return { ...types_1.DEFAULT_HOOKS_CONFIG };
270
+ }
271
+ /**
272
+ * Update hooks configuration
273
+ */
274
+ static updateConfig(updates) {
275
+ const settings = this.loadSettings();
276
+ const updated = { ...settings, ...updates };
277
+ this.saveSettings(updated);
278
+ return updated;
279
+ }
280
+ /**
281
+ * Enable hooks with a new token if not already configured
282
+ */
283
+ static enableHooks() {
284
+ const settings = this.loadSettings();
285
+ if (!settings.token) {
286
+ settings.token = generateHookToken();
287
+ }
288
+ settings.enabled = true;
289
+ this.saveSettings(settings);
290
+ return settings;
291
+ }
292
+ /**
293
+ * Disable hooks
294
+ */
295
+ static disableHooks() {
296
+ const settings = this.loadSettings();
297
+ settings.enabled = false;
298
+ this.saveSettings(settings);
299
+ return settings;
300
+ }
301
+ /**
302
+ * Regenerate the hook token
303
+ */
304
+ static regenerateToken() {
305
+ const settings = this.loadSettings();
306
+ settings.token = generateHookToken();
307
+ this.saveSettings(settings);
308
+ return settings.token;
309
+ }
310
+ /**
311
+ * Add or update a preset
312
+ */
313
+ static addPreset(preset) {
314
+ const settings = this.loadSettings();
315
+ const presets = new Set(settings.presets);
316
+ presets.add(preset);
317
+ settings.presets = Array.from(presets);
318
+ this.saveSettings(settings);
319
+ return settings;
320
+ }
321
+ /**
322
+ * Remove a preset
323
+ */
324
+ static removePreset(preset) {
325
+ const settings = this.loadSettings();
326
+ settings.presets = settings.presets.filter((p) => p !== preset);
327
+ this.saveSettings(settings);
328
+ return settings;
329
+ }
330
+ /**
331
+ * Add a custom mapping
332
+ */
333
+ static addMapping(mapping) {
334
+ const settings = this.loadSettings();
335
+ settings.mappings.push(mapping);
336
+ this.saveSettings(settings);
337
+ return settings;
338
+ }
339
+ /**
340
+ * Update a mapping by ID
341
+ */
342
+ static updateMapping(id, updates) {
343
+ const settings = this.loadSettings();
344
+ const index = settings.mappings.findIndex((m) => m.id === id);
345
+ if (index === -1)
346
+ return null;
347
+ settings.mappings[index] = { ...settings.mappings[index], ...updates };
348
+ this.saveSettings(settings);
349
+ return settings;
350
+ }
351
+ /**
352
+ * Remove a mapping by ID
353
+ */
354
+ static removeMapping(id) {
355
+ const settings = this.loadSettings();
356
+ settings.mappings = settings.mappings.filter((m) => m.id !== id);
357
+ this.saveSettings(settings);
358
+ return settings;
359
+ }
360
+ /**
361
+ * Configure Gmail hooks
362
+ */
363
+ static configureGmail(gmailConfig) {
364
+ const settings = this.loadSettings();
365
+ settings.gmail = {
366
+ ...settings.gmail,
367
+ ...gmailConfig,
368
+ };
369
+ // Auto-add gmail preset if account is configured
370
+ if (gmailConfig.account && !settings.presets.includes('gmail')) {
371
+ settings.presets.push('gmail');
372
+ }
373
+ this.saveSettings(settings);
374
+ return settings;
375
+ }
376
+ /**
377
+ * Get Gmail configuration with defaults filled in
378
+ */
379
+ static getGmailConfig() {
380
+ const settings = this.loadSettings();
381
+ const gmail = settings.gmail || {};
382
+ return {
383
+ account: gmail.account,
384
+ label: gmail.label || types_1.DEFAULT_GMAIL_LABEL,
385
+ topic: gmail.topic || types_1.DEFAULT_GMAIL_TOPIC,
386
+ subscription: gmail.subscription || types_1.DEFAULT_GMAIL_SUBSCRIPTION,
387
+ pushToken: gmail.pushToken,
388
+ hookUrl: gmail.hookUrl,
389
+ includeBody: gmail.includeBody ?? true,
390
+ maxBytes: gmail.maxBytes || types_1.DEFAULT_GMAIL_MAX_BYTES,
391
+ renewEveryMinutes: gmail.renewEveryMinutes || types_1.DEFAULT_GMAIL_RENEW_MINUTES,
392
+ model: gmail.model,
393
+ thinking: gmail.thinking,
394
+ allowUnsafeExternalContent: gmail.allowUnsafeExternalContent,
395
+ serve: {
396
+ bind: gmail.serve?.bind || types_1.DEFAULT_GMAIL_SERVE_BIND,
397
+ port: gmail.serve?.port || types_1.DEFAULT_GMAIL_SERVE_PORT,
398
+ path: gmail.serve?.path || types_1.DEFAULT_GMAIL_SERVE_PATH,
399
+ },
400
+ tailscale: {
401
+ mode: gmail.tailscale?.mode || 'off',
402
+ path: gmail.tailscale?.path || types_1.DEFAULT_GMAIL_SERVE_PATH,
403
+ target: gmail.tailscale?.target,
404
+ },
405
+ };
406
+ }
407
+ /**
408
+ * Get settings for UI display (masks sensitive data)
409
+ */
410
+ static getSettingsForDisplay() {
411
+ const settings = this.loadSettings();
412
+ return {
413
+ ...settings,
414
+ token: settings.token ? MASKED_VALUE : '',
415
+ gmail: settings.gmail ? {
416
+ ...settings.gmail,
417
+ pushToken: settings.gmail.pushToken ? MASKED_VALUE : undefined,
418
+ } : undefined,
419
+ };
420
+ }
421
+ /**
422
+ * Check if hooks are properly configured
423
+ */
424
+ static isConfigured() {
425
+ const settings = this.loadSettings();
426
+ return settings.enabled && !!settings.token;
427
+ }
428
+ /**
429
+ * Check if Gmail hooks are configured
430
+ */
431
+ static isGmailConfigured() {
432
+ const settings = this.loadSettings();
433
+ return !!(settings.gmail?.account && settings.gmail?.topic && settings.gmail?.pushToken);
434
+ }
435
+ /**
436
+ * Ensure the manager is initialized
437
+ */
438
+ static ensureInitialized() {
439
+ if (!this.initialized) {
440
+ this.initialize();
441
+ }
442
+ }
443
+ }
444
+ exports.HooksSettingsManager = HooksSettingsManager;
445
+ HooksSettingsManager.cachedSettings = null;
446
+ HooksSettingsManager.initialized = false;
447
+ HooksSettingsManager.migrationCompleted = false;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * Hooks Configuration Types
4
+ *
5
+ * Webhook ingress for wake and isolated agent runs.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.HOOK_PRESET_MAPPINGS = exports.GMAIL_PRESET_MAPPING = exports.DEFAULT_HOOKS_CONFIG = exports.DEFAULT_GMAIL_RENEW_MINUTES = exports.DEFAULT_GMAIL_MAX_BYTES = exports.DEFAULT_GMAIL_SERVE_PATH = exports.DEFAULT_GMAIL_SERVE_PORT = exports.DEFAULT_GMAIL_SERVE_BIND = exports.DEFAULT_GMAIL_SUBSCRIPTION = exports.DEFAULT_GMAIL_TOPIC = exports.DEFAULT_GMAIL_LABEL = exports.DEFAULT_HOOKS_PORT = exports.DEFAULT_HOOKS_MAX_BODY_BYTES = exports.DEFAULT_HOOKS_PATH = void 0;
9
+ // ============ Default Values ============
10
+ exports.DEFAULT_HOOKS_PATH = '/hooks';
11
+ exports.DEFAULT_HOOKS_MAX_BODY_BYTES = 256 * 1024; // 256KB
12
+ exports.DEFAULT_HOOKS_PORT = 9877;
13
+ exports.DEFAULT_GMAIL_LABEL = 'INBOX';
14
+ exports.DEFAULT_GMAIL_TOPIC = 'cowork-gmail-watch';
15
+ exports.DEFAULT_GMAIL_SUBSCRIPTION = 'cowork-gmail-watch-push';
16
+ exports.DEFAULT_GMAIL_SERVE_BIND = '127.0.0.1';
17
+ exports.DEFAULT_GMAIL_SERVE_PORT = 8788;
18
+ exports.DEFAULT_GMAIL_SERVE_PATH = '/gmail-pubsub';
19
+ exports.DEFAULT_GMAIL_MAX_BYTES = 20000;
20
+ exports.DEFAULT_GMAIL_RENEW_MINUTES = 12 * 60; // 12 hours
21
+ exports.DEFAULT_HOOKS_CONFIG = {
22
+ enabled: false,
23
+ token: '',
24
+ path: exports.DEFAULT_HOOKS_PATH,
25
+ maxBodyBytes: exports.DEFAULT_HOOKS_MAX_BODY_BYTES,
26
+ presets: [],
27
+ mappings: [],
28
+ };
29
+ // ============ Gmail Preset Mapping ============
30
+ exports.GMAIL_PRESET_MAPPING = {
31
+ id: 'gmail',
32
+ match: { path: 'gmail' },
33
+ action: 'agent',
34
+ wakeMode: 'now',
35
+ name: 'Gmail',
36
+ sessionKey: 'hook:gmail:{{messages[0].id}}',
37
+ messageTemplate: 'New email from {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}\n{{messages[0].body}}',
38
+ };
39
+ exports.HOOK_PRESET_MAPPINGS = {
40
+ gmail: [exports.GMAIL_PRESET_MAPPING],
41
+ };
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * Canvas IPC Handlers
4
+ *
5
+ * IPC handlers for Live Canvas operations.
6
+ * These handlers bridge the renderer process with the CanvasManager.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.setupCanvasHandlers = setupCanvasHandlers;
10
+ exports.cleanupCanvasHandlers = cleanupCanvasHandlers;
11
+ const electron_1 = require("electron");
12
+ const types_1 = require("../../shared/types");
13
+ const canvas_manager_1 = require("../canvas/canvas-manager");
14
+ /**
15
+ * Setup Canvas IPC handlers
16
+ */
17
+ function setupCanvasHandlers(mainWindow, agentDaemon) {
18
+ const manager = canvas_manager_1.CanvasManager.getInstance();
19
+ // Set main window reference for event broadcasting
20
+ manager.setMainWindow(mainWindow);
21
+ // Set A2UI callback to forward actions to the agent
22
+ manager.setA2UICallback((action) => {
23
+ // Find the task associated with this session
24
+ const session = manager.getSession(action.sessionId);
25
+ if (session) {
26
+ // Format as user message and send to the running task
27
+ const message = formatA2UIMessage(action);
28
+ agentDaemon.sendMessage(session.taskId, message).catch((err) => {
29
+ console.error('[CanvasHandlers] Failed to send A2UI action to task:', err);
30
+ });
31
+ }
32
+ });
33
+ // Create a new canvas session
34
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_CREATE, async (_, data) => {
35
+ return manager.createSession(data.taskId, data.workspaceId, data.title);
36
+ });
37
+ // Get a canvas session by ID
38
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_GET_SESSION, async (_, sessionId) => {
39
+ return manager.getSession(sessionId) || null;
40
+ });
41
+ // List all canvas sessions (optionally filtered by taskId)
42
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_LIST_SESSIONS, async (_, taskId) => {
43
+ if (taskId) {
44
+ return manager.listSessionsForTask(taskId);
45
+ }
46
+ return manager.listAllSessions();
47
+ });
48
+ // Show a canvas window
49
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_SHOW, async (_, sessionId) => {
50
+ await manager.showCanvas(sessionId);
51
+ return { success: true };
52
+ });
53
+ // Hide a canvas window
54
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_HIDE, async (_, sessionId) => {
55
+ manager.hideCanvas(sessionId);
56
+ return { success: true };
57
+ });
58
+ // Close a canvas session
59
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_CLOSE, async (_, sessionId) => {
60
+ await manager.closeSession(sessionId);
61
+ return { success: true };
62
+ });
63
+ // Push content to a canvas
64
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_PUSH, async (_, data) => {
65
+ await manager.pushContent(data.sessionId, data.content, data.filename);
66
+ return { success: true };
67
+ });
68
+ // Execute script in canvas context
69
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_EVAL, async (_, data) => {
70
+ const result = await manager.evalScript(data.sessionId, data.script);
71
+ return { result };
72
+ });
73
+ // Take a snapshot of the canvas
74
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_SNAPSHOT, async (_, sessionId) => {
75
+ return manager.takeSnapshot(sessionId);
76
+ });
77
+ // Export canvas as HTML
78
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_EXPORT_HTML, async (_, sessionId) => {
79
+ return manager.exportAsHTML(sessionId);
80
+ });
81
+ // Export canvas to folder
82
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_EXPORT_TO_FOLDER, async (_, data) => {
83
+ return manager.exportToFolder(data.sessionId, data.targetDir);
84
+ });
85
+ // Open canvas in browser
86
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_OPEN_IN_BROWSER, async (_, sessionId) => {
87
+ return manager.openInBrowser(sessionId);
88
+ });
89
+ // Get session directory
90
+ electron_1.ipcMain.handle(types_1.IPC_CHANNELS.CANVAS_GET_SESSION_DIR, async (_, sessionId) => {
91
+ return manager.getSessionDir(sessionId);
92
+ });
93
+ // Handle A2UI action from canvas window (internal IPC from canvas preload)
94
+ electron_1.ipcMain.handle('canvas:a2ui-action-from-window', async (event, action) => {
95
+ const window = electron_1.BrowserWindow.fromWebContents(event.sender);
96
+ if (window) {
97
+ manager.handleA2UIAction(window.id, action);
98
+ }
99
+ return { success: true };
100
+ });
101
+ // Get session info from canvas window (internal IPC from canvas preload)
102
+ electron_1.ipcMain.handle('canvas:get-session-from-window', async (event) => {
103
+ const window = electron_1.BrowserWindow.fromWebContents(event.sender);
104
+ if (!window)
105
+ return null;
106
+ const sessionId = manager.getSessionFromWindow(window);
107
+ if (!sessionId)
108
+ return null;
109
+ const session = manager.getSession(sessionId);
110
+ if (!session)
111
+ return null;
112
+ return {
113
+ id: session.id,
114
+ taskId: session.taskId,
115
+ workspaceId: session.workspaceId,
116
+ title: session.title,
117
+ };
118
+ });
119
+ // Request snapshot from canvas window (internal IPC from canvas preload)
120
+ electron_1.ipcMain.handle('canvas:request-snapshot-from-window', async (event) => {
121
+ const window = electron_1.BrowserWindow.fromWebContents(event.sender);
122
+ if (!window)
123
+ return null;
124
+ const sessionId = manager.getSessionFromWindow(window);
125
+ if (!sessionId)
126
+ return null;
127
+ return manager.takeSnapshot(sessionId);
128
+ });
129
+ // Log from canvas window (internal IPC from canvas preload)
130
+ electron_1.ipcMain.on('canvas:log', (event, data) => {
131
+ const window = electron_1.BrowserWindow.fromWebContents(event.sender);
132
+ const sessionId = window ? manager.getSessionFromWindow(window) : 'unknown';
133
+ console.log(`[Canvas:${sessionId?.slice(0, 8)}] ${data.message}`, data.data || '');
134
+ });
135
+ console.log('[CanvasHandlers] Canvas IPC handlers registered');
136
+ }
137
+ /**
138
+ * Format A2UI action as a message for the agent
139
+ */
140
+ function formatA2UIMessage(action) {
141
+ let message = `[Canvas Interaction]\n`;
142
+ message += `Action: ${action.actionName}\n`;
143
+ if (action.componentId) {
144
+ message += `Component: ${action.componentId}\n`;
145
+ }
146
+ if (action.context && Object.keys(action.context).length > 0) {
147
+ message += `Context: ${JSON.stringify(action.context, null, 2)}\n`;
148
+ }
149
+ message += `\nThe user interacted with the canvas. Please respond appropriately based on this action.`;
150
+ return message;
151
+ }
152
+ /**
153
+ * Cleanup canvas handlers (call on app quit)
154
+ */
155
+ async function cleanupCanvasHandlers() {
156
+ const manager = canvas_manager_1.CanvasManager.getInstance();
157
+ await manager.cleanup();
158
+ }