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,1002 @@
1
+ /**
2
+ * Channel Gateway Types
3
+ *
4
+ * Defines interfaces for multi-channel messaging support.
5
+ * Each channel (Telegram, Discord, etc.) implements the ChannelAdapter interface.
6
+ */
7
+
8
+ /**
9
+ * Supported channel types
10
+ */
11
+ export type ChannelType = 'telegram' | 'discord' | 'slack' | 'whatsapp' | 'imessage' | 'signal' | 'mattermost' | 'matrix' | 'twitch' | 'line' | 'bluebubbles' | 'email' | 'teams' | 'googlechat';
12
+
13
+ /**
14
+ * Channel connection status
15
+ */
16
+ export type ChannelStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
17
+
18
+ /**
19
+ * Incoming message from any channel
20
+ */
21
+ export interface IncomingMessage {
22
+ /** Unique message ID from the channel */
23
+ messageId: string;
24
+ /** Channel type */
25
+ channel: ChannelType;
26
+ /** User identifier on the channel */
27
+ userId: string;
28
+ /** User display name */
29
+ userName: string;
30
+ /** Chat/conversation ID (for group chats) */
31
+ chatId: string;
32
+ /** Message content */
33
+ text: string;
34
+ /** Timestamp */
35
+ timestamp: Date;
36
+ /** Optional reply-to message ID */
37
+ replyTo?: string;
38
+ /** Optional attachments */
39
+ attachments?: MessageAttachment[];
40
+ /** Forum topic thread ID (Telegram) */
41
+ threadId?: string;
42
+ /** Whether this is a forum topic message */
43
+ isForumTopic?: boolean;
44
+ /** Raw message object from the channel SDK */
45
+ raw?: unknown;
46
+ }
47
+
48
+ /**
49
+ * Inline keyboard button
50
+ */
51
+ export interface InlineKeyboardButton {
52
+ /** Button label text */
53
+ text: string;
54
+ /** Callback data sent when button is pressed */
55
+ callbackData?: string;
56
+ /** URL to open when button is pressed */
57
+ url?: string;
58
+ }
59
+
60
+ /**
61
+ * Outgoing message to any channel
62
+ */
63
+ export interface OutgoingMessage {
64
+ /** Target chat/conversation ID */
65
+ chatId: string;
66
+ /** Message content */
67
+ text: string;
68
+ /** Optional reply-to message ID */
69
+ replyTo?: string;
70
+ /** Parse mode for formatting */
71
+ parseMode?: 'text' | 'markdown' | 'html';
72
+ /** Optional attachments */
73
+ attachments?: MessageAttachment[];
74
+ /** Forum topic thread ID (Telegram) */
75
+ threadId?: string;
76
+ /** Inline keyboard buttons (rows of buttons) */
77
+ inlineKeyboard?: InlineKeyboardButton[][];
78
+ /** Disable link preview (default: false) */
79
+ disableLinkPreview?: boolean;
80
+ }
81
+
82
+ /**
83
+ * Callback query from inline keyboard button press
84
+ */
85
+ export interface CallbackQuery {
86
+ /** Unique callback query ID */
87
+ id: string;
88
+ /** User who pressed the button */
89
+ userId: string;
90
+ /** User display name */
91
+ userName: string;
92
+ /** Chat ID where button was pressed */
93
+ chatId: string;
94
+ /** Message ID containing the button */
95
+ messageId: string;
96
+ /** Callback data from the button */
97
+ data: string;
98
+ /** Forum topic thread ID (if in forum) */
99
+ threadId?: string;
100
+ /** Raw callback query object */
101
+ raw?: unknown;
102
+ }
103
+
104
+ /**
105
+ * Callback query handler
106
+ */
107
+ export type CallbackQueryHandler = (query: CallbackQuery) => void | Promise<void>;
108
+
109
+ /**
110
+ * Message attachment (file, image, etc.)
111
+ */
112
+ export interface MessageAttachment {
113
+ type: 'file' | 'image' | 'audio' | 'video' | 'document';
114
+ /** URL or file path */
115
+ url?: string;
116
+ /** File data buffer */
117
+ data?: Buffer;
118
+ /** MIME type */
119
+ mimeType?: string;
120
+ /** File name */
121
+ fileName?: string;
122
+ /** File size in bytes */
123
+ size?: number;
124
+ }
125
+
126
+ /**
127
+ * Channel configuration base
128
+ */
129
+ export interface ChannelConfig {
130
+ /** Whether this channel is enabled */
131
+ enabled: boolean;
132
+ /** Channel-specific settings */
133
+ [key: string]: unknown;
134
+ }
135
+
136
+ /**
137
+ * Telegram-specific configuration
138
+ */
139
+ export interface TelegramConfig extends ChannelConfig {
140
+ /** Bot token from @BotFather */
141
+ botToken: string;
142
+ /** Webhook URL (optional, uses polling if not set) */
143
+ webhookUrl?: string;
144
+ }
145
+
146
+ /**
147
+ * Discord-specific configuration (future)
148
+ */
149
+ export interface DiscordConfig extends ChannelConfig {
150
+ /** Bot token */
151
+ botToken: string;
152
+ /** Application ID */
153
+ applicationId: string;
154
+ /** Guild IDs to operate in (empty = all guilds) */
155
+ guildIds?: string[];
156
+ }
157
+
158
+ /**
159
+ * Slack-specific configuration
160
+ */
161
+ export interface SlackConfig extends ChannelConfig {
162
+ /** Bot token (xoxb-...) */
163
+ botToken: string;
164
+ /** App token for Socket Mode (xapp-...) */
165
+ appToken: string;
166
+ /** Signing secret for verifying requests */
167
+ signingSecret?: string;
168
+ }
169
+
170
+ /**
171
+ * WhatsApp-specific configuration
172
+ */
173
+ export interface WhatsAppConfig extends ChannelConfig {
174
+ /** Directory to store auth credentials (optional, defaults to app data) */
175
+ authDir?: string;
176
+ /** Print QR code to terminal for debugging */
177
+ printQrToTerminal?: boolean;
178
+ /** Send read receipts for incoming messages (default: true) */
179
+ sendReadReceipts?: boolean;
180
+ /** Allowed phone numbers in E.164 format without + (e.g., "14155551234") */
181
+ allowedNumbers?: string[];
182
+ /** Enable message deduplication (default: true) */
183
+ deduplicationEnabled?: boolean;
184
+ /**
185
+ * Self-chat mode: When true, the bot is running on the same WhatsApp account
186
+ * as the user (messaging yourself). This mode:
187
+ * - Disables read receipts (to avoid marking your own messages as read)
188
+ * - Adds a response prefix to distinguish bot messages from user messages
189
+ */
190
+ selfChatMode?: boolean;
191
+ /**
192
+ * Prefix to add to bot responses (e.g., "[CoWork]" or "🤖")
193
+ * Only used when selfChatMode is true. Default: "🤖"
194
+ */
195
+ responsePrefix?: string;
196
+ }
197
+
198
+ /**
199
+ * iMessage-specific configuration
200
+ * Uses imsg CLI (brew install steipete/tap/imsg) for communication
201
+ */
202
+ export interface ImessageConfig extends ChannelConfig {
203
+ /** Path to imsg CLI (default: "imsg") */
204
+ cliPath?: string;
205
+ /** Path to Messages database (default: ~/Library/Messages/chat.db) */
206
+ dbPath?: string;
207
+ /** DM access policy (default: "pairing") */
208
+ dmPolicy?: 'open' | 'allowlist' | 'pairing' | 'disabled';
209
+ /** Group access policy (default: "allowlist") */
210
+ groupPolicy?: 'open' | 'allowlist' | 'disabled';
211
+ /** Allowed contacts (phone numbers, emails, or chat_id:*) */
212
+ allowedContacts?: string[];
213
+ /** Include attachments in context (default: false) */
214
+ includeAttachments?: boolean;
215
+ /** Max media size in MB (default: 16) */
216
+ mediaMaxMb?: number;
217
+ /** iMessage service preference */
218
+ service?: 'imessage' | 'sms' | 'auto';
219
+ /** Enable message deduplication (default: true) */
220
+ deduplicationEnabled?: boolean;
221
+ /** Response prefix for bot messages */
222
+ responsePrefix?: string;
223
+ }
224
+
225
+ /**
226
+ * Signal-specific configuration
227
+ * Uses signal-cli for communication (https://github.com/AsamK/signal-cli)
228
+ */
229
+ export interface SignalConfig extends ChannelConfig {
230
+ /** Phone number to use (E.164 format, e.g., +14155551234) */
231
+ phoneNumber: string;
232
+ /** Path to signal-cli (default: "signal-cli") */
233
+ cliPath?: string;
234
+ /** signal-cli data directory (default: ~/.local/share/signal-cli) */
235
+ dataDir?: string;
236
+ /** Configuration mode */
237
+ mode?: 'native' | 'daemon';
238
+ /** JSON-RPC socket path (for daemon mode) */
239
+ socketPath?: string;
240
+ /** Trust mode for new contacts */
241
+ trustMode?: 'tofu' | 'always' | 'manual';
242
+ /** DM access policy (default: "pairing") */
243
+ dmPolicy?: 'open' | 'allowlist' | 'pairing' | 'disabled';
244
+ /** Group access policy (default: "allowlist") */
245
+ groupPolicy?: 'open' | 'allowlist' | 'disabled';
246
+ /** Allowed phone numbers (E.164 format) */
247
+ allowedNumbers?: string[];
248
+ /** Enable read receipts (default: true) */
249
+ sendReadReceipts?: boolean;
250
+ /** Enable typing indicators (default: true) */
251
+ sendTypingIndicators?: boolean;
252
+ /** Max attachment size in MB (default: 100) */
253
+ maxAttachmentMb?: number;
254
+ /** Enable message deduplication (default: true) */
255
+ deduplicationEnabled?: boolean;
256
+ /** Response prefix for bot messages */
257
+ responsePrefix?: string;
258
+ /** Poll interval for receiving messages in ms (default: 1000) */
259
+ pollInterval?: number;
260
+ }
261
+
262
+ /**
263
+ * Mattermost-specific configuration
264
+ */
265
+ export interface MattermostConfig extends ChannelConfig {
266
+ /** Mattermost server URL (e.g., https://mattermost.example.com) */
267
+ serverUrl: string;
268
+ /** Personal access token */
269
+ token: string;
270
+ /** Team ID to operate in (optional) */
271
+ teamId?: string;
272
+ /** Response prefix for bot messages */
273
+ responsePrefix?: string;
274
+ /** Enable message deduplication (default: true) */
275
+ deduplicationEnabled?: boolean;
276
+ }
277
+
278
+ /**
279
+ * Matrix-specific configuration
280
+ */
281
+ export interface MatrixConfig extends ChannelConfig {
282
+ /** Matrix homeserver URL (e.g., https://matrix.org) */
283
+ homeserver: string;
284
+ /** User ID (e.g., @user:matrix.org) */
285
+ userId: string;
286
+ /** Access token */
287
+ accessToken: string;
288
+ /** Device ID (optional) */
289
+ deviceId?: string;
290
+ /** Room IDs to listen to (optional, listens to all joined rooms if not specified) */
291
+ roomIds?: string[];
292
+ /** Response prefix for bot messages */
293
+ responsePrefix?: string;
294
+ /** Send typing indicators (default: true) */
295
+ sendTypingIndicators?: boolean;
296
+ /** Send read receipts (default: true) */
297
+ sendReadReceipts?: boolean;
298
+ /** Enable message deduplication (default: true) */
299
+ deduplicationEnabled?: boolean;
300
+ }
301
+
302
+ /**
303
+ * Twitch-specific configuration
304
+ */
305
+ export interface TwitchConfig extends ChannelConfig {
306
+ /** Twitch username (login name) */
307
+ username: string;
308
+ /** OAuth token (with oauth: prefix or without) */
309
+ oauthToken: string;
310
+ /** Channels to join (without # prefix) */
311
+ channels: string[];
312
+ /** Response prefix for bot messages */
313
+ responsePrefix?: string;
314
+ /** Enable message deduplication (default: true) */
315
+ deduplicationEnabled?: boolean;
316
+ /** Whether to respond to whispers (DMs) - default: false */
317
+ allowWhispers?: boolean;
318
+ }
319
+
320
+ /**
321
+ * LINE-specific configuration
322
+ * Uses LINE Messaging API for communication
323
+ */
324
+ export interface LineConfig extends ChannelConfig {
325
+ /** LINE Channel Access Token (long-lived) */
326
+ channelAccessToken: string;
327
+ /** LINE Channel Secret (for webhook signature verification) */
328
+ channelSecret: string;
329
+ /** Webhook port to listen on (default: 3100) */
330
+ webhookPort?: number;
331
+ /** Webhook path (default: /line/webhook) */
332
+ webhookPath?: string;
333
+ /** Response prefix for bot messages */
334
+ responsePrefix?: string;
335
+ /** Enable message deduplication (default: true) */
336
+ deduplicationEnabled?: boolean;
337
+ /** Whether to use reply tokens (faster) or push messages */
338
+ useReplyTokens?: boolean;
339
+ }
340
+
341
+ /**
342
+ * BlueBubbles-specific configuration
343
+ * Uses BlueBubbles REST API for iMessage integration
344
+ */
345
+ export interface BlueBubblesConfig extends ChannelConfig {
346
+ /** BlueBubbles server URL (e.g., http://192.168.1.100:1234) */
347
+ serverUrl: string;
348
+ /** BlueBubbles server password */
349
+ password: string;
350
+ /** Enable webhook notifications (default: true) */
351
+ enableWebhook?: boolean;
352
+ /** Webhook port to listen on (default: 3101) */
353
+ webhookPort?: number;
354
+ /** Webhook path (default: /bluebubbles/webhook) */
355
+ webhookPath?: string;
356
+ /** Poll interval in ms if webhooks not available (default: 5000) */
357
+ pollInterval?: number;
358
+ /** Response prefix for bot messages */
359
+ responsePrefix?: string;
360
+ /** Enable message deduplication (default: true) */
361
+ deduplicationEnabled?: boolean;
362
+ /** Allowed contacts (phone numbers or emails) */
363
+ allowedContacts?: string[];
364
+ }
365
+
366
+ /**
367
+ * Email-specific configuration
368
+ * Uses IMAP for receiving and SMTP for sending
369
+ */
370
+ export interface EmailConfig extends ChannelConfig {
371
+ /** IMAP server host */
372
+ imapHost: string;
373
+ /** IMAP server port (default: 993) */
374
+ imapPort?: number;
375
+ /** IMAP use SSL/TLS (default: true) */
376
+ imapSecure?: boolean;
377
+ /** SMTP server host */
378
+ smtpHost: string;
379
+ /** SMTP server port (default: 587) */
380
+ smtpPort?: number;
381
+ /** SMTP use SSL/TLS (default: false for STARTTLS) */
382
+ smtpSecure?: boolean;
383
+ /** Email address (used for both IMAP and SMTP) */
384
+ email: string;
385
+ /** Password or app password */
386
+ password: string;
387
+ /** Display name for outgoing emails */
388
+ displayName?: string;
389
+ /** IMAP mailbox to monitor (default: INBOX) */
390
+ mailbox?: string;
391
+ /** Poll interval in ms for IMAP IDLE fallback (default: 30000) */
392
+ pollInterval?: number;
393
+ /** Mark emails as read after processing (default: true) */
394
+ markAsRead?: boolean;
395
+ /** Response prefix for bot replies */
396
+ responsePrefix?: string;
397
+ /** Enable message deduplication (default: true) */
398
+ deduplicationEnabled?: boolean;
399
+ /** Allowed sender addresses (empty = allow all) */
400
+ allowedSenders?: string[];
401
+ /** Subject prefix filter (only process emails with this prefix) */
402
+ subjectFilter?: string;
403
+ }
404
+
405
+ /**
406
+ * Microsoft Teams-specific configuration
407
+ */
408
+ export interface TeamsConfig extends ChannelConfig {
409
+ /** Microsoft App ID from Azure Bot registration */
410
+ appId: string;
411
+ /** Microsoft App Password (Client Secret) from Azure Bot registration */
412
+ appPassword: string;
413
+ /** Tenant ID for single-tenant apps (optional, uses multi-tenant if not set) */
414
+ tenantId?: string;
415
+ /** Bot display name */
416
+ displayName?: string;
417
+ /** Webhook endpoint port (default: 3978) */
418
+ webhookPort?: number;
419
+ /** Response prefix for bot replies */
420
+ responsePrefix?: string;
421
+ /** Enable message deduplication (default: true) */
422
+ deduplicationEnabled?: boolean;
423
+ /** Auto-reconnect on connection failure (default: true) */
424
+ autoReconnect?: boolean;
425
+ /** Maximum reconnection attempts (default: 5) */
426
+ maxReconnectAttempts?: number;
427
+ }
428
+
429
+ /**
430
+ * Google Chat-specific configuration
431
+ * Uses Google Chat API with service account authentication
432
+ */
433
+ export interface GoogleChatConfig extends ChannelConfig {
434
+ /** Path to service account JSON key file */
435
+ serviceAccountKeyPath?: string;
436
+ /** Service account credentials JSON (alternative to keyPath) */
437
+ serviceAccountKey?: {
438
+ client_email: string;
439
+ private_key: string;
440
+ project_id: string;
441
+ };
442
+ /** Google Cloud project ID */
443
+ projectId?: string;
444
+ /** Webhook port to listen on (default: 3979) */
445
+ webhookPort?: number;
446
+ /** Webhook path (default: /googlechat/webhook) */
447
+ webhookPath?: string;
448
+ /** Bot display name */
449
+ displayName?: string;
450
+ /** Response prefix for bot replies */
451
+ responsePrefix?: string;
452
+ /** Enable message deduplication (default: true) */
453
+ deduplicationEnabled?: boolean;
454
+ /** Auto-reconnect on connection failure (default: true) */
455
+ autoReconnect?: boolean;
456
+ /** Maximum reconnection attempts (default: 5) */
457
+ maxReconnectAttempts?: number;
458
+ /** Pub/Sub subscription name (alternative to webhook) */
459
+ pubsubSubscription?: string;
460
+ }
461
+
462
+ /**
463
+ * Channel adapter interface
464
+ * All channel implementations must implement this interface
465
+ */
466
+ export interface ChannelAdapter {
467
+ /** Channel type identifier */
468
+ readonly type: ChannelType;
469
+
470
+ /** Current connection status */
471
+ readonly status: ChannelStatus;
472
+
473
+ /** Bot/app username on the channel */
474
+ readonly botUsername?: string;
475
+
476
+ /**
477
+ * Connect to the channel
478
+ * @throws Error if connection fails
479
+ */
480
+ connect(): Promise<void>;
481
+
482
+ /**
483
+ * Disconnect from the channel
484
+ */
485
+ disconnect(): Promise<void>;
486
+
487
+ /**
488
+ * Send a message to a chat
489
+ * @param message The message to send
490
+ * @returns The sent message ID
491
+ */
492
+ sendMessage(message: OutgoingMessage): Promise<string>;
493
+
494
+ /**
495
+ * Edit an existing message
496
+ * @param chatId Chat ID
497
+ * @param messageId Message ID to edit
498
+ * @param text New text content
499
+ */
500
+ editMessage?(chatId: string, messageId: string, text: string): Promise<void>;
501
+
502
+ /**
503
+ * Delete a message
504
+ * @param chatId Chat ID
505
+ * @param messageId Message ID to delete
506
+ */
507
+ deleteMessage?(chatId: string, messageId: string): Promise<void>;
508
+
509
+ /**
510
+ * Send a document/file to a chat
511
+ * @param chatId Chat ID
512
+ * @param filePath Path to the file to send
513
+ * @param caption Optional caption for the file
514
+ * @returns The sent message ID
515
+ */
516
+ sendDocument?(chatId: string, filePath: string, caption?: string): Promise<string>;
517
+
518
+ /**
519
+ * Send a photo/image to a chat
520
+ * @param chatId Chat ID
521
+ * @param filePath Path to the image file to send
522
+ * @param caption Optional caption for the image
523
+ * @returns The sent message ID
524
+ */
525
+ sendPhoto?(chatId: string, filePath: string, caption?: string): Promise<string>;
526
+
527
+ /**
528
+ * Register a message handler
529
+ * @param handler Function to call when a message is received
530
+ */
531
+ onMessage(handler: MessageHandler): void;
532
+
533
+ /**
534
+ * Register a callback query handler (for inline keyboard buttons)
535
+ * @param handler Function to call when a button is pressed
536
+ */
537
+ onCallbackQuery?(handler: CallbackQueryHandler): void;
538
+
539
+ /**
540
+ * Answer a callback query (acknowledge button press)
541
+ * @param queryId Callback query ID
542
+ * @param text Optional notification text
543
+ * @param showAlert Show as alert instead of toast
544
+ */
545
+ answerCallbackQuery?(queryId: string, text?: string, showAlert?: boolean): Promise<void>;
546
+
547
+ /**
548
+ * Edit message with inline keyboard
549
+ * @param chatId Chat ID
550
+ * @param messageId Message ID
551
+ * @param text New text (optional)
552
+ * @param inlineKeyboard New keyboard (optional)
553
+ */
554
+ editMessageWithKeyboard?(
555
+ chatId: string,
556
+ messageId: string,
557
+ text?: string,
558
+ inlineKeyboard?: InlineKeyboardButton[][]
559
+ ): Promise<void>;
560
+
561
+ /**
562
+ * Register an error handler
563
+ * @param handler Function to call when an error occurs
564
+ */
565
+ onError(handler: ErrorHandler): void;
566
+
567
+ /**
568
+ * Register a status change handler
569
+ * @param handler Function to call when status changes
570
+ */
571
+ onStatusChange(handler: StatusHandler): void;
572
+
573
+ /**
574
+ * Get channel-specific info (bot info, etc.)
575
+ */
576
+ getInfo(): Promise<ChannelInfo>;
577
+ }
578
+
579
+ /**
580
+ * Message handler callback
581
+ */
582
+ export type MessageHandler = (message: IncomingMessage) => void | Promise<void>;
583
+
584
+ /**
585
+ * Error handler callback
586
+ */
587
+ export type ErrorHandler = (error: Error, context?: string) => void;
588
+
589
+ /**
590
+ * Status change handler callback
591
+ */
592
+ export type StatusHandler = (status: ChannelStatus, error?: Error) => void;
593
+
594
+ /**
595
+ * Channel information
596
+ */
597
+ export interface ChannelInfo {
598
+ type: ChannelType;
599
+ status: ChannelStatus;
600
+ botId?: string;
601
+ botUsername?: string;
602
+ botDisplayName?: string;
603
+ /** Additional channel-specific info */
604
+ extra?: Record<string, unknown>;
605
+ }
606
+
607
+ /**
608
+ * Channel user - represents a user on a specific channel
609
+ */
610
+ export interface ChannelUser {
611
+ /** Internal user ID */
612
+ id: string;
613
+ /** Channel type */
614
+ channel: ChannelType;
615
+ /** User ID on the channel */
616
+ channelUserId: string;
617
+ /** User display name */
618
+ displayName: string;
619
+ /** Username (if available) */
620
+ username?: string;
621
+ /** Whether this user is allowed to interact */
622
+ allowed: boolean;
623
+ /** Pairing code (if pending) */
624
+ pairingCode?: string;
625
+ /** When the user was first seen */
626
+ createdAt: Date;
627
+ /** Last interaction time */
628
+ lastSeenAt: Date;
629
+ }
630
+
631
+ /**
632
+ * Channel session - links a channel chat to a CoWork task
633
+ */
634
+ export interface ChannelSession {
635
+ /** Session ID */
636
+ id: string;
637
+ /** Channel type */
638
+ channel: ChannelType;
639
+ /** Chat ID on the channel */
640
+ chatId: string;
641
+ /** Associated CoWork task ID (if any) */
642
+ taskId?: string;
643
+ /** Associated workspace ID */
644
+ workspaceId?: string;
645
+ /** Session state */
646
+ state: 'idle' | 'active' | 'waiting_approval';
647
+ /** Session context/memory */
648
+ context?: Record<string, unknown>;
649
+ /** Created timestamp */
650
+ createdAt: Date;
651
+ /** Last activity timestamp */
652
+ lastActivityAt: Date;
653
+ }
654
+
655
+ /**
656
+ * Security configuration for channel access
657
+ */
658
+ export interface SecurityConfig {
659
+ /** Access mode */
660
+ mode: 'open' | 'allowlist' | 'pairing';
661
+ /** Allowed user IDs (for allowlist mode) */
662
+ allowedUsers?: string[];
663
+ /** Pairing code TTL in seconds (for pairing mode) */
664
+ pairingCodeTTL?: number;
665
+ /** Maximum pairing attempts */
666
+ maxPairingAttempts?: number;
667
+ /** Rate limit: messages per minute */
668
+ rateLimitPerMinute?: number;
669
+ }
670
+
671
+ /**
672
+ * Gateway event types
673
+ */
674
+ export type GatewayEventType =
675
+ | 'channel:connected'
676
+ | 'channel:disconnected'
677
+ | 'channel:error'
678
+ | 'message:received'
679
+ | 'message:sent'
680
+ | 'user:paired'
681
+ | 'user:blocked'
682
+ | 'session:created'
683
+ | 'session:ended';
684
+
685
+ /**
686
+ * Gateway event
687
+ */
688
+ export interface GatewayEvent {
689
+ type: GatewayEventType;
690
+ channel?: ChannelType;
691
+ timestamp: Date;
692
+ data?: Record<string, unknown>;
693
+ }
694
+
695
+ /**
696
+ * Gateway event handler
697
+ */
698
+ export type GatewayEventHandler = (event: GatewayEvent) => void;
699
+
700
+ // ============================================================================
701
+ // Extended Features Types
702
+ // ============================================================================
703
+
704
+ /**
705
+ * Reply keyboard button (persistent keyboard below input)
706
+ */
707
+ export interface ReplyKeyboardButton {
708
+ /** Button text */
709
+ text: string;
710
+ /** Request contact (Telegram) */
711
+ requestContact?: boolean;
712
+ /** Request location (Telegram) */
713
+ requestLocation?: boolean;
714
+ }
715
+
716
+ /**
717
+ * Reply keyboard configuration
718
+ */
719
+ export interface ReplyKeyboard {
720
+ /** Rows of buttons */
721
+ buttons: ReplyKeyboardButton[][];
722
+ /** Resize keyboard to fit buttons */
723
+ resizeKeyboard?: boolean;
724
+ /** Hide after use */
725
+ oneTimeKeyboard?: boolean;
726
+ /** Placeholder text in input */
727
+ inputPlaceholder?: string;
728
+ }
729
+
730
+ /**
731
+ * Select menu option (Discord)
732
+ */
733
+ export interface SelectMenuOption {
734
+ /** Display label */
735
+ label: string;
736
+ /** Value sent on selection */
737
+ value: string;
738
+ /** Description shown below label */
739
+ description?: string;
740
+ /** Emoji to display */
741
+ emoji?: string;
742
+ /** Whether this is selected by default */
743
+ default?: boolean;
744
+ }
745
+
746
+ /**
747
+ * Select menu configuration (Discord)
748
+ */
749
+ export interface SelectMenu {
750
+ /** Custom ID for handling */
751
+ customId: string;
752
+ /** Placeholder text */
753
+ placeholder?: string;
754
+ /** Menu options */
755
+ options: SelectMenuOption[];
756
+ /** Minimum selections */
757
+ minValues?: number;
758
+ /** Maximum selections */
759
+ maxValues?: number;
760
+ /** Whether menu is disabled */
761
+ disabled?: boolean;
762
+ }
763
+
764
+ /**
765
+ * Poll option
766
+ */
767
+ export interface PollOption {
768
+ /** Option text */
769
+ text: string;
770
+ /** Vote count (when reading results) */
771
+ voterCount?: number;
772
+ }
773
+
774
+ /**
775
+ * Poll configuration
776
+ */
777
+ export interface Poll {
778
+ /** Poll question */
779
+ question: string;
780
+ /** Poll options */
781
+ options: PollOption[];
782
+ /** Allow multiple answers */
783
+ allowsMultipleAnswers?: boolean;
784
+ /** Anonymous voting */
785
+ isAnonymous?: boolean;
786
+ /** Poll type: quiz has correct answer */
787
+ type?: 'regular' | 'quiz';
788
+ /** Correct option index (for quiz) */
789
+ correctOptionId?: number;
790
+ /** Explanation shown after answering (quiz) */
791
+ explanation?: string;
792
+ /** Auto-close after seconds */
793
+ openPeriod?: number;
794
+ /** Close at specific time */
795
+ closeDate?: Date;
796
+ }
797
+
798
+ /**
799
+ * Reaction on a message
800
+ */
801
+ export interface MessageReaction {
802
+ /** Emoji or custom emoji ID */
803
+ emoji: string;
804
+ /** Whether it's a custom emoji */
805
+ isCustom?: boolean;
806
+ /** Count of this reaction */
807
+ count?: number;
808
+ /** Whether bot reacted with this */
809
+ isOwnReaction?: boolean;
810
+ }
811
+
812
+ /**
813
+ * Scheduled message
814
+ */
815
+ export interface ScheduledMessage {
816
+ /** Unique ID */
817
+ id: string;
818
+ /** Target channel */
819
+ channel: ChannelType;
820
+ /** Target chat ID */
821
+ chatId: string;
822
+ /** Message to send */
823
+ message: OutgoingMessage;
824
+ /** When to send */
825
+ scheduledAt: Date;
826
+ /** Status */
827
+ status: 'pending' | 'sent' | 'failed' | 'cancelled';
828
+ /** Error if failed */
829
+ error?: string;
830
+ /** Created timestamp */
831
+ createdAt: Date;
832
+ }
833
+
834
+ /**
835
+ * Message delivery status
836
+ */
837
+ export interface MessageDelivery {
838
+ /** Message ID */
839
+ messageId: string;
840
+ /** Channel type */
841
+ channel: ChannelType;
842
+ /** Chat ID */
843
+ chatId: string;
844
+ /** Delivery status */
845
+ status: 'pending' | 'sent' | 'delivered' | 'read' | 'failed';
846
+ /** Sent timestamp */
847
+ sentAt?: Date;
848
+ /** Delivered timestamp */
849
+ deliveredAt?: Date;
850
+ /** Read timestamp */
851
+ readAt?: Date;
852
+ /** Error if failed */
853
+ error?: string;
854
+ }
855
+
856
+ /**
857
+ * Audit log entry
858
+ */
859
+ export interface AuditLogEntry {
860
+ /** Entry ID */
861
+ id: string;
862
+ /** Timestamp */
863
+ timestamp: Date;
864
+ /** Action type */
865
+ action: string;
866
+ /** Channel */
867
+ channel?: ChannelType;
868
+ /** User ID */
869
+ userId?: string;
870
+ /** Chat ID */
871
+ chatId?: string;
872
+ /** Additional details */
873
+ details?: Record<string, unknown>;
874
+ }
875
+
876
+ /**
877
+ * User rate limit info
878
+ */
879
+ export interface UserRateLimit {
880
+ /** User ID */
881
+ userId: string;
882
+ /** Channel type */
883
+ channel: ChannelType;
884
+ /** Message count in current window */
885
+ messageCount: number;
886
+ /** Window start time */
887
+ windowStart: Date;
888
+ /** Whether currently limited */
889
+ isLimited: boolean;
890
+ /** When limit expires */
891
+ limitExpiresAt?: Date;
892
+ }
893
+
894
+ /**
895
+ * Broadcast configuration
896
+ */
897
+ export interface BroadcastConfig {
898
+ /** Target chat IDs */
899
+ chatIds: string[];
900
+ /** Channel type */
901
+ channel: ChannelType;
902
+ /** Message to broadcast */
903
+ message: OutgoingMessage;
904
+ /** Delay between sends (ms) */
905
+ delayBetweenSends?: number;
906
+ }
907
+
908
+ /**
909
+ * Broadcast result
910
+ */
911
+ export interface BroadcastResult {
912
+ /** Total recipients */
913
+ total: number;
914
+ /** Successfully sent */
915
+ sent: number;
916
+ /** Failed sends */
917
+ failed: number;
918
+ /** Details per chat */
919
+ results: Array<{
920
+ chatId: string;
921
+ success: boolean;
922
+ messageId?: string;
923
+ error?: string;
924
+ }>;
925
+ }
926
+
927
+ /**
928
+ * Extended channel adapter interface with all features
929
+ */
930
+ export interface ExtendedChannelAdapter extends ChannelAdapter {
931
+ /**
932
+ * Send typing indicator
933
+ * @param chatId Chat ID
934
+ * @param threadId Optional thread ID
935
+ */
936
+ sendTyping?(chatId: string, threadId?: string): Promise<void>;
937
+
938
+ /**
939
+ * Add reaction to a message
940
+ * @param chatId Chat ID
941
+ * @param messageId Message ID
942
+ * @param emoji Emoji to react with
943
+ */
944
+ addReaction?(chatId: string, messageId: string, emoji: string): Promise<void>;
945
+
946
+ /**
947
+ * Remove reaction from a message
948
+ * @param chatId Chat ID
949
+ * @param messageId Message ID
950
+ * @param emoji Emoji to remove
951
+ */
952
+ removeReaction?(chatId: string, messageId: string, emoji: string): Promise<void>;
953
+
954
+ /**
955
+ * Send a poll
956
+ * @param chatId Chat ID
957
+ * @param poll Poll configuration
958
+ * @returns Message ID
959
+ */
960
+ sendPoll?(chatId: string, poll: Poll): Promise<string>;
961
+
962
+ /**
963
+ * Send a message with reply keyboard
964
+ * @param chatId Chat ID
965
+ * @param text Message text
966
+ * @param keyboard Reply keyboard
967
+ * @returns Message ID
968
+ */
969
+ sendWithReplyKeyboard?(chatId: string, text: string, keyboard: ReplyKeyboard): Promise<string>;
970
+
971
+ /**
972
+ * Remove reply keyboard
973
+ * @param chatId Chat ID
974
+ * @param text Message text
975
+ */
976
+ removeReplyKeyboard?(chatId: string, text: string): Promise<string>;
977
+
978
+ /**
979
+ * Send a message with select menu (Discord)
980
+ * @param chatId Chat ID
981
+ * @param text Message text
982
+ * @param menu Select menu configuration
983
+ */
984
+ sendWithSelectMenu?(chatId: string, text: string, menu: SelectMenu): Promise<string>;
985
+
986
+ /**
987
+ * Register select menu handler (Discord)
988
+ */
989
+ onSelectMenu?(handler: SelectMenuHandler): void;
990
+ }
991
+
992
+ /**
993
+ * Select menu interaction handler
994
+ */
995
+ export type SelectMenuHandler = (
996
+ customId: string,
997
+ values: string[],
998
+ userId: string,
999
+ chatId: string,
1000
+ messageId: string,
1001
+ raw: unknown
1002
+ ) => void | Promise<void>;