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,395 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SearchProviderFactory = void 0;
37
+ const electron_1 = require("electron");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const types_1 = require("./types");
41
+ const tavily_provider_1 = require("./tavily-provider");
42
+ const brave_provider_1 = require("./brave-provider");
43
+ const serpapi_provider_1 = require("./serpapi-provider");
44
+ const google_provider_1 = require("./google-provider");
45
+ const SecureSettingsRepository_1 = require("../../database/SecureSettingsRepository");
46
+ const LEGACY_SETTINGS_FILE = 'search-settings.json';
47
+ const DEFAULT_SETTINGS = {
48
+ primaryProvider: null,
49
+ fallbackProvider: null,
50
+ };
51
+ /**
52
+ * Factory for creating Search providers with fallback support
53
+ */
54
+ class SearchProviderFactory {
55
+ /**
56
+ * Initialize the factory
57
+ */
58
+ static initialize() {
59
+ const userDataPath = electron_1.app.getPath('userData');
60
+ this.legacySettingsPath = path.join(userDataPath, LEGACY_SETTINGS_FILE);
61
+ // Migrate from legacy JSON file to encrypted database
62
+ this.migrateFromLegacyFile();
63
+ }
64
+ /**
65
+ * Migrate settings from legacy JSON file to encrypted database
66
+ */
67
+ static migrateFromLegacyFile() {
68
+ if (this.migrationCompleted)
69
+ return;
70
+ try {
71
+ // Check if SecureSettingsRepository is initialized
72
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
73
+ console.log('[SearchProviderFactory] SecureSettingsRepository not yet initialized, skipping migration');
74
+ return;
75
+ }
76
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
77
+ // Check if already migrated to database
78
+ if (repository.exists('search')) {
79
+ this.migrationCompleted = true;
80
+ return;
81
+ }
82
+ // Check if legacy file exists
83
+ if (!fs.existsSync(this.legacySettingsPath)) {
84
+ console.log('[SearchProviderFactory] No legacy settings file found');
85
+ this.migrationCompleted = true;
86
+ return;
87
+ }
88
+ console.log('[SearchProviderFactory] Migrating settings from legacy JSON file to encrypted database...');
89
+ // Create backup before migration
90
+ const backupPath = this.legacySettingsPath + '.migration-backup';
91
+ fs.copyFileSync(this.legacySettingsPath, backupPath);
92
+ try {
93
+ // Read legacy settings
94
+ const data = fs.readFileSync(this.legacySettingsPath, 'utf-8');
95
+ const parsed = JSON.parse(data);
96
+ // Handle migration from old format (providerType -> primaryProvider)
97
+ if (parsed.providerType && !parsed.primaryProvider) {
98
+ parsed.primaryProvider = parsed.providerType;
99
+ delete parsed.providerType;
100
+ }
101
+ const legacySettings = { ...DEFAULT_SETTINGS, ...parsed };
102
+ // Save to encrypted database
103
+ repository.save('search', legacySettings);
104
+ console.log('[SearchProviderFactory] Settings migrated to encrypted database');
105
+ // Migration successful - delete backup and original
106
+ fs.unlinkSync(backupPath);
107
+ fs.unlinkSync(this.legacySettingsPath);
108
+ console.log('[SearchProviderFactory] Migration complete, cleaned up legacy files');
109
+ this.migrationCompleted = true;
110
+ }
111
+ catch (migrationError) {
112
+ console.error('[SearchProviderFactory] Migration failed, backup preserved at:', backupPath);
113
+ throw migrationError;
114
+ }
115
+ }
116
+ catch (error) {
117
+ console.error('[SearchProviderFactory] Migration failed:', error);
118
+ }
119
+ }
120
+ /**
121
+ * Get the path to legacy settings file (for testing)
122
+ */
123
+ static getSettingsPath() {
124
+ return this.legacySettingsPath;
125
+ }
126
+ /**
127
+ * Load settings from encrypted database
128
+ */
129
+ static loadSettings() {
130
+ if (this.cachedSettings) {
131
+ return this.cachedSettings;
132
+ }
133
+ let settings = { ...DEFAULT_SETTINGS };
134
+ try {
135
+ // Try to load from encrypted database
136
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
137
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
138
+ const stored = repository.load('search');
139
+ if (stored) {
140
+ settings = { ...DEFAULT_SETTINGS, ...stored };
141
+ }
142
+ }
143
+ }
144
+ catch (error) {
145
+ console.error('[SearchProviderFactory] Failed to load settings from database:', error);
146
+ }
147
+ // Auto-detect and select providers if primaryProvider is not set
148
+ if (!settings.primaryProvider) {
149
+ const configuredProviders = this.getConfiguredProvidersFromSettings(settings);
150
+ if (configuredProviders.length > 0) {
151
+ settings.primaryProvider = configuredProviders[0];
152
+ console.log(`[SearchProviderFactory] Auto-selected primary provider: ${configuredProviders[0]}`);
153
+ if (configuredProviders.length > 1 && !settings.fallbackProvider) {
154
+ settings.fallbackProvider = configuredProviders[1];
155
+ console.log(`[SearchProviderFactory] Auto-selected fallback provider: ${configuredProviders[1]}`);
156
+ }
157
+ }
158
+ }
159
+ this.cachedSettings = settings;
160
+ return settings;
161
+ }
162
+ /**
163
+ * Get list of configured provider types from settings only
164
+ * Note: Environment variables are no longer used for security reasons.
165
+ */
166
+ static getConfiguredProvidersFromSettings(settings) {
167
+ const configured = [];
168
+ // Check Tavily
169
+ if (settings.tavily?.apiKey) {
170
+ configured.push('tavily');
171
+ }
172
+ // Check Brave
173
+ if (settings.brave?.apiKey) {
174
+ configured.push('brave');
175
+ }
176
+ // Check SerpAPI
177
+ if (settings.serpapi?.apiKey) {
178
+ configured.push('serpapi');
179
+ }
180
+ // Check Google (requires both API key and Search Engine ID)
181
+ if (settings.google?.apiKey && settings.google?.searchEngineId) {
182
+ configured.push('google');
183
+ }
184
+ return configured;
185
+ }
186
+ /**
187
+ * Save settings to encrypted database
188
+ */
189
+ static saveSettings(settings) {
190
+ try {
191
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
192
+ throw new Error('SecureSettingsRepository not initialized');
193
+ }
194
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
195
+ // Load existing settings to preserve API keys that weren't changed
196
+ let existingSettings = { ...DEFAULT_SETTINGS };
197
+ const stored = repository.load('search');
198
+ if (stored) {
199
+ existingSettings = stored;
200
+ }
201
+ // Merge settings, preserving existing API keys if new ones aren't provided
202
+ const settingsToSave = {
203
+ primaryProvider: settings.primaryProvider,
204
+ fallbackProvider: settings.fallbackProvider,
205
+ tavily: settings.tavily?.apiKey
206
+ ? settings.tavily
207
+ : existingSettings.tavily,
208
+ brave: settings.brave?.apiKey
209
+ ? settings.brave
210
+ : existingSettings.brave,
211
+ serpapi: settings.serpapi?.apiKey
212
+ ? settings.serpapi
213
+ : existingSettings.serpapi,
214
+ google: settings.google?.apiKey || settings.google?.searchEngineId
215
+ ? { ...existingSettings.google, ...settings.google }
216
+ : existingSettings.google,
217
+ };
218
+ // Save to encrypted database
219
+ repository.save('search', settingsToSave);
220
+ this.cachedSettings = settingsToSave;
221
+ console.log('[SearchProviderFactory] Settings saved to encrypted database');
222
+ }
223
+ catch (error) {
224
+ console.error('[SearchProviderFactory] Failed to save settings:', error);
225
+ throw error;
226
+ }
227
+ }
228
+ /**
229
+ * Clear cached settings
230
+ */
231
+ static clearCache() {
232
+ this.cachedSettings = null;
233
+ }
234
+ /**
235
+ * Get the config for creating a provider
236
+ * Note: All credentials must be configured via the Settings UI.
237
+ */
238
+ static getProviderConfig(providerType) {
239
+ const settings = this.loadSettings();
240
+ return {
241
+ type: providerType,
242
+ tavilyApiKey: settings.tavily?.apiKey,
243
+ braveApiKey: settings.brave?.apiKey,
244
+ serpApiKey: settings.serpapi?.apiKey,
245
+ googleApiKey: settings.google?.apiKey,
246
+ googleSearchEngineId: settings.google?.searchEngineId,
247
+ };
248
+ }
249
+ /**
250
+ * Create a provider based on current settings or override
251
+ */
252
+ static createProvider(overrideType) {
253
+ const settings = this.loadSettings();
254
+ const providerType = overrideType || settings.primaryProvider;
255
+ if (!providerType) {
256
+ throw new Error('No search provider configured');
257
+ }
258
+ const config = this.getProviderConfig(providerType);
259
+ return this.createProviderFromConfig(config);
260
+ }
261
+ /**
262
+ * Create provider from explicit config
263
+ */
264
+ static createProviderFromConfig(config) {
265
+ switch (config.type) {
266
+ case 'tavily':
267
+ return new tavily_provider_1.TavilyProvider(config);
268
+ case 'brave':
269
+ return new brave_provider_1.BraveProvider(config);
270
+ case 'serpapi':
271
+ return new serpapi_provider_1.SerpApiProvider(config);
272
+ case 'google':
273
+ return new google_provider_1.GoogleProvider(config);
274
+ default:
275
+ throw new Error(`Unknown search provider type: ${config.type}`);
276
+ }
277
+ }
278
+ /**
279
+ * Execute a search with automatic fallback on failure
280
+ */
281
+ static async searchWithFallback(query) {
282
+ const settings = this.loadSettings();
283
+ const primaryType = query.provider || settings.primaryProvider;
284
+ if (!primaryType) {
285
+ throw new Error('No search provider configured');
286
+ }
287
+ // Try primary provider
288
+ try {
289
+ const primaryConfig = this.getProviderConfig(primaryType);
290
+ const primaryProvider = this.createProviderFromConfig(primaryConfig);
291
+ return await primaryProvider.search(query);
292
+ }
293
+ catch (primaryError) {
294
+ console.error(`Primary search provider (${primaryType}) failed:`, primaryError.message);
295
+ // If a specific provider was requested, don't fallback
296
+ if (query.provider) {
297
+ throw primaryError;
298
+ }
299
+ // Try fallback provider if configured
300
+ const fallbackType = settings.fallbackProvider;
301
+ if (fallbackType && fallbackType !== primaryType) {
302
+ console.log(`Attempting fallback to ${fallbackType}...`);
303
+ try {
304
+ const fallbackConfig = this.getProviderConfig(fallbackType);
305
+ const fallbackProvider = this.createProviderFromConfig(fallbackConfig);
306
+ const response = await fallbackProvider.search(query);
307
+ // Indicate this came from fallback
308
+ console.log(`Fallback search with ${fallbackType} succeeded`);
309
+ return response;
310
+ }
311
+ catch (fallbackError) {
312
+ console.error(`Fallback search provider (${fallbackType}) also failed:`, fallbackError.message);
313
+ // Throw the original error
314
+ throw new Error(`Primary provider (${primaryType}) failed: ${primaryError.message}. ` +
315
+ `Fallback provider (${fallbackType}) also failed: ${fallbackError.message}`);
316
+ }
317
+ }
318
+ throw primaryError;
319
+ }
320
+ }
321
+ /**
322
+ * Get available providers based on saved configuration
323
+ * Note: Environment variables are no longer checked for security reasons.
324
+ */
325
+ static getAvailableProviders() {
326
+ const settings = this.loadSettings();
327
+ return [
328
+ {
329
+ type: 'tavily',
330
+ name: types_1.SEARCH_PROVIDER_INFO.tavily.displayName,
331
+ description: types_1.SEARCH_PROVIDER_INFO.tavily.description,
332
+ configured: !!settings.tavily?.apiKey,
333
+ supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.tavily.supportedTypes],
334
+ },
335
+ {
336
+ type: 'brave',
337
+ name: types_1.SEARCH_PROVIDER_INFO.brave.displayName,
338
+ description: types_1.SEARCH_PROVIDER_INFO.brave.description,
339
+ configured: !!settings.brave?.apiKey,
340
+ supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.brave.supportedTypes],
341
+ },
342
+ {
343
+ type: 'serpapi',
344
+ name: types_1.SEARCH_PROVIDER_INFO.serpapi.displayName,
345
+ description: types_1.SEARCH_PROVIDER_INFO.serpapi.description,
346
+ configured: !!settings.serpapi?.apiKey,
347
+ supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.serpapi.supportedTypes],
348
+ },
349
+ {
350
+ type: 'google',
351
+ name: types_1.SEARCH_PROVIDER_INFO.google.displayName,
352
+ description: types_1.SEARCH_PROVIDER_INFO.google.description,
353
+ configured: !!(settings.google?.apiKey && settings.google?.searchEngineId),
354
+ supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.google.supportedTypes],
355
+ },
356
+ ];
357
+ }
358
+ /**
359
+ * Check if any search provider is configured
360
+ */
361
+ static isAnyProviderConfigured() {
362
+ return this.getAvailableProviders().some((p) => p.configured);
363
+ }
364
+ /**
365
+ * Get current configuration status
366
+ */
367
+ static getConfigStatus() {
368
+ const settings = this.loadSettings();
369
+ return {
370
+ primaryProvider: settings.primaryProvider,
371
+ fallbackProvider: settings.fallbackProvider,
372
+ providers: this.getAvailableProviders(),
373
+ isConfigured: this.isAnyProviderConfigured(),
374
+ };
375
+ }
376
+ /**
377
+ * Test a provider configuration
378
+ */
379
+ static async testProvider(providerType) {
380
+ try {
381
+ const config = this.getProviderConfig(providerType);
382
+ const provider = this.createProviderFromConfig(config);
383
+ return await provider.testConnection();
384
+ }
385
+ catch (error) {
386
+ return {
387
+ success: false,
388
+ error: error.message || 'Failed to create provider',
389
+ };
390
+ }
391
+ }
392
+ }
393
+ exports.SearchProviderFactory = SearchProviderFactory;
394
+ SearchProviderFactory.cachedSettings = null;
395
+ SearchProviderFactory.migrationCompleted = false;
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SerpApiProvider = void 0;
4
+ /**
5
+ * SerpAPI provider - aggregates multiple search engines
6
+ * https://serpapi.com/
7
+ */
8
+ class SerpApiProvider {
9
+ constructor(config) {
10
+ this.type = 'serpapi';
11
+ this.supportedSearchTypes = ['web', 'news', 'images'];
12
+ this.baseUrl = 'https://serpapi.com/search.json';
13
+ const apiKey = config.serpApiKey;
14
+ if (!apiKey) {
15
+ throw new Error('SerpAPI key is required. Configure it in Settings or get one from https://serpapi.com/');
16
+ }
17
+ this.apiKey = apiKey;
18
+ }
19
+ async search(query) {
20
+ const searchType = query.searchType || 'web';
21
+ if (!this.supportedSearchTypes.includes(searchType)) {
22
+ throw new Error(`SerpAPI does not support ${searchType} search`);
23
+ }
24
+ const params = new URLSearchParams({
25
+ api_key: this.apiKey,
26
+ q: query.query,
27
+ engine: 'google',
28
+ num: String(query.maxResults || 10),
29
+ ...(query.region && { gl: query.region }),
30
+ ...(query.language && { hl: query.language }),
31
+ ...(query.safeSearch !== undefined && {
32
+ safe: query.safeSearch ? 'active' : 'off',
33
+ }),
34
+ ...(searchType === 'images' && { tbm: 'isch' }),
35
+ ...(searchType === 'news' && { tbm: 'nws' }),
36
+ ...(query.dateRange && { tbs: this.mapDateRange(query.dateRange) }),
37
+ });
38
+ const response = await fetch(`${this.baseUrl}?${params}`);
39
+ if (!response.ok) {
40
+ const error = await response.text();
41
+ throw new Error(`SerpAPI error: ${response.status} - ${error}`);
42
+ }
43
+ const data = await response.json();
44
+ if (data.error) {
45
+ throw new Error(`SerpAPI error: ${data.error}`);
46
+ }
47
+ return {
48
+ results: this.mapResults(data, searchType),
49
+ query: query.query,
50
+ searchType,
51
+ totalResults: data.search_information?.total_results,
52
+ provider: 'serpapi',
53
+ };
54
+ }
55
+ async testConnection() {
56
+ try {
57
+ await this.search({ query: 'test', maxResults: 1 });
58
+ return { success: true };
59
+ }
60
+ catch (error) {
61
+ return {
62
+ success: false,
63
+ error: error.message || 'Failed to connect to SerpAPI',
64
+ };
65
+ }
66
+ }
67
+ mapDateRange(range) {
68
+ switch (range) {
69
+ case 'day':
70
+ return 'qdr:d';
71
+ case 'week':
72
+ return 'qdr:w';
73
+ case 'month':
74
+ return 'qdr:m';
75
+ case 'year':
76
+ return 'qdr:y';
77
+ default:
78
+ return 'qdr:w';
79
+ }
80
+ }
81
+ mapResults(data, searchType) {
82
+ if (searchType === 'images') {
83
+ return (data.images_results || []).map((r) => ({
84
+ title: r.title || '',
85
+ url: r.link || r.original || '',
86
+ snippet: r.snippet || '',
87
+ thumbnailUrl: r.thumbnail,
88
+ imageUrl: r.original,
89
+ width: r.original_width,
90
+ height: r.original_height,
91
+ source: r.source,
92
+ }));
93
+ }
94
+ if (searchType === 'news') {
95
+ return (data.news_results || []).map((r) => ({
96
+ title: r.title || '',
97
+ url: r.link || '',
98
+ snippet: r.snippet || '',
99
+ publishedDate: r.date,
100
+ source: r.source,
101
+ }));
102
+ }
103
+ // Web (organic) results
104
+ return (data.organic_results || []).map((r) => ({
105
+ title: r.title || '',
106
+ url: r.link || '',
107
+ snippet: r.snippet || '',
108
+ source: r.displayed_link,
109
+ }));
110
+ }
111
+ }
112
+ exports.SerpApiProvider = SerpApiProvider;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TavilyProvider = void 0;
4
+ /**
5
+ * Tavily Search API provider
6
+ * https://docs.tavily.com/
7
+ */
8
+ class TavilyProvider {
9
+ constructor(config) {
10
+ this.type = 'tavily';
11
+ this.supportedSearchTypes = ['web', 'news'];
12
+ this.baseUrl = 'https://api.tavily.com';
13
+ const apiKey = config.tavilyApiKey;
14
+ if (!apiKey) {
15
+ throw new Error('Tavily API key is required. Configure it in Settings or get one from https://tavily.com/');
16
+ }
17
+ this.apiKey = apiKey;
18
+ }
19
+ async search(query) {
20
+ const searchType = query.searchType || 'web';
21
+ if (!this.supportedSearchTypes.includes(searchType)) {
22
+ throw new Error(`Tavily does not support ${searchType} search. Supported: ${this.supportedSearchTypes.join(', ')}`);
23
+ }
24
+ const response = await fetch(`${this.baseUrl}/search`, {
25
+ method: 'POST',
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ },
29
+ body: JSON.stringify({
30
+ api_key: this.apiKey,
31
+ query: query.query,
32
+ search_depth: 'advanced',
33
+ max_results: query.maxResults || 10,
34
+ include_answer: false,
35
+ include_raw_content: false,
36
+ // Tavily-specific: topic for news
37
+ topic: searchType === 'news' ? 'news' : 'general',
38
+ // Date filter if specified
39
+ ...(query.dateRange && { days: this.dateRangeToDays(query.dateRange) }),
40
+ }),
41
+ });
42
+ if (!response.ok) {
43
+ const error = await response.text();
44
+ throw new Error(`Tavily API error: ${response.status} - ${error}`);
45
+ }
46
+ const data = await response.json();
47
+ return {
48
+ results: this.mapResults(data.results || []),
49
+ query: query.query,
50
+ searchType,
51
+ provider: 'tavily',
52
+ };
53
+ }
54
+ async testConnection() {
55
+ try {
56
+ await this.search({ query: 'test', maxResults: 1 });
57
+ return { success: true };
58
+ }
59
+ catch (error) {
60
+ return {
61
+ success: false,
62
+ error: error.message || 'Failed to connect to Tavily API',
63
+ };
64
+ }
65
+ }
66
+ mapResults(results) {
67
+ return results.map((r) => ({
68
+ title: r.title || '',
69
+ url: r.url || '',
70
+ snippet: r.content || r.snippet || '',
71
+ publishedDate: r.published_date,
72
+ source: r.source,
73
+ }));
74
+ }
75
+ dateRangeToDays(range) {
76
+ switch (range) {
77
+ case 'day':
78
+ return 1;
79
+ case 'week':
80
+ return 7;
81
+ case 'month':
82
+ return 30;
83
+ case 'year':
84
+ return 365;
85
+ default:
86
+ return 7;
87
+ }
88
+ }
89
+ }
90
+ exports.TavilyProvider = TavilyProvider;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Search Provider abstraction types
4
+ * Allows switching between Tavily, Brave Search, SerpAPI, and Google Custom Search
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SEARCH_PROVIDER_INFO = void 0;
8
+ /**
9
+ * Provider capabilities for UI display
10
+ */
11
+ exports.SEARCH_PROVIDER_INFO = {
12
+ tavily: {
13
+ displayName: 'Tavily',
14
+ description: 'AI-focused search API with structured results',
15
+ supportedTypes: ['web', 'news'],
16
+ envVar: 'TAVILY_API_KEY',
17
+ signupUrl: 'https://tavily.com/',
18
+ },
19
+ brave: {
20
+ displayName: 'Brave Search',
21
+ description: 'Privacy-focused web, news, and image search',
22
+ supportedTypes: ['web', 'news', 'images'],
23
+ envVar: 'BRAVE_API_KEY',
24
+ signupUrl: 'https://brave.com/search/api/',
25
+ },
26
+ serpapi: {
27
+ displayName: 'SerpAPI',
28
+ description: 'Aggregates Google, Bing, DuckDuckGo results',
29
+ supportedTypes: ['web', 'news', 'images'],
30
+ envVar: 'SERPAPI_KEY',
31
+ signupUrl: 'https://serpapi.com/',
32
+ },
33
+ google: {
34
+ displayName: 'Google Custom Search',
35
+ description: 'Official Google Search API',
36
+ supportedTypes: ['web', 'images'],
37
+ envVars: ['GOOGLE_API_KEY', 'GOOGLE_SEARCH_ENGINE_ID'],
38
+ signupUrl: 'https://developers.google.com/custom-search/v1/introduction',
39
+ },
40
+ };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Security Module
4
+ *
5
+ * Exports all security-related utilities for the agent system.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OutputFilter = exports.InputSanitizer = void 0;
9
+ var input_sanitizer_1 = require("./input-sanitizer");
10
+ Object.defineProperty(exports, "InputSanitizer", { enumerable: true, get: function () { return input_sanitizer_1.InputSanitizer; } });
11
+ var output_filter_1 = require("./output-filter");
12
+ Object.defineProperty(exports, "OutputFilter", { enumerable: true, get: function () { return output_filter_1.OutputFilter; } });