cowork-os 0.3.88 → 0.3.90

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 (401) hide show
  1. package/README.md +168 -51
  2. package/dist/electron/electron/acp/agent-registry.js +9 -9
  3. package/dist/electron/electron/acp/handler.js +40 -37
  4. package/dist/electron/electron/acp/types.js +15 -15
  5. package/dist/electron/electron/activity/ActivityRepository.js +19 -19
  6. package/dist/electron/electron/agent/browser/browser-service.js +107 -111
  7. package/dist/electron/electron/agent/context-manager.js +69 -38
  8. package/dist/electron/electron/agent/custom-skill-loader.js +77 -59
  9. package/dist/electron/electron/agent/daemon.js +669 -326
  10. package/dist/electron/electron/agent/executor-assistant-output-utils.js +30 -0
  11. package/dist/electron/electron/agent/executor-canvas-utils.js +42 -0
  12. package/dist/electron/electron/agent/executor-completion-utils.js +241 -0
  13. package/dist/electron/electron/agent/executor-event-emitter.js +17 -0
  14. package/dist/electron/electron/agent/executor-helpers.js +159 -137
  15. package/dist/electron/electron/agent/executor-lifecycle-mutex.js +26 -0
  16. package/dist/electron/electron/agent/executor-llm-turn-utils.js +69 -0
  17. package/dist/electron/electron/agent/executor-loop-utils.js +195 -0
  18. package/dist/electron/electron/agent/executor-prompt-heuristics-utils.js +52 -0
  19. package/dist/electron/electron/agent/executor-tool-execution-utils.js +278 -0
  20. package/dist/electron/electron/agent/executor-workspace-preflight-utils.js +81 -0
  21. package/dist/electron/electron/agent/executor.js +2779 -2607
  22. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +44 -44
  23. package/dist/electron/electron/agent/llm/anthropic-provider.js +111 -29
  24. package/dist/electron/electron/agent/llm/azure-openai-provider.js +69 -67
  25. package/dist/electron/electron/agent/llm/bedrock-provider.js +242 -68
  26. package/dist/electron/electron/agent/llm/gemini-provider.js +82 -56
  27. package/dist/electron/electron/agent/llm/github-copilot-provider.js +19 -19
  28. package/dist/electron/electron/agent/llm/groq-provider.js +6 -6
  29. package/dist/electron/electron/agent/llm/image-utils.js +22 -18
  30. package/dist/electron/electron/agent/llm/kimi-provider.js +6 -6
  31. package/dist/electron/electron/agent/llm/ollama-provider.js +46 -45
  32. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +17 -15
  33. package/dist/electron/electron/agent/llm/openai-compatible.js +52 -51
  34. package/dist/electron/electron/agent/llm/openai-oauth.js +16 -16
  35. package/dist/electron/electron/agent/llm/openai-provider.js +237 -213
  36. package/dist/electron/electron/agent/llm/openrouter-provider.js +59 -57
  37. package/dist/electron/electron/agent/llm/pi-provider.js +51 -52
  38. package/dist/electron/electron/agent/llm/pricing.js +50 -48
  39. package/dist/electron/electron/agent/llm/provider-factory.js +565 -373
  40. package/dist/electron/electron/agent/llm/types.js +252 -207
  41. package/dist/electron/electron/agent/llm/xai-provider.js +6 -6
  42. package/dist/electron/electron/agent/queue-manager.js +23 -25
  43. package/dist/electron/electron/agent/sandbox/docker-sandbox.js +72 -70
  44. package/dist/electron/electron/agent/sandbox/macos-sandbox.js +40 -40
  45. package/dist/electron/electron/agent/sandbox/runner.js +32 -38
  46. package/dist/electron/electron/agent/sandbox/sandbox-factory.js +30 -30
  47. package/dist/electron/electron/agent/sandbox/security-utils.js +27 -27
  48. package/dist/electron/electron/agent/search/brave-provider.js +36 -36
  49. package/dist/electron/electron/agent/search/google-provider.js +27 -27
  50. package/dist/electron/electron/agent/search/provider-factory.js +48 -52
  51. package/dist/electron/electron/agent/search/serpapi-provider.js +33 -33
  52. package/dist/electron/electron/agent/search/tavily-provider.js +21 -21
  53. package/dist/electron/electron/agent/search/types.js +20 -20
  54. package/dist/electron/electron/agent/security/input-sanitizer.js +39 -39
  55. package/dist/electron/electron/agent/security/output-filter.js +29 -31
  56. package/dist/electron/electron/agent/skill-eligibility.js +3 -3
  57. package/dist/electron/electron/agent/skill-registry.js +41 -42
  58. package/dist/electron/electron/agent/skills/document.js +177 -174
  59. package/dist/electron/electron/agent/skills/image-generator.js +181 -170
  60. package/dist/electron/electron/agent/skills/organizer.js +30 -26
  61. package/dist/electron/electron/agent/skills/presentation.js +87 -91
  62. package/dist/electron/electron/agent/skills/spreadsheet.js +21 -21
  63. package/dist/electron/electron/agent/strategy/IntentRouter.js +26 -20
  64. package/dist/electron/electron/agent/strategy/TaskStrategyService.js +24 -24
  65. package/dist/electron/electron/agent/tools/apple-calendar-tools.js +51 -51
  66. package/dist/electron/electron/agent/tools/apple-reminders-tools.js +62 -62
  67. package/dist/electron/electron/agent/tools/box-tools.js +51 -41
  68. package/dist/electron/electron/agent/tools/browser-tools.js +258 -254
  69. package/dist/electron/electron/agent/tools/builtin-settings.js +108 -110
  70. package/dist/electron/electron/agent/tools/canvas-tools.js +201 -198
  71. package/dist/electron/electron/agent/tools/channel-tools.js +111 -109
  72. package/dist/electron/electron/agent/tools/cron-tools.js +153 -149
  73. package/dist/electron/electron/agent/tools/dropbox-tools.js +49 -45
  74. package/dist/electron/electron/agent/tools/edit-tools.js +38 -34
  75. package/dist/electron/electron/agent/tools/email-imap-tools.js +55 -46
  76. package/dist/electron/electron/agent/tools/file-tools.js +200 -162
  77. package/dist/electron/electron/agent/tools/git-tools.js +180 -0
  78. package/dist/electron/electron/agent/tools/glob-tools.js +49 -49
  79. package/dist/electron/electron/agent/tools/gmail-tools.js +50 -46
  80. package/dist/electron/electron/agent/tools/google-calendar-tools.js +39 -37
  81. package/dist/electron/electron/agent/tools/google-drive-tools.js +44 -43
  82. package/dist/electron/electron/agent/tools/grep-tools.js +115 -110
  83. package/dist/electron/electron/agent/tools/image-tools.js +21 -21
  84. package/dist/electron/electron/agent/tools/mention-tools.js +73 -73
  85. package/dist/electron/electron/agent/tools/monty-tools.js +120 -92
  86. package/dist/electron/electron/agent/tools/node-tools.js +112 -112
  87. package/dist/electron/electron/agent/tools/notion-tools.js +130 -92
  88. package/dist/electron/electron/agent/tools/onedrive-tools.js +57 -46
  89. package/dist/electron/electron/agent/tools/read-files.js +13 -11
  90. package/dist/electron/electron/agent/tools/registry.js +1810 -1481
  91. package/dist/electron/electron/agent/tools/search-tools.js +20 -20
  92. package/dist/electron/electron/agent/tools/sharepoint-tools.js +63 -50
  93. package/dist/electron/electron/agent/tools/shell-tools.js +115 -114
  94. package/dist/electron/electron/agent/tools/skill-tools.js +33 -39
  95. package/dist/electron/electron/agent/tools/system-tools.js +204 -206
  96. package/dist/electron/electron/agent/tools/vision-tools.js +212 -83
  97. package/dist/electron/electron/agent/tools/visual-tools.js +69 -66
  98. package/dist/electron/electron/agent/tools/voice-call-tools.js +50 -43
  99. package/dist/electron/electron/agent/tools/web-fetch-tools.js +141 -141
  100. package/dist/electron/electron/agent/tools/x-browser-scripts.js +4 -4
  101. package/dist/electron/electron/agent/tools/x-tools.js +245 -210
  102. package/dist/electron/electron/agents/AgentRoleRepository.js +58 -58
  103. package/dist/electron/electron/agents/AgentTeamItemRepository.js +14 -14
  104. package/dist/electron/electron/agents/AgentTeamMemberRepository.js +10 -10
  105. package/dist/electron/electron/agents/AgentTeamOrchestrator.js +421 -62
  106. package/dist/electron/electron/agents/AgentTeamRepository.js +20 -18
  107. package/dist/electron/electron/agents/AgentTeamRunRepository.js +28 -13
  108. package/dist/electron/electron/agents/AgentTeamThoughtRepository.js +133 -0
  109. package/dist/electron/electron/agents/CrossSignalService.js +43 -37
  110. package/dist/electron/electron/agents/FeedbackService.js +61 -55
  111. package/dist/electron/electron/agents/HeartbeatService.js +62 -60
  112. package/dist/electron/electron/agents/MentionRepository.js +32 -32
  113. package/dist/electron/electron/agents/TaskSubscriptionRepository.js +15 -15
  114. package/dist/electron/electron/agents/WorkingStateRepository.js +10 -10
  115. package/dist/electron/electron/agents/agent-dispatch.js +16 -14
  116. package/dist/electron/electron/agents/capabilityMatcher.js +169 -0
  117. package/dist/electron/electron/agents/mentions.js +59 -25
  118. package/dist/electron/electron/agents/role-persona.js +37 -37
  119. package/dist/electron/electron/canvas/canvas-manager.js +77 -77
  120. package/dist/electron/electron/canvas/canvas-preload.js +9 -9
  121. package/dist/electron/electron/canvas/canvas-protocol.js +50 -50
  122. package/dist/electron/electron/canvas/canvas-store.js +19 -19
  123. package/dist/electron/electron/control-plane/client.js +18 -18
  124. package/dist/electron/electron/control-plane/handlers.js +280 -256
  125. package/dist/electron/electron/control-plane/llm-configure.js +37 -35
  126. package/dist/electron/electron/control-plane/node-manager.js +10 -10
  127. package/dist/electron/electron/control-plane/protocol.js +96 -96
  128. package/dist/electron/electron/control-plane/remote-client.js +68 -68
  129. package/dist/electron/electron/control-plane/server.js +87 -82
  130. package/dist/electron/electron/control-plane/settings.js +39 -39
  131. package/dist/electron/electron/control-plane/ssh-tunnel.js +92 -94
  132. package/dist/electron/electron/control-plane/task-event-bridge-contract.js +33 -0
  133. package/dist/electron/electron/conway/conway-manager.js +266 -156
  134. package/dist/electron/electron/conway/conway-settings.js +6 -6
  135. package/dist/electron/electron/conway/conway-wallet.js +324 -0
  136. package/dist/electron/electron/cron/schedule.js +23 -23
  137. package/dist/electron/electron/cron/service.js +65 -60
  138. package/dist/electron/electron/cron/store.js +24 -24
  139. package/dist/electron/electron/cron/types.js +34 -31
  140. package/dist/electron/electron/cron/webhook.js +33 -33
  141. package/dist/electron/electron/database/SecureSettingsRepository.js +54 -54
  142. package/dist/electron/electron/database/TaskLabelRepository.js +10 -10
  143. package/dist/electron/electron/database/repositories.js +587 -260
  144. package/dist/electron/electron/database/schema.js +297 -86
  145. package/dist/electron/electron/extensions/declarative-connector-loader.js +247 -0
  146. package/dist/electron/electron/extensions/loader.js +76 -46
  147. package/dist/electron/electron/extensions/registry.js +87 -30
  148. package/dist/electron/electron/gateway/channel-registry.js +326 -279
  149. package/dist/electron/electron/gateway/channels/bluebubbles-client.js +61 -61
  150. package/dist/electron/electron/gateway/channels/bluebubbles.js +50 -50
  151. package/dist/electron/electron/gateway/channels/discord.js +164 -183
  152. package/dist/electron/electron/gateway/channels/email-client.js +80 -79
  153. package/dist/electron/electron/gateway/channels/email.js +120 -87
  154. package/dist/electron/electron/gateway/channels/google-chat.js +137 -120
  155. package/dist/electron/electron/gateway/channels/imessage-client.js +34 -34
  156. package/dist/electron/electron/gateway/channels/imessage.js +62 -64
  157. package/dist/electron/electron/gateway/channels/line-client.js +56 -56
  158. package/dist/electron/electron/gateway/channels/line.js +53 -53
  159. package/dist/electron/electron/gateway/channels/loom-client.js +276 -55
  160. package/dist/electron/electron/gateway/channels/matrix-client.js +64 -63
  161. package/dist/electron/electron/gateway/channels/matrix.js +60 -60
  162. package/dist/electron/electron/gateway/channels/mattermost-client.js +42 -42
  163. package/dist/electron/electron/gateway/channels/mattermost.js +55 -55
  164. package/dist/electron/electron/gateway/channels/signal-client.js +76 -87
  165. package/dist/electron/electron/gateway/channels/signal.js +68 -67
  166. package/dist/electron/electron/gateway/channels/slack.js +86 -80
  167. package/dist/electron/electron/gateway/channels/teams.js +112 -107
  168. package/dist/electron/electron/gateway/channels/telegram.js +245 -230
  169. package/dist/electron/electron/gateway/channels/twitch-client.js +86 -88
  170. package/dist/electron/electron/gateway/channels/twitch.js +42 -42
  171. package/dist/electron/electron/gateway/channels/whatsapp.js +222 -217
  172. package/dist/electron/electron/gateway/chat-transcript.js +25 -23
  173. package/dist/electron/electron/gateway/context-policy.js +14 -18
  174. package/dist/electron/electron/gateway/index.js +186 -164
  175. package/dist/electron/electron/gateway/infrastructure.js +45 -45
  176. package/dist/electron/electron/gateway/router-helpers.js +204 -179
  177. package/dist/electron/electron/gateway/router-rules.js +35 -30
  178. package/dist/electron/electron/gateway/router.js +1501 -1371
  179. package/dist/electron/electron/gateway/security.js +29 -23
  180. package/dist/electron/electron/gateway/session.js +4 -4
  181. package/dist/electron/electron/gateway/tunnel.js +97 -97
  182. package/dist/electron/electron/gateway/whatsapp-command-utils.js +69 -69
  183. package/dist/electron/electron/git/ComparisonService.js +237 -0
  184. package/dist/electron/electron/git/GitService.js +296 -0
  185. package/dist/electron/electron/git/WorktreeManager.js +318 -0
  186. package/dist/electron/electron/guardrails/guardrail-manager.js +29 -35
  187. package/dist/electron/electron/hooks/gmail-watcher.js +50 -50
  188. package/dist/electron/electron/hooks/mappings.js +47 -47
  189. package/dist/electron/electron/hooks/server.js +114 -104
  190. package/dist/electron/electron/hooks/settings.js +55 -49
  191. package/dist/electron/electron/hooks/types.js +21 -21
  192. package/dist/electron/electron/ipc/canvas-handlers.js +8 -8
  193. package/dist/electron/electron/ipc/channel-config-sanitizer.js +47 -0
  194. package/dist/electron/electron/ipc/handlers.js +1170 -864
  195. package/dist/electron/electron/ipc/image-viewer-ocr.js +12 -12
  196. package/dist/electron/electron/ipc/mission-control-handlers.js +24 -24
  197. package/dist/electron/electron/ipc/worktree-handlers.js +127 -0
  198. package/dist/electron/electron/main.js +157 -130
  199. package/dist/electron/electron/mcp/client/MCPClientManager.js +67 -59
  200. package/dist/electron/electron/mcp/client/MCPServerConnection.js +37 -37
  201. package/dist/electron/electron/mcp/client/transports/SSETransport.js +37 -37
  202. package/dist/electron/electron/mcp/client/transports/StdioTransport.js +29 -29
  203. package/dist/electron/electron/mcp/client/transports/WebSocketTransport.js +31 -31
  204. package/dist/electron/electron/mcp/host/MCPHostServer.js +35 -35
  205. package/dist/electron/electron/mcp/host/ToolAdapter.js +6 -5
  206. package/dist/electron/electron/mcp/oauth/connector-oauth.js +97 -105
  207. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +374 -375
  208. package/dist/electron/electron/mcp/settings.js +36 -36
  209. package/dist/electron/electron/mcp/types.js +21 -21
  210. package/dist/electron/electron/memory/ChatGPTImporter.js +64 -48
  211. package/dist/electron/electron/memory/MarkdownMemoryIndexService.js +117 -59
  212. package/dist/electron/electron/memory/MemoryService.js +127 -46
  213. package/dist/electron/electron/memory/RelationshipMemoryService.js +63 -57
  214. package/dist/electron/electron/memory/UserProfileService.js +73 -72
  215. package/dist/electron/electron/memory/WorkspaceKitContext.js +60 -58
  216. package/dist/electron/electron/memory/local-embedding.js +63 -7
  217. package/dist/electron/electron/notifications/service.js +5 -5
  218. package/dist/electron/electron/notifications/store.js +22 -22
  219. package/dist/electron/electron/preload.js +680 -423
  220. package/dist/electron/electron/reports/AgentPerformanceReviewService.js +41 -25
  221. package/dist/electron/electron/reports/StandupReportService.js +36 -39
  222. package/dist/electron/electron/reports/task-export.js +13 -12
  223. package/dist/electron/electron/sandbox/monty-engine.js +48 -28
  224. package/dist/electron/electron/security/concurrency.js +14 -13
  225. package/dist/electron/electron/security/monty-tool-policy.js +21 -21
  226. package/dist/electron/electron/security/policy-manager.js +78 -78
  227. package/dist/electron/electron/security/project-access.js +23 -23
  228. package/dist/electron/electron/settings/appearance-manager.js +58 -41
  229. package/dist/electron/electron/settings/box-manager.js +6 -6
  230. package/dist/electron/electron/settings/dropbox-manager.js +6 -6
  231. package/dist/electron/electron/settings/google-workspace-manager.js +6 -6
  232. package/dist/electron/electron/settings/memory-features-manager.js +6 -6
  233. package/dist/electron/electron/settings/notion-manager.js +6 -6
  234. package/dist/electron/electron/settings/onedrive-manager.js +6 -6
  235. package/dist/electron/electron/settings/personality-manager.js +141 -106
  236. package/dist/electron/electron/settings/sharepoint-manager.js +6 -6
  237. package/dist/electron/electron/settings/x-manager.js +8 -8
  238. package/dist/electron/electron/tailscale/exposure.js +21 -21
  239. package/dist/electron/electron/tailscale/settings.js +21 -21
  240. package/dist/electron/electron/tailscale/tailscale.js +40 -40
  241. package/dist/electron/electron/tray/QuickInputWindow.js +73 -53
  242. package/dist/electron/electron/tray/TrayManager.js +145 -128
  243. package/dist/electron/electron/updater/update-manager.js +118 -77
  244. package/dist/electron/electron/utils/box-api.js +22 -26
  245. package/dist/electron/electron/utils/dropbox-api.js +22 -23
  246. package/dist/electron/electron/utils/env-migration.js +112 -101
  247. package/dist/electron/electron/utils/gmail-api.js +8 -11
  248. package/dist/electron/electron/utils/google-calendar-api.js +8 -11
  249. package/dist/electron/electron/utils/google-workspace-api.js +21 -24
  250. package/dist/electron/electron/utils/google-workspace-auth.js +13 -13
  251. package/dist/electron/electron/utils/google-workspace-oauth.js +48 -49
  252. package/dist/electron/electron/utils/json-utils.js +26 -27
  253. package/dist/electron/electron/utils/loom.js +61 -0
  254. package/dist/electron/electron/utils/notion-api.js +14 -21
  255. package/dist/electron/electron/utils/onedrive-api.js +17 -24
  256. package/dist/electron/electron/utils/pdf-parser.js +9 -9
  257. package/dist/electron/electron/utils/pptx-extractor.js +68 -68
  258. package/dist/electron/electron/utils/process.js +11 -11
  259. package/dist/electron/electron/utils/runtime-mode.js +15 -15
  260. package/dist/electron/electron/utils/safe-storage.js +6 -6
  261. package/dist/electron/electron/utils/sharepoint-api.js +16 -21
  262. package/dist/electron/electron/utils/temp-workspace.js +28 -15
  263. package/dist/electron/electron/utils/user-data-dir.js +13 -13
  264. package/dist/electron/electron/utils/validation.js +469 -165
  265. package/dist/electron/electron/utils/x-cli.js +32 -40
  266. package/dist/electron/electron/voice/VoiceService.js +92 -92
  267. package/dist/electron/electron/voice/voice-settings-manager.js +41 -41
  268. package/dist/electron/shared/agent-preferences.js +21 -14
  269. package/dist/electron/shared/channelMessages.js +190 -193
  270. package/dist/electron/shared/llm-provider-catalog.js +168 -168
  271. package/dist/electron/shared/plan-utils.js +10 -8
  272. package/dist/electron/shared/task-event-status-map.js +31 -0
  273. package/dist/electron/shared/types.js +1002 -932
  274. package/docs/changelog.md +22 -1
  275. package/docs/project-status.md +44 -15
  276. package/docs/relationship-agent-uat.md +14 -3
  277. package/docs/vps-linux.md +44 -0
  278. package/package.json +1 -1
  279. package/resources/plugin-packs/content-marketing/cowork.plugin.json +63 -0
  280. package/resources/plugin-packs/customer-support/cowork.plugin.json +71 -0
  281. package/resources/plugin-packs/data-analysis/cowork.plugin.json +60 -0
  282. package/resources/plugin-packs/devops/cowork.plugin.json +72 -0
  283. package/resources/plugin-packs/sales-crm/cowork.plugin.json +74 -0
  284. package/resources/skills/crypto-execution/crypto-execution.json +79 -0
  285. package/resources/skills/crypto-execution/scripts/crypto_trading.py +36 -0
  286. package/resources/skills/crypto-trading/scripts/crypto_trading.py +293 -0
  287. package/resources/skills/crypto-trading.json +86 -0
  288. package/resources/skills/email-marketing-bible.json +34 -0
  289. package/resources/skills/trading-foundation/scripts/__pycache__/trading_foundation.cpython-314.pyc +0 -0
  290. package/resources/skills/trading-foundation/scripts/trading_foundation.py +2243 -0
  291. package/resources/skills/trading-foundation/tests/__pycache__/test_trading_foundation.cpython-314.pyc +0 -0
  292. package/resources/skills/trading-foundation/tests/test_trading_foundation.py +290 -0
  293. package/resources/skills/trading-foundation/trading-foundation.json +423 -0
  294. package/src/electron/agent/__tests__/context-manager-compaction.test.ts +34 -0
  295. package/src/electron/agent/__tests__/executor-entrypoints.test.ts +57 -0
  296. package/src/electron/agent/__tests__/executor-event-emitter.test.ts +14 -0
  297. package/src/electron/agent/__tests__/executor-lifecycle-mutex.test.ts +24 -0
  298. package/src/electron/agent/context-manager.ts +31 -0
  299. package/src/electron/agent/custom-skill-loader.ts +22 -0
  300. package/src/electron/agent/daemon.ts +342 -2
  301. package/src/electron/agent/executor-assistant-output-utils.ts +43 -0
  302. package/src/electron/agent/executor-canvas-utils.ts +45 -0
  303. package/src/electron/agent/executor-completion-utils.ts +330 -0
  304. package/src/electron/agent/executor-event-emitter.ts +13 -0
  305. package/src/electron/agent/executor-helpers.ts +6 -1
  306. package/src/electron/agent/executor-lifecycle-mutex.ts +25 -0
  307. package/src/electron/agent/executor-llm-turn-utils.ts +147 -0
  308. package/src/electron/agent/executor-loop-utils.ts +290 -0
  309. package/src/electron/agent/executor-prompt-heuristics-utils.ts +64 -0
  310. package/src/electron/agent/executor-tool-execution-utils.ts +356 -0
  311. package/src/electron/agent/executor-workspace-preflight-utils.ts +137 -0
  312. package/src/electron/agent/executor.ts +1460 -1651
  313. package/src/electron/agent/llm/__tests__/bedrock-display-names.test.ts +72 -0
  314. package/src/electron/agent/llm/__tests__/bedrock-provider.test.ts +140 -3
  315. package/src/electron/agent/llm/anthropic-provider.ts +96 -0
  316. package/src/electron/agent/llm/bedrock-provider.ts +208 -5
  317. package/src/electron/agent/llm/pricing.ts +2 -0
  318. package/src/electron/agent/llm/provider-factory.ts +185 -26
  319. package/src/electron/agent/llm/types.ts +19 -0
  320. package/src/electron/agent/strategy/IntentRouter.ts +8 -0
  321. package/src/electron/agent/strategy/TaskStrategyService.ts +5 -5
  322. package/src/electron/agent/tools/__tests__/read-files.test.ts +1 -1
  323. package/src/electron/agent/tools/git-tools.ts +194 -0
  324. package/src/electron/agent/tools/registry.ts +12 -0
  325. package/src/electron/agent/tools/vision-tools.ts +115 -10
  326. package/src/electron/agents/AgentTeamOrchestrator.ts +430 -10
  327. package/src/electron/agents/AgentTeamRunRepository.ts +36 -4
  328. package/src/electron/agents/AgentTeamThoughtRepository.ts +155 -0
  329. package/src/electron/agents/capabilityMatcher.ts +210 -0
  330. package/src/electron/control-plane/__tests__/task-event-bridge-contract.test.ts +26 -0
  331. package/src/electron/control-plane/handlers.ts +2 -30
  332. package/src/electron/control-plane/task-event-bridge-contract.ts +32 -0
  333. package/src/electron/conway/conway-manager.ts +54 -9
  334. package/src/electron/conway/conway-wallet.ts +56 -1
  335. package/src/electron/database/__tests__/repositories-agent.test.ts +68 -1
  336. package/src/electron/database/repositories.ts +290 -2
  337. package/src/electron/database/schema.ts +212 -0
  338. package/src/electron/extensions/declarative-connector-loader.ts +235 -0
  339. package/src/electron/extensions/loader.ts +37 -4
  340. package/src/electron/extensions/registry.ts +74 -1
  341. package/src/electron/extensions/types.ts +97 -3
  342. package/src/electron/gateway/channels/email.ts +2 -2
  343. package/src/electron/git/ComparisonService.ts +267 -0
  344. package/src/electron/git/GitService.ts +354 -0
  345. package/src/electron/git/WorktreeManager.ts +330 -0
  346. package/src/electron/ipc/channel-config-sanitizer.ts +1 -0
  347. package/src/electron/ipc/handlers.ts +279 -28
  348. package/src/electron/ipc/worktree-handlers.ts +144 -0
  349. package/src/electron/main.ts +8 -0
  350. package/src/electron/preload.ts +94 -7
  351. package/src/electron/reports/task-export.ts +1 -0
  352. package/src/electron/settings/personality-manager.ts +24 -2
  353. package/src/electron/utils/validation.ts +74 -33
  354. package/src/renderer/App.tsx +236 -42
  355. package/src/renderer/__tests__/sidebar-helpers.test.ts +126 -0
  356. package/src/renderer/__tests__/task-event-status-map.test.ts +26 -0
  357. package/src/renderer/components/AgentTeamsPanel.tsx +12 -1
  358. package/src/renderer/components/CollaborativeThoughtsPanel.tsx +392 -0
  359. package/src/renderer/components/ComparisonCreateModal.tsx +257 -0
  360. package/src/renderer/components/ComparisonView.tsx +280 -0
  361. package/src/renderer/components/ConwaySettings.tsx +8 -7
  362. package/src/renderer/components/InlineSpreadsheetPreview.tsx +251 -0
  363. package/src/renderer/components/MainContent.tsx +567 -42
  364. package/src/renderer/components/MissionControlPanel.tsx +2 -19
  365. package/src/renderer/components/MultiLlmSelectionPanel.tsx +213 -0
  366. package/src/renderer/components/Onboarding/Onboarding.tsx +45 -0
  367. package/src/renderer/components/OnboardingModal.tsx +1 -1
  368. package/src/renderer/components/Settings.tsx +24 -1
  369. package/src/renderer/components/Sidebar.tsx +211 -20
  370. package/src/renderer/components/TaskTimeline.tsx +49 -0
  371. package/src/renderer/components/TaskView.tsx +32 -0
  372. package/src/renderer/components/WorktreeSettings.tsx +171 -0
  373. package/src/renderer/hooks/useOnboardingFlow.ts +103 -5
  374. package/src/renderer/index.html +1 -1
  375. package/src/renderer/styles/index.css +1213 -116
  376. package/src/shared/__tests__/agent-preferences.test.ts +1 -1
  377. package/src/shared/agent-preferences.ts +1 -1
  378. package/src/shared/llm-provider-catalog.ts +2 -2
  379. package/src/shared/task-event-status-map.ts +30 -0
  380. package/src/shared/types.ts +232 -3
  381. package/dist/renderer/assets/index-B_joCCPi.js +0 -3539
  382. package/dist/renderer/assets/index-MuAJQK_1.css +0 -1
  383. package/dist/renderer/cowork-os-logo.png +0 -0
  384. package/dist/renderer/density-bootstrap.js +0 -12
  385. package/dist/renderer/index.html +0 -15
  386. package/node_modules/@typescript-eslint/eslint-plugin/dist/tsconfig.build.tsbuildinfo +0 -1
  387. package/node_modules/@typescript-eslint/parser/dist/tsconfig.build.tsbuildinfo +0 -1
  388. package/node_modules/@typescript-eslint/project-service/dist/tsconfig.build.tsbuildinfo +0 -1
  389. package/node_modules/@typescript-eslint/scope-manager/dist/tsconfig.build.tsbuildinfo +0 -1
  390. package/node_modules/@typescript-eslint/tsconfig-utils/dist/tsconfig.build.tsbuildinfo +0 -1
  391. package/node_modules/@typescript-eslint/type-utils/dist/tsconfig.build.tsbuildinfo +0 -1
  392. package/node_modules/@typescript-eslint/types/dist/tsconfig.build.tsbuildinfo +0 -1
  393. package/node_modules/@typescript-eslint/typescript-estree/dist/tsconfig.build.tsbuildinfo +0 -1
  394. package/node_modules/@typescript-eslint/utils/dist/tsconfig.build.tsbuildinfo +0 -1
  395. package/node_modules/@typescript-eslint/visitor-keys/dist/tsconfig.build.tsbuildinfo +0 -1
  396. package/node_modules/color-convert/CHANGELOG.md +0 -54
  397. package/node_modules/esprima/ChangeLog +0 -235
  398. package/node_modules/libsignal/node_modules/protobufjs/CHANGELOG.md +0 -935
  399. package/node_modules/libsignal/node_modules/protobufjs/scripts/changelog.js +0 -150
  400. package/node_modules/source-map/CHANGELOG.md +0 -301
  401. package/node_modules/which/CHANGELOG.md +0 -166
