cowork-os 0.3.67 → 0.3.70
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 +18 -0
- package/README.md +79 -8
- package/bin/cowork.js +132 -6
- package/dist/daemon/daemon/control-plane-methods.js +959 -0
- package/dist/daemon/daemon/main.js +562 -0
- package/dist/daemon/electron/activity/ActivityRepository.js +190 -0
- package/dist/daemon/electron/agent/browser/browser-service.js +652 -0
- package/dist/daemon/electron/agent/context-manager.js +332 -0
- package/dist/daemon/electron/agent/custom-skill-loader.js +596 -0
- package/dist/daemon/electron/agent/daemon.js +1895 -0
- package/dist/daemon/electron/agent/executor.js +6238 -0
- package/dist/daemon/electron/agent/llm/anthropic-compatible-provider.js +177 -0
- package/dist/daemon/electron/agent/llm/anthropic-provider.js +155 -0
- package/dist/daemon/electron/agent/llm/azure-openai-provider.js +328 -0
- package/dist/daemon/electron/agent/llm/bedrock-provider.js +461 -0
- package/dist/daemon/electron/agent/llm/gemini-provider.js +374 -0
- package/dist/daemon/electron/agent/llm/github-copilot-provider.js +97 -0
- package/dist/daemon/electron/agent/llm/groq-provider.js +33 -0
- package/dist/daemon/electron/agent/llm/index.js +46 -0
- package/dist/daemon/electron/agent/llm/kimi-provider.js +33 -0
- package/dist/daemon/electron/agent/llm/ollama-provider.js +263 -0
- package/dist/daemon/electron/agent/llm/openai-compatible-provider.js +116 -0
- package/dist/daemon/electron/agent/llm/openai-compatible.js +111 -0
- package/dist/daemon/electron/agent/llm/openai-oauth.js +121 -0
- package/dist/daemon/electron/agent/llm/openai-provider.js +672 -0
- package/dist/daemon/electron/agent/llm/openrouter-provider.js +232 -0
- package/dist/daemon/electron/agent/llm/pi-provider.js +309 -0
- package/dist/daemon/electron/agent/llm/pricing.js +158 -0
- package/dist/daemon/electron/agent/llm/provider-factory.js +1621 -0
- package/dist/daemon/electron/agent/llm/types.js +266 -0
- package/dist/daemon/electron/agent/llm/xai-provider.js +33 -0
- package/dist/daemon/electron/agent/queue-manager.js +380 -0
- package/dist/daemon/electron/agent/sandbox/docker-sandbox.js +402 -0
- package/dist/daemon/electron/agent/sandbox/macos-sandbox.js +407 -0
- package/dist/daemon/electron/agent/sandbox/runner.js +410 -0
- package/dist/daemon/electron/agent/sandbox/sandbox-factory.js +228 -0
- package/dist/daemon/electron/agent/sandbox/security-utils.js +258 -0
- package/dist/daemon/electron/agent/search/brave-provider.js +119 -0
- package/dist/daemon/electron/agent/search/google-provider.js +100 -0
- package/dist/daemon/electron/agent/search/index.js +28 -0
- package/dist/daemon/electron/agent/search/provider-factory.js +431 -0
- package/dist/daemon/electron/agent/search/serpapi-provider.js +112 -0
- package/dist/daemon/electron/agent/search/tavily-provider.js +90 -0
- package/dist/daemon/electron/agent/search/types.js +40 -0
- package/dist/daemon/electron/agent/security/index.js +12 -0
- package/dist/daemon/electron/agent/security/input-sanitizer.js +303 -0
- package/dist/daemon/electron/agent/security/output-filter.js +217 -0
- package/dist/daemon/electron/agent/skill-eligibility.js +281 -0
- package/dist/daemon/electron/agent/skill-registry.js +396 -0
- package/dist/daemon/electron/agent/skills/document.js +878 -0
- package/dist/daemon/electron/agent/skills/image-generator.js +686 -0
- package/dist/daemon/electron/agent/skills/organizer.js +158 -0
- package/dist/daemon/electron/agent/skills/presentation.js +367 -0
- package/dist/daemon/electron/agent/skills/spreadsheet.js +177 -0
- package/dist/daemon/electron/agent/tools/apple-calendar-tools.js +582 -0
- package/dist/daemon/electron/agent/tools/apple-reminders-tools.js +590 -0
- package/dist/daemon/electron/agent/tools/box-tools.js +231 -0
- package/dist/daemon/electron/agent/tools/browser-tools.js +580 -0
- package/dist/daemon/electron/agent/tools/builtin-settings.js +423 -0
- package/dist/daemon/electron/agent/tools/canvas-tools.js +530 -0
- package/dist/daemon/electron/agent/tools/channel-tools.js +378 -0
- package/dist/daemon/electron/agent/tools/cron-tools.js +664 -0
- package/dist/daemon/electron/agent/tools/dropbox-tools.js +237 -0
- package/dist/daemon/electron/agent/tools/edit-tools.js +211 -0
- package/dist/daemon/electron/agent/tools/email-imap-tools.js +146 -0
- package/dist/daemon/electron/agent/tools/file-tools.js +908 -0
- package/dist/daemon/electron/agent/tools/glob-tools.js +291 -0
- package/dist/daemon/electron/agent/tools/gmail-tools.js +199 -0
- package/dist/daemon/electron/agent/tools/google-calendar-tools.js +211 -0
- package/dist/daemon/electron/agent/tools/google-drive-tools.js +227 -0
- package/dist/daemon/electron/agent/tools/grep-tools.js +499 -0
- package/dist/daemon/electron/agent/tools/image-tools.js +129 -0
- package/dist/daemon/electron/agent/tools/mention-tools.js +282 -0
- package/dist/daemon/electron/agent/tools/monty-tools.js +383 -0
- package/dist/daemon/electron/agent/tools/notion-tools.js +312 -0
- package/dist/daemon/electron/agent/tools/onedrive-tools.js +217 -0
- package/dist/daemon/electron/agent/tools/read-files.js +139 -0
- package/dist/daemon/electron/agent/tools/registry.js +4472 -0
- package/dist/daemon/electron/agent/tools/search-tools.js +109 -0
- package/dist/daemon/electron/agent/tools/sharepoint-tools.js +243 -0
- package/dist/daemon/electron/agent/tools/shell-tools.js +596 -0
- package/dist/daemon/electron/agent/tools/skill-tools.js +274 -0
- package/dist/daemon/electron/agent/tools/system-tools.js +733 -0
- package/dist/daemon/electron/agent/tools/vision-tools.js +316 -0
- package/dist/daemon/electron/agent/tools/visual-tools.js +1013 -0
- package/dist/daemon/electron/agent/tools/voice-call-tools.js +239 -0
- package/dist/daemon/electron/agent/tools/web-fetch-tools.js +444 -0
- package/dist/daemon/electron/agent/tools/x-tools.js +264 -0
- package/dist/daemon/electron/agents/AgentRoleRepository.js +420 -0
- package/dist/daemon/electron/agents/AgentTeamItemRepository.js +172 -0
- package/dist/daemon/electron/agents/AgentTeamOrchestrator.js +269 -0
- package/dist/daemon/electron/agents/AgentTeamRepository.js +157 -0
- package/dist/daemon/electron/agents/AgentTeamRunRepository.js +140 -0
- package/dist/daemon/electron/agents/CrossSignalService.js +325 -0
- package/dist/daemon/electron/agents/FeedbackService.js +323 -0
- package/dist/daemon/electron/agents/MentionRepository.js +197 -0
- package/dist/daemon/electron/agents/agent-dispatch.js +69 -0
- package/dist/daemon/electron/agents/mentions.js +135 -0
- package/dist/daemon/electron/canvas/canvas-manager.js +744 -0
- package/dist/daemon/electron/canvas/canvas-store.js +174 -0
- package/dist/daemon/electron/control-plane/client.js +364 -0
- package/dist/daemon/electron/control-plane/protocol.js +208 -0
- package/dist/daemon/electron/control-plane/remote-client.js +437 -0
- package/dist/daemon/electron/control-plane/server.js +689 -0
- package/dist/daemon/electron/control-plane/settings.js +372 -0
- package/dist/daemon/electron/control-plane/web-ui.js +999 -0
- package/dist/daemon/electron/cron/index.js +30 -0
- package/dist/daemon/electron/cron/schedule.js +190 -0
- package/dist/daemon/electron/cron/service.js +731 -0
- package/dist/daemon/electron/cron/store.js +155 -0
- package/dist/daemon/electron/cron/types.js +82 -0
- package/dist/daemon/electron/cron/webhook.js +258 -0
- package/dist/daemon/electron/database/SecureSettingsRepository.js +452 -0
- package/dist/daemon/electron/database/repositories.js +2271 -0
- package/dist/daemon/electron/database/schema.js +1164 -0
- package/dist/daemon/electron/gateway/channel-registry.js +1126 -0
- package/dist/daemon/electron/gateway/channels/bluebubbles-client.js +479 -0
- package/dist/daemon/electron/gateway/channels/bluebubbles.js +435 -0
- package/dist/daemon/electron/gateway/channels/discord.js +1026 -0
- package/dist/daemon/electron/gateway/channels/email-client.js +701 -0
- package/dist/daemon/electron/gateway/channels/email.js +443 -0
- package/dist/daemon/electron/gateway/channels/google-chat.js +730 -0
- package/dist/daemon/electron/gateway/channels/imessage-client.js +363 -0
- package/dist/daemon/electron/gateway/channels/imessage.js +520 -0
- package/dist/daemon/electron/gateway/channels/line-client.js +470 -0
- package/dist/daemon/electron/gateway/channels/line.js +481 -0
- package/dist/daemon/electron/gateway/channels/matrix-client.js +444 -0
- package/dist/daemon/electron/gateway/channels/matrix.js +619 -0
- package/dist/daemon/electron/gateway/channels/mattermost-client.js +394 -0
- package/dist/daemon/electron/gateway/channels/mattermost.js +498 -0
- package/dist/daemon/electron/gateway/channels/signal-client.js +499 -0
- package/dist/daemon/electron/gateway/channels/signal.js +584 -0
- package/dist/daemon/electron/gateway/channels/slack.js +494 -0
- package/dist/daemon/electron/gateway/channels/teams.js +712 -0
- package/dist/daemon/electron/gateway/channels/telegram.js +1613 -0
- package/dist/daemon/electron/gateway/channels/twitch-client.js +502 -0
- package/dist/daemon/electron/gateway/channels/twitch.js +398 -0
- package/dist/daemon/electron/gateway/channels/types.js +8 -0
- package/dist/daemon/electron/gateway/channels/whatsapp.js +1031 -0
- package/dist/daemon/electron/gateway/chat-transcript.js +120 -0
- package/dist/daemon/electron/gateway/context-policy.js +268 -0
- package/dist/daemon/electron/gateway/index.js +1262 -0
- package/dist/daemon/electron/gateway/router-rules.js +168 -0
- package/dist/daemon/electron/gateway/router.js +5673 -0
- package/dist/daemon/electron/gateway/security.js +388 -0
- package/dist/daemon/electron/gateway/session.js +115 -0
- package/dist/daemon/electron/gateway/tunnel.js +503 -0
- package/dist/daemon/electron/guardrails/guardrail-manager.js +348 -0
- package/dist/daemon/electron/mcp/client/MCPClientManager.js +342 -0
- package/dist/daemon/electron/mcp/client/MCPServerConnection.js +437 -0
- package/dist/daemon/electron/mcp/client/transports/SSETransport.js +304 -0
- package/dist/daemon/electron/mcp/client/transports/StdioTransport.js +313 -0
- package/dist/daemon/electron/mcp/client/transports/WebSocketTransport.js +329 -0
- package/dist/daemon/electron/mcp/settings.js +526 -0
- package/dist/daemon/electron/mcp/types.js +59 -0
- package/dist/daemon/electron/memory/MarkdownMemoryIndexService.js +973 -0
- package/dist/daemon/electron/memory/MemoryService.js +794 -0
- package/dist/daemon/electron/memory/WorkspaceKitContext.js +360 -0
- package/dist/daemon/electron/memory/local-embedding.js +81 -0
- package/dist/daemon/electron/sandbox/monty-engine.js +250 -0
- package/dist/daemon/electron/security/concurrency.js +293 -0
- package/dist/daemon/electron/security/monty-tool-policy.js +143 -0
- package/dist/daemon/electron/security/policy-manager.js +435 -0
- package/dist/daemon/electron/security/project-access.js +137 -0
- package/dist/daemon/electron/settings/appearance-manager.js +210 -0
- package/dist/daemon/electron/settings/box-manager.js +54 -0
- package/dist/daemon/electron/settings/dropbox-manager.js +54 -0
- package/dist/daemon/electron/settings/google-workspace-manager.js +55 -0
- package/dist/daemon/electron/settings/memory-features-manager.js +62 -0
- package/dist/daemon/electron/settings/notion-manager.js +56 -0
- package/dist/daemon/electron/settings/onedrive-manager.js +54 -0
- package/dist/daemon/electron/settings/personality-manager.js +740 -0
- package/dist/daemon/electron/settings/sharepoint-manager.js +54 -0
- package/dist/daemon/electron/settings/x-manager.js +58 -0
- package/dist/daemon/electron/tailscale/exposure.js +188 -0
- package/dist/daemon/electron/tailscale/index.js +28 -0
- package/dist/daemon/electron/tailscale/settings.js +205 -0
- package/dist/daemon/electron/tailscale/tailscale.js +355 -0
- package/dist/daemon/electron/utils/box-api.js +153 -0
- package/dist/daemon/electron/utils/dropbox-api.js +144 -0
- package/dist/daemon/electron/utils/env-migration.js +538 -0
- package/dist/daemon/electron/utils/gmail-api.js +99 -0
- package/dist/daemon/electron/utils/google-calendar-api.js +92 -0
- package/dist/daemon/electron/utils/google-workspace-api.js +196 -0
- package/dist/daemon/electron/utils/google-workspace-auth.js +91 -0
- package/dist/daemon/electron/utils/json-utils.js +204 -0
- package/dist/daemon/electron/utils/notion-api.js +103 -0
- package/dist/daemon/electron/utils/onedrive-api.js +113 -0
- package/dist/daemon/electron/utils/runtime-mode.js +58 -0
- package/dist/daemon/electron/utils/safe-storage.js +31 -0
- package/dist/daemon/electron/utils/sharepoint-api.js +109 -0
- package/dist/daemon/electron/utils/user-data-dir.js +59 -0
- package/dist/daemon/electron/utils/x-cli.js +177 -0
- package/dist/daemon/electron/voice/VoiceService.js +507 -0
- package/dist/daemon/electron/voice/voice-settings-manager.js +361 -0
- package/dist/daemon/shared/agent-preferences.js +36 -0
- package/dist/daemon/shared/channelMessages.js +460 -0
- package/dist/daemon/shared/llm-provider-catalog.js +198 -0
- package/dist/daemon/shared/plan-utils.js +32 -0
- package/dist/daemon/shared/types.js +1376 -0
- package/dist/renderer/assets/index-3cWYvSH3.css +1 -0
- package/dist/renderer/assets/{index-DmLN0wBd.js → index-Xvm2AXZV.js} +1 -8
- package/dist/renderer/index.html +2 -2
- package/docs/vps-linux.md +105 -0
- package/package.json +6 -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/dist/renderer/assets/index-CUiY4uon.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,24 @@ 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
|
+
|
|
10
28
|
## [0.3.67] - 2026-02-11
|
|
11
29
|
|
|
12
30
|
### Added
|
package/README.md
CHANGED
|
@@ -55,12 +55,17 @@ Your AI needs a secure home. CoWork OS provides the runtime, security layers, an
|
|
|
55
55
|
|
|
56
56
|
### From npm (CLI Launch)
|
|
57
57
|
|
|
58
|
+
Use this flow to test like a first-time user in a clean folder:
|
|
59
|
+
|
|
58
60
|
```bash
|
|
59
61
|
# Install into a local folder
|
|
60
62
|
mkdir -p /tmp/cowork-run
|
|
61
63
|
cd /tmp/cowork-run
|
|
62
64
|
npm install cowork-os@latest --no-audit --no-fund
|
|
63
65
|
|
|
66
|
+
# Ensure no previously running CoWork instance is active
|
|
67
|
+
pkill -f '/cowork-os' || true
|
|
68
|
+
|
|
64
69
|
# Start app
|
|
65
70
|
npx cowork-os
|
|
66
71
|
```
|
|
@@ -69,6 +74,22 @@ You can also install globally and launch directly:
|
|
|
69
74
|
|
|
70
75
|
```bash
|
|
71
76
|
npm install -g cowork-os
|
|
77
|
+
|
|
78
|
+
# Optional: verify installed version
|
|
79
|
+
npm list -g cowork-os --depth=0
|
|
80
|
+
|
|
81
|
+
# Ensure no previously running CoWork instance is active
|
|
82
|
+
pkill -f '/cowork-os' || true
|
|
83
|
+
|
|
84
|
+
cowork-os
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
If the app opens but shows `vUnknown` or `Error invoking remote method 'app:getVersion'`, you likely connected to an older already-running instance.
|
|
88
|
+
|
|
89
|
+
Run:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pkill -f '/cowork-os' || true
|
|
72
93
|
cowork-os
|
|
73
94
|
```
|
|
74
95
|
|
|
@@ -117,16 +138,66 @@ The packaged app will be in the `release/` directory.
|
|
|
117
138
|
|
|
118
139
|
### Linux VPS (Headless / Server Mode)
|
|
119
140
|
|
|
120
|
-
|
|
141
|
+
If this is your first VPS install, start here (Node-only, no Docker):
|
|
142
|
+
|
|
143
|
+
1. On your VPS (SSH terminal), connect and verify Node version:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
ssh user@your-vps
|
|
147
|
+
node -v
|
|
148
|
+
npm -v
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
`cowork-os` requires Node `>=22.12.0`. If you see `v20`/`v21`, upgrade first:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
|
|
155
|
+
sudo apt-get install -y nodejs
|
|
156
|
+
node -v
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
2. Install and start CoWork OS (local install, no sudo needed):
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
mkdir -p ~/cowork-run
|
|
163
|
+
cd ~/cowork-run
|
|
164
|
+
npm init -y >/dev/null
|
|
165
|
+
npm install cowork-os@latest --no-audit --no-fund
|
|
166
|
+
|
|
167
|
+
export COWORK_IMPORT_ENV_SETTINGS=1
|
|
168
|
+
export OPENAI_API_KEY=your_key_here # or ANTHROPIC_API_KEY=your_key_here
|
|
169
|
+
npx coworkd-node --print-control-plane-token
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Keep this terminal open. It runs the server and prints your Control Plane token.
|
|
173
|
+
|
|
174
|
+
If you see `sh: 1: tsc: not found` right after `npx coworkd-node`, you are on an older broken npm publish. Upgrade and retry:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
npm install cowork-os@latest --no-audit --no-fund
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
3. On your local machine (second terminal), create the SSH tunnel:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
ssh -N -L 18789:127.0.0.1:18789 user@your-vps
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
If local port `18789` is busy:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
ssh -N -L 28789:127.0.0.1:18789 user@your-vps
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
4. Open the web UI in your browser:
|
|
193
|
+
|
|
194
|
+
- `http://127.0.0.1:18789/` (or `http://127.0.0.1:28789/` if you used 28789)
|
|
195
|
+
- Paste the token from step 1
|
|
196
|
+
|
|
197
|
+
For production/persistent setup and Docker/systemd options, use:
|
|
121
198
|
|
|
122
|
-
- Overview / positioning: `docs/self-hosting.md`
|
|
123
199
|
- Guide: `docs/vps-linux.md`
|
|
124
|
-
-
|
|
125
|
-
- Start (headless Electron): `node bin/coworkd.js`
|
|
126
|
-
- Web UI (via tunnel): `http://127.0.0.1:18789/`
|
|
127
|
-
- Headless creds: set `COWORK_IMPORT_ENV_SETTINGS=1` + `OPENAI_API_KEY`/`ANTHROPIC_API_KEY` (see guide)
|
|
128
|
-
- Docker: `docker compose up --build -d`
|
|
129
|
-
- systemd templates: `deploy/systemd/`
|
|
200
|
+
- Overview: `docs/self-hosting.md`
|
|
130
201
|
|
|
131
202
|
---
|
|
132
203
|
|
package/bin/cowork.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
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 packageJsonPath = path.join(packageDir, 'package.json');
|
|
8
9
|
const mainPath = path.join(packageDir, 'dist', 'electron', 'electron', 'main.js');
|
|
9
10
|
const args = process.argv.slice(2);
|
|
10
11
|
const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
@@ -27,23 +28,148 @@ function buildAppAndLaunch() {
|
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
if (fs.existsSync(mainPath)) {
|
|
30
|
-
|
|
31
|
+
prepareAndLaunchApp();
|
|
31
32
|
} else {
|
|
32
33
|
buildAppAndLaunch();
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
function
|
|
36
|
-
|
|
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;
|
|
61
|
+
}
|
|
62
|
+
|
|
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, {
|
|
80
|
+
cwd: packageDir,
|
|
81
|
+
stdio: 'inherit',
|
|
82
|
+
shell: process.platform === 'win32',
|
|
83
|
+
env: process.env,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return res.status === 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function resolveElectronBinary() {
|
|
37
90
|
try {
|
|
38
|
-
|
|
91
|
+
return require('electron');
|
|
39
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) {
|
|
40
157
|
console.error(
|
|
41
158
|
'[cowork-os] Electron runtime is missing. Reinstall with:\n' +
|
|
42
|
-
' npm install cowork-os@latest
|
|
159
|
+
' npm install cowork-os@latest\n'
|
|
43
160
|
);
|
|
44
161
|
process.exit(1);
|
|
45
162
|
}
|
|
46
163
|
|
|
164
|
+
if (isBetterSqliteReady(electronBinary)) {
|
|
165
|
+
launchApp(electronBinary);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
runNativeSetup(() => launchApp(electronBinary));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function launchApp(electronBinary) {
|
|
47
173
|
const electron = spawn(electronBinary, [packageDir, ...args], {
|
|
48
174
|
cwd: packageDir,
|
|
49
175
|
stdio: 'inherit',
|