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,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ToolAdapter - Adapts CoWork's ToolRegistry to the MCP protocol
|
|
4
|
+
*
|
|
5
|
+
* Converts tool definitions from LLMTool format to MCPTool format
|
|
6
|
+
* and handles tool execution through the ToolRegistry.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ToolAdapter = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Adapts a ToolRegistry to the ToolProvider interface expected by MCPHostServer
|
|
12
|
+
*/
|
|
13
|
+
class ToolAdapter {
|
|
14
|
+
constructor(registry, options = {}) {
|
|
15
|
+
this.registry = registry;
|
|
16
|
+
this.exposedTools = options.exposedTools ? new Set(options.exposedTools) : new Set();
|
|
17
|
+
this.excludedTools = new Set(options.excludedTools || [
|
|
18
|
+
// Default exclusions - dangerous or internal tools
|
|
19
|
+
'computer_tool', // Computer control
|
|
20
|
+
'bash', // Direct shell access
|
|
21
|
+
'text_editor', // Direct file editing
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get tools in MCP format
|
|
26
|
+
*/
|
|
27
|
+
getTools() {
|
|
28
|
+
const llmTools = this.registry.getTools();
|
|
29
|
+
// Filter and convert tools
|
|
30
|
+
return llmTools
|
|
31
|
+
.filter((tool) => this.shouldExposePlugin(tool.name))
|
|
32
|
+
.map((tool) => this.convertTool(tool));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Execute a tool and return MCP-formatted result
|
|
36
|
+
*/
|
|
37
|
+
async executeTool(name, args) {
|
|
38
|
+
// Verify tool is exposed
|
|
39
|
+
if (!this.shouldExposePlugin(name)) {
|
|
40
|
+
throw new Error(`Tool ${name} is not available`);
|
|
41
|
+
}
|
|
42
|
+
// Execute through registry
|
|
43
|
+
const result = await this.registry.executeTool(name, args);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if a tool should be exposed via MCP
|
|
48
|
+
*/
|
|
49
|
+
shouldExposePlugin(name) {
|
|
50
|
+
// If exposedTools is set, only expose those
|
|
51
|
+
if (this.exposedTools.size > 0) {
|
|
52
|
+
return this.exposedTools.has(name);
|
|
53
|
+
}
|
|
54
|
+
// Otherwise, expose all except excluded
|
|
55
|
+
return !this.excludedTools.has(name);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Convert an LLMTool to MCPTool format
|
|
59
|
+
*/
|
|
60
|
+
convertTool(tool) {
|
|
61
|
+
return {
|
|
62
|
+
name: tool.name,
|
|
63
|
+
description: tool.description,
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: tool.input_schema.properties,
|
|
67
|
+
required: tool.input_schema.required,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Add a tool to the exposed list
|
|
73
|
+
*/
|
|
74
|
+
exposeTool(name) {
|
|
75
|
+
this.exposedTools.add(name);
|
|
76
|
+
this.excludedTools.delete(name);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove a tool from exposure
|
|
80
|
+
*/
|
|
81
|
+
hideTool(name) {
|
|
82
|
+
this.exposedTools.delete(name);
|
|
83
|
+
this.excludedTools.add(name);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get list of available tool names
|
|
87
|
+
*/
|
|
88
|
+
getAvailableToolNames() {
|
|
89
|
+
return this.registry.getTools()
|
|
90
|
+
.filter((tool) => this.shouldExposePlugin(tool.name))
|
|
91
|
+
.map((tool) => tool.name);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get list of all tool names (including hidden)
|
|
95
|
+
*/
|
|
96
|
+
getAllToolNames() {
|
|
97
|
+
return this.registry.getTools().map((tool) => tool.name);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.ToolAdapter = ToolAdapter;
|
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCPRegistryManager - Manages discovery and installation of MCP servers from a registry
|
|
4
|
+
*
|
|
5
|
+
* Provides functionality to:
|
|
6
|
+
* - Fetch the MCP server registry
|
|
7
|
+
* - Search for servers by name, tags, or category
|
|
8
|
+
* - Install servers from the registry
|
|
9
|
+
* - Check for updates to installed servers
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MCPRegistryManager = void 0;
|
|
13
|
+
const uuid_1 = require("uuid");
|
|
14
|
+
const child_process_1 = require("child_process");
|
|
15
|
+
const util_1 = require("util");
|
|
16
|
+
const settings_1 = require("../settings");
|
|
17
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
18
|
+
// Cache duration in milliseconds (15 minutes)
|
|
19
|
+
const REGISTRY_CACHE_DURATION = 15 * 60 * 1000;
|
|
20
|
+
// Built-in registry of common MCP servers
|
|
21
|
+
// This is used as a fallback when the remote registry is unavailable
|
|
22
|
+
// Package versions verified against npm registry as of 2026-01
|
|
23
|
+
const BUILTIN_REGISTRY = {
|
|
24
|
+
version: '1.1.0',
|
|
25
|
+
lastUpdated: new Date().toISOString(),
|
|
26
|
+
servers: [
|
|
27
|
+
{
|
|
28
|
+
id: 'filesystem',
|
|
29
|
+
name: 'Filesystem',
|
|
30
|
+
description: 'Provides secure file system access with configurable root directories',
|
|
31
|
+
version: '2026.1.14',
|
|
32
|
+
author: 'Anthropic',
|
|
33
|
+
homepage: 'https://modelcontextprotocol.io',
|
|
34
|
+
repository: 'https://github.com/modelcontextprotocol/servers',
|
|
35
|
+
license: 'MIT',
|
|
36
|
+
installMethod: 'npm',
|
|
37
|
+
installCommand: 'npx',
|
|
38
|
+
packageName: '@modelcontextprotocol/server-filesystem',
|
|
39
|
+
transport: 'stdio',
|
|
40
|
+
defaultCommand: 'npx',
|
|
41
|
+
defaultArgs: ['-y', '@modelcontextprotocol/server-filesystem'],
|
|
42
|
+
tools: [
|
|
43
|
+
{ name: 'read_file', description: 'Read complete file contents' },
|
|
44
|
+
{ name: 'read_multiple_files', description: 'Read multiple files at once' },
|
|
45
|
+
{ name: 'write_file', description: 'Write content to file' },
|
|
46
|
+
{ name: 'edit_file', description: 'Edit file with line-based operations' },
|
|
47
|
+
{ name: 'create_directory', description: 'Create a new directory' },
|
|
48
|
+
{ name: 'list_directory', description: 'List directory contents' },
|
|
49
|
+
{ name: 'directory_tree', description: 'Get recursive directory tree' },
|
|
50
|
+
{ name: 'move_file', description: 'Move or rename files and directories' },
|
|
51
|
+
{ name: 'search_files', description: 'Search for files matching pattern' },
|
|
52
|
+
{ name: 'get_file_info', description: 'Get file metadata' },
|
|
53
|
+
],
|
|
54
|
+
tags: ['filesystem', 'files', 'official'],
|
|
55
|
+
category: 'filesystem',
|
|
56
|
+
verified: true,
|
|
57
|
+
featured: true,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'github',
|
|
61
|
+
name: 'GitHub',
|
|
62
|
+
description: 'Provides GitHub API integration for repository management. Requires GITHUB_PERSONAL_ACCESS_TOKEN.',
|
|
63
|
+
version: '2025.4.8',
|
|
64
|
+
author: 'Anthropic',
|
|
65
|
+
homepage: 'https://modelcontextprotocol.io',
|
|
66
|
+
repository: 'https://github.com/modelcontextprotocol/servers',
|
|
67
|
+
license: 'MIT',
|
|
68
|
+
installMethod: 'npm',
|
|
69
|
+
installCommand: 'npx',
|
|
70
|
+
packageName: '@modelcontextprotocol/server-github',
|
|
71
|
+
transport: 'stdio',
|
|
72
|
+
defaultCommand: 'npx',
|
|
73
|
+
defaultArgs: ['-y', '@modelcontextprotocol/server-github'],
|
|
74
|
+
defaultEnv: {
|
|
75
|
+
GITHUB_PERSONAL_ACCESS_TOKEN: '',
|
|
76
|
+
},
|
|
77
|
+
tools: [
|
|
78
|
+
{ name: 'create_or_update_file', description: 'Create or update a file in a repository' },
|
|
79
|
+
{ name: 'search_repositories', description: 'Search GitHub repositories' },
|
|
80
|
+
{ name: 'create_repository', description: 'Create a new repository' },
|
|
81
|
+
{ name: 'get_file_contents', description: 'Get contents of a file in a repository' },
|
|
82
|
+
{ name: 'push_files', description: 'Push multiple files to a repository' },
|
|
83
|
+
{ name: 'create_issue', description: 'Create a new issue' },
|
|
84
|
+
{ name: 'create_pull_request', description: 'Create a pull request' },
|
|
85
|
+
{ name: 'fork_repository', description: 'Fork a repository' },
|
|
86
|
+
{ name: 'create_branch', description: 'Create a new branch' },
|
|
87
|
+
],
|
|
88
|
+
tags: ['github', 'git', 'version-control', 'official'],
|
|
89
|
+
category: 'development',
|
|
90
|
+
verified: true,
|
|
91
|
+
featured: true,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: 'puppeteer',
|
|
95
|
+
name: 'Puppeteer',
|
|
96
|
+
description: 'Browser automation and web scraping using Puppeteer',
|
|
97
|
+
version: '2025.5.12',
|
|
98
|
+
author: 'Anthropic',
|
|
99
|
+
homepage: 'https://modelcontextprotocol.io',
|
|
100
|
+
repository: 'https://github.com/modelcontextprotocol/servers',
|
|
101
|
+
license: 'MIT',
|
|
102
|
+
installMethod: 'npm',
|
|
103
|
+
installCommand: 'npx',
|
|
104
|
+
packageName: '@modelcontextprotocol/server-puppeteer',
|
|
105
|
+
transport: 'stdio',
|
|
106
|
+
defaultCommand: 'npx',
|
|
107
|
+
defaultArgs: ['-y', '@modelcontextprotocol/server-puppeteer'],
|
|
108
|
+
tools: [
|
|
109
|
+
{ name: 'puppeteer_navigate', description: 'Navigate to a URL' },
|
|
110
|
+
{ name: 'puppeteer_screenshot', description: 'Take a screenshot of the page' },
|
|
111
|
+
{ name: 'puppeteer_click', description: 'Click an element on the page' },
|
|
112
|
+
{ name: 'puppeteer_fill', description: 'Fill out an input field' },
|
|
113
|
+
{ name: 'puppeteer_select', description: 'Select an option from a dropdown' },
|
|
114
|
+
{ name: 'puppeteer_hover', description: 'Hover over an element' },
|
|
115
|
+
{ name: 'puppeteer_evaluate', description: 'Execute JavaScript in the page' },
|
|
116
|
+
],
|
|
117
|
+
tags: ['browser', 'automation', 'web', 'official'],
|
|
118
|
+
category: 'automation',
|
|
119
|
+
verified: true,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'memory',
|
|
123
|
+
name: 'Memory',
|
|
124
|
+
description: 'Knowledge graph-based persistent memory system',
|
|
125
|
+
version: '2026.1.26',
|
|
126
|
+
author: 'Anthropic',
|
|
127
|
+
homepage: 'https://modelcontextprotocol.io',
|
|
128
|
+
repository: 'https://github.com/modelcontextprotocol/servers',
|
|
129
|
+
license: 'MIT',
|
|
130
|
+
installMethod: 'npm',
|
|
131
|
+
installCommand: 'npx',
|
|
132
|
+
packageName: '@modelcontextprotocol/server-memory',
|
|
133
|
+
transport: 'stdio',
|
|
134
|
+
defaultCommand: 'npx',
|
|
135
|
+
defaultArgs: ['-y', '@modelcontextprotocol/server-memory'],
|
|
136
|
+
tools: [
|
|
137
|
+
{ name: 'create_entities', description: 'Create new entities in the knowledge graph' },
|
|
138
|
+
{ name: 'create_relations', description: 'Create relations between entities' },
|
|
139
|
+
{ name: 'add_observations', description: 'Add observations to entities' },
|
|
140
|
+
{ name: 'delete_entities', description: 'Delete entities from the graph' },
|
|
141
|
+
{ name: 'delete_observations', description: 'Delete observations from entities' },
|
|
142
|
+
{ name: 'delete_relations', description: 'Delete relations between entities' },
|
|
143
|
+
{ name: 'read_graph', description: 'Read the entire knowledge graph' },
|
|
144
|
+
{ name: 'search_nodes', description: 'Search for nodes in the graph' },
|
|
145
|
+
{ name: 'open_nodes', description: 'Open specific nodes by name' },
|
|
146
|
+
],
|
|
147
|
+
tags: ['memory', 'knowledge-graph', 'persistence', 'official'],
|
|
148
|
+
category: 'memory',
|
|
149
|
+
verified: true,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: 'postgres',
|
|
153
|
+
name: 'PostgreSQL',
|
|
154
|
+
description: 'PostgreSQL database read-only queries. Requires POSTGRES_CONNECTION_STRING.',
|
|
155
|
+
version: '0.6.2',
|
|
156
|
+
author: 'Anthropic',
|
|
157
|
+
homepage: 'https://modelcontextprotocol.io',
|
|
158
|
+
repository: 'https://github.com/modelcontextprotocol/servers',
|
|
159
|
+
license: 'MIT',
|
|
160
|
+
installMethod: 'npm',
|
|
161
|
+
installCommand: 'npx',
|
|
162
|
+
packageName: '@modelcontextprotocol/server-postgres',
|
|
163
|
+
transport: 'stdio',
|
|
164
|
+
defaultCommand: 'npx',
|
|
165
|
+
defaultArgs: ['-y', '@modelcontextprotocol/server-postgres'],
|
|
166
|
+
defaultEnv: {
|
|
167
|
+
POSTGRES_CONNECTION_STRING: '',
|
|
168
|
+
},
|
|
169
|
+
tools: [
|
|
170
|
+
{ name: 'query', description: 'Execute a read-only SQL query' },
|
|
171
|
+
],
|
|
172
|
+
tags: ['database', 'postgres', 'sql', 'official'],
|
|
173
|
+
category: 'database',
|
|
174
|
+
verified: true,
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'sequential-thinking',
|
|
178
|
+
name: 'Sequential Thinking',
|
|
179
|
+
description: 'MCP server for sequential thinking and problem solving',
|
|
180
|
+
version: '2025.12.18',
|
|
181
|
+
author: 'Anthropic',
|
|
182
|
+
homepage: 'https://modelcontextprotocol.io',
|
|
183
|
+
repository: 'https://github.com/modelcontextprotocol/servers',
|
|
184
|
+
license: 'MIT',
|
|
185
|
+
installMethod: 'npm',
|
|
186
|
+
installCommand: 'npx',
|
|
187
|
+
packageName: '@modelcontextprotocol/server-sequential-thinking',
|
|
188
|
+
transport: 'stdio',
|
|
189
|
+
defaultCommand: 'npx',
|
|
190
|
+
defaultArgs: ['-y', '@modelcontextprotocol/server-sequential-thinking'],
|
|
191
|
+
tools: [
|
|
192
|
+
{ name: 'sequentialthinking', description: 'Sequential thinking and problem solving' },
|
|
193
|
+
],
|
|
194
|
+
tags: ['thinking', 'reasoning', 'official'],
|
|
195
|
+
category: 'reasoning',
|
|
196
|
+
verified: true,
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: 'everything',
|
|
200
|
+
name: 'Everything (Demo)',
|
|
201
|
+
description: 'MCP server that exercises all features of the MCP protocol. Useful for testing.',
|
|
202
|
+
version: '2026.1.26',
|
|
203
|
+
author: 'Anthropic',
|
|
204
|
+
homepage: 'https://modelcontextprotocol.io',
|
|
205
|
+
repository: 'https://github.com/modelcontextprotocol/servers',
|
|
206
|
+
license: 'MIT',
|
|
207
|
+
installMethod: 'npm',
|
|
208
|
+
installCommand: 'npx',
|
|
209
|
+
packageName: '@modelcontextprotocol/server-everything',
|
|
210
|
+
transport: 'stdio',
|
|
211
|
+
defaultCommand: 'npx',
|
|
212
|
+
defaultArgs: ['-y', '@modelcontextprotocol/server-everything'],
|
|
213
|
+
tools: [
|
|
214
|
+
{ name: 'echo', description: 'Echo back the input' },
|
|
215
|
+
{ name: 'add', description: 'Add two numbers' },
|
|
216
|
+
{ name: 'longRunningOperation', description: 'Test long-running operations' },
|
|
217
|
+
{ name: 'sampleLLM', description: 'Sample from an LLM' },
|
|
218
|
+
{ name: 'getTinyImage', description: 'Get a tiny test image' },
|
|
219
|
+
],
|
|
220
|
+
tags: ['demo', 'testing', 'official'],
|
|
221
|
+
category: 'testing',
|
|
222
|
+
verified: true,
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
};
|
|
226
|
+
class MCPRegistryManager {
|
|
227
|
+
/**
|
|
228
|
+
* Fetch the MCP server registry
|
|
229
|
+
*/
|
|
230
|
+
static async fetchRegistry(forceRefresh = false) {
|
|
231
|
+
// Check cache
|
|
232
|
+
if (!forceRefresh && this.registryCache && Date.now() - this.cacheTimestamp < REGISTRY_CACHE_DURATION) {
|
|
233
|
+
return this.registryCache;
|
|
234
|
+
}
|
|
235
|
+
const settings = settings_1.MCPSettingsManager.loadSettings();
|
|
236
|
+
if (!settings.registryEnabled) {
|
|
237
|
+
console.log('[MCPRegistryManager] Registry disabled, using built-in registry');
|
|
238
|
+
return BUILTIN_REGISTRY;
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
console.log(`[MCPRegistryManager] Fetching registry from ${settings.registryUrl}`);
|
|
242
|
+
const response = await fetch(settings.registryUrl, {
|
|
243
|
+
headers: {
|
|
244
|
+
Accept: 'application/json',
|
|
245
|
+
},
|
|
246
|
+
signal: AbortSignal.timeout(10000), // 10 second timeout
|
|
247
|
+
});
|
|
248
|
+
if (!response.ok) {
|
|
249
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
250
|
+
}
|
|
251
|
+
const registry = await response.json();
|
|
252
|
+
// Validate registry structure
|
|
253
|
+
if (!registry.version || !Array.isArray(registry.servers)) {
|
|
254
|
+
throw new Error('Invalid registry format');
|
|
255
|
+
}
|
|
256
|
+
// Update cache
|
|
257
|
+
this.registryCache = registry;
|
|
258
|
+
this.cacheTimestamp = Date.now();
|
|
259
|
+
console.log(`[MCPRegistryManager] Fetched ${registry.servers.length} servers from registry`);
|
|
260
|
+
return registry;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
// Only log on first failure or after cache expires
|
|
264
|
+
if (!this.registryCache) {
|
|
265
|
+
console.warn('[MCPRegistryManager] Failed to fetch registry, using built-in:', error.message);
|
|
266
|
+
}
|
|
267
|
+
// Cache the built-in registry to prevent repeated fetch attempts
|
|
268
|
+
this.registryCache = BUILTIN_REGISTRY;
|
|
269
|
+
this.cacheTimestamp = Date.now();
|
|
270
|
+
return BUILTIN_REGISTRY;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Search for servers in the registry
|
|
275
|
+
*/
|
|
276
|
+
static async searchServers(options = {}) {
|
|
277
|
+
const registry = await this.fetchRegistry();
|
|
278
|
+
let results = [...registry.servers];
|
|
279
|
+
// Filter by query (search name and description)
|
|
280
|
+
if (options.query) {
|
|
281
|
+
const query = options.query.toLowerCase();
|
|
282
|
+
results = results.filter((server) => server.name.toLowerCase().includes(query) ||
|
|
283
|
+
server.description.toLowerCase().includes(query) ||
|
|
284
|
+
server.tags.some((tag) => tag.toLowerCase().includes(query)));
|
|
285
|
+
}
|
|
286
|
+
// Filter by tags
|
|
287
|
+
if (options.tags && options.tags.length > 0) {
|
|
288
|
+
const tags = options.tags.map((t) => t.toLowerCase());
|
|
289
|
+
results = results.filter((server) => tags.some((tag) => server.tags.some((t) => t.toLowerCase() === tag)));
|
|
290
|
+
}
|
|
291
|
+
// Filter by category
|
|
292
|
+
if (options.category) {
|
|
293
|
+
const category = options.category.toLowerCase();
|
|
294
|
+
results = results.filter((server) => server.category?.toLowerCase() === category);
|
|
295
|
+
}
|
|
296
|
+
// Filter by verified status
|
|
297
|
+
if (options.verified !== undefined) {
|
|
298
|
+
results = results.filter((server) => server.verified === options.verified);
|
|
299
|
+
}
|
|
300
|
+
// Apply pagination
|
|
301
|
+
const offset = options.offset ?? 0;
|
|
302
|
+
const limit = options.limit ?? 50;
|
|
303
|
+
results = results.slice(offset, offset + limit);
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get a specific server from the registry by ID
|
|
308
|
+
*/
|
|
309
|
+
static async getServer(serverId) {
|
|
310
|
+
const registry = await this.fetchRegistry();
|
|
311
|
+
return registry.servers.find((s) => s.id === serverId) || null;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Verify that an npm package exists on the registry
|
|
315
|
+
*/
|
|
316
|
+
static async verifyNpmPackage(packageName) {
|
|
317
|
+
try {
|
|
318
|
+
console.log(`[MCPRegistryManager] Verifying npm package: ${packageName}`);
|
|
319
|
+
const { stdout } = await execAsync(`npm view ${packageName} version`, {
|
|
320
|
+
timeout: 15000, // 15 second timeout
|
|
321
|
+
});
|
|
322
|
+
const version = stdout.trim();
|
|
323
|
+
console.log(`[MCPRegistryManager] Package ${packageName} exists, version: ${version}`);
|
|
324
|
+
return { exists: true, version };
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
// Check if it's a 404 (package not found)
|
|
328
|
+
if (error.message?.includes('404') || error.message?.includes('not found') || error.stderr?.includes('404')) {
|
|
329
|
+
console.warn(`[MCPRegistryManager] Package ${packageName} not found on npm`);
|
|
330
|
+
return { exists: false, error: `Package "${packageName}" not found on npm registry` };
|
|
331
|
+
}
|
|
332
|
+
// Other errors (network, timeout, etc.)
|
|
333
|
+
console.warn(`[MCPRegistryManager] Error verifying package ${packageName}:`, error.message);
|
|
334
|
+
return { exists: false, error: `Failed to verify package: ${error.message}` };
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Install a server from the registry
|
|
339
|
+
*/
|
|
340
|
+
static async installServer(entryId, extraArgs) {
|
|
341
|
+
const entry = await this.getServer(entryId);
|
|
342
|
+
if (!entry) {
|
|
343
|
+
throw new Error(`Server ${entryId} not found in registry`);
|
|
344
|
+
}
|
|
345
|
+
console.log(`[MCPRegistryManager] Installing server: ${entry.name}`);
|
|
346
|
+
// Check if already installed
|
|
347
|
+
const settings = settings_1.MCPSettingsManager.loadSettings();
|
|
348
|
+
const existingIndex = settings.servers.findIndex((s) => s.name === entry.name || (entry.packageName && s.command?.includes(entry.packageName)));
|
|
349
|
+
if (existingIndex !== -1) {
|
|
350
|
+
throw new Error(`Server ${entry.name} is already installed`);
|
|
351
|
+
}
|
|
352
|
+
// Verify the npm package exists before installing
|
|
353
|
+
if (entry.packageName && entry.installMethod === 'npm') {
|
|
354
|
+
const verification = await this.verifyNpmPackage(entry.packageName);
|
|
355
|
+
if (!verification.exists) {
|
|
356
|
+
throw new Error(verification.error || `Package "${entry.packageName}" is not available`);
|
|
357
|
+
}
|
|
358
|
+
// Update version to the actual npm version if available
|
|
359
|
+
if (verification.version) {
|
|
360
|
+
entry.version = verification.version;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Create server config from registry entry
|
|
364
|
+
const config = {
|
|
365
|
+
id: (0, uuid_1.v4)(),
|
|
366
|
+
name: entry.name,
|
|
367
|
+
description: entry.description,
|
|
368
|
+
enabled: true,
|
|
369
|
+
transport: entry.transport,
|
|
370
|
+
command: entry.defaultCommand || entry.installCommand,
|
|
371
|
+
args: [...(entry.defaultArgs || []), ...(extraArgs || [])],
|
|
372
|
+
env: entry.defaultEnv,
|
|
373
|
+
version: entry.version,
|
|
374
|
+
author: entry.author,
|
|
375
|
+
homepage: entry.homepage,
|
|
376
|
+
repository: entry.repository,
|
|
377
|
+
license: entry.license,
|
|
378
|
+
installedAt: Date.now(),
|
|
379
|
+
};
|
|
380
|
+
// Add to settings
|
|
381
|
+
settings_1.MCPSettingsManager.addServer(config);
|
|
382
|
+
console.log(`[MCPRegistryManager] Installed server: ${entry.name}`);
|
|
383
|
+
return config;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Uninstall a server (remove from settings)
|
|
387
|
+
*/
|
|
388
|
+
static async uninstallServer(serverId) {
|
|
389
|
+
console.log(`[MCPRegistryManager] Uninstalling server: ${serverId}`);
|
|
390
|
+
settings_1.MCPSettingsManager.removeServer(serverId);
|
|
391
|
+
console.log(`[MCPRegistryManager] Uninstalled server: ${serverId}`);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Check for updates to installed servers
|
|
395
|
+
*/
|
|
396
|
+
static async checkForUpdates() {
|
|
397
|
+
const registry = await this.fetchRegistry(true);
|
|
398
|
+
const settings = settings_1.MCPSettingsManager.loadSettings();
|
|
399
|
+
const updates = [];
|
|
400
|
+
for (const installed of settings.servers) {
|
|
401
|
+
// Try to match installed server with registry entry
|
|
402
|
+
const entry = registry.servers.find((e) => e.name === installed.name ||
|
|
403
|
+
(e.packageName && installed.command?.includes(e.packageName)));
|
|
404
|
+
if (entry && installed.version && entry.version !== installed.version) {
|
|
405
|
+
// Compare versions
|
|
406
|
+
if (this.isNewerVersion(entry.version, installed.version)) {
|
|
407
|
+
updates.push({
|
|
408
|
+
serverId: installed.id,
|
|
409
|
+
currentVersion: installed.version,
|
|
410
|
+
latestVersion: entry.version,
|
|
411
|
+
registryEntry: entry,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return updates;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Update an installed server to the latest version
|
|
420
|
+
*/
|
|
421
|
+
static async updateServer(serverId) {
|
|
422
|
+
const settings = settings_1.MCPSettingsManager.loadSettings();
|
|
423
|
+
const installed = settings.servers.find((s) => s.id === serverId);
|
|
424
|
+
if (!installed) {
|
|
425
|
+
throw new Error(`Server ${serverId} not found`);
|
|
426
|
+
}
|
|
427
|
+
const registry = await this.fetchRegistry(true);
|
|
428
|
+
const entry = registry.servers.find((e) => e.name === installed.name ||
|
|
429
|
+
(e.packageName && installed.command?.includes(e.packageName)));
|
|
430
|
+
if (!entry) {
|
|
431
|
+
throw new Error(`Server ${installed.name} not found in registry`);
|
|
432
|
+
}
|
|
433
|
+
// Update the server config
|
|
434
|
+
const updatedConfig = {
|
|
435
|
+
version: entry.version,
|
|
436
|
+
command: entry.defaultCommand || entry.installCommand,
|
|
437
|
+
args: entry.defaultArgs,
|
|
438
|
+
};
|
|
439
|
+
const result = settings_1.MCPSettingsManager.updateServer(serverId, updatedConfig);
|
|
440
|
+
if (!result) {
|
|
441
|
+
throw new Error(`Failed to update server ${serverId}`);
|
|
442
|
+
}
|
|
443
|
+
return result;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Get available categories from the registry
|
|
447
|
+
*/
|
|
448
|
+
static async getCategories() {
|
|
449
|
+
const registry = await this.fetchRegistry();
|
|
450
|
+
const categories = new Set();
|
|
451
|
+
for (const server of registry.servers) {
|
|
452
|
+
if (server.category) {
|
|
453
|
+
categories.add(server.category);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return Array.from(categories).sort();
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Get all unique tags from the registry
|
|
460
|
+
*/
|
|
461
|
+
static async getTags() {
|
|
462
|
+
const registry = await this.fetchRegistry();
|
|
463
|
+
const tags = new Set();
|
|
464
|
+
for (const server of registry.servers) {
|
|
465
|
+
for (const tag of server.tags) {
|
|
466
|
+
tags.add(tag);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
return Array.from(tags).sort();
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Clear the registry cache
|
|
473
|
+
*/
|
|
474
|
+
static clearCache() {
|
|
475
|
+
this.registryCache = null;
|
|
476
|
+
this.cacheTimestamp = 0;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Check if version A is newer than version B
|
|
480
|
+
*/
|
|
481
|
+
static isNewerVersion(versionA, versionB) {
|
|
482
|
+
const partsA = versionA.replace(/^v/, '').split('.').map(Number);
|
|
483
|
+
const partsB = versionB.replace(/^v/, '').split('.').map(Number);
|
|
484
|
+
for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
|
|
485
|
+
const a = partsA[i] || 0;
|
|
486
|
+
const b = partsB[i] || 0;
|
|
487
|
+
if (a > b)
|
|
488
|
+
return true;
|
|
489
|
+
if (a < b)
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
exports.MCPRegistryManager = MCPRegistryManager;
|
|
496
|
+
MCPRegistryManager.registryCache = null;
|
|
497
|
+
MCPRegistryManager.cacheTimestamp = 0;
|