package/README.md CHANGED
@@ -18,66 +18,57 @@
18
18
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
19
19
  <a href="https://www.apple.com/macos/"><img src="https://img.shields.io/badge/platform-macOS-blue.svg" alt="macOS"></a>
20
20
  <a href="https://www.electronjs.org/"><img src="https://img.shields.io/badge/electron-40.4.1-47848F.svg" alt="Electron"></a>
21
- <a href="https://github.com/sponsors/CoWork-OS"><img src="https://img.shields.io/badge/Sponsor-CoWork%20OS-ff4d4f?logo=github-sponsors&logoColor=white" alt="Sponsor on GitHub"></a>
22
21
  </p>
23
22
 
24
23
  **The operating system for personal AI assistants**
25
24
 
26
- Your AI needs a secure home. CoWork OS provides the runtime, security layers, and I/O channels to run AI agents across WhatsApp, Telegram, Discord, Slack, Microsoft Teams, Google Chat, iMessage, Signal, Mattermost, Matrix, Twitch, LINE, BlueBubbles, and Email with the control you expect from an operating system.
25
+ CoWork OS is a local-first runtime for secure, multi-channel AI agents. It combines a desktop control plane, gateway channels, plugin/skill extensibility, and strict execution guardrails so assistants can operate safely across real workflows.
27
26
 
