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,9 @@
1
+ "use strict";
2
+ /**
3
+ * Tray Module - macOS Menu Bar Integration
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.trayManager = exports.TrayManager = void 0;
7
+ var TrayManager_1 = require("./TrayManager");
8
+ Object.defineProperty(exports, "TrayManager", { enumerable: true, get: function () { return TrayManager_1.TrayManager; } });
9
+ Object.defineProperty(exports, "trayManager", { enumerable: true, get: function () { return TrayManager_1.trayManager; } });
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateManager = exports.UpdateManager = void 0;
4
+ var update_manager_1 = require("./update-manager");
5
+ Object.defineProperty(exports, "UpdateManager", { enumerable: true, get: function () { return update_manager_1.UpdateManager; } });
6
+ Object.defineProperty(exports, "updateManager", { enumerable: true, get: function () { return update_manager_1.updateManager; } });
@@ -0,0 +1,418 @@
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.updateManager = exports.UpdateManager = void 0;
37
+ const electron_1 = require("electron");
38
+ const child_process_1 = require("child_process");
39
+ const util_1 = require("util");
40
+ const types_1 = require("../../shared/types");
41
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
42
+ class UpdateManager {
43
+ constructor() {
44
+ this.mainWindow = null;
45
+ this.repoOwner = 'CoWork-OS';
46
+ this.repoName = 'cowork-os';
47
+ this.isUpdating = false;
48
+ }
49
+ setMainWindow(window) {
50
+ this.mainWindow = window;
51
+ }
52
+ sendProgress(progress) {
53
+ if (this.mainWindow && !this.mainWindow.isDestroyed()) {
54
+ this.mainWindow.webContents.send(types_1.IPC_CHANNELS.APP_UPDATE_PROGRESS, progress);
55
+ }
56
+ }
57
+ sendError(error) {
58
+ if (this.mainWindow && !this.mainWindow.isDestroyed()) {
59
+ this.mainWindow.webContents.send(types_1.IPC_CHANNELS.APP_UPDATE_ERROR, { error });
60
+ }
61
+ }
62
+ async getVersionInfo() {
63
+ const version = electron_1.app.getVersion();
64
+ const isDev = !electron_1.app.isPackaged;
65
+ let isGitRepo = false;
66
+ let isNpmGlobal = false;
67
+ let gitBranch;
68
+ let gitCommit;
69
+ const appPath = electron_1.app.getAppPath();
70
+ // Check if installed via npm global
71
+ isNpmGlobal = this.detectNpmGlobalInstall(appPath);
72
+ if (isDev && !isNpmGlobal) {
73
+ try {
74
+ const { stdout: branchOut } = await execAsync('git rev-parse --abbrev-ref HEAD', { cwd: appPath });
75
+ gitBranch = branchOut.trim();
76
+ const { stdout: commitOut } = await execAsync('git rev-parse --short HEAD', { cwd: appPath });
77
+ gitCommit = commitOut.trim();
78
+ isGitRepo = true;
79
+ }
80
+ catch {
81
+ isGitRepo = false;
82
+ }
83
+ }
84
+ return {
85
+ version,
86
+ isDev,
87
+ isGitRepo,
88
+ isNpmGlobal,
89
+ gitBranch,
90
+ gitCommit,
91
+ };
92
+ }
93
+ detectNpmGlobalInstall(appPath) {
94
+ // Check common npm global installation paths
95
+ const npmGlobalPatterns = [
96
+ '/usr/local/lib/node_modules',
97
+ '/usr/lib/node_modules',
98
+ '/opt/homebrew/lib/node_modules',
99
+ 'node_modules/cowork-os',
100
+ '.nvm/versions/node',
101
+ '.npm-global',
102
+ 'AppData/Roaming/npm/node_modules', // Windows
103
+ ];
104
+ const normalizedPath = appPath.replace(/\\/g, '/');
105
+ return npmGlobalPatterns.some(pattern => normalizedPath.includes(pattern));
106
+ }
107
+ async checkForUpdates() {
108
+ const versionInfo = await this.getVersionInfo();
109
+ const currentVersion = versionInfo.version;
110
+ this.sendProgress({ phase: 'checking', message: 'Checking for updates...' });
111
+ try {
112
+ // Fetch latest release from GitHub
113
+ const response = await fetch(`https://api.github.com/repos/${this.repoOwner}/${this.repoName}/releases/latest`, {
114
+ headers: {
115
+ 'Accept': 'application/vnd.github.v3+json',
116
+ 'User-Agent': 'CoWork-OS-Updater',
117
+ },
118
+ });
119
+ if (!response.ok) {
120
+ if (response.status === 404) {
121
+ return {
122
+ available: false,
123
+ currentVersion,
124
+ latestVersion: currentVersion,
125
+ updateMode: this.getUpdateMode(versionInfo),
126
+ };
127
+ }
128
+ throw new Error(`GitHub API error: ${response.status}`);
129
+ }
130
+ const release = await response.json();
131
+ const latestVersion = release.tag_name.replace(/^v/, '');
132
+ const available = this.isNewerVersion(latestVersion, currentVersion);
133
+ // Determine update mode based on installation type
134
+ const updateMode = this.getUpdateMode(versionInfo);
135
+ if (versionInfo.isGitRepo && !available) {
136
+ // Only check for new commits if versions are equal (not if local version is newer)
137
+ const localIsNewer = this.isNewerVersion(currentVersion, latestVersion);
138
+ if (!localIsNewer) {
139
+ // Check for new commits even if version tag is same
140
+ const hasNewCommits = await this.checkForNewCommits();
141
+ if (hasNewCommits) {
142
+ return {
143
+ available: true,
144
+ currentVersion: `${currentVersion} (${versionInfo.gitCommit})`,
145
+ latestVersion: `${latestVersion} (new commits)`,
146
+ releaseNotes: 'New commits available on the main branch.',
147
+ releaseUrl: `https://github.com/${this.repoOwner}/${this.repoName}`,
148
+ updateMode: 'git',
149
+ };
150
+ }
151
+ }
152
+ }
153
+ return {
154
+ available,
155
+ currentVersion,
156
+ latestVersion,
157
+ releaseNotes: release.body,
158
+ releaseUrl: release.html_url,
159
+ publishedAt: release.published_at,
160
+ updateMode,
161
+ };
162
+ }
163
+ catch (error) {
164
+ this.sendError(error.message);
165
+ throw error;
166
+ }
167
+ }
168
+ async checkForNewCommits() {
169
+ try {
170
+ const appPath = electron_1.app.getAppPath();
171
+ // Fetch latest from remote
172
+ await execAsync('git fetch origin', { cwd: appPath });
173
+ // Check if there are commits ahead on remote
174
+ const { stdout } = await execAsync('git rev-list HEAD..origin/main --count', { cwd: appPath });
175
+ const commitsAhead = parseInt(stdout.trim(), 10);
176
+ return commitsAhead > 0;
177
+ }
178
+ catch {
179
+ return false;
180
+ }
181
+ }
182
+ isNewerVersion(latest, current) {
183
+ // Normalize versions: convert "0.3.9-1" to "0.3.9.1" for comparison
184
+ const normalizeVersion = (v) => {
185
+ // Replace hyphens with dots for consistent parsing
186
+ const normalized = v.replace(/-/g, '.');
187
+ return normalized.split('.').map(n => parseInt(n, 10) || 0);
188
+ };
189
+ const latestParts = normalizeVersion(latest);
190
+ const currentParts = normalizeVersion(current);
191
+ for (let i = 0; i < Math.max(latestParts.length, currentParts.length); i++) {
192
+ const l = latestParts[i] || 0;
193
+ const c = currentParts[i] || 0;
194
+ if (l > c)
195
+ return true;
196
+ if (l < c)
197
+ return false;
198
+ }
199
+ return false;
200
+ }
201
+ getUpdateMode(versionInfo) {
202
+ if (versionInfo.isNpmGlobal) {
203
+ return 'npm';
204
+ }
205
+ if (versionInfo.isGitRepo) {
206
+ return 'git';
207
+ }
208
+ return 'electron-updater';
209
+ }
210
+ async downloadAndInstallUpdate(updateInfo) {
211
+ if (this.isUpdating) {
212
+ throw new Error('Update already in progress');
213
+ }
214
+ this.isUpdating = true;
215
+ try {
216
+ if (updateInfo.updateMode === 'npm') {
217
+ await this.npmUpdate();
218
+ }
219
+ else if (updateInfo.updateMode === 'git') {
220
+ await this.gitUpdate();
221
+ }
222
+ else {
223
+ await this.electronUpdaterUpdate();
224
+ }
225
+ }
226
+ finally {
227
+ this.isUpdating = false;
228
+ }
229
+ }
230
+ async gitUpdate() {
231
+ const appPath = electron_1.app.getAppPath();
232
+ try {
233
+ // Step 1: Stash any local changes
234
+ this.sendProgress({ phase: 'downloading', percent: 10, message: 'Stashing local changes...' });
235
+ try {
236
+ await execAsync('git stash', { cwd: appPath });
237
+ }
238
+ catch {
239
+ // Ignore if nothing to stash
240
+ }
241
+ // Step 2: Fetch and pull latest
242
+ this.sendProgress({ phase: 'downloading', percent: 30, message: 'Pulling latest changes from GitHub...' });
243
+ await execAsync('git fetch origin', { cwd: appPath });
244
+ await execAsync('git pull origin main', { cwd: appPath });
245
+ // Step 3: Install dependencies
246
+ this.sendProgress({ phase: 'installing', percent: 50, message: 'Installing dependencies (npm install)...' });
247
+ await this.runNpmInstall(appPath);
248
+ // Step 4: Rebuild
249
+ this.sendProgress({ phase: 'installing', percent: 80, message: 'Building application (npm run build)...' });
250
+ await this.runNpmBuild(appPath);
251
+ // Step 5: Complete
252
+ this.sendProgress({ phase: 'complete', percent: 100, message: 'Update complete! Please restart the application.' });
253
+ if (this.mainWindow && !this.mainWindow.isDestroyed()) {
254
+ this.mainWindow.webContents.send(types_1.IPC_CHANNELS.APP_UPDATE_DOWNLOADED, {
255
+ requiresRestart: true,
256
+ message: 'Update complete! Please restart the application to apply changes.',
257
+ });
258
+ }
259
+ }
260
+ catch (error) {
261
+ this.sendProgress({ phase: 'error', message: `Update failed: ${error.message}` });
262
+ this.sendError(error.message);
263
+ throw error;
264
+ }
265
+ }
266
+ async npmUpdate() {
267
+ try {
268
+ // Step 1: Run npm update
269
+ this.sendProgress({ phase: 'downloading', percent: 20, message: 'Updating via npm...' });
270
+ await this.runNpmGlobalUpdate();
271
+ // Step 2: Complete
272
+ this.sendProgress({ phase: 'complete', percent: 100, message: 'Update complete! Please restart the application.' });
273
+ if (this.mainWindow && !this.mainWindow.isDestroyed()) {
274
+ this.mainWindow.webContents.send(types_1.IPC_CHANNELS.APP_UPDATE_DOWNLOADED, {
275
+ requiresRestart: true,
276
+ message: 'Update complete! Please restart the application to apply changes.',
277
+ });
278
+ }
279
+ }
280
+ catch (error) {
281
+ this.sendProgress({ phase: 'error', message: `Update failed: ${error.message}` });
282
+ this.sendError(error.message);
283
+ throw error;
284
+ }
285
+ }
286
+ runNpmGlobalUpdate() {
287
+ return new Promise((resolve, reject) => {
288
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
289
+ const child = (0, child_process_1.spawn)(npm, ['install', '-g', 'cowork-os@latest'], { shell: true });
290
+ let stderr = '';
291
+ child.stderr.on('data', (data) => {
292
+ stderr += data.toString();
293
+ });
294
+ child.on('close', (code) => {
295
+ if (code === 0) {
296
+ resolve();
297
+ }
298
+ else {
299
+ reject(new Error(`npm update failed with code ${code}: ${stderr}`));
300
+ }
301
+ });
302
+ child.on('error', reject);
303
+ });
304
+ }
305
+ runNpmInstall(cwd) {
306
+ return new Promise((resolve, reject) => {
307
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
308
+ const child = (0, child_process_1.spawn)(npm, ['install'], { cwd, shell: true });
309
+ let stderr = '';
310
+ child.stderr.on('data', (data) => {
311
+ stderr += data.toString();
312
+ });
313
+ child.on('close', (code) => {
314
+ if (code === 0) {
315
+ resolve();
316
+ }
317
+ else {
318
+ reject(new Error(`npm install failed with code ${code}: ${stderr}`));
319
+ }
320
+ });
321
+ child.on('error', reject);
322
+ });
323
+ }
324
+ runNpmBuild(cwd) {
325
+ return new Promise((resolve, reject) => {
326
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
327
+ const child = (0, child_process_1.spawn)(npm, ['run', 'build'], { cwd, shell: true });
328
+ let stderr = '';
329
+ child.stderr.on('data', (data) => {
330
+ stderr += data.toString();
331
+ });
332
+ child.on('close', (code) => {
333
+ if (code === 0) {
334
+ resolve();
335
+ }
336
+ else {
337
+ reject(new Error(`npm run build failed with code ${code}: ${stderr}`));
338
+ }
339
+ });
340
+ child.on('error', reject);
341
+ });
342
+ }
343
+ async electronUpdaterUpdate() {
344
+ // For packaged apps, we'll use electron-updater
345
+ // This requires electron-updater to be installed and configured
346
+ try {
347
+ // Dynamic import to avoid issues when running in dev mode
348
+ const electronUpdater = await Promise.resolve().then(() => __importStar(require('electron-updater'))).catch(() => null);
349
+ if (!electronUpdater) {
350
+ throw new Error('electron-updater not available');
351
+ }
352
+ const { autoUpdater } = electronUpdater;
353
+ autoUpdater.on('checking-for-update', () => {
354
+ this.sendProgress({ phase: 'checking', message: 'Checking for updates...' });
355
+ });
356
+ autoUpdater.on('update-available', () => {
357
+ this.sendProgress({ phase: 'downloading', percent: 0, message: 'Update available, starting download...' });
358
+ });
359
+ autoUpdater.on('download-progress', (progress) => {
360
+ this.sendProgress({
361
+ phase: 'downloading',
362
+ percent: Math.round(progress.percent),
363
+ message: `Downloading update... ${Math.round(progress.percent)}%`,
364
+ bytesDownloaded: progress.transferred,
365
+ bytesTotal: progress.total,
366
+ });
367
+ });
368
+ autoUpdater.on('update-downloaded', () => {
369
+ this.sendProgress({ phase: 'complete', percent: 100, message: 'Update downloaded. Ready to install.' });
370
+ if (this.mainWindow && !this.mainWindow.isDestroyed()) {
371
+ this.mainWindow.webContents.send(types_1.IPC_CHANNELS.APP_UPDATE_DOWNLOADED, {
372
+ requiresRestart: true,
373
+ message: 'Update downloaded. Click "Install & Restart" to apply.',
374
+ });
375
+ }
376
+ });
377
+ autoUpdater.on('error', (error) => {
378
+ this.sendProgress({ phase: 'error', message: `Update error: ${error.message}` });
379
+ this.sendError(error.message);
380
+ });
381
+ await autoUpdater.downloadUpdate();
382
+ }
383
+ catch (error) {
384
+ // If electron-updater is not available, fall back to manual download
385
+ this.sendProgress({ phase: 'error', message: 'electron-updater not available. Please download manually from GitHub.' });
386
+ throw new Error('Auto-update not available for packaged builds. Please download the latest release from GitHub.');
387
+ }
388
+ }
389
+ async installUpdateAndRestart() {
390
+ const versionInfo = await this.getVersionInfo();
391
+ if (versionInfo.isGitRepo) {
392
+ // For git-based updates, just restart the app
393
+ electron_1.app.relaunch();
394
+ electron_1.app.exit(0);
395
+ }
396
+ else {
397
+ // For electron-updater, quit and install
398
+ try {
399
+ const electronUpdater = await Promise.resolve().then(() => __importStar(require('electron-updater'))).catch(() => null);
400
+ if (electronUpdater) {
401
+ electronUpdater.autoUpdater.quitAndInstall();
402
+ }
403
+ else {
404
+ // Fallback: just restart
405
+ electron_1.app.relaunch();
406
+ electron_1.app.exit(0);
407
+ }
408
+ }
409
+ catch {
410
+ // Fallback: just restart
411
+ electron_1.app.relaunch();
412
+ electron_1.app.exit(0);
413
+ }
414
+ }
415
+ }
416
+ }
417
+ exports.UpdateManager = UpdateManager;
418
+ exports.updateManager = new UpdateManager();
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ /**
3
+ * Migration utility for users upgrading from .env-based configuration
4
+ * to GUI Settings with secure storage.
5
+ *
6
+ * This runs once on app startup and:
7
+ * 1. Detects if a .env file exists in the app directory
8
+ * 2. Reads any configured credentials
9
+ * 3. Migrates them to the new Settings system (with safeStorage encryption)
10
+ * 4. Renames the .env file to .env.migrated to prevent re-migration
11
+ * 5. Returns a summary for the user notification
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.migrateEnvToSettings = migrateEnvToSettings;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const electron_1 = require("electron");
51
+ const llm_1 = require("../agent/llm");
52
+ const search_1 = require("../agent/search");
53
+ /**
54
+ * Parse a .env file into key-value pairs
55
+ */
56
+ function parseEnvFile(content) {
57
+ const result = {};
58
+ const lines = content.split('\n');
59
+ for (const line of lines) {
60
+ // Skip empty lines and comments
61
+ const trimmed = line.trim();
62
+ if (!trimmed || trimmed.startsWith('#'))
63
+ continue;
64
+ // Parse KEY=VALUE (handle quoted values)
65
+ const eqIndex = trimmed.indexOf('=');
66
+ if (eqIndex === -1)
67
+ continue;
68
+ const key = trimmed.slice(0, eqIndex).trim();
69
+ let value = trimmed.slice(eqIndex + 1).trim();
70
+ // Remove surrounding quotes if present
71
+ if ((value.startsWith('"') && value.endsWith('"')) ||
72
+ (value.startsWith("'") && value.endsWith("'"))) {
73
+ value = value.slice(1, -1);
74
+ }
75
+ if (key && value) {
76
+ result[key] = value;
77
+ }
78
+ }
79
+ return result;
80
+ }
81
+ /**
82
+ * Check for and migrate .env configuration to Settings
83
+ */
84
+ async function migrateEnvToSettings() {
85
+ const migratedKeys = [];
86
+ // Check multiple possible locations for .env
87
+ const possiblePaths = [
88
+ path.join(electron_1.app.getAppPath(), '.env'),
89
+ path.join(process.cwd(), '.env'),
90
+ path.join(electron_1.app.getPath('userData'), '.env'),
91
+ ];
92
+ let envPath = null;
93
+ let envContent = null;
94
+ for (const p of possiblePaths) {
95
+ try {
96
+ if (fs.existsSync(p)) {
97
+ envContent = fs.readFileSync(p, 'utf-8');
98
+ envPath = p;
99
+ break;
100
+ }
101
+ }
102
+ catch {
103
+ // Ignore read errors, try next path
104
+ }
105
+ }
106
+ if (!envPath || !envContent) {
107
+ return { migrated: false, migratedKeys: [] };
108
+ }
109
+ // Check if already migrated
110
+ const migratedPath = envPath + '.migrated';
111
+ if (fs.existsSync(migratedPath)) {
112
+ return { migrated: false, migratedKeys: [] };
113
+ }
114
+ try {
115
+ const env = parseEnvFile(envContent);
116
+ // Load current settings
117
+ const llmSettings = llm_1.LLMProviderFactory.loadSettings();
118
+ const searchSettings = search_1.SearchProviderFactory.loadSettings();
119
+ let llmChanged = false;
120
+ let searchChanged = false;
121
+ // Migrate Anthropic API key
122
+ if (env.ANTHROPIC_API_KEY && !llmSettings.anthropic?.apiKey) {
123
+ llmSettings.anthropic = { ...llmSettings.anthropic, apiKey: env.ANTHROPIC_API_KEY };
124
+ migratedKeys.push('Anthropic API Key');
125
+ llmChanged = true;
126
+ }
127
+ // Migrate AWS Bedrock credentials
128
+ if (env.AWS_ACCESS_KEY_ID && !llmSettings.bedrock?.accessKeyId) {
129
+ llmSettings.bedrock = {
130
+ ...llmSettings.bedrock,
131
+ accessKeyId: env.AWS_ACCESS_KEY_ID,
132
+ secretAccessKey: env.AWS_SECRET_ACCESS_KEY,
133
+ sessionToken: env.AWS_SESSION_TOKEN,
134
+ region: env.AWS_REGION || env.AWS_DEFAULT_REGION,
135
+ profile: env.AWS_PROFILE,
136
+ };
137
+ migratedKeys.push('AWS Bedrock Credentials');
138
+ llmChanged = true;
139
+ }
140
+ // Migrate Gemini API key
141
+ if (env.GEMINI_API_KEY && !llmSettings.gemini?.apiKey) {
142
+ llmSettings.gemini = { ...llmSettings.gemini, apiKey: env.GEMINI_API_KEY };
143
+ migratedKeys.push('Gemini API Key');
144
+ llmChanged = true;
145
+ }
146
+ // Migrate OpenRouter API key
147
+ if (env.OPENROUTER_API_KEY && !llmSettings.openrouter?.apiKey) {
148
+ llmSettings.openrouter = { ...llmSettings.openrouter, apiKey: env.OPENROUTER_API_KEY };
149
+ migratedKeys.push('OpenRouter API Key');
150
+ llmChanged = true;
151
+ }
152
+ // Migrate Ollama settings
153
+ if (env.OLLAMA_BASE_URL && !llmSettings.ollama?.baseUrl) {
154
+ llmSettings.ollama = {
155
+ ...llmSettings.ollama,
156
+ baseUrl: env.OLLAMA_BASE_URL,
157
+ apiKey: env.OLLAMA_API_KEY,
158
+ };
159
+ migratedKeys.push('Ollama Configuration');
160
+ llmChanged = true;
161
+ }
162
+ // Migrate Search API keys
163
+ if (env.TAVILY_API_KEY && !searchSettings.tavily?.apiKey) {
164
+ searchSettings.tavily = { apiKey: env.TAVILY_API_KEY };
165
+ migratedKeys.push('Tavily API Key');
166
+ searchChanged = true;
167
+ }
168
+ if (env.BRAVE_API_KEY && !searchSettings.brave?.apiKey) {
169
+ searchSettings.brave = { apiKey: env.BRAVE_API_KEY };
170
+ migratedKeys.push('Brave Search API Key');
171
+ searchChanged = true;
172
+ }
173
+ if (env.SERPAPI_API_KEY && !searchSettings.serpapi?.apiKey) {
174
+ searchSettings.serpapi = { apiKey: env.SERPAPI_API_KEY };
175
+ migratedKeys.push('SerpAPI Key');
176
+ searchChanged = true;
177
+ }
178
+ if (env.GOOGLE_API_KEY && !searchSettings.google?.apiKey) {
179
+ searchSettings.google = {
180
+ apiKey: env.GOOGLE_API_KEY,
181
+ searchEngineId: env.GOOGLE_SEARCH_ENGINE_ID,
182
+ };
183
+ migratedKeys.push('Google Search API Key');
184
+ searchChanged = true;
185
+ }
186
+ // Save migrated settings
187
+ if (llmChanged) {
188
+ llm_1.LLMProviderFactory.saveSettings(llmSettings);
189
+ }
190
+ if (searchChanged) {
191
+ search_1.SearchProviderFactory.saveSettings(searchSettings);
192
+ }
193
+ // Rename .env to .env.migrated to prevent re-migration
194
+ if (migratedKeys.length > 0) {
195
+ fs.renameSync(envPath, migratedPath);
196
+ }
197
+ return {
198
+ migrated: migratedKeys.length > 0,
199
+ migratedKeys,
200
+ };
201
+ }
202
+ catch (error) {
203
+ return {
204
+ migrated: false,
205
+ migratedKeys: [],
206
+ error: error.message,
207
+ };
208
+ }
209
+ }