cowork-os 0.3.66 → 0.3.69
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/CHANGELOG.md +28 -0
- package/README.md +19 -0
- package/bin/cowork.js +162 -19
- package/dist/electron/electron/activity/ActivityRepository.js +190 -0
- package/dist/electron/electron/agent/browser/browser-service.js +652 -0
- package/dist/electron/electron/agent/context-manager.js +332 -0
- package/dist/electron/electron/agent/custom-skill-loader.js +596 -0
- package/dist/electron/electron/agent/daemon.js +1895 -0
- package/dist/electron/electron/agent/executor.js +6238 -0
- package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
- package/dist/electron/electron/agent/llm/anthropic-provider.js +155 -0
- package/dist/electron/electron/agent/llm/azure-openai-provider.js +328 -0
- package/dist/electron/electron/agent/llm/bedrock-provider.js +461 -0
- package/dist/electron/electron/agent/llm/gemini-provider.js +374 -0
- package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
- package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
- package/dist/electron/electron/agent/llm/index.js +46 -0
- package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
- package/dist/electron/electron/agent/llm/ollama-provider.js +263 -0
- package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
- package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
- package/dist/electron/electron/agent/llm/openai-oauth.js +121 -0
- package/dist/electron/electron/agent/llm/openai-provider.js +672 -0
- package/dist/electron/electron/agent/llm/openrouter-provider.js +232 -0
- package/dist/electron/electron/agent/llm/pi-provider.js +309 -0
- package/dist/electron/electron/agent/llm/pricing.js +158 -0
- package/dist/electron/electron/agent/llm/provider-factory.js +1621 -0
- package/dist/electron/electron/agent/llm/types.js +266 -0
- package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
- package/dist/electron/electron/agent/queue-manager.js +380 -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 +431 -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 +686 -0
- package/dist/electron/electron/agent/skills/organizer.js +158 -0
- package/dist/electron/electron/agent/skills/presentation.js +367 -0
- package/dist/electron/electron/agent/skills/spreadsheet.js +177 -0
- package/dist/electron/electron/agent/tools/apple-calendar-tools.js +582 -0
- package/dist/electron/electron/agent/tools/apple-reminders-tools.js +590 -0
- package/dist/electron/electron/agent/tools/box-tools.js +231 -0
- package/dist/electron/electron/agent/tools/browser-tools.js +580 -0
- package/dist/electron/electron/agent/tools/builtin-settings.js +423 -0
- package/dist/electron/electron/agent/tools/canvas-tools.js +530 -0
- package/dist/electron/electron/agent/tools/channel-tools.js +378 -0
- package/dist/electron/electron/agent/tools/cron-tools.js +664 -0
- package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
- package/dist/electron/electron/agent/tools/edit-tools.js +211 -0
- package/dist/electron/electron/agent/tools/email-imap-tools.js +146 -0
- package/dist/electron/electron/agent/tools/file-tools.js +908 -0
- package/dist/electron/electron/agent/tools/glob-tools.js +291 -0
- package/dist/electron/electron/agent/tools/gmail-tools.js +199 -0
- package/dist/electron/electron/agent/tools/google-calendar-tools.js +211 -0
- package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
- package/dist/electron/electron/agent/tools/grep-tools.js +499 -0
- package/dist/electron/electron/agent/tools/image-tools.js +129 -0
- package/dist/electron/electron/agent/tools/mention-tools.js +282 -0
- package/dist/electron/electron/agent/tools/monty-tools.js +383 -0
- package/dist/electron/electron/agent/tools/node-tools.js +476 -0
- package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
- package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
- package/dist/electron/electron/agent/tools/read-files.js +139 -0
- package/dist/electron/electron/agent/tools/registry.js +4472 -0
- package/dist/electron/electron/agent/tools/search-tools.js +109 -0
- package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
- package/dist/electron/electron/agent/tools/shell-tools.js +596 -0
- package/dist/electron/electron/agent/tools/skill-tools.js +274 -0
- package/dist/electron/electron/agent/tools/system-tools.js +733 -0
- package/dist/electron/electron/agent/tools/vision-tools.js +316 -0
- package/dist/electron/electron/agent/tools/visual-tools.js +1013 -0
- package/dist/electron/electron/agent/tools/voice-call-tools.js +239 -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/AgentTeamItemRepository.js +172 -0
- package/dist/electron/electron/agents/AgentTeamMemberRepository.js +154 -0
- package/dist/electron/electron/agents/AgentTeamOrchestrator.js +269 -0
- package/dist/electron/electron/agents/AgentTeamRepository.js +157 -0
- package/dist/electron/electron/agents/AgentTeamRunRepository.js +140 -0
- package/dist/electron/electron/agents/CrossSignalService.js +325 -0
- package/dist/electron/electron/agents/FeedbackService.js +323 -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/agents/agent-dispatch.js +69 -0
- package/dist/electron/electron/agents/mentions.js +135 -0
- package/dist/electron/electron/canvas/canvas-manager.js +744 -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 +1676 -0
- package/dist/electron/electron/control-plane/index.js +42 -0
- package/dist/electron/electron/control-plane/node-manager.js +264 -0
- package/dist/electron/electron/control-plane/protocol.js +208 -0
- package/dist/electron/electron/control-plane/remote-client.js +437 -0
- package/dist/electron/electron/control-plane/server.js +689 -0
- package/dist/electron/electron/control-plane/settings.js +372 -0
- package/dist/electron/electron/control-plane/ssh-tunnel.js +549 -0
- package/dist/electron/electron/control-plane/web-ui.js +999 -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 +731 -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 +452 -0
- package/dist/electron/electron/database/TaskLabelRepository.js +120 -0
- package/dist/electron/electron/database/repositories.js +2271 -0
- package/dist/electron/electron/database/schema.js +1164 -0
- package/dist/electron/electron/extensions/index.js +33 -0
- package/dist/electron/electron/extensions/loader.js +334 -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 +1126 -0
- package/dist/electron/electron/gateway/channels/bluebubbles-client.js +479 -0
- package/dist/electron/electron/gateway/channels/bluebubbles.js +435 -0
- package/dist/electron/electron/gateway/channels/discord.js +1026 -0
- package/dist/electron/electron/gateway/channels/email-client.js +701 -0
- package/dist/electron/electron/gateway/channels/email.js +443 -0
- package/dist/electron/electron/gateway/channels/google-chat.js +730 -0
- package/dist/electron/electron/gateway/channels/imessage-client.js +363 -0
- package/dist/electron/electron/gateway/channels/imessage.js +520 -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 +481 -0
- package/dist/electron/electron/gateway/channels/matrix-client.js +444 -0
- package/dist/electron/electron/gateway/channels/matrix.js +619 -0
- package/dist/electron/electron/gateway/channels/mattermost-client.js +394 -0
- package/dist/electron/electron/gateway/channels/mattermost.js +498 -0
- package/dist/electron/electron/gateway/channels/signal-client.js +499 -0
- package/dist/electron/electron/gateway/channels/signal.js +584 -0
- package/dist/electron/electron/gateway/channels/slack.js +494 -0
- package/dist/electron/electron/gateway/channels/teams.js +712 -0
- package/dist/electron/electron/gateway/channels/telegram.js +1613 -0
- package/dist/electron/electron/gateway/channels/twitch-client.js +502 -0
- package/dist/electron/electron/gateway/channels/twitch.js +398 -0
- package/dist/electron/electron/gateway/channels/types.js +8 -0
- package/dist/electron/electron/gateway/channels/whatsapp.js +1031 -0
- package/dist/electron/electron/gateway/chat-transcript.js +120 -0
- package/dist/electron/electron/gateway/context-policy.js +268 -0
- package/dist/electron/electron/gateway/index.js +1262 -0
- package/dist/electron/electron/gateway/infrastructure.js +496 -0
- package/dist/electron/electron/gateway/router-rules.js +168 -0
- package/dist/electron/electron/gateway/router.js +5673 -0
- package/dist/electron/electron/gateway/security.js +388 -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 +554 -0
- package/dist/electron/electron/hooks/settings.js +450 -0
- package/dist/electron/electron/hooks/types.js +41 -0
- package/dist/electron/electron/ipc/canvas-handlers.js +163 -0
- package/dist/electron/electron/ipc/handlers.js +4391 -0
- package/dist/electron/electron/ipc/mission-control-handlers.js +141 -0
- package/dist/electron/electron/mcp/client/MCPClientManager.js +342 -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 +313 -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/oauth/connector-oauth.js +333 -0
- package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +846 -0
- package/dist/electron/electron/mcp/settings.js +526 -0
- package/dist/electron/electron/mcp/types.js +59 -0
- package/dist/electron/electron/memory/ChatGPTImporter.js +464 -0
- package/dist/electron/electron/memory/MarkdownMemoryIndexService.js +973 -0
- package/dist/electron/electron/memory/MemoryService.js +794 -0
- package/dist/electron/electron/memory/WorkspaceKitContext.js +360 -0
- package/dist/electron/electron/memory/local-embedding.js +81 -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 +1020 -0
- package/dist/electron/electron/reports/AgentPerformanceReviewService.js +199 -0
- package/dist/electron/electron/reports/StandupReportService.js +272 -0
- package/dist/electron/electron/reports/task-export.js +138 -0
- package/dist/electron/electron/sandbox/monty-engine.js +250 -0
- package/dist/electron/electron/security/concurrency.js +293 -0
- package/dist/electron/electron/security/index.js +15 -0
- package/dist/electron/electron/security/monty-tool-policy.js +143 -0
- package/dist/electron/electron/security/policy-manager.js +435 -0
- package/dist/electron/electron/security/project-access.js +137 -0
- package/dist/electron/electron/settings/appearance-manager.js +210 -0
- package/dist/electron/electron/settings/box-manager.js +54 -0
- package/dist/electron/electron/settings/dropbox-manager.js +54 -0
- package/dist/electron/electron/settings/google-workspace-manager.js +55 -0
- package/dist/electron/electron/settings/memory-features-manager.js +62 -0
- package/dist/electron/electron/settings/notion-manager.js +56 -0
- package/dist/electron/electron/settings/onedrive-manager.js +54 -0
- package/dist/electron/electron/settings/personality-manager.js +740 -0
- package/dist/electron/electron/settings/sharepoint-manager.js +54 -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 +899 -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/box-api.js +153 -0
- package/dist/electron/electron/utils/dropbox-api.js +144 -0
- package/dist/electron/electron/utils/env-migration.js +538 -0
- package/dist/electron/electron/utils/gmail-api.js +99 -0
- package/dist/electron/electron/utils/google-calendar-api.js +92 -0
- package/dist/electron/electron/utils/google-workspace-api.js +196 -0
- package/dist/electron/electron/utils/google-workspace-auth.js +91 -0
- package/dist/electron/electron/utils/google-workspace-oauth.js +184 -0
- package/dist/electron/electron/utils/json-utils.js +204 -0
- package/dist/electron/electron/utils/notion-api.js +103 -0
- package/dist/electron/electron/utils/onedrive-api.js +113 -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/runtime-mode.js +58 -0
- package/dist/electron/electron/utils/safe-storage.js +31 -0
- package/dist/electron/electron/utils/sharepoint-api.js +109 -0
- package/dist/electron/electron/utils/user-data-dir.js +59 -0
- package/dist/electron/electron/utils/validation.js +606 -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 +361 -0
- package/dist/electron/shared/agent-preferences.js +36 -0
- package/dist/electron/shared/channelMessages.js +460 -0
- package/dist/electron/shared/llm-provider-catalog.js +198 -0
- package/dist/electron/shared/plan-utils.js +32 -0
- package/dist/electron/shared/types.js +1376 -0
- package/dist/renderer/assets/index-3cWYvSH3.css +1 -0
- package/dist/renderer/assets/index-Xvm2AXZV.js +3510 -0
- package/dist/renderer/cowork-os-logo.png +0 -0
- package/dist/renderer/index.html +13 -0
- package/package.json +12 -5
- package/scripts/setup_native.mjs +61 -24
- package/src/renderer/components/DisclaimerModal.tsx +36 -23
- package/src/renderer/components/Onboarding/Onboarding.tsx +1 -1
- package/src/renderer/styles/index.css +259 -100
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.69] - 2026-02-11
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- `npm install -g cowork-os` could fail on macOS with `fsevents` (`binding.gyp not found`) due an npm 11 rebuild edge case triggered by `playwright`.
|
|
14
|
+
- Switched runtime browser dependency to `playwright-core` via npm alias (`playwright` package name preserved in code) to avoid the failing `fsevents` install path.
|
|
15
|
+
- Added launcher self-heal: on first run, `cowork-os` now verifies direct runtime dependencies and repairs missing packages with a script-free npm install pass before boot.
|
|
16
|
+
- Moved `@types/jszip` to `devDependencies` and excluded `@types/*` from runtime dependency checks to avoid unnecessary first-run repair installs.
|
|
17
|
+
- Moved `@electron/rebuild` to runtime dependencies so native fallback rebuild works in npm-installed environments.
|
|
18
|
+
- Fixed native setup fallback to locate `@electron/rebuild` via package exports (instead of resolving blocked subpaths), so fallback rebuild actually runs when needed.
|
|
19
|
+
- `cowork-os` first run now uses the shell retry wrapper for native setup, reducing one-shot startup failures when macOS kills a setup attempt under memory pressure.
|
|
20
|
+
|
|
21
|
+
## [0.3.68] - 2026-02-11
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- `cowork-os` CLI startup could still fail with `better-sqlite3` ABI mismatch on first launch.
|
|
25
|
+
- Launcher now validates `better-sqlite3` by opening an in-memory database (not just requiring the module) and runs native setup when needed.
|
|
26
|
+
- Native setup script now resolves hoisted dependencies correctly (Electron and `better-sqlite3`) so it works in npm-installed layouts.
|
|
27
|
+
|
|
28
|
+
## [0.3.67] - 2026-02-11
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
- Added npm CLI command support: `cowork-os`, `coworkctl`, `coworkd`, and `coworkd-node`.
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
- Fixed launcher script to resolve the Electron binary correctly (`require('electron')` instead of `require.resolve`).
|
|
35
|
+
- Included `dist/` in published npm files so the `cowork-os` command can start without requiring a local build step.
|
|
36
|
+
- Moved `electron` to runtime dependencies so CLI launch works after normal npm install.
|
|
37
|
+
|
|
10
38
|
## [0.3.66] - 2026-02-11
|
|
11
39
|
|
|
12
40
|
### Fixed
|
package/README.md
CHANGED
|
@@ -53,6 +53,25 @@ Your AI needs a secure home. CoWork OS provides the runtime, security layers, an
|
|
|
53
53
|
- If the app closes immediately with a `dyld` signature error, run: `codesign --force --deep --sign - "/Applications/CoWork OS.app"`
|
|
54
54
|
- `spctl --add` / `spctl --enable` are deprecated on newer macOS and may show "This operation is no longer supported"
|
|
55
55
|
|
|
56
|
+
### From npm (CLI Launch)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Install into a local folder
|
|
60
|
+
mkdir -p /tmp/cowork-run
|
|
61
|
+
cd /tmp/cowork-run
|
|
62
|
+
npm install cowork-os@latest --no-audit --no-fund
|
|
63
|
+
|
|
64
|
+
# Start app
|
|
65
|
+
npx cowork-os
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
You can also install globally and launch directly:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npm install -g cowork-os
|
|
72
|
+
cowork-os
|
|
73
|
+
```
|
|
74
|
+
|
|
56
75
|
### From GitHub Source (Development)
|
|
57
76
|
|
|
58
77
|
#### Prerequisites
|
package/bin/cowork.js
CHANGED
|
@@ -1,43 +1,186 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const { spawn } = require('child_process');
|
|
3
|
+
const { spawn, spawnSync } = require('child_process');
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const fs = require('fs');
|
|
6
6
|
|
|
7
7
|
const packageDir = path.resolve(__dirname, '..');
|
|
8
|
-
const
|
|
8
|
+
const packageJsonPath = path.join(packageDir, 'package.json');
|
|
9
9
|
const mainPath = path.join(packageDir, 'dist', 'electron', 'electron', 'main.js');
|
|
10
10
|
const args = process.argv.slice(2);
|
|
11
|
+
const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const build = spawn('npm', ['run', 'build'], {
|
|
13
|
+
function buildAppAndLaunch() {
|
|
14
|
+
console.log('[cowork-os] Build artifacts not found, running npm run build...');
|
|
15
|
+
const build = spawn(npmCmd, ['run', 'build'], {
|
|
16
16
|
cwd: packageDir,
|
|
17
17
|
stdio: 'inherit',
|
|
18
|
-
shell:
|
|
18
|
+
shell: process.platform === 'win32',
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
build.on('
|
|
22
|
-
if (code
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
console.error('Build failed. Please run "npm run build" manually.');
|
|
26
|
-
process.exit(1);
|
|
21
|
+
build.on('exit', (code) => {
|
|
22
|
+
if (code !== 0) {
|
|
23
|
+
console.error('[cowork-os] Build failed. Run `npm run build` and retry.');
|
|
24
|
+
process.exit(code || 1);
|
|
27
25
|
}
|
|
26
|
+
launchApp();
|
|
28
27
|
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (fs.existsSync(mainPath)) {
|
|
31
|
+
prepareAndLaunchApp();
|
|
29
32
|
} else {
|
|
30
|
-
|
|
33
|
+
buildAppAndLaunch();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function listMissingRuntimeDeps() {
|
|
37
|
+
if (!fs.existsSync(packageJsonPath)) return [];
|
|
38
|
+
|
|
39
|
+
let pkg;
|
|
40
|
+
try {
|
|
41
|
+
pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
42
|
+
} catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const deps = pkg && pkg.dependencies && typeof pkg.dependencies === 'object'
|
|
47
|
+
? pkg.dependencies
|
|
48
|
+
: {};
|
|
49
|
+
|
|
50
|
+
const missing = [];
|
|
51
|
+
for (const dep of Object.keys(deps)) {
|
|
52
|
+
if (dep.startsWith('@types/')) continue;
|
|
53
|
+
try {
|
|
54
|
+
require.resolve(dep, { paths: [packageDir] });
|
|
55
|
+
} catch {
|
|
56
|
+
missing.push({ name: dep, version: deps[dep] });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return missing;
|
|
31
61
|
}
|
|
32
62
|
|
|
33
|
-
function
|
|
34
|
-
const
|
|
63
|
+
function ensureRuntimeDeps() {
|
|
64
|
+
const missing = listMissingRuntimeDeps();
|
|
65
|
+
if (missing.length === 0) return true;
|
|
66
|
+
|
|
67
|
+
const installArgs = [
|
|
68
|
+
'install',
|
|
69
|
+
'--no-save',
|
|
70
|
+
'--no-audit',
|
|
71
|
+
'--no-fund',
|
|
72
|
+
'--ignore-scripts',
|
|
73
|
+
...missing.map((dep) => `${dep.name}@${dep.version}`)
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
console.log(
|
|
77
|
+
`[cowork-os] Missing runtime dependencies detected (${missing.length}); repairing install...`
|
|
78
|
+
);
|
|
79
|
+
const res = spawnSync(npmCmd, installArgs, {
|
|
35
80
|
cwd: packageDir,
|
|
36
81
|
stdio: 'inherit',
|
|
37
|
-
|
|
82
|
+
shell: process.platform === 'win32',
|
|
83
|
+
env: process.env,
|
|
38
84
|
});
|
|
39
85
|
|
|
40
|
-
|
|
41
|
-
|
|
86
|
+
return res.status === 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function resolveElectronBinary() {
|
|
90
|
+
try {
|
|
91
|
+
return require('electron');
|
|
92
|
+
} catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function isBetterSqliteReady(electronBinary) {
|
|
98
|
+
const probe = spawnSync(
|
|
99
|
+
electronBinary,
|
|
100
|
+
[
|
|
101
|
+
'-e',
|
|
102
|
+
"const Database=require('better-sqlite3');const db=new Database(':memory:');db.close();process.stdout.write('ok')",
|
|
103
|
+
],
|
|
104
|
+
{
|
|
105
|
+
cwd: packageDir,
|
|
106
|
+
env: { ...process.env, ELECTRON_RUN_AS_NODE: '1' },
|
|
107
|
+
stdio: 'pipe',
|
|
108
|
+
encoding: 'utf8',
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
return probe.status === 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function runNativeSetup(onDone) {
|
|
116
|
+
const setupScript = path.join(packageDir, 'scripts', 'setup_native.mjs');
|
|
117
|
+
const retryScript = path.join(packageDir, 'scripts', 'setup_native_retry.sh');
|
|
118
|
+
if (!fs.existsSync(setupScript)) {
|
|
119
|
+
console.error('[cowork-os] Missing native setup script at scripts/setup_native.mjs');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
console.log('[cowork-os] Preparing native modules for Electron (first run)...');
|
|
124
|
+
const setupCommand = fs.existsSync(retryScript)
|
|
125
|
+
? (process.platform === 'win32' ? process.execPath : 'sh')
|
|
126
|
+
: process.execPath;
|
|
127
|
+
const setupArgs = fs.existsSync(retryScript)
|
|
128
|
+
? (process.platform === 'win32' ? [setupScript] : [retryScript])
|
|
129
|
+
: [setupScript];
|
|
130
|
+
const setup = spawn(setupCommand, setupArgs, {
|
|
131
|
+
cwd: packageDir,
|
|
132
|
+
stdio: 'inherit',
|
|
133
|
+
env: process.env,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
setup.on('exit', (code, signal) => {
|
|
137
|
+
if (signal) {
|
|
138
|
+
process.kill(process.pid, signal);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (code !== 0) {
|
|
142
|
+
process.exit(code || 1);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
onDone();
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function prepareAndLaunchApp() {
|
|
150
|
+
if (!ensureRuntimeDeps()) {
|
|
151
|
+
console.error('[cowork-os] Failed to repair runtime dependencies.');
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const electronBinary = resolveElectronBinary();
|
|
156
|
+
if (!electronBinary) {
|
|
157
|
+
console.error(
|
|
158
|
+
'[cowork-os] Electron runtime is missing. Reinstall with:\n' +
|
|
159
|
+
' npm install cowork-os@latest\n'
|
|
160
|
+
);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (isBetterSqliteReady(electronBinary)) {
|
|
165
|
+
launchApp(electronBinary);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
runNativeSetup(() => launchApp(electronBinary));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function launchApp(electronBinary) {
|
|
173
|
+
const electron = spawn(electronBinary, [packageDir, ...args], {
|
|
174
|
+
cwd: packageDir,
|
|
175
|
+
stdio: 'inherit',
|
|
176
|
+
env: process.env
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
electron.on('exit', (code, signal) => {
|
|
180
|
+
if (signal) {
|
|
181
|
+
process.kill(process.pid, signal);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
process.exit(code || 0);
|
|
42
185
|
});
|
|
43
186
|
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ActivityRepository = void 0;
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
/**
|
|
6
|
+
* Safely parse JSON with error handling
|
|
7
|
+
*/
|
|
8
|
+
function safeJsonParse(jsonString, defaultValue, context) {
|
|
9
|
+
if (!jsonString)
|
|
10
|
+
return defaultValue;
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(jsonString);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
console.error(`Failed to parse JSON${context ? ` in ${context}` : ''}:`, error);
|
|
16
|
+
return defaultValue;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Repository for managing activity feed entries in the database
|
|
21
|
+
*/
|
|
22
|
+
class ActivityRepository {
|
|
23
|
+
constructor(db) {
|
|
24
|
+
this.db = db;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a new activity entry
|
|
28
|
+
*/
|
|
29
|
+
create(request) {
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
const activity = {
|
|
32
|
+
id: (0, uuid_1.v4)(),
|
|
33
|
+
workspaceId: request.workspaceId,
|
|
34
|
+
taskId: request.taskId,
|
|
35
|
+
agentRoleId: request.agentRoleId,
|
|
36
|
+
actorType: request.actorType,
|
|
37
|
+
activityType: request.activityType,
|
|
38
|
+
title: request.title,
|
|
39
|
+
description: request.description,
|
|
40
|
+
metadata: request.metadata,
|
|
41
|
+
isRead: false,
|
|
42
|
+
isPinned: false,
|
|
43
|
+
createdAt: now,
|
|
44
|
+
};
|
|
45
|
+
const stmt = this.db.prepare(`
|
|
46
|
+
INSERT INTO activity_feed (
|
|
47
|
+
id, workspace_id, task_id, agent_role_id, actor_type,
|
|
48
|
+
activity_type, title, description, metadata,
|
|
49
|
+
is_read, is_pinned, created_at
|
|
50
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
51
|
+
`);
|
|
52
|
+
stmt.run(activity.id, activity.workspaceId, activity.taskId || null, activity.agentRoleId || null, activity.actorType, activity.activityType, activity.title, activity.description || null, activity.metadata ? JSON.stringify(activity.metadata) : null, activity.isRead ? 1 : 0, activity.isPinned ? 1 : 0, activity.createdAt);
|
|
53
|
+
return activity;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Find an activity by ID
|
|
57
|
+
*/
|
|
58
|
+
findById(id) {
|
|
59
|
+
const stmt = this.db.prepare('SELECT * FROM activity_feed WHERE id = ?');
|
|
60
|
+
const row = stmt.get(id);
|
|
61
|
+
return row ? this.mapRowToActivity(row) : undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* List activities with optional filtering
|
|
65
|
+
*/
|
|
66
|
+
list(query) {
|
|
67
|
+
const conditions = ['workspace_id = ?'];
|
|
68
|
+
const params = [query.workspaceId];
|
|
69
|
+
if (query.taskId) {
|
|
70
|
+
conditions.push('task_id = ?');
|
|
71
|
+
params.push(query.taskId);
|
|
72
|
+
}
|
|
73
|
+
if (query.agentRoleId) {
|
|
74
|
+
conditions.push('agent_role_id = ?');
|
|
75
|
+
params.push(query.agentRoleId);
|
|
76
|
+
}
|
|
77
|
+
if (query.activityType) {
|
|
78
|
+
if (Array.isArray(query.activityType)) {
|
|
79
|
+
conditions.push(`activity_type IN (${query.activityType.map(() => '?').join(', ')})`);
|
|
80
|
+
params.push(...query.activityType);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
conditions.push('activity_type = ?');
|
|
84
|
+
params.push(query.activityType);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (query.actorType) {
|
|
88
|
+
conditions.push('actor_type = ?');
|
|
89
|
+
params.push(query.actorType);
|
|
90
|
+
}
|
|
91
|
+
if (query.isRead !== undefined) {
|
|
92
|
+
conditions.push('is_read = ?');
|
|
93
|
+
params.push(query.isRead ? 1 : 0);
|
|
94
|
+
}
|
|
95
|
+
if (query.isPinned !== undefined) {
|
|
96
|
+
conditions.push('is_pinned = ?');
|
|
97
|
+
params.push(query.isPinned ? 1 : 0);
|
|
98
|
+
}
|
|
99
|
+
let sql = `SELECT * FROM activity_feed WHERE ${conditions.join(' AND ')} ORDER BY created_at DESC`;
|
|
100
|
+
if (query.limit) {
|
|
101
|
+
sql += ` LIMIT ${query.limit}`;
|
|
102
|
+
if (query.offset) {
|
|
103
|
+
sql += ` OFFSET ${query.offset}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const stmt = this.db.prepare(sql);
|
|
107
|
+
const rows = stmt.all(...params);
|
|
108
|
+
return rows.map((row) => this.mapRowToActivity(row));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get unread count for a workspace
|
|
112
|
+
*/
|
|
113
|
+
getUnreadCount(workspaceId) {
|
|
114
|
+
const stmt = this.db.prepare('SELECT COUNT(*) as count FROM activity_feed WHERE workspace_id = ? AND is_read = 0');
|
|
115
|
+
const result = stmt.get(workspaceId);
|
|
116
|
+
return result.count;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Mark an activity as read
|
|
120
|
+
*/
|
|
121
|
+
markRead(id) {
|
|
122
|
+
const stmt = this.db.prepare('UPDATE activity_feed SET is_read = 1 WHERE id = ?');
|
|
123
|
+
const result = stmt.run(id);
|
|
124
|
+
return result.changes > 0;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Mark all activities as read for a workspace
|
|
128
|
+
*/
|
|
129
|
+
markAllRead(workspaceId) {
|
|
130
|
+
const stmt = this.db.prepare('UPDATE activity_feed SET is_read = 1 WHERE workspace_id = ? AND is_read = 0');
|
|
131
|
+
const result = stmt.run(workspaceId);
|
|
132
|
+
return result.changes;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Toggle pin status of an activity
|
|
136
|
+
*/
|
|
137
|
+
togglePin(id) {
|
|
138
|
+
const existing = this.findById(id);
|
|
139
|
+
if (!existing)
|
|
140
|
+
return undefined;
|
|
141
|
+
const newPinned = !existing.isPinned;
|
|
142
|
+
const stmt = this.db.prepare('UPDATE activity_feed SET is_pinned = ? WHERE id = ?');
|
|
143
|
+
stmt.run(newPinned ? 1 : 0, id);
|
|
144
|
+
return { ...existing, isPinned: newPinned };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Delete an activity
|
|
148
|
+
*/
|
|
149
|
+
delete(id) {
|
|
150
|
+
const stmt = this.db.prepare('DELETE FROM activity_feed WHERE id = ?');
|
|
151
|
+
const result = stmt.run(id);
|
|
152
|
+
return result.changes > 0;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Delete all activities for a workspace (optionally by age)
|
|
156
|
+
*/
|
|
157
|
+
deleteOld(workspaceId, olderThanMs) {
|
|
158
|
+
if (olderThanMs) {
|
|
159
|
+
const cutoff = Date.now() - olderThanMs;
|
|
160
|
+
const stmt = this.db.prepare('DELETE FROM activity_feed WHERE workspace_id = ? AND created_at < ? AND is_pinned = 0');
|
|
161
|
+
const result = stmt.run(workspaceId, cutoff);
|
|
162
|
+
return result.changes;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const stmt = this.db.prepare('DELETE FROM activity_feed WHERE workspace_id = ? AND is_pinned = 0');
|
|
166
|
+
const result = stmt.run(workspaceId);
|
|
167
|
+
return result.changes;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Map database row to Activity object
|
|
172
|
+
*/
|
|
173
|
+
mapRowToActivity(row) {
|
|
174
|
+
return {
|
|
175
|
+
id: row.id,
|
|
176
|
+
workspaceId: row.workspace_id,
|
|
177
|
+
taskId: row.task_id || undefined,
|
|
178
|
+
agentRoleId: row.agent_role_id || undefined,
|
|
179
|
+
actorType: row.actor_type,
|
|
180
|
+
activityType: row.activity_type,
|
|
181
|
+
title: row.title,
|
|
182
|
+
description: row.description || undefined,
|
|
183
|
+
metadata: safeJsonParse(row.metadata, undefined, 'activity.metadata'),
|
|
184
|
+
isRead: row.is_read === 1,
|
|
185
|
+
isPinned: row.is_pinned === 1,
|
|
186
|
+
createdAt: row.created_at,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.ActivityRepository = ActivityRepository;
|