28
- | | |
27
+ | Capability | Current scope |
29
28
  |---|---|
30
- | **20+ AI Providers** | Claude, OpenAI, Gemini, Bedrock, OpenRouter, Ollama (free/local), Groq, xAI, Kimi, Mistral, Cerebras, MiniMax, Qwen, Copilot, and more |
29
+ | **30+ LLM Providers** | 11 built-in providers plus 20+ custom provider types (OpenAI/Anthropic-compatible, Copilot, Cerebras, Mistral, MiniMax, Qwen, and more) |
31
30
  | **14 Messaging Channels** | WhatsApp, Telegram, Discord, Slack, Teams, Google Chat, iMessage, Signal, Mattermost, Matrix, Twitch, LINE, BlueBubbles, Email |
32
31
  | **9 Enterprise Connectors** | Salesforce, Jira, HubSpot, Zendesk, ServiceNow, Linear, Asana, Okta, Resend |
33
- | **6 Cloud Storage** | Notion, Box, OneDrive, Google Workspace (Drive/Gmail/Calendar), Dropbox, SharePoint |
34
- | **Voice Calls** | Outbound phone calls via ElevenLabs Agents |
35
- | **Agent Teams** | Multi-agent collaboration with shared checklists and coordinated runs |
36
- | **Workspace Kit** | Workspace `.cowork/` kit (projects, access rules, context injection, per-workspace settings) |
37
- | **Intent Routing** | Per-message routing across chat/advice/planning/execution/mixed modes |
38
- | **Relationship Memory** | Layered continuity memory (identity, preferences, context, history, commitments) |
39
- | **Completion-First** | Answer-first responses, soft-deadline fallback, timeout recovery finalization |
40
- | **Security-First** | 2800+ unit tests, configurable guardrails, approval workflows, gateway hardening |
41
- | **Local-First** | Your data stays on your machine. BYOK (Bring Your Own Key) |
42
-
43
- ### What’s new in 0.3.73
44
-
45
- - **Release and install reliability**: fixed publish-blocking type/lint regressions so npm desktop/client releases can be published reliably.
46
- - **Task config validation**: stricter `personalityId` validation for task `agentConfig` avoids malformed IDs reaching task execution.
47
- - **Control-plane/LLM error handling alignment**: tests and runtime error codes now match shared validation shapes for predictable client behavior.
48
- - **Workspace auto-switch confidence**: improved ambiguous temp-task preflight handling when preferred workspace signals are available.
49
-
50
- ### Current Branch Enhancements (Unreleased)
51
-
52
- - **Executor reliability**: tasks can no longer get stuck in `executing` status after follow-ups; varied-failure loop detection nudges the agent to switch strategy after 5 persistent tool failures.
53
- - **Smarter artifact handling**: read-only analysis steps no longer require artifact output; verification evidence is skipped when the task already produced files; document creation only triggers for explicit DOCX/PDF requests (attachment filenames no longer cause false positives).
54
- - **Gateway connection resilience**: Slack Socket Mode uses relaxed ping/pong timeouts (15s/60s) to reduce reconnection churn; WhatsApp adds connection-flap detection with enforced backoff when rapid disconnect/reconnect cycles are detected.
55
- - **XLSX file support**: Excel spreadsheets (.xlsx/.xls) can now be read and extracted as tab-separated text in the file viewer, with support for formulas, rich text, and dates.
56
- - **Attachment chips in chat**: user message bubbles now show compact attachment chips instead of raw file listings; the collapsible bubble toggle shows both "Show more" and "Show less".
57
- - **User identity hardening**: the personality prompt now explicitly instructs the LLM to ignore names found in file paths, filenames, and OS metadata when a preferred name is stored, preventing identity leakage.
58
- - **Hooks auto-token**: enabled hooks server auto-generates a missing authentication token instead of silently disabling.
59
- - **Reduced log noise**: suppressed zero-count startup messages for plugins, canvas sessions, and legacy settings; demoted MCP stderr to debug level.
60
- - **Relationship-agent runtime**: tasks are now intent-routed (`chat`, `advice`, `planning`, `execution`, `mixed`) and strategy-bound before execution.
61
- - **Answer-first behavior**: strategy-marked prompts emit a direct user answer early, then continue with deeper execution when needed.
62
- - **Soft-deadline execution control**: long-running steps switch to best-effort finalization before hard timeout to reduce unfinished tasks.
63
- - **Timeout cancellation recovery**: timeout-triggered cancellation paths now attempt best-effort final answers instead of silent termination.
64
- - **Relationship memory controls**: new layered memory CRUD and commitment APIs (`open`, `done`, `due soon`) are exposed through IPC/preload and renderer memory settings.
32
+ | **6 Cloud Storage Integrations** | Notion, Box, OneDrive, Google Workspace (Drive/Gmail/Calendar), Dropbox, SharePoint |
33
+ | **100+ Built-in Skills** | Developer, productivity, communication, document, and automation skills in `resources/skills/` |
34
+ | **Declarative Plugin System** | Plugins can register skills, agent roles, connectors, and slash commands via manifests |
35
+ | **5 Built-in Plugin Packs** | content-marketing, customer-support, data-analysis, devops, sales-crm |
36
+ | **Agent Teams + Child Control** | Coordinated multi-agent runs with child-task control and telemetry export |
37
+ | **Collaborative Mode** | Ephemeral multi-agent teams with real-time thought sharing and leader synthesis |
38
+ | **Multi-LLM Mode** | Send the same task to multiple providers/models with judge-based synthesis |
39
+ | **Git Worktree Isolation** | Tasks run in isolated git worktrees with auto-commit, merge, and cleanup |
40
+ | **Agent Comparison Mode** | Run the same task across agents/models side by side and compare outputs |
41
+ | **Multimodal Runtime** | Vision/image support across providers, task image attachments, spreadsheet preview/extraction |
42
+ | **Security-First Execution** | Approval workflows, IPC/input validation hardening, redaction, and gateway safety controls |
43
+ | **Local-First + BYOK** | Your data and keys stay with you |
44
+
45
+ ### Platform Capability Overview
46
+
47
+ - **Agent runtime and orchestration**: task-based execution, dynamic re-planning, intent-aware behavior, agent teams, collaborative mode, multi-LLM mode, agent comparison, and child-task controls.
48
+ - **LLM stack**: broad provider support (built-in + custom provider types), model flexibility, multi-LLM synthesis, and multimodal execution.
49
+ - **Multichannel interaction**: unified operations across 14 chat/email channels with desktop + headless runtime support.
50
+ - **Integrations and productivity**: enterprise connectors, cloud-storage integrations, and native document/spreadsheet/presentation workflows.
51
+ - **Extensibility**: built-in skills, custom skills, declarative plugins/plugin packs, and MCP client/host/registry support.
52
+ - **Memory and continuity**: persistent memory, relationship context, and commitment lifecycle management.
53
+ - **Security and governance**: approval workflows, configurable guardrails, per-context restrictions, validation hardening, and sensitive-data redaction.
54
+ - **Git isolation**: per-task git worktree isolation with auto-commit, merge, conflict detection, and cleanup.
55
+ - **Operator UX**: live task timelines, talk mode, i18n, file previews (including XLSX), task pinning, collaborative thoughts panel, and control-plane telemetry/export surfaces.
56
+
57
+ For release-by-release history, see `CHANGELOG.md`.
65
58
 
