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.
- package/README.md +168 -51
- package/dist/electron/electron/acp/agent-registry.js +9 -9
- package/dist/electron/electron/acp/handler.js +40 -37
- package/dist/electron/electron/acp/types.js +15 -15
- package/dist/electron/electron/activity/ActivityRepository.js +19 -19
- package/dist/electron/electron/agent/browser/browser-service.js +107 -111
- package/dist/electron/electron/agent/context-manager.js +69 -38
- package/dist/electron/electron/agent/custom-skill-loader.js +77 -59
- package/dist/electron/electron/agent/daemon.js +669 -326
- package/dist/electron/electron/agent/executor-assistant-output-utils.js +30 -0
- package/dist/electron/electron/agent/executor-canvas-utils.js +42 -0
- package/dist/electron/electron/agent/executor-completion-utils.js +241 -0
- package/dist/electron/electron/agent/executor-event-emitter.js +17 -0
- package/dist/electron/electron/agent/executor-helpers.js +159 -137
- package/dist/electron/electron/agent/executor-lifecycle-mutex.js +26 -0
- package/dist/electron/electron/agent/executor-llm-turn-utils.js +69 -0
- package/dist/electron/electron/agent/executor-loop-utils.js +195 -0
- package/dist/electron/electron/agent/executor-prompt-heuristics-utils.js +52 -0
- package/dist/electron/electron/agent/executor-tool-execution-utils.js +278 -0
- package/dist/electron/electron/agent/executor-workspace-preflight-utils.js +81 -0
- package/dist/electron/electron/agent/executor.js +2779 -2607
- package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +44 -44
- package/dist/electron/electron/agent/llm/anthropic-provider.js +111 -29
- package/dist/electron/electron/agent/llm/azure-openai-provider.js +69 -67
- package/dist/electron/electron/agent/llm/bedrock-provider.js +242 -68
- package/dist/electron/electron/agent/llm/gemini-provider.js +82 -56
- package/dist/electron/electron/agent/llm/github-copilot-provider.js +19 -19
- package/dist/electron/electron/agent/llm/groq-provider.js +6 -6
- package/dist/electron/electron/agent/llm/image-utils.js +22 -18
- package/dist/electron/electron/agent/llm/kimi-provider.js +6 -6
- package/dist/electron/electron/agent/llm/ollama-provider.js +46 -45
- package/dist/electron/electron/agent/llm/openai-compatible-provider.js +17 -15
- package/dist/electron/electron/agent/llm/openai-compatible.js +52 -51
- package/dist/electron/electron/agent/llm/openai-oauth.js +16 -16
- package/dist/electron/electron/agent/llm/openai-provider.js +237 -213
- package/dist/electron/electron/agent/llm/openrouter-provider.js +59 -57
- package/dist/electron/electron/agent/llm/pi-provider.js +51 -52
- package/dist/electron/electron/agent/llm/pricing.js +50 -48
- package/dist/electron/electron/agent/llm/provider-factory.js +565 -373
- package/dist/electron/electron/agent/llm/types.js +252 -207
- package/dist/electron/electron/agent/llm/xai-provider.js +6 -6
- package/dist/electron/electron/agent/queue-manager.js +23 -25
- package/dist/electron/electron/agent/sandbox/docker-sandbox.js +72 -70
- package/dist/electron/electron/agent/sandbox/macos-sandbox.js +40 -40
- package/dist/electron/electron/agent/sandbox/runner.js +32 -38
- package/dist/electron/electron/agent/sandbox/sandbox-factory.js +30 -30
- package/dist/electron/electron/agent/sandbox/security-utils.js +27 -27
- package/dist/electron/electron/agent/search/brave-provider.js +36 -36
- package/dist/electron/electron/agent/search/google-provider.js +27 -27
- package/dist/electron/electron/agent/search/provider-factory.js +48 -52
- package/dist/electron/electron/agent/search/serpapi-provider.js +33 -33
- package/dist/electron/electron/agent/search/tavily-provider.js +21 -21
- package/dist/electron/electron/agent/search/types.js +20 -20
- package/dist/electron/electron/agent/security/input-sanitizer.js +39 -39
- package/dist/electron/electron/agent/security/output-filter.js +29 -31
- package/dist/electron/electron/agent/skill-eligibility.js +3 -3
- package/dist/electron/electron/agent/skill-registry.js +41 -42
- package/dist/electron/electron/agent/skills/document.js +177 -174
- package/dist/electron/electron/agent/skills/image-generator.js +181 -170
- package/dist/electron/electron/agent/skills/organizer.js +30 -26
- package/dist/electron/electron/agent/skills/presentation.js +87 -91
- package/dist/electron/electron/agent/skills/spreadsheet.js +21 -21
- package/dist/electron/electron/agent/strategy/IntentRouter.js +26 -20
- package/dist/electron/electron/agent/strategy/TaskStrategyService.js +24 -24
- package/dist/electron/electron/agent/tools/apple-calendar-tools.js +51 -51
- package/dist/electron/electron/agent/tools/apple-reminders-tools.js +62 -62
- package/dist/electron/electron/agent/tools/box-tools.js +51 -41
- package/dist/electron/electron/agent/tools/browser-tools.js +258 -254
- package/dist/electron/electron/agent/tools/builtin-settings.js +108 -110
- package/dist/electron/electron/agent/tools/canvas-tools.js +201 -198
- package/dist/electron/electron/agent/tools/channel-tools.js +111 -109
- package/dist/electron/electron/agent/tools/cron-tools.js +153 -149
- package/dist/electron/electron/agent/tools/dropbox-tools.js +49 -45
- package/dist/electron/electron/agent/tools/edit-tools.js +38 -34
- package/dist/electron/electron/agent/tools/email-imap-tools.js +55 -46
- package/dist/electron/electron/agent/tools/file-tools.js +200 -162
- package/dist/electron/electron/agent/tools/git-tools.js +180 -0
- package/dist/electron/electron/agent/tools/glob-tools.js +49 -49
- package/dist/electron/electron/agent/tools/gmail-tools.js +50 -46
- package/dist/electron/electron/agent/tools/google-calendar-tools.js +39 -37
- package/dist/electron/electron/agent/tools/google-drive-tools.js +44 -43
- package/dist/electron/electron/agent/tools/grep-tools.js +115 -110
- package/dist/electron/electron/agent/tools/image-tools.js +21 -21
- package/dist/electron/electron/agent/tools/mention-tools.js +73 -73
- package/dist/electron/electron/agent/tools/monty-tools.js +120 -92
- package/dist/electron/electron/agent/tools/node-tools.js +112 -112
- package/dist/electron/electron/agent/tools/notion-tools.js +130 -92
- package/dist/electron/electron/agent/tools/onedrive-tools.js +57 -46
- package/dist/electron/electron/agent/tools/read-files.js +13 -11
- package/dist/electron/electron/agent/tools/registry.js +1810 -1481
- package/dist/electron/electron/agent/tools/search-tools.js +20 -20
- package/dist/electron/electron/agent/tools/sharepoint-tools.js +63 -50
- package/dist/electron/electron/agent/tools/shell-tools.js +115 -114
- package/dist/electron/electron/agent/tools/skill-tools.js +33 -39
- package/dist/electron/electron/agent/tools/system-tools.js +204 -206
- package/dist/electron/electron/agent/tools/vision-tools.js +212 -83
- package/dist/electron/electron/agent/tools/visual-tools.js +69 -66
- package/dist/electron/electron/agent/tools/voice-call-tools.js +50 -43
- package/dist/electron/electron/agent/tools/web-fetch-tools.js +141 -141
- package/dist/electron/electron/agent/tools/x-browser-scripts.js +4 -4
- package/dist/electron/electron/agent/tools/x-tools.js +245 -210
- package/dist/electron/electron/agents/AgentRoleRepository.js +58 -58
- package/dist/electron/electron/agents/AgentTeamItemRepository.js +14 -14
- package/dist/electron/electron/agents/AgentTeamMemberRepository.js +10 -10
- package/dist/electron/electron/agents/AgentTeamOrchestrator.js +421 -62
- package/dist/electron/electron/agents/AgentTeamRepository.js +20 -18
- package/dist/electron/electron/agents/AgentTeamRunRepository.js +28 -13
- package/dist/electron/electron/agents/AgentTeamThoughtRepository.js +133 -0
- package/dist/electron/electron/agents/CrossSignalService.js +43 -37
- package/dist/electron/electron/agents/FeedbackService.js +61 -55
- package/dist/electron/electron/agents/HeartbeatService.js +62 -60
- package/dist/electron/electron/agents/MentionRepository.js +32 -32
- package/dist/electron/electron/agents/TaskSubscriptionRepository.js +15 -15
- package/dist/electron/electron/agents/WorkingStateRepository.js +10 -10
- package/dist/electron/electron/agents/agent-dispatch.js +16 -14
- package/dist/electron/electron/agents/capabilityMatcher.js +169 -0
- package/dist/electron/electron/agents/mentions.js +59 -25
- package/dist/electron/electron/agents/role-persona.js +37 -37
- package/dist/electron/electron/canvas/canvas-manager.js +77 -77
- package/dist/electron/electron/canvas/canvas-preload.js +9 -9
- package/dist/electron/electron/canvas/canvas-protocol.js +50 -50
- package/dist/electron/electron/canvas/canvas-store.js +19 -19
- package/dist/electron/electron/control-plane/client.js +18 -18
- package/dist/electron/electron/control-plane/handlers.js +280 -256
- package/dist/electron/electron/control-plane/llm-configure.js +37 -35
- package/dist/electron/electron/control-plane/node-manager.js +10 -10
- package/dist/electron/electron/control-plane/protocol.js +96 -96
- package/dist/electron/electron/control-plane/remote-client.js +68 -68
- package/dist/electron/electron/control-plane/server.js +87 -82
- package/dist/electron/electron/control-plane/settings.js +39 -39
- package/dist/electron/electron/control-plane/ssh-tunnel.js +92 -94
- package/dist/electron/electron/control-plane/task-event-bridge-contract.js +33 -0
- package/dist/electron/electron/conway/conway-manager.js +266 -156
- package/dist/electron/electron/conway/conway-settings.js +6 -6
- package/dist/electron/electron/conway/conway-wallet.js +324 -0
- package/dist/electron/electron/cron/schedule.js +23 -23
- package/dist/electron/electron/cron/service.js +65 -60
- package/dist/electron/electron/cron/store.js +24 -24
- package/dist/electron/electron/cron/types.js +34 -31
- package/dist/electron/electron/cron/webhook.js +33 -33
- package/dist/electron/electron/database/SecureSettingsRepository.js +54 -54
- package/dist/electron/electron/database/TaskLabelRepository.js +10 -10
- package/dist/electron/electron/database/repositories.js +587 -260
- package/dist/electron/electron/database/schema.js +297 -86
- package/dist/electron/electron/extensions/declarative-connector-loader.js +247 -0
- package/dist/electron/electron/extensions/loader.js +76 -46
- package/dist/electron/electron/extensions/registry.js +87 -30
- package/dist/electron/electron/gateway/channel-registry.js +326 -279
- package/dist/electron/electron/gateway/channels/bluebubbles-client.js +61 -61
- package/dist/electron/electron/gateway/channels/bluebubbles.js +50 -50
- package/dist/electron/electron/gateway/channels/discord.js +164 -183
- package/dist/electron/electron/gateway/channels/email-client.js +80 -79
- package/dist/electron/electron/gateway/channels/email.js +120 -87
- package/dist/electron/electron/gateway/channels/google-chat.js +137 -120
- package/dist/electron/electron/gateway/channels/imessage-client.js +34 -34
- package/dist/electron/electron/gateway/channels/imessage.js +62 -64
- package/dist/electron/electron/gateway/channels/line-client.js +56 -56
- package/dist/electron/electron/gateway/channels/line.js +53 -53
- package/dist/electron/electron/gateway/channels/loom-client.js +276 -55
- package/dist/electron/electron/gateway/channels/matrix-client.js +64 -63
- package/dist/electron/electron/gateway/channels/matrix.js +60 -60
- package/dist/electron/electron/gateway/channels/mattermost-client.js +42 -42
- package/dist/electron/electron/gateway/channels/mattermost.js +55 -55
- package/dist/electron/electron/gateway/channels/signal-client.js +76 -87
- package/dist/electron/electron/gateway/channels/signal.js +68 -67
- package/dist/electron/electron/gateway/channels/slack.js +86 -80
- package/dist/electron/electron/gateway/channels/teams.js +112 -107
- package/dist/electron/electron/gateway/channels/telegram.js +245 -230
- package/dist/electron/electron/gateway/channels/twitch-client.js +86 -88
- package/dist/electron/electron/gateway/channels/twitch.js +42 -42
- package/dist/electron/electron/gateway/channels/whatsapp.js +222 -217
- package/dist/electron/electron/gateway/chat-transcript.js +25 -23
- package/dist/electron/electron/gateway/context-policy.js +14 -18
- package/dist/electron/electron/gateway/index.js +186 -164
- package/dist/electron/electron/gateway/infrastructure.js +45 -45
- package/dist/electron/electron/gateway/router-helpers.js +204 -179
- package/dist/electron/electron/gateway/router-rules.js +35 -30
- package/dist/electron/electron/gateway/router.js +1501 -1371
- package/dist/electron/electron/gateway/security.js +29 -23
- package/dist/electron/electron/gateway/session.js +4 -4
- package/dist/electron/electron/gateway/tunnel.js +97 -97
- package/dist/electron/electron/gateway/whatsapp-command-utils.js +69 -69
- package/dist/electron/electron/git/ComparisonService.js +237 -0
- package/dist/electron/electron/git/GitService.js +296 -0
- package/dist/electron/electron/git/WorktreeManager.js +318 -0
- package/dist/electron/electron/guardrails/guardrail-manager.js +29 -35
- package/dist/electron/electron/hooks/gmail-watcher.js +50 -50
- package/dist/electron/electron/hooks/mappings.js +47 -47
- package/dist/electron/electron/hooks/server.js +114 -104
- package/dist/electron/electron/hooks/settings.js +55 -49
- package/dist/electron/electron/hooks/types.js +21 -21
- package/dist/electron/electron/ipc/canvas-handlers.js +8 -8
- package/dist/electron/electron/ipc/channel-config-sanitizer.js +47 -0
- package/dist/electron/electron/ipc/handlers.js +1170 -864
- package/dist/electron/electron/ipc/image-viewer-ocr.js +12 -12
- package/dist/electron/electron/ipc/mission-control-handlers.js +24 -24
- package/dist/electron/electron/ipc/worktree-handlers.js +127 -0
- package/dist/electron/electron/main.js +157 -130
- package/dist/electron/electron/mcp/client/MCPClientManager.js +67 -59
- package/dist/electron/electron/mcp/client/MCPServerConnection.js +37 -37
- package/dist/electron/electron/mcp/client/transports/SSETransport.js +37 -37
- package/dist/electron/electron/mcp/client/transports/StdioTransport.js +29 -29
- package/dist/electron/electron/mcp/client/transports/WebSocketTransport.js +31 -31
- package/dist/electron/electron/mcp/host/MCPHostServer.js +35 -35
- package/dist/electron/electron/mcp/host/ToolAdapter.js +6 -5
- package/dist/electron/electron/mcp/oauth/connector-oauth.js +97 -105
- package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +374 -375
- package/dist/electron/electron/mcp/settings.js +36 -36
- package/dist/electron/electron/mcp/types.js +21 -21
- package/dist/electron/electron/memory/ChatGPTImporter.js +64 -48
- package/dist/electron/electron/memory/MarkdownMemoryIndexService.js +117 -59
- package/dist/electron/electron/memory/MemoryService.js +127 -46
- package/dist/electron/electron/memory/RelationshipMemoryService.js +63 -57
- package/dist/electron/electron/memory/UserProfileService.js +73 -72
- package/dist/electron/electron/memory/WorkspaceKitContext.js +60 -58
- package/dist/electron/electron/memory/local-embedding.js +63 -7
- package/dist/electron/electron/notifications/service.js +5 -5
- package/dist/electron/electron/notifications/store.js +22 -22
- package/dist/electron/electron/preload.js +680 -423
- package/dist/electron/electron/reports/AgentPerformanceReviewService.js +41 -25
- package/dist/electron/electron/reports/StandupReportService.js +36 -39
- package/dist/electron/electron/reports/task-export.js +13 -12
- package/dist/electron/electron/sandbox/monty-engine.js +48 -28
- package/dist/electron/electron/security/concurrency.js +14 -13
- package/dist/electron/electron/security/monty-tool-policy.js +21 -21
- package/dist/electron/electron/security/policy-manager.js +78 -78
- package/dist/electron/electron/security/project-access.js +23 -23
- package/dist/electron/electron/settings/appearance-manager.js +58 -41
- package/dist/electron/electron/settings/box-manager.js +6 -6
- package/dist/electron/electron/settings/dropbox-manager.js +6 -6
- package/dist/electron/electron/settings/google-workspace-manager.js +6 -6
- package/dist/electron/electron/settings/memory-features-manager.js +6 -6
- package/dist/electron/electron/settings/notion-manager.js +6 -6
- package/dist/electron/electron/settings/onedrive-manager.js +6 -6
- package/dist/electron/electron/settings/personality-manager.js +141 -106
- package/dist/electron/electron/settings/sharepoint-manager.js +6 -6
- package/dist/electron/electron/settings/x-manager.js +8 -8
- package/dist/electron/electron/tailscale/exposure.js +21 -21
- package/dist/electron/electron/tailscale/settings.js +21 -21
- package/dist/electron/electron/tailscale/tailscale.js +40 -40
- package/dist/electron/electron/tray/QuickInputWindow.js +73 -53
- package/dist/electron/electron/tray/TrayManager.js +145 -128
- package/dist/electron/electron/updater/update-manager.js +118 -77
- package/dist/electron/electron/utils/box-api.js +22 -26
- package/dist/electron/electron/utils/dropbox-api.js +22 -23
- package/dist/electron/electron/utils/env-migration.js +112 -101
- package/dist/electron/electron/utils/gmail-api.js +8 -11
- package/dist/electron/electron/utils/google-calendar-api.js +8 -11
- package/dist/electron/electron/utils/google-workspace-api.js +21 -24
- package/dist/electron/electron/utils/google-workspace-auth.js +13 -13
- package/dist/electron/electron/utils/google-workspace-oauth.js +48 -49
- package/dist/electron/electron/utils/json-utils.js +26 -27
- package/dist/electron/electron/utils/loom.js +61 -0
- package/dist/electron/electron/utils/notion-api.js +14 -21
- package/dist/electron/electron/utils/onedrive-api.js +17 -24
- package/dist/electron/electron/utils/pdf-parser.js +9 -9
- package/dist/electron/electron/utils/pptx-extractor.js +68 -68
- package/dist/electron/electron/utils/process.js +11 -11
- package/dist/electron/electron/utils/runtime-mode.js +15 -15
- package/dist/electron/electron/utils/safe-storage.js +6 -6
- package/dist/electron/electron/utils/sharepoint-api.js +16 -21
- package/dist/electron/electron/utils/temp-workspace.js +28 -15
- package/dist/electron/electron/utils/user-data-dir.js +13 -13
- package/dist/electron/electron/utils/validation.js +469 -165
- package/dist/electron/electron/utils/x-cli.js +32 -40
- package/dist/electron/electron/voice/VoiceService.js +92 -92
- package/dist/electron/electron/voice/voice-settings-manager.js +41 -41
- package/dist/electron/shared/agent-preferences.js +21 -14
- package/dist/electron/shared/channelMessages.js +190 -193
- package/dist/electron/shared/llm-provider-catalog.js +168 -168
- package/dist/electron/shared/plan-utils.js +10 -8
- package/dist/electron/shared/task-event-status-map.js +31 -0
- package/dist/electron/shared/types.js +1002 -932
- package/docs/changelog.md +22 -1
- package/docs/project-status.md +44 -15
- package/docs/relationship-agent-uat.md +14 -3
- package/docs/vps-linux.md +44 -0
- package/package.json +1 -1
- package/resources/plugin-packs/content-marketing/cowork.plugin.json +63 -0
- package/resources/plugin-packs/customer-support/cowork.plugin.json +71 -0
- package/resources/plugin-packs/data-analysis/cowork.plugin.json +60 -0
- package/resources/plugin-packs/devops/cowork.plugin.json +72 -0
- package/resources/plugin-packs/sales-crm/cowork.plugin.json +74 -0
- package/resources/skills/crypto-execution/crypto-execution.json +79 -0
- package/resources/skills/crypto-execution/scripts/crypto_trading.py +36 -0
- package/resources/skills/crypto-trading/scripts/crypto_trading.py +293 -0
- package/resources/skills/crypto-trading.json +86 -0
- package/resources/skills/email-marketing-bible.json +34 -0
- package/resources/skills/trading-foundation/scripts/__pycache__/trading_foundation.cpython-314.pyc +0 -0
- package/resources/skills/trading-foundation/scripts/trading_foundation.py +2243 -0
- package/resources/skills/trading-foundation/tests/__pycache__/test_trading_foundation.cpython-314.pyc +0 -0
- package/resources/skills/trading-foundation/tests/test_trading_foundation.py +290 -0
- package/resources/skills/trading-foundation/trading-foundation.json +423 -0
- package/src/electron/agent/__tests__/context-manager-compaction.test.ts +34 -0
- package/src/electron/agent/__tests__/executor-entrypoints.test.ts +57 -0
- package/src/electron/agent/__tests__/executor-event-emitter.test.ts +14 -0
- package/src/electron/agent/__tests__/executor-lifecycle-mutex.test.ts +24 -0
- package/src/electron/agent/context-manager.ts +31 -0
- package/src/electron/agent/custom-skill-loader.ts +22 -0
- package/src/electron/agent/daemon.ts +342 -2
- package/src/electron/agent/executor-assistant-output-utils.ts +43 -0
- package/src/electron/agent/executor-canvas-utils.ts +45 -0
- package/src/electron/agent/executor-completion-utils.ts +330 -0
- package/src/electron/agent/executor-event-emitter.ts +13 -0
- package/src/electron/agent/executor-helpers.ts +6 -1
- package/src/electron/agent/executor-lifecycle-mutex.ts +25 -0
- package/src/electron/agent/executor-llm-turn-utils.ts +147 -0
- package/src/electron/agent/executor-loop-utils.ts +290 -0
- package/src/electron/agent/executor-prompt-heuristics-utils.ts +64 -0
- package/src/electron/agent/executor-tool-execution-utils.ts +356 -0
- package/src/electron/agent/executor-workspace-preflight-utils.ts +137 -0
- package/src/electron/agent/executor.ts +1460 -1651
- package/src/electron/agent/llm/__tests__/bedrock-display-names.test.ts +72 -0
- package/src/electron/agent/llm/__tests__/bedrock-provider.test.ts +140 -3
- package/src/electron/agent/llm/anthropic-provider.ts +96 -0
- package/src/electron/agent/llm/bedrock-provider.ts +208 -5
- package/src/electron/agent/llm/pricing.ts +2 -0
- package/src/electron/agent/llm/provider-factory.ts +185 -26
- package/src/electron/agent/llm/types.ts +19 -0
- package/src/electron/agent/strategy/IntentRouter.ts +8 -0
- package/src/electron/agent/strategy/TaskStrategyService.ts +5 -5
- package/src/electron/agent/tools/__tests__/read-files.test.ts +1 -1
- package/src/electron/agent/tools/git-tools.ts +194 -0
- package/src/electron/agent/tools/registry.ts +12 -0
- package/src/electron/agent/tools/vision-tools.ts +115 -10
- package/src/electron/agents/AgentTeamOrchestrator.ts +430 -10
- package/src/electron/agents/AgentTeamRunRepository.ts +36 -4
- package/src/electron/agents/AgentTeamThoughtRepository.ts +155 -0
- package/src/electron/agents/capabilityMatcher.ts +210 -0
- package/src/electron/control-plane/__tests__/task-event-bridge-contract.test.ts +26 -0
- package/src/electron/control-plane/handlers.ts +2 -30
- package/src/electron/control-plane/task-event-bridge-contract.ts +32 -0
- package/src/electron/conway/conway-manager.ts +54 -9
- package/src/electron/conway/conway-wallet.ts +56 -1
- package/src/electron/database/__tests__/repositories-agent.test.ts +68 -1
- package/src/electron/database/repositories.ts +290 -2
- package/src/electron/database/schema.ts +212 -0
- package/src/electron/extensions/declarative-connector-loader.ts +235 -0
- package/src/electron/extensions/loader.ts +37 -4
- package/src/electron/extensions/registry.ts +74 -1
- package/src/electron/extensions/types.ts +97 -3
- package/src/electron/gateway/channels/email.ts +2 -2
- package/src/electron/git/ComparisonService.ts +267 -0
- package/src/electron/git/GitService.ts +354 -0
- package/src/electron/git/WorktreeManager.ts +330 -0
- package/src/electron/ipc/channel-config-sanitizer.ts +1 -0
- package/src/electron/ipc/handlers.ts +279 -28
- package/src/electron/ipc/worktree-handlers.ts +144 -0
- package/src/electron/main.ts +8 -0
- package/src/electron/preload.ts +94 -7
- package/src/electron/reports/task-export.ts +1 -0
- package/src/electron/settings/personality-manager.ts +24 -2
- package/src/electron/utils/validation.ts +74 -33
- package/src/renderer/App.tsx +236 -42
- package/src/renderer/__tests__/sidebar-helpers.test.ts +126 -0
- package/src/renderer/__tests__/task-event-status-map.test.ts +26 -0
- package/src/renderer/components/AgentTeamsPanel.tsx +12 -1
- package/src/renderer/components/CollaborativeThoughtsPanel.tsx +392 -0
- package/src/renderer/components/ComparisonCreateModal.tsx +257 -0
- package/src/renderer/components/ComparisonView.tsx +280 -0
- package/src/renderer/components/ConwaySettings.tsx +8 -7
- package/src/renderer/components/InlineSpreadsheetPreview.tsx +251 -0
- package/src/renderer/components/MainContent.tsx +567 -42
- package/src/renderer/components/MissionControlPanel.tsx +2 -19
- package/src/renderer/components/MultiLlmSelectionPanel.tsx +213 -0
- package/src/renderer/components/Onboarding/Onboarding.tsx +45 -0
- package/src/renderer/components/OnboardingModal.tsx +1 -1
- package/src/renderer/components/Settings.tsx +24 -1
- package/src/renderer/components/Sidebar.tsx +211 -20
- package/src/renderer/components/TaskTimeline.tsx +49 -0
- package/src/renderer/components/TaskView.tsx +32 -0
- package/src/renderer/components/WorktreeSettings.tsx +171 -0
- package/src/renderer/hooks/useOnboardingFlow.ts +103 -5
- package/src/renderer/index.html +1 -1
- package/src/renderer/styles/index.css +1213 -116
- package/src/shared/__tests__/agent-preferences.test.ts +1 -1
- package/src/shared/agent-preferences.ts +1 -1
- package/src/shared/llm-provider-catalog.ts +2 -2
- package/src/shared/task-event-status-map.ts +30 -0
- package/src/shared/types.ts +232 -3
- package/dist/renderer/assets/index-B_joCCPi.js +0 -3539
- package/dist/renderer/assets/index-MuAJQK_1.css +0 -1
- package/dist/renderer/cowork-os-logo.png +0 -0
- package/dist/renderer/density-bootstrap.js +0 -12
- package/dist/renderer/index.html +0 -15
- package/node_modules/@typescript-eslint/eslint-plugin/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/parser/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/project-service/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/scope-manager/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/tsconfig-utils/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/type-utils/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/types/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/typescript-estree/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/utils/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/@typescript-eslint/visitor-keys/dist/tsconfig.build.tsbuildinfo +0 -1
- package/node_modules/color-convert/CHANGELOG.md +0 -54
- package/node_modules/esprima/ChangeLog +0 -235
- package/node_modules/libsignal/node_modules/protobufjs/CHANGELOG.md +0 -935
- package/node_modules/libsignal/node_modules/protobufjs/scripts/changelog.js +0 -150
- package/node_modules/source-map/CHANGELOG.md +0 -301
- 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
|
-
|
|
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
|
-
| **
|
|
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
|
-
| **
|
|
35
|
-
| **
|
|
36
|
-
| **
|
|
37
|
-
| **
|
|
38
|
-
| **
|
|
39
|
-
| **
|
|
40
|
-
| **
|
|
41
|
-
| **
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- **
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
- **
|
|
53
|
-
- **
|
|
54
|
-
- **
|
|
55
|
-
- **
|
|
56
|
-
- **
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
##
|
|
63
|
+
## Upgrade Validation (Recommended)
|
|
71
64
|
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
- **
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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]
|
|
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:
|
|
37
|
-
provider:
|
|
36
|
+
version: "1.0.0",
|
|
37
|
+
provider: "CoWork OS",
|
|
38
38
|
icon: role.icon,
|
|
39
39
|
capabilities,
|
|
40
|
-
origin:
|
|
40
|
+
origin: "local",
|
|
41
41
|
localRoleId: role.id,
|
|
42
42
|
registeredAt: Date.now(),
|
|
43
43
|
lastActiveAt: Date.now(),
|
|
44
|
-
status: role.isActive ?
|
|
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(
|
|
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 ||
|
|
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:
|
|
128
|
+
origin: "remote",
|
|
129
129
|
registeredAt: Date.now(),
|
|
130
130
|
lastActiveAt: Date.now(),
|
|
131
|
-
status:
|
|
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:
|
|
32
|
+
throw { code: protocol_1.ErrorCodes.UNAUTHORIZED, message: "Authentication required" };
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
function requireString(value, field) {
|
|
36
|
-
if (typeof value !==
|
|
37
|
-
throw {
|
|
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,
|
|
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,
|
|
73
|
-
requireString(p.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,
|
|
84
|
-
if (!agentId.startsWith(
|
|
85
|
-
throw { code: protocol_1.ErrorCodes.INVALID_PARAMS, message:
|
|
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,
|
|
100
|
-
const body = requireString(p.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 ||
|
|
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 ||
|
|
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 ===
|
|
129
|
+
if (targetAgent.origin === "local" &&
|
|
127
130
|
targetAgent.localRoleId &&
|
|
128
|
-
p.priority ===
|
|
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:
|
|
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,
|
|
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,
|
|
159
|
-
const title = requireString(p.title,
|
|
160
|
-
const prompt = requireString(p.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:
|
|
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 ===
|
|
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 =
|
|
191
|
+
acpTask.status = "running";
|
|
189
192
|
}
|
|
190
193
|
catch (err) {
|
|
191
|
-
acpTask.status =
|
|
192
|
-
acpTask.error = err?.message ||
|
|
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,
|
|
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:
|
|
215
|
-
running:
|
|
216
|
-
completed:
|
|
217
|
-
failed:
|
|
218
|
-
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 ===
|
|
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,
|
|
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 ===
|
|
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 =
|
|
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(
|
|
284
|
+
console.log("[ACP] Registered 10 ACP method handlers on Control Plane");
|
|
282
285
|
}
|
|
283
286
|
/**
|
|
284
287
|
* Cleanup ACP state (call on shutdown)
|