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,435 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Memory Service
|
|
4
|
+
*
|
|
5
|
+
* Core service for the persistent memory system.
|
|
6
|
+
* Handles capture, compression, search, and context injection.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MemoryService = void 0;
|
|
10
|
+
const events_1 = require("events");
|
|
11
|
+
const repositories_1 = require("../database/repositories");
|
|
12
|
+
const llm_1 = require("../agent/llm");
|
|
13
|
+
const context_manager_1 = require("../agent/context-manager");
|
|
14
|
+
const security_1 = require("../agent/security");
|
|
15
|
+
// Privacy patterns to exclude - matches common sensitive data patterns
|
|
16
|
+
const SENSITIVE_PATTERNS = [
|
|
17
|
+
/api[_-]?key/i,
|
|
18
|
+
/secret/i,
|
|
19
|
+
/password/i,
|
|
20
|
+
/passwd/i,
|
|
21
|
+
/token/i,
|
|
22
|
+
/credential/i,
|
|
23
|
+
/auth/i,
|
|
24
|
+
/bearer\s+[a-zA-Z0-9\-_]+/i,
|
|
25
|
+
/ssh[_-]?key/i,
|
|
26
|
+
/private[_-]?key/i,
|
|
27
|
+
/\.env/i,
|
|
28
|
+
/aws[_-]?access/i,
|
|
29
|
+
/aws[_-]?secret/i,
|
|
30
|
+
/-----BEGIN\s+(RSA\s+)?PRIVATE\s+KEY-----/i,
|
|
31
|
+
/ghp_[a-zA-Z0-9]+/i, // GitHub personal access token
|
|
32
|
+
/gho_[a-zA-Z0-9]+/i, // GitHub OAuth token
|
|
33
|
+
/sk-[a-zA-Z0-9]+/i, // OpenAI API key format
|
|
34
|
+
/xox[baprs]-[a-zA-Z0-9-]+/i, // Slack tokens
|
|
35
|
+
];
|
|
36
|
+
// Events for reactive updates
|
|
37
|
+
const memoryEvents = new events_1.EventEmitter();
|
|
38
|
+
// Minimum tokens before compression is worthwhile
|
|
39
|
+
const MIN_TOKENS_FOR_COMPRESSION = 100;
|
|
40
|
+
// Compression batch size
|
|
41
|
+
const COMPRESSION_BATCH_SIZE = 10;
|
|
42
|
+
// Cleanup interval (1 hour)
|
|
43
|
+
const CLEANUP_INTERVAL_MS = 60 * 60 * 1000;
|
|
44
|
+
// Compression delay between items (avoid rate limits)
|
|
45
|
+
const COMPRESSION_DELAY_MS = 200;
|
|
46
|
+
class MemoryService {
|
|
47
|
+
/**
|
|
48
|
+
* Initialize the memory service
|
|
49
|
+
*/
|
|
50
|
+
static initialize(dbManager) {
|
|
51
|
+
if (this.initialized)
|
|
52
|
+
return;
|
|
53
|
+
const db = dbManager.getDatabase();
|
|
54
|
+
this.memoryRepo = new repositories_1.MemoryRepository(db);
|
|
55
|
+
this.summaryRepo = new repositories_1.MemorySummaryRepository(db);
|
|
56
|
+
this.settingsRepo = new repositories_1.MemorySettingsRepository(db);
|
|
57
|
+
this.initialized = true;
|
|
58
|
+
// Start periodic cleanup
|
|
59
|
+
this.cleanupIntervalHandle = setInterval(() => this.runCleanup(), CLEANUP_INTERVAL_MS);
|
|
60
|
+
console.log('[MemoryService] Initialized');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Subscribe to memory events
|
|
64
|
+
*/
|
|
65
|
+
static onMemoryChanged(callback) {
|
|
66
|
+
memoryEvents.on('memoryChanged', callback);
|
|
67
|
+
return () => memoryEvents.off('memoryChanged', callback);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Capture an observation from task execution
|
|
71
|
+
*/
|
|
72
|
+
static async capture(workspaceId, taskId, type, content, isPrivate = false) {
|
|
73
|
+
this.ensureInitialized();
|
|
74
|
+
// Check settings
|
|
75
|
+
const settings = this.settingsRepo.getOrCreate(workspaceId);
|
|
76
|
+
if (!settings.enabled || !settings.autoCapture) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// Check privacy mode
|
|
80
|
+
if (settings.privacyMode === 'disabled') {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
// Check excluded patterns
|
|
84
|
+
if (this.shouldExclude(content, settings)) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
// Check for sensitive content
|
|
88
|
+
const containsSensitive = this.containsSensitiveData(content);
|
|
89
|
+
const finalIsPrivate = isPrivate || containsSensitive || settings.privacyMode === 'strict';
|
|
90
|
+
// Estimate tokens
|
|
91
|
+
const tokens = (0, context_manager_1.estimateTokens)(content);
|
|
92
|
+
// Truncate very long content
|
|
93
|
+
const truncatedContent = content.length > 10000 ? content.slice(0, 10000) + '\n[... truncated]' : content;
|
|
94
|
+
// Create memory
|
|
95
|
+
const memory = this.memoryRepo.create({
|
|
96
|
+
workspaceId,
|
|
97
|
+
taskId,
|
|
98
|
+
type,
|
|
99
|
+
content: truncatedContent,
|
|
100
|
+
tokens,
|
|
101
|
+
isCompressed: false,
|
|
102
|
+
isPrivate: finalIsPrivate,
|
|
103
|
+
});
|
|
104
|
+
// Queue for compression if enabled and large enough
|
|
105
|
+
if (settings.compressionEnabled && tokens > MIN_TOKENS_FOR_COMPRESSION && !finalIsPrivate) {
|
|
106
|
+
this.compressionQueue.push(memory.id);
|
|
107
|
+
this.processCompressionQueue();
|
|
108
|
+
}
|
|
109
|
+
// Emit event
|
|
110
|
+
memoryEvents.emit('memoryChanged', { type: 'created', workspaceId });
|
|
111
|
+
return memory;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Search memories - Layer 1 of progressive retrieval
|
|
115
|
+
* Returns IDs + brief snippets (~50 tokens each)
|
|
116
|
+
*/
|
|
117
|
+
static search(workspaceId, query, limit = 20) {
|
|
118
|
+
this.ensureInitialized();
|
|
119
|
+
return this.memoryRepo.search(workspaceId, query, limit);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get timeline context - Layer 2 of progressive retrieval
|
|
123
|
+
* Returns surrounding memories for context
|
|
124
|
+
*/
|
|
125
|
+
static getTimelineContext(memoryId, windowSize = 5) {
|
|
126
|
+
this.ensureInitialized();
|
|
127
|
+
return this.memoryRepo.getTimelineContext(memoryId, windowSize);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get full details - Layer 3 of progressive retrieval
|
|
131
|
+
* Only called for specific memories when needed
|
|
132
|
+
*/
|
|
133
|
+
static getFullDetails(ids) {
|
|
134
|
+
this.ensureInitialized();
|
|
135
|
+
return this.memoryRepo.getFullDetails(ids);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get memories for a specific task
|
|
139
|
+
*/
|
|
140
|
+
static getByTask(taskId) {
|
|
141
|
+
this.ensureInitialized();
|
|
142
|
+
return this.memoryRepo.findByTask(taskId);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get recent memories for a workspace
|
|
146
|
+
*/
|
|
147
|
+
static getRecent(workspaceId, limit = 20) {
|
|
148
|
+
this.ensureInitialized();
|
|
149
|
+
return this.memoryRepo.getRecentForWorkspace(workspaceId, limit);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get context for injection at task start
|
|
153
|
+
* Returns a formatted string suitable for system prompt
|
|
154
|
+
*/
|
|
155
|
+
static getContextForInjection(workspaceId, taskPrompt) {
|
|
156
|
+
this.ensureInitialized();
|
|
157
|
+
const settings = this.settingsRepo.getOrCreate(workspaceId);
|
|
158
|
+
if (!settings.enabled) {
|
|
159
|
+
return '';
|
|
160
|
+
}
|
|
161
|
+
// Get recent memories (summaries preferred)
|
|
162
|
+
const recentMemories = this.memoryRepo.getRecentForWorkspace(workspaceId, 5);
|
|
163
|
+
// Search for relevant memories based on task prompt
|
|
164
|
+
let relevantMemories = [];
|
|
165
|
+
if (taskPrompt && taskPrompt.length > 10) {
|
|
166
|
+
try {
|
|
167
|
+
// Extract key terms for search
|
|
168
|
+
const searchTerms = this.extractSearchTerms(taskPrompt);
|
|
169
|
+
if (searchTerms) {
|
|
170
|
+
relevantMemories = this.memoryRepo.search(workspaceId, searchTerms, 5);
|
|
171
|
+
// Filter out memories that are already in recent
|
|
172
|
+
const recentIds = new Set(recentMemories.map((m) => m.id));
|
|
173
|
+
relevantMemories = relevantMemories.filter((m) => !recentIds.has(m.id));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Search failed, continue without relevant memories
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (recentMemories.length === 0 && relevantMemories.length === 0) {
|
|
181
|
+
return '';
|
|
182
|
+
}
|
|
183
|
+
const parts = ['<memory_context>'];
|
|
184
|
+
parts.push('The following memories from previous sessions may be relevant:');
|
|
185
|
+
// Add recent memories (summaries only for token efficiency)
|
|
186
|
+
if (recentMemories.length > 0) {
|
|
187
|
+
parts.push('\n## Recent Activity');
|
|
188
|
+
for (const memory of recentMemories) {
|
|
189
|
+
const rawText = memory.summary || this.truncate(memory.content, 150);
|
|
190
|
+
// Sanitize memory content to prevent injection via stored memories
|
|
191
|
+
const text = security_1.InputSanitizer.sanitizeMemoryContent(rawText);
|
|
192
|
+
const date = new Date(memory.createdAt).toLocaleDateString();
|
|
193
|
+
parts.push(`- [${memory.type}] (${date}) ${text}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Add relevant memories
|
|
197
|
+
if (relevantMemories.length > 0) {
|
|
198
|
+
parts.push('\n## Relevant to Current Task');
|
|
199
|
+
for (const result of relevantMemories) {
|
|
200
|
+
const date = new Date(result.createdAt).toLocaleDateString();
|
|
201
|
+
// Sanitize memory content to prevent injection via stored memories
|
|
202
|
+
const sanitizedSnippet = security_1.InputSanitizer.sanitizeMemoryContent(result.snippet);
|
|
203
|
+
parts.push(`- [${result.type}] (${date}) ${sanitizedSnippet}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
parts.push('</memory_context>');
|
|
207
|
+
return parts.join('\n');
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get or create settings for a workspace
|
|
211
|
+
*/
|
|
212
|
+
static getSettings(workspaceId) {
|
|
213
|
+
this.ensureInitialized();
|
|
214
|
+
return this.settingsRepo.getOrCreate(workspaceId);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Update settings for a workspace
|
|
218
|
+
*/
|
|
219
|
+
static updateSettings(workspaceId, updates) {
|
|
220
|
+
this.ensureInitialized();
|
|
221
|
+
this.settingsRepo.update(workspaceId, updates);
|
|
222
|
+
memoryEvents.emit('memoryChanged', { type: 'settingsUpdated', workspaceId });
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get storage statistics for a workspace
|
|
226
|
+
*/
|
|
227
|
+
static getStats(workspaceId) {
|
|
228
|
+
this.ensureInitialized();
|
|
229
|
+
return this.memoryRepo.getStats(workspaceId);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Delete all memories for a workspace
|
|
233
|
+
*/
|
|
234
|
+
static clearWorkspace(workspaceId) {
|
|
235
|
+
this.ensureInitialized();
|
|
236
|
+
this.memoryRepo.deleteByWorkspace(workspaceId);
|
|
237
|
+
this.summaryRepo.deleteByWorkspace(workspaceId);
|
|
238
|
+
memoryEvents.emit('memoryChanged', { type: 'cleared', workspaceId });
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Process compression queue asynchronously
|
|
242
|
+
*/
|
|
243
|
+
static async processCompressionQueue() {
|
|
244
|
+
if (this.compressionInProgress || this.compressionQueue.length === 0) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
this.compressionInProgress = true;
|
|
248
|
+
try {
|
|
249
|
+
// Process in batches
|
|
250
|
+
const batch = this.compressionQueue.splice(0, COMPRESSION_BATCH_SIZE);
|
|
251
|
+
for (const memoryId of batch) {
|
|
252
|
+
await this.compressMemory(memoryId);
|
|
253
|
+
// Small delay to avoid overwhelming the LLM
|
|
254
|
+
await new Promise((resolve) => setTimeout(resolve, COMPRESSION_DELAY_MS));
|
|
255
|
+
}
|
|
256
|
+
// Continue if more items
|
|
257
|
+
if (this.compressionQueue.length > 0) {
|
|
258
|
+
setTimeout(() => this.processCompressionQueue(), 1000);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
console.error('[MemoryService] Compression queue error:', error);
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
this.compressionInProgress = false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Compress a single memory using LLM
|
|
270
|
+
*/
|
|
271
|
+
static async compressMemory(memoryId) {
|
|
272
|
+
const memory = this.memoryRepo.findById(memoryId);
|
|
273
|
+
if (!memory || memory.isCompressed || memory.summary)
|
|
274
|
+
return;
|
|
275
|
+
try {
|
|
276
|
+
// Get LLM provider for compression
|
|
277
|
+
const provider = llm_1.LLMProviderFactory.createProvider();
|
|
278
|
+
const settings = llm_1.LLMProviderFactory.getSettings();
|
|
279
|
+
const modelId = llm_1.LLMProviderFactory.getModelId(settings.modelKey, settings.providerType, settings.ollama?.model, settings.gemini?.model, settings.openrouter?.model, settings.openai?.model);
|
|
280
|
+
const response = await provider.createMessage({
|
|
281
|
+
model: modelId,
|
|
282
|
+
maxTokens: 100,
|
|
283
|
+
system: 'You are a helpful assistant that summarizes text concisely.',
|
|
284
|
+
messages: [
|
|
285
|
+
{
|
|
286
|
+
role: 'user',
|
|
287
|
+
content: `Summarize this observation in 1-2 sentences (max 50 words). Focus on the key insight, decision, or action taken. Be concise and factual.
|
|
288
|
+
|
|
289
|
+
Observation:
|
|
290
|
+
${memory.content}
|
|
291
|
+
|
|
292
|
+
Summary:`,
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
});
|
|
296
|
+
// Extract summary from response
|
|
297
|
+
let summary = '';
|
|
298
|
+
for (const content of response.content) {
|
|
299
|
+
if (content.type === 'text') {
|
|
300
|
+
summary += content.text;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
summary = summary.trim();
|
|
304
|
+
if (summary) {
|
|
305
|
+
const summaryTokens = (0, context_manager_1.estimateTokens)(summary);
|
|
306
|
+
this.memoryRepo.update(memoryId, {
|
|
307
|
+
summary,
|
|
308
|
+
tokens: summaryTokens,
|
|
309
|
+
isCompressed: true,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
// Log but don't fail - compression is optional enhancement
|
|
315
|
+
console.warn('[MemoryService] Compression failed for memory:', memoryId, error);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Run periodic cleanup based on retention policies
|
|
320
|
+
*/
|
|
321
|
+
static async runCleanup() {
|
|
322
|
+
if (!this.initialized)
|
|
323
|
+
return;
|
|
324
|
+
try {
|
|
325
|
+
// Get all workspaces with memories
|
|
326
|
+
const workspacesWithMemories = new Set();
|
|
327
|
+
// Find unique workspace IDs from recent memories
|
|
328
|
+
const recentMemories = this.memoryRepo.getUncompressed(1000);
|
|
329
|
+
for (const memory of recentMemories) {
|
|
330
|
+
workspacesWithMemories.add(memory.workspaceId);
|
|
331
|
+
}
|
|
332
|
+
// Process each workspace
|
|
333
|
+
for (const workspaceId of workspacesWithMemories) {
|
|
334
|
+
const settings = this.settingsRepo.getOrCreate(workspaceId);
|
|
335
|
+
const retentionMs = settings.retentionDays * 24 * 60 * 60 * 1000;
|
|
336
|
+
const cutoff = Date.now() - retentionMs;
|
|
337
|
+
const deleted = this.memoryRepo.deleteOlderThan(workspaceId, cutoff);
|
|
338
|
+
if (deleted > 0) {
|
|
339
|
+
console.log(`[MemoryService] Cleaned up ${deleted} old memories for workspace ${workspaceId}`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
console.error('[MemoryService] Cleanup failed:', error);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Extract search terms from task prompt
|
|
349
|
+
*/
|
|
350
|
+
static extractSearchTerms(prompt) {
|
|
351
|
+
// Remove common words and extract meaningful terms
|
|
352
|
+
const stopWords = new Set([
|
|
353
|
+
'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
354
|
+
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
355
|
+
'should', 'may', 'might', 'can', 'must', 'shall', 'to', 'of', 'in',
|
|
356
|
+
'for', 'on', 'with', 'at', 'by', 'from', 'up', 'about', 'into',
|
|
357
|
+
'over', 'after', 'beneath', 'under', 'above', 'and', 'or', 'but',
|
|
358
|
+
'if', 'then', 'else', 'when', 'where', 'why', 'how', 'all', 'each',
|
|
359
|
+
'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such',
|
|
360
|
+
'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too',
|
|
361
|
+
'very', 'just', 'also', 'now', 'please', 'help', 'me', 'i', 'my',
|
|
362
|
+
'want', 'need', 'like', 'make', 'create', 'add', 'update', 'fix',
|
|
363
|
+
]);
|
|
364
|
+
const words = prompt
|
|
365
|
+
.toLowerCase()
|
|
366
|
+
.replace(/[^\w\s]/g, ' ')
|
|
367
|
+
.split(/\s+/)
|
|
368
|
+
.filter((word) => word.length > 2 && !stopWords.has(word));
|
|
369
|
+
// Take first 5 meaningful words for search
|
|
370
|
+
return words.slice(0, 5).join(' OR ');
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Check if content should be excluded
|
|
374
|
+
*/
|
|
375
|
+
static shouldExclude(content, settings) {
|
|
376
|
+
if (!settings.excludedPatterns || settings.excludedPatterns.length === 0) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
for (const pattern of settings.excludedPatterns) {
|
|
380
|
+
try {
|
|
381
|
+
const regex = new RegExp(pattern, 'i');
|
|
382
|
+
if (regex.test(content)) {
|
|
383
|
+
return true;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
// Invalid regex pattern, skip
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Check if content contains sensitive data
|
|
394
|
+
*/
|
|
395
|
+
static containsSensitiveData(content) {
|
|
396
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
397
|
+
if (pattern.test(content)) {
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Truncate text to specified length
|
|
405
|
+
*/
|
|
406
|
+
static truncate(text, maxLength) {
|
|
407
|
+
if (text.length <= maxLength)
|
|
408
|
+
return text;
|
|
409
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Ensure service is initialized
|
|
413
|
+
*/
|
|
414
|
+
static ensureInitialized() {
|
|
415
|
+
if (!this.initialized) {
|
|
416
|
+
throw new Error('[MemoryService] Not initialized. Call MemoryService.initialize() first.');
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Shutdown the service
|
|
421
|
+
*/
|
|
422
|
+
static shutdown() {
|
|
423
|
+
if (this.cleanupIntervalHandle) {
|
|
424
|
+
clearInterval(this.cleanupIntervalHandle);
|
|
425
|
+
this.cleanupIntervalHandle = undefined;
|
|
426
|
+
}
|
|
427
|
+
memoryEvents.removeAllListeners();
|
|
428
|
+
this.initialized = false;
|
|
429
|
+
console.log('[MemoryService] Shutdown complete');
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
exports.MemoryService = MemoryService;
|
|
433
|
+
MemoryService.initialized = false;
|
|
434
|
+
MemoryService.compressionQueue = [];
|
|
435
|
+
MemoryService.compressionInProgress = false;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Notification module exports
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_NOTIFICATION_DIR = exports.DEFAULT_NOTIFICATION_STORE_PATH = exports.getNotificationDir = exports.getNotificationStorePath = exports.saveNotificationStoreSync = exports.saveNotificationStore = exports.loadNotificationStoreSync = exports.loadNotificationStore = exports.NotificationService = void 0;
|
|
7
|
+
var service_1 = require("./service");
|
|
8
|
+
Object.defineProperty(exports, "NotificationService", { enumerable: true, get: function () { return service_1.NotificationService; } });
|
|
9
|
+
var store_1 = require("./store");
|
|
10
|
+
Object.defineProperty(exports, "loadNotificationStore", { enumerable: true, get: function () { return store_1.loadNotificationStore; } });
|
|
11
|
+
Object.defineProperty(exports, "loadNotificationStoreSync", { enumerable: true, get: function () { return store_1.loadNotificationStoreSync; } });
|
|
12
|
+
Object.defineProperty(exports, "saveNotificationStore", { enumerable: true, get: function () { return store_1.saveNotificationStore; } });
|
|
13
|
+
Object.defineProperty(exports, "saveNotificationStoreSync", { enumerable: true, get: function () { return store_1.saveNotificationStoreSync; } });
|
|
14
|
+
Object.defineProperty(exports, "getNotificationStorePath", { enumerable: true, get: function () { return store_1.getNotificationStorePath; } });
|
|
15
|
+
Object.defineProperty(exports, "getNotificationDir", { enumerable: true, get: function () { return store_1.getNotificationDir; } });
|
|
16
|
+
Object.defineProperty(exports, "DEFAULT_NOTIFICATION_STORE_PATH", { enumerable: true, get: function () { return store_1.DEFAULT_NOTIFICATION_STORE_PATH; } });
|
|
17
|
+
Object.defineProperty(exports, "DEFAULT_NOTIFICATION_DIR", { enumerable: true, get: function () { return store_1.DEFAULT_NOTIFICATION_DIR; } });
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Notification Service - Manages in-app notifications
|
|
4
|
+
* Provides CRUD operations and emits events for UI updates
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.NotificationService = void 0;
|
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
const store_1 = require("./store");
|
|
10
|
+
class NotificationService {
|
|
11
|
+
constructor(config = {}) {
|
|
12
|
+
this.notifications = [];
|
|
13
|
+
this.storePath = config.storePath || (0, store_1.getNotificationStorePath)();
|
|
14
|
+
this.onEvent = config.onEvent;
|
|
15
|
+
// Load notifications synchronously on startup
|
|
16
|
+
const store = (0, store_1.loadNotificationStoreSync)(this.storePath);
|
|
17
|
+
this.notifications = store.notifications;
|
|
18
|
+
console.log(`[Notifications] Loaded ${this.notifications.length} notifications from store`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get all notifications (sorted by date, newest first)
|
|
22
|
+
*/
|
|
23
|
+
list() {
|
|
24
|
+
return [...this.notifications].sort((a, b) => b.createdAt - a.createdAt);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get unread count
|
|
28
|
+
*/
|
|
29
|
+
getUnreadCount() {
|
|
30
|
+
return this.notifications.filter((n) => !n.read).length;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add a new notification
|
|
34
|
+
*/
|
|
35
|
+
async add(params) {
|
|
36
|
+
const notification = {
|
|
37
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
38
|
+
type: params.type,
|
|
39
|
+
title: params.title,
|
|
40
|
+
message: params.message,
|
|
41
|
+
read: false,
|
|
42
|
+
createdAt: Date.now(),
|
|
43
|
+
taskId: params.taskId,
|
|
44
|
+
cronJobId: params.cronJobId,
|
|
45
|
+
workspaceId: params.workspaceId,
|
|
46
|
+
};
|
|
47
|
+
this.notifications.unshift(notification);
|
|
48
|
+
await this.save();
|
|
49
|
+
this.emit({ type: 'added', notification });
|
|
50
|
+
return notification;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Mark a notification as read
|
|
54
|
+
*/
|
|
55
|
+
async markRead(id) {
|
|
56
|
+
const notification = this.notifications.find((n) => n.id === id);
|
|
57
|
+
if (!notification)
|
|
58
|
+
return null;
|
|
59
|
+
notification.read = true;
|
|
60
|
+
await this.save();
|
|
61
|
+
this.emit({ type: 'updated', notification });
|
|
62
|
+
return notification;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Mark all notifications as read
|
|
66
|
+
*/
|
|
67
|
+
async markAllRead() {
|
|
68
|
+
const unread = this.notifications.filter((n) => !n.read);
|
|
69
|
+
if (unread.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
for (const n of unread) {
|
|
72
|
+
n.read = true;
|
|
73
|
+
}
|
|
74
|
+
await this.save();
|
|
75
|
+
this.emit({ type: 'updated', notifications: this.notifications });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Delete a notification
|
|
79
|
+
*/
|
|
80
|
+
async delete(id) {
|
|
81
|
+
const index = this.notifications.findIndex((n) => n.id === id);
|
|
82
|
+
if (index === -1)
|
|
83
|
+
return false;
|
|
84
|
+
const [removed] = this.notifications.splice(index, 1);
|
|
85
|
+
await this.save();
|
|
86
|
+
this.emit({ type: 'removed', notification: removed });
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete all notifications
|
|
91
|
+
*/
|
|
92
|
+
async deleteAll() {
|
|
93
|
+
if (this.notifications.length === 0)
|
|
94
|
+
return;
|
|
95
|
+
this.notifications = [];
|
|
96
|
+
await this.save();
|
|
97
|
+
this.emit({ type: 'cleared' });
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Save notifications to disk
|
|
101
|
+
*/
|
|
102
|
+
async save() {
|
|
103
|
+
const store = {
|
|
104
|
+
version: 1,
|
|
105
|
+
notifications: this.notifications,
|
|
106
|
+
};
|
|
107
|
+
await (0, store_1.saveNotificationStore)(store, this.storePath);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Emit an event to listeners
|
|
111
|
+
*/
|
|
112
|
+
emit(event) {
|
|
113
|
+
if (this.onEvent) {
|
|
114
|
+
this.onEvent(event);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.NotificationService = NotificationService;
|