66
59
  > **Status**: macOS desktop app + headless/server mode (Linux/VPS). Cross-platform desktop support planned.
67
60
 
68
61
  ---
69
62
 
70
- ## Relationship-Agent Validation (Recommended)
63
+ ## Upgrade Validation (Recommended)
71
64
 
72
- Use this quick runbook after upgrades:
65
+ 1. Create a task and confirm it transitions to `completed` with a final user-facing answer.
66
+ 2. Send a strategic prompt and verify answer-first behavior (direct answer before deeper execution).
67
+ 3. Attach an image to a task/follow-up and verify multimodal analysis is available.
68
+ 4. In **Settings > Memory**, verify relationship memory and commitments can be edited/forgotten.
69
+ 5. In **Settings > LLM**, verify provider/model selection (including Bedrock display names) is functioning.
73
70
 
74
- 1. Send a strategic prompt in a channel (for example: "How should I position this product, who should I target, and what should I achieve?").
75
- 2. Confirm you receive a direct answer early (not only research chatter).
76
- 3. Confirm task ends in `completed` with a final response.
77
- 4. If timeout occurs, confirm logs show timeout recovery/finalization instead of silent cancellation.
78
- 5. In **Settings > Memory**, confirm relationship items and commitments can be edited/forgotten and commitment status can be toggled.
79
-
80
- For a full acceptance checklist, see `docs/relationship-agent-uat.md`.
71
+ For a detailed acceptance checklist, see `docs/relationship-agent-uat.md`.
81
72
 
