cowork-os 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1638 -0
  3. package/bin/cowork.js +42 -0
  4. package/build/entitlements.mac.plist +16 -0
  5. package/build/icon.icns +0 -0
  6. package/build/icon.png +0 -0
  7. package/dist/electron/electron/activity/ActivityRepository.js +190 -0
  8. package/dist/electron/electron/agent/browser/browser-service.js +639 -0
  9. package/dist/electron/electron/agent/context-manager.js +225 -0
  10. package/dist/electron/electron/agent/custom-skill-loader.js +566 -0
  11. package/dist/electron/electron/agent/daemon.js +975 -0
  12. package/dist/electron/electron/agent/executor.js +3561 -0
  13. package/dist/electron/electron/agent/llm/anthropic-provider.js +155 -0
  14. package/dist/electron/electron/agent/llm/bedrock-provider.js +202 -0
  15. package/dist/electron/electron/agent/llm/gemini-provider.js +375 -0
  16. package/dist/electron/electron/agent/llm/index.js +34 -0
  17. package/dist/electron/electron/agent/llm/ollama-provider.js +263 -0
  18. package/dist/electron/electron/agent/llm/openai-oauth.js +101 -0
  19. package/dist/electron/electron/agent/llm/openai-provider.js +657 -0
  20. package/dist/electron/electron/agent/llm/openrouter-provider.js +232 -0
  21. package/dist/electron/electron/agent/llm/pricing.js +160 -0
  22. package/dist/electron/electron/agent/llm/provider-factory.js +880 -0
  23. package/dist/electron/electron/agent/llm/types.js +178 -0
  24. package/dist/electron/electron/agent/queue-manager.js +378 -0
  25. package/dist/electron/electron/agent/sandbox/docker-sandbox.js +402 -0
  26. package/dist/electron/electron/agent/sandbox/macos-sandbox.js +407 -0
  27. package/dist/electron/electron/agent/sandbox/runner.js +410 -0
  28. package/dist/electron/electron/agent/sandbox/sandbox-factory.js +228 -0
  29. package/dist/electron/electron/agent/sandbox/security-utils.js +258 -0
  30. package/dist/electron/electron/agent/search/brave-provider.js +119 -0
  31. package/dist/electron/electron/agent/search/google-provider.js +100 -0
  32. package/dist/electron/electron/agent/search/index.js +28 -0
  33. package/dist/electron/electron/agent/search/provider-factory.js +395 -0
  34. package/dist/electron/electron/agent/search/serpapi-provider.js +112 -0
  35. package/dist/electron/electron/agent/search/tavily-provider.js +90 -0
  36. package/dist/electron/electron/agent/search/types.js +40 -0
  37. package/dist/electron/electron/agent/security/index.js +12 -0
  38. package/dist/electron/electron/agent/security/input-sanitizer.js +303 -0
  39. package/dist/electron/electron/agent/security/output-filter.js +217 -0
  40. package/dist/electron/electron/agent/skill-eligibility.js +281 -0
  41. package/dist/electron/electron/agent/skill-registry.js +396 -0
  42. package/dist/electron/electron/agent/skills/document.js +878 -0
  43. package/dist/electron/electron/agent/skills/image-generator.js +225 -0
  44. package/dist/electron/electron/agent/skills/organizer.js +141 -0
  45. package/dist/electron/electron/agent/skills/presentation.js +367 -0
  46. package/dist/electron/electron/agent/skills/spreadsheet.js +165 -0
  47. package/dist/electron/electron/agent/tools/browser-tools.js +523 -0
  48. package/dist/electron/electron/agent/tools/builtin-settings.js +384 -0
  49. package/dist/electron/electron/agent/tools/canvas-tools.js +530 -0
  50. package/dist/electron/electron/agent/tools/cron-tools.js +577 -0
  51. package/dist/electron/electron/agent/tools/edit-tools.js +194 -0
  52. package/dist/electron/electron/agent/tools/file-tools.js +719 -0
  53. package/dist/electron/electron/agent/tools/glob-tools.js +283 -0
  54. package/dist/electron/electron/agent/tools/grep-tools.js +387 -0
  55. package/dist/electron/electron/agent/tools/image-tools.js +111 -0
  56. package/dist/electron/electron/agent/tools/mention-tools.js +282 -0
  57. package/dist/electron/electron/agent/tools/node-tools.js +476 -0
  58. package/dist/electron/electron/agent/tools/registry.js +2719 -0
  59. package/dist/electron/electron/agent/tools/search-tools.js +91 -0
  60. package/dist/electron/electron/agent/tools/shell-tools.js +574 -0
  61. package/dist/electron/electron/agent/tools/skill-tools.js +274 -0
  62. package/dist/electron/electron/agent/tools/system-tools.js +578 -0
  63. package/dist/electron/electron/agent/tools/web-fetch-tools.js +444 -0
  64. package/dist/electron/electron/agent/tools/x-tools.js +264 -0
  65. package/dist/electron/electron/agents/AgentRoleRepository.js +420 -0
  66. package/dist/electron/electron/agents/HeartbeatService.js +356 -0
  67. package/dist/electron/electron/agents/MentionRepository.js +197 -0
  68. package/dist/electron/electron/agents/TaskSubscriptionRepository.js +168 -0
  69. package/dist/electron/electron/agents/WorkingStateRepository.js +229 -0
  70. package/dist/electron/electron/canvas/canvas-manager.js +714 -0
  71. package/dist/electron/electron/canvas/canvas-preload.js +53 -0
  72. package/dist/electron/electron/canvas/canvas-protocol.js +195 -0
  73. package/dist/electron/electron/canvas/canvas-store.js +174 -0
  74. package/dist/electron/electron/canvas/index.js +13 -0
  75. package/dist/electron/electron/control-plane/client.js +364 -0
  76. package/dist/electron/electron/control-plane/handlers.js +572 -0
  77. package/dist/electron/electron/control-plane/index.js +41 -0
  78. package/dist/electron/electron/control-plane/node-manager.js +264 -0
  79. package/dist/electron/electron/control-plane/protocol.js +194 -0
  80. package/dist/electron/electron/control-plane/remote-client.js +437 -0
  81. package/dist/electron/electron/control-plane/server.js +640 -0
  82. package/dist/electron/electron/control-plane/settings.js +369 -0
  83. package/dist/electron/electron/control-plane/ssh-tunnel.js +549 -0
  84. package/dist/electron/electron/cron/index.js +30 -0
  85. package/dist/electron/electron/cron/schedule.js +190 -0
  86. package/dist/electron/electron/cron/service.js +614 -0
  87. package/dist/electron/electron/cron/store.js +155 -0
  88. package/dist/electron/electron/cron/types.js +82 -0
  89. package/dist/electron/electron/cron/webhook.js +258 -0
  90. package/dist/electron/electron/database/SecureSettingsRepository.js +444 -0
  91. package/dist/electron/electron/database/TaskLabelRepository.js +120 -0
  92. package/dist/electron/electron/database/repositories.js +1781 -0
  93. package/dist/electron/electron/database/schema.js +978 -0
  94. package/dist/electron/electron/extensions/index.js +33 -0
  95. package/dist/electron/electron/extensions/loader.js +313 -0
  96. package/dist/electron/electron/extensions/registry.js +485 -0
  97. package/dist/electron/electron/extensions/types.js +11 -0
  98. package/dist/electron/electron/gateway/channel-registry.js +1102 -0
  99. package/dist/electron/electron/gateway/channels/bluebubbles-client.js +479 -0
  100. package/dist/electron/electron/gateway/channels/bluebubbles.js +432 -0
  101. package/dist/electron/electron/gateway/channels/discord.js +975 -0
  102. package/dist/electron/electron/gateway/channels/email-client.js +593 -0
  103. package/dist/electron/electron/gateway/channels/email.js +443 -0
  104. package/dist/electron/electron/gateway/channels/google-chat.js +631 -0
  105. package/dist/electron/electron/gateway/channels/imessage-client.js +363 -0
  106. package/dist/electron/electron/gateway/channels/imessage.js +465 -0
  107. package/dist/electron/electron/gateway/channels/index.js +36 -0
  108. package/dist/electron/electron/gateway/channels/line-client.js +470 -0
  109. package/dist/electron/electron/gateway/channels/line.js +479 -0
  110. package/dist/electron/electron/gateway/channels/matrix-client.js +432 -0
  111. package/dist/electron/electron/gateway/channels/matrix.js +592 -0
  112. package/dist/electron/electron/gateway/channels/mattermost-client.js +394 -0
  113. package/dist/electron/electron/gateway/channels/mattermost.js +496 -0
  114. package/dist/electron/electron/gateway/channels/signal-client.js +500 -0
  115. package/dist/electron/electron/gateway/channels/signal.js +582 -0
  116. package/dist/electron/electron/gateway/channels/slack.js +415 -0
  117. package/dist/electron/electron/gateway/channels/teams.js +596 -0
  118. package/dist/electron/electron/gateway/channels/telegram.js +1390 -0
  119. package/dist/electron/electron/gateway/channels/twitch-client.js +502 -0
  120. package/dist/electron/electron/gateway/channels/twitch.js +396 -0
  121. package/dist/electron/electron/gateway/channels/types.js +8 -0
  122. package/dist/electron/electron/gateway/channels/whatsapp.js +953 -0
  123. package/dist/electron/electron/gateway/context-policy.js +268 -0
  124. package/dist/electron/electron/gateway/index.js +1063 -0
  125. package/dist/electron/electron/gateway/infrastructure.js +496 -0
  126. package/dist/electron/electron/gateway/router.js +2700 -0
  127. package/dist/electron/electron/gateway/security.js +375 -0
  128. package/dist/electron/electron/gateway/session.js +115 -0
  129. package/dist/electron/electron/gateway/tunnel.js +503 -0
  130. package/dist/electron/electron/guardrails/guardrail-manager.js +348 -0
  131. package/dist/electron/electron/hooks/gmail-watcher.js +300 -0
  132. package/dist/electron/electron/hooks/index.js +46 -0
  133. package/dist/electron/electron/hooks/mappings.js +381 -0
  134. package/dist/electron/electron/hooks/server.js +480 -0
  135. package/dist/electron/electron/hooks/settings.js +447 -0
  136. package/dist/electron/electron/hooks/types.js +41 -0
  137. package/dist/electron/electron/ipc/canvas-handlers.js +158 -0
  138. package/dist/electron/electron/ipc/handlers.js +3138 -0
  139. package/dist/electron/electron/ipc/mission-control-handlers.js +141 -0
  140. package/dist/electron/electron/main.js +448 -0
  141. package/dist/electron/electron/mcp/client/MCPClientManager.js +330 -0
  142. package/dist/electron/electron/mcp/client/MCPServerConnection.js +437 -0
  143. package/dist/electron/electron/mcp/client/transports/SSETransport.js +304 -0
  144. package/dist/electron/electron/mcp/client/transports/StdioTransport.js +307 -0
  145. package/dist/electron/electron/mcp/client/transports/WebSocketTransport.js +329 -0
  146. package/dist/electron/electron/mcp/host/MCPHostServer.js +354 -0
  147. package/dist/electron/electron/mcp/host/ToolAdapter.js +100 -0
  148. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +497 -0
  149. package/dist/electron/electron/mcp/settings.js +446 -0
  150. package/dist/electron/electron/mcp/types.js +59 -0
  151. package/dist/electron/electron/memory/MemoryService.js +435 -0
  152. package/dist/electron/electron/notifications/index.js +17 -0
  153. package/dist/electron/electron/notifications/service.js +118 -0
  154. package/dist/electron/electron/notifications/store.js +144 -0
  155. package/dist/electron/electron/preload.js +842 -0
  156. package/dist/electron/electron/reports/StandupReportService.js +272 -0
  157. package/dist/electron/electron/security/concurrency.js +293 -0
  158. package/dist/electron/electron/security/index.js +15 -0
  159. package/dist/electron/electron/security/policy-manager.js +435 -0
  160. package/dist/electron/electron/settings/appearance-manager.js +193 -0
  161. package/dist/electron/electron/settings/personality-manager.js +724 -0
  162. package/dist/electron/electron/settings/x-manager.js +58 -0
  163. package/dist/electron/electron/tailscale/exposure.js +188 -0
  164. package/dist/electron/electron/tailscale/index.js +28 -0
  165. package/dist/electron/electron/tailscale/settings.js +205 -0
  166. package/dist/electron/electron/tailscale/tailscale.js +355 -0
  167. package/dist/electron/electron/tray/QuickInputWindow.js +568 -0
  168. package/dist/electron/electron/tray/TrayManager.js +895 -0
  169. package/dist/electron/electron/tray/index.js +9 -0
  170. package/dist/electron/electron/updater/index.js +6 -0
  171. package/dist/electron/electron/updater/update-manager.js +418 -0
  172. package/dist/electron/electron/utils/env-migration.js +209 -0
  173. package/dist/electron/electron/utils/process.js +102 -0
  174. package/dist/electron/electron/utils/rate-limiter.js +104 -0
  175. package/dist/electron/electron/utils/validation.js +419 -0
  176. package/dist/electron/electron/utils/x-cli.js +177 -0
  177. package/dist/electron/electron/voice/VoiceService.js +507 -0
  178. package/dist/electron/electron/voice/index.js +14 -0
  179. package/dist/electron/electron/voice/voice-settings-manager.js +359 -0
  180. package/dist/electron/shared/channelMessages.js +170 -0
  181. package/dist/electron/shared/types.js +1185 -0
  182. package/package.json +159 -0
  183. package/resources/skills/1password.json +10 -0
  184. package/resources/skills/add-documentation.json +31 -0
  185. package/resources/skills/analyze-csv.json +17 -0
  186. package/resources/skills/apple-notes.json +10 -0
  187. package/resources/skills/apple-reminders.json +10 -0
  188. package/resources/skills/auto-commenter.json +10 -0
  189. package/resources/skills/bear-notes.json +10 -0
  190. package/resources/skills/bird.json +35 -0
  191. package/resources/skills/blogwatcher.json +10 -0
  192. package/resources/skills/blucli.json +10 -0
  193. package/resources/skills/bluebubbles.json +10 -0
  194. package/resources/skills/camsnap.json +10 -0
  195. package/resources/skills/clean-imports.json +18 -0
  196. package/resources/skills/code-review.json +18 -0
  197. package/resources/skills/coding-agent.json +10 -0
  198. package/resources/skills/compare-files.json +23 -0
  199. package/resources/skills/convert-code.json +34 -0
  200. package/resources/skills/create-changelog.json +24 -0
  201. package/resources/skills/debug-error.json +17 -0
  202. package/resources/skills/dependency-check.json +10 -0
  203. package/resources/skills/discord.json +10 -0
  204. package/resources/skills/eightctl.json +10 -0
  205. package/resources/skills/explain-code.json +29 -0
  206. package/resources/skills/extract-todos.json +18 -0
  207. package/resources/skills/food-order.json +10 -0
  208. package/resources/skills/gemini.json +10 -0
  209. package/resources/skills/generate-readme.json +10 -0
  210. package/resources/skills/gifgrep.json +10 -0
  211. package/resources/skills/git-commit.json +10 -0
  212. package/resources/skills/github.json +10 -0
  213. package/resources/skills/gog.json +10 -0
  214. package/resources/skills/goplaces.json +10 -0
  215. package/resources/skills/himalaya.json +10 -0
  216. package/resources/skills/imsg.json +10 -0
  217. package/resources/skills/karpathy-guidelines.json +12 -0
  218. package/resources/skills/last30days.json +26 -0
  219. package/resources/skills/local-places.json +10 -0
  220. package/resources/skills/mcporter.json +10 -0
  221. package/resources/skills/model-usage.json +10 -0
  222. package/resources/skills/nano-banana-pro.json +10 -0
  223. package/resources/skills/nano-pdf.json +10 -0
  224. package/resources/skills/notion.json +10 -0
  225. package/resources/skills/obsidian.json +10 -0
  226. package/resources/skills/openai-image-gen.json +10 -0
  227. package/resources/skills/openai-whisper-api.json +10 -0
  228. package/resources/skills/openai-whisper.json +10 -0
  229. package/resources/skills/openhue.json +10 -0
  230. package/resources/skills/oracle.json +10 -0
  231. package/resources/skills/ordercli.json +10 -0
  232. package/resources/skills/peekaboo.json +10 -0
  233. package/resources/skills/project-structure.json +10 -0
  234. package/resources/skills/proofread.json +17 -0
  235. package/resources/skills/refactor-code.json +31 -0
  236. package/resources/skills/rename-symbol.json +23 -0
  237. package/resources/skills/sag.json +10 -0
  238. package/resources/skills/security-audit.json +18 -0
  239. package/resources/skills/session-logs.json +10 -0
  240. package/resources/skills/sherpa-onnx-tts.json +10 -0
  241. package/resources/skills/skill-creator.json +15 -0
  242. package/resources/skills/skill-hub.json +29 -0
  243. package/resources/skills/slack.json +10 -0
  244. package/resources/skills/songsee.json +10 -0
  245. package/resources/skills/sonoscli.json +10 -0
  246. package/resources/skills/spotify-player.json +10 -0
  247. package/resources/skills/startup-cfo.json +55 -0
  248. package/resources/skills/summarize-folder.json +18 -0
  249. package/resources/skills/summarize.json +10 -0
  250. package/resources/skills/things-mac.json +10 -0
  251. package/resources/skills/tmux.json +10 -0
  252. package/resources/skills/translate.json +36 -0
  253. package/resources/skills/trello.json +10 -0
  254. package/resources/skills/video-frames.json +10 -0
  255. package/resources/skills/voice-call.json +10 -0
  256. package/resources/skills/wacli.json +10 -0
  257. package/resources/skills/weather.json +10 -0
  258. package/resources/skills/write-tests.json +31 -0
  259. package/src/electron/activity/ActivityRepository.ts +238 -0
  260. package/src/electron/agent/browser/browser-service.ts +721 -0
  261. package/src/electron/agent/context-manager.ts +257 -0
  262. package/src/electron/agent/custom-skill-loader.ts +634 -0
  263. package/src/electron/agent/daemon.ts +1097 -0
  264. package/src/electron/agent/executor.ts +4017 -0
  265. package/src/electron/agent/llm/anthropic-provider.ts +175 -0
  266. package/src/electron/agent/llm/bedrock-provider.ts +236 -0
  267. package/src/electron/agent/llm/gemini-provider.ts +422 -0
  268. package/src/electron/agent/llm/index.ts +9 -0
  269. package/src/electron/agent/llm/ollama-provider.ts +347 -0
  270. package/src/electron/agent/llm/openai-oauth.ts +127 -0
  271. package/src/electron/agent/llm/openai-provider.ts +686 -0
  272. package/src/electron/agent/llm/openrouter-provider.ts +273 -0
  273. package/src/electron/agent/llm/pricing.ts +180 -0
  274. package/src/electron/agent/llm/provider-factory.ts +971 -0
  275. package/src/electron/agent/llm/types.ts +291 -0
  276. package/src/electron/agent/queue-manager.ts +408 -0
  277. package/src/electron/agent/sandbox/docker-sandbox.ts +453 -0
  278. package/src/electron/agent/sandbox/macos-sandbox.ts +426 -0
  279. package/src/electron/agent/sandbox/runner.ts +453 -0
  280. package/src/electron/agent/sandbox/sandbox-factory.ts +337 -0
  281. package/src/electron/agent/sandbox/security-utils.ts +251 -0
  282. package/src/electron/agent/search/brave-provider.ts +141 -0
  283. package/src/electron/agent/search/google-provider.ts +131 -0
  284. package/src/electron/agent/search/index.ts +6 -0
  285. package/src/electron/agent/search/provider-factory.ts +450 -0
  286. package/src/electron/agent/search/serpapi-provider.ts +138 -0
  287. package/src/electron/agent/search/tavily-provider.ts +108 -0
  288. package/src/electron/agent/search/types.ts +118 -0
  289. package/src/electron/agent/security/index.ts +20 -0
  290. package/src/electron/agent/security/input-sanitizer.ts +380 -0
  291. package/src/electron/agent/security/output-filter.ts +259 -0
  292. package/src/electron/agent/skill-eligibility.ts +334 -0
  293. package/src/electron/agent/skill-registry.ts +457 -0
  294. package/src/electron/agent/skills/document.ts +1070 -0
  295. package/src/electron/agent/skills/image-generator.ts +272 -0
  296. package/src/electron/agent/skills/organizer.ts +131 -0
  297. package/src/electron/agent/skills/presentation.ts +418 -0
  298. package/src/electron/agent/skills/spreadsheet.ts +166 -0
  299. package/src/electron/agent/tools/browser-tools.ts +546 -0
  300. package/src/electron/agent/tools/builtin-settings.ts +422 -0
  301. package/src/electron/agent/tools/canvas-tools.ts +572 -0
  302. package/src/electron/agent/tools/cron-tools.ts +723 -0
  303. package/src/electron/agent/tools/edit-tools.ts +196 -0
  304. package/src/electron/agent/tools/file-tools.ts +811 -0
  305. package/src/electron/agent/tools/glob-tools.ts +303 -0
  306. package/src/electron/agent/tools/grep-tools.ts +432 -0
  307. package/src/electron/agent/tools/image-tools.ts +126 -0
  308. package/src/electron/agent/tools/mention-tools.ts +371 -0
  309. package/src/electron/agent/tools/node-tools.ts +550 -0
  310. package/src/electron/agent/tools/registry.ts +3052 -0
  311. package/src/electron/agent/tools/search-tools.ts +111 -0
  312. package/src/electron/agent/tools/shell-tools.ts +651 -0
  313. package/src/electron/agent/tools/skill-tools.ts +340 -0
  314. package/src/electron/agent/tools/system-tools.ts +665 -0
  315. package/src/electron/agent/tools/web-fetch-tools.ts +528 -0
  316. package/src/electron/agent/tools/x-tools.ts +267 -0
  317. package/src/electron/agents/AgentRoleRepository.ts +557 -0
  318. package/src/electron/agents/HeartbeatService.ts +469 -0
  319. package/src/electron/agents/MentionRepository.ts +242 -0
  320. package/src/electron/agents/TaskSubscriptionRepository.ts +231 -0
  321. package/src/electron/agents/WorkingStateRepository.ts +278 -0
  322. package/src/electron/canvas/canvas-manager.ts +818 -0
  323. package/src/electron/canvas/canvas-preload.ts +102 -0
  324. package/src/electron/canvas/canvas-protocol.ts +174 -0
  325. package/src/electron/canvas/canvas-store.ts +200 -0
  326. package/src/electron/canvas/index.ts +8 -0
  327. package/src/electron/control-plane/client.ts +527 -0
  328. package/src/electron/control-plane/handlers.ts +723 -0
  329. package/src/electron/control-plane/index.ts +51 -0
  330. package/src/electron/control-plane/node-manager.ts +322 -0
  331. package/src/electron/control-plane/protocol.ts +269 -0
  332. package/src/electron/control-plane/remote-client.ts +517 -0
  333. package/src/electron/control-plane/server.ts +853 -0
  334. package/src/electron/control-plane/settings.ts +401 -0
  335. package/src/electron/control-plane/ssh-tunnel.ts +624 -0
  336. package/src/electron/cron/index.ts +9 -0
  337. package/src/electron/cron/schedule.ts +217 -0
  338. package/src/electron/cron/service.ts +743 -0
  339. package/src/electron/cron/store.ts +165 -0
  340. package/src/electron/cron/types.ts +291 -0
  341. package/src/electron/cron/webhook.ts +303 -0
  342. package/src/electron/database/SecureSettingsRepository.ts +514 -0
  343. package/src/electron/database/TaskLabelRepository.ts +148 -0
  344. package/src/electron/database/repositories.ts +2397 -0
  345. package/src/electron/database/schema.ts +1017 -0
  346. package/src/electron/extensions/index.ts +18 -0
  347. package/src/electron/extensions/loader.ts +336 -0
  348. package/src/electron/extensions/registry.ts +546 -0
  349. package/src/electron/extensions/types.ts +372 -0
  350. package/src/electron/gateway/channel-registry.ts +1267 -0
  351. package/src/electron/gateway/channels/bluebubbles-client.ts +641 -0
  352. package/src/electron/gateway/channels/bluebubbles.ts +509 -0
  353. package/src/electron/gateway/channels/discord.ts +1150 -0
  354. package/src/electron/gateway/channels/email-client.ts +708 -0
  355. package/src/electron/gateway/channels/email.ts +516 -0
  356. package/src/electron/gateway/channels/google-chat.ts +760 -0
  357. package/src/electron/gateway/channels/imessage-client.ts +473 -0
  358. package/src/electron/gateway/channels/imessage.ts +520 -0
  359. package/src/electron/gateway/channels/index.ts +21 -0
  360. package/src/electron/gateway/channels/line-client.ts +598 -0
  361. package/src/electron/gateway/channels/line.ts +559 -0
  362. package/src/electron/gateway/channels/matrix-client.ts +632 -0
  363. package/src/electron/gateway/channels/matrix.ts +655 -0
  364. package/src/electron/gateway/channels/mattermost-client.ts +526 -0
  365. package/src/electron/gateway/channels/mattermost.ts +550 -0
  366. package/src/electron/gateway/channels/signal-client.ts +722 -0
  367. package/src/electron/gateway/channels/signal.ts +666 -0
  368. package/src/electron/gateway/channels/slack.ts +458 -0
  369. package/src/electron/gateway/channels/teams.ts +681 -0
  370. package/src/electron/gateway/channels/telegram.ts +1727 -0
  371. package/src/electron/gateway/channels/twitch-client.ts +665 -0
  372. package/src/electron/gateway/channels/twitch.ts +468 -0
  373. package/src/electron/gateway/channels/types.ts +1002 -0
  374. package/src/electron/gateway/channels/whatsapp.ts +1101 -0
  375. package/src/electron/gateway/context-policy.ts +382 -0
  376. package/src/electron/gateway/index.ts +1274 -0
  377. package/src/electron/gateway/infrastructure.ts +645 -0
  378. package/src/electron/gateway/router.ts +3206 -0
  379. package/src/electron/gateway/security.ts +422 -0
  380. package/src/electron/gateway/session.ts +144 -0
  381. package/src/electron/gateway/tunnel.ts +626 -0
  382. package/src/electron/guardrails/guardrail-manager.ts +380 -0
  383. package/src/electron/hooks/gmail-watcher.ts +355 -0
  384. package/src/electron/hooks/index.ts +30 -0
  385. package/src/electron/hooks/mappings.ts +404 -0
  386. package/src/electron/hooks/server.ts +574 -0
  387. package/src/electron/hooks/settings.ts +466 -0
  388. package/src/electron/hooks/types.ts +245 -0
  389. package/src/electron/ipc/canvas-handlers.ts +223 -0
  390. package/src/electron/ipc/handlers.ts +3661 -0
  391. package/src/electron/ipc/mission-control-handlers.ts +182 -0
  392. package/src/electron/main.ts +496 -0
  393. package/src/electron/mcp/client/MCPClientManager.ts +406 -0
  394. package/src/electron/mcp/client/MCPServerConnection.ts +514 -0
  395. package/src/electron/mcp/client/transports/SSETransport.ts +360 -0
  396. package/src/electron/mcp/client/transports/StdioTransport.ts +355 -0
  397. package/src/electron/mcp/client/transports/WebSocketTransport.ts +384 -0
  398. package/src/electron/mcp/host/MCPHostServer.ts +388 -0
  399. package/src/electron/mcp/host/ToolAdapter.ts +140 -0
  400. package/src/electron/mcp/registry/MCPRegistryManager.ts +565 -0
  401. package/src/electron/mcp/settings.ts +468 -0
  402. package/src/electron/mcp/types.ts +371 -0
  403. package/src/electron/memory/MemoryService.ts +523 -0
  404. package/src/electron/notifications/index.ts +16 -0
  405. package/src/electron/notifications/service.ts +161 -0
  406. package/src/electron/notifications/store.ts +163 -0
  407. package/src/electron/preload.ts +2845 -0
  408. package/src/electron/reports/StandupReportService.ts +356 -0
  409. package/src/electron/security/concurrency.ts +333 -0
  410. package/src/electron/security/index.ts +17 -0
  411. package/src/electron/security/policy-manager.ts +539 -0
  412. package/src/electron/settings/appearance-manager.ts +182 -0
  413. package/src/electron/settings/personality-manager.ts +800 -0
  414. package/src/electron/settings/x-manager.ts +62 -0
  415. package/src/electron/tailscale/exposure.ts +262 -0
  416. package/src/electron/tailscale/index.ts +34 -0
  417. package/src/electron/tailscale/settings.ts +218 -0
  418. package/src/electron/tailscale/tailscale.ts +379 -0
  419. package/src/electron/tray/QuickInputWindow.ts +609 -0
  420. package/src/electron/tray/TrayManager.ts +1005 -0
  421. package/src/electron/tray/index.ts +6 -0
  422. package/src/electron/updater/index.ts +1 -0
  423. package/src/electron/updater/update-manager.ts +447 -0
  424. package/src/electron/utils/env-migration.ts +203 -0
  425. package/src/electron/utils/process.ts +124 -0
  426. package/src/electron/utils/rate-limiter.ts +130 -0
  427. package/src/electron/utils/validation.ts +493 -0
  428. package/src/electron/utils/x-cli.ts +198 -0
  429. package/src/electron/voice/VoiceService.ts +583 -0
  430. package/src/electron/voice/index.ts +9 -0
  431. package/src/electron/voice/voice-settings-manager.ts +403 -0
  432. package/src/renderer/App.tsx +775 -0
  433. package/src/renderer/components/ActivityFeed.tsx +407 -0
  434. package/src/renderer/components/ActivityFeedItem.tsx +285 -0
  435. package/src/renderer/components/AgentRoleCard.tsx +343 -0
  436. package/src/renderer/components/AgentRoleEditor.tsx +805 -0
  437. package/src/renderer/components/AgentSquadSettings.tsx +295 -0
  438. package/src/renderer/components/AgentWorkingStatePanel.tsx +411 -0
  439. package/src/renderer/components/AppearanceSettings.tsx +122 -0
  440. package/src/renderer/components/ApprovalDialog.tsx +100 -0
  441. package/src/renderer/components/BlueBubblesSettings.tsx +505 -0
  442. package/src/renderer/components/BuiltinToolsSettings.tsx +307 -0
  443. package/src/renderer/components/CanvasPreview.tsx +1189 -0
  444. package/src/renderer/components/CommandOutput.tsx +202 -0
  445. package/src/renderer/components/ContextPolicySettings.tsx +523 -0
  446. package/src/renderer/components/ControlPlaneSettings.tsx +1134 -0
  447. package/src/renderer/components/DisclaimerModal.tsx +124 -0
  448. package/src/renderer/components/DiscordSettings.tsx +436 -0
  449. package/src/renderer/components/EmailSettings.tsx +606 -0
  450. package/src/renderer/components/ExtensionsSettings.tsx +542 -0
  451. package/src/renderer/components/FileViewer.tsx +224 -0
  452. package/src/renderer/components/GoogleChatSettings.tsx +535 -0
  453. package/src/renderer/components/GuardrailSettings.tsx +487 -0
  454. package/src/renderer/components/HooksSettings.tsx +581 -0
  455. package/src/renderer/components/ImessageSettings.tsx +484 -0
  456. package/src/renderer/components/LineSettings.tsx +483 -0
  457. package/src/renderer/components/MCPRegistryBrowser.tsx +386 -0
  458. package/src/renderer/components/MCPSettings.tsx +943 -0
  459. package/src/renderer/components/MainContent.tsx +2433 -0
  460. package/src/renderer/components/MatrixSettings.tsx +510 -0
  461. package/src/renderer/components/MattermostSettings.tsx +473 -0
  462. package/src/renderer/components/MemorySettings.tsx +247 -0
  463. package/src/renderer/components/MentionBadge.tsx +87 -0
  464. package/src/renderer/components/MentionInput.tsx +409 -0
  465. package/src/renderer/components/MentionList.tsx +476 -0
  466. package/src/renderer/components/MissionControlPanel.tsx +1995 -0
  467. package/src/renderer/components/NodesSettings.tsx +316 -0
  468. package/src/renderer/components/NotificationPanel.tsx +481 -0
  469. package/src/renderer/components/Onboarding/AwakeningOrb.tsx +44 -0
  470. package/src/renderer/components/Onboarding/Onboarding.tsx +443 -0
  471. package/src/renderer/components/Onboarding/TypewriterText.tsx +102 -0
  472. package/src/renderer/components/Onboarding/index.ts +3 -0
  473. package/src/renderer/components/OnboardingModal.tsx +698 -0
  474. package/src/renderer/components/PairingCodeDisplay.tsx +324 -0
  475. package/src/renderer/components/PersonalitySettings.tsx +597 -0
  476. package/src/renderer/components/QueueSettings.tsx +119 -0
  477. package/src/renderer/components/QuickTaskFAB.tsx +71 -0
  478. package/src/renderer/components/RightPanel.tsx +413 -0
  479. package/src/renderer/components/ScheduledTasksSettings.tsx +1328 -0
  480. package/src/renderer/components/SearchSettings.tsx +328 -0
  481. package/src/renderer/components/Settings.tsx +1504 -0
  482. package/src/renderer/components/Sidebar.tsx +344 -0
  483. package/src/renderer/components/SignalSettings.tsx +673 -0
  484. package/src/renderer/components/SkillHubBrowser.tsx +458 -0
  485. package/src/renderer/components/SkillParameterModal.tsx +185 -0
  486. package/src/renderer/components/SkillsSettings.tsx +451 -0
  487. package/src/renderer/components/SlackSettings.tsx +442 -0
  488. package/src/renderer/components/StandupReportViewer.tsx +614 -0
  489. package/src/renderer/components/TaskBoard.tsx +498 -0
  490. package/src/renderer/components/TaskBoardCard.tsx +357 -0
  491. package/src/renderer/components/TaskBoardColumn.tsx +211 -0
  492. package/src/renderer/components/TaskLabelManager.tsx +472 -0
  493. package/src/renderer/components/TaskQueuePanel.tsx +144 -0
  494. package/src/renderer/components/TaskQuickActions.tsx +492 -0
  495. package/src/renderer/components/TaskTimeline.tsx +216 -0
  496. package/src/renderer/components/TaskView.tsx +162 -0
  497. package/src/renderer/components/TeamsSettings.tsx +518 -0
  498. package/src/renderer/components/TelegramSettings.tsx +421 -0
  499. package/src/renderer/components/Toast.tsx +76 -0
  500. package/src/renderer/components/TraySettings.tsx +189 -0
  501. package/src/renderer/components/TwitchSettings.tsx +511 -0
  502. package/src/renderer/components/UpdateSettings.tsx +295 -0
  503. package/src/renderer/components/VoiceIndicator.tsx +270 -0
  504. package/src/renderer/components/VoiceSettings.tsx +867 -0
  505. package/src/renderer/components/WhatsAppSettings.tsx +721 -0
  506. package/src/renderer/components/WorkingStateEditor.tsx +309 -0
  507. package/src/renderer/components/WorkingStateHistory.tsx +481 -0
  508. package/src/renderer/components/WorkspaceSelector.tsx +150 -0
  509. package/src/renderer/components/XSettings.tsx +311 -0
  510. package/src/renderer/global.d.ts +9 -0
  511. package/src/renderer/hooks/useAgentContext.ts +153 -0
  512. package/src/renderer/hooks/useOnboardingFlow.ts +548 -0
  513. package/src/renderer/hooks/useVoiceInput.ts +268 -0
  514. package/src/renderer/index.html +12 -0
  515. package/src/renderer/main.tsx +10 -0
  516. package/src/renderer/public/cowork-os-logo.png +0 -0
  517. package/src/renderer/quick-input.html +164 -0
  518. package/src/renderer/styles/index.css +14504 -0
  519. package/src/renderer/utils/agentMessages.ts +749 -0
  520. package/src/renderer/utils/voice-directives.ts +169 -0
  521. package/src/shared/channelMessages.ts +213 -0
  522. package/src/shared/types.ts +3608 -0
  523. package/tsconfig.electron.json +26 -0
  524. package/tsconfig.json +26 -0
  525. package/tsconfig.node.json +10 -0
  526. package/vite.config.ts +23 -0
@@ -0,0 +1,435 @@
1
+ "use strict";
2
+ /**
3
+ * Memory Service
4
+ *
5
+ * Core service for the persistent memory system.
6
+ * Handles capture, compression, search, and context injection.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MemoryService = void 0;
10
+ const events_1 = require("events");
11
+ const repositories_1 = require("../database/repositories");
12
+ const llm_1 = require("../agent/llm");
13
+ const context_manager_1 = require("../agent/context-manager");
14
+ const security_1 = require("../agent/security");
15
+ // Privacy patterns to exclude - matches common sensitive data patterns
16
+ const SENSITIVE_PATTERNS = [
17
+ /api[_-]?key/i,
18
+ /secret/i,
19
+ /password/i,
20
+ /passwd/i,
21
+ /token/i,
22
+ /credential/i,
23
+ /auth/i,
24
+ /bearer\s+[a-zA-Z0-9\-_]+/i,
25
+ /ssh[_-]?key/i,
26
+ /private[_-]?key/i,
27
+ /\.env/i,
28
+ /aws[_-]?access/i,
29
+ /aws[_-]?secret/i,
30
+ /-----BEGIN\s+(RSA\s+)?PRIVATE\s+KEY-----/i,
31
+ /ghp_[a-zA-Z0-9]+/i, // GitHub personal access token
32
+ /gho_[a-zA-Z0-9]+/i, // GitHub OAuth token
33
+ /sk-[a-zA-Z0-9]+/i, // OpenAI API key format
34
+ /xox[baprs]-[a-zA-Z0-9-]+/i, // Slack tokens
35
+ ];
36
+ // Events for reactive updates
37
+ const memoryEvents = new events_1.EventEmitter();
38
+ // Minimum tokens before compression is worthwhile
39
+ const MIN_TOKENS_FOR_COMPRESSION = 100;
40
+ // Compression batch size
41
+ const COMPRESSION_BATCH_SIZE = 10;
42
+ // Cleanup interval (1 hour)
43
+ const CLEANUP_INTERVAL_MS = 60 * 60 * 1000;
44
+ // Compression delay between items (avoid rate limits)
45
+ const COMPRESSION_DELAY_MS = 200;
46
+ class MemoryService {
47
+ /**
48
+ * Initialize the memory service
49
+ */
50
+ static initialize(dbManager) {
51
+ if (this.initialized)
52
+ return;
53
+ const db = dbManager.getDatabase();
54
+ this.memoryRepo = new repositories_1.MemoryRepository(db);
55
+ this.summaryRepo = new repositories_1.MemorySummaryRepository(db);
56
+ this.settingsRepo = new repositories_1.MemorySettingsRepository(db);
57
+ this.initialized = true;
58
+ // Start periodic cleanup
59
+ this.cleanupIntervalHandle = setInterval(() => this.runCleanup(), CLEANUP_INTERVAL_MS);
60
+ console.log('[MemoryService] Initialized');
61
+ }
62
+ /**
63
+ * Subscribe to memory events
64
+ */
65
+ static onMemoryChanged(callback) {
66
+ memoryEvents.on('memoryChanged', callback);
67
+ return () => memoryEvents.off('memoryChanged', callback);
68
+ }
69
+ /**
70
+ * Capture an observation from task execution
71
+ */
72
+ static async capture(workspaceId, taskId, type, content, isPrivate = false) {
73
+ this.ensureInitialized();
74
+ // Check settings
75
+ const settings = this.settingsRepo.getOrCreate(workspaceId);
76
+ if (!settings.enabled || !settings.autoCapture) {
77
+ return null;
78
+ }
79
+ // Check privacy mode
80
+ if (settings.privacyMode === 'disabled') {
81
+ return null;
82
+ }
83
+ // Check excluded patterns
84
+ if (this.shouldExclude(content, settings)) {
85
+ return null;
86
+ }
87
+ // Check for sensitive content
88
+ const containsSensitive = this.containsSensitiveData(content);
89
+ const finalIsPrivate = isPrivate || containsSensitive || settings.privacyMode === 'strict';
90
+ // Estimate tokens
91
+ const tokens = (0, context_manager_1.estimateTokens)(content);
92
+ // Truncate very long content
93
+ const truncatedContent = content.length > 10000 ? content.slice(0, 10000) + '\n[... truncated]' : content;
94
+ // Create memory
95
+ const memory = this.memoryRepo.create({
96
+ workspaceId,
97
+ taskId,
98
+ type,
99
+ content: truncatedContent,
100
+ tokens,
101
+ isCompressed: false,
102
+ isPrivate: finalIsPrivate,
103
+ });
104
+ // Queue for compression if enabled and large enough
105
+ if (settings.compressionEnabled && tokens > MIN_TOKENS_FOR_COMPRESSION && !finalIsPrivate) {
106
+ this.compressionQueue.push(memory.id);
107
+ this.processCompressionQueue();
108
+ }
109
+ // Emit event
110
+ memoryEvents.emit('memoryChanged', { type: 'created', workspaceId });
111
+ return memory;
112
+ }
113
+ /**
114
+ * Search memories - Layer 1 of progressive retrieval
115
+ * Returns IDs + brief snippets (~50 tokens each)
116
+ */
117
+ static search(workspaceId, query, limit = 20) {
118
+ this.ensureInitialized();
119
+ return this.memoryRepo.search(workspaceId, query, limit);
120
+ }
121
+ /**
122
+ * Get timeline context - Layer 2 of progressive retrieval
123
+ * Returns surrounding memories for context
124
+ */
125
+ static getTimelineContext(memoryId, windowSize = 5) {
126
+ this.ensureInitialized();
127
+ return this.memoryRepo.getTimelineContext(memoryId, windowSize);
128
+ }
129
+ /**
130
+ * Get full details - Layer 3 of progressive retrieval
131
+ * Only called for specific memories when needed
132
+ */
133
+ static getFullDetails(ids) {
134
+ this.ensureInitialized();
135
+ return this.memoryRepo.getFullDetails(ids);
136
+ }
137
+ /**
138
+ * Get memories for a specific task
139
+ */
140
+ static getByTask(taskId) {
141
+ this.ensureInitialized();
142
+ return this.memoryRepo.findByTask(taskId);
143
+ }
144
+ /**
145
+ * Get recent memories for a workspace
146
+ */
147
+ static getRecent(workspaceId, limit = 20) {
148
+ this.ensureInitialized();
149
+ return this.memoryRepo.getRecentForWorkspace(workspaceId, limit);
150
+ }
151
+ /**
152
+ * Get context for injection at task start
153
+ * Returns a formatted string suitable for system prompt
154
+ */
155
+ static getContextForInjection(workspaceId, taskPrompt) {
156
+ this.ensureInitialized();
157
+ const settings = this.settingsRepo.getOrCreate(workspaceId);
158
+ if (!settings.enabled) {
159
+ return '';
160
+ }
161
+ // Get recent memories (summaries preferred)
162
+ const recentMemories = this.memoryRepo.getRecentForWorkspace(workspaceId, 5);
163
+ // Search for relevant memories based on task prompt
164
+ let relevantMemories = [];
165
+ if (taskPrompt && taskPrompt.length > 10) {
166
+ try {
167
+ // Extract key terms for search
168
+ const searchTerms = this.extractSearchTerms(taskPrompt);
169
+ if (searchTerms) {
170
+ relevantMemories = this.memoryRepo.search(workspaceId, searchTerms, 5);
171
+ // Filter out memories that are already in recent
172
+ const recentIds = new Set(recentMemories.map((m) => m.id));
173
+ relevantMemories = relevantMemories.filter((m) => !recentIds.has(m.id));
174
+ }
175
+ }
176
+ catch {
177
+ // Search failed, continue without relevant memories
178
+ }
179
+ }
180
+ if (recentMemories.length === 0 && relevantMemories.length === 0) {
181
+ return '';
182
+ }
183
+ const parts = ['<memory_context>'];
184
+ parts.push('The following memories from previous sessions may be relevant:');
185
+ // Add recent memories (summaries only for token efficiency)
186
+ if (recentMemories.length > 0) {
187
+ parts.push('\n## Recent Activity');
188
+ for (const memory of recentMemories) {
189
+ const rawText = memory.summary || this.truncate(memory.content, 150);
190
+ // Sanitize memory content to prevent injection via stored memories
191
+ const text = security_1.InputSanitizer.sanitizeMemoryContent(rawText);
192
+ const date = new Date(memory.createdAt).toLocaleDateString();
193
+ parts.push(`- [${memory.type}] (${date}) ${text}`);
194
+ }
195
+ }
196
+ // Add relevant memories
197
+ if (relevantMemories.length > 0) {
198
+ parts.push('\n## Relevant to Current Task');
199
+ for (const result of relevantMemories) {
200
+ const date = new Date(result.createdAt).toLocaleDateString();
201
+ // Sanitize memory content to prevent injection via stored memories
202
+ const sanitizedSnippet = security_1.InputSanitizer.sanitizeMemoryContent(result.snippet);
203
+ parts.push(`- [${result.type}] (${date}) ${sanitizedSnippet}`);
204
+ }
205
+ }
206
+ parts.push('</memory_context>');
207
+ return parts.join('\n');
208
+ }
209
+ /**
210
+ * Get or create settings for a workspace
211
+ */
212
+ static getSettings(workspaceId) {
213
+ this.ensureInitialized();
214
+ return this.settingsRepo.getOrCreate(workspaceId);
215
+ }
216
+ /**
217
+ * Update settings for a workspace
218
+ */
219
+ static updateSettings(workspaceId, updates) {
220
+ this.ensureInitialized();
221
+ this.settingsRepo.update(workspaceId, updates);
222
+ memoryEvents.emit('memoryChanged', { type: 'settingsUpdated', workspaceId });
223
+ }
224
+ /**
225
+ * Get storage statistics for a workspace
226
+ */
227
+ static getStats(workspaceId) {
228
+ this.ensureInitialized();
229
+ return this.memoryRepo.getStats(workspaceId);
230
+ }
231
+ /**
232
+ * Delete all memories for a workspace
233
+ */
234
+ static clearWorkspace(workspaceId) {
235
+ this.ensureInitialized();
236
+ this.memoryRepo.deleteByWorkspace(workspaceId);
237
+ this.summaryRepo.deleteByWorkspace(workspaceId);
238
+ memoryEvents.emit('memoryChanged', { type: 'cleared', workspaceId });
239
+ }
240
+ /**
241
+ * Process compression queue asynchronously
242
+ */
243
+ static async processCompressionQueue() {
244
+ if (this.compressionInProgress || this.compressionQueue.length === 0) {
245
+ return;
246
+ }
247
+ this.compressionInProgress = true;
248
+ try {
249
+ // Process in batches
250
+ const batch = this.compressionQueue.splice(0, COMPRESSION_BATCH_SIZE);
251
+ for (const memoryId of batch) {
252
+ await this.compressMemory(memoryId);
253
+ // Small delay to avoid overwhelming the LLM
254
+ await new Promise((resolve) => setTimeout(resolve, COMPRESSION_DELAY_MS));
255
+ }
256
+ // Continue if more items
257
+ if (this.compressionQueue.length > 0) {
258
+ setTimeout(() => this.processCompressionQueue(), 1000);
259
+ }
260
+ }
261
+ catch (error) {
262
+ console.error('[MemoryService] Compression queue error:', error);
263
+ }
264
+ finally {
265
+ this.compressionInProgress = false;
266
+ }
267
+ }
268
+ /**
269
+ * Compress a single memory using LLM
270
+ */
271
+ static async compressMemory(memoryId) {
272
+ const memory = this.memoryRepo.findById(memoryId);
273
+ if (!memory || memory.isCompressed || memory.summary)
274
+ return;
275
+ try {
276
+ // Get LLM provider for compression
277
+ const provider = llm_1.LLMProviderFactory.createProvider();
278
+ const settings = llm_1.LLMProviderFactory.getSettings();
279
+ const modelId = llm_1.LLMProviderFactory.getModelId(settings.modelKey, settings.providerType, settings.ollama?.model, settings.gemini?.model, settings.openrouter?.model, settings.openai?.model);
280
+ const response = await provider.createMessage({
281
+ model: modelId,
282
+ maxTokens: 100,
283
+ system: 'You are a helpful assistant that summarizes text concisely.',
284
+ messages: [
285
+ {
286
+ role: 'user',
287
+ content: `Summarize this observation in 1-2 sentences (max 50 words). Focus on the key insight, decision, or action taken. Be concise and factual.
288
+
289
+ Observation:
290
+ ${memory.content}
291
+
292
+ Summary:`,
293
+ },
294
+ ],
295
+ });
296
+ // Extract summary from response
297
+ let summary = '';
298
+ for (const content of response.content) {
299
+ if (content.type === 'text') {
300
+ summary += content.text;
301
+ }
302
+ }
303
+ summary = summary.trim();
304
+ if (summary) {
305
+ const summaryTokens = (0, context_manager_1.estimateTokens)(summary);
306
+ this.memoryRepo.update(memoryId, {
307
+ summary,
308
+ tokens: summaryTokens,
309
+ isCompressed: true,
310
+ });
311
+ }
312
+ }
313
+ catch (error) {
314
+ // Log but don't fail - compression is optional enhancement
315
+ console.warn('[MemoryService] Compression failed for memory:', memoryId, error);
316
+ }
317
+ }
318
+ /**
319
+ * Run periodic cleanup based on retention policies
320
+ */
321
+ static async runCleanup() {
322
+ if (!this.initialized)
323
+ return;
324
+ try {
325
+ // Get all workspaces with memories
326
+ const workspacesWithMemories = new Set();
327
+ // Find unique workspace IDs from recent memories
328
+ const recentMemories = this.memoryRepo.getUncompressed(1000);
329
+ for (const memory of recentMemories) {
330
+ workspacesWithMemories.add(memory.workspaceId);
331
+ }
332
+ // Process each workspace
333
+ for (const workspaceId of workspacesWithMemories) {
334
+ const settings = this.settingsRepo.getOrCreate(workspaceId);
335
+ const retentionMs = settings.retentionDays * 24 * 60 * 60 * 1000;
336
+ const cutoff = Date.now() - retentionMs;
337
+ const deleted = this.memoryRepo.deleteOlderThan(workspaceId, cutoff);
338
+ if (deleted > 0) {
339
+ console.log(`[MemoryService] Cleaned up ${deleted} old memories for workspace ${workspaceId}`);
340
+ }
341
+ }
342
+ }
343
+ catch (error) {
344
+ console.error('[MemoryService] Cleanup failed:', error);
345
+ }
346
+ }
347
+ /**
348
+ * Extract search terms from task prompt
349
+ */
350
+ static extractSearchTerms(prompt) {
351
+ // Remove common words and extract meaningful terms
352
+ const stopWords = new Set([
353
+ 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
354
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
355
+ 'should', 'may', 'might', 'can', 'must', 'shall', 'to', 'of', 'in',
356
+ 'for', 'on', 'with', 'at', 'by', 'from', 'up', 'about', 'into',
357
+ 'over', 'after', 'beneath', 'under', 'above', 'and', 'or', 'but',
358
+ 'if', 'then', 'else', 'when', 'where', 'why', 'how', 'all', 'each',
359
+ 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such',
360
+ 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too',
361
+ 'very', 'just', 'also', 'now', 'please', 'help', 'me', 'i', 'my',
362
+ 'want', 'need', 'like', 'make', 'create', 'add', 'update', 'fix',
363
+ ]);
364
+ const words = prompt
365
+ .toLowerCase()
366
+ .replace(/[^\w\s]/g, ' ')
367
+ .split(/\s+/)
368
+ .filter((word) => word.length > 2 && !stopWords.has(word));
369
+ // Take first 5 meaningful words for search
370
+ return words.slice(0, 5).join(' OR ');
371
+ }
372
+ /**
373
+ * Check if content should be excluded
374
+ */
375
+ static shouldExclude(content, settings) {
376
+ if (!settings.excludedPatterns || settings.excludedPatterns.length === 0) {
377
+ return false;
378
+ }
379
+ for (const pattern of settings.excludedPatterns) {
380
+ try {
381
+ const regex = new RegExp(pattern, 'i');
382
+ if (regex.test(content)) {
383
+ return true;
384
+ }
385
+ }
386
+ catch {
387
+ // Invalid regex pattern, skip
388
+ }
389
+ }
390
+ return false;
391
+ }
392
+ /**
393
+ * Check if content contains sensitive data
394
+ */
395
+ static containsSensitiveData(content) {
396
+ for (const pattern of SENSITIVE_PATTERNS) {
397
+ if (pattern.test(content)) {
398
+ return true;
399
+ }
400
+ }
401
+ return false;
402
+ }
403
+ /**
404
+ * Truncate text to specified length
405
+ */
406
+ static truncate(text, maxLength) {
407
+ if (text.length <= maxLength)
408
+ return text;
409
+ return text.slice(0, maxLength - 3) + '...';
410
+ }
411
+ /**
412
+ * Ensure service is initialized
413
+ */
414
+ static ensureInitialized() {
415
+ if (!this.initialized) {
416
+ throw new Error('[MemoryService] Not initialized. Call MemoryService.initialize() first.');
417
+ }
418
+ }
419
+ /**
420
+ * Shutdown the service
421
+ */
422
+ static shutdown() {
423
+ if (this.cleanupIntervalHandle) {
424
+ clearInterval(this.cleanupIntervalHandle);
425
+ this.cleanupIntervalHandle = undefined;
426
+ }
427
+ memoryEvents.removeAllListeners();
428
+ this.initialized = false;
429
+ console.log('[MemoryService] Shutdown complete');
430
+ }
431
+ }
432
+ exports.MemoryService = MemoryService;
433
+ MemoryService.initialized = false;
434
+ MemoryService.compressionQueue = [];
435
+ MemoryService.compressionInProgress = false;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /**
3
+ * Notification module exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_NOTIFICATION_DIR = exports.DEFAULT_NOTIFICATION_STORE_PATH = exports.getNotificationDir = exports.getNotificationStorePath = exports.saveNotificationStoreSync = exports.saveNotificationStore = exports.loadNotificationStoreSync = exports.loadNotificationStore = exports.NotificationService = void 0;
7
+ var service_1 = require("./service");
8
+ Object.defineProperty(exports, "NotificationService", { enumerable: true, get: function () { return service_1.NotificationService; } });
9
+ var store_1 = require("./store");
10
+ Object.defineProperty(exports, "loadNotificationStore", { enumerable: true, get: function () { return store_1.loadNotificationStore; } });
11
+ Object.defineProperty(exports, "loadNotificationStoreSync", { enumerable: true, get: function () { return store_1.loadNotificationStoreSync; } });
12
+ Object.defineProperty(exports, "saveNotificationStore", { enumerable: true, get: function () { return store_1.saveNotificationStore; } });
13
+ Object.defineProperty(exports, "saveNotificationStoreSync", { enumerable: true, get: function () { return store_1.saveNotificationStoreSync; } });
14
+ Object.defineProperty(exports, "getNotificationStorePath", { enumerable: true, get: function () { return store_1.getNotificationStorePath; } });
15
+ Object.defineProperty(exports, "getNotificationDir", { enumerable: true, get: function () { return store_1.getNotificationDir; } });
16
+ Object.defineProperty(exports, "DEFAULT_NOTIFICATION_STORE_PATH", { enumerable: true, get: function () { return store_1.DEFAULT_NOTIFICATION_STORE_PATH; } });
17
+ Object.defineProperty(exports, "DEFAULT_NOTIFICATION_DIR", { enumerable: true, get: function () { return store_1.DEFAULT_NOTIFICATION_DIR; } });
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Notification Service - Manages in-app notifications
4
+ * Provides CRUD operations and emits events for UI updates
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.NotificationService = void 0;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const store_1 = require("./store");
10
+ class NotificationService {
11
+ constructor(config = {}) {
12
+ this.notifications = [];
13
+ this.storePath = config.storePath || (0, store_1.getNotificationStorePath)();
14
+ this.onEvent = config.onEvent;
15
+ // Load notifications synchronously on startup
16
+ const store = (0, store_1.loadNotificationStoreSync)(this.storePath);
17
+ this.notifications = store.notifications;
18
+ console.log(`[Notifications] Loaded ${this.notifications.length} notifications from store`);
19
+ }
20
+ /**
21
+ * Get all notifications (sorted by date, newest first)
22
+ */
23
+ list() {
24
+ return [...this.notifications].sort((a, b) => b.createdAt - a.createdAt);
25
+ }
26
+ /**
27
+ * Get unread count
28
+ */
29
+ getUnreadCount() {
30
+ return this.notifications.filter((n) => !n.read).length;
31
+ }
32
+ /**
33
+ * Add a new notification
34
+ */
35
+ async add(params) {
36
+ const notification = {
37
+ id: (0, node_crypto_1.randomUUID)(),
38
+ type: params.type,
39
+ title: params.title,
40
+ message: params.message,
41
+ read: false,
42
+ createdAt: Date.now(),
43
+ taskId: params.taskId,
44
+ cronJobId: params.cronJobId,
45
+ workspaceId: params.workspaceId,
46
+ };
47
+ this.notifications.unshift(notification);
48
+ await this.save();
49
+ this.emit({ type: 'added', notification });
50
+ return notification;
51
+ }
52
+ /**
53
+ * Mark a notification as read
54
+ */
55
+ async markRead(id) {
56
+ const notification = this.notifications.find((n) => n.id === id);
57
+ if (!notification)
58
+ return null;
59
+ notification.read = true;
60
+ await this.save();
61
+ this.emit({ type: 'updated', notification });
62
+ return notification;
63
+ }
64
+ /**
65
+ * Mark all notifications as read
66
+ */
67
+ async markAllRead() {
68
+ const unread = this.notifications.filter((n) => !n.read);
69
+ if (unread.length === 0)
70
+ return;
71
+ for (const n of unread) {
72
+ n.read = true;
73
+ }
74
+ await this.save();
75
+ this.emit({ type: 'updated', notifications: this.notifications });
76
+ }
77
+ /**
78
+ * Delete a notification
79
+ */
80
+ async delete(id) {
81
+ const index = this.notifications.findIndex((n) => n.id === id);
82
+ if (index === -1)
83
+ return false;
84
+ const [removed] = this.notifications.splice(index, 1);
85
+ await this.save();
86
+ this.emit({ type: 'removed', notification: removed });
87
+ return true;
88
+ }
89
+ /**
90
+ * Delete all notifications
91
+ */
92
+ async deleteAll() {
93
+ if (this.notifications.length === 0)
94
+ return;
95
+ this.notifications = [];
96
+ await this.save();
97
+ this.emit({ type: 'cleared' });
98
+ }
99
+ /**
100
+ * Save notifications to disk
101
+ */
102
+ async save() {
103
+ const store = {
104
+ version: 1,
105
+ notifications: this.notifications,
106
+ };
107
+ await (0, store_1.saveNotificationStore)(store, this.storePath);
108
+ }
109
+ /**
110
+ * Emit an event to listeners
111
+ */
112
+ emit(event) {
113
+ if (this.onEvent) {
114
+ this.onEvent(event);
115
+ }
116
+ }
117
+ }
118
+ exports.NotificationService = NotificationService;