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,102 @@
1
+ "use strict";
2
+ /**
3
+ * Process Utilities
4
+ *
5
+ * Helper functions for executing external commands.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.checkBinaryExists = checkBinaryExists;
9
+ exports.runCommand = runCommand;
10
+ exports.runShellCommand = runShellCommand;
11
+ const child_process_1 = require("child_process");
12
+ const util_1 = require("util");
13
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
14
+ /**
15
+ * Check if a binary exists in PATH
16
+ */
17
+ async function checkBinaryExists(binary) {
18
+ try {
19
+ const command = process.platform === 'win32' ? `where ${binary}` : `which ${binary}`;
20
+ await execAsync(command);
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ /**
28
+ * Run a command with timeout
29
+ */
30
+ async function runCommand(command, args, options = {}) {
31
+ const { timeoutMs = 30000, cwd, env } = options;
32
+ return new Promise((resolve) => {
33
+ let stdout = '';
34
+ let stderr = '';
35
+ let resolved = false;
36
+ const child = (0, child_process_1.spawn)(command, args, {
37
+ cwd,
38
+ env: env ? { ...process.env, ...env } : process.env,
39
+ stdio: ['ignore', 'pipe', 'pipe'],
40
+ });
41
+ const timeout = setTimeout(() => {
42
+ if (resolved)
43
+ return;
44
+ resolved = true;
45
+ child.kill('SIGKILL');
46
+ resolve({
47
+ code: -1,
48
+ stdout,
49
+ stderr: stderr || 'Command timed out',
50
+ });
51
+ }, timeoutMs);
52
+ child.stdout?.on('data', (data) => {
53
+ stdout += data.toString();
54
+ });
55
+ child.stderr?.on('data', (data) => {
56
+ stderr += data.toString();
57
+ });
58
+ child.on('error', (err) => {
59
+ if (resolved)
60
+ return;
61
+ resolved = true;
62
+ clearTimeout(timeout);
63
+ resolve({
64
+ code: -1,
65
+ stdout,
66
+ stderr: err.message,
67
+ });
68
+ });
69
+ child.on('exit', (code) => {
70
+ if (resolved)
71
+ return;
72
+ resolved = true;
73
+ clearTimeout(timeout);
74
+ resolve({
75
+ code: code ?? -1,
76
+ stdout,
77
+ stderr,
78
+ });
79
+ });
80
+ });
81
+ }
82
+ /**
83
+ * Run a shell command (with shell expansion)
84
+ */
85
+ async function runShellCommand(command, options = {}) {
86
+ const { timeoutMs = 30000, cwd, env } = options;
87
+ try {
88
+ const { stdout, stderr } = await execAsync(command, {
89
+ cwd,
90
+ env: env ? { ...process.env, ...env } : process.env,
91
+ timeout: timeoutMs,
92
+ });
93
+ return { code: 0, stdout, stderr };
94
+ }
95
+ catch (error) {
96
+ return {
97
+ code: error.code ?? -1,
98
+ stdout: error.stdout ?? '',
99
+ stderr: error.stderr ?? error.message ?? String(error),
100
+ };
101
+ }
102
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * Simple in-memory rate limiter for IPC handlers
4
+ * Prevents abuse by limiting call frequency per channel
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.rateLimiter = exports.RATE_LIMIT_CONFIGS = void 0;
8
+ exports.withRateLimit = withRateLimit;
9
+ // Default configurations for different handler types
10
+ exports.RATE_LIMIT_CONFIGS = {
11
+ // Expensive operations (LLM calls, task creation)
12
+ expensive: { maxRequests: 10, windowMs: 60000 }, // 10 per minute
13
+ // Standard operations (most handlers)
14
+ standard: { maxRequests: 60, windowMs: 60000 }, // 60 per minute
15
+ // High-frequency operations (UI updates, status checks)
16
+ frequent: { maxRequests: 300, windowMs: 60000 }, // 300 per minute
17
+ // Very limited (settings save, credential operations)
18
+ limited: { maxRequests: 5, windowMs: 60000 }, // 5 per minute
19
+ };
20
+ class RateLimiter {
21
+ constructor() {
22
+ this.limits = new Map();
23
+ this.configs = new Map();
24
+ }
25
+ /**
26
+ * Configure rate limit for a specific channel
27
+ */
28
+ configure(channel, config) {
29
+ this.configs.set(channel, config);
30
+ }
31
+ /**
32
+ * Check if request should be allowed
33
+ * Returns true if allowed, false if rate limited
34
+ */
35
+ check(channel) {
36
+ const config = this.configs.get(channel) || exports.RATE_LIMIT_CONFIGS.standard;
37
+ const now = Date.now();
38
+ const entry = this.limits.get(channel);
39
+ if (!entry || now >= entry.resetTime) {
40
+ // First request or window expired - start new window
41
+ this.limits.set(channel, {
42
+ count: 1,
43
+ resetTime: now + config.windowMs,
44
+ });
45
+ return true;
46
+ }
47
+ if (entry.count >= config.maxRequests) {
48
+ // Rate limit exceeded
49
+ return false;
50
+ }
51
+ // Increment count
52
+ entry.count++;
53
+ return true;
54
+ }
55
+ /**
56
+ * Get remaining requests for a channel
57
+ */
58
+ getRemaining(channel) {
59
+ const config = this.configs.get(channel) || exports.RATE_LIMIT_CONFIGS.standard;
60
+ const entry = this.limits.get(channel);
61
+ if (!entry || Date.now() >= entry.resetTime) {
62
+ return config.maxRequests;
63
+ }
64
+ return Math.max(0, config.maxRequests - entry.count);
65
+ }
66
+ /**
67
+ * Get time until rate limit resets (in ms)
68
+ */
69
+ getResetTime(channel) {
70
+ const entry = this.limits.get(channel);
71
+ if (!entry)
72
+ return 0;
73
+ const remaining = entry.resetTime - Date.now();
74
+ return Math.max(0, remaining);
75
+ }
76
+ /**
77
+ * Clear rate limit for a channel (for testing)
78
+ */
79
+ reset(channel) {
80
+ this.limits.delete(channel);
81
+ }
82
+ /**
83
+ * Clear all rate limits
84
+ */
85
+ resetAll() {
86
+ this.limits.clear();
87
+ }
88
+ }
89
+ // Singleton instance
90
+ exports.rateLimiter = new RateLimiter();
91
+ /**
92
+ * Helper to wrap an IPC handler with rate limiting
93
+ */
94
+ function withRateLimit(channel, handler, config = exports.RATE_LIMIT_CONFIGS.standard) {
95
+ exports.rateLimiter.configure(channel, config);
96
+ return (async (...args) => {
97
+ if (!exports.rateLimiter.check(channel)) {
98
+ const resetMs = exports.rateLimiter.getResetTime(channel);
99
+ const resetSec = Math.ceil(resetMs / 1000);
100
+ throw new Error(`Rate limit exceeded for ${channel}. Try again in ${resetSec} seconds.`);
101
+ }
102
+ return handler(...args);
103
+ });
104
+ }
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ /**
3
+ * Input validation schemas for IPC handlers using Zod
4
+ * Provides type-safe validation to prevent malformed input attacks
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MCPRegistrySearchSchema = exports.MCPSettingsSchema = exports.MCPServerUpdateSchema = exports.MCPServerConfigSchema = exports.MCPAuthConfigSchema = exports.MCPTransportTypeSchema = exports.StringIdSchema = exports.UUIDSchema = exports.FilePathSchema = exports.GeneratePairingSchema = exports.RevokeAccessSchema = exports.GrantAccessSchema = exports.UpdateChannelSchema = exports.ChannelConfigSchema = exports.AddChannelSchema = exports.AddEmailChannelSchema = exports.AddBlueBubblesChannelSchema = exports.AddLineChannelSchema = exports.AddTwitchChannelSchema = exports.AddMatrixChannelSchema = exports.AddMattermostChannelSchema = exports.AddSignalChannelSchema = exports.AddImessageChannelSchema = exports.SignalTrustModeSchema = exports.SignalModeSchema = exports.GroupPolicySchema = exports.DmPolicySchema = exports.AddWhatsAppChannelSchema = exports.AddSlackChannelSchema = exports.AddDiscordChannelSchema = exports.AddTelegramChannelSchema = exports.SecurityModeSchema = exports.GuardrailSettingsSchema = exports.XSettingsSchema = exports.SearchSettingsSchema = exports.SearchProviderTypeSchema = exports.LLMSettingsSchema = exports.OpenAISettingsSchema = exports.OpenRouterSettingsSchema = exports.GeminiSettingsSchema = exports.OllamaSettingsSchema = exports.BedrockSettingsSchema = exports.AnthropicSettingsSchema = exports.LLMProviderTypeSchema = exports.ApprovalResponseSchema = exports.TaskMessageSchema = exports.TaskRenameSchema = exports.TaskCreateSchema = exports.SuccessCriteriaSchema = exports.WorkspaceCreateSchema = void 0;
8
+ exports.HookMappingSchema = exports.HookMappingChannelSchema = void 0;
9
+ exports.validateInput = validateInput;
10
+ const zod_1 = require("zod");
11
+ // Common validation patterns
12
+ const MAX_STRING_LENGTH = 10000;
13
+ const MAX_PATH_LENGTH = 4096;
14
+ const MAX_TITLE_LENGTH = 500;
15
+ const MAX_PROMPT_LENGTH = 100000;
16
+ // ============ Workspace Schemas ============
17
+ exports.WorkspaceCreateSchema = zod_1.z.object({
18
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
19
+ path: zod_1.z.string().min(1).max(MAX_PATH_LENGTH),
20
+ permissions: zod_1.z.object({
21
+ read: zod_1.z.boolean().default(true),
22
+ write: zod_1.z.boolean().default(true),
23
+ delete: zod_1.z.boolean().default(false),
24
+ network: zod_1.z.boolean().default(false),
25
+ shell: zod_1.z.boolean().default(false),
26
+ // Broader filesystem access
27
+ unrestrictedFileAccess: zod_1.z.boolean().default(false),
28
+ allowedPaths: zod_1.z.array(zod_1.z.string().max(MAX_PATH_LENGTH)).max(50).optional(),
29
+ }).optional(),
30
+ });
31
+ // ============ Task Schemas ============
32
+ exports.SuccessCriteriaSchema = zod_1.z.object({
33
+ type: zod_1.z.enum(['shell_command', 'file_exists']),
34
+ command: zod_1.z.string().max(5000).optional(),
35
+ filePaths: zod_1.z.array(zod_1.z.string().max(MAX_PATH_LENGTH)).max(20).optional(),
36
+ });
37
+ // TEMP_WORKSPACE_ID constant for validation
38
+ const TEMP_WORKSPACE_ID = '__temp_workspace__';
39
+ exports.TaskCreateSchema = zod_1.z.object({
40
+ title: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
41
+ prompt: zod_1.z.string().min(1).max(MAX_PROMPT_LENGTH),
42
+ workspaceId: zod_1.z.string().refine((val) => val === TEMP_WORKSPACE_ID || zod_1.z.string().uuid().safeParse(val).success, { message: 'Must be a valid UUID or temp workspace ID' }),
43
+ budgetTokens: zod_1.z.number().int().positive().optional(),
44
+ budgetCost: zod_1.z.number().positive().optional(),
45
+ // Goal Mode fields
46
+ successCriteria: exports.SuccessCriteriaSchema.optional(),
47
+ maxAttempts: zod_1.z.number().int().min(1).max(10).optional(),
48
+ });
49
+ exports.TaskRenameSchema = zod_1.z.object({
50
+ id: zod_1.z.string().uuid(),
51
+ title: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
52
+ });
53
+ exports.TaskMessageSchema = zod_1.z.object({
54
+ taskId: zod_1.z.string().uuid(),
55
+ message: zod_1.z.string().min(1).max(MAX_PROMPT_LENGTH),
56
+ });
57
+ // ============ Approval Schemas ============
58
+ exports.ApprovalResponseSchema = zod_1.z.object({
59
+ approvalId: zod_1.z.string().uuid(),
60
+ approved: zod_1.z.boolean(),
61
+ });
62
+ // ============ LLM Settings Schemas ============
63
+ exports.LLMProviderTypeSchema = zod_1.z.enum(['anthropic', 'bedrock', 'ollama', 'gemini', 'openrouter', 'openai']);
64
+ exports.AnthropicSettingsSchema = zod_1.z.object({
65
+ apiKey: zod_1.z.string().max(500).optional(),
66
+ }).optional();
67
+ exports.BedrockSettingsSchema = zod_1.z.object({
68
+ region: zod_1.z.string().max(100).optional(),
69
+ accessKeyId: zod_1.z.string().max(500).optional(),
70
+ secretAccessKey: zod_1.z.string().max(500).optional(),
71
+ sessionToken: zod_1.z.string().max(2000).optional(),
72
+ profile: zod_1.z.string().max(100).optional(),
73
+ useDefaultCredentials: zod_1.z.boolean().optional(),
74
+ model: zod_1.z.string().max(200).optional(),
75
+ }).optional();
76
+ exports.OllamaSettingsSchema = zod_1.z.object({
77
+ baseUrl: zod_1.z.string().url().max(500).optional(),
78
+ model: zod_1.z.string().max(200).optional(),
79
+ apiKey: zod_1.z.string().max(500).optional(),
80
+ }).optional();
81
+ exports.GeminiSettingsSchema = zod_1.z.object({
82
+ apiKey: zod_1.z.string().max(500).optional(),
83
+ model: zod_1.z.string().max(200).optional(),
84
+ }).optional();
85
+ exports.OpenRouterSettingsSchema = zod_1.z.object({
86
+ apiKey: zod_1.z.string().max(500).optional(),
87
+ model: zod_1.z.string().max(200).optional(),
88
+ }).optional();
89
+ exports.OpenAISettingsSchema = zod_1.z.object({
90
+ apiKey: zod_1.z.string().max(500).optional(),
91
+ model: zod_1.z.string().max(200).optional(),
92
+ // OAuth tokens (alternative to API key)
93
+ accessToken: zod_1.z.string().max(2000).optional(),
94
+ refreshToken: zod_1.z.string().max(2000).optional(),
95
+ tokenExpiresAt: zod_1.z.number().optional(),
96
+ authMethod: zod_1.z.enum(['api_key', 'oauth']).optional(),
97
+ }).optional();
98
+ exports.LLMSettingsSchema = zod_1.z.object({
99
+ providerType: exports.LLMProviderTypeSchema,
100
+ modelKey: zod_1.z.string().max(200),
101
+ anthropic: exports.AnthropicSettingsSchema,
102
+ bedrock: exports.BedrockSettingsSchema,
103
+ ollama: exports.OllamaSettingsSchema,
104
+ gemini: exports.GeminiSettingsSchema,
105
+ openrouter: exports.OpenRouterSettingsSchema,
106
+ openai: exports.OpenAISettingsSchema,
107
+ });
108
+ // ============ Search Settings Schemas ============
109
+ exports.SearchProviderTypeSchema = zod_1.z.enum(['tavily', 'brave', 'serpapi', 'google']).nullable();
110
+ exports.SearchSettingsSchema = zod_1.z.object({
111
+ primaryProvider: exports.SearchProviderTypeSchema,
112
+ fallbackProvider: exports.SearchProviderTypeSchema,
113
+ tavily: zod_1.z.object({
114
+ apiKey: zod_1.z.string().max(500).optional(),
115
+ }).optional(),
116
+ brave: zod_1.z.object({
117
+ apiKey: zod_1.z.string().max(500).optional(),
118
+ }).optional(),
119
+ serpapi: zod_1.z.object({
120
+ apiKey: zod_1.z.string().max(500).optional(),
121
+ }).optional(),
122
+ google: zod_1.z.object({
123
+ apiKey: zod_1.z.string().max(500).optional(),
124
+ searchEngineId: zod_1.z.string().max(500).optional(),
125
+ }).optional(),
126
+ });
127
+ // ============ X/Twitter Settings Schema ============
128
+ exports.XSettingsSchema = zod_1.z.object({
129
+ enabled: zod_1.z.boolean().default(false),
130
+ authMethod: zod_1.z.enum(['browser', 'manual']).default('browser'),
131
+ authToken: zod_1.z.string().max(2000).optional(),
132
+ ct0: zod_1.z.string().max(2000).optional(),
133
+ cookieSource: zod_1.z.array(zod_1.z.string().max(50)).max(10).optional(),
134
+ chromeProfile: zod_1.z.string().max(200).optional(),
135
+ chromeProfileDir: zod_1.z.string().max(MAX_PATH_LENGTH).optional(),
136
+ firefoxProfile: zod_1.z.string().max(200).optional(),
137
+ timeoutMs: zod_1.z.number().int().min(1000).max(120000).optional(),
138
+ cookieTimeoutMs: zod_1.z.number().int().min(1000).max(120000).optional(),
139
+ quoteDepth: zod_1.z.number().int().min(0).max(5).optional(),
140
+ });
141
+ // ============ Guardrail Settings Schema ============
142
+ exports.GuardrailSettingsSchema = zod_1.z.object({
143
+ // Token budget
144
+ maxTokensPerTask: zod_1.z.number().int().min(1000).max(10000000).default(100000),
145
+ tokenBudgetEnabled: zod_1.z.boolean().default(true),
146
+ // Cost budget
147
+ maxCostPerTask: zod_1.z.number().min(0.01).max(100).default(1.00),
148
+ costBudgetEnabled: zod_1.z.boolean().default(false),
149
+ // Dangerous commands
150
+ blockDangerousCommands: zod_1.z.boolean().default(true),
151
+ customBlockedPatterns: zod_1.z.array(zod_1.z.string().max(500)).max(50).default([]),
152
+ // Auto-approve trusted commands
153
+ autoApproveTrustedCommands: zod_1.z.boolean().default(false),
154
+ trustedCommandPatterns: zod_1.z.array(zod_1.z.string().max(500)).max(100).default([]),
155
+ // File size
156
+ maxFileSizeMB: zod_1.z.number().int().min(1).max(500).default(50),
157
+ fileSizeLimitEnabled: zod_1.z.boolean().default(true),
158
+ // Network domains
159
+ enforceAllowedDomains: zod_1.z.boolean().default(false),
160
+ allowedDomains: zod_1.z.array(zod_1.z.string().max(255)).max(100).default([]),
161
+ // Iterations
162
+ maxIterationsPerTask: zod_1.z.number().int().min(5).max(500).default(50),
163
+ iterationLimitEnabled: zod_1.z.boolean().default(true),
164
+ });
165
+ // ============ Gateway/Channel Schemas ============
166
+ exports.SecurityModeSchema = zod_1.z.enum(['pairing', 'allowlist', 'open']);
167
+ exports.AddTelegramChannelSchema = zod_1.z.object({
168
+ type: zod_1.z.literal('telegram'),
169
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
170
+ botToken: zod_1.z.string().min(1).max(500),
171
+ securityMode: exports.SecurityModeSchema.optional(),
172
+ });
173
+ exports.AddDiscordChannelSchema = zod_1.z.object({
174
+ type: zod_1.z.literal('discord'),
175
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
176
+ botToken: zod_1.z.string().min(1).max(500),
177
+ applicationId: zod_1.z.string().min(1).max(100),
178
+ guildIds: zod_1.z.array(zod_1.z.string().max(100)).max(100).optional(),
179
+ securityMode: exports.SecurityModeSchema.optional(),
180
+ });
181
+ exports.AddSlackChannelSchema = zod_1.z.object({
182
+ type: zod_1.z.literal('slack'),
183
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
184
+ botToken: zod_1.z.string().min(1).max(500),
185
+ appToken: zod_1.z.string().min(1).max(500),
186
+ signingSecret: zod_1.z.string().max(500).optional(),
187
+ securityMode: exports.SecurityModeSchema.optional(),
188
+ });
189
+ exports.AddWhatsAppChannelSchema = zod_1.z.object({
190
+ type: zod_1.z.literal('whatsapp'),
191
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
192
+ allowedNumbers: zod_1.z.array(zod_1.z.string().max(20)).max(100).optional(),
193
+ securityMode: exports.SecurityModeSchema.optional(),
194
+ selfChatMode: zod_1.z.boolean().optional(),
195
+ responsePrefix: zod_1.z.string().max(20).optional(),
196
+ });
197
+ exports.DmPolicySchema = zod_1.z.enum(['open', 'allowlist', 'pairing', 'disabled']);
198
+ exports.GroupPolicySchema = zod_1.z.enum(['open', 'allowlist', 'disabled']);
199
+ exports.SignalModeSchema = zod_1.z.enum(['native', 'daemon']);
200
+ exports.SignalTrustModeSchema = zod_1.z.enum(['tofu', 'always', 'manual']);
201
+ exports.AddImessageChannelSchema = zod_1.z.object({
202
+ type: zod_1.z.literal('imessage'),
203
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
204
+ cliPath: zod_1.z.string().max(500).optional(),
205
+ dbPath: zod_1.z.string().max(500).optional(),
206
+ allowedContacts: zod_1.z.array(zod_1.z.string().max(100)).max(100).optional(),
207
+ securityMode: exports.SecurityModeSchema.optional(),
208
+ dmPolicy: exports.DmPolicySchema.optional(),
209
+ groupPolicy: exports.GroupPolicySchema.optional(),
210
+ responsePrefix: zod_1.z.string().max(20).optional(),
211
+ });
212
+ exports.AddSignalChannelSchema = zod_1.z.object({
213
+ type: zod_1.z.literal('signal'),
214
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
215
+ phoneNumber: zod_1.z.string().min(1).max(20),
216
+ dataDir: zod_1.z.string().max(MAX_PATH_LENGTH).optional(),
217
+ securityMode: exports.SecurityModeSchema.optional(),
218
+ mode: exports.SignalModeSchema.optional(),
219
+ trustMode: exports.SignalTrustModeSchema.optional(),
220
+ dmPolicy: exports.DmPolicySchema.optional(),
221
+ groupPolicy: exports.GroupPolicySchema.optional(),
222
+ sendReadReceipts: zod_1.z.boolean().optional(),
223
+ sendTypingIndicators: zod_1.z.boolean().optional(),
224
+ });
225
+ exports.AddMattermostChannelSchema = zod_1.z.object({
226
+ type: zod_1.z.literal('mattermost'),
227
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
228
+ mattermostServerUrl: zod_1.z.string().url().min(1).max(500),
229
+ mattermostToken: zod_1.z.string().min(1).max(500),
230
+ mattermostTeamId: zod_1.z.string().max(100).optional(),
231
+ securityMode: exports.SecurityModeSchema.optional(),
232
+ });
233
+ exports.AddMatrixChannelSchema = zod_1.z.object({
234
+ type: zod_1.z.literal('matrix'),
235
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
236
+ matrixHomeserver: zod_1.z.string().url().min(1).max(500),
237
+ matrixUserId: zod_1.z.string().min(1).max(200),
238
+ matrixAccessToken: zod_1.z.string().min(1).max(1000),
239
+ matrixDeviceId: zod_1.z.string().max(200).optional(),
240
+ matrixRoomIds: zod_1.z.array(zod_1.z.string().max(200)).max(100).optional(),
241
+ securityMode: exports.SecurityModeSchema.optional(),
242
+ });
243
+ exports.AddTwitchChannelSchema = zod_1.z.object({
244
+ type: zod_1.z.literal('twitch'),
245
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
246
+ twitchUsername: zod_1.z.string().min(1).max(100),
247
+ twitchOauthToken: zod_1.z.string().min(1).max(500),
248
+ twitchChannels: zod_1.z.array(zod_1.z.string().max(100)).min(1).max(50),
249
+ twitchAllowWhispers: zod_1.z.boolean().optional(),
250
+ securityMode: exports.SecurityModeSchema.optional(),
251
+ });
252
+ exports.AddLineChannelSchema = zod_1.z.object({
253
+ type: zod_1.z.literal('line'),
254
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
255
+ lineChannelAccessToken: zod_1.z.string().min(1).max(500),
256
+ lineChannelSecret: zod_1.z.string().min(1).max(200),
257
+ lineWebhookPort: zod_1.z.number().int().min(1024).max(65535).optional(),
258
+ securityMode: exports.SecurityModeSchema.optional(),
259
+ });
260
+ exports.AddBlueBubblesChannelSchema = zod_1.z.object({
261
+ type: zod_1.z.literal('bluebubbles'),
262
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
263
+ blueBubblesServerUrl: zod_1.z.string().url().min(1).max(500),
264
+ blueBubblesPassword: zod_1.z.string().min(1).max(500),
265
+ blueBubblesWebhookPort: zod_1.z.number().int().min(1024).max(65535).optional(),
266
+ blueBubblesAllowedContacts: zod_1.z.array(zod_1.z.string().max(100)).max(100).optional(),
267
+ securityMode: exports.SecurityModeSchema.optional(),
268
+ });
269
+ exports.AddEmailChannelSchema = zod_1.z.object({
270
+ type: zod_1.z.literal('email'),
271
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH),
272
+ emailAddress: zod_1.z.string().email().min(1).max(200),
273
+ emailPassword: zod_1.z.string().min(1).max(500),
274
+ emailImapHost: zod_1.z.string().min(1).max(200),
275
+ emailImapPort: zod_1.z.number().int().min(1).max(65535).optional(),
276
+ emailSmtpHost: zod_1.z.string().min(1).max(200),
277
+ emailSmtpPort: zod_1.z.number().int().min(1).max(65535).optional(),
278
+ emailDisplayName: zod_1.z.string().max(100).optional(),
279
+ emailAllowedSenders: zod_1.z.array(zod_1.z.string().max(200)).max(100).optional(),
280
+ emailSubjectFilter: zod_1.z.string().max(200).optional(),
281
+ securityMode: exports.SecurityModeSchema.optional(),
282
+ });
283
+ exports.AddChannelSchema = zod_1.z.discriminatedUnion('type', [
284
+ exports.AddTelegramChannelSchema,
285
+ exports.AddDiscordChannelSchema,
286
+ exports.AddSlackChannelSchema,
287
+ exports.AddWhatsAppChannelSchema,
288
+ exports.AddImessageChannelSchema,
289
+ exports.AddSignalChannelSchema,
290
+ exports.AddMattermostChannelSchema,
291
+ exports.AddMatrixChannelSchema,
292
+ exports.AddTwitchChannelSchema,
293
+ exports.AddLineChannelSchema,
294
+ exports.AddBlueBubblesChannelSchema,
295
+ exports.AddEmailChannelSchema,
296
+ ]);
297
+ exports.ChannelConfigSchema = zod_1.z.object({
298
+ selfChatMode: zod_1.z.boolean().optional(),
299
+ responsePrefix: zod_1.z.string().max(20).optional(),
300
+ }).passthrough(); // Allow additional properties
301
+ exports.UpdateChannelSchema = zod_1.z.object({
302
+ id: zod_1.z.string().uuid(),
303
+ name: zod_1.z.string().min(1).max(MAX_TITLE_LENGTH).optional(),
304
+ securityMode: exports.SecurityModeSchema.optional(),
305
+ config: exports.ChannelConfigSchema.optional(),
306
+ });
307
+ exports.GrantAccessSchema = zod_1.z.object({
308
+ channelId: zod_1.z.string().uuid(),
309
+ userId: zod_1.z.string().min(1).max(100),
310
+ displayName: zod_1.z.string().max(MAX_TITLE_LENGTH).optional(),
311
+ });
312
+ exports.RevokeAccessSchema = zod_1.z.object({
313
+ channelId: zod_1.z.string().uuid(),
314
+ userId: zod_1.z.string().min(1).max(100),
315
+ });
316
+ exports.GeneratePairingSchema = zod_1.z.object({
317
+ channelId: zod_1.z.string().uuid(),
318
+ userId: zod_1.z.string().max(100).optional(),
319
+ displayName: zod_1.z.string().max(MAX_TITLE_LENGTH).optional(),
320
+ });
321
+ // ============ File Operation Schemas ============
322
+ exports.FilePathSchema = zod_1.z.object({
323
+ filePath: zod_1.z.string().min(1).max(MAX_PATH_LENGTH),
324
+ workspacePath: zod_1.z.string().min(1).max(MAX_PATH_LENGTH),
325
+ });
326
+ // ============ ID Schemas (for simple string ID params) ============
327
+ exports.UUIDSchema = zod_1.z.string().uuid();
328
+ exports.StringIdSchema = zod_1.z.string().min(1).max(100);
329
+ // ============ MCP (Model Context Protocol) Schemas ============
330
+ exports.MCPTransportTypeSchema = zod_1.z.enum(['stdio', 'sse', 'websocket']);
331
+ exports.MCPAuthConfigSchema = zod_1.z.object({
332
+ type: zod_1.z.enum(['none', 'bearer', 'api-key', 'basic']),
333
+ token: zod_1.z.string().max(2000).optional(),
334
+ apiKey: zod_1.z.string().max(2000).optional(),
335
+ username: zod_1.z.string().max(500).optional(),
336
+ password: zod_1.z.string().max(500).optional(),
337
+ headerName: zod_1.z.string().max(100).optional(),
338
+ }).optional();
339
+ exports.MCPServerConfigSchema = zod_1.z.object({
340
+ id: zod_1.z.string().uuid().optional(), // Optional for create (will be generated)
341
+ name: zod_1.z.string().min(1).max(200),
342
+ description: zod_1.z.string().max(1000).optional(),
343
+ enabled: zod_1.z.boolean().default(true),
344
+ transport: exports.MCPTransportTypeSchema,
345
+ // stdio transport config
346
+ command: zod_1.z.string().max(1000).optional(),
347
+ args: zod_1.z.array(zod_1.z.string().max(500)).max(50).optional(),
348
+ env: zod_1.z.record(zod_1.z.string(), zod_1.z.string().max(500)).optional(),
349
+ cwd: zod_1.z.string().max(MAX_PATH_LENGTH).optional(),
350
+ // HTTP-based transport config
351
+ url: zod_1.z.string().url().max(500).optional(),
352
+ headers: zod_1.z.record(zod_1.z.string(), zod_1.z.string().max(1000)).optional(),
353
+ // Authentication
354
+ auth: exports.MCPAuthConfigSchema,
355
+ // Timeouts
356
+ connectionTimeout: zod_1.z.number().int().min(1000).max(120000).optional(),
357
+ requestTimeout: zod_1.z.number().int().min(1000).max(300000).optional(),
358
+ // Metadata
359
+ version: zod_1.z.string().max(100).optional(),
360
+ author: zod_1.z.string().max(200).optional(),
361
+ homepage: zod_1.z.string().url().max(500).optional(),
362
+ repository: zod_1.z.string().url().max(500).optional(),
363
+ license: zod_1.z.string().max(100).optional(),
364
+ });
365
+ exports.MCPServerUpdateSchema = exports.MCPServerConfigSchema.partial().omit({ id: true });
366
+ exports.MCPSettingsSchema = zod_1.z.object({
367
+ servers: zod_1.z.array(exports.MCPServerConfigSchema).max(50),
368
+ autoConnect: zod_1.z.boolean().default(true),
369
+ toolNamePrefix: zod_1.z.string().min(0).max(50).default('mcp_'),
370
+ maxReconnectAttempts: zod_1.z.number().int().min(0).max(20).default(5),
371
+ reconnectDelayMs: zod_1.z.number().int().min(100).max(60000).default(1000),
372
+ registryEnabled: zod_1.z.boolean().default(true),
373
+ registryUrl: zod_1.z.string().url().max(500).optional(),
374
+ hostEnabled: zod_1.z.boolean().default(false),
375
+ hostPort: zod_1.z.number().int().min(1024).max(65535).optional(),
376
+ });
377
+ // MCP Registry schemas
378
+ exports.MCPRegistrySearchSchema = zod_1.z.object({
379
+ query: zod_1.z.string().max(200).optional(),
380
+ tags: zod_1.z.array(zod_1.z.string().max(50)).max(20).optional(),
381
+ limit: zod_1.z.number().int().min(1).max(100).default(50),
382
+ offset: zod_1.z.number().int().min(0).default(0),
383
+ });
384
+ // ============ Hooks (Webhooks) Schemas ============
385
+ exports.HookMappingChannelSchema = zod_1.z.enum(['telegram', 'discord', 'slack', 'whatsapp', 'imessage', 'signal', 'mattermost', 'matrix', 'twitch', 'line', 'bluebubbles', 'email', 'last']);
386
+ exports.HookMappingSchema = zod_1.z.object({
387
+ id: zod_1.z.string().max(100).optional(),
388
+ match: zod_1.z.object({
389
+ path: zod_1.z.string().max(500).optional(),
390
+ source: zod_1.z.string().max(100).optional(),
391
+ }).optional(),
392
+ action: zod_1.z.enum(['wake', 'agent']).optional(),
393
+ wakeMode: zod_1.z.enum(['now', 'next-heartbeat']).optional(),
394
+ name: zod_1.z.string().max(200).optional(),
395
+ sessionKey: zod_1.z.string().max(100).optional(),
396
+ messageTemplate: zod_1.z.string().max(10000).optional(),
397
+ textTemplate: zod_1.z.string().max(10000).optional(),
398
+ deliver: zod_1.z.boolean().optional(),
399
+ channel: exports.HookMappingChannelSchema.optional(),
400
+ to: zod_1.z.string().max(100).optional(),
401
+ model: zod_1.z.string().max(100).optional(),
402
+ thinking: zod_1.z.string().max(50).optional(),
403
+ timeoutSeconds: zod_1.z.number().int().min(1).max(3600).optional(),
404
+ });
405
+ // ============ Validation Helper ============
406
+ /**
407
+ * Validate input against a schema and throw a user-friendly error if invalid
408
+ */
409
+ function validateInput(schema, input, context) {
410
+ const result = schema.safeParse(input);
411
+ if (!result.success) {
412
+ // Zod v4 uses 'issues' instead of 'errors'
413
+ const issues = result.error.issues;
414
+ const errorMessages = issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`).join(', ');
415
+ const prefix = context ? `Invalid ${context}: ` : 'Invalid input: ';
416
+ throw new Error(`${prefix}${errorMessages}`);
417
+ }
418
+ return result.data;
419
+ }