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.
Files changed (210) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +79 -8
  3. package/bin/cowork.js +132 -6
  4. package/dist/daemon/daemon/control-plane-methods.js +959 -0
  5. package/dist/daemon/daemon/main.js +562 -0
  6. package/dist/daemon/electron/activity/ActivityRepository.js +190 -0
  7. package/dist/daemon/electron/agent/browser/browser-service.js +652 -0
  8. package/dist/daemon/electron/agent/context-manager.js +332 -0
  9. package/dist/daemon/electron/agent/custom-skill-loader.js +596 -0
  10. package/dist/daemon/electron/agent/daemon.js +1895 -0
  11. package/dist/daemon/electron/agent/executor.js +6238 -0
  12. package/dist/daemon/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  13. package/dist/daemon/electron/agent/llm/anthropic-provider.js +155 -0
  14. package/dist/daemon/electron/agent/llm/azure-openai-provider.js +328 -0
  15. package/dist/daemon/electron/agent/llm/bedrock-provider.js +461 -0
  16. package/dist/daemon/electron/agent/llm/gemini-provider.js +374 -0
  17. package/dist/daemon/electron/agent/llm/github-copilot-provider.js +97 -0
  18. package/dist/daemon/electron/agent/llm/groq-provider.js +33 -0
  19. package/dist/daemon/electron/agent/llm/index.js +46 -0
  20. package/dist/daemon/electron/agent/llm/kimi-provider.js +33 -0
  21. package/dist/daemon/electron/agent/llm/ollama-provider.js +263 -0
  22. package/dist/daemon/electron/agent/llm/openai-compatible-provider.js +116 -0
  23. package/dist/daemon/electron/agent/llm/openai-compatible.js +111 -0
  24. package/dist/daemon/electron/agent/llm/openai-oauth.js +121 -0
  25. package/dist/daemon/electron/agent/llm/openai-provider.js +672 -0
  26. package/dist/daemon/electron/agent/llm/openrouter-provider.js +232 -0
  27. package/dist/daemon/electron/agent/llm/pi-provider.js +309 -0
  28. package/dist/daemon/electron/agent/llm/pricing.js +158 -0
  29. package/dist/daemon/electron/agent/llm/provider-factory.js +1621 -0
  30. package/dist/daemon/electron/agent/llm/types.js +266 -0
  31. package/dist/daemon/electron/agent/llm/xai-provider.js +33 -0
  32. package/dist/daemon/electron/agent/queue-manager.js +380 -0
  33. package/dist/daemon/electron/agent/sandbox/docker-sandbox.js +402 -0
  34. package/dist/daemon/electron/agent/sandbox/macos-sandbox.js +407 -0
  35. package/dist/daemon/electron/agent/sandbox/runner.js +410 -0
  36. package/dist/daemon/electron/agent/sandbox/sandbox-factory.js +228 -0
  37. package/dist/daemon/electron/agent/sandbox/security-utils.js +258 -0
  38. package/dist/daemon/electron/agent/search/brave-provider.js +119 -0
  39. package/dist/daemon/electron/agent/search/google-provider.js +100 -0
  40. package/dist/daemon/electron/agent/search/index.js +28 -0
  41. package/dist/daemon/electron/agent/search/provider-factory.js +431 -0
  42. package/dist/daemon/electron/agent/search/serpapi-provider.js +112 -0
  43. package/dist/daemon/electron/agent/search/tavily-provider.js +90 -0
  44. package/dist/daemon/electron/agent/search/types.js +40 -0
  45. package/dist/daemon/electron/agent/security/index.js +12 -0
  46. package/dist/daemon/electron/agent/security/input-sanitizer.js +303 -0
  47. package/dist/daemon/electron/agent/security/output-filter.js +217 -0
  48. package/dist/daemon/electron/agent/skill-eligibility.js +281 -0
  49. package/dist/daemon/electron/agent/skill-registry.js +396 -0
  50. package/dist/daemon/electron/agent/skills/document.js +878 -0
  51. package/dist/daemon/electron/agent/skills/image-generator.js +686 -0
  52. package/dist/daemon/electron/agent/skills/organizer.js +158 -0
  53. package/dist/daemon/electron/agent/skills/presentation.js +367 -0
  54. package/dist/daemon/electron/agent/skills/spreadsheet.js +177 -0
  55. package/dist/daemon/electron/agent/tools/apple-calendar-tools.js +582 -0
  56. package/dist/daemon/electron/agent/tools/apple-reminders-tools.js +590 -0
  57. package/dist/daemon/electron/agent/tools/box-tools.js +231 -0
  58. package/dist/daemon/electron/agent/tools/browser-tools.js +580 -0
  59. package/dist/daemon/electron/agent/tools/builtin-settings.js +423 -0
  60. package/dist/daemon/electron/agent/tools/canvas-tools.js +530 -0
  61. package/dist/daemon/electron/agent/tools/channel-tools.js +378 -0
  62. package/dist/daemon/electron/agent/tools/cron-tools.js +664 -0
  63. package/dist/daemon/electron/agent/tools/dropbox-tools.js +237 -0
  64. package/dist/daemon/electron/agent/tools/edit-tools.js +211 -0
  65. package/dist/daemon/electron/agent/tools/email-imap-tools.js +146 -0
  66. package/dist/daemon/electron/agent/tools/file-tools.js +908 -0
  67. package/dist/daemon/electron/agent/tools/glob-tools.js +291 -0
  68. package/dist/daemon/electron/agent/tools/gmail-tools.js +199 -0
  69. package/dist/daemon/electron/agent/tools/google-calendar-tools.js +211 -0
  70. package/dist/daemon/electron/agent/tools/google-drive-tools.js +227 -0
  71. package/dist/daemon/electron/agent/tools/grep-tools.js +499 -0
  72. package/dist/daemon/electron/agent/tools/image-tools.js +129 -0
  73. package/dist/daemon/electron/agent/tools/mention-tools.js +282 -0
  74. package/dist/daemon/electron/agent/tools/monty-tools.js +383 -0
  75. package/dist/daemon/electron/agent/tools/notion-tools.js +312 -0
  76. package/dist/daemon/electron/agent/tools/onedrive-tools.js +217 -0
  77. package/dist/daemon/electron/agent/tools/read-files.js +139 -0
  78. package/dist/daemon/electron/agent/tools/registry.js +4472 -0
  79. package/dist/daemon/electron/agent/tools/search-tools.js +109 -0
  80. package/dist/daemon/electron/agent/tools/sharepoint-tools.js +243 -0
  81. package/dist/daemon/electron/agent/tools/shell-tools.js +596 -0
  82. package/dist/daemon/electron/agent/tools/skill-tools.js +274 -0
  83. package/dist/daemon/electron/agent/tools/system-tools.js +733 -0
  84. package/dist/daemon/electron/agent/tools/vision-tools.js +316 -0
  85. package/dist/daemon/electron/agent/tools/visual-tools.js +1013 -0
  86. package/dist/daemon/electron/agent/tools/voice-call-tools.js +239 -0
  87. package/dist/daemon/electron/agent/tools/web-fetch-tools.js +444 -0
  88. package/dist/daemon/electron/agent/tools/x-tools.js +264 -0
  89. package/dist/daemon/electron/agents/AgentRoleRepository.js +420 -0
  90. package/dist/daemon/electron/agents/AgentTeamItemRepository.js +172 -0
  91. package/dist/daemon/electron/agents/AgentTeamOrchestrator.js +269 -0
  92. package/dist/daemon/electron/agents/AgentTeamRepository.js +157 -0
  93. package/dist/daemon/electron/agents/AgentTeamRunRepository.js +140 -0
  94. package/dist/daemon/electron/agents/CrossSignalService.js +325 -0
  95. package/dist/daemon/electron/agents/FeedbackService.js +323 -0
  96. package/dist/daemon/electron/agents/MentionRepository.js +197 -0
  97. package/dist/daemon/electron/agents/agent-dispatch.js +69 -0
  98. package/dist/daemon/electron/agents/mentions.js +135 -0
  99. package/dist/daemon/electron/canvas/canvas-manager.js +744 -0
  100. package/dist/daemon/electron/canvas/canvas-store.js +174 -0
  101. package/dist/daemon/electron/control-plane/client.js +364 -0
  102. package/dist/daemon/electron/control-plane/protocol.js +208 -0
  103. package/dist/daemon/electron/control-plane/remote-client.js +437 -0
  104. package/dist/daemon/electron/control-plane/server.js +689 -0
  105. package/dist/daemon/electron/control-plane/settings.js +372 -0
  106. package/dist/daemon/electron/control-plane/web-ui.js +999 -0
  107. package/dist/daemon/electron/cron/index.js +30 -0
  108. package/dist/daemon/electron/cron/schedule.js +190 -0
  109. package/dist/daemon/electron/cron/service.js +731 -0
  110. package/dist/daemon/electron/cron/store.js +155 -0
  111. package/dist/daemon/electron/cron/types.js +82 -0
  112. package/dist/daemon/electron/cron/webhook.js +258 -0
  113. package/dist/daemon/electron/database/SecureSettingsRepository.js +452 -0
  114. package/dist/daemon/electron/database/repositories.js +2271 -0
  115. package/dist/daemon/electron/database/schema.js +1164 -0
  116. package/dist/daemon/electron/gateway/channel-registry.js +1126 -0
  117. package/dist/daemon/electron/gateway/channels/bluebubbles-client.js +479 -0
  118. package/dist/daemon/electron/gateway/channels/bluebubbles.js +435 -0
  119. package/dist/daemon/electron/gateway/channels/discord.js +1026 -0
  120. package/dist/daemon/electron/gateway/channels/email-client.js +701 -0
  121. package/dist/daemon/electron/gateway/channels/email.js +443 -0
  122. package/dist/daemon/electron/gateway/channels/google-chat.js +730 -0
  123. package/dist/daemon/electron/gateway/channels/imessage-client.js +363 -0
  124. package/dist/daemon/electron/gateway/channels/imessage.js +520 -0
  125. package/dist/daemon/electron/gateway/channels/line-client.js +470 -0
  126. package/dist/daemon/electron/gateway/channels/line.js +481 -0
  127. package/dist/daemon/electron/gateway/channels/matrix-client.js +444 -0
  128. package/dist/daemon/electron/gateway/channels/matrix.js +619 -0
  129. package/dist/daemon/electron/gateway/channels/mattermost-client.js +394 -0
  130. package/dist/daemon/electron/gateway/channels/mattermost.js +498 -0
  131. package/dist/daemon/electron/gateway/channels/signal-client.js +499 -0
  132. package/dist/daemon/electron/gateway/channels/signal.js +584 -0
  133. package/dist/daemon/electron/gateway/channels/slack.js +494 -0
  134. package/dist/daemon/electron/gateway/channels/teams.js +712 -0
  135. package/dist/daemon/electron/gateway/channels/telegram.js +1613 -0
  136. package/dist/daemon/electron/gateway/channels/twitch-client.js +502 -0
  137. package/dist/daemon/electron/gateway/channels/twitch.js +398 -0
  138. package/dist/daemon/electron/gateway/channels/types.js +8 -0
  139. package/dist/daemon/electron/gateway/channels/whatsapp.js +1031 -0
  140. package/dist/daemon/electron/gateway/chat-transcript.js +120 -0
  141. package/dist/daemon/electron/gateway/context-policy.js +268 -0
  142. package/dist/daemon/electron/gateway/index.js +1262 -0
  143. package/dist/daemon/electron/gateway/router-rules.js +168 -0
  144. package/dist/daemon/electron/gateway/router.js +5673 -0
  145. package/dist/daemon/electron/gateway/security.js +388 -0
  146. package/dist/daemon/electron/gateway/session.js +115 -0
  147. package/dist/daemon/electron/gateway/tunnel.js +503 -0
  148. package/dist/daemon/electron/guardrails/guardrail-manager.js +348 -0
  149. package/dist/daemon/electron/mcp/client/MCPClientManager.js +342 -0
  150. package/dist/daemon/electron/mcp/client/MCPServerConnection.js +437 -0
  151. package/dist/daemon/electron/mcp/client/transports/SSETransport.js +304 -0
  152. package/dist/daemon/electron/mcp/client/transports/StdioTransport.js +313 -0
  153. package/dist/daemon/electron/mcp/client/transports/WebSocketTransport.js +329 -0
  154. package/dist/daemon/electron/mcp/settings.js +526 -0
  155. package/dist/daemon/electron/mcp/types.js +59 -0
  156. package/dist/daemon/electron/memory/MarkdownMemoryIndexService.js +973 -0
  157. package/dist/daemon/electron/memory/MemoryService.js +794 -0
  158. package/dist/daemon/electron/memory/WorkspaceKitContext.js +360 -0
  159. package/dist/daemon/electron/memory/local-embedding.js +81 -0
  160. package/dist/daemon/electron/sandbox/monty-engine.js +250 -0
  161. package/dist/daemon/electron/security/concurrency.js +293 -0
  162. package/dist/daemon/electron/security/monty-tool-policy.js +143 -0
  163. package/dist/daemon/electron/security/policy-manager.js +435 -0
  164. package/dist/daemon/electron/security/project-access.js +137 -0
  165. package/dist/daemon/electron/settings/appearance-manager.js +210 -0
  166. package/dist/daemon/electron/settings/box-manager.js +54 -0
  167. package/dist/daemon/electron/settings/dropbox-manager.js +54 -0
  168. package/dist/daemon/electron/settings/google-workspace-manager.js +55 -0
  169. package/dist/daemon/electron/settings/memory-features-manager.js +62 -0
  170. package/dist/daemon/electron/settings/notion-manager.js +56 -0
  171. package/dist/daemon/electron/settings/onedrive-manager.js +54 -0
  172. package/dist/daemon/electron/settings/personality-manager.js +740 -0
  173. package/dist/daemon/electron/settings/sharepoint-manager.js +54 -0
  174. package/dist/daemon/electron/settings/x-manager.js +58 -0
  175. package/dist/daemon/electron/tailscale/exposure.js +188 -0
  176. package/dist/daemon/electron/tailscale/index.js +28 -0
  177. package/dist/daemon/electron/tailscale/settings.js +205 -0
  178. package/dist/daemon/electron/tailscale/tailscale.js +355 -0
  179. package/dist/daemon/electron/utils/box-api.js +153 -0
  180. package/dist/daemon/electron/utils/dropbox-api.js +144 -0
  181. package/dist/daemon/electron/utils/env-migration.js +538 -0
  182. package/dist/daemon/electron/utils/gmail-api.js +99 -0
  183. package/dist/daemon/electron/utils/google-calendar-api.js +92 -0
  184. package/dist/daemon/electron/utils/google-workspace-api.js +196 -0
  185. package/dist/daemon/electron/utils/google-workspace-auth.js +91 -0
  186. package/dist/daemon/electron/utils/json-utils.js +204 -0
  187. package/dist/daemon/electron/utils/notion-api.js +103 -0
  188. package/dist/daemon/electron/utils/onedrive-api.js +113 -0
  189. package/dist/daemon/electron/utils/runtime-mode.js +58 -0
  190. package/dist/daemon/electron/utils/safe-storage.js +31 -0
  191. package/dist/daemon/electron/utils/sharepoint-api.js +109 -0
  192. package/dist/daemon/electron/utils/user-data-dir.js +59 -0
  193. package/dist/daemon/electron/utils/x-cli.js +177 -0
  194. package/dist/daemon/electron/voice/VoiceService.js +507 -0
  195. package/dist/daemon/electron/voice/voice-settings-manager.js +361 -0
  196. package/dist/daemon/shared/agent-preferences.js +36 -0
  197. package/dist/daemon/shared/channelMessages.js +460 -0
  198. package/dist/daemon/shared/llm-provider-catalog.js +198 -0
  199. package/dist/daemon/shared/plan-utils.js +32 -0
  200. package/dist/daemon/shared/types.js +1376 -0
  201. package/dist/renderer/assets/index-3cWYvSH3.css +1 -0
  202. package/dist/renderer/assets/{index-DmLN0wBd.js → index-Xvm2AXZV.js} +1 -8
  203. package/dist/renderer/index.html +2 -2
  204. package/docs/vps-linux.md +105 -0
  205. package/package.json +6 -5
  206. package/scripts/setup_native.mjs +61 -24
  207. package/src/renderer/components/DisclaimerModal.tsx +36 -23
  208. package/src/renderer/components/Onboarding/Onboarding.tsx +1 -1
  209. package/src/renderer/styles/index.css +259 -100
  210. 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
- Run CoWork OS without a GUI and manage it remotely via the WebSocket Control Plane (Web UI + CLI):
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
- - Start (Node-only, no Electron/Xvfb): `node bin/coworkd-node.js`
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
- launchApp();
31
+ prepareAndLaunchApp();
31
32
  } else {
32
33
  buildAppAndLaunch();
33
34
  }
34
35
 
35
- function launchApp() {
36
- let electronBinary;
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
- electronBinary = require('electron');
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 --include=dev\n'
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',