82
73
  ---
83
74
 
@@ -253,6 +244,102 @@ For production/persistent setup and Docker/systemd options, use:
253
244
 
254
245
  ---
255
246
 
247
+ ## Uninstall
248
+
249
+ There are two ways to uninstall CoWork OS depending on whether you want to keep local data.
250
+
251
+ ### Option 1: Uninstall app/binaries only (keep database)
252
+
253
+ This removes installed application files and CLI/package artifacts while keeping workspace, settings, and task data for later restore.
254
+
255
+ - macOS app (manual drag-installed build):
256
+
257
+ ```bash
258
+ pkill -f '/Applications/CoWork OS.app' || true
259
+ rm -rf "/Applications/CoWork OS.app"
260
+ ```
261
+
262
+ - npm global package install:
263
+
264
+ ```bash
265
+ npm uninstall -g cowork-os
266
+ ```
267
+
268
+ - Local install in a folder:
269
+
270
+ ```bash
271
+ rm -rf ~/cowork-run
272
+ ```
273
+
274
+ - Source/development clone:
275
+
276
+ ```bash
277
+ rm -rf /path/to/CoWork-OS
278
+ ```
279
+
280
+ - VPS/headless Docker install:
281
+
282
+ ```bash
283
+ cd /path/to/docker-compose-dir
284
+ docker compose down
285
+ ```
286
+
287
+ - VPS/headless systemd install:
288
+
289
+ ```bash
290
+ sudo systemctl stop cowork-os cowork-os-node
291
+ sudo systemctl disable cowork-os cowork-os-node
292
+ sudo rm -f /etc/systemd/system/cowork-os.service
293
+ sudo rm -f /etc/systemd/system/cowork-os-node.service
294
+ sudo systemctl daemon-reload
295
+ ```
296
+
297
+ Data locations to keep (choose the one used by your install):
298
+
299
+ - macOS (Electron): `~/Library/Application Support/cowork-os/`
300
+ - Linux desktop/Electron: `~/.config/cowork-os/`
301
+ - Linux daemon/headless fallback: `~/.cowork/`
302
+ - Node daemon custom path: value passed in `COWORK_USER_DATA_DIR` or `--user-data-dir`
303
+ - Docker/systemd example paths: named volume `cowork_data`, `/var/lib/cowork-os`, and any host bind mount in `/workspace`
304
+
305
+ ### Option 2: Full uninstall + data deletion (database included) — irrecoverable
306
+
307
+ > ⚠️ **WARNING:** This removes all application data and settings (tasks, tasks timeline, memory, credentials, channel/session state, and the local database). **All data will be deleted and everything will be gone forever.**
308
+
309
+ Use this only when you are sure you want to destroy local state.
310
+
311
+ - Delete all user-data locations:
312
+
313
+ ```bash
314
+ rm -rf ~/Library/Application\ Support/cowork-os
315
+ rm -rf ~/.config/cowork-os
316
+ rm -rf ~/.cowork
317
+ ```
318
+
319
+ - Remove with custom user-data path:
320
+
321
+ ```bash
322
+ rm -rf "$COWORK_USER_DATA_DIR"
323
+ ```
324
+
325
+ - Fully remove Docker install data:
326
+
327
+ ```bash
328
+ cd /path/to/docker-compose-dir
329
+ docker compose down -v
330
+ docker compose rm -f
331
+ ```
332
+
333
+ - Fully remove systemd/headless example data:
334
+
335
+ ```bash
336
+ sudo rm -rf /var/lib/cowork-os
337
+ ```
338
+
339
+ After the data wipe, also remove remaining app binaries/shell package entries from Option 1 if you haven't already.
340
+
341
+ ---
342
+
256
343
  ### Security Verified by ZeroLeaks
