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,880 @@
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.LLMProviderFactory = void 0;
37
+ const electron_1 = require("electron");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const pi_ai_1 = require("@mariozechner/pi-ai");
41
+ const types_1 = require("./types");
42
+ const anthropic_provider_1 = require("./anthropic-provider");
43
+ const bedrock_provider_1 = require("./bedrock-provider");
44
+ const ollama_provider_1 = require("./ollama-provider");
45
+ const gemini_provider_1 = require("./gemini-provider");
46
+ const openrouter_provider_1 = require("./openrouter-provider");
47
+ const openai_provider_1 = require("./openai-provider");
48
+ const SecureSettingsRepository_1 = require("../../database/SecureSettingsRepository");
49
+ const LEGACY_SETTINGS_FILE = 'llm-settings.json';
50
+ const MASKED_VALUE = '***configured***';
51
+ const ENCRYPTED_PREFIX = 'encrypted:';
52
+ // ============ Legacy Encryption Functions (for migration only) ============
53
+ // These functions are only used to decrypt settings from legacy JSON files
54
+ // during migration to the encrypted database. New settings use full-object
55
+ // encryption via SecureSettingsRepository.
56
+ /**
57
+ * @deprecated Used only for migration from legacy JSON files
58
+ * Encrypt a secret using OS keychain via safeStorage
59
+ */
60
+ function encryptSecret(value) {
61
+ if (!value || !value.trim())
62
+ return undefined;
63
+ const trimmed = value.trim();
64
+ if (trimmed === MASKED_VALUE)
65
+ return undefined;
66
+ try {
67
+ if (electron_1.safeStorage.isEncryptionAvailable()) {
68
+ const encrypted = electron_1.safeStorage.encryptString(trimmed);
69
+ return ENCRYPTED_PREFIX + encrypted.toString('base64');
70
+ }
71
+ }
72
+ catch (error) {
73
+ console.warn('Failed to encrypt secret, storing masked:', error);
74
+ }
75
+ // Fallback to masked value if encryption fails
76
+ return MASKED_VALUE;
77
+ }
78
+ /**
79
+ * @deprecated Used only for migration from legacy JSON files
80
+ * Decrypt a secret that was encrypted with safeStorage
81
+ */
82
+ function decryptSecret(value) {
83
+ if (!value)
84
+ return undefined;
85
+ if (value === MASKED_VALUE)
86
+ return undefined;
87
+ if (value.startsWith(ENCRYPTED_PREFIX)) {
88
+ try {
89
+ const isAvailable = electron_1.safeStorage.isEncryptionAvailable();
90
+ if (isAvailable) {
91
+ const encrypted = Buffer.from(value.slice(ENCRYPTED_PREFIX.length), 'base64');
92
+ const decrypted = electron_1.safeStorage.decryptString(encrypted);
93
+ return decrypted;
94
+ }
95
+ else {
96
+ console.error('[LLM Settings] safeStorage encryption not available - cannot decrypt secrets');
97
+ console.error('[LLM Settings] You may need to re-enter your API credentials in Settings');
98
+ }
99
+ }
100
+ catch (error) {
101
+ // This can happen after app updates when the code signature changes
102
+ // The macOS Keychain ties encryption to the app's signature
103
+ console.error('[LLM Settings] Failed to decrypt secret - this can happen after app updates');
104
+ console.error('[LLM Settings] Error:', error.message || error);
105
+ console.error('[LLM Settings] Please re-enter your API credentials in Settings');
106
+ }
107
+ }
108
+ // If not encrypted and not masked, return as-is (for backwards compatibility)
109
+ if (value !== MASKED_VALUE && !value.startsWith(ENCRYPTED_PREFIX)) {
110
+ return value.trim() || undefined;
111
+ }
112
+ return undefined;
113
+ }
114
+ /**
115
+ * Normalize a secret value, filtering out masked/encrypted values
116
+ */
117
+ function normalizeSecret(value) {
118
+ if (!value)
119
+ return undefined;
120
+ const trimmed = value.trim();
121
+ if (!trimmed || trimmed === MASKED_VALUE || trimmed.startsWith(ENCRYPTED_PREFIX))
122
+ return undefined;
123
+ return trimmed;
124
+ }
125
+ /**
126
+ * @deprecated Used only for migration from legacy JSON files
127
+ * Decrypt all secrets in legacy settings
128
+ */
129
+ function sanitizeSettings(settings) {
130
+ const sanitized = { ...settings };
131
+ // Decrypt secrets when loading from disk
132
+ if (sanitized.anthropic) {
133
+ sanitized.anthropic = {
134
+ ...sanitized.anthropic,
135
+ apiKey: decryptSecret(sanitized.anthropic.apiKey),
136
+ };
137
+ }
138
+ if (sanitized.bedrock) {
139
+ sanitized.bedrock = {
140
+ ...sanitized.bedrock,
141
+ secretAccessKey: decryptSecret(sanitized.bedrock.secretAccessKey),
142
+ };
143
+ }
144
+ if (sanitized.ollama) {
145
+ sanitized.ollama = {
146
+ ...sanitized.ollama,
147
+ apiKey: decryptSecret(sanitized.ollama.apiKey),
148
+ };
149
+ }
150
+ if (sanitized.gemini) {
151
+ sanitized.gemini = {
152
+ ...sanitized.gemini,
153
+ apiKey: decryptSecret(sanitized.gemini.apiKey),
154
+ };
155
+ }
156
+ if (sanitized.openrouter) {
157
+ sanitized.openrouter = {
158
+ ...sanitized.openrouter,
159
+ apiKey: decryptSecret(sanitized.openrouter.apiKey),
160
+ };
161
+ }
162
+ if (sanitized.openai) {
163
+ const decryptedAccessToken = decryptSecret(sanitized.openai.accessToken);
164
+ const decryptedRefreshToken = decryptSecret(sanitized.openai.refreshToken);
165
+ // Log OAuth token status for debugging
166
+ if (sanitized.openai.authMethod === 'oauth') {
167
+ console.log('[LLM Settings] Loading OpenAI OAuth settings:');
168
+ console.log('[LLM Settings] authMethod:', sanitized.openai.authMethod);
169
+ console.log('[LLM Settings] hasAccessToken:', !!sanitized.openai.accessToken);
170
+ console.log('[LLM Settings] decryptedAccessToken:', !!decryptedAccessToken);
171
+ console.log('[LLM Settings] hasRefreshToken:', !!sanitized.openai.refreshToken);
172
+ console.log('[LLM Settings] decryptedRefreshToken:', !!decryptedRefreshToken);
173
+ }
174
+ sanitized.openai = {
175
+ ...sanitized.openai,
176
+ apiKey: decryptSecret(sanitized.openai.apiKey),
177
+ accessToken: decryptedAccessToken,
178
+ refreshToken: decryptedRefreshToken,
179
+ };
180
+ }
181
+ return sanitized;
182
+ }
183
+ const DEFAULT_SETTINGS = {
184
+ providerType: 'anthropic',
185
+ modelKey: types_1.DEFAULT_MODEL,
186
+ };
187
+ /**
188
+ * Factory for creating LLM providers
189
+ */
190
+ class LLMProviderFactory {
191
+ /**
192
+ * Initialize the factory
193
+ */
194
+ static initialize() {
195
+ const userDataPath = electron_1.app.getPath('userData');
196
+ this.legacySettingsPath = path.join(userDataPath, LEGACY_SETTINGS_FILE);
197
+ // Migrate from legacy JSON file to encrypted database
198
+ this.migrateFromLegacyFile();
199
+ }
200
+ /**
201
+ * Migrate settings from legacy JSON file to encrypted database
202
+ */
203
+ static migrateFromLegacyFile() {
204
+ if (this.migrationCompleted)
205
+ return;
206
+ try {
207
+ // Check if SecureSettingsRepository is initialized
208
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
209
+ console.log('[LLMProviderFactory] SecureSettingsRepository not yet initialized, skipping migration');
210
+ return;
211
+ }
212
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
213
+ // Check if already migrated to database
214
+ if (repository.exists('llm')) {
215
+ this.migrationCompleted = true;
216
+ return;
217
+ }
218
+ // Check if legacy file exists
219
+ if (!fs.existsSync(this.legacySettingsPath)) {
220
+ console.log('[LLMProviderFactory] No legacy settings file found');
221
+ this.migrationCompleted = true;
222
+ return;
223
+ }
224
+ console.log('[LLMProviderFactory] Migrating settings from legacy JSON file to encrypted database...');
225
+ // Create backup before migration
226
+ const backupPath = this.legacySettingsPath + '.migration-backup';
227
+ fs.copyFileSync(this.legacySettingsPath, backupPath);
228
+ try {
229
+ // Read and decrypt legacy settings
230
+ const data = fs.readFileSync(this.legacySettingsPath, 'utf-8');
231
+ const legacySettings = { ...DEFAULT_SETTINGS, ...JSON.parse(data) };
232
+ const decryptedSettings = sanitizeSettings(legacySettings);
233
+ // Save to encrypted database
234
+ repository.save('llm', decryptedSettings);
235
+ console.log('[LLMProviderFactory] Settings migrated to encrypted database');
236
+ // Migration successful - delete backup and original
237
+ fs.unlinkSync(backupPath);
238
+ fs.unlinkSync(this.legacySettingsPath);
239
+ console.log('[LLMProviderFactory] Migration complete, cleaned up legacy files');
240
+ this.migrationCompleted = true;
241
+ }
242
+ catch (migrationError) {
243
+ console.error('[LLMProviderFactory] Migration failed, backup preserved at:', backupPath);
244
+ throw migrationError;
245
+ }
246
+ }
247
+ catch (error) {
248
+ console.error('[LLMProviderFactory] Migration failed:', error);
249
+ }
250
+ }
251
+ /**
252
+ * Get the path to legacy settings file (for testing)
253
+ */
254
+ static getSettingsPath() {
255
+ return this.legacySettingsPath;
256
+ }
257
+ /**
258
+ * Load settings from encrypted database
259
+ */
260
+ static loadSettings() {
261
+ if (this.cachedSettings) {
262
+ return this.cachedSettings;
263
+ }
264
+ let settings = { ...DEFAULT_SETTINGS };
265
+ let settingsExist = false;
266
+ try {
267
+ // Try to load from encrypted database
268
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
269
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
270
+ const stored = repository.load('llm');
271
+ if (stored) {
272
+ settings = { ...DEFAULT_SETTINGS, ...stored };
273
+ settingsExist = true;
274
+ }
275
+ }
276
+ }
277
+ catch (error) {
278
+ console.error('[LLMProviderFactory] Failed to load settings from database:', error);
279
+ }
280
+ // Auto-detect provider if no settings exist
281
+ if (!settingsExist) {
282
+ const detectedProvider = this.detectProviderFromSettings(settings);
283
+ if (detectedProvider) {
284
+ settings.providerType = detectedProvider;
285
+ console.log(`[LLMProviderFactory] Auto-detected LLM provider: ${detectedProvider}`);
286
+ }
287
+ }
288
+ this.cachedSettings = settings;
289
+ return settings;
290
+ }
291
+ /**
292
+ * Detect which provider to use based on saved settings
293
+ * Note: Environment variables are no longer used for security reasons.
294
+ * All configuration should be done through the Settings UI.
295
+ */
296
+ static detectProviderFromSettings(settings) {
297
+ // Check if any provider has credentials configured in settings
298
+ if (settings.anthropic?.apiKey) {
299
+ return 'anthropic';
300
+ }
301
+ if (settings.gemini?.apiKey) {
302
+ return 'gemini';
303
+ }
304
+ if (settings.openrouter?.apiKey) {
305
+ return 'openrouter';
306
+ }
307
+ if (settings.openai?.apiKey || settings.openai?.accessToken) {
308
+ return 'openai';
309
+ }
310
+ if (settings.bedrock?.accessKeyId || settings.bedrock?.profile) {
311
+ return 'bedrock';
312
+ }
313
+ if (settings.ollama?.baseUrl || settings.ollama?.model) {
314
+ return 'ollama';
315
+ }
316
+ // No valid credentials detected - user needs to configure via Settings
317
+ return null;
318
+ }
319
+ /**
320
+ * Save settings to encrypted database
321
+ */
322
+ static saveSettings(settings) {
323
+ try {
324
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
325
+ throw new Error('SecureSettingsRepository not initialized');
326
+ }
327
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
328
+ // Save entire settings object to encrypted database
329
+ // No need for per-field encryption - the entire object is encrypted
330
+ repository.save('llm', settings);
331
+ this.cachedSettings = settings;
332
+ console.log('[LLMProviderFactory] Settings saved to encrypted database');
333
+ }
334
+ catch (error) {
335
+ console.error('[LLMProviderFactory] Failed to save settings:', error);
336
+ throw error;
337
+ }
338
+ }
339
+ /**
340
+ * Clear cached settings
341
+ */
342
+ static clearCache() {
343
+ this.cachedSettings = null;
344
+ }
345
+ /**
346
+ * Create a provider based on current settings
347
+ * Note: All credentials must be configured via the Settings UI.
348
+ * Environment variables are no longer used for security reasons.
349
+ */
350
+ static createProvider(overrideConfig) {
351
+ const settings = this.loadSettings();
352
+ const providerType = overrideConfig?.type || settings.providerType;
353
+ const config = {
354
+ type: providerType,
355
+ model: this.getModelId(settings.modelKey, providerType, settings.ollama?.model, settings.gemini?.model, settings.openrouter?.model, settings.openai?.model),
356
+ // Anthropic config - from settings only
357
+ anthropicApiKey: normalizeSecret(overrideConfig?.anthropicApiKey) || settings.anthropic?.apiKey,
358
+ // Bedrock config - from settings only
359
+ awsRegion: overrideConfig?.awsRegion || settings.bedrock?.region || 'us-east-1',
360
+ awsAccessKeyId: overrideConfig?.awsAccessKeyId || settings.bedrock?.accessKeyId,
361
+ awsSecretAccessKey: normalizeSecret(overrideConfig?.awsSecretAccessKey) || settings.bedrock?.secretAccessKey,
362
+ awsSessionToken: overrideConfig?.awsSessionToken || settings.bedrock?.sessionToken,
363
+ awsProfile: overrideConfig?.awsProfile || settings.bedrock?.profile,
364
+ // Ollama config - from settings only
365
+ ollamaBaseUrl: overrideConfig?.ollamaBaseUrl || settings.ollama?.baseUrl || 'http://localhost:11434',
366
+ ollamaApiKey: normalizeSecret(overrideConfig?.ollamaApiKey) || settings.ollama?.apiKey,
367
+ // Gemini config - from settings only
368
+ geminiApiKey: normalizeSecret(overrideConfig?.geminiApiKey) || settings.gemini?.apiKey,
369
+ // OpenRouter config - from settings only
370
+ openrouterApiKey: normalizeSecret(overrideConfig?.openrouterApiKey) || settings.openrouter?.apiKey,
371
+ // OpenAI config - from settings only
372
+ openaiApiKey: normalizeSecret(overrideConfig?.openaiApiKey) || settings.openai?.apiKey,
373
+ openaiAccessToken: normalizeSecret(overrideConfig?.openaiAccessToken) || settings.openai?.accessToken,
374
+ openaiRefreshToken: settings.openai?.refreshToken,
375
+ openaiTokenExpiresAt: settings.openai?.tokenExpiresAt,
376
+ };
377
+ return this.createProviderFromConfig(config);
378
+ }
379
+ /**
380
+ * Create a provider from explicit config
381
+ */
382
+ static createProviderFromConfig(config) {
383
+ switch (config.type) {
384
+ case 'anthropic':
385
+ return new anthropic_provider_1.AnthropicProvider(config);
386
+ case 'bedrock':
387
+ return new bedrock_provider_1.BedrockProvider(config);
388
+ case 'ollama':
389
+ return new ollama_provider_1.OllamaProvider(config);
390
+ case 'gemini':
391
+ return new gemini_provider_1.GeminiProvider(config);
392
+ case 'openrouter':
393
+ return new openrouter_provider_1.OpenRouterProvider(config);
394
+ case 'openai':
395
+ return new openai_provider_1.OpenAIProvider(config);
396
+ default:
397
+ throw new Error(`Unknown provider type: ${config.type}`);
398
+ }
399
+ }
400
+ /**
401
+ * Get the model ID for a provider
402
+ */
403
+ static getModelId(modelKey, providerType, ollamaModel, geminiModel, openrouterModel, openaiModel) {
404
+ // For Ollama, use the specific Ollama model if provided
405
+ if (providerType === 'ollama') {
406
+ return ollamaModel || 'gpt-oss:20b';
407
+ }
408
+ // For Gemini, use the specific Gemini model if provided or default
409
+ if (providerType === 'gemini') {
410
+ return geminiModel || 'gemini-2.0-flash';
411
+ }
412
+ // For OpenRouter, use the specific model if provided or default
413
+ if (providerType === 'openrouter') {
414
+ return openrouterModel || 'anthropic/claude-3.5-sonnet';
415
+ }
416
+ // For OpenAI, use the specific model if provided or default
417
+ if (providerType === 'openai') {
418
+ return openaiModel || 'gpt-4o-mini';
419
+ }
420
+ // For other providers, look up in MODELS
421
+ const model = types_1.MODELS[modelKey];
422
+ if (!model) {
423
+ throw new Error(`Unknown model: ${modelKey}`);
424
+ }
425
+ return model[providerType];
426
+ }
427
+ /**
428
+ * Get display name for a model
429
+ */
430
+ static getModelDisplayName(modelKey) {
431
+ return types_1.MODELS[modelKey]?.displayName || modelKey;
432
+ }
433
+ /**
434
+ * Get all available models
435
+ */
436
+ static getAvailableModels() {
437
+ return Object.entries(types_1.MODELS).map(([key, value]) => ({
438
+ key: key,
439
+ displayName: value.displayName,
440
+ }));
441
+ }
442
+ /**
443
+ * Get available providers based on saved settings configuration
444
+ * Note: Environment variables are no longer checked for security reasons.
445
+ */
446
+ static getAvailableProviders() {
447
+ const settings = this.loadSettings();
448
+ return [
449
+ {
450
+ type: 'anthropic',
451
+ name: 'Anthropic API',
452
+ configured: !!settings.anthropic?.apiKey,
453
+ },
454
+ {
455
+ type: 'gemini',
456
+ name: 'Google Gemini',
457
+ configured: !!settings.gemini?.apiKey,
458
+ },
459
+ {
460
+ type: 'openrouter',
461
+ name: 'OpenRouter',
462
+ configured: !!settings.openrouter?.apiKey,
463
+ },
464
+ {
465
+ type: 'openai',
466
+ name: 'OpenAI',
467
+ configured: !!(settings.openai?.apiKey || settings.openai?.accessToken),
468
+ },
469
+ {
470
+ type: 'bedrock',
471
+ name: 'AWS Bedrock',
472
+ configured: !!(settings.bedrock?.accessKeyId || settings.bedrock?.profile),
473
+ },
474
+ {
475
+ type: 'ollama',
476
+ name: 'Ollama (Local)',
477
+ configured: !!(settings.ollama?.baseUrl || settings.ollama?.model),
478
+ },
479
+ ];
480
+ }
481
+ /**
482
+ * Get current configuration status
483
+ */
484
+ static getConfigStatus() {
485
+ const settings = this.loadSettings();
486
+ return {
487
+ currentProvider: settings.providerType,
488
+ currentModel: settings.modelKey,
489
+ providers: this.getAvailableProviders(),
490
+ models: this.getAvailableModels(),
491
+ };
492
+ }
493
+ /**
494
+ * Get the currently selected provider type
495
+ */
496
+ static getSelectedProvider() {
497
+ const settings = this.loadSettings();
498
+ return settings.providerType;
499
+ }
500
+ /**
501
+ * Get the currently selected model key
502
+ */
503
+ static getSelectedModel() {
504
+ const settings = this.loadSettings();
505
+ return settings.modelKey;
506
+ }
507
+ /**
508
+ * Get the current LLM settings
509
+ */
510
+ static getSettings() {
511
+ return this.loadSettings();
512
+ }
513
+ /**
514
+ * Test a provider configuration
515
+ */
516
+ static async testProvider(config) {
517
+ try {
518
+ const provider = this.createProviderFromConfig(config);
519
+ return await provider.testConnection();
520
+ }
521
+ catch (error) {
522
+ return {
523
+ success: false,
524
+ error: error.message || 'Failed to create provider',
525
+ };
526
+ }
527
+ }
528
+ /**
529
+ * Fetch available Bedrock models from AWS
530
+ */
531
+ static async getBedrockModels(config) {
532
+ const settings = this.loadSettings();
533
+ const region = config?.region || settings.bedrock?.region || 'us-east-1';
534
+ const accessKeyId = config?.accessKeyId || settings.bedrock?.accessKeyId;
535
+ const secretAccessKey = config?.secretAccessKey || settings.bedrock?.secretAccessKey;
536
+ const profile = config?.profile || settings.bedrock?.profile;
537
+ // Default Claude models available on Bedrock
538
+ const defaultModels = Object.entries(types_1.MODELS).map(([key, value]) => ({
539
+ id: value.bedrock,
540
+ name: value.displayName,
541
+ provider: 'Anthropic',
542
+ description: key.includes('opus') ? 'Most capable for complex tasks' :
543
+ key.includes('sonnet') ? 'Balanced performance and speed' :
544
+ 'Fast and efficient',
545
+ }));
546
+ try {
547
+ // Import BedrockClient for listing models (different from runtime client)
548
+ const { BedrockClient, ListFoundationModelsCommand } = await Promise.resolve().then(() => __importStar(require('@aws-sdk/client-bedrock')));
549
+ const { fromIni } = await Promise.resolve().then(() => __importStar(require('@aws-sdk/credential-provider-ini')));
550
+ const clientConfig = { region };
551
+ if (accessKeyId && secretAccessKey) {
552
+ clientConfig.credentials = {
553
+ accessKeyId,
554
+ secretAccessKey,
555
+ };
556
+ }
557
+ else if (profile) {
558
+ clientConfig.credentials = fromIni({ profile });
559
+ }
560
+ const client = new BedrockClient(clientConfig);
561
+ const command = new ListFoundationModelsCommand({
562
+ byOutputModality: 'TEXT',
563
+ });
564
+ const response = await client.send(command);
565
+ const models = response.modelSummaries || [];
566
+ // Filter for Claude models and format the response
567
+ const claudeModels = models
568
+ .filter((m) => m.providerName === 'Anthropic' && m.modelId?.includes('claude'))
569
+ .map((m) => ({
570
+ id: m.modelId || '',
571
+ name: m.modelName || m.modelId || '',
572
+ provider: m.providerName || 'Anthropic',
573
+ description: m.modelId?.includes('opus') ? 'Most capable for complex tasks' :
574
+ m.modelId?.includes('sonnet') ? 'Balanced performance and speed' :
575
+ m.modelId?.includes('haiku') ? 'Fast and efficient' :
576
+ 'Claude model',
577
+ }))
578
+ .filter((m) => m.id);
579
+ return claudeModels.length > 0 ? claudeModels : defaultModels;
580
+ }
581
+ catch (error) {
582
+ console.error('Failed to fetch Bedrock models:', error);
583
+ // Return default models on error
584
+ return defaultModels;
585
+ }
586
+ }
587
+ /**
588
+ * Fetch available Ollama models from the server
589
+ */
590
+ static async getOllamaModels(baseUrl) {
591
+ const settings = this.loadSettings();
592
+ const url = baseUrl || settings.ollama?.baseUrl || 'http://localhost:11434';
593
+ try {
594
+ console.log(`[ProviderFactory] Fetching Ollama models from ${url}...`);
595
+ const provider = new ollama_provider_1.OllamaProvider({
596
+ type: 'ollama',
597
+ model: '',
598
+ ollamaBaseUrl: url,
599
+ ollamaApiKey: settings.ollama?.apiKey,
600
+ });
601
+ const models = await provider.getAvailableModels();
602
+ console.log(`[ProviderFactory] Fetched ${models.length} models from Ollama`);
603
+ return models;
604
+ }
605
+ catch (error) {
606
+ console.error('Failed to fetch Ollama models:', error);
607
+ return [];
608
+ }
609
+ }
610
+ /**
611
+ * Fetch available Gemini models from the API
612
+ */
613
+ static async getGeminiModels(apiKey) {
614
+ const settings = this.loadSettings();
615
+ // Normalize empty strings to undefined
616
+ const normalizedApiKey = apiKey?.trim() || undefined;
617
+ const settingsKey = settings.gemini?.apiKey;
618
+ const key = normalizedApiKey || settingsKey;
619
+ const defaultModels = [
620
+ { name: 'gemini-2.5-pro-preview-05-06', displayName: 'Gemini 2.5 Pro', description: 'Most capable model for complex tasks' },
621
+ { name: 'gemini-2.5-flash-preview-05-20', displayName: 'Gemini 2.5 Flash', description: 'Fast and efficient for most tasks' },
622
+ { name: 'gemini-2.0-flash', displayName: 'Gemini 2.0 Flash', description: 'Balanced speed and capability' },
623
+ { name: 'gemini-2.0-flash-lite', displayName: 'Gemini 2.0 Flash Lite', description: 'Fastest and most cost-effective' },
624
+ { name: 'gemini-1.5-pro', displayName: 'Gemini 1.5 Pro', description: 'Previous generation pro model' },
625
+ { name: 'gemini-1.5-flash', displayName: 'Gemini 1.5 Flash', description: 'Previous generation flash model' },
626
+ ];
627
+ if (!key) {
628
+ // Return default models if no API key
629
+ return defaultModels;
630
+ }
631
+ try {
632
+ const provider = new gemini_provider_1.GeminiProvider({
633
+ type: 'gemini',
634
+ model: '',
635
+ geminiApiKey: key,
636
+ });
637
+ return await provider.getAvailableModels();
638
+ }
639
+ catch (error) {
640
+ console.error('Failed to fetch Gemini models:', error);
641
+ // Return default models on error instead of empty array
642
+ return defaultModels;
643
+ }
644
+ }
645
+ /**
646
+ * Fetch available OpenRouter models from the API
647
+ */
648
+ static async getOpenRouterModels(apiKey) {
649
+ const settings = this.loadSettings();
650
+ // Normalize empty strings to undefined
651
+ const normalizedApiKey = apiKey?.trim() || undefined;
652
+ const key = normalizedApiKey || settings.openrouter?.apiKey;
653
+ const defaultModels = [
654
+ { id: 'anthropic/claude-3.5-sonnet', name: 'Claude 3.5 Sonnet', context_length: 200000 },
655
+ { id: 'anthropic/claude-3-opus', name: 'Claude 3 Opus', context_length: 200000 },
656
+ { id: 'openai/gpt-4o', name: 'GPT-4o', context_length: 128000 },
657
+ { id: 'openai/gpt-4o-mini', name: 'GPT-4o Mini', context_length: 128000 },
658
+ { id: 'google/gemini-pro-1.5', name: 'Gemini Pro 1.5', context_length: 1000000 },
659
+ { id: 'meta-llama/llama-3.1-405b-instruct', name: 'Llama 3.1 405B', context_length: 131072 },
660
+ ];
661
+ if (!key) {
662
+ // Return default models if no API key
663
+ return defaultModels;
664
+ }
665
+ try {
666
+ const provider = new openrouter_provider_1.OpenRouterProvider({
667
+ type: 'openrouter',
668
+ model: '',
669
+ openrouterApiKey: key,
670
+ });
671
+ return await provider.getAvailableModels();
672
+ }
673
+ catch (error) {
674
+ console.error('Failed to fetch OpenRouter models:', error);
675
+ // Return default models on error instead of empty array
676
+ return defaultModels;
677
+ }
678
+ }
679
+ /**
680
+ * Fetch available OpenAI models
681
+ * For API key auth: uses the models.list API via OpenAI SDK
682
+ * For OAuth auth: uses pi-ai SDK's model list for openai-codex provider
683
+ */
684
+ static async getOpenAIModels(apiKey) {
685
+ const settings = this.loadSettings();
686
+ // Normalize empty strings to undefined
687
+ const normalizedApiKey = apiKey?.trim() || undefined;
688
+ const key = normalizedApiKey || settings.openai?.apiKey;
689
+ // Check for OAuth access token if no API key
690
+ const accessToken = settings.openai?.accessToken;
691
+ const refreshToken = settings.openai?.refreshToken;
692
+ const defaultModels = [
693
+ { id: 'gpt-4o', name: 'GPT-4o', description: 'Most capable model for complex tasks' },
694
+ { id: 'gpt-4o-mini', name: 'GPT-4o Mini', description: 'Fast and affordable for most tasks' },
695
+ { id: 'gpt-4-turbo', name: 'GPT-4 Turbo', description: 'Previous generation flagship' },
696
+ { id: 'gpt-3.5-turbo', name: 'GPT-3.5 Turbo', description: 'Fast and cost-effective' },
697
+ { id: 'o1', name: 'o1', description: 'Advanced reasoning model' },
698
+ { id: 'o1-mini', name: 'o1 Mini', description: 'Fast reasoning model' },
699
+ ];
700
+ // For OAuth users, use pi-ai SDK's model list directly
701
+ if (accessToken && refreshToken && !key) {
702
+ console.log('[OpenAI] Using OAuth - fetching models from pi-ai SDK...');
703
+ try {
704
+ const piAiModels = (0, pi_ai_1.getModels)('openai-codex');
705
+ const models = piAiModels.map((m) => ({
706
+ id: m.id,
707
+ name: m.name || this.formatOpenAIModelName(m.id),
708
+ description: this.getOpenAIModelDescription(m.id),
709
+ }));
710
+ // Sort by priority (ChatGPT internal models)
711
+ models.sort((a, b) => {
712
+ const priority = (id) => {
713
+ if (id.includes('5.1-codex-mini'))
714
+ return 0;
715
+ if (id.includes('5.1-codex-max'))
716
+ return 1;
717
+ if (id === 'gpt-5.1')
718
+ return 2;
719
+ if (id.includes('5.2-codex'))
720
+ return 3;
721
+ if (id === 'gpt-5.2')
722
+ return 4;
723
+ return 5;
724
+ };
725
+ return priority(a.id) - priority(b.id);
726
+ });
727
+ console.log(`[OpenAI] Found ${models.length} models via pi-ai SDK`);
728
+ return models;
729
+ }
730
+ catch (error) {
731
+ console.error('[OpenAI] Failed to get models from pi-ai SDK:', error);
732
+ // Return ChatGPT-specific defaults for OAuth users
733
+ return [
734
+ { id: 'gpt-5.1-codex-mini', name: 'GPT-5.1 Codex Mini', description: 'Fast and efficient for most tasks' },
735
+ { id: 'gpt-5.1-codex-max', name: 'GPT-5.1 Codex Max', description: 'Maximum capability for complex tasks' },
736
+ { id: 'gpt-5.1', name: 'GPT-5.1', description: 'Balanced performance and capability' },
737
+ { id: 'gpt-5.2-codex', name: 'GPT-5.2 Codex', description: 'Advanced reasoning model' },
738
+ { id: 'gpt-5.2', name: 'GPT-5.2', description: 'Most advanced reasoning' },
739
+ ];
740
+ }
741
+ }
742
+ if (!key) {
743
+ // Return default models if no authentication
744
+ return defaultModels;
745
+ }
746
+ try {
747
+ // For API key, use the OpenAI provider
748
+ const provider = new openai_provider_1.OpenAIProvider({
749
+ type: 'openai',
750
+ model: '',
751
+ openaiApiKey: key,
752
+ });
753
+ return await provider.getAvailableModels();
754
+ }
755
+ catch (error) {
756
+ console.error('Failed to fetch OpenAI models:', error);
757
+ // Return default models on error instead of empty array
758
+ return defaultModels;
759
+ }
760
+ }
761
+ /**
762
+ * Format OpenAI model ID to display name
763
+ */
764
+ static formatOpenAIModelName(modelId) {
765
+ // Public API models
766
+ if (modelId === 'gpt-4o')
767
+ return 'GPT-4o';
768
+ if (modelId === 'gpt-4o-mini')
769
+ return 'GPT-4o Mini';
770
+ if (modelId.includes('gpt-4o-'))
771
+ return `GPT-4o (${modelId.replace('gpt-4o-', '')})`;
772
+ if (modelId === 'gpt-4-turbo')
773
+ return 'GPT-4 Turbo';
774
+ if (modelId === 'gpt-4')
775
+ return 'GPT-4';
776
+ if (modelId === 'gpt-3.5-turbo')
777
+ return 'GPT-3.5 Turbo';
778
+ if (modelId === 'o1')
779
+ return 'o1';
780
+ if (modelId === 'o1-mini')
781
+ return 'o1 Mini';
782
+ if (modelId === 'o1-preview')
783
+ return 'o1 Preview';
784
+ if (modelId === 'o3-mini')
785
+ return 'o3 Mini';
786
+ // ChatGPT internal models
787
+ if (modelId === 'gpt-5.1')
788
+ return 'GPT-5.1';
789
+ if (modelId === 'gpt-5.1-codex-mini')
790
+ return 'GPT-5.1 Codex Mini';
791
+ if (modelId === 'gpt-5.1-codex-max')
792
+ return 'GPT-5.1 Codex Max';
793
+ if (modelId === 'gpt-5.2')
794
+ return 'GPT-5.2';
795
+ if (modelId === 'gpt-5.2-codex')
796
+ return 'GPT-5.2 Codex';
797
+ return modelId;
798
+ }
799
+ /**
800
+ * Get OpenAI model description
801
+ */
802
+ static getOpenAIModelDescription(modelId) {
803
+ // Public API models
804
+ if (modelId.includes('gpt-4o') && !modelId.includes('mini'))
805
+ return 'Most capable model for complex tasks';
806
+ if (modelId.includes('gpt-4o-mini'))
807
+ return 'Fast and affordable for most tasks';
808
+ if (modelId.includes('gpt-4-turbo'))
809
+ return 'Previous generation flagship';
810
+ if (modelId.includes('gpt-4'))
811
+ return 'High capability model';
812
+ if (modelId.includes('gpt-3.5'))
813
+ return 'Fast and cost-effective';
814
+ if (modelId === 'o1' || modelId === 'o1-preview')
815
+ return 'Advanced reasoning model';
816
+ if (modelId === 'o1-mini')
817
+ return 'Fast reasoning model';
818
+ if (modelId.includes('o3'))
819
+ return 'Next generation reasoning';
820
+ // ChatGPT internal models
821
+ if (modelId === 'gpt-5.1')
822
+ return 'Balanced performance and capability';
823
+ if (modelId === 'gpt-5.1-codex-mini')
824
+ return 'Fast and efficient for most tasks';
825
+ if (modelId === 'gpt-5.1-codex-max')
826
+ return 'Maximum capability for complex tasks';
827
+ if (modelId === 'gpt-5.2')
828
+ return 'Most advanced reasoning';
829
+ if (modelId === 'gpt-5.2-codex')
830
+ return 'Advanced reasoning model';
831
+ return 'OpenAI model';
832
+ }
833
+ /**
834
+ * Save cached models for a provider
835
+ */
836
+ static saveCachedModels(providerType, models) {
837
+ const settings = this.loadSettings();
838
+ switch (providerType) {
839
+ case 'gemini':
840
+ settings.cachedGeminiModels = models;
841
+ break;
842
+ case 'openrouter':
843
+ settings.cachedOpenRouterModels = models;
844
+ break;
845
+ case 'ollama':
846
+ settings.cachedOllamaModels = models;
847
+ break;
848
+ case 'bedrock':
849
+ settings.cachedBedrockModels = models;
850
+ break;
851
+ case 'openai':
852
+ settings.cachedOpenAIModels = models;
853
+ break;
854
+ }
855
+ this.saveSettings(settings);
856
+ }
857
+ /**
858
+ * Get cached models for a provider
859
+ */
860
+ static getCachedModels(providerType) {
861
+ const settings = this.loadSettings();
862
+ switch (providerType) {
863
+ case 'gemini':
864
+ return settings.cachedGeminiModels;
865
+ case 'openrouter':
866
+ return settings.cachedOpenRouterModels;
867
+ case 'ollama':
868
+ return settings.cachedOllamaModels;
869
+ case 'bedrock':
870
+ return settings.cachedBedrockModels;
871
+ case 'openai':
872
+ return settings.cachedOpenAIModels;
873
+ default:
874
+ return undefined;
875
+ }
876
+ }
877
+ }
878
+ exports.LLMProviderFactory = LLMProviderFactory;
879
+ LLMProviderFactory.cachedSettings = null;
880
+ LLMProviderFactory.migrationCompleted = false;