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,375 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeminiProvider = void 0;
4
+ const generative_ai_1 = require("@google/generative-ai");
5
+ /**
6
+ * Google AI Studio (Gemini) provider implementation
7
+ */
8
+ class GeminiProvider {
9
+ constructor(config) {
10
+ this.type = 'gemini';
11
+ // Track tool names and thought signatures for result mapping
12
+ this.toolIdToName = new Map();
13
+ this.toolIdToThoughtSignature = new Map();
14
+ const apiKey = config.geminiApiKey;
15
+ if (!apiKey) {
16
+ throw new Error('Gemini API key is required. Configure it in Settings or get one from https://aistudio.google.com/apikey');
17
+ }
18
+ this.client = new generative_ai_1.GoogleGenerativeAI(apiKey);
19
+ this.defaultModel = config.model || 'gemini-2.0-flash';
20
+ }
21
+ async createMessage(request) {
22
+ const model = this.client.getGenerativeModel({
23
+ model: request.model || this.defaultModel,
24
+ systemInstruction: request.system,
25
+ });
26
+ const contents = this.convertMessages(request.messages);
27
+ const tools = request.tools ? this.convertTools(request.tools) : undefined;
28
+ try {
29
+ console.log(`[Gemini] Calling API with model: ${request.model || this.defaultModel}`);
30
+ const result = await model.generateContent({
31
+ contents,
32
+ generationConfig: {
33
+ maxOutputTokens: request.maxTokens,
34
+ },
35
+ ...(tools && {
36
+ tools,
37
+ toolConfig: {
38
+ functionCallingConfig: {
39
+ mode: generative_ai_1.FunctionCallingMode.AUTO,
40
+ },
41
+ },
42
+ }),
43
+ },
44
+ // Pass abort signal to allow cancellation
45
+ request.signal ? { signal: request.signal } : undefined);
46
+ const response = result.response;
47
+ return this.convertResponse(response);
48
+ }
49
+ catch (error) {
50
+ // Handle abort errors gracefully
51
+ if (error.name === 'AbortError' || error.message?.includes('aborted')) {
52
+ console.log(`[Gemini] Request aborted`);
53
+ throw new Error('Request cancelled');
54
+ }
55
+ console.error(`[Gemini] API error:`, {
56
+ message: error.message,
57
+ status: error.status,
58
+ statusText: error.statusText,
59
+ });
60
+ throw error;
61
+ }
62
+ }
63
+ async testConnection() {
64
+ try {
65
+ const model = this.client.getGenerativeModel({ model: this.defaultModel });
66
+ await model.generateContent({
67
+ contents: [{ role: 'user', parts: [{ text: 'Hi' }] }],
68
+ generationConfig: { maxOutputTokens: 10 },
69
+ });
70
+ return { success: true };
71
+ }
72
+ catch (error) {
73
+ return {
74
+ success: false,
75
+ error: error.message || 'Failed to connect to Gemini API',
76
+ };
77
+ }
78
+ }
79
+ convertMessages(messages) {
80
+ return messages.map((msg) => {
81
+ const parts = [];
82
+ if (typeof msg.content === 'string') {
83
+ parts.push({ text: msg.content });
84
+ }
85
+ else {
86
+ // Handle array content (tool results or mixed content)
87
+ for (const item of msg.content) {
88
+ if (item.type === 'tool_result') {
89
+ // Gemini uses functionResponse for tool results
90
+ parts.push({
91
+ functionResponse: {
92
+ name: this.getToolNameFromId(item.tool_use_id),
93
+ response: {
94
+ result: item.content,
95
+ is_error: item.is_error || false,
96
+ },
97
+ },
98
+ });
99
+ }
100
+ else if (item.type === 'tool_use') {
101
+ // Gemini uses functionCall for tool invocations
102
+ const thoughtSignature = this.getThoughtSignatureFromId(item.id);
103
+ const functionCallPart = {
104
+ functionCall: {
105
+ name: item.name,
106
+ args: item.input,
107
+ },
108
+ };
109
+ // Include thought signature if present (required for Gemini 3 models)
110
+ if (thoughtSignature) {
111
+ functionCallPart.thoughtSignature = thoughtSignature;
112
+ }
113
+ parts.push(functionCallPart);
114
+ }
115
+ else if (item.type === 'text') {
116
+ parts.push({ text: item.text });
117
+ }
118
+ }
119
+ }
120
+ return {
121
+ role: msg.role === 'assistant' ? 'model' : 'user',
122
+ parts,
123
+ };
124
+ });
125
+ }
126
+ getToolNameFromId(toolUseId) {
127
+ return this.toolIdToName.get(toolUseId) || toolUseId;
128
+ }
129
+ getThoughtSignatureFromId(toolUseId) {
130
+ return this.toolIdToThoughtSignature.get(toolUseId);
131
+ }
132
+ /**
133
+ * Recursively sanitize schema for Gemini API compatibility.
134
+ * Gemini requires all nested objects/arrays to have explicit 'type' fields.
135
+ */
136
+ sanitizeSchemaForGemini(schema) {
137
+ if (!schema || typeof schema !== 'object') {
138
+ return schema;
139
+ }
140
+ const result = { ...schema };
141
+ // Ensure type field exists
142
+ if (!result.type) {
143
+ if (result.properties) {
144
+ result.type = generative_ai_1.SchemaType.OBJECT;
145
+ }
146
+ else if (result.items) {
147
+ result.type = generative_ai_1.SchemaType.ARRAY;
148
+ }
149
+ else if (typeof result.enum !== 'undefined') {
150
+ result.type = generative_ai_1.SchemaType.STRING;
151
+ }
152
+ }
153
+ // Convert string type names to SchemaType enum values
154
+ if (typeof result.type === 'string') {
155
+ const typeMap = {
156
+ 'string': generative_ai_1.SchemaType.STRING,
157
+ 'number': generative_ai_1.SchemaType.NUMBER,
158
+ 'integer': generative_ai_1.SchemaType.INTEGER,
159
+ 'boolean': generative_ai_1.SchemaType.BOOLEAN,
160
+ 'array': generative_ai_1.SchemaType.ARRAY,
161
+ 'object': generative_ai_1.SchemaType.OBJECT,
162
+ };
163
+ result.type = typeMap[result.type.toLowerCase()] || result.type;
164
+ }
165
+ // Recursively process properties
166
+ if (result.properties) {
167
+ const sanitizedProperties = {};
168
+ for (const [key, value] of Object.entries(result.properties)) {
169
+ sanitizedProperties[key] = this.sanitizeSchemaForGemini(value);
170
+ }
171
+ result.properties = sanitizedProperties;
172
+ }
173
+ // Handle array types - ensure items exists and has a type
174
+ if (result.type === generative_ai_1.SchemaType.ARRAY || result.type === 'array') {
175
+ if (!result.items) {
176
+ // Add default items if missing for array type
177
+ result.items = { type: generative_ai_1.SchemaType.STRING };
178
+ }
179
+ else {
180
+ result.items = this.sanitizeSchemaForGemini(result.items);
181
+ // Ensure items has a type
182
+ if (!result.items.type) {
183
+ result.items.type = generative_ai_1.SchemaType.STRING;
184
+ }
185
+ }
186
+ }
187
+ return result;
188
+ }
189
+ convertTools(tools) {
190
+ const functionDeclarations = tools.map((tool) => {
191
+ // Sanitize the entire parameters schema for Gemini compatibility
192
+ const sanitizedProperties = {};
193
+ if (tool.input_schema.properties) {
194
+ for (const [key, value] of Object.entries(tool.input_schema.properties)) {
195
+ sanitizedProperties[key] = this.sanitizeSchemaForGemini(value);
196
+ }
197
+ }
198
+ return {
199
+ name: tool.name,
200
+ description: tool.description,
201
+ parameters: {
202
+ type: generative_ai_1.SchemaType.OBJECT,
203
+ properties: sanitizedProperties,
204
+ required: tool.input_schema.required || [],
205
+ },
206
+ };
207
+ });
208
+ return [{ functionDeclarations }];
209
+ }
210
+ convertResponse(response) {
211
+ const content = [];
212
+ const candidate = response.candidates?.[0];
213
+ if (!candidate) {
214
+ return {
215
+ content: [{ type: 'text', text: '' }],
216
+ stopReason: 'end_turn',
217
+ };
218
+ }
219
+ for (const part of candidate.content?.parts || []) {
220
+ if (part.text) {
221
+ content.push({
222
+ type: 'text',
223
+ text: part.text,
224
+ });
225
+ }
226
+ else if (part.functionCall) {
227
+ const toolUseId = `gemini_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
228
+ this.toolIdToName.set(toolUseId, part.functionCall.name);
229
+ // Capture thought signature if present (required for Gemini 3 models)
230
+ if (part.thoughtSignature) {
231
+ this.toolIdToThoughtSignature.set(toolUseId, part.thoughtSignature);
232
+ }
233
+ content.push({
234
+ type: 'tool_use',
235
+ id: toolUseId,
236
+ name: part.functionCall.name,
237
+ input: part.functionCall.args || {},
238
+ });
239
+ }
240
+ }
241
+ // If no content was parsed, return empty text
242
+ if (content.length === 0) {
243
+ content.push({ type: 'text', text: '' });
244
+ }
245
+ return {
246
+ content,
247
+ stopReason: this.mapStopReason(candidate.finishReason),
248
+ usage: response.usageMetadata
249
+ ? {
250
+ inputTokens: response.usageMetadata.promptTokenCount || 0,
251
+ outputTokens: response.usageMetadata.candidatesTokenCount || 0,
252
+ }
253
+ : undefined,
254
+ };
255
+ }
256
+ mapStopReason(finishReason) {
257
+ switch (finishReason) {
258
+ case 'STOP':
259
+ return 'end_turn';
260
+ case 'MAX_TOKENS':
261
+ return 'max_tokens';
262
+ case 'SAFETY':
263
+ case 'RECITATION':
264
+ case 'OTHER':
265
+ return 'stop_sequence';
266
+ default:
267
+ // Check if we have function calls (tool use)
268
+ return 'end_turn';
269
+ }
270
+ }
271
+ /**
272
+ * Fetch available models from Gemini API
273
+ */
274
+ async getAvailableModels() {
275
+ try {
276
+ // Use the REST API to list models since the SDK doesn't expose listModels well
277
+ const apiKey = this.client.apiKey;
278
+ const maskedKey = apiKey ? `${apiKey.substring(0, 8)}...${apiKey.substring(apiKey.length - 4)}` : 'undefined';
279
+ console.log(`[Gemini] Fetching models with API key: ${maskedKey}`);
280
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`);
281
+ if (!response.ok) {
282
+ const errorBody = await response.text();
283
+ console.error(`[Gemini] Failed to fetch models - Status: ${response.status} ${response.statusText}`);
284
+ console.error(`[Gemini] Error response body:`, errorBody);
285
+ return this.getDefaultModels();
286
+ }
287
+ const data = await response.json();
288
+ // Patterns to exclude non-text models
289
+ const excludePatterns = [
290
+ /imagen/i, // Image generation models
291
+ /embedding/i, // Embedding models
292
+ /aqa/i, // Attributed question answering
293
+ /vision/i, // Vision-only models
294
+ /audio/i, // Audio models
295
+ /speech/i, // Speech models
296
+ /tts/i, // Text-to-speech models
297
+ /robot/i, // Robotics models
298
+ /learnlm/i, // Learning models
299
+ /thinking/i, // Experimental thinking models
300
+ /native-audio/i, // Native audio models
301
+ /live/i, // Live/streaming models (not for text generation)
302
+ /nano/i, // Nano models (on-device/specialized)
303
+ /banana/i, // Image generation models (nano banana)
304
+ /veo/i, // Video generation models
305
+ /diffusion/i, // Diffusion models (image generation)
306
+ ];
307
+ const isTextModel = (modelName) => {
308
+ const name = modelName.toLowerCase();
309
+ // Must be a gemini model
310
+ if (!name.includes('gemini'))
311
+ return false;
312
+ // Exclude non-text models
313
+ for (const pattern of excludePatterns) {
314
+ if (pattern.test(name))
315
+ return false;
316
+ }
317
+ // Must be a pro, flash, ultra, or nano variant (text models)
318
+ return name.includes('pro') || name.includes('flash') || name.includes('ultra');
319
+ };
320
+ const models = (data.models || [])
321
+ .filter((model) => model.supportedGenerationMethods?.includes('generateContent') &&
322
+ isTextModel(model.name || ''))
323
+ .map((model) => ({
324
+ name: model.name?.replace('models/', '') || '',
325
+ displayName: model.displayName || model.name?.replace('models/', '') || '',
326
+ description: model.description || '',
327
+ }))
328
+ .filter((model) => model.name);
329
+ // Sort models: newer versions first, pro before flash
330
+ // Dynamically extract version numbers (e.g., "3.0", "2.5", "2.0", "1.5")
331
+ const sortedModels = models.sort((a, b) => {
332
+ const extractVersion = (name) => {
333
+ // Match patterns like "gemini-3.0", "gemini-2.5", "gemini-1.5-pro"
334
+ const versionMatch = name.match(/gemini-?(\d+\.?\d*)/i);
335
+ if (versionMatch) {
336
+ return parseFloat(versionMatch[1]);
337
+ }
338
+ return 0;
339
+ };
340
+ const getTypeScore = (name) => {
341
+ if (name.includes('pro'))
342
+ return 0.03;
343
+ if (name.includes('flash-lite') || name.includes('lite'))
344
+ return 0.01;
345
+ if (name.includes('flash'))
346
+ return 0.02;
347
+ return 0;
348
+ };
349
+ // Combine version (major sort) + type (minor sort)
350
+ const scoreA = extractVersion(a.name) + getTypeScore(a.name);
351
+ const scoreB = extractVersion(b.name) + getTypeScore(b.name);
352
+ return scoreB - scoreA;
353
+ });
354
+ return sortedModels.length > 0 ? sortedModels : this.getDefaultModels();
355
+ }
356
+ catch (error) {
357
+ console.error('Failed to fetch Gemini models:', error);
358
+ return this.getDefaultModels();
359
+ }
360
+ }
361
+ /**
362
+ * Get default models when API call fails
363
+ */
364
+ getDefaultModels() {
365
+ return [
366
+ { name: 'gemini-2.5-pro-preview-05-06', displayName: 'Gemini 2.5 Pro', description: 'Most capable model for complex tasks' },
367
+ { name: 'gemini-2.5-flash-preview-05-20', displayName: 'Gemini 2.5 Flash', description: 'Fast and efficient for most tasks' },
368
+ { name: 'gemini-2.0-flash', displayName: 'Gemini 2.0 Flash', description: 'Balanced speed and capability' },
369
+ { name: 'gemini-2.0-flash-lite', displayName: 'Gemini 2.0 Flash Lite', description: 'Fastest and most cost-effective' },
370
+ { name: 'gemini-1.5-pro', displayName: 'Gemini 1.5 Pro', description: 'Previous generation pro model' },
371
+ { name: 'gemini-1.5-flash', displayName: 'Gemini 1.5 Flash', description: 'Previous generation flash model' },
372
+ ];
373
+ }
374
+ }
375
+ exports.GeminiProvider = GeminiProvider;
@@ -0,0 +1,34 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.LLMProviderFactory = exports.OpenAIOAuth = exports.OpenAIProvider = exports.OpenRouterProvider = exports.GeminiProvider = exports.OllamaProvider = exports.BedrockProvider = exports.AnthropicProvider = void 0;
18
+ __exportStar(require("./types"), exports);
19
+ var anthropic_provider_1 = require("./anthropic-provider");
20
+ Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return anthropic_provider_1.AnthropicProvider; } });
21
+ var bedrock_provider_1 = require("./bedrock-provider");
22
+ Object.defineProperty(exports, "BedrockProvider", { enumerable: true, get: function () { return bedrock_provider_1.BedrockProvider; } });
23
+ var ollama_provider_1 = require("./ollama-provider");
24
+ Object.defineProperty(exports, "OllamaProvider", { enumerable: true, get: function () { return ollama_provider_1.OllamaProvider; } });
25
+ var gemini_provider_1 = require("./gemini-provider");
26
+ Object.defineProperty(exports, "GeminiProvider", { enumerable: true, get: function () { return gemini_provider_1.GeminiProvider; } });
27
+ var openrouter_provider_1 = require("./openrouter-provider");
28
+ Object.defineProperty(exports, "OpenRouterProvider", { enumerable: true, get: function () { return openrouter_provider_1.OpenRouterProvider; } });
29
+ var openai_provider_1 = require("./openai-provider");
30
+ Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_provider_1.OpenAIProvider; } });
31
+ var openai_oauth_1 = require("./openai-oauth");
32
+ Object.defineProperty(exports, "OpenAIOAuth", { enumerable: true, get: function () { return openai_oauth_1.OpenAIOAuth; } });
33
+ var provider_factory_1 = require("./provider-factory");
34
+ Object.defineProperty(exports, "LLMProviderFactory", { enumerable: true, get: function () { return provider_factory_1.LLMProviderFactory; } });
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OllamaProvider = void 0;
4
+ /**
5
+ * Ollama API provider implementation
6
+ * Supports local and remote Ollama servers
7
+ * https://ollama.ai/
8
+ */
9
+ class OllamaProvider {
10
+ constructor(config) {
11
+ this.type = 'ollama';
12
+ this.baseUrl = config.ollamaBaseUrl || 'http://localhost:11434';
13
+ this.apiKey = config.ollamaApiKey;
14
+ // Remove trailing slash if present
15
+ if (this.baseUrl.endsWith('/')) {
16
+ this.baseUrl = this.baseUrl.slice(0, -1);
17
+ }
18
+ }
19
+ async createMessage(request) {
20
+ const messages = this.convertMessages(request.messages, request.system);
21
+ const tools = request.tools ? this.convertTools(request.tools) : undefined;
22
+ const headers = {
23
+ 'Content-Type': 'application/json',
24
+ };
25
+ if (this.apiKey) {
26
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
27
+ }
28
+ // Use AbortController for timeout (5 minutes for large models)
29
+ const timeoutController = new AbortController();
30
+ const timeoutId = setTimeout(() => timeoutController.abort(), 5 * 60 * 1000);
31
+ // Track if abort came from external signal (cancellation) vs timeout
32
+ let abortedByExternalSignal = false;
33
+ // If external signal provided, abort our controller when it fires
34
+ if (request.signal) {
35
+ request.signal.addEventListener('abort', () => {
36
+ abortedByExternalSignal = true;
37
+ timeoutController.abort();
38
+ });
39
+ // Check if already aborted
40
+ if (request.signal.aborted) {
41
+ abortedByExternalSignal = true;
42
+ timeoutController.abort();
43
+ }
44
+ }
45
+ try {
46
+ console.log(`[Ollama] Sending request to model: ${request.model}`);
47
+ const startTime = Date.now();
48
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
49
+ method: 'POST',
50
+ headers,
51
+ signal: timeoutController.signal,
52
+ body: JSON.stringify({
53
+ model: request.model,
54
+ messages,
55
+ stream: false,
56
+ options: {
57
+ num_predict: request.maxTokens,
58
+ },
59
+ ...(tools && tools.length > 0 && { tools }),
60
+ }),
61
+ });
62
+ clearTimeout(timeoutId);
63
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
64
+ console.log(`[Ollama] Response received in ${elapsed}s`);
65
+ if (!response.ok) {
66
+ const error = await response.text();
67
+ throw new Error(`Ollama API error: ${response.status} - ${error}`);
68
+ }
69
+ const data = await response.json();
70
+ return this.convertResponse(data);
71
+ }
72
+ catch (error) {
73
+ clearTimeout(timeoutId);
74
+ console.error(`[Ollama] API error:`, {
75
+ name: error.name,
76
+ message: error.message,
77
+ code: error.code,
78
+ });
79
+ if (error.name === 'AbortError') {
80
+ if (abortedByExternalSignal) {
81
+ console.log(`[Ollama] Request aborted by user`);
82
+ throw new Error('Request cancelled');
83
+ }
84
+ throw new Error('Ollama request timed out after 5 minutes. The model may be too slow or not responding.');
85
+ }
86
+ throw error;
87
+ }
88
+ }
89
+ async testConnection() {
90
+ try {
91
+ const headers = {};
92
+ if (this.apiKey) {
93
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
94
+ }
95
+ // First check if Ollama is running
96
+ const response = await fetch(`${this.baseUrl}/api/tags`, { headers });
97
+ if (!response.ok) {
98
+ throw new Error(`Failed to connect to Ollama: ${response.status}`);
99
+ }
100
+ const data = await response.json();
101
+ if (!data.models || data.models.length === 0) {
102
+ return {
103
+ success: false,
104
+ error: 'No models available. Run "ollama pull <model>" to download a model.',
105
+ };
106
+ }
107
+ return { success: true };
108
+ }
109
+ catch (error) {
110
+ return {
111
+ success: false,
112
+ error: error.message || 'Failed to connect to Ollama server',
113
+ };
114
+ }
115
+ }
116
+ /**
117
+ * Fetch available models from Ollama server
118
+ */
119
+ async getAvailableModels() {
120
+ try {
121
+ const headers = {};
122
+ if (this.apiKey) {
123
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
124
+ }
125
+ const response = await fetch(`${this.baseUrl}/api/tags`, { headers });
126
+ if (!response.ok) {
127
+ throw new Error(`Failed to fetch models: ${response.status}`);
128
+ }
129
+ const data = await response.json();
130
+ return (data.models || []).map(m => ({
131
+ name: m.name,
132
+ size: m.size,
133
+ modified: m.modified_at,
134
+ }));
135
+ }
136
+ catch (error) {
137
+ console.error('Failed to fetch Ollama models:', error);
138
+ return [];
139
+ }
140
+ }
141
+ convertMessages(messages, systemPrompt) {
142
+ const ollamaMessages = [];
143
+ // Add system message first
144
+ if (systemPrompt) {
145
+ ollamaMessages.push({
146
+ role: 'system',
147
+ content: systemPrompt,
148
+ });
149
+ }
150
+ for (const msg of messages) {
151
+ if (typeof msg.content === 'string') {
152
+ ollamaMessages.push({
153
+ role: msg.role === 'user' ? 'user' : 'assistant',
154
+ content: msg.content,
155
+ });
156
+ }
157
+ else {
158
+ // Handle array content (tool results or mixed content)
159
+ const textParts = [];
160
+ const toolCalls = [];
161
+ for (const item of msg.content) {
162
+ if (item.type === 'text') {
163
+ textParts.push(item.text);
164
+ }
165
+ else if (item.type === 'tool_use') {
166
+ toolCalls.push({
167
+ function: {
168
+ name: item.name,
169
+ arguments: item.input,
170
+ },
171
+ });
172
+ }
173
+ else if (item.type === 'tool_result') {
174
+ // Tool results in Ollama format
175
+ ollamaMessages.push({
176
+ role: 'tool',
177
+ content: item.content,
178
+ });
179
+ }
180
+ }
181
+ if (textParts.length > 0 || toolCalls.length > 0) {
182
+ ollamaMessages.push({
183
+ role: msg.role === 'user' ? 'user' : 'assistant',
184
+ content: textParts.join('\n') || '',
185
+ ...(toolCalls.length > 0 && { tool_calls: toolCalls }),
186
+ });
187
+ }
188
+ }
189
+ }
190
+ return ollamaMessages;
191
+ }
192
+ convertTools(tools) {
193
+ return tools.map(tool => ({
194
+ type: 'function',
195
+ function: {
196
+ name: tool.name,
197
+ description: tool.description,
198
+ parameters: tool.input_schema,
199
+ },
200
+ }));
201
+ }
202
+ convertResponse(response) {
203
+ const content = [];
204
+ const message = response.message;
205
+ // Handle missing message
206
+ if (!message) {
207
+ console.error('Ollama response missing message:', response);
208
+ return {
209
+ content: [{ type: 'text', text: 'Error: Ollama returned an empty response' }],
210
+ stopReason: 'end_turn',
211
+ usage: { inputTokens: 0, outputTokens: 0 },
212
+ };
213
+ }
214
+ // Handle text content
215
+ if (message.content) {
216
+ content.push({
217
+ type: 'text',
218
+ text: message.content,
219
+ });
220
+ }
221
+ // Handle tool calls
222
+ if (message.tool_calls && message.tool_calls.length > 0) {
223
+ for (const toolCall of message.tool_calls) {
224
+ let args;
225
+ try {
226
+ args = typeof toolCall.function.arguments === 'string'
227
+ ? JSON.parse(toolCall.function.arguments)
228
+ : toolCall.function.arguments || {};
229
+ }
230
+ catch (e) {
231
+ console.error('Failed to parse tool arguments:', toolCall.function.arguments);
232
+ args = {};
233
+ }
234
+ content.push({
235
+ type: 'tool_use',
236
+ id: `tool_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
237
+ name: toolCall.function.name,
238
+ input: args,
239
+ });
240
+ }
241
+ }
242
+ // Determine stop reason
243
+ let stopReason = 'end_turn';
244
+ if (message.tool_calls && message.tool_calls.length > 0) {
245
+ stopReason = 'tool_use';
246
+ }
247
+ else if (response.done_reason === 'length') {
248
+ stopReason = 'max_tokens';
249
+ }
250
+ else if (response.done_reason === 'stop') {
251
+ stopReason = 'stop_sequence';
252
+ }
253
+ return {
254
+ content,
255
+ stopReason,
256
+ usage: {
257
+ inputTokens: response.prompt_eval_count || 0,
258
+ outputTokens: response.eval_count || 0,
259
+ },
260
+ };
261
+ }
262
+ }
263
+ exports.OllamaProvider = OllamaProvider;