257
344
 
258
345
  <p align="center">
@@ -302,7 +389,7 @@ For production/persistent setup and Docker/systemd options, use:
302
389
 
303
390
  - Claude Code-style tools: `glob`, `grep`, `edit_file`
304
391
  - Browser automation with Playwright
305
- - 85+ bundled skills for popular services
392
+ - 100+ bundled skills for popular services
306
393
  - MCP (Model Context Protocol) support for extensibility
307
394
 
308
395
  ---
@@ -460,11 +547,18 @@ Configure in **Settings** > **Appearance**.
460
547
 
461
548
  - **Task-Based Workflow**: Multi-step execution with plan-execute-observe loops
462
549
  - **Dynamic Re-Planning**: Agent can revise its plan mid-execution
463
- - **85+ Built-in Skills**: GitHub, Slack, Notion, Spotify, Apple Notes, and more
550
+ - **100+ Built-in Skills**: GitHub, Slack, Notion, Spotify, Apple Notes, and more
464
551
  - **Document Creation**: Excel, Word, PDF, PowerPoint with professional formatting
465
552
  - **Persistent Memory**: Cross-session context with privacy-aware observation capture
466
553
  - **Workspace Kit**: `.cowork/` project kit + markdown indexing with context injection
467
554
  - **Agent Teams**: Multi-agent collaboration with shared checklists, coordinated runs, and team management UI
555
+ - **Collaborative Mode**: Auto-create ephemeral teams where multiple agents work on the same task, sharing thoughts in real-time via the Collaborative Thoughts Panel
556
+ - **Multi-LLM Mode**: Send the same task to multiple LLM providers/models simultaneously, with a judge agent synthesizing the best result
557
+ - **Agent Comparison Mode**: Compare agent or model outputs side by side using the ComparisonService and dedicated comparison UI
558
+ - **Git Worktree Isolation**: Tasks can run in isolated git worktrees with automatic branch creation, auto-commit, merge back to base branch, conflict detection, and cleanup
559
+ - **Task Pinning**: Pin important tasks in the sidebar for quick access regardless of sort order
560
+ - **Wrap-Up Task**: Gracefully wrap up running tasks instead of hard-cancelling, allowing the agent to finish its current thought
561
+ - **Capability Matcher**: Auto-select the best agents for a task based on capability matching
468
562
  - **Performance Reviews**: Score and review agent-role outcomes, with autonomy-level recommendations
469
563
  - **Voice Calls**: Outbound phone calls via ElevenLabs Agents (list agents, list numbers, initiate calls)
470
564
  - **Vision**: Analyze workspace images (screenshots, photos, diagrams) via `analyze_image` tool (OpenAI, Anthropic, or Gemini)
@@ -591,6 +685,10 @@ Coordinate multiple agents working together on complex tasks with shared state.
591
685
  | **Queue-Friendly** | Team runs respect global concurrency limits by default |
592
686
  | **UI Panel** | Full React UI for creating, managing, and monitoring agent teams |
593
687
  | **Data Persistence** | SQLite-backed repositories for teams, members, items, and runs |
688
+ | **Collaborative Mode** | Auto-create ephemeral teams where agents share real-time thoughts during execution |
689
+ | **Multi-LLM Mode** | Dispatch the same task to multiple LLM providers with judge-based synthesis |
690
+ | **Collaborative Thoughts** | Real-time thought panel shows agent reasoning, analysis, and synthesis as it happens |
691
+ | **Wrap-Up Support** | Gracefully wrap up team runs instead of hard-cancelling |
594
692
 
595
693
  Configure in **Mission Control** > **Teams**.
596
694
 
@@ -627,6 +725,9 @@ Claude Code-style tools for efficient code navigation and editing:
627
725
  | **glob** | Fast pattern-based file search (e.g., `**/*.ts`, `src/**/*.tsx`) |
628
726
  | **grep** | Regex content search across files with context lines |
629
727
  | **edit_file** | Surgical file editing with find-and-replace |
728
+ | **git_commit** | Commit changes in the workspace (or worktree) with a message |
729
+ | **git_diff** | View staged/unstaged changes in the workspace |
730
+ | **git_branch** | List, create, or switch branches |
630
731
 
631
732
  ### Browser Automation
632
733
 
@@ -710,7 +811,7 @@ Customize agent behavior via Settings or conversation:
710
811
  ┌─────────────────────────────────────────────────────────────────┐
711
812
  │ Execution Layer │
712
813
  │ File Operations | Document Skills | Browser Automation │
713
- │ LLM Providers (20+) | Search Providers (4) | MCP Client │
814
+ │ LLM Providers (30+) | Search Providers (4) | MCP Client │
714
815
  └─────────────────────────────────────────────────────────────────┘
715
816
 
716
817
  ┌─────────────────────────────────────────────────────────────────┐
@@ -2124,7 +2225,7 @@ Configure these in **Settings** > **LLM Provider** by entering API keys/tokens,
2124
2225
 
2125
2226
  ---
2126
2227
 
2127
- ## Built-in Skills (85+)
2228
+ ## Built-in Skills (100+)
2128
2229
 
2129
2230
  | Category | Skills |
2130
2231
  |----------|--------|
@@ -2137,6 +2238,8 @@ Configure these in **Settings** > **LLM Provider** by entering API keys/tokens,
2137
2238
  | **Frontend** | Frontend Design, React Native Best Practices |
2138
2239
  | **Data** | Supabase SDK Patterns |
2139
2240
  | **Search** | Local Web Search (SearXNG), Bird |
2241
+ | **Finance** | Crypto Trading, Crypto Execution, Trading Foundation |
2242
+ | **Marketing** | Email Marketing Bible |
2140
2243
  | **Use Cases** | Booking Options, Draft Reply, Family Digest, Household Capture, Newsletter Digest, Transaction Scan |
2141
2244
 
2142
2245
  ---
@@ -2260,7 +2363,7 @@ Users must comply with their model provider's terms:
2260
2363
 
2261
2364
  ### Completed
2262
2365
 
2263
- - [x] Multi-provider LLM support (20+ providers including Groq, xAI, Kimi, GitHub Copilot, OpenAI/Anthropic-compatible)
2366
+ - [x] Multi-provider LLM support (30+ provider types including Groq, xAI, Kimi, GitHub Copilot, OpenAI/Anthropic-compatible)
2264
2367
  - [x] Multi-channel messaging (14 channels)
2265
2368
  - [x] Configurable guardrails and security
2266
2369
  - [x] Browser automation with Playwright
@@ -2270,7 +2373,7 @@ Users must comply with their model provider's terms:
2270
2373
  - [x] WebSocket Control Plane with API
2271
2374
  - [x] Tailscale and SSH remote access
2272
2375
  - [x] Personality system
2273
- - [x] 85+ bundled skills (code reviewer, PRD, multi-PR review, frontend design, local websearch, developer growth, React Native, Supabase, bird)
2376
+ - [x] 100+ bundled skills (code reviewer, PRD, multi-PR review, frontend design, local websearch, developer growth, React Native, Supabase, bird)
2274
2377
  - [x] 2800+ unit tests
2275
2378
  - [x] Docker-based sandboxing (cross-platform)
2276
2379
  - [x] Per-context security policies (DM vs group)
@@ -2314,6 +2417,20 @@ Users must comply with their model provider's terms:
2314
2417
  - [x] Docker and VPS deployment support (Dockerfiles, docker-compose, systemd units)
2315
2418
  - [x] Dedicated workspaces for scheduled cron jobs (auto-created from temp workspace)
2316
2419
  - [x] Hook wake requests for heartbeat processing, including queueing, coalescing, and immediate scheduling
2420
+ - [x] Git Worktree Isolation (per-task isolated git worktrees with auto-commit, merge, conflict detection, cleanup)
2421
+ - [x] Collaborative Mode (ephemeral multi-agent teams with real-time thought sharing and leader synthesis)
2422
+ - [x] Multi-LLM Mode (dispatch same task to multiple LLM providers with judge-based synthesis)
2423
+ - [x] Agent Comparison Mode (run same task across agents/models and compare outputs side by side)
2424
+ - [x] Task Pinning (pin/unpin tasks in sidebar for quick access)
2425
+ - [x] Wrap-Up Task (graceful task completion instead of hard cancel)
2426
+ - [x] Git Tools (git_commit, git_diff, git_branch for worktree-aware operations)
2427
+ - [x] Capability Matcher (auto-select agents based on task requirements)
2428
+ - [x] Executor modular refactoring (event emitter, lifecycle mutex, modular utility files)
2429
+ - [x] Task event bridge contract (shared allowlist for control-plane event bridging)
2430
+ - [x] Collaborative Thoughts Panel (real-time UI for agent thinking during collaborative mode)
2431
+ - [x] Scroll-to-bottom button in task view
2432
+ - [x] VPS uninstall/removal documentation
2433
+ - [x] New skill packs: Crypto Trading, Crypto Execution, Trading Foundation, Email Marketing Bible
2317
2434
 
2318
2435
  ### Planned
2319
2436
 
@@ -33,15 +33,15 @@ class ACPAgentRegistry {
33
33
  id: `local:${role.name}`,
34
34
  name: role.displayName,
35
35
  description: role.description || `${role.displayName} agent`,
36
- version: '1.0.0',
37
- provider: 'CoWork OS',
36
+ version: "1.0.0",
37
+ provider: "CoWork OS",
38
38
  icon: role.icon,
39
39
  capabilities,
40
- origin: 'local',
40
+ origin: "local",
41
41
  localRoleId: role.id,
42
42
  registeredAt: Date.now(),
43
43
  lastActiveAt: Date.now(),
44
- status: role.isActive ? 'available' : 'offline',
44
+ status: role.isActive ? "available" : "offline",
45
45
  };
46
46
  }
47
47
  /**
@@ -71,7 +71,7 @@ class ACPAgentRegistry {
71
71
  if (remote)
72
72
  return remote;
73
73
  // Check local agents
74
- if (agentId.startsWith('local:')) {
74
+ if (agentId.startsWith("local:")) {
75
75
  const roleName = agentId.slice(6); // Remove 'local:' prefix
76
76
  const role = roles.find((r) => r.name === roleName && r.isActive);
77
77
  if (role)
@@ -107,12 +107,12 @@ class ACPAgentRegistry {
107
107
  * Register a remote agent
108
108
  */
109
109
  registerRemoteAgent(params) {
110
- const id = `remote:${(0, crypto_1.randomUUID)().slice(0, 8)}-${params.name.toLowerCase().replace(/\s+/g, '-')}`;
110
+ const id = `remote:${(0, crypto_1.randomUUID)().slice(0, 8)}-${params.name.toLowerCase().replace(/\s+/g, "-")}`;
111
111
  const card = {
112
112
  id,
113
113
  name: params.name,
114
114
  description: params.description,
115
- version: params.version || '1.0.0',
115
+ version: params.version || "1.0.0",
116
116
  provider: params.provider,
117
117
  icon: params.icon,
118
118
  capabilities: (params.capabilities || []).map((c) => ({
@@ -125,10 +125,10 @@ class ACPAgentRegistry {
125
125
  outputContentTypes: params.outputContentTypes,
126
126
  supportsStreaming: params.supportsStreaming,
127
127
  endpoint: params.endpoint,
128
- origin: 'remote',
128
+ origin: "remote",
129
129
  registeredAt: Date.now(),
130
130
  lastActiveAt: Date.now(),
131
- status: 'available',
131
+ status: "available",
132
132
  metadata: params.metadata,
133
133
  };
134
134
  this.remoteAgents.set(id, card);
@@ -29,12 +29,15 @@ function getACPRegistry() {
29
29
  // ===== Validation helpers =====
30
30
  function requireAuth(client) {
31
31
  if (!client.isAuthenticated) {
32
- throw { code: protocol_1.ErrorCodes.UNAUTHORIZED, message: 'Authentication required' };
32
+ throw { code: protocol_1.ErrorCodes.UNAUTHORIZED, message: "Authentication required" };
33
33
  }
34
34
  }
35
35
  function requireString(value, field) {
36
- if (typeof value !== 'string' || !value.trim()) {
37
- throw { code: protocol_1.ErrorCodes.INVALID_PARAMS, message: `${field} is required and must be a non-empty string` };
36
+ if (typeof value !== "string" || !value.trim()) {
37
+ throw {
38
+ code: protocol_1.ErrorCodes.INVALID_PARAMS,
39
+ message: `${field} is required and must be a non-empty string`,
40
+ };
38
41
  }
39
42
  return value.trim();
40
43
  }
@@ -57,7 +60,7 @@ function registerACPMethods(server, deps) {
57
60
  server.registerMethod(types_1.ACPMethods.AGENT_GET, async (client, params) => {
58
61
  requireAuth(client);
59
62
  const p = params;
60
- const agentId = requireString(p?.agentId, 'agentId');
63
+ const agentId = requireString(p?.agentId, "agentId");
61
64
  const roles = deps.getActiveRoles();
62
65
  const agent = reg.getAgent(agentId, roles);
63
66
  if (!agent) {
@@ -69,8 +72,8 @@ function registerACPMethods(server, deps) {
69
72
  server.registerMethod(types_1.ACPMethods.AGENT_REGISTER, async (client, params) => {
70
73
  requireAuth(client);
71
74
  const p = (params || {});
72
- requireString(p.name, 'name');
73
- requireString(p.description, 'description');
75
+ requireString(p.name, "name");
76
+ requireString(p.description, "description");
74
77
  const card = reg.registerRemoteAgent(p);
75
78
  // Broadcast registration event
76
79
  server.broadcast(types_1.ACPEvents.AGENT_REGISTERED, { agent: card });
@@ -80,9 +83,9 @@ function registerACPMethods(server, deps) {
80
83
  server.registerMethod(types_1.ACPMethods.AGENT_UNREGISTER, async (client, params) => {
81
84
  requireAuth(client);
82
85
  const p = params;
83
- const agentId = requireString(p?.agentId, 'agentId');
84
- if (!agentId.startsWith('remote:')) {
85
- throw { code: protocol_1.ErrorCodes.INVALID_PARAMS, message: 'Only remote agents can be unregistered' };
86
+ const agentId = requireString(p?.agentId, "agentId");
87
+ if (!agentId.startsWith("remote:")) {
88
+ throw { code: protocol_1.ErrorCodes.INVALID_PARAMS, message: "Only remote agents can be unregistered" };
86
89
  }
87
90
  const removed = reg.unregisterRemoteAgent(agentId);
88
91
  if (!removed) {
@@ -96,8 +99,8 @@ function registerACPMethods(server, deps) {
96
99
  server.registerMethod(types_1.ACPMethods.MESSAGE_SEND, async (client, params) => {
97
100
  requireAuth(client);
98
101
  const p = (params || {});
99
- const to = requireString(p.to, 'to');
100
- const body = requireString(p.body, 'body');
102
+ const to = requireString(p.to, "to");
103
+ const body = requireString(p.body, "body");
101
104
  // Validate target agent exists
102
105
  const roles = deps.getActiveRoles();
103
106
  const targetAgent = reg.getAgent(to, roles);
@@ -108,12 +111,12 @@ function registerACPMethods(server, deps) {
108
111
  id: (0, crypto_1.randomUUID)(),
109
112
  from: p.from || `client:${client.id}`,
110
113
  to,
111
- contentType: p.contentType || 'text/plain',
114
+ contentType: p.contentType || "text/plain",
112
115
  body,
113
116
  data: p.data,
114
117
  correlationId: p.correlationId,
115
118
  replyTo: p.replyTo,
116
- priority: p.priority || 'normal',
119
+ priority: p.priority || "normal",
117
120
  timestamp: Date.now(),
118
121
  ttlMs: p.ttlMs,
119
122
  };
@@ -123,15 +126,15 @@ function registerACPMethods(server, deps) {
123
126
  server.broadcast(types_1.ACPEvents.MESSAGE_RECEIVED, { message });
124
127
  // If the target is a local agent and we have task creation capability,
125
128
  // auto-create a task from high-priority messages
126
- if (targetAgent.origin === 'local' &&
129
+ if (targetAgent.origin === "local" &&
127
130
  targetAgent.localRoleId &&
128
- p.priority === 'high' &&
131
+ p.priority === "high" &&
129
132
  deps.createTask) {
130
133
  try {
131
134
  const result = await deps.createTask({
132
135
  title: `ACP message from ${message.from}`,
133
136
  prompt: body,
134
- workspaceId: '', // Will use default workspace
137
+ workspaceId: "", // Will use default workspace
135
138
  assignedAgentRoleId: targetAgent.localRoleId,
136
139
  });
137
140
  message.data = { ...(message.data || {}), autoTaskId: result.taskId };
@@ -146,7 +149,7 @@ function registerACPMethods(server, deps) {
146
149
  server.registerMethod(types_1.ACPMethods.MESSAGE_LIST, async (client, params) => {
147
150
  requireAuth(client);
148
151
  const p = (params || {});
149
- const agentId = requireString(p.agentId, 'agentId');
152
+ const agentId = requireString(p.agentId, "agentId");
150
153
  const drain = p.drain === true;
151
154
  const messages = reg.getMessages(agentId, drain);
152
155
  return { messages };
@@ -155,9 +158,9 @@ function registerACPMethods(server, deps) {
155
158
  server.registerMethod(types_1.ACPMethods.TASK_CREATE, async (client, params) => {
156
159
  requireAuth(client);
157
160
  const p = (params || {});
158
- const assigneeId = requireString(p.assigneeId, 'assigneeId');
159
- const title = requireString(p.title, 'title');
160
- const prompt = requireString(p.prompt, 'prompt');
161
+ const assigneeId = requireString(p.assigneeId, "assigneeId");
162
+ const title = requireString(p.title, "title");
163
+ const prompt = requireString(p.prompt, "prompt");
161
164
  // Validate assignee exists
162
165
  const roles = deps.getActiveRoles();
163
166
  const assignee = reg.getAgent(assigneeId, roles);
@@ -170,26 +173,26 @@ function registerACPMethods(server, deps) {
170
173
  assigneeId,
171
174
  title,
172
175
  prompt,
173
- status: 'pending',
176
+ status: "pending",
174
177
  workspaceId: p.workspaceId,
175
178
  createdAt: Date.now(),
176
179
  updatedAt: Date.now(),
177
180
  };
178
181
  // If assignee is a local agent, delegate to the CoWork task system
179
- if (assignee.origin === 'local' && assignee.localRoleId && deps.createTask) {
182
+ if (assignee.origin === "local" && assignee.localRoleId && deps.createTask) {
180
183
  try {
181
184
  const result = await deps.createTask({
182
185
  title,
183
186
  prompt,
184
- workspaceId: p.workspaceId || '',
187
+ workspaceId: p.workspaceId || "",
185
188
  assignedAgentRoleId: assignee.localRoleId,
186
189
  });
187
190
  acpTask.coworkTaskId = result.taskId;
188
- acpTask.status = 'running';
191
+ acpTask.status = "running";
189
192
  }
190
193
  catch (err) {
191
- acpTask.status = 'failed';
192
- acpTask.error = err?.message || 'Failed to create task';
194
+ acpTask.status = "failed";
195
+ acpTask.error = err?.message || "Failed to create task";
193
196
  }
194
197
  }
195
198
  acpTasks.set(acpTask.id, acpTask);
@@ -201,7 +204,7 @@ function registerACPMethods(server, deps) {
201
204
  server.registerMethod(types_1.ACPMethods.TASK_GET, async (client, params) => {
202
205
  requireAuth(client);
203
206
  const p = params;
204
- const taskId = requireString(p?.taskId, 'taskId');
207
+ const taskId = requireString(p?.taskId, "taskId");
205
208
  const acpTask = acpTasks.get(taskId);
206
209
  if (!acpTask) {
207
210
  throw { code: protocol_1.ErrorCodes.INVALID_PARAMS, message: `ACP task not found: ${taskId}` };
@@ -211,17 +214,17 @@ function registerACPMethods(server, deps) {
211
214
  const coworkTask = deps.getTask(acpTask.coworkTaskId);
212
215
  if (coworkTask) {
213
216
  const statusMap = {
214
- pending: 'pending',
215
- running: 'running',
216
- completed: 'completed',
217
- failed: 'failed',
218
- cancelled: 'cancelled',
217
+ pending: "pending",
218
+ running: "running",
219
+ completed: "completed",
220
+ failed: "failed",
221
+ cancelled: "cancelled",
219
222
  };
220
223
  const newStatus = statusMap[coworkTask.status] || acpTask.status;
221
224
  if (newStatus !== acpTask.status) {
222
225
  acpTask.status = newStatus;
223
226
  acpTask.updatedAt = Date.now();
224
- if (newStatus === 'completed' || newStatus === 'failed' || newStatus === 'cancelled') {
227
+ if (newStatus === "completed" || newStatus === "failed" || newStatus === "cancelled") {
225
228
  acpTask.completedAt = Date.now();
226
229
  }
227
230
  if (coworkTask.error) {
@@ -254,12 +257,12 @@ function registerACPMethods(server, deps) {
254
257
  server.registerMethod(types_1.ACPMethods.TASK_CANCEL, async (client, params) => {
255
258
  requireAuth(client);
256
259
  const p = params;
257
- const taskId = requireString(p?.taskId, 'taskId');
260
+ const taskId = requireString(p?.taskId, "taskId");
258
261
  const acpTask = acpTasks.get(taskId);
259
262
  if (!acpTask) {
260
263
  throw { code: protocol_1.ErrorCodes.INVALID_PARAMS, message: `ACP task not found: ${taskId}` };
261
264
  }
262
- if (acpTask.status === 'completed' || acpTask.status === 'cancelled') {
265
+ if (acpTask.status === "completed" || acpTask.status === "cancelled") {
263
266
  throw { code: protocol_1.ErrorCodes.INVALID_PARAMS, message: `Task is already ${acpTask.status}` };
264
267
  }
265
268
  // Cancel the underlying CoWork task if it exists
@@ -271,14 +274,14 @@ function registerACPMethods(server, deps) {
271
274
  // Best-effort cancellation
272
275
  }
273
276
  }
274
- acpTask.status = 'cancelled';
277
+ acpTask.status = "cancelled";
275
278
  acpTask.updatedAt = Date.now();
276
279
  acpTask.completedAt = Date.now();
277
280
  // Broadcast cancellation event
278
281
  server.broadcast(types_1.ACPEvents.TASK_UPDATED, { task: acpTask });
279
282
  return { task: acpTask };
280
283
  });
281
- console.log('[ACP] Registered 10 ACP method handlers on Control Plane');
284
+ console.log("[ACP] Registered 10 ACP method handlers on Control Plane");
282
285
  }
283
286
  /**
284
287
  * Cleanup ACP state (call on shutdown)