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.
Files changed (258) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +19 -0
  3. package/bin/cowork.js +162 -19
  4. package/dist/electron/electron/activity/ActivityRepository.js +190 -0
  5. package/dist/electron/electron/agent/browser/browser-service.js +652 -0
  6. package/dist/electron/electron/agent/context-manager.js +332 -0
  7. package/dist/electron/electron/agent/custom-skill-loader.js +596 -0
  8. package/dist/electron/electron/agent/daemon.js +1895 -0
  9. package/dist/electron/electron/agent/executor.js +6238 -0
  10. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  11. package/dist/electron/electron/agent/llm/anthropic-provider.js +155 -0
  12. package/dist/electron/electron/agent/llm/azure-openai-provider.js +328 -0
  13. package/dist/electron/electron/agent/llm/bedrock-provider.js +461 -0
  14. package/dist/electron/electron/agent/llm/gemini-provider.js +374 -0
  15. package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
  16. package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
  17. package/dist/electron/electron/agent/llm/index.js +46 -0
  18. package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
  19. package/dist/electron/electron/agent/llm/ollama-provider.js +263 -0
  20. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
  21. package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
  22. package/dist/electron/electron/agent/llm/openai-oauth.js +121 -0
  23. package/dist/electron/electron/agent/llm/openai-provider.js +672 -0
  24. package/dist/electron/electron/agent/llm/openrouter-provider.js +232 -0
  25. package/dist/electron/electron/agent/llm/pi-provider.js +309 -0
  26. package/dist/electron/electron/agent/llm/pricing.js +158 -0
  27. package/dist/electron/electron/agent/llm/provider-factory.js +1621 -0
  28. package/dist/electron/electron/agent/llm/types.js +266 -0
  29. package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
  30. package/dist/electron/electron/agent/queue-manager.js +380 -0
  31. package/dist/electron/electron/agent/sandbox/docker-sandbox.js +402 -0
  32. package/dist/electron/electron/agent/sandbox/macos-sandbox.js +407 -0
  33. package/dist/electron/electron/agent/sandbox/runner.js +410 -0
  34. package/dist/electron/electron/agent/sandbox/sandbox-factory.js +228 -0
  35. package/dist/electron/electron/agent/sandbox/security-utils.js +258 -0
  36. package/dist/electron/electron/agent/search/brave-provider.js +119 -0
  37. package/dist/electron/electron/agent/search/google-provider.js +100 -0
  38. package/dist/electron/electron/agent/search/index.js +28 -0
  39. package/dist/electron/electron/agent/search/provider-factory.js +431 -0
  40. package/dist/electron/electron/agent/search/serpapi-provider.js +112 -0
  41. package/dist/electron/electron/agent/search/tavily-provider.js +90 -0
  42. package/dist/electron/electron/agent/search/types.js +40 -0
  43. package/dist/electron/electron/agent/security/index.js +12 -0
  44. package/dist/electron/electron/agent/security/input-sanitizer.js +303 -0
  45. package/dist/electron/electron/agent/security/output-filter.js +217 -0
  46. package/dist/electron/electron/agent/skill-eligibility.js +281 -0
  47. package/dist/electron/electron/agent/skill-registry.js +396 -0
  48. package/dist/electron/electron/agent/skills/document.js +878 -0
  49. package/dist/electron/electron/agent/skills/image-generator.js +686 -0
  50. package/dist/electron/electron/agent/skills/organizer.js +158 -0
  51. package/dist/electron/electron/agent/skills/presentation.js +367 -0
  52. package/dist/electron/electron/agent/skills/spreadsheet.js +177 -0
  53. package/dist/electron/electron/agent/tools/apple-calendar-tools.js +582 -0
  54. package/dist/electron/electron/agent/tools/apple-reminders-tools.js +590 -0
  55. package/dist/electron/electron/agent/tools/box-tools.js +231 -0
  56. package/dist/electron/electron/agent/tools/browser-tools.js +580 -0
  57. package/dist/electron/electron/agent/tools/builtin-settings.js +423 -0
  58. package/dist/electron/electron/agent/tools/canvas-tools.js +530 -0
  59. package/dist/electron/electron/agent/tools/channel-tools.js +378 -0
  60. package/dist/electron/electron/agent/tools/cron-tools.js +664 -0
  61. package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
  62. package/dist/electron/electron/agent/tools/edit-tools.js +211 -0
  63. package/dist/electron/electron/agent/tools/email-imap-tools.js +146 -0
  64. package/dist/electron/electron/agent/tools/file-tools.js +908 -0
  65. package/dist/electron/electron/agent/tools/glob-tools.js +291 -0
  66. package/dist/electron/electron/agent/tools/gmail-tools.js +199 -0
  67. package/dist/electron/electron/agent/tools/google-calendar-tools.js +211 -0
  68. package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
  69. package/dist/electron/electron/agent/tools/grep-tools.js +499 -0
  70. package/dist/electron/electron/agent/tools/image-tools.js +129 -0
  71. package/dist/electron/electron/agent/tools/mention-tools.js +282 -0
  72. package/dist/electron/electron/agent/tools/monty-tools.js +383 -0
  73. package/dist/electron/electron/agent/tools/node-tools.js +476 -0
  74. package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
  75. package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
  76. package/dist/electron/electron/agent/tools/read-files.js +139 -0
  77. package/dist/electron/electron/agent/tools/registry.js +4472 -0
  78. package/dist/electron/electron/agent/tools/search-tools.js +109 -0
  79. package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
  80. package/dist/electron/electron/agent/tools/shell-tools.js +596 -0
  81. package/dist/electron/electron/agent/tools/skill-tools.js +274 -0
  82. package/dist/electron/electron/agent/tools/system-tools.js +733 -0
  83. package/dist/electron/electron/agent/tools/vision-tools.js +316 -0
  84. package/dist/electron/electron/agent/tools/visual-tools.js +1013 -0
  85. package/dist/electron/electron/agent/tools/voice-call-tools.js +239 -0
  86. package/dist/electron/electron/agent/tools/web-fetch-tools.js +444 -0
  87. package/dist/electron/electron/agent/tools/x-tools.js +264 -0
  88. package/dist/electron/electron/agents/AgentRoleRepository.js +420 -0
  89. package/dist/electron/electron/agents/AgentTeamItemRepository.js +172 -0
  90. package/dist/electron/electron/agents/AgentTeamMemberRepository.js +154 -0
  91. package/dist/electron/electron/agents/AgentTeamOrchestrator.js +269 -0
  92. package/dist/electron/electron/agents/AgentTeamRepository.js +157 -0
  93. package/dist/electron/electron/agents/AgentTeamRunRepository.js +140 -0
  94. package/dist/electron/electron/agents/CrossSignalService.js +325 -0
  95. package/dist/electron/electron/agents/FeedbackService.js +323 -0
  96. package/dist/electron/electron/agents/HeartbeatService.js +356 -0
  97. package/dist/electron/electron/agents/MentionRepository.js +197 -0
  98. package/dist/electron/electron/agents/TaskSubscriptionRepository.js +168 -0
  99. package/dist/electron/electron/agents/WorkingStateRepository.js +229 -0
  100. package/dist/electron/electron/agents/agent-dispatch.js +69 -0
  101. package/dist/electron/electron/agents/mentions.js +135 -0
  102. package/dist/electron/electron/canvas/canvas-manager.js +744 -0
  103. package/dist/electron/electron/canvas/canvas-preload.js +53 -0
  104. package/dist/electron/electron/canvas/canvas-protocol.js +195 -0
  105. package/dist/electron/electron/canvas/canvas-store.js +174 -0
  106. package/dist/electron/electron/canvas/index.js +13 -0
  107. package/dist/electron/electron/control-plane/client.js +364 -0
  108. package/dist/electron/electron/control-plane/handlers.js +1676 -0
  109. package/dist/electron/electron/control-plane/index.js +42 -0
  110. package/dist/electron/electron/control-plane/node-manager.js +264 -0
  111. package/dist/electron/electron/control-plane/protocol.js +208 -0
  112. package/dist/electron/electron/control-plane/remote-client.js +437 -0
  113. package/dist/electron/electron/control-plane/server.js +689 -0
  114. package/dist/electron/electron/control-plane/settings.js +372 -0
  115. package/dist/electron/electron/control-plane/ssh-tunnel.js +549 -0
  116. package/dist/electron/electron/control-plane/web-ui.js +999 -0
  117. package/dist/electron/electron/cron/index.js +30 -0
  118. package/dist/electron/electron/cron/schedule.js +190 -0
  119. package/dist/electron/electron/cron/service.js +731 -0
  120. package/dist/electron/electron/cron/store.js +155 -0
  121. package/dist/electron/electron/cron/types.js +82 -0
  122. package/dist/electron/electron/cron/webhook.js +258 -0
  123. package/dist/electron/electron/database/SecureSettingsRepository.js +452 -0
  124. package/dist/electron/electron/database/TaskLabelRepository.js +120 -0
  125. package/dist/electron/electron/database/repositories.js +2271 -0
  126. package/dist/electron/electron/database/schema.js +1164 -0
  127. package/dist/electron/electron/extensions/index.js +33 -0
  128. package/dist/electron/electron/extensions/loader.js +334 -0
  129. package/dist/electron/electron/extensions/registry.js +485 -0
  130. package/dist/electron/electron/extensions/types.js +11 -0
  131. package/dist/electron/electron/gateway/channel-registry.js +1126 -0
  132. package/dist/electron/electron/gateway/channels/bluebubbles-client.js +479 -0
  133. package/dist/electron/electron/gateway/channels/bluebubbles.js +435 -0
  134. package/dist/electron/electron/gateway/channels/discord.js +1026 -0
  135. package/dist/electron/electron/gateway/channels/email-client.js +701 -0
  136. package/dist/electron/electron/gateway/channels/email.js +443 -0
  137. package/dist/electron/electron/gateway/channels/google-chat.js +730 -0
  138. package/dist/electron/electron/gateway/channels/imessage-client.js +363 -0
  139. package/dist/electron/electron/gateway/channels/imessage.js +520 -0
  140. package/dist/electron/electron/gateway/channels/index.js +36 -0
  141. package/dist/electron/electron/gateway/channels/line-client.js +470 -0
  142. package/dist/electron/electron/gateway/channels/line.js +481 -0
  143. package/dist/electron/electron/gateway/channels/matrix-client.js +444 -0
  144. package/dist/electron/electron/gateway/channels/matrix.js +619 -0
  145. package/dist/electron/electron/gateway/channels/mattermost-client.js +394 -0
  146. package/dist/electron/electron/gateway/channels/mattermost.js +498 -0
  147. package/dist/electron/electron/gateway/channels/signal-client.js +499 -0
  148. package/dist/electron/electron/gateway/channels/signal.js +584 -0
  149. package/dist/electron/electron/gateway/channels/slack.js +494 -0
  150. package/dist/electron/electron/gateway/channels/teams.js +712 -0
  151. package/dist/electron/electron/gateway/channels/telegram.js +1613 -0
  152. package/dist/electron/electron/gateway/channels/twitch-client.js +502 -0
  153. package/dist/electron/electron/gateway/channels/twitch.js +398 -0
  154. package/dist/electron/electron/gateway/channels/types.js +8 -0
  155. package/dist/electron/electron/gateway/channels/whatsapp.js +1031 -0
  156. package/dist/electron/electron/gateway/chat-transcript.js +120 -0
  157. package/dist/electron/electron/gateway/context-policy.js +268 -0
  158. package/dist/electron/electron/gateway/index.js +1262 -0
  159. package/dist/electron/electron/gateway/infrastructure.js +496 -0
  160. package/dist/electron/electron/gateway/router-rules.js +168 -0
  161. package/dist/electron/electron/gateway/router.js +5673 -0
  162. package/dist/electron/electron/gateway/security.js +388 -0
  163. package/dist/electron/electron/gateway/session.js +115 -0
  164. package/dist/electron/electron/gateway/tunnel.js +503 -0
  165. package/dist/electron/electron/guardrails/guardrail-manager.js +348 -0
  166. package/dist/electron/electron/hooks/gmail-watcher.js +300 -0
  167. package/dist/electron/electron/hooks/index.js +46 -0
  168. package/dist/electron/electron/hooks/mappings.js +381 -0
  169. package/dist/electron/electron/hooks/server.js +554 -0
  170. package/dist/electron/electron/hooks/settings.js +450 -0
  171. package/dist/electron/electron/hooks/types.js +41 -0
  172. package/dist/electron/electron/ipc/canvas-handlers.js +163 -0
  173. package/dist/electron/electron/ipc/handlers.js +4391 -0
  174. package/dist/electron/electron/ipc/mission-control-handlers.js +141 -0
  175. package/dist/electron/electron/mcp/client/MCPClientManager.js +342 -0
  176. package/dist/electron/electron/mcp/client/MCPServerConnection.js +437 -0
  177. package/dist/electron/electron/mcp/client/transports/SSETransport.js +304 -0
  178. package/dist/electron/electron/mcp/client/transports/StdioTransport.js +313 -0
  179. package/dist/electron/electron/mcp/client/transports/WebSocketTransport.js +329 -0
  180. package/dist/electron/electron/mcp/host/MCPHostServer.js +354 -0
  181. package/dist/electron/electron/mcp/host/ToolAdapter.js +100 -0
  182. package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
  183. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +846 -0
  184. package/dist/electron/electron/mcp/settings.js +526 -0
  185. package/dist/electron/electron/mcp/types.js +59 -0
  186. package/dist/electron/electron/memory/ChatGPTImporter.js +464 -0
  187. package/dist/electron/electron/memory/MarkdownMemoryIndexService.js +973 -0
  188. package/dist/electron/electron/memory/MemoryService.js +794 -0
  189. package/dist/electron/electron/memory/WorkspaceKitContext.js +360 -0
  190. package/dist/electron/electron/memory/local-embedding.js +81 -0
  191. package/dist/electron/electron/notifications/index.js +17 -0
  192. package/dist/electron/electron/notifications/service.js +118 -0
  193. package/dist/electron/electron/notifications/store.js +144 -0
  194. package/dist/electron/electron/preload.js +1020 -0
  195. package/dist/electron/electron/reports/AgentPerformanceReviewService.js +199 -0
  196. package/dist/electron/electron/reports/StandupReportService.js +272 -0
  197. package/dist/electron/electron/reports/task-export.js +138 -0
  198. package/dist/electron/electron/sandbox/monty-engine.js +250 -0
  199. package/dist/electron/electron/security/concurrency.js +293 -0
  200. package/dist/electron/electron/security/index.js +15 -0
  201. package/dist/electron/electron/security/monty-tool-policy.js +143 -0
  202. package/dist/electron/electron/security/policy-manager.js +435 -0
  203. package/dist/electron/electron/security/project-access.js +137 -0
  204. package/dist/electron/electron/settings/appearance-manager.js +210 -0
  205. package/dist/electron/electron/settings/box-manager.js +54 -0
  206. package/dist/electron/electron/settings/dropbox-manager.js +54 -0
  207. package/dist/electron/electron/settings/google-workspace-manager.js +55 -0
  208. package/dist/electron/electron/settings/memory-features-manager.js +62 -0
  209. package/dist/electron/electron/settings/notion-manager.js +56 -0
  210. package/dist/electron/electron/settings/onedrive-manager.js +54 -0
  211. package/dist/electron/electron/settings/personality-manager.js +740 -0
  212. package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
  213. package/dist/electron/electron/settings/x-manager.js +58 -0
  214. package/dist/electron/electron/tailscale/exposure.js +188 -0
  215. package/dist/electron/electron/tailscale/index.js +28 -0
  216. package/dist/electron/electron/tailscale/settings.js +205 -0
  217. package/dist/electron/electron/tailscale/tailscale.js +355 -0
  218. package/dist/electron/electron/tray/QuickInputWindow.js +568 -0
  219. package/dist/electron/electron/tray/TrayManager.js +899 -0
  220. package/dist/electron/electron/tray/index.js +9 -0
  221. package/dist/electron/electron/updater/index.js +6 -0
  222. package/dist/electron/electron/updater/update-manager.js +418 -0
  223. package/dist/electron/electron/utils/box-api.js +153 -0
  224. package/dist/electron/electron/utils/dropbox-api.js +144 -0
  225. package/dist/electron/electron/utils/env-migration.js +538 -0
  226. package/dist/electron/electron/utils/gmail-api.js +99 -0
  227. package/dist/electron/electron/utils/google-calendar-api.js +92 -0
  228. package/dist/electron/electron/utils/google-workspace-api.js +196 -0
  229. package/dist/electron/electron/utils/google-workspace-auth.js +91 -0
  230. package/dist/electron/electron/utils/google-workspace-oauth.js +184 -0
  231. package/dist/electron/electron/utils/json-utils.js +204 -0
  232. package/dist/electron/electron/utils/notion-api.js +103 -0
  233. package/dist/electron/electron/utils/onedrive-api.js +113 -0
  234. package/dist/electron/electron/utils/process.js +102 -0
  235. package/dist/electron/electron/utils/rate-limiter.js +104 -0
  236. package/dist/electron/electron/utils/runtime-mode.js +58 -0
  237. package/dist/electron/electron/utils/safe-storage.js +31 -0
  238. package/dist/electron/electron/utils/sharepoint-api.js +109 -0
  239. package/dist/electron/electron/utils/user-data-dir.js +59 -0
  240. package/dist/electron/electron/utils/validation.js +606 -0
  241. package/dist/electron/electron/utils/x-cli.js +177 -0
  242. package/dist/electron/electron/voice/VoiceService.js +507 -0
  243. package/dist/electron/electron/voice/index.js +14 -0
  244. package/dist/electron/electron/voice/voice-settings-manager.js +361 -0
  245. package/dist/electron/shared/agent-preferences.js +36 -0
  246. package/dist/electron/shared/channelMessages.js +460 -0
  247. package/dist/electron/shared/llm-provider-catalog.js +198 -0
  248. package/dist/electron/shared/plan-utils.js +32 -0
  249. package/dist/electron/shared/types.js +1376 -0
  250. package/dist/renderer/assets/index-3cWYvSH3.css +1 -0
  251. package/dist/renderer/assets/index-Xvm2AXZV.js +3510 -0
  252. package/dist/renderer/cowork-os-logo.png +0 -0
  253. package/dist/renderer/index.html +13 -0
  254. package/package.json +12 -5
  255. package/scripts/setup_native.mjs +61 -24
  256. package/src/renderer/components/DisclaimerModal.tsx +36 -23
  257. package/src/renderer/components/Onboarding/Onboarding.tsx +1 -1
  258. 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 electronPath = require.resolve('electron');
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
- // Check if the app has been built
13
- if (!fs.existsSync(mainPath)) {
14
- console.log('CoWork-OSS: Building application...');
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: true
18
+ shell: process.platform === 'win32',
19
19
  });
20
20
 
21
- build.on('close', (code) => {
22
- if (code === 0) {
23
- launchApp();
24
- } else {
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
- launchApp();
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 launchApp() {
34
- const electron = spawn(electronPath, [mainPath, ...args], {
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
- env: { ...process.env, ELECTRON_DISABLE_SECURITY_WARNINGS: 'true' }
82
+ shell: process.platform === 'win32',
83
+ env: process.env,
38
84
  });
39
85
 
40
- electron.on('close', (code) => {
41
- process.exit(code);
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;