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,178 @@
1
+ "use strict";
2
+ /**
3
+ * LLM Provider abstraction types
4
+ * Allows switching between Anthropic API and AWS Bedrock
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DEFAULT_MODEL = exports.OLLAMA_MODELS = exports.OPENAI_MODELS = exports.OPENROUTER_MODELS = exports.GEMINI_MODELS = exports.MODELS = void 0;
8
+ /**
9
+ * Available AI models with their IDs for each provider
10
+ * Note: Bedrock uses inference profile IDs (us. prefix) for newer models
11
+ * Note: Ollama models are dynamic and fetched from the server
12
+ */
13
+ exports.MODELS = {
14
+ 'opus-4-5': {
15
+ anthropic: 'claude-opus-4-5-20251101',
16
+ bedrock: 'us.anthropic.claude-opus-4-5-20251101-v1:0',
17
+ displayName: 'Opus 4.5',
18
+ },
19
+ 'sonnet-4-5': {
20
+ anthropic: 'claude-sonnet-4-5-20250514',
21
+ bedrock: 'us.anthropic.claude-sonnet-4-5-20250514-v1:0',
22
+ displayName: 'Sonnet 4.5',
23
+ },
24
+ 'haiku-4-5': {
25
+ anthropic: 'claude-haiku-4-5-20250514',
26
+ bedrock: 'us.anthropic.claude-haiku-4-5-20250514-v1:0',
27
+ displayName: 'Haiku 4.5',
28
+ },
29
+ 'sonnet-4': {
30
+ anthropic: 'claude-sonnet-4-20250514',
31
+ bedrock: 'us.anthropic.claude-sonnet-4-20250514-v1:0',
32
+ displayName: 'Sonnet 4',
33
+ },
34
+ 'sonnet-3-5': {
35
+ anthropic: 'claude-3-5-sonnet-20241022',
36
+ bedrock: 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',
37
+ displayName: 'Sonnet 3.5',
38
+ },
39
+ 'haiku-3-5': {
40
+ anthropic: 'claude-3-5-haiku-20241022',
41
+ bedrock: 'us.anthropic.claude-3-5-haiku-20241022-v1:0',
42
+ displayName: 'Haiku 3.5',
43
+ },
44
+ };
45
+ /**
46
+ * Available Gemini models from Google AI Studio
47
+ */
48
+ exports.GEMINI_MODELS = {
49
+ 'gemini-2.5-pro': {
50
+ id: 'gemini-2.5-pro-preview-05-06',
51
+ displayName: 'Gemini 2.5 Pro',
52
+ description: 'Most capable model for complex tasks',
53
+ },
54
+ 'gemini-2.5-flash': {
55
+ id: 'gemini-2.5-flash-preview-05-20',
56
+ displayName: 'Gemini 2.5 Flash',
57
+ description: 'Fast and efficient for most tasks',
58
+ },
59
+ 'gemini-2.0-flash': {
60
+ id: 'gemini-2.0-flash',
61
+ displayName: 'Gemini 2.0 Flash',
62
+ description: 'Balanced speed and capability',
63
+ },
64
+ 'gemini-2.0-flash-lite': {
65
+ id: 'gemini-2.0-flash-lite',
66
+ displayName: 'Gemini 2.0 Flash Lite',
67
+ description: 'Fastest and most cost-effective',
68
+ },
69
+ 'gemini-1.5-pro': {
70
+ id: 'gemini-1.5-pro',
71
+ displayName: 'Gemini 1.5 Pro',
72
+ description: 'Previous generation pro model',
73
+ },
74
+ 'gemini-1.5-flash': {
75
+ id: 'gemini-1.5-flash',
76
+ displayName: 'Gemini 1.5 Flash',
77
+ description: 'Previous generation flash model',
78
+ },
79
+ };
80
+ /**
81
+ * Popular OpenRouter models
82
+ * OpenRouter provides access to many models from different providers
83
+ */
84
+ exports.OPENROUTER_MODELS = {
85
+ 'anthropic/claude-3.5-sonnet': {
86
+ id: 'anthropic/claude-3.5-sonnet',
87
+ displayName: 'Claude 3.5 Sonnet',
88
+ description: 'Anthropic\'s balanced model',
89
+ },
90
+ 'anthropic/claude-3-opus': {
91
+ id: 'anthropic/claude-3-opus',
92
+ displayName: 'Claude 3 Opus',
93
+ description: 'Anthropic\'s most capable model',
94
+ },
95
+ 'openai/gpt-4o': {
96
+ id: 'openai/gpt-4o',
97
+ displayName: 'GPT-4o',
98
+ description: 'OpenAI\'s flagship model',
99
+ },
100
+ 'openai/gpt-4o-mini': {
101
+ id: 'openai/gpt-4o-mini',
102
+ displayName: 'GPT-4o Mini',
103
+ description: 'OpenAI\'s fast and affordable model',
104
+ },
105
+ 'google/gemini-pro-1.5': {
106
+ id: 'google/gemini-pro-1.5',
107
+ displayName: 'Gemini Pro 1.5',
108
+ description: 'Google\'s advanced model',
109
+ },
110
+ 'meta-llama/llama-3.1-405b-instruct': {
111
+ id: 'meta-llama/llama-3.1-405b-instruct',
112
+ displayName: 'Llama 3.1 405B',
113
+ description: 'Meta\'s largest open model',
114
+ },
115
+ 'mistralai/mistral-large': {
116
+ id: 'mistralai/mistral-large',
117
+ displayName: 'Mistral Large',
118
+ description: 'Mistral\'s flagship model',
119
+ },
120
+ 'deepseek/deepseek-chat': {
121
+ id: 'deepseek/deepseek-chat',
122
+ displayName: 'DeepSeek Chat',
123
+ description: 'DeepSeek\'s conversational model',
124
+ },
125
+ };
126
+ /**
127
+ * Available OpenAI models
128
+ * Users with ChatGPT Plus/Team/Enterprise subscriptions can use these models
129
+ */
130
+ exports.OPENAI_MODELS = {
131
+ 'gpt-4o': {
132
+ id: 'gpt-4o',
133
+ displayName: 'GPT-4o',
134
+ description: 'Most capable model for complex tasks',
135
+ },
136
+ 'gpt-4o-mini': {
137
+ id: 'gpt-4o-mini',
138
+ displayName: 'GPT-4o Mini',
139
+ description: 'Fast and affordable for most tasks',
140
+ },
141
+ 'gpt-4-turbo': {
142
+ id: 'gpt-4-turbo',
143
+ displayName: 'GPT-4 Turbo',
144
+ description: 'Previous generation flagship',
145
+ },
146
+ 'gpt-3.5-turbo': {
147
+ id: 'gpt-3.5-turbo',
148
+ displayName: 'GPT-3.5 Turbo',
149
+ description: 'Fast and cost-effective',
150
+ },
151
+ 'o1': {
152
+ id: 'o1',
153
+ displayName: 'o1',
154
+ description: 'Advanced reasoning model',
155
+ },
156
+ 'o1-mini': {
157
+ id: 'o1-mini',
158
+ displayName: 'o1 Mini',
159
+ description: 'Fast reasoning model',
160
+ },
161
+ };
162
+ /**
163
+ * Popular Ollama models with their details
164
+ * Users can use any model available on their Ollama server
165
+ */
166
+ exports.OLLAMA_MODELS = {
167
+ 'llama3.2': { displayName: 'Llama 3.2', size: '3B' },
168
+ 'llama3.1': { displayName: 'Llama 3.1', size: '8B' },
169
+ 'llama3.1:70b': { displayName: 'Llama 3.1 70B', size: '70B' },
170
+ 'mistral': { displayName: 'Mistral', size: '7B' },
171
+ 'mixtral': { displayName: 'Mixtral', size: '47B' },
172
+ 'codellama': { displayName: 'Code Llama', size: '7B' },
173
+ 'deepseek-coder': { displayName: 'DeepSeek Coder', size: '6.7B' },
174
+ 'qwen2.5': { displayName: 'Qwen 2.5', size: '7B' },
175
+ 'phi3': { displayName: 'Phi-3', size: '3.8B' },
176
+ 'gemma2': { displayName: 'Gemma 2', size: '9B' },
177
+ };
178
+ exports.DEFAULT_MODEL = 'opus-4-5';
@@ -0,0 +1,378 @@
1
+ "use strict";
2
+ /**
3
+ * Task Queue Manager
4
+ *
5
+ * Manages parallel task execution with configurable concurrency limits.
6
+ * Provides queue management, status tracking, and settings persistence.
7
+ * Settings are stored encrypted in the database using SecureSettingsRepository.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.TaskQueueManager = void 0;
44
+ const electron_1 = require("electron");
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const types_1 = require("../../shared/types");
48
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
49
+ const LEGACY_SETTINGS_FILE = 'queue-settings.json';
50
+ class TaskQueueManager {
51
+ constructor(callbacks) {
52
+ this.queuedTaskIds = []; // FIFO queue of task IDs
53
+ this.runningTaskIds = new Set(); // Currently executing task IDs
54
+ this.taskStartTimes = new Map(); // Track when each task started
55
+ this.initialized = false;
56
+ this.callbacks = callbacks;
57
+ const userDataPath = electron_1.app.getPath('userData');
58
+ this.legacySettingsPath = path.join(userDataPath, LEGACY_SETTINGS_FILE);
59
+ // Migrate from legacy file if needed
60
+ this.migrateFromLegacyFile();
61
+ this.settings = this.loadSettings();
62
+ // Start periodic timeout check (every minute)
63
+ this.timeoutCheckInterval = setInterval(() => this.checkForTimedOutTasks(), 60 * 1000);
64
+ }
65
+ /**
66
+ * Migrate settings from legacy JSON file to encrypted database
67
+ */
68
+ migrateFromLegacyFile() {
69
+ if (TaskQueueManager.migrationCompleted)
70
+ return;
71
+ try {
72
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
73
+ return;
74
+ }
75
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
76
+ if (repository.exists('queue')) {
77
+ TaskQueueManager.migrationCompleted = true;
78
+ return;
79
+ }
80
+ if (!fs.existsSync(this.legacySettingsPath)) {
81
+ TaskQueueManager.migrationCompleted = true;
82
+ return;
83
+ }
84
+ console.log('[TaskQueueManager] Migrating settings from legacy JSON file to encrypted database...');
85
+ // Create backup before migration
86
+ const backupPath = this.legacySettingsPath + '.migration-backup';
87
+ fs.copyFileSync(this.legacySettingsPath, backupPath);
88
+ try {
89
+ const data = fs.readFileSync(this.legacySettingsPath, 'utf-8');
90
+ const parsed = JSON.parse(data);
91
+ const merged = { ...types_1.DEFAULT_QUEUE_SETTINGS, ...parsed };
92
+ repository.save('queue', merged);
93
+ console.log('[TaskQueueManager] Settings migrated to encrypted database');
94
+ // Migration successful - delete backup and original
95
+ fs.unlinkSync(backupPath);
96
+ fs.unlinkSync(this.legacySettingsPath);
97
+ console.log('[TaskQueueManager] Migration complete, cleaned up legacy files');
98
+ TaskQueueManager.migrationCompleted = true;
99
+ }
100
+ catch (migrationError) {
101
+ console.error('[TaskQueueManager] Migration failed, backup preserved at:', backupPath);
102
+ throw migrationError;
103
+ }
104
+ }
105
+ catch (error) {
106
+ console.error('[TaskQueueManager] Migration failed:', error);
107
+ }
108
+ }
109
+ /**
110
+ * Cleanup resources (call on shutdown)
111
+ */
112
+ destroy() {
113
+ if (this.timeoutCheckInterval) {
114
+ clearInterval(this.timeoutCheckInterval);
115
+ this.timeoutCheckInterval = undefined;
116
+ }
117
+ }
118
+ /**
119
+ * Initialize the queue manager - recover queue from database on startup
120
+ * Should be called after database is ready
121
+ */
122
+ async initialize(queuedTasks, runningTasks) {
123
+ if (this.initialized) {
124
+ console.log('[TaskQueueManager] Already initialized, skipping');
125
+ return;
126
+ }
127
+ console.log('[TaskQueueManager] Initializing queue manager');
128
+ console.log(`[TaskQueueManager] Found ${queuedTasks.length} queued tasks, ${runningTasks.length} running tasks`);
129
+ // Restore queued tasks in FIFO order by creation time
130
+ this.queuedTaskIds = queuedTasks
131
+ .sort((a, b) => a.createdAt - b.createdAt)
132
+ .map(t => t.id);
133
+ // Track currently running tasks
134
+ runningTasks.forEach(t => this.runningTaskIds.add(t.id));
135
+ this.initialized = true;
136
+ // Start processing queue if there are slots available
137
+ await this.processQueue();
138
+ // Emit initial queue status
139
+ this.emitQueueUpdate();
140
+ }
141
+ /**
142
+ * Enqueue a new task - either start immediately or add to queue
143
+ *
144
+ * Sub-agents (tasks with parentTaskId) bypass the concurrency limit to prevent
145
+ * deadlocks where a parent task waits for sub-agents that are stuck in the queue.
146
+ */
147
+ async enqueue(task) {
148
+ console.log(`[TaskQueueManager] Enqueueing task ${task.id}: ${task.title}`);
149
+ // Sub-agents bypass concurrency limits to prevent deadlock
150
+ // (parent would wait forever for sub-agents stuck in queue)
151
+ const isSubAgent = !!task.parentTaskId;
152
+ if (isSubAgent) {
153
+ console.log(`[TaskQueueManager] Starting sub-agent immediately (bypasses concurrency limit)`);
154
+ await this.startTask(task);
155
+ }
156
+ else if (this.canStartImmediately()) {
157
+ console.log(`[TaskQueueManager] Starting task immediately (${this.runningTaskIds.size}/${this.settings.maxConcurrentTasks} slots used)`);
158
+ await this.startTask(task);
159
+ }
160
+ else {
161
+ console.log(`[TaskQueueManager] Queue full, adding task to queue (position: ${this.queuedTaskIds.length + 1})`);
162
+ this.queuedTaskIds.push(task.id);
163
+ this.callbacks.updateTaskStatus(task.id, 'queued');
164
+ this.emitQueueUpdate();
165
+ }
166
+ }
167
+ /**
168
+ * Called when a task finishes (completed, failed, or cancelled)
169
+ */
170
+ async onTaskFinished(taskId) {
171
+ console.log(`[TaskQueueManager] Task ${taskId} finished`);
172
+ // Remove from running set and clear start time
173
+ this.runningTaskIds.delete(taskId);
174
+ this.taskStartTimes.delete(taskId);
175
+ // Process next task in queue
176
+ await this.processQueue();
177
+ // Emit updated status
178
+ this.emitQueueUpdate();
179
+ }
180
+ /**
181
+ * Cancel a queued task (remove from queue without starting)
182
+ * Returns true if task was in queue and removed
183
+ */
184
+ cancelQueuedTask(taskId) {
185
+ const index = this.queuedTaskIds.indexOf(taskId);
186
+ if (index !== -1) {
187
+ console.log(`[TaskQueueManager] Removing task ${taskId} from queue`);
188
+ this.queuedTaskIds.splice(index, 1);
189
+ this.emitQueueUpdate();
190
+ return true;
191
+ }
192
+ return false;
193
+ }
194
+ /**
195
+ * Check if a task is currently in the queue
196
+ */
197
+ isQueued(taskId) {
198
+ return this.queuedTaskIds.includes(taskId);
199
+ }
200
+ /**
201
+ * Check if a task is currently running
202
+ */
203
+ isRunning(taskId) {
204
+ return this.runningTaskIds.has(taskId);
205
+ }
206
+ /**
207
+ * Clear all stuck tasks from the running set
208
+ * This should be used to recover from stuck state when tasks fail to clean up
209
+ * Returns the number of tasks cleared
210
+ */
211
+ clearStuckTasks() {
212
+ const clearedRunning = this.runningTaskIds.size;
213
+ const clearedQueued = this.queuedTaskIds.length;
214
+ console.log(`[TaskQueueManager] Clearing ${clearedRunning} running tasks and ${clearedQueued} queued tasks`);
215
+ // Clear running tasks and their start times
216
+ this.runningTaskIds.clear();
217
+ this.taskStartTimes.clear();
218
+ // Clear queued tasks
219
+ this.queuedTaskIds = [];
220
+ // Emit update
221
+ this.emitQueueUpdate();
222
+ return { clearedRunning, clearedQueued };
223
+ }
224
+ /**
225
+ * Get current queue status for UI
226
+ */
227
+ getStatus() {
228
+ return {
229
+ runningCount: this.runningTaskIds.size,
230
+ queuedCount: this.queuedTaskIds.length,
231
+ runningTaskIds: Array.from(this.runningTaskIds),
232
+ queuedTaskIds: [...this.queuedTaskIds],
233
+ maxConcurrent: this.settings.maxConcurrentTasks,
234
+ };
235
+ }
236
+ /**
237
+ * Get current settings
238
+ */
239
+ getSettings() {
240
+ return { ...this.settings };
241
+ }
242
+ /**
243
+ * Update settings
244
+ */
245
+ saveSettings(newSettings) {
246
+ // Validate maxConcurrentTasks
247
+ if (newSettings.maxConcurrentTasks !== undefined) {
248
+ newSettings.maxConcurrentTasks = Math.max(1, Math.min(10, newSettings.maxConcurrentTasks));
249
+ }
250
+ // Validate taskTimeoutMinutes (5 min to 4 hours)
251
+ if (newSettings.taskTimeoutMinutes !== undefined) {
252
+ newSettings.taskTimeoutMinutes = Math.max(5, Math.min(240, newSettings.taskTimeoutMinutes));
253
+ }
254
+ this.settings = { ...this.settings, ...newSettings };
255
+ try {
256
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
257
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
258
+ repository.save('queue', this.settings);
259
+ console.log('[TaskQueueManager] Settings saved to encrypted database');
260
+ }
261
+ else {
262
+ console.warn('[TaskQueueManager] SecureSettingsRepository not initialized, settings not persisted');
263
+ }
264
+ }
265
+ catch (error) {
266
+ console.error('[TaskQueueManager] Failed to save settings:', error);
267
+ }
268
+ // Process queue in case we increased concurrency
269
+ this.processQueue();
270
+ this.emitQueueUpdate();
271
+ }
272
+ // ===== Private Methods =====
273
+ /**
274
+ * Process the queue - start tasks if slots are available
275
+ */
276
+ async processQueue() {
277
+ while (this.canStartImmediately() && this.queuedTaskIds.length > 0) {
278
+ const nextTaskId = this.queuedTaskIds.shift();
279
+ const task = this.callbacks.getTaskById(nextTaskId);
280
+ if (task && task.status === 'queued') {
281
+ console.log(`[TaskQueueManager] Dequeuing task ${nextTaskId}`);
282
+ await this.startTask(task);
283
+ }
284
+ else {
285
+ console.log(`[TaskQueueManager] Skipping task ${nextTaskId} (not found or status changed)`);
286
+ }
287
+ }
288
+ }
289
+ /**
290
+ * Check if we can start a task immediately
291
+ */
292
+ canStartImmediately() {
293
+ return this.runningTaskIds.size < this.settings.maxConcurrentTasks;
294
+ }
295
+ /**
296
+ * Start a task
297
+ */
298
+ async startTask(task) {
299
+ this.runningTaskIds.add(task.id);
300
+ this.taskStartTimes.set(task.id, Date.now());
301
+ this.emitQueueUpdate();
302
+ try {
303
+ await this.callbacks.startTaskImmediate(task);
304
+ }
305
+ catch (error) {
306
+ console.error(`[TaskQueueManager] Failed to start task ${task.id}:`, error);
307
+ this.runningTaskIds.delete(task.id);
308
+ this.taskStartTimes.delete(task.id);
309
+ this.emitQueueUpdate();
310
+ }
311
+ }
312
+ /**
313
+ * Emit queue status update
314
+ */
315
+ emitQueueUpdate() {
316
+ this.callbacks.emitQueueUpdate(this.getStatus());
317
+ }
318
+ /**
319
+ * Check for tasks that have exceeded the timeout and clear them
320
+ */
321
+ async checkForTimedOutTasks() {
322
+ const now = Date.now();
323
+ const timeoutMs = this.settings.taskTimeoutMinutes * 60 * 1000;
324
+ const timedOutTasks = [];
325
+ // Find tasks that have exceeded the timeout
326
+ for (const [taskId, startTime] of this.taskStartTimes) {
327
+ const elapsed = now - startTime;
328
+ if (elapsed > timeoutMs) {
329
+ const elapsedMinutes = Math.round(elapsed / 60000);
330
+ console.log(`[TaskQueueManager] Task ${taskId} has timed out (running for ${elapsedMinutes} minutes, timeout: ${this.settings.taskTimeoutMinutes} minutes)`);
331
+ timedOutTasks.push(taskId);
332
+ }
333
+ }
334
+ // Process timed out tasks
335
+ for (const taskId of timedOutTasks) {
336
+ try {
337
+ // Notify daemon to handle the timeout (cancel task, cleanup resources)
338
+ await this.callbacks.onTaskTimeout(taskId);
339
+ // Remove from tracking (daemon will call onTaskFinished which also removes, but do it here just in case)
340
+ this.runningTaskIds.delete(taskId);
341
+ this.taskStartTimes.delete(taskId);
342
+ }
343
+ catch (error) {
344
+ console.error(`[TaskQueueManager] Error handling timeout for task ${taskId}:`, error);
345
+ // Force remove from tracking even if daemon callback fails
346
+ this.runningTaskIds.delete(taskId);
347
+ this.taskStartTimes.delete(taskId);
348
+ }
349
+ }
350
+ // If any tasks were cleared, process the queue and emit update
351
+ if (timedOutTasks.length > 0) {
352
+ await this.processQueue();
353
+ this.emitQueueUpdate();
354
+ }
355
+ }
356
+ /**
357
+ * Load settings from encrypted database
358
+ */
359
+ loadSettings() {
360
+ try {
361
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
362
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
363
+ const stored = repository.load('queue');
364
+ if (stored) {
365
+ // Merge with defaults to handle missing fields
366
+ console.log('[TaskQueueManager] Loaded settings from encrypted database');
367
+ return { ...types_1.DEFAULT_QUEUE_SETTINGS, ...stored };
368
+ }
369
+ }
370
+ }
371
+ catch (error) {
372
+ console.error('[TaskQueueManager] Failed to load settings:', error);
373
+ }
374
+ return { ...types_1.DEFAULT_QUEUE_SETTINGS };
375
+ }
376
+ }
377
+ exports.TaskQueueManager = TaskQueueManager;
378
+ TaskQueueManager.migrationCompleted = false;