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,395 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SearchProviderFactory = void 0;
|
|
37
|
+
const electron_1 = require("electron");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const types_1 = require("./types");
|
|
41
|
+
const tavily_provider_1 = require("./tavily-provider");
|
|
42
|
+
const brave_provider_1 = require("./brave-provider");
|
|
43
|
+
const serpapi_provider_1 = require("./serpapi-provider");
|
|
44
|
+
const google_provider_1 = require("./google-provider");
|
|
45
|
+
const SecureSettingsRepository_1 = require("../../database/SecureSettingsRepository");
|
|
46
|
+
const LEGACY_SETTINGS_FILE = 'search-settings.json';
|
|
47
|
+
const DEFAULT_SETTINGS = {
|
|
48
|
+
primaryProvider: null,
|
|
49
|
+
fallbackProvider: null,
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Factory for creating Search providers with fallback support
|
|
53
|
+
*/
|
|
54
|
+
class SearchProviderFactory {
|
|
55
|
+
/**
|
|
56
|
+
* Initialize the factory
|
|
57
|
+
*/
|
|
58
|
+
static initialize() {
|
|
59
|
+
const userDataPath = electron_1.app.getPath('userData');
|
|
60
|
+
this.legacySettingsPath = path.join(userDataPath, LEGACY_SETTINGS_FILE);
|
|
61
|
+
// Migrate from legacy JSON file to encrypted database
|
|
62
|
+
this.migrateFromLegacyFile();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Migrate settings from legacy JSON file to encrypted database
|
|
66
|
+
*/
|
|
67
|
+
static migrateFromLegacyFile() {
|
|
68
|
+
if (this.migrationCompleted)
|
|
69
|
+
return;
|
|
70
|
+
try {
|
|
71
|
+
// Check if SecureSettingsRepository is initialized
|
|
72
|
+
if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
|
|
73
|
+
console.log('[SearchProviderFactory] SecureSettingsRepository not yet initialized, skipping migration');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
|
|
77
|
+
// Check if already migrated to database
|
|
78
|
+
if (repository.exists('search')) {
|
|
79
|
+
this.migrationCompleted = true;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Check if legacy file exists
|
|
83
|
+
if (!fs.existsSync(this.legacySettingsPath)) {
|
|
84
|
+
console.log('[SearchProviderFactory] No legacy settings file found');
|
|
85
|
+
this.migrationCompleted = true;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
console.log('[SearchProviderFactory] Migrating settings from legacy JSON file to encrypted database...');
|
|
89
|
+
// Create backup before migration
|
|
90
|
+
const backupPath = this.legacySettingsPath + '.migration-backup';
|
|
91
|
+
fs.copyFileSync(this.legacySettingsPath, backupPath);
|
|
92
|
+
try {
|
|
93
|
+
// Read legacy settings
|
|
94
|
+
const data = fs.readFileSync(this.legacySettingsPath, 'utf-8');
|
|
95
|
+
const parsed = JSON.parse(data);
|
|
96
|
+
// Handle migration from old format (providerType -> primaryProvider)
|
|
97
|
+
if (parsed.providerType && !parsed.primaryProvider) {
|
|
98
|
+
parsed.primaryProvider = parsed.providerType;
|
|
99
|
+
delete parsed.providerType;
|
|
100
|
+
}
|
|
101
|
+
const legacySettings = { ...DEFAULT_SETTINGS, ...parsed };
|
|
102
|
+
// Save to encrypted database
|
|
103
|
+
repository.save('search', legacySettings);
|
|
104
|
+
console.log('[SearchProviderFactory] Settings migrated to encrypted database');
|
|
105
|
+
// Migration successful - delete backup and original
|
|
106
|
+
fs.unlinkSync(backupPath);
|
|
107
|
+
fs.unlinkSync(this.legacySettingsPath);
|
|
108
|
+
console.log('[SearchProviderFactory] Migration complete, cleaned up legacy files');
|
|
109
|
+
this.migrationCompleted = true;
|
|
110
|
+
}
|
|
111
|
+
catch (migrationError) {
|
|
112
|
+
console.error('[SearchProviderFactory] Migration failed, backup preserved at:', backupPath);
|
|
113
|
+
throw migrationError;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error('[SearchProviderFactory] Migration failed:', error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get the path to legacy settings file (for testing)
|
|
122
|
+
*/
|
|
123
|
+
static getSettingsPath() {
|
|
124
|
+
return this.legacySettingsPath;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Load settings from encrypted database
|
|
128
|
+
*/
|
|
129
|
+
static loadSettings() {
|
|
130
|
+
if (this.cachedSettings) {
|
|
131
|
+
return this.cachedSettings;
|
|
132
|
+
}
|
|
133
|
+
let settings = { ...DEFAULT_SETTINGS };
|
|
134
|
+
try {
|
|
135
|
+
// Try to load from encrypted database
|
|
136
|
+
if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
|
|
137
|
+
const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
|
|
138
|
+
const stored = repository.load('search');
|
|
139
|
+
if (stored) {
|
|
140
|
+
settings = { ...DEFAULT_SETTINGS, ...stored };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error('[SearchProviderFactory] Failed to load settings from database:', error);
|
|
146
|
+
}
|
|
147
|
+
// Auto-detect and select providers if primaryProvider is not set
|
|
148
|
+
if (!settings.primaryProvider) {
|
|
149
|
+
const configuredProviders = this.getConfiguredProvidersFromSettings(settings);
|
|
150
|
+
if (configuredProviders.length > 0) {
|
|
151
|
+
settings.primaryProvider = configuredProviders[0];
|
|
152
|
+
console.log(`[SearchProviderFactory] Auto-selected primary provider: ${configuredProviders[0]}`);
|
|
153
|
+
if (configuredProviders.length > 1 && !settings.fallbackProvider) {
|
|
154
|
+
settings.fallbackProvider = configuredProviders[1];
|
|
155
|
+
console.log(`[SearchProviderFactory] Auto-selected fallback provider: ${configuredProviders[1]}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
this.cachedSettings = settings;
|
|
160
|
+
return settings;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get list of configured provider types from settings only
|
|
164
|
+
* Note: Environment variables are no longer used for security reasons.
|
|
165
|
+
*/
|
|
166
|
+
static getConfiguredProvidersFromSettings(settings) {
|
|
167
|
+
const configured = [];
|
|
168
|
+
// Check Tavily
|
|
169
|
+
if (settings.tavily?.apiKey) {
|
|
170
|
+
configured.push('tavily');
|
|
171
|
+
}
|
|
172
|
+
// Check Brave
|
|
173
|
+
if (settings.brave?.apiKey) {
|
|
174
|
+
configured.push('brave');
|
|
175
|
+
}
|
|
176
|
+
// Check SerpAPI
|
|
177
|
+
if (settings.serpapi?.apiKey) {
|
|
178
|
+
configured.push('serpapi');
|
|
179
|
+
}
|
|
180
|
+
// Check Google (requires both API key and Search Engine ID)
|
|
181
|
+
if (settings.google?.apiKey && settings.google?.searchEngineId) {
|
|
182
|
+
configured.push('google');
|
|
183
|
+
}
|
|
184
|
+
return configured;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Save settings to encrypted database
|
|
188
|
+
*/
|
|
189
|
+
static saveSettings(settings) {
|
|
190
|
+
try {
|
|
191
|
+
if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
|
|
192
|
+
throw new Error('SecureSettingsRepository not initialized');
|
|
193
|
+
}
|
|
194
|
+
const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
|
|
195
|
+
// Load existing settings to preserve API keys that weren't changed
|
|
196
|
+
let existingSettings = { ...DEFAULT_SETTINGS };
|
|
197
|
+
const stored = repository.load('search');
|
|
198
|
+
if (stored) {
|
|
199
|
+
existingSettings = stored;
|
|
200
|
+
}
|
|
201
|
+
// Merge settings, preserving existing API keys if new ones aren't provided
|
|
202
|
+
const settingsToSave = {
|
|
203
|
+
primaryProvider: settings.primaryProvider,
|
|
204
|
+
fallbackProvider: settings.fallbackProvider,
|
|
205
|
+
tavily: settings.tavily?.apiKey
|
|
206
|
+
? settings.tavily
|
|
207
|
+
: existingSettings.tavily,
|
|
208
|
+
brave: settings.brave?.apiKey
|
|
209
|
+
? settings.brave
|
|
210
|
+
: existingSettings.brave,
|
|
211
|
+
serpapi: settings.serpapi?.apiKey
|
|
212
|
+
? settings.serpapi
|
|
213
|
+
: existingSettings.serpapi,
|
|
214
|
+
google: settings.google?.apiKey || settings.google?.searchEngineId
|
|
215
|
+
? { ...existingSettings.google, ...settings.google }
|
|
216
|
+
: existingSettings.google,
|
|
217
|
+
};
|
|
218
|
+
// Save to encrypted database
|
|
219
|
+
repository.save('search', settingsToSave);
|
|
220
|
+
this.cachedSettings = settingsToSave;
|
|
221
|
+
console.log('[SearchProviderFactory] Settings saved to encrypted database');
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.error('[SearchProviderFactory] Failed to save settings:', error);
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Clear cached settings
|
|
230
|
+
*/
|
|
231
|
+
static clearCache() {
|
|
232
|
+
this.cachedSettings = null;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get the config for creating a provider
|
|
236
|
+
* Note: All credentials must be configured via the Settings UI.
|
|
237
|
+
*/
|
|
238
|
+
static getProviderConfig(providerType) {
|
|
239
|
+
const settings = this.loadSettings();
|
|
240
|
+
return {
|
|
241
|
+
type: providerType,
|
|
242
|
+
tavilyApiKey: settings.tavily?.apiKey,
|
|
243
|
+
braveApiKey: settings.brave?.apiKey,
|
|
244
|
+
serpApiKey: settings.serpapi?.apiKey,
|
|
245
|
+
googleApiKey: settings.google?.apiKey,
|
|
246
|
+
googleSearchEngineId: settings.google?.searchEngineId,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Create a provider based on current settings or override
|
|
251
|
+
*/
|
|
252
|
+
static createProvider(overrideType) {
|
|
253
|
+
const settings = this.loadSettings();
|
|
254
|
+
const providerType = overrideType || settings.primaryProvider;
|
|
255
|
+
if (!providerType) {
|
|
256
|
+
throw new Error('No search provider configured');
|
|
257
|
+
}
|
|
258
|
+
const config = this.getProviderConfig(providerType);
|
|
259
|
+
return this.createProviderFromConfig(config);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Create provider from explicit config
|
|
263
|
+
*/
|
|
264
|
+
static createProviderFromConfig(config) {
|
|
265
|
+
switch (config.type) {
|
|
266
|
+
case 'tavily':
|
|
267
|
+
return new tavily_provider_1.TavilyProvider(config);
|
|
268
|
+
case 'brave':
|
|
269
|
+
return new brave_provider_1.BraveProvider(config);
|
|
270
|
+
case 'serpapi':
|
|
271
|
+
return new serpapi_provider_1.SerpApiProvider(config);
|
|
272
|
+
case 'google':
|
|
273
|
+
return new google_provider_1.GoogleProvider(config);
|
|
274
|
+
default:
|
|
275
|
+
throw new Error(`Unknown search provider type: ${config.type}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Execute a search with automatic fallback on failure
|
|
280
|
+
*/
|
|
281
|
+
static async searchWithFallback(query) {
|
|
282
|
+
const settings = this.loadSettings();
|
|
283
|
+
const primaryType = query.provider || settings.primaryProvider;
|
|
284
|
+
if (!primaryType) {
|
|
285
|
+
throw new Error('No search provider configured');
|
|
286
|
+
}
|
|
287
|
+
// Try primary provider
|
|
288
|
+
try {
|
|
289
|
+
const primaryConfig = this.getProviderConfig(primaryType);
|
|
290
|
+
const primaryProvider = this.createProviderFromConfig(primaryConfig);
|
|
291
|
+
return await primaryProvider.search(query);
|
|
292
|
+
}
|
|
293
|
+
catch (primaryError) {
|
|
294
|
+
console.error(`Primary search provider (${primaryType}) failed:`, primaryError.message);
|
|
295
|
+
// If a specific provider was requested, don't fallback
|
|
296
|
+
if (query.provider) {
|
|
297
|
+
throw primaryError;
|
|
298
|
+
}
|
|
299
|
+
// Try fallback provider if configured
|
|
300
|
+
const fallbackType = settings.fallbackProvider;
|
|
301
|
+
if (fallbackType && fallbackType !== primaryType) {
|
|
302
|
+
console.log(`Attempting fallback to ${fallbackType}...`);
|
|
303
|
+
try {
|
|
304
|
+
const fallbackConfig = this.getProviderConfig(fallbackType);
|
|
305
|
+
const fallbackProvider = this.createProviderFromConfig(fallbackConfig);
|
|
306
|
+
const response = await fallbackProvider.search(query);
|
|
307
|
+
// Indicate this came from fallback
|
|
308
|
+
console.log(`Fallback search with ${fallbackType} succeeded`);
|
|
309
|
+
return response;
|
|
310
|
+
}
|
|
311
|
+
catch (fallbackError) {
|
|
312
|
+
console.error(`Fallback search provider (${fallbackType}) also failed:`, fallbackError.message);
|
|
313
|
+
// Throw the original error
|
|
314
|
+
throw new Error(`Primary provider (${primaryType}) failed: ${primaryError.message}. ` +
|
|
315
|
+
`Fallback provider (${fallbackType}) also failed: ${fallbackError.message}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
throw primaryError;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get available providers based on saved configuration
|
|
323
|
+
* Note: Environment variables are no longer checked for security reasons.
|
|
324
|
+
*/
|
|
325
|
+
static getAvailableProviders() {
|
|
326
|
+
const settings = this.loadSettings();
|
|
327
|
+
return [
|
|
328
|
+
{
|
|
329
|
+
type: 'tavily',
|
|
330
|
+
name: types_1.SEARCH_PROVIDER_INFO.tavily.displayName,
|
|
331
|
+
description: types_1.SEARCH_PROVIDER_INFO.tavily.description,
|
|
332
|
+
configured: !!settings.tavily?.apiKey,
|
|
333
|
+
supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.tavily.supportedTypes],
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
type: 'brave',
|
|
337
|
+
name: types_1.SEARCH_PROVIDER_INFO.brave.displayName,
|
|
338
|
+
description: types_1.SEARCH_PROVIDER_INFO.brave.description,
|
|
339
|
+
configured: !!settings.brave?.apiKey,
|
|
340
|
+
supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.brave.supportedTypes],
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
type: 'serpapi',
|
|
344
|
+
name: types_1.SEARCH_PROVIDER_INFO.serpapi.displayName,
|
|
345
|
+
description: types_1.SEARCH_PROVIDER_INFO.serpapi.description,
|
|
346
|
+
configured: !!settings.serpapi?.apiKey,
|
|
347
|
+
supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.serpapi.supportedTypes],
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
type: 'google',
|
|
351
|
+
name: types_1.SEARCH_PROVIDER_INFO.google.displayName,
|
|
352
|
+
description: types_1.SEARCH_PROVIDER_INFO.google.description,
|
|
353
|
+
configured: !!(settings.google?.apiKey && settings.google?.searchEngineId),
|
|
354
|
+
supportedTypes: [...types_1.SEARCH_PROVIDER_INFO.google.supportedTypes],
|
|
355
|
+
},
|
|
356
|
+
];
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Check if any search provider is configured
|
|
360
|
+
*/
|
|
361
|
+
static isAnyProviderConfigured() {
|
|
362
|
+
return this.getAvailableProviders().some((p) => p.configured);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Get current configuration status
|
|
366
|
+
*/
|
|
367
|
+
static getConfigStatus() {
|
|
368
|
+
const settings = this.loadSettings();
|
|
369
|
+
return {
|
|
370
|
+
primaryProvider: settings.primaryProvider,
|
|
371
|
+
fallbackProvider: settings.fallbackProvider,
|
|
372
|
+
providers: this.getAvailableProviders(),
|
|
373
|
+
isConfigured: this.isAnyProviderConfigured(),
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Test a provider configuration
|
|
378
|
+
*/
|
|
379
|
+
static async testProvider(providerType) {
|
|
380
|
+
try {
|
|
381
|
+
const config = this.getProviderConfig(providerType);
|
|
382
|
+
const provider = this.createProviderFromConfig(config);
|
|
383
|
+
return await provider.testConnection();
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
return {
|
|
387
|
+
success: false,
|
|
388
|
+
error: error.message || 'Failed to create provider',
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
exports.SearchProviderFactory = SearchProviderFactory;
|
|
394
|
+
SearchProviderFactory.cachedSettings = null;
|
|
395
|
+
SearchProviderFactory.migrationCompleted = false;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SerpApiProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* SerpAPI provider - aggregates multiple search engines
|
|
6
|
+
* https://serpapi.com/
|
|
7
|
+
*/
|
|
8
|
+
class SerpApiProvider {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.type = 'serpapi';
|
|
11
|
+
this.supportedSearchTypes = ['web', 'news', 'images'];
|
|
12
|
+
this.baseUrl = 'https://serpapi.com/search.json';
|
|
13
|
+
const apiKey = config.serpApiKey;
|
|
14
|
+
if (!apiKey) {
|
|
15
|
+
throw new Error('SerpAPI key is required. Configure it in Settings or get one from https://serpapi.com/');
|
|
16
|
+
}
|
|
17
|
+
this.apiKey = apiKey;
|
|
18
|
+
}
|
|
19
|
+
async search(query) {
|
|
20
|
+
const searchType = query.searchType || 'web';
|
|
21
|
+
if (!this.supportedSearchTypes.includes(searchType)) {
|
|
22
|
+
throw new Error(`SerpAPI does not support ${searchType} search`);
|
|
23
|
+
}
|
|
24
|
+
const params = new URLSearchParams({
|
|
25
|
+
api_key: this.apiKey,
|
|
26
|
+
q: query.query,
|
|
27
|
+
engine: 'google',
|
|
28
|
+
num: String(query.maxResults || 10),
|
|
29
|
+
...(query.region && { gl: query.region }),
|
|
30
|
+
...(query.language && { hl: query.language }),
|
|
31
|
+
...(query.safeSearch !== undefined && {
|
|
32
|
+
safe: query.safeSearch ? 'active' : 'off',
|
|
33
|
+
}),
|
|
34
|
+
...(searchType === 'images' && { tbm: 'isch' }),
|
|
35
|
+
...(searchType === 'news' && { tbm: 'nws' }),
|
|
36
|
+
...(query.dateRange && { tbs: this.mapDateRange(query.dateRange) }),
|
|
37
|
+
});
|
|
38
|
+
const response = await fetch(`${this.baseUrl}?${params}`);
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
const error = await response.text();
|
|
41
|
+
throw new Error(`SerpAPI error: ${response.status} - ${error}`);
|
|
42
|
+
}
|
|
43
|
+
const data = await response.json();
|
|
44
|
+
if (data.error) {
|
|
45
|
+
throw new Error(`SerpAPI error: ${data.error}`);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
results: this.mapResults(data, searchType),
|
|
49
|
+
query: query.query,
|
|
50
|
+
searchType,
|
|
51
|
+
totalResults: data.search_information?.total_results,
|
|
52
|
+
provider: 'serpapi',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async testConnection() {
|
|
56
|
+
try {
|
|
57
|
+
await this.search({ query: 'test', maxResults: 1 });
|
|
58
|
+
return { success: true };
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return {
|
|
62
|
+
success: false,
|
|
63
|
+
error: error.message || 'Failed to connect to SerpAPI',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
mapDateRange(range) {
|
|
68
|
+
switch (range) {
|
|
69
|
+
case 'day':
|
|
70
|
+
return 'qdr:d';
|
|
71
|
+
case 'week':
|
|
72
|
+
return 'qdr:w';
|
|
73
|
+
case 'month':
|
|
74
|
+
return 'qdr:m';
|
|
75
|
+
case 'year':
|
|
76
|
+
return 'qdr:y';
|
|
77
|
+
default:
|
|
78
|
+
return 'qdr:w';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
mapResults(data, searchType) {
|
|
82
|
+
if (searchType === 'images') {
|
|
83
|
+
return (data.images_results || []).map((r) => ({
|
|
84
|
+
title: r.title || '',
|
|
85
|
+
url: r.link || r.original || '',
|
|
86
|
+
snippet: r.snippet || '',
|
|
87
|
+
thumbnailUrl: r.thumbnail,
|
|
88
|
+
imageUrl: r.original,
|
|
89
|
+
width: r.original_width,
|
|
90
|
+
height: r.original_height,
|
|
91
|
+
source: r.source,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
if (searchType === 'news') {
|
|
95
|
+
return (data.news_results || []).map((r) => ({
|
|
96
|
+
title: r.title || '',
|
|
97
|
+
url: r.link || '',
|
|
98
|
+
snippet: r.snippet || '',
|
|
99
|
+
publishedDate: r.date,
|
|
100
|
+
source: r.source,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
// Web (organic) results
|
|
104
|
+
return (data.organic_results || []).map((r) => ({
|
|
105
|
+
title: r.title || '',
|
|
106
|
+
url: r.link || '',
|
|
107
|
+
snippet: r.snippet || '',
|
|
108
|
+
source: r.displayed_link,
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.SerpApiProvider = SerpApiProvider;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TavilyProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tavily Search API provider
|
|
6
|
+
* https://docs.tavily.com/
|
|
7
|
+
*/
|
|
8
|
+
class TavilyProvider {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.type = 'tavily';
|
|
11
|
+
this.supportedSearchTypes = ['web', 'news'];
|
|
12
|
+
this.baseUrl = 'https://api.tavily.com';
|
|
13
|
+
const apiKey = config.tavilyApiKey;
|
|
14
|
+
if (!apiKey) {
|
|
15
|
+
throw new Error('Tavily API key is required. Configure it in Settings or get one from https://tavily.com/');
|
|
16
|
+
}
|
|
17
|
+
this.apiKey = apiKey;
|
|
18
|
+
}
|
|
19
|
+
async search(query) {
|
|
20
|
+
const searchType = query.searchType || 'web';
|
|
21
|
+
if (!this.supportedSearchTypes.includes(searchType)) {
|
|
22
|
+
throw new Error(`Tavily does not support ${searchType} search. Supported: ${this.supportedSearchTypes.join(', ')}`);
|
|
23
|
+
}
|
|
24
|
+
const response = await fetch(`${this.baseUrl}/search`, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: {
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
api_key: this.apiKey,
|
|
31
|
+
query: query.query,
|
|
32
|
+
search_depth: 'advanced',
|
|
33
|
+
max_results: query.maxResults || 10,
|
|
34
|
+
include_answer: false,
|
|
35
|
+
include_raw_content: false,
|
|
36
|
+
// Tavily-specific: topic for news
|
|
37
|
+
topic: searchType === 'news' ? 'news' : 'general',
|
|
38
|
+
// Date filter if specified
|
|
39
|
+
...(query.dateRange && { days: this.dateRangeToDays(query.dateRange) }),
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
const error = await response.text();
|
|
44
|
+
throw new Error(`Tavily API error: ${response.status} - ${error}`);
|
|
45
|
+
}
|
|
46
|
+
const data = await response.json();
|
|
47
|
+
return {
|
|
48
|
+
results: this.mapResults(data.results || []),
|
|
49
|
+
query: query.query,
|
|
50
|
+
searchType,
|
|
51
|
+
provider: 'tavily',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async testConnection() {
|
|
55
|
+
try {
|
|
56
|
+
await this.search({ query: 'test', maxResults: 1 });
|
|
57
|
+
return { success: true };
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: error.message || 'Failed to connect to Tavily API',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
mapResults(results) {
|
|
67
|
+
return results.map((r) => ({
|
|
68
|
+
title: r.title || '',
|
|
69
|
+
url: r.url || '',
|
|
70
|
+
snippet: r.content || r.snippet || '',
|
|
71
|
+
publishedDate: r.published_date,
|
|
72
|
+
source: r.source,
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
dateRangeToDays(range) {
|
|
76
|
+
switch (range) {
|
|
77
|
+
case 'day':
|
|
78
|
+
return 1;
|
|
79
|
+
case 'week':
|
|
80
|
+
return 7;
|
|
81
|
+
case 'month':
|
|
82
|
+
return 30;
|
|
83
|
+
case 'year':
|
|
84
|
+
return 365;
|
|
85
|
+
default:
|
|
86
|
+
return 7;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.TavilyProvider = TavilyProvider;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Search Provider abstraction types
|
|
4
|
+
* Allows switching between Tavily, Brave Search, SerpAPI, and Google Custom Search
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SEARCH_PROVIDER_INFO = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Provider capabilities for UI display
|
|
10
|
+
*/
|
|
11
|
+
exports.SEARCH_PROVIDER_INFO = {
|
|
12
|
+
tavily: {
|
|
13
|
+
displayName: 'Tavily',
|
|
14
|
+
description: 'AI-focused search API with structured results',
|
|
15
|
+
supportedTypes: ['web', 'news'],
|
|
16
|
+
envVar: 'TAVILY_API_KEY',
|
|
17
|
+
signupUrl: 'https://tavily.com/',
|
|
18
|
+
},
|
|
19
|
+
brave: {
|
|
20
|
+
displayName: 'Brave Search',
|
|
21
|
+
description: 'Privacy-focused web, news, and image search',
|
|
22
|
+
supportedTypes: ['web', 'news', 'images'],
|
|
23
|
+
envVar: 'BRAVE_API_KEY',
|
|
24
|
+
signupUrl: 'https://brave.com/search/api/',
|
|
25
|
+
},
|
|
26
|
+
serpapi: {
|
|
27
|
+
displayName: 'SerpAPI',
|
|
28
|
+
description: 'Aggregates Google, Bing, DuckDuckGo results',
|
|
29
|
+
supportedTypes: ['web', 'news', 'images'],
|
|
30
|
+
envVar: 'SERPAPI_KEY',
|
|
31
|
+
signupUrl: 'https://serpapi.com/',
|
|
32
|
+
},
|
|
33
|
+
google: {
|
|
34
|
+
displayName: 'Google Custom Search',
|
|
35
|
+
description: 'Official Google Search API',
|
|
36
|
+
supportedTypes: ['web', 'images'],
|
|
37
|
+
envVars: ['GOOGLE_API_KEY', 'GOOGLE_SEARCH_ENGINE_ID'],
|
|
38
|
+
signupUrl: 'https://developers.google.com/custom-search/v1/introduction',
|
|
39
|
+
},
|
|
40
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security Module
|
|
4
|
+
*
|
|
5
|
+
* Exports all security-related utilities for the agent system.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.OutputFilter = exports.InputSanitizer = void 0;
|
|
9
|
+
var input_sanitizer_1 = require("./input-sanitizer");
|
|
10
|
+
Object.defineProperty(exports, "InputSanitizer", { enumerable: true, get: function () { return input_sanitizer_1.InputSanitizer; } });
|
|
11
|
+
var output_filter_1 = require("./output-filter");
|
|
12
|
+
Object.defineProperty(exports, "OutputFilter", { enumerable: true, get: function () { return output_filter_1.OutputFilter; } });
|