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,359 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Voice Settings Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages voice settings persistence using the encrypted database.
|
|
6
|
+
* All settings (including API keys) are stored encrypted in the database
|
|
7
|
+
* using the SecureSettingsRepository.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.VoiceSettingsManager = void 0;
|
|
44
|
+
const electron_1 = require("electron");
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const types_1 = require("../../shared/types");
|
|
48
|
+
const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
|
|
49
|
+
// Legacy file names for migration
|
|
50
|
+
const LEGACY_SETTINGS_FILE = 'voice-settings.json';
|
|
51
|
+
const LEGACY_SECURE_KEYS_FILE = 'voice-keys.enc';
|
|
52
|
+
class VoiceSettingsManager {
|
|
53
|
+
/**
|
|
54
|
+
* Initialize the VoiceSettingsManager with the database
|
|
55
|
+
*/
|
|
56
|
+
static initialize(db) {
|
|
57
|
+
this.userDataPath = electron_1.app.getPath('userData');
|
|
58
|
+
if (db) {
|
|
59
|
+
this.repository = new SecureSettingsRepository_1.SecureSettingsRepository(db);
|
|
60
|
+
console.log('[VoiceSettingsManager] Initialized with secure database storage');
|
|
61
|
+
// Migrate from legacy JSON files if needed
|
|
62
|
+
this.migrateFromLegacyFiles();
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.warn('[VoiceSettingsManager] No database provided, will initialize on first use');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Set the repository (called after database is ready)
|
|
70
|
+
*/
|
|
71
|
+
static setRepository(db) {
|
|
72
|
+
this.repository = new SecureSettingsRepository_1.SecureSettingsRepository(db);
|
|
73
|
+
console.log('[VoiceSettingsManager] Repository set');
|
|
74
|
+
// Migrate from legacy JSON files if needed
|
|
75
|
+
if (!this.migrationComplete) {
|
|
76
|
+
this.migrateFromLegacyFiles();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Load voice settings from encrypted database
|
|
81
|
+
*/
|
|
82
|
+
static loadSettings() {
|
|
83
|
+
if (this.cachedSettings) {
|
|
84
|
+
return this.cachedSettings;
|
|
85
|
+
}
|
|
86
|
+
let settings = { ...types_1.DEFAULT_VOICE_SETTINGS };
|
|
87
|
+
try {
|
|
88
|
+
if (this.repository) {
|
|
89
|
+
const stored = this.repository.load('voice');
|
|
90
|
+
if (stored) {
|
|
91
|
+
settings = {
|
|
92
|
+
...types_1.DEFAULT_VOICE_SETTINGS,
|
|
93
|
+
...stored,
|
|
94
|
+
};
|
|
95
|
+
// Validate values
|
|
96
|
+
settings = this.validateSettings(settings);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.warn('[VoiceSettingsManager] Repository not initialized, using defaults');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('[VoiceSettingsManager] Failed to load settings:', error);
|
|
105
|
+
settings = { ...types_1.DEFAULT_VOICE_SETTINGS };
|
|
106
|
+
}
|
|
107
|
+
this.cachedSettings = settings;
|
|
108
|
+
return settings;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Save voice settings to encrypted database
|
|
112
|
+
*/
|
|
113
|
+
static saveSettings(settings) {
|
|
114
|
+
try {
|
|
115
|
+
// Validate and prepare settings for storage
|
|
116
|
+
const validatedSettings = this.validateSettings(settings);
|
|
117
|
+
if (this.repository) {
|
|
118
|
+
// Save all settings (including API keys) encrypted in database
|
|
119
|
+
this.repository.save('voice', validatedSettings);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.error('[VoiceSettingsManager] Repository not initialized, cannot save');
|
|
123
|
+
throw new Error('Settings repository not initialized');
|
|
124
|
+
}
|
|
125
|
+
this.cachedSettings = validatedSettings;
|
|
126
|
+
console.log('[VoiceSettingsManager] Settings saved to encrypted database');
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
console.error('[VoiceSettingsManager] Failed to save settings:', error);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Update partial settings
|
|
135
|
+
*/
|
|
136
|
+
static updateSettings(partial) {
|
|
137
|
+
const current = this.loadSettings();
|
|
138
|
+
const updated = { ...current, ...partial };
|
|
139
|
+
this.saveSettings(updated);
|
|
140
|
+
return updated;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Clear cached settings
|
|
144
|
+
*/
|
|
145
|
+
static clearCache() {
|
|
146
|
+
this.cachedSettings = null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delete all voice settings (reset to defaults)
|
|
150
|
+
*/
|
|
151
|
+
static resetSettings() {
|
|
152
|
+
try {
|
|
153
|
+
if (this.repository) {
|
|
154
|
+
this.repository.delete('voice');
|
|
155
|
+
}
|
|
156
|
+
this.cachedSettings = null;
|
|
157
|
+
console.log('[VoiceSettingsManager] Settings reset to defaults');
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
console.error('[VoiceSettingsManager] Failed to reset settings:', error);
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Check if ElevenLabs API key is configured
|
|
166
|
+
*/
|
|
167
|
+
static hasElevenLabsKey() {
|
|
168
|
+
const settings = this.loadSettings();
|
|
169
|
+
return !!settings.elevenLabsApiKey;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if OpenAI API key is configured
|
|
173
|
+
*/
|
|
174
|
+
static hasOpenAIKey() {
|
|
175
|
+
const settings = this.loadSettings();
|
|
176
|
+
return !!settings.openaiApiKey;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if Azure API key is configured
|
|
180
|
+
*/
|
|
181
|
+
static hasAzureKey() {
|
|
182
|
+
const settings = this.loadSettings();
|
|
183
|
+
return !!settings.azureApiKey;
|
|
184
|
+
}
|
|
185
|
+
// ============ Migration from Legacy Files ============
|
|
186
|
+
/**
|
|
187
|
+
* Migrate settings from legacy JSON files to encrypted database
|
|
188
|
+
*/
|
|
189
|
+
static migrateFromLegacyFiles() {
|
|
190
|
+
if (this.migrationComplete)
|
|
191
|
+
return;
|
|
192
|
+
if (!this.repository)
|
|
193
|
+
return;
|
|
194
|
+
const legacySettingsPath = path.join(this.userDataPath, LEGACY_SETTINGS_FILE);
|
|
195
|
+
const legacyKeysPath = path.join(this.userDataPath, LEGACY_SECURE_KEYS_FILE);
|
|
196
|
+
// Check if legacy files exist
|
|
197
|
+
const hasLegacySettings = fs.existsSync(legacySettingsPath);
|
|
198
|
+
const hasLegacyKeys = fs.existsSync(legacyKeysPath);
|
|
199
|
+
if (!hasLegacySettings && !hasLegacyKeys) {
|
|
200
|
+
this.migrationComplete = true;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// Check if we already have settings in the database
|
|
204
|
+
if (this.repository.exists('voice')) {
|
|
205
|
+
// Clean up legacy files
|
|
206
|
+
this.cleanupLegacyFiles();
|
|
207
|
+
this.migrationComplete = true;
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
console.log('[VoiceSettingsManager] Migrating from legacy JSON files to encrypted database...');
|
|
211
|
+
// Create backups before migration
|
|
212
|
+
const settingsBackupPath = legacySettingsPath + '.migration-backup';
|
|
213
|
+
const keysBackupPath = legacyKeysPath + '.migration-backup';
|
|
214
|
+
try {
|
|
215
|
+
if (hasLegacySettings) {
|
|
216
|
+
fs.copyFileSync(legacySettingsPath, settingsBackupPath);
|
|
217
|
+
}
|
|
218
|
+
if (hasLegacyKeys) {
|
|
219
|
+
fs.copyFileSync(legacyKeysPath, keysBackupPath);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (backupError) {
|
|
223
|
+
console.error('[VoiceSettingsManager] Failed to create backups:', backupError);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
let settings = { ...types_1.DEFAULT_VOICE_SETTINGS };
|
|
228
|
+
// Load legacy settings file
|
|
229
|
+
if (hasLegacySettings) {
|
|
230
|
+
const data = fs.readFileSync(legacySettingsPath, 'utf-8');
|
|
231
|
+
const parsed = JSON.parse(data);
|
|
232
|
+
settings = {
|
|
233
|
+
...types_1.DEFAULT_VOICE_SETTINGS,
|
|
234
|
+
...parsed,
|
|
235
|
+
};
|
|
236
|
+
console.log('[VoiceSettingsManager] Loaded legacy settings file');
|
|
237
|
+
}
|
|
238
|
+
// Load legacy secure keys
|
|
239
|
+
if (hasLegacyKeys) {
|
|
240
|
+
const secureKeys = this.loadLegacySecureKeys(legacyKeysPath);
|
|
241
|
+
if (secureKeys.elevenLabsApiKey) {
|
|
242
|
+
settings.elevenLabsApiKey = secureKeys.elevenLabsApiKey;
|
|
243
|
+
}
|
|
244
|
+
if (secureKeys.openaiApiKey) {
|
|
245
|
+
settings.openaiApiKey = secureKeys.openaiApiKey;
|
|
246
|
+
}
|
|
247
|
+
if (secureKeys.azureApiKey) {
|
|
248
|
+
settings.azureApiKey = secureKeys.azureApiKey;
|
|
249
|
+
}
|
|
250
|
+
console.log('[VoiceSettingsManager] Loaded legacy secure keys');
|
|
251
|
+
}
|
|
252
|
+
// Validate and save to database
|
|
253
|
+
settings = this.validateSettings(settings);
|
|
254
|
+
this.repository.save('voice', settings);
|
|
255
|
+
this.cachedSettings = settings;
|
|
256
|
+
console.log('[VoiceSettingsManager] Successfully migrated to encrypted database');
|
|
257
|
+
// Migration successful - delete backups and original files
|
|
258
|
+
if (hasLegacySettings) {
|
|
259
|
+
fs.unlinkSync(settingsBackupPath);
|
|
260
|
+
fs.unlinkSync(legacySettingsPath);
|
|
261
|
+
}
|
|
262
|
+
if (hasLegacyKeys) {
|
|
263
|
+
fs.unlinkSync(keysBackupPath);
|
|
264
|
+
fs.unlinkSync(legacyKeysPath);
|
|
265
|
+
}
|
|
266
|
+
console.log('[VoiceSettingsManager] Migration complete, cleaned up legacy files');
|
|
267
|
+
this.migrationComplete = true;
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
console.error('[VoiceSettingsManager] Migration failed, backups preserved:', error);
|
|
271
|
+
if (hasLegacySettings) {
|
|
272
|
+
console.error('[VoiceSettingsManager] Settings backup at:', settingsBackupPath);
|
|
273
|
+
}
|
|
274
|
+
if (hasLegacyKeys) {
|
|
275
|
+
console.error('[VoiceSettingsManager] Keys backup at:', keysBackupPath);
|
|
276
|
+
}
|
|
277
|
+
// Don't throw - allow app to continue with defaults
|
|
278
|
+
this.migrationComplete = true;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Load secure keys from legacy encrypted file
|
|
283
|
+
*/
|
|
284
|
+
static loadLegacySecureKeys(legacyKeysPath) {
|
|
285
|
+
try {
|
|
286
|
+
if (!electron_1.safeStorage.isEncryptionAvailable()) {
|
|
287
|
+
// Fall back to plain text storage if encryption unavailable
|
|
288
|
+
const data = fs.readFileSync(legacyKeysPath, 'utf-8');
|
|
289
|
+
return JSON.parse(data);
|
|
290
|
+
}
|
|
291
|
+
const encryptedData = fs.readFileSync(legacyKeysPath);
|
|
292
|
+
const decryptedString = electron_1.safeStorage.decryptString(encryptedData);
|
|
293
|
+
return JSON.parse(decryptedString);
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
console.error('[VoiceSettingsManager] Failed to load legacy secure keys:', error);
|
|
297
|
+
return {};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Remove legacy files after successful migration
|
|
302
|
+
*/
|
|
303
|
+
static cleanupLegacyFiles() {
|
|
304
|
+
const legacySettingsPath = path.join(this.userDataPath, LEGACY_SETTINGS_FILE);
|
|
305
|
+
const legacyKeysPath = path.join(this.userDataPath, LEGACY_SECURE_KEYS_FILE);
|
|
306
|
+
try {
|
|
307
|
+
if (fs.existsSync(legacySettingsPath)) {
|
|
308
|
+
// Rename to .bak instead of deleting (safety)
|
|
309
|
+
fs.renameSync(legacySettingsPath, legacySettingsPath + '.migrated');
|
|
310
|
+
console.log('[VoiceSettingsManager] Backed up legacy settings file');
|
|
311
|
+
}
|
|
312
|
+
if (fs.existsSync(legacyKeysPath)) {
|
|
313
|
+
// Securely delete encrypted keys file
|
|
314
|
+
fs.unlinkSync(legacyKeysPath);
|
|
315
|
+
console.log('[VoiceSettingsManager] Removed legacy secure keys file');
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
console.warn('[VoiceSettingsManager] Failed to clean up legacy files:', error);
|
|
320
|
+
// Non-fatal - continue anyway
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// ============ Validation ============
|
|
324
|
+
static validateSettings(settings) {
|
|
325
|
+
const validated = { ...settings };
|
|
326
|
+
// Validate provider
|
|
327
|
+
if (!['elevenlabs', 'openai', 'azure', 'local'].includes(validated.ttsProvider)) {
|
|
328
|
+
validated.ttsProvider = types_1.DEFAULT_VOICE_SETTINGS.ttsProvider;
|
|
329
|
+
}
|
|
330
|
+
if (!['elevenlabs', 'openai', 'azure', 'local'].includes(validated.sttProvider)) {
|
|
331
|
+
validated.sttProvider = types_1.DEFAULT_VOICE_SETTINGS.sttProvider;
|
|
332
|
+
}
|
|
333
|
+
// Validate input mode
|
|
334
|
+
if (!['push_to_talk', 'voice_activity', 'disabled'].includes(validated.inputMode)) {
|
|
335
|
+
validated.inputMode = types_1.DEFAULT_VOICE_SETTINGS.inputMode;
|
|
336
|
+
}
|
|
337
|
+
// Validate response mode
|
|
338
|
+
if (!['auto', 'manual', 'smart'].includes(validated.responseMode)) {
|
|
339
|
+
validated.responseMode = types_1.DEFAULT_VOICE_SETTINGS.responseMode;
|
|
340
|
+
}
|
|
341
|
+
// Validate OpenAI and Azure voices
|
|
342
|
+
const validVoices = ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'];
|
|
343
|
+
if (validated.openaiVoice && !validVoices.includes(validated.openaiVoice)) {
|
|
344
|
+
validated.openaiVoice = undefined;
|
|
345
|
+
}
|
|
346
|
+
if (validated.azureVoice && !validVoices.includes(validated.azureVoice)) {
|
|
347
|
+
validated.azureVoice = undefined;
|
|
348
|
+
}
|
|
349
|
+
// Validate numeric ranges
|
|
350
|
+
validated.volume = Math.max(0, Math.min(100, validated.volume || types_1.DEFAULT_VOICE_SETTINGS.volume));
|
|
351
|
+
validated.speechRate = Math.max(0.5, Math.min(2.0, validated.speechRate || types_1.DEFAULT_VOICE_SETTINGS.speechRate));
|
|
352
|
+
validated.silenceTimeout = Math.max(1, Math.min(10, validated.silenceTimeout || types_1.DEFAULT_VOICE_SETTINGS.silenceTimeout));
|
|
353
|
+
return validated;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
exports.VoiceSettingsManager = VoiceSettingsManager;
|
|
357
|
+
VoiceSettingsManager.repository = null;
|
|
358
|
+
VoiceSettingsManager.cachedSettings = null;
|
|
359
|
+
VoiceSettingsManager.migrationComplete = false;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Channel Message Templates
|
|
4
|
+
*
|
|
5
|
+
* Personality-based message templates for messaging channels (Telegram, WhatsApp, Slack, etc.)
|
|
6
|
+
* These messages are used when sending task status updates to external channels.
|
|
7
|
+
*
|
|
8
|
+
* This file is in shared/ so it can be used by both the main process (gateway) and renderer.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.DEFAULT_CHANNEL_CONTEXT = void 0;
|
|
12
|
+
exports.getChannelMessage = getChannelMessage;
|
|
13
|
+
exports.getCompletionMessage = getCompletionMessage;
|
|
14
|
+
/**
|
|
15
|
+
* Message templates organized by personality type
|
|
16
|
+
*/
|
|
17
|
+
const CHANNEL_MESSAGES = {
|
|
18
|
+
professional: {
|
|
19
|
+
taskComplete: 'Complete.',
|
|
20
|
+
taskCompleteWithResult: 'Complete.\n\n{result}',
|
|
21
|
+
taskFailed: 'Task failed: {error}',
|
|
22
|
+
toolError: 'Tool error ({tool}): {error}',
|
|
23
|
+
followUpProcessed: 'Follow-up processed.',
|
|
24
|
+
followUpFailed: 'Follow-up failed: {error}',
|
|
25
|
+
approvalNeeded: 'Approval required.',
|
|
26
|
+
},
|
|
27
|
+
friendly: {
|
|
28
|
+
taskComplete: 'Done! Nice work.',
|
|
29
|
+
taskCompleteWithResult: 'Done!\n\n{result}',
|
|
30
|
+
taskFailed: 'Oops, something went wrong: {error}',
|
|
31
|
+
toolError: 'Hit a snag with {tool}: {error}',
|
|
32
|
+
followUpProcessed: 'Got it!',
|
|
33
|
+
followUpFailed: 'That follow-up hit a bump: {error}',
|
|
34
|
+
approvalNeeded: 'Need your OK on this!',
|
|
35
|
+
},
|
|
36
|
+
concise: {
|
|
37
|
+
taskComplete: 'Done.',
|
|
38
|
+
taskCompleteWithResult: 'Done.\n\n{result}',
|
|
39
|
+
taskFailed: 'Failed: {error}',
|
|
40
|
+
toolError: '{tool} error: {error}',
|
|
41
|
+
followUpProcessed: 'Done.',
|
|
42
|
+
followUpFailed: 'Failed: {error}',
|
|
43
|
+
approvalNeeded: 'Approval?',
|
|
44
|
+
},
|
|
45
|
+
creative: {
|
|
46
|
+
taskComplete: 'Masterpiece complete.',
|
|
47
|
+
taskCompleteWithResult: 'Masterpiece complete.\n\n{result}',
|
|
48
|
+
taskFailed: 'A twist in the tale: {error}',
|
|
49
|
+
toolError: '{tool} encountered a plot twist: {error}',
|
|
50
|
+
followUpProcessed: 'Another piece falls into place.',
|
|
51
|
+
followUpFailed: 'The sequel hit a snag: {error}',
|
|
52
|
+
approvalNeeded: 'Your vision is needed.',
|
|
53
|
+
},
|
|
54
|
+
technical: {
|
|
55
|
+
taskComplete: 'Execution complete.',
|
|
56
|
+
taskCompleteWithResult: 'Execution complete.\n\n{result}',
|
|
57
|
+
taskFailed: 'Error: {error}',
|
|
58
|
+
toolError: '{tool} exception: {error}',
|
|
59
|
+
followUpProcessed: 'Follow-up executed.',
|
|
60
|
+
followUpFailed: 'Follow-up exception: {error}',
|
|
61
|
+
approvalNeeded: 'Awaiting user input.',
|
|
62
|
+
},
|
|
63
|
+
casual: {
|
|
64
|
+
taskComplete: 'Nailed it.',
|
|
65
|
+
taskCompleteWithResult: 'Nailed it.\n\n{result}',
|
|
66
|
+
taskFailed: 'Uh oh: {error}',
|
|
67
|
+
toolError: '{tool} had a moment: {error}',
|
|
68
|
+
followUpProcessed: 'Check.',
|
|
69
|
+
followUpFailed: 'That didn\'t work: {error}',
|
|
70
|
+
approvalNeeded: 'Your call.',
|
|
71
|
+
},
|
|
72
|
+
custom: {
|
|
73
|
+
taskComplete: 'Done.',
|
|
74
|
+
taskCompleteWithResult: 'Done.\n\n{result}',
|
|
75
|
+
taskFailed: 'Task failed: {error}',
|
|
76
|
+
toolError: 'Tool error ({tool}): {error}',
|
|
77
|
+
followUpProcessed: 'Follow-up complete.',
|
|
78
|
+
followUpFailed: 'Follow-up failed: {error}',
|
|
79
|
+
approvalNeeded: 'Approval needed.',
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Emoji mappings for message types
|
|
84
|
+
*/
|
|
85
|
+
const EMOJI_MAP = {
|
|
86
|
+
taskComplete: '✓',
|
|
87
|
+
taskCompleteWithResult: '✓',
|
|
88
|
+
taskFailed: '✗',
|
|
89
|
+
toolError: '⚠',
|
|
90
|
+
followUpProcessed: '✓',
|
|
91
|
+
followUpFailed: '✗',
|
|
92
|
+
approvalNeeded: '❓',
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Add emoji based on emojiUsage setting
|
|
96
|
+
*/
|
|
97
|
+
function addEmoji(message, key, emojiUsage) {
|
|
98
|
+
if (emojiUsage === 'none')
|
|
99
|
+
return message;
|
|
100
|
+
const emoji = EMOJI_MAP[key];
|
|
101
|
+
if (!emoji)
|
|
102
|
+
return message;
|
|
103
|
+
// For minimal, only add checkmarks for success
|
|
104
|
+
if (emojiUsage === 'minimal' && !['taskComplete', 'taskCompleteWithResult', 'followUpProcessed'].includes(key)) {
|
|
105
|
+
return message;
|
|
106
|
+
}
|
|
107
|
+
return `${emoji} ${message}`;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get a personalized channel message
|
|
111
|
+
*/
|
|
112
|
+
function getChannelMessage(key, ctx, replacements) {
|
|
113
|
+
const { personality, emojiUsage, quirks } = ctx;
|
|
114
|
+
// Get base message for personality
|
|
115
|
+
const messages = CHANNEL_MESSAGES[personality] || CHANNEL_MESSAGES.professional;
|
|
116
|
+
let message = messages[key] || CHANNEL_MESSAGES.professional[key] || key;
|
|
117
|
+
// Replace placeholders
|
|
118
|
+
if (replacements) {
|
|
119
|
+
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
120
|
+
message = message.replace(`{${placeholder}}`, value);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Add emoji if appropriate
|
|
124
|
+
message = addEmoji(message, key, emojiUsage);
|
|
125
|
+
// Add sign-off to completion messages
|
|
126
|
+
if ((key === 'taskComplete' || key === 'taskCompleteWithResult') && quirks.signOff) {
|
|
127
|
+
message = `${message}\n\n${quirks.signOff}`;
|
|
128
|
+
}
|
|
129
|
+
return message;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get completion message with optional result and follow-up hint
|
|
133
|
+
* This is specific to channel messages which may include additional hints
|
|
134
|
+
*/
|
|
135
|
+
function getCompletionMessage(ctx, result, includeFollowUpHint = true) {
|
|
136
|
+
const key = result ? 'taskCompleteWithResult' : 'taskComplete';
|
|
137
|
+
let message = getChannelMessage(key, ctx, result ? { result } : undefined);
|
|
138
|
+
// Add follow-up hint for channels that support it
|
|
139
|
+
if (includeFollowUpHint && ctx.personality !== 'concise') {
|
|
140
|
+
const hints = {
|
|
141
|
+
professional: 'Send a follow-up message to continue, or use /newtask to start fresh.',
|
|
142
|
+
friendly: 'Got more to do? Just send another message!',
|
|
143
|
+
concise: '',
|
|
144
|
+
creative: 'The story continues... send your next chapter!',
|
|
145
|
+
technical: 'Ready for next command. Use /newtask for new context.',
|
|
146
|
+
casual: 'What\'s next? Just hit me up.',
|
|
147
|
+
custom: 'Send a follow-up message to continue.',
|
|
148
|
+
};
|
|
149
|
+
const hint = hints[ctx.personality];
|
|
150
|
+
if (hint) {
|
|
151
|
+
message = `${message}\n\n${hint}`;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return message;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Default message context using professional personality
|
|
158
|
+
*/
|
|
159
|
+
exports.DEFAULT_CHANNEL_CONTEXT = {
|
|
160
|
+
agentName: 'CoWork',
|
|
161
|
+
userName: undefined,
|
|
162
|
+
personality: 'professional',
|
|
163
|
+
emojiUsage: 'minimal',
|
|
164
|
+
quirks: {
|
|
165
|
+
catchphrase: undefined,
|
|
166
|
+
signOff: undefined,
|
|
167
|
+
analogyDomain: 'none',
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
exports.default = getChannelMessage;
|