cowork-os 0.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1638 -0
- package/bin/cowork.js +42 -0
- package/build/entitlements.mac.plist +16 -0
- package/build/icon.icns +0 -0
- package/build/icon.png +0 -0
- package/dist/electron/electron/activity/ActivityRepository.js +190 -0
- package/dist/electron/electron/agent/browser/browser-service.js +639 -0
- package/dist/electron/electron/agent/context-manager.js +225 -0
- package/dist/electron/electron/agent/custom-skill-loader.js +566 -0
- package/dist/electron/electron/agent/daemon.js +975 -0
- package/dist/electron/electron/agent/executor.js +3561 -0
- package/dist/electron/electron/agent/llm/anthropic-provider.js +155 -0
- package/dist/electron/electron/agent/llm/bedrock-provider.js +202 -0
- package/dist/electron/electron/agent/llm/gemini-provider.js +375 -0
- package/dist/electron/electron/agent/llm/index.js +34 -0
- package/dist/electron/electron/agent/llm/ollama-provider.js +263 -0
- package/dist/electron/electron/agent/llm/openai-oauth.js +101 -0
- package/dist/electron/electron/agent/llm/openai-provider.js +657 -0
- package/dist/electron/electron/agent/llm/openrouter-provider.js +232 -0
- package/dist/electron/electron/agent/llm/pricing.js +160 -0
- package/dist/electron/electron/agent/llm/provider-factory.js +880 -0
- package/dist/electron/electron/agent/llm/types.js +178 -0
- package/dist/electron/electron/agent/queue-manager.js +378 -0
- package/dist/electron/electron/agent/sandbox/docker-sandbox.js +402 -0
- package/dist/electron/electron/agent/sandbox/macos-sandbox.js +407 -0
- package/dist/electron/electron/agent/sandbox/runner.js +410 -0
- package/dist/electron/electron/agent/sandbox/sandbox-factory.js +228 -0
- package/dist/electron/electron/agent/sandbox/security-utils.js +258 -0
- package/dist/electron/electron/agent/search/brave-provider.js +119 -0
- package/dist/electron/electron/agent/search/google-provider.js +100 -0
- package/dist/electron/electron/agent/search/index.js +28 -0
- package/dist/electron/electron/agent/search/provider-factory.js +395 -0
- package/dist/electron/electron/agent/search/serpapi-provider.js +112 -0
- package/dist/electron/electron/agent/search/tavily-provider.js +90 -0
- package/dist/electron/electron/agent/search/types.js +40 -0
- package/dist/electron/electron/agent/security/index.js +12 -0
- package/dist/electron/electron/agent/security/input-sanitizer.js +303 -0
- package/dist/electron/electron/agent/security/output-filter.js +217 -0
- package/dist/electron/electron/agent/skill-eligibility.js +281 -0
- package/dist/electron/electron/agent/skill-registry.js +396 -0
- package/dist/electron/electron/agent/skills/document.js +878 -0
- package/dist/electron/electron/agent/skills/image-generator.js +225 -0
- package/dist/electron/electron/agent/skills/organizer.js +141 -0
- package/dist/electron/electron/agent/skills/presentation.js +367 -0
- package/dist/electron/electron/agent/skills/spreadsheet.js +165 -0
- package/dist/electron/electron/agent/tools/browser-tools.js +523 -0
- package/dist/electron/electron/agent/tools/builtin-settings.js +384 -0
- package/dist/electron/electron/agent/tools/canvas-tools.js +530 -0
- package/dist/electron/electron/agent/tools/cron-tools.js +577 -0
- package/dist/electron/electron/agent/tools/edit-tools.js +194 -0
- package/dist/electron/electron/agent/tools/file-tools.js +719 -0
- package/dist/electron/electron/agent/tools/glob-tools.js +283 -0
- package/dist/electron/electron/agent/tools/grep-tools.js +387 -0
- package/dist/electron/electron/agent/tools/image-tools.js +111 -0
- package/dist/electron/electron/agent/tools/mention-tools.js +282 -0
- package/dist/electron/electron/agent/tools/node-tools.js +476 -0
- package/dist/electron/electron/agent/tools/registry.js +2719 -0
- package/dist/electron/electron/agent/tools/search-tools.js +91 -0
- package/dist/electron/electron/agent/tools/shell-tools.js +574 -0
- package/dist/electron/electron/agent/tools/skill-tools.js +274 -0
- package/dist/electron/electron/agent/tools/system-tools.js +578 -0
- package/dist/electron/electron/agent/tools/web-fetch-tools.js +444 -0
- package/dist/electron/electron/agent/tools/x-tools.js +264 -0
- package/dist/electron/electron/agents/AgentRoleRepository.js +420 -0
- package/dist/electron/electron/agents/HeartbeatService.js +356 -0
- package/dist/electron/electron/agents/MentionRepository.js +197 -0
- package/dist/electron/electron/agents/TaskSubscriptionRepository.js +168 -0
- package/dist/electron/electron/agents/WorkingStateRepository.js +229 -0
- package/dist/electron/electron/canvas/canvas-manager.js +714 -0
- package/dist/electron/electron/canvas/canvas-preload.js +53 -0
- package/dist/electron/electron/canvas/canvas-protocol.js +195 -0
- package/dist/electron/electron/canvas/canvas-store.js +174 -0
- package/dist/electron/electron/canvas/index.js +13 -0
- package/dist/electron/electron/control-plane/client.js +364 -0
- package/dist/electron/electron/control-plane/handlers.js +572 -0
- package/dist/electron/electron/control-plane/index.js +41 -0
- package/dist/electron/electron/control-plane/node-manager.js +264 -0
- package/dist/electron/electron/control-plane/protocol.js +194 -0
- package/dist/electron/electron/control-plane/remote-client.js +437 -0
- package/dist/electron/electron/control-plane/server.js +640 -0
- package/dist/electron/electron/control-plane/settings.js +369 -0
- package/dist/electron/electron/control-plane/ssh-tunnel.js +549 -0
- package/dist/electron/electron/cron/index.js +30 -0
- package/dist/electron/electron/cron/schedule.js +190 -0
- package/dist/electron/electron/cron/service.js +614 -0
- package/dist/electron/electron/cron/store.js +155 -0
- package/dist/electron/electron/cron/types.js +82 -0
- package/dist/electron/electron/cron/webhook.js +258 -0
- package/dist/electron/electron/database/SecureSettingsRepository.js +444 -0
- package/dist/electron/electron/database/TaskLabelRepository.js +120 -0
- package/dist/electron/electron/database/repositories.js +1781 -0
- package/dist/electron/electron/database/schema.js +978 -0
- package/dist/electron/electron/extensions/index.js +33 -0
- package/dist/electron/electron/extensions/loader.js +313 -0
- package/dist/electron/electron/extensions/registry.js +485 -0
- package/dist/electron/electron/extensions/types.js +11 -0
- package/dist/electron/electron/gateway/channel-registry.js +1102 -0
- package/dist/electron/electron/gateway/channels/bluebubbles-client.js +479 -0
- package/dist/electron/electron/gateway/channels/bluebubbles.js +432 -0
- package/dist/electron/electron/gateway/channels/discord.js +975 -0
- package/dist/electron/electron/gateway/channels/email-client.js +593 -0
- package/dist/electron/electron/gateway/channels/email.js +443 -0
- package/dist/electron/electron/gateway/channels/google-chat.js +631 -0
- package/dist/electron/electron/gateway/channels/imessage-client.js +363 -0
- package/dist/electron/electron/gateway/channels/imessage.js +465 -0
- package/dist/electron/electron/gateway/channels/index.js +36 -0
- package/dist/electron/electron/gateway/channels/line-client.js +470 -0
- package/dist/electron/electron/gateway/channels/line.js +479 -0
- package/dist/electron/electron/gateway/channels/matrix-client.js +432 -0
- package/dist/electron/electron/gateway/channels/matrix.js +592 -0
- package/dist/electron/electron/gateway/channels/mattermost-client.js +394 -0
- package/dist/electron/electron/gateway/channels/mattermost.js +496 -0
- package/dist/electron/electron/gateway/channels/signal-client.js +500 -0
- package/dist/electron/electron/gateway/channels/signal.js +582 -0
- package/dist/electron/electron/gateway/channels/slack.js +415 -0
- package/dist/electron/electron/gateway/channels/teams.js +596 -0
- package/dist/electron/electron/gateway/channels/telegram.js +1390 -0
- package/dist/electron/electron/gateway/channels/twitch-client.js +502 -0
- package/dist/electron/electron/gateway/channels/twitch.js +396 -0
- package/dist/electron/electron/gateway/channels/types.js +8 -0
- package/dist/electron/electron/gateway/channels/whatsapp.js +953 -0
- package/dist/electron/electron/gateway/context-policy.js +268 -0
- package/dist/electron/electron/gateway/index.js +1063 -0
- package/dist/electron/electron/gateway/infrastructure.js +496 -0
- package/dist/electron/electron/gateway/router.js +2700 -0
- package/dist/electron/electron/gateway/security.js +375 -0
- package/dist/electron/electron/gateway/session.js +115 -0
- package/dist/electron/electron/gateway/tunnel.js +503 -0
- package/dist/electron/electron/guardrails/guardrail-manager.js +348 -0
- package/dist/electron/electron/hooks/gmail-watcher.js +300 -0
- package/dist/electron/electron/hooks/index.js +46 -0
- package/dist/electron/electron/hooks/mappings.js +381 -0
- package/dist/electron/electron/hooks/server.js +480 -0
- package/dist/electron/electron/hooks/settings.js +447 -0
- package/dist/electron/electron/hooks/types.js +41 -0
- package/dist/electron/electron/ipc/canvas-handlers.js +158 -0
- package/dist/electron/electron/ipc/handlers.js +3138 -0
- package/dist/electron/electron/ipc/mission-control-handlers.js +141 -0
- package/dist/electron/electron/main.js +448 -0
- package/dist/electron/electron/mcp/client/MCPClientManager.js +330 -0
- package/dist/electron/electron/mcp/client/MCPServerConnection.js +437 -0
- package/dist/electron/electron/mcp/client/transports/SSETransport.js +304 -0
- package/dist/electron/electron/mcp/client/transports/StdioTransport.js +307 -0
- package/dist/electron/electron/mcp/client/transports/WebSocketTransport.js +329 -0
- package/dist/electron/electron/mcp/host/MCPHostServer.js +354 -0
- package/dist/electron/electron/mcp/host/ToolAdapter.js +100 -0
- package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +497 -0
- package/dist/electron/electron/mcp/settings.js +446 -0
- package/dist/electron/electron/mcp/types.js +59 -0
- package/dist/electron/electron/memory/MemoryService.js +435 -0
- package/dist/electron/electron/notifications/index.js +17 -0
- package/dist/electron/electron/notifications/service.js +118 -0
- package/dist/electron/electron/notifications/store.js +144 -0
- package/dist/electron/electron/preload.js +842 -0
- package/dist/electron/electron/reports/StandupReportService.js +272 -0
- package/dist/electron/electron/security/concurrency.js +293 -0
- package/dist/electron/electron/security/index.js +15 -0
- package/dist/electron/electron/security/policy-manager.js +435 -0
- package/dist/electron/electron/settings/appearance-manager.js +193 -0
- package/dist/electron/electron/settings/personality-manager.js +724 -0
- package/dist/electron/electron/settings/x-manager.js +58 -0
- package/dist/electron/electron/tailscale/exposure.js +188 -0
- package/dist/electron/electron/tailscale/index.js +28 -0
- package/dist/electron/electron/tailscale/settings.js +205 -0
- package/dist/electron/electron/tailscale/tailscale.js +355 -0
- package/dist/electron/electron/tray/QuickInputWindow.js +568 -0
- package/dist/electron/electron/tray/TrayManager.js +895 -0
- package/dist/electron/electron/tray/index.js +9 -0
- package/dist/electron/electron/updater/index.js +6 -0
- package/dist/electron/electron/updater/update-manager.js +418 -0
- package/dist/electron/electron/utils/env-migration.js +209 -0
- package/dist/electron/electron/utils/process.js +102 -0
- package/dist/electron/electron/utils/rate-limiter.js +104 -0
- package/dist/electron/electron/utils/validation.js +419 -0
- package/dist/electron/electron/utils/x-cli.js +177 -0
- package/dist/electron/electron/voice/VoiceService.js +507 -0
- package/dist/electron/electron/voice/index.js +14 -0
- package/dist/electron/electron/voice/voice-settings-manager.js +359 -0
- package/dist/electron/shared/channelMessages.js +170 -0
- package/dist/electron/shared/types.js +1185 -0
- package/package.json +159 -0
- package/resources/skills/1password.json +10 -0
- package/resources/skills/add-documentation.json +31 -0
- package/resources/skills/analyze-csv.json +17 -0
- package/resources/skills/apple-notes.json +10 -0
- package/resources/skills/apple-reminders.json +10 -0
- package/resources/skills/auto-commenter.json +10 -0
- package/resources/skills/bear-notes.json +10 -0
- package/resources/skills/bird.json +35 -0
- package/resources/skills/blogwatcher.json +10 -0
- package/resources/skills/blucli.json +10 -0
- package/resources/skills/bluebubbles.json +10 -0
- package/resources/skills/camsnap.json +10 -0
- package/resources/skills/clean-imports.json +18 -0
- package/resources/skills/code-review.json +18 -0
- package/resources/skills/coding-agent.json +10 -0
- package/resources/skills/compare-files.json +23 -0
- package/resources/skills/convert-code.json +34 -0
- package/resources/skills/create-changelog.json +24 -0
- package/resources/skills/debug-error.json +17 -0
- package/resources/skills/dependency-check.json +10 -0
- package/resources/skills/discord.json +10 -0
- package/resources/skills/eightctl.json +10 -0
- package/resources/skills/explain-code.json +29 -0
- package/resources/skills/extract-todos.json +18 -0
- package/resources/skills/food-order.json +10 -0
- package/resources/skills/gemini.json +10 -0
- package/resources/skills/generate-readme.json +10 -0
- package/resources/skills/gifgrep.json +10 -0
- package/resources/skills/git-commit.json +10 -0
- package/resources/skills/github.json +10 -0
- package/resources/skills/gog.json +10 -0
- package/resources/skills/goplaces.json +10 -0
- package/resources/skills/himalaya.json +10 -0
- package/resources/skills/imsg.json +10 -0
- package/resources/skills/karpathy-guidelines.json +12 -0
- package/resources/skills/last30days.json +26 -0
- package/resources/skills/local-places.json +10 -0
- package/resources/skills/mcporter.json +10 -0
- package/resources/skills/model-usage.json +10 -0
- package/resources/skills/nano-banana-pro.json +10 -0
- package/resources/skills/nano-pdf.json +10 -0
- package/resources/skills/notion.json +10 -0
- package/resources/skills/obsidian.json +10 -0
- package/resources/skills/openai-image-gen.json +10 -0
- package/resources/skills/openai-whisper-api.json +10 -0
- package/resources/skills/openai-whisper.json +10 -0
- package/resources/skills/openhue.json +10 -0
- package/resources/skills/oracle.json +10 -0
- package/resources/skills/ordercli.json +10 -0
- package/resources/skills/peekaboo.json +10 -0
- package/resources/skills/project-structure.json +10 -0
- package/resources/skills/proofread.json +17 -0
- package/resources/skills/refactor-code.json +31 -0
- package/resources/skills/rename-symbol.json +23 -0
- package/resources/skills/sag.json +10 -0
- package/resources/skills/security-audit.json +18 -0
- package/resources/skills/session-logs.json +10 -0
- package/resources/skills/sherpa-onnx-tts.json +10 -0
- package/resources/skills/skill-creator.json +15 -0
- package/resources/skills/skill-hub.json +29 -0
- package/resources/skills/slack.json +10 -0
- package/resources/skills/songsee.json +10 -0
- package/resources/skills/sonoscli.json +10 -0
- package/resources/skills/spotify-player.json +10 -0
- package/resources/skills/startup-cfo.json +55 -0
- package/resources/skills/summarize-folder.json +18 -0
- package/resources/skills/summarize.json +10 -0
- package/resources/skills/things-mac.json +10 -0
- package/resources/skills/tmux.json +10 -0
- package/resources/skills/translate.json +36 -0
- package/resources/skills/trello.json +10 -0
- package/resources/skills/video-frames.json +10 -0
- package/resources/skills/voice-call.json +10 -0
- package/resources/skills/wacli.json +10 -0
- package/resources/skills/weather.json +10 -0
- package/resources/skills/write-tests.json +31 -0
- package/src/electron/activity/ActivityRepository.ts +238 -0
- package/src/electron/agent/browser/browser-service.ts +721 -0
- package/src/electron/agent/context-manager.ts +257 -0
- package/src/electron/agent/custom-skill-loader.ts +634 -0
- package/src/electron/agent/daemon.ts +1097 -0
- package/src/electron/agent/executor.ts +4017 -0
- package/src/electron/agent/llm/anthropic-provider.ts +175 -0
- package/src/electron/agent/llm/bedrock-provider.ts +236 -0
- package/src/electron/agent/llm/gemini-provider.ts +422 -0
- package/src/electron/agent/llm/index.ts +9 -0
- package/src/electron/agent/llm/ollama-provider.ts +347 -0
- package/src/electron/agent/llm/openai-oauth.ts +127 -0
- package/src/electron/agent/llm/openai-provider.ts +686 -0
- package/src/electron/agent/llm/openrouter-provider.ts +273 -0
- package/src/electron/agent/llm/pricing.ts +180 -0
- package/src/electron/agent/llm/provider-factory.ts +971 -0
- package/src/electron/agent/llm/types.ts +291 -0
- package/src/electron/agent/queue-manager.ts +408 -0
- package/src/electron/agent/sandbox/docker-sandbox.ts +453 -0
- package/src/electron/agent/sandbox/macos-sandbox.ts +426 -0
- package/src/electron/agent/sandbox/runner.ts +453 -0
- package/src/electron/agent/sandbox/sandbox-factory.ts +337 -0
- package/src/electron/agent/sandbox/security-utils.ts +251 -0
- package/src/electron/agent/search/brave-provider.ts +141 -0
- package/src/electron/agent/search/google-provider.ts +131 -0
- package/src/electron/agent/search/index.ts +6 -0
- package/src/electron/agent/search/provider-factory.ts +450 -0
- package/src/electron/agent/search/serpapi-provider.ts +138 -0
- package/src/electron/agent/search/tavily-provider.ts +108 -0
- package/src/electron/agent/search/types.ts +118 -0
- package/src/electron/agent/security/index.ts +20 -0
- package/src/electron/agent/security/input-sanitizer.ts +380 -0
- package/src/electron/agent/security/output-filter.ts +259 -0
- package/src/electron/agent/skill-eligibility.ts +334 -0
- package/src/electron/agent/skill-registry.ts +457 -0
- package/src/electron/agent/skills/document.ts +1070 -0
- package/src/electron/agent/skills/image-generator.ts +272 -0
- package/src/electron/agent/skills/organizer.ts +131 -0
- package/src/electron/agent/skills/presentation.ts +418 -0
- package/src/electron/agent/skills/spreadsheet.ts +166 -0
- package/src/electron/agent/tools/browser-tools.ts +546 -0
- package/src/electron/agent/tools/builtin-settings.ts +422 -0
- package/src/electron/agent/tools/canvas-tools.ts +572 -0
- package/src/electron/agent/tools/cron-tools.ts +723 -0
- package/src/electron/agent/tools/edit-tools.ts +196 -0
- package/src/electron/agent/tools/file-tools.ts +811 -0
- package/src/electron/agent/tools/glob-tools.ts +303 -0
- package/src/electron/agent/tools/grep-tools.ts +432 -0
- package/src/electron/agent/tools/image-tools.ts +126 -0
- package/src/electron/agent/tools/mention-tools.ts +371 -0
- package/src/electron/agent/tools/node-tools.ts +550 -0
- package/src/electron/agent/tools/registry.ts +3052 -0
- package/src/electron/agent/tools/search-tools.ts +111 -0
- package/src/electron/agent/tools/shell-tools.ts +651 -0
- package/src/electron/agent/tools/skill-tools.ts +340 -0
- package/src/electron/agent/tools/system-tools.ts +665 -0
- package/src/electron/agent/tools/web-fetch-tools.ts +528 -0
- package/src/electron/agent/tools/x-tools.ts +267 -0
- package/src/electron/agents/AgentRoleRepository.ts +557 -0
- package/src/electron/agents/HeartbeatService.ts +469 -0
- package/src/electron/agents/MentionRepository.ts +242 -0
- package/src/electron/agents/TaskSubscriptionRepository.ts +231 -0
- package/src/electron/agents/WorkingStateRepository.ts +278 -0
- package/src/electron/canvas/canvas-manager.ts +818 -0
- package/src/electron/canvas/canvas-preload.ts +102 -0
- package/src/electron/canvas/canvas-protocol.ts +174 -0
- package/src/electron/canvas/canvas-store.ts +200 -0
- package/src/electron/canvas/index.ts +8 -0
- package/src/electron/control-plane/client.ts +527 -0
- package/src/electron/control-plane/handlers.ts +723 -0
- package/src/electron/control-plane/index.ts +51 -0
- package/src/electron/control-plane/node-manager.ts +322 -0
- package/src/electron/control-plane/protocol.ts +269 -0
- package/src/electron/control-plane/remote-client.ts +517 -0
- package/src/electron/control-plane/server.ts +853 -0
- package/src/electron/control-plane/settings.ts +401 -0
- package/src/electron/control-plane/ssh-tunnel.ts +624 -0
- package/src/electron/cron/index.ts +9 -0
- package/src/electron/cron/schedule.ts +217 -0
- package/src/electron/cron/service.ts +743 -0
- package/src/electron/cron/store.ts +165 -0
- package/src/electron/cron/types.ts +291 -0
- package/src/electron/cron/webhook.ts +303 -0
- package/src/electron/database/SecureSettingsRepository.ts +514 -0
- package/src/electron/database/TaskLabelRepository.ts +148 -0
- package/src/electron/database/repositories.ts +2397 -0
- package/src/electron/database/schema.ts +1017 -0
- package/src/electron/extensions/index.ts +18 -0
- package/src/electron/extensions/loader.ts +336 -0
- package/src/electron/extensions/registry.ts +546 -0
- package/src/electron/extensions/types.ts +372 -0
- package/src/electron/gateway/channel-registry.ts +1267 -0
- package/src/electron/gateway/channels/bluebubbles-client.ts +641 -0
- package/src/electron/gateway/channels/bluebubbles.ts +509 -0
- package/src/electron/gateway/channels/discord.ts +1150 -0
- package/src/electron/gateway/channels/email-client.ts +708 -0
- package/src/electron/gateway/channels/email.ts +516 -0
- package/src/electron/gateway/channels/google-chat.ts +760 -0
- package/src/electron/gateway/channels/imessage-client.ts +473 -0
- package/src/electron/gateway/channels/imessage.ts +520 -0
- package/src/electron/gateway/channels/index.ts +21 -0
- package/src/electron/gateway/channels/line-client.ts +598 -0
- package/src/electron/gateway/channels/line.ts +559 -0
- package/src/electron/gateway/channels/matrix-client.ts +632 -0
- package/src/electron/gateway/channels/matrix.ts +655 -0
- package/src/electron/gateway/channels/mattermost-client.ts +526 -0
- package/src/electron/gateway/channels/mattermost.ts +550 -0
- package/src/electron/gateway/channels/signal-client.ts +722 -0
- package/src/electron/gateway/channels/signal.ts +666 -0
- package/src/electron/gateway/channels/slack.ts +458 -0
- package/src/electron/gateway/channels/teams.ts +681 -0
- package/src/electron/gateway/channels/telegram.ts +1727 -0
- package/src/electron/gateway/channels/twitch-client.ts +665 -0
- package/src/electron/gateway/channels/twitch.ts +468 -0
- package/src/electron/gateway/channels/types.ts +1002 -0
- package/src/electron/gateway/channels/whatsapp.ts +1101 -0
- package/src/electron/gateway/context-policy.ts +382 -0
- package/src/electron/gateway/index.ts +1274 -0
- package/src/electron/gateway/infrastructure.ts +645 -0
- package/src/electron/gateway/router.ts +3206 -0
- package/src/electron/gateway/security.ts +422 -0
- package/src/electron/gateway/session.ts +144 -0
- package/src/electron/gateway/tunnel.ts +626 -0
- package/src/electron/guardrails/guardrail-manager.ts +380 -0
- package/src/electron/hooks/gmail-watcher.ts +355 -0
- package/src/electron/hooks/index.ts +30 -0
- package/src/electron/hooks/mappings.ts +404 -0
- package/src/electron/hooks/server.ts +574 -0
- package/src/electron/hooks/settings.ts +466 -0
- package/src/electron/hooks/types.ts +245 -0
- package/src/electron/ipc/canvas-handlers.ts +223 -0
- package/src/electron/ipc/handlers.ts +3661 -0
- package/src/electron/ipc/mission-control-handlers.ts +182 -0
- package/src/electron/main.ts +496 -0
- package/src/electron/mcp/client/MCPClientManager.ts +406 -0
- package/src/electron/mcp/client/MCPServerConnection.ts +514 -0
- package/src/electron/mcp/client/transports/SSETransport.ts +360 -0
- package/src/electron/mcp/client/transports/StdioTransport.ts +355 -0
- package/src/electron/mcp/client/transports/WebSocketTransport.ts +384 -0
- package/src/electron/mcp/host/MCPHostServer.ts +388 -0
- package/src/electron/mcp/host/ToolAdapter.ts +140 -0
- package/src/electron/mcp/registry/MCPRegistryManager.ts +565 -0
- package/src/electron/mcp/settings.ts +468 -0
- package/src/electron/mcp/types.ts +371 -0
- package/src/electron/memory/MemoryService.ts +523 -0
- package/src/electron/notifications/index.ts +16 -0
- package/src/electron/notifications/service.ts +161 -0
- package/src/electron/notifications/store.ts +163 -0
- package/src/electron/preload.ts +2845 -0
- package/src/electron/reports/StandupReportService.ts +356 -0
- package/src/electron/security/concurrency.ts +333 -0
- package/src/electron/security/index.ts +17 -0
- package/src/electron/security/policy-manager.ts +539 -0
- package/src/electron/settings/appearance-manager.ts +182 -0
- package/src/electron/settings/personality-manager.ts +800 -0
- package/src/electron/settings/x-manager.ts +62 -0
- package/src/electron/tailscale/exposure.ts +262 -0
- package/src/electron/tailscale/index.ts +34 -0
- package/src/electron/tailscale/settings.ts +218 -0
- package/src/electron/tailscale/tailscale.ts +379 -0
- package/src/electron/tray/QuickInputWindow.ts +609 -0
- package/src/electron/tray/TrayManager.ts +1005 -0
- package/src/electron/tray/index.ts +6 -0
- package/src/electron/updater/index.ts +1 -0
- package/src/electron/updater/update-manager.ts +447 -0
- package/src/electron/utils/env-migration.ts +203 -0
- package/src/electron/utils/process.ts +124 -0
- package/src/electron/utils/rate-limiter.ts +130 -0
- package/src/electron/utils/validation.ts +493 -0
- package/src/electron/utils/x-cli.ts +198 -0
- package/src/electron/voice/VoiceService.ts +583 -0
- package/src/electron/voice/index.ts +9 -0
- package/src/electron/voice/voice-settings-manager.ts +403 -0
- package/src/renderer/App.tsx +775 -0
- package/src/renderer/components/ActivityFeed.tsx +407 -0
- package/src/renderer/components/ActivityFeedItem.tsx +285 -0
- package/src/renderer/components/AgentRoleCard.tsx +343 -0
- package/src/renderer/components/AgentRoleEditor.tsx +805 -0
- package/src/renderer/components/AgentSquadSettings.tsx +295 -0
- package/src/renderer/components/AgentWorkingStatePanel.tsx +411 -0
- package/src/renderer/components/AppearanceSettings.tsx +122 -0
- package/src/renderer/components/ApprovalDialog.tsx +100 -0
- package/src/renderer/components/BlueBubblesSettings.tsx +505 -0
- package/src/renderer/components/BuiltinToolsSettings.tsx +307 -0
- package/src/renderer/components/CanvasPreview.tsx +1189 -0
- package/src/renderer/components/CommandOutput.tsx +202 -0
- package/src/renderer/components/ContextPolicySettings.tsx +523 -0
- package/src/renderer/components/ControlPlaneSettings.tsx +1134 -0
- package/src/renderer/components/DisclaimerModal.tsx +124 -0
- package/src/renderer/components/DiscordSettings.tsx +436 -0
- package/src/renderer/components/EmailSettings.tsx +606 -0
- package/src/renderer/components/ExtensionsSettings.tsx +542 -0
- package/src/renderer/components/FileViewer.tsx +224 -0
- package/src/renderer/components/GoogleChatSettings.tsx +535 -0
- package/src/renderer/components/GuardrailSettings.tsx +487 -0
- package/src/renderer/components/HooksSettings.tsx +581 -0
- package/src/renderer/components/ImessageSettings.tsx +484 -0
- package/src/renderer/components/LineSettings.tsx +483 -0
- package/src/renderer/components/MCPRegistryBrowser.tsx +386 -0
- package/src/renderer/components/MCPSettings.tsx +943 -0
- package/src/renderer/components/MainContent.tsx +2433 -0
- package/src/renderer/components/MatrixSettings.tsx +510 -0
- package/src/renderer/components/MattermostSettings.tsx +473 -0
- package/src/renderer/components/MemorySettings.tsx +247 -0
- package/src/renderer/components/MentionBadge.tsx +87 -0
- package/src/renderer/components/MentionInput.tsx +409 -0
- package/src/renderer/components/MentionList.tsx +476 -0
- package/src/renderer/components/MissionControlPanel.tsx +1995 -0
- package/src/renderer/components/NodesSettings.tsx +316 -0
- package/src/renderer/components/NotificationPanel.tsx +481 -0
- package/src/renderer/components/Onboarding/AwakeningOrb.tsx +44 -0
- package/src/renderer/components/Onboarding/Onboarding.tsx +443 -0
- package/src/renderer/components/Onboarding/TypewriterText.tsx +102 -0
- package/src/renderer/components/Onboarding/index.ts +3 -0
- package/src/renderer/components/OnboardingModal.tsx +698 -0
- package/src/renderer/components/PairingCodeDisplay.tsx +324 -0
- package/src/renderer/components/PersonalitySettings.tsx +597 -0
- package/src/renderer/components/QueueSettings.tsx +119 -0
- package/src/renderer/components/QuickTaskFAB.tsx +71 -0
- package/src/renderer/components/RightPanel.tsx +413 -0
- package/src/renderer/components/ScheduledTasksSettings.tsx +1328 -0
- package/src/renderer/components/SearchSettings.tsx +328 -0
- package/src/renderer/components/Settings.tsx +1504 -0
- package/src/renderer/components/Sidebar.tsx +344 -0
- package/src/renderer/components/SignalSettings.tsx +673 -0
- package/src/renderer/components/SkillHubBrowser.tsx +458 -0
- package/src/renderer/components/SkillParameterModal.tsx +185 -0
- package/src/renderer/components/SkillsSettings.tsx +451 -0
- package/src/renderer/components/SlackSettings.tsx +442 -0
- package/src/renderer/components/StandupReportViewer.tsx +614 -0
- package/src/renderer/components/TaskBoard.tsx +498 -0
- package/src/renderer/components/TaskBoardCard.tsx +357 -0
- package/src/renderer/components/TaskBoardColumn.tsx +211 -0
- package/src/renderer/components/TaskLabelManager.tsx +472 -0
- package/src/renderer/components/TaskQueuePanel.tsx +144 -0
- package/src/renderer/components/TaskQuickActions.tsx +492 -0
- package/src/renderer/components/TaskTimeline.tsx +216 -0
- package/src/renderer/components/TaskView.tsx +162 -0
- package/src/renderer/components/TeamsSettings.tsx +518 -0
- package/src/renderer/components/TelegramSettings.tsx +421 -0
- package/src/renderer/components/Toast.tsx +76 -0
- package/src/renderer/components/TraySettings.tsx +189 -0
- package/src/renderer/components/TwitchSettings.tsx +511 -0
- package/src/renderer/components/UpdateSettings.tsx +295 -0
- package/src/renderer/components/VoiceIndicator.tsx +270 -0
- package/src/renderer/components/VoiceSettings.tsx +867 -0
- package/src/renderer/components/WhatsAppSettings.tsx +721 -0
- package/src/renderer/components/WorkingStateEditor.tsx +309 -0
- package/src/renderer/components/WorkingStateHistory.tsx +481 -0
- package/src/renderer/components/WorkspaceSelector.tsx +150 -0
- package/src/renderer/components/XSettings.tsx +311 -0
- package/src/renderer/global.d.ts +9 -0
- package/src/renderer/hooks/useAgentContext.ts +153 -0
- package/src/renderer/hooks/useOnboardingFlow.ts +548 -0
- package/src/renderer/hooks/useVoiceInput.ts +268 -0
- package/src/renderer/index.html +12 -0
- package/src/renderer/main.tsx +10 -0
- package/src/renderer/public/cowork-os-logo.png +0 -0
- package/src/renderer/quick-input.html +164 -0
- package/src/renderer/styles/index.css +14504 -0
- package/src/renderer/utils/agentMessages.ts +749 -0
- package/src/renderer/utils/voice-directives.ts +169 -0
- package/src/shared/channelMessages.ts +213 -0
- package/src/shared/types.ts +3608 -0
- package/tsconfig.electron.json +26 -0
- package/tsconfig.json +26 -0
- package/tsconfig.node.json +10 -0
- package/vite.config.ts +23 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Provider abstraction types
|
|
4
|
+
* Allows switching between Anthropic API and AWS Bedrock
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DEFAULT_MODEL = exports.OLLAMA_MODELS = exports.OPENAI_MODELS = exports.OPENROUTER_MODELS = exports.GEMINI_MODELS = exports.MODELS = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Available AI models with their IDs for each provider
|
|
10
|
+
* Note: Bedrock uses inference profile IDs (us. prefix) for newer models
|
|
11
|
+
* Note: Ollama models are dynamic and fetched from the server
|
|
12
|
+
*/
|
|
13
|
+
exports.MODELS = {
|
|
14
|
+
'opus-4-5': {
|
|
15
|
+
anthropic: 'claude-opus-4-5-20251101',
|
|
16
|
+
bedrock: 'us.anthropic.claude-opus-4-5-20251101-v1:0',
|
|
17
|
+
displayName: 'Opus 4.5',
|
|
18
|
+
},
|
|
19
|
+
'sonnet-4-5': {
|
|
20
|
+
anthropic: 'claude-sonnet-4-5-20250514',
|
|
21
|
+
bedrock: 'us.anthropic.claude-sonnet-4-5-20250514-v1:0',
|
|
22
|
+
displayName: 'Sonnet 4.5',
|
|
23
|
+
},
|
|
24
|
+
'haiku-4-5': {
|
|
25
|
+
anthropic: 'claude-haiku-4-5-20250514',
|
|
26
|
+
bedrock: 'us.anthropic.claude-haiku-4-5-20250514-v1:0',
|
|
27
|
+
displayName: 'Haiku 4.5',
|
|
28
|
+
},
|
|
29
|
+
'sonnet-4': {
|
|
30
|
+
anthropic: 'claude-sonnet-4-20250514',
|
|
31
|
+
bedrock: 'us.anthropic.claude-sonnet-4-20250514-v1:0',
|
|
32
|
+
displayName: 'Sonnet 4',
|
|
33
|
+
},
|
|
34
|
+
'sonnet-3-5': {
|
|
35
|
+
anthropic: 'claude-3-5-sonnet-20241022',
|
|
36
|
+
bedrock: 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',
|
|
37
|
+
displayName: 'Sonnet 3.5',
|
|
38
|
+
},
|
|
39
|
+
'haiku-3-5': {
|
|
40
|
+
anthropic: 'claude-3-5-haiku-20241022',
|
|
41
|
+
bedrock: 'us.anthropic.claude-3-5-haiku-20241022-v1:0',
|
|
42
|
+
displayName: 'Haiku 3.5',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Available Gemini models from Google AI Studio
|
|
47
|
+
*/
|
|
48
|
+
exports.GEMINI_MODELS = {
|
|
49
|
+
'gemini-2.5-pro': {
|
|
50
|
+
id: 'gemini-2.5-pro-preview-05-06',
|
|
51
|
+
displayName: 'Gemini 2.5 Pro',
|
|
52
|
+
description: 'Most capable model for complex tasks',
|
|
53
|
+
},
|
|
54
|
+
'gemini-2.5-flash': {
|
|
55
|
+
id: 'gemini-2.5-flash-preview-05-20',
|
|
56
|
+
displayName: 'Gemini 2.5 Flash',
|
|
57
|
+
description: 'Fast and efficient for most tasks',
|
|
58
|
+
},
|
|
59
|
+
'gemini-2.0-flash': {
|
|
60
|
+
id: 'gemini-2.0-flash',
|
|
61
|
+
displayName: 'Gemini 2.0 Flash',
|
|
62
|
+
description: 'Balanced speed and capability',
|
|
63
|
+
},
|
|
64
|
+
'gemini-2.0-flash-lite': {
|
|
65
|
+
id: 'gemini-2.0-flash-lite',
|
|
66
|
+
displayName: 'Gemini 2.0 Flash Lite',
|
|
67
|
+
description: 'Fastest and most cost-effective',
|
|
68
|
+
},
|
|
69
|
+
'gemini-1.5-pro': {
|
|
70
|
+
id: 'gemini-1.5-pro',
|
|
71
|
+
displayName: 'Gemini 1.5 Pro',
|
|
72
|
+
description: 'Previous generation pro model',
|
|
73
|
+
},
|
|
74
|
+
'gemini-1.5-flash': {
|
|
75
|
+
id: 'gemini-1.5-flash',
|
|
76
|
+
displayName: 'Gemini 1.5 Flash',
|
|
77
|
+
description: 'Previous generation flash model',
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Popular OpenRouter models
|
|
82
|
+
* OpenRouter provides access to many models from different providers
|
|
83
|
+
*/
|
|
84
|
+
exports.OPENROUTER_MODELS = {
|
|
85
|
+
'anthropic/claude-3.5-sonnet': {
|
|
86
|
+
id: 'anthropic/claude-3.5-sonnet',
|
|
87
|
+
displayName: 'Claude 3.5 Sonnet',
|
|
88
|
+
description: 'Anthropic\'s balanced model',
|
|
89
|
+
},
|
|
90
|
+
'anthropic/claude-3-opus': {
|
|
91
|
+
id: 'anthropic/claude-3-opus',
|
|
92
|
+
displayName: 'Claude 3 Opus',
|
|
93
|
+
description: 'Anthropic\'s most capable model',
|
|
94
|
+
},
|
|
95
|
+
'openai/gpt-4o': {
|
|
96
|
+
id: 'openai/gpt-4o',
|
|
97
|
+
displayName: 'GPT-4o',
|
|
98
|
+
description: 'OpenAI\'s flagship model',
|
|
99
|
+
},
|
|
100
|
+
'openai/gpt-4o-mini': {
|
|
101
|
+
id: 'openai/gpt-4o-mini',
|
|
102
|
+
displayName: 'GPT-4o Mini',
|
|
103
|
+
description: 'OpenAI\'s fast and affordable model',
|
|
104
|
+
},
|
|
105
|
+
'google/gemini-pro-1.5': {
|
|
106
|
+
id: 'google/gemini-pro-1.5',
|
|
107
|
+
displayName: 'Gemini Pro 1.5',
|
|
108
|
+
description: 'Google\'s advanced model',
|
|
109
|
+
},
|
|
110
|
+
'meta-llama/llama-3.1-405b-instruct': {
|
|
111
|
+
id: 'meta-llama/llama-3.1-405b-instruct',
|
|
112
|
+
displayName: 'Llama 3.1 405B',
|
|
113
|
+
description: 'Meta\'s largest open model',
|
|
114
|
+
},
|
|
115
|
+
'mistralai/mistral-large': {
|
|
116
|
+
id: 'mistralai/mistral-large',
|
|
117
|
+
displayName: 'Mistral Large',
|
|
118
|
+
description: 'Mistral\'s flagship model',
|
|
119
|
+
},
|
|
120
|
+
'deepseek/deepseek-chat': {
|
|
121
|
+
id: 'deepseek/deepseek-chat',
|
|
122
|
+
displayName: 'DeepSeek Chat',
|
|
123
|
+
description: 'DeepSeek\'s conversational model',
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Available OpenAI models
|
|
128
|
+
* Users with ChatGPT Plus/Team/Enterprise subscriptions can use these models
|
|
129
|
+
*/
|
|
130
|
+
exports.OPENAI_MODELS = {
|
|
131
|
+
'gpt-4o': {
|
|
132
|
+
id: 'gpt-4o',
|
|
133
|
+
displayName: 'GPT-4o',
|
|
134
|
+
description: 'Most capable model for complex tasks',
|
|
135
|
+
},
|
|
136
|
+
'gpt-4o-mini': {
|
|
137
|
+
id: 'gpt-4o-mini',
|
|
138
|
+
displayName: 'GPT-4o Mini',
|
|
139
|
+
description: 'Fast and affordable for most tasks',
|
|
140
|
+
},
|
|
141
|
+
'gpt-4-turbo': {
|
|
142
|
+
id: 'gpt-4-turbo',
|
|
143
|
+
displayName: 'GPT-4 Turbo',
|
|
144
|
+
description: 'Previous generation flagship',
|
|
145
|
+
},
|
|
146
|
+
'gpt-3.5-turbo': {
|
|
147
|
+
id: 'gpt-3.5-turbo',
|
|
148
|
+
displayName: 'GPT-3.5 Turbo',
|
|
149
|
+
description: 'Fast and cost-effective',
|
|
150
|
+
},
|
|
151
|
+
'o1': {
|
|
152
|
+
id: 'o1',
|
|
153
|
+
displayName: 'o1',
|
|
154
|
+
description: 'Advanced reasoning model',
|
|
155
|
+
},
|
|
156
|
+
'o1-mini': {
|
|
157
|
+
id: 'o1-mini',
|
|
158
|
+
displayName: 'o1 Mini',
|
|
159
|
+
description: 'Fast reasoning model',
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Popular Ollama models with their details
|
|
164
|
+
* Users can use any model available on their Ollama server
|
|
165
|
+
*/
|
|
166
|
+
exports.OLLAMA_MODELS = {
|
|
167
|
+
'llama3.2': { displayName: 'Llama 3.2', size: '3B' },
|
|
168
|
+
'llama3.1': { displayName: 'Llama 3.1', size: '8B' },
|
|
169
|
+
'llama3.1:70b': { displayName: 'Llama 3.1 70B', size: '70B' },
|
|
170
|
+
'mistral': { displayName: 'Mistral', size: '7B' },
|
|
171
|
+
'mixtral': { displayName: 'Mixtral', size: '47B' },
|
|
172
|
+
'codellama': { displayName: 'Code Llama', size: '7B' },
|
|
173
|
+
'deepseek-coder': { displayName: 'DeepSeek Coder', size: '6.7B' },
|
|
174
|
+
'qwen2.5': { displayName: 'Qwen 2.5', size: '7B' },
|
|
175
|
+
'phi3': { displayName: 'Phi-3', size: '3.8B' },
|
|
176
|
+
'gemma2': { displayName: 'Gemma 2', size: '9B' },
|
|
177
|
+
};
|
|
178
|
+
exports.DEFAULT_MODEL = 'opus-4-5';
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Task Queue Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages parallel task execution with configurable concurrency limits.
|
|
6
|
+
* Provides queue management, status tracking, and settings persistence.
|
|
7
|
+
* Settings are stored encrypted in the database using SecureSettingsRepository.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.TaskQueueManager = void 0;
|
|
44
|
+
const electron_1 = require("electron");
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const types_1 = require("../../shared/types");
|
|
48
|
+
const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
|
|
49
|
+
const LEGACY_SETTINGS_FILE = 'queue-settings.json';
|
|
50
|
+
class TaskQueueManager {
|
|
51
|
+
constructor(callbacks) {
|
|
52
|
+
this.queuedTaskIds = []; // FIFO queue of task IDs
|
|
53
|
+
this.runningTaskIds = new Set(); // Currently executing task IDs
|
|
54
|
+
this.taskStartTimes = new Map(); // Track when each task started
|
|
55
|
+
this.initialized = false;
|
|
56
|
+
this.callbacks = callbacks;
|
|
57
|
+
const userDataPath = electron_1.app.getPath('userData');
|
|
58
|
+
this.legacySettingsPath = path.join(userDataPath, LEGACY_SETTINGS_FILE);
|
|
59
|
+
// Migrate from legacy file if needed
|
|
60
|
+
this.migrateFromLegacyFile();
|
|
61
|
+
this.settings = this.loadSettings();
|
|
62
|
+
// Start periodic timeout check (every minute)
|
|
63
|
+
this.timeoutCheckInterval = setInterval(() => this.checkForTimedOutTasks(), 60 * 1000);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Migrate settings from legacy JSON file to encrypted database
|
|
67
|
+
*/
|
|
68
|
+
migrateFromLegacyFile() {
|
|
69
|
+
if (TaskQueueManager.migrationCompleted)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
|
|
76
|
+
if (repository.exists('queue')) {
|
|
77
|
+
TaskQueueManager.migrationCompleted = true;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!fs.existsSync(this.legacySettingsPath)) {
|
|
81
|
+
TaskQueueManager.migrationCompleted = true;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
console.log('[TaskQueueManager] Migrating settings from legacy JSON file to encrypted database...');
|
|
85
|
+
// Create backup before migration
|
|
86
|
+
const backupPath = this.legacySettingsPath + '.migration-backup';
|
|
87
|
+
fs.copyFileSync(this.legacySettingsPath, backupPath);
|
|
88
|
+
try {
|
|
89
|
+
const data = fs.readFileSync(this.legacySettingsPath, 'utf-8');
|
|
90
|
+
const parsed = JSON.parse(data);
|
|
91
|
+
const merged = { ...types_1.DEFAULT_QUEUE_SETTINGS, ...parsed };
|
|
92
|
+
repository.save('queue', merged);
|
|
93
|
+
console.log('[TaskQueueManager] Settings migrated to encrypted database');
|
|
94
|
+
// Migration successful - delete backup and original
|
|
95
|
+
fs.unlinkSync(backupPath);
|
|
96
|
+
fs.unlinkSync(this.legacySettingsPath);
|
|
97
|
+
console.log('[TaskQueueManager] Migration complete, cleaned up legacy files');
|
|
98
|
+
TaskQueueManager.migrationCompleted = true;
|
|
99
|
+
}
|
|
100
|
+
catch (migrationError) {
|
|
101
|
+
console.error('[TaskQueueManager] Migration failed, backup preserved at:', backupPath);
|
|
102
|
+
throw migrationError;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error('[TaskQueueManager] Migration failed:', error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Cleanup resources (call on shutdown)
|
|
111
|
+
*/
|
|
112
|
+
destroy() {
|
|
113
|
+
if (this.timeoutCheckInterval) {
|
|
114
|
+
clearInterval(this.timeoutCheckInterval);
|
|
115
|
+
this.timeoutCheckInterval = undefined;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Initialize the queue manager - recover queue from database on startup
|
|
120
|
+
* Should be called after database is ready
|
|
121
|
+
*/
|
|
122
|
+
async initialize(queuedTasks, runningTasks) {
|
|
123
|
+
if (this.initialized) {
|
|
124
|
+
console.log('[TaskQueueManager] Already initialized, skipping');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
console.log('[TaskQueueManager] Initializing queue manager');
|
|
128
|
+
console.log(`[TaskQueueManager] Found ${queuedTasks.length} queued tasks, ${runningTasks.length} running tasks`);
|
|
129
|
+
// Restore queued tasks in FIFO order by creation time
|
|
130
|
+
this.queuedTaskIds = queuedTasks
|
|
131
|
+
.sort((a, b) => a.createdAt - b.createdAt)
|
|
132
|
+
.map(t => t.id);
|
|
133
|
+
// Track currently running tasks
|
|
134
|
+
runningTasks.forEach(t => this.runningTaskIds.add(t.id));
|
|
135
|
+
this.initialized = true;
|
|
136
|
+
// Start processing queue if there are slots available
|
|
137
|
+
await this.processQueue();
|
|
138
|
+
// Emit initial queue status
|
|
139
|
+
this.emitQueueUpdate();
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Enqueue a new task - either start immediately or add to queue
|
|
143
|
+
*
|
|
144
|
+
* Sub-agents (tasks with parentTaskId) bypass the concurrency limit to prevent
|
|
145
|
+
* deadlocks where a parent task waits for sub-agents that are stuck in the queue.
|
|
146
|
+
*/
|
|
147
|
+
async enqueue(task) {
|
|
148
|
+
console.log(`[TaskQueueManager] Enqueueing task ${task.id}: ${task.title}`);
|
|
149
|
+
// Sub-agents bypass concurrency limits to prevent deadlock
|
|
150
|
+
// (parent would wait forever for sub-agents stuck in queue)
|
|
151
|
+
const isSubAgent = !!task.parentTaskId;
|
|
152
|
+
if (isSubAgent) {
|
|
153
|
+
console.log(`[TaskQueueManager] Starting sub-agent immediately (bypasses concurrency limit)`);
|
|
154
|
+
await this.startTask(task);
|
|
155
|
+
}
|
|
156
|
+
else if (this.canStartImmediately()) {
|
|
157
|
+
console.log(`[TaskQueueManager] Starting task immediately (${this.runningTaskIds.size}/${this.settings.maxConcurrentTasks} slots used)`);
|
|
158
|
+
await this.startTask(task);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
console.log(`[TaskQueueManager] Queue full, adding task to queue (position: ${this.queuedTaskIds.length + 1})`);
|
|
162
|
+
this.queuedTaskIds.push(task.id);
|
|
163
|
+
this.callbacks.updateTaskStatus(task.id, 'queued');
|
|
164
|
+
this.emitQueueUpdate();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Called when a task finishes (completed, failed, or cancelled)
|
|
169
|
+
*/
|
|
170
|
+
async onTaskFinished(taskId) {
|
|
171
|
+
console.log(`[TaskQueueManager] Task ${taskId} finished`);
|
|
172
|
+
// Remove from running set and clear start time
|
|
173
|
+
this.runningTaskIds.delete(taskId);
|
|
174
|
+
this.taskStartTimes.delete(taskId);
|
|
175
|
+
// Process next task in queue
|
|
176
|
+
await this.processQueue();
|
|
177
|
+
// Emit updated status
|
|
178
|
+
this.emitQueueUpdate();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Cancel a queued task (remove from queue without starting)
|
|
182
|
+
* Returns true if task was in queue and removed
|
|
183
|
+
*/
|
|
184
|
+
cancelQueuedTask(taskId) {
|
|
185
|
+
const index = this.queuedTaskIds.indexOf(taskId);
|
|
186
|
+
if (index !== -1) {
|
|
187
|
+
console.log(`[TaskQueueManager] Removing task ${taskId} from queue`);
|
|
188
|
+
this.queuedTaskIds.splice(index, 1);
|
|
189
|
+
this.emitQueueUpdate();
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if a task is currently in the queue
|
|
196
|
+
*/
|
|
197
|
+
isQueued(taskId) {
|
|
198
|
+
return this.queuedTaskIds.includes(taskId);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if a task is currently running
|
|
202
|
+
*/
|
|
203
|
+
isRunning(taskId) {
|
|
204
|
+
return this.runningTaskIds.has(taskId);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clear all stuck tasks from the running set
|
|
208
|
+
* This should be used to recover from stuck state when tasks fail to clean up
|
|
209
|
+
* Returns the number of tasks cleared
|
|
210
|
+
*/
|
|
211
|
+
clearStuckTasks() {
|
|
212
|
+
const clearedRunning = this.runningTaskIds.size;
|
|
213
|
+
const clearedQueued = this.queuedTaskIds.length;
|
|
214
|
+
console.log(`[TaskQueueManager] Clearing ${clearedRunning} running tasks and ${clearedQueued} queued tasks`);
|
|
215
|
+
// Clear running tasks and their start times
|
|
216
|
+
this.runningTaskIds.clear();
|
|
217
|
+
this.taskStartTimes.clear();
|
|
218
|
+
// Clear queued tasks
|
|
219
|
+
this.queuedTaskIds = [];
|
|
220
|
+
// Emit update
|
|
221
|
+
this.emitQueueUpdate();
|
|
222
|
+
return { clearedRunning, clearedQueued };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get current queue status for UI
|
|
226
|
+
*/
|
|
227
|
+
getStatus() {
|
|
228
|
+
return {
|
|
229
|
+
runningCount: this.runningTaskIds.size,
|
|
230
|
+
queuedCount: this.queuedTaskIds.length,
|
|
231
|
+
runningTaskIds: Array.from(this.runningTaskIds),
|
|
232
|
+
queuedTaskIds: [...this.queuedTaskIds],
|
|
233
|
+
maxConcurrent: this.settings.maxConcurrentTasks,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get current settings
|
|
238
|
+
*/
|
|
239
|
+
getSettings() {
|
|
240
|
+
return { ...this.settings };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Update settings
|
|
244
|
+
*/
|
|
245
|
+
saveSettings(newSettings) {
|
|
246
|
+
// Validate maxConcurrentTasks
|
|
247
|
+
if (newSettings.maxConcurrentTasks !== undefined) {
|
|
248
|
+
newSettings.maxConcurrentTasks = Math.max(1, Math.min(10, newSettings.maxConcurrentTasks));
|
|
249
|
+
}
|
|
250
|
+
// Validate taskTimeoutMinutes (5 min to 4 hours)
|
|
251
|
+
if (newSettings.taskTimeoutMinutes !== undefined) {
|
|
252
|
+
newSettings.taskTimeoutMinutes = Math.max(5, Math.min(240, newSettings.taskTimeoutMinutes));
|
|
253
|
+
}
|
|
254
|
+
this.settings = { ...this.settings, ...newSettings };
|
|
255
|
+
try {
|
|
256
|
+
if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
|
|
257
|
+
const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
|
|
258
|
+
repository.save('queue', this.settings);
|
|
259
|
+
console.log('[TaskQueueManager] Settings saved to encrypted database');
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
console.warn('[TaskQueueManager] SecureSettingsRepository not initialized, settings not persisted');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
console.error('[TaskQueueManager] Failed to save settings:', error);
|
|
267
|
+
}
|
|
268
|
+
// Process queue in case we increased concurrency
|
|
269
|
+
this.processQueue();
|
|
270
|
+
this.emitQueueUpdate();
|
|
271
|
+
}
|
|
272
|
+
// ===== Private Methods =====
|
|
273
|
+
/**
|
|
274
|
+
* Process the queue - start tasks if slots are available
|
|
275
|
+
*/
|
|
276
|
+
async processQueue() {
|
|
277
|
+
while (this.canStartImmediately() && this.queuedTaskIds.length > 0) {
|
|
278
|
+
const nextTaskId = this.queuedTaskIds.shift();
|
|
279
|
+
const task = this.callbacks.getTaskById(nextTaskId);
|
|
280
|
+
if (task && task.status === 'queued') {
|
|
281
|
+
console.log(`[TaskQueueManager] Dequeuing task ${nextTaskId}`);
|
|
282
|
+
await this.startTask(task);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
console.log(`[TaskQueueManager] Skipping task ${nextTaskId} (not found or status changed)`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Check if we can start a task immediately
|
|
291
|
+
*/
|
|
292
|
+
canStartImmediately() {
|
|
293
|
+
return this.runningTaskIds.size < this.settings.maxConcurrentTasks;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Start a task
|
|
297
|
+
*/
|
|
298
|
+
async startTask(task) {
|
|
299
|
+
this.runningTaskIds.add(task.id);
|
|
300
|
+
this.taskStartTimes.set(task.id, Date.now());
|
|
301
|
+
this.emitQueueUpdate();
|
|
302
|
+
try {
|
|
303
|
+
await this.callbacks.startTaskImmediate(task);
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
console.error(`[TaskQueueManager] Failed to start task ${task.id}:`, error);
|
|
307
|
+
this.runningTaskIds.delete(task.id);
|
|
308
|
+
this.taskStartTimes.delete(task.id);
|
|
309
|
+
this.emitQueueUpdate();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Emit queue status update
|
|
314
|
+
*/
|
|
315
|
+
emitQueueUpdate() {
|
|
316
|
+
this.callbacks.emitQueueUpdate(this.getStatus());
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Check for tasks that have exceeded the timeout and clear them
|
|
320
|
+
*/
|
|
321
|
+
async checkForTimedOutTasks() {
|
|
322
|
+
const now = Date.now();
|
|
323
|
+
const timeoutMs = this.settings.taskTimeoutMinutes * 60 * 1000;
|
|
324
|
+
const timedOutTasks = [];
|
|
325
|
+
// Find tasks that have exceeded the timeout
|
|
326
|
+
for (const [taskId, startTime] of this.taskStartTimes) {
|
|
327
|
+
const elapsed = now - startTime;
|
|
328
|
+
if (elapsed > timeoutMs) {
|
|
329
|
+
const elapsedMinutes = Math.round(elapsed / 60000);
|
|
330
|
+
console.log(`[TaskQueueManager] Task ${taskId} has timed out (running for ${elapsedMinutes} minutes, timeout: ${this.settings.taskTimeoutMinutes} minutes)`);
|
|
331
|
+
timedOutTasks.push(taskId);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Process timed out tasks
|
|
335
|
+
for (const taskId of timedOutTasks) {
|
|
336
|
+
try {
|
|
337
|
+
// Notify daemon to handle the timeout (cancel task, cleanup resources)
|
|
338
|
+
await this.callbacks.onTaskTimeout(taskId);
|
|
339
|
+
// Remove from tracking (daemon will call onTaskFinished which also removes, but do it here just in case)
|
|
340
|
+
this.runningTaskIds.delete(taskId);
|
|
341
|
+
this.taskStartTimes.delete(taskId);
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
console.error(`[TaskQueueManager] Error handling timeout for task ${taskId}:`, error);
|
|
345
|
+
// Force remove from tracking even if daemon callback fails
|
|
346
|
+
this.runningTaskIds.delete(taskId);
|
|
347
|
+
this.taskStartTimes.delete(taskId);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// If any tasks were cleared, process the queue and emit update
|
|
351
|
+
if (timedOutTasks.length > 0) {
|
|
352
|
+
await this.processQueue();
|
|
353
|
+
this.emitQueueUpdate();
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Load settings from encrypted database
|
|
358
|
+
*/
|
|
359
|
+
loadSettings() {
|
|
360
|
+
try {
|
|
361
|
+
if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
|
|
362
|
+
const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
|
|
363
|
+
const stored = repository.load('queue');
|
|
364
|
+
if (stored) {
|
|
365
|
+
// Merge with defaults to handle missing fields
|
|
366
|
+
console.log('[TaskQueueManager] Loaded settings from encrypted database');
|
|
367
|
+
return { ...types_1.DEFAULT_QUEUE_SETTINGS, ...stored };
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
console.error('[TaskQueueManager] Failed to load settings:', error);
|
|
373
|
+
}
|
|
374
|
+
return { ...types_1.DEFAULT_QUEUE_SETTINGS };
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
exports.TaskQueueManager = TaskQueueManager;
|
|
378
|
+
TaskQueueManager.migrationCompleted = false;
|