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,749 @@
1
+ import type { PersonalityId, PersonaId, EmojiUsage, PersonalityQuirks } from '../../shared/types';
2
+
3
+ /**
4
+ * Message keys used throughout the app
5
+ */
6
+ export type MessageKey =
7
+ | 'welcome'
8
+ | 'welcomeSubtitle'
9
+ | 'placeholder'
10
+ | 'placeholderActive'
11
+ | 'taskStart'
12
+ | 'taskComplete'
13
+ | 'taskWorking'
14
+ | 'taskPaused'
15
+ | 'taskBlocked'
16
+ | 'planCreated'
17
+ | 'stepStarted'
18
+ | 'stepCompleted'
19
+ | 'error'
20
+ | 'approval'
21
+ | 'verifying'
22
+ | 'verifyPassed'
23
+ | 'verifyFailed'
24
+ | 'retrying'
25
+ | 'disclaimer';
26
+
27
+ /**
28
+ * Context for generating personalized messages
29
+ */
30
+ export interface AgentMessageContext {
31
+ agentName: string;
32
+ userName?: string;
33
+ personality: PersonalityId;
34
+ persona?: PersonaId;
35
+ emojiUsage: EmojiUsage;
36
+ quirks: PersonalityQuirks;
37
+ }
38
+
39
+ /**
40
+ * UI copy keys for persona-aware interface text
41
+ */
42
+ export type UiCopyKey =
43
+ | 'taskViewEmptyTitle'
44
+ | 'taskViewEmptyBody'
45
+ | 'taskPromptTitle'
46
+ | 'taskStatusPausedTitle'
47
+ | 'taskStatusBlockedTitle'
48
+ | 'taskStatusBlockedDetail'
49
+ | 'taskStatusResume'
50
+ | 'taskStatusResuming'
51
+ | 'timelineTitle'
52
+ | 'timelineEmpty'
53
+ | 'mcLoading'
54
+ | 'mcTitle'
55
+ | 'mcAgentsActiveLabel'
56
+ | 'mcTasksQueueLabel'
57
+ | 'mcAgentsTitle'
58
+ | 'mcAddAgent'
59
+ | 'mcMissionQueueTitle'
60
+ | 'mcLiveFeedTitle'
61
+ | 'mcAllAgentsLabel'
62
+ | 'mcFeedEmpty'
63
+ | 'mcColumnEmpty'
64
+ | 'mcFilterAll'
65
+ | 'mcFilterTasks'
66
+ | 'mcFilterComments'
67
+ | 'mcFilterStatus'
68
+ | 'mcStatusOnline'
69
+ | 'mcWorkspaceLabel'
70
+ | 'mcMentionsLabel'
71
+ | 'mcStandupButton'
72
+ | 'mcWakeAgent'
73
+ | 'mcNoActiveTask'
74
+ | 'mcTaskTab'
75
+ | 'mcClearTask'
76
+ | 'mcTaskUpdatedAt'
77
+ | 'mcTaskAssigneeLabel'
78
+ | 'mcTaskUnassigned'
79
+ | 'mcTaskStageLabel'
80
+ | 'mcTaskBriefTitle'
81
+ | 'mcTaskUpdatesTitle'
82
+ | 'mcTaskUpdatePlaceholder'
83
+ | 'mcTaskPosting'
84
+ | 'mcTaskPostUpdate'
85
+ | 'mcTaskMentionsTitle'
86
+ | 'mcTaskMentionPlaceholder'
87
+ | 'mcTaskEmpty'
88
+ | 'mcHeartbeatNext'
89
+ | 'mcHeartbeatFound'
90
+ | 'taskBoardEmptyTitle'
91
+ | 'taskBoardEmptyHint'
92
+ | 'rightProgressTitle'
93
+ | 'rightProgressEmptyHint'
94
+ | 'rightQueueTitle'
95
+ | 'rightQueueActiveLabel'
96
+ | 'rightQueueNextLabel'
97
+ | 'rightFilesTitle'
98
+ | 'rightFilesEmptyHint'
99
+ | 'rightContextTitle'
100
+ | 'rightContextEmptyHint'
101
+ | 'rightFooterText'
102
+ | 'workingStateLoading'
103
+ | 'workingStateTitle'
104
+ | 'workingStateEdit'
105
+ | 'workingStateAdd'
106
+ | 'workingStateEmptyHint'
107
+ | 'workingStateReferencedFiles'
108
+ | 'workingStateHistoryTitle'
109
+ | 'workingStateHistoryLoading'
110
+ | 'workingStateHistoryAllTypes'
111
+ | 'workingStateHistoryEntries'
112
+ | 'workingStateHistoryEmpty'
113
+ | 'workingStateHistoryCurrent'
114
+ | 'workingStateHistoryRestore'
115
+ | 'workingStateHistoryRestoring'
116
+ | 'workingStateHistoryDelete'
117
+ | 'workingStateHistoryDeleteConfirm'
118
+ | 'workingStateHistoryFilesLabel'
119
+ | 'standupTitle'
120
+ | 'standupGenerate'
121
+ | 'standupGenerating'
122
+ | 'standupHistoryTitle'
123
+ | 'standupEmpty'
124
+ | 'standupGeneratedAt'
125
+ | 'standupCompletedTitle'
126
+ | 'standupInProgressTitle'
127
+ | 'standupBlockedTitle'
128
+ | 'standupCompletedEmpty'
129
+ | 'standupInProgressEmpty'
130
+ | 'standupBlockedEmpty'
131
+ | 'mcpEmptyTitle'
132
+ | 'mcpEmptyHint'
133
+ | 'scheduledNoWorkspaces'
134
+ | 'standupLoading'
135
+ | 'taskBoardLoading'
136
+ | 'taskBoardTitle'
137
+ | 'taskBoardCount'
138
+ | 'taskBoardAllAgents'
139
+ | 'taskBoardAllLabels'
140
+ | 'taskBoardAllPriorities'
141
+ | 'taskBoardManageLabels'
142
+ | 'activityLoading'
143
+ | 'activityTitle'
144
+ | 'activityMarkAllRead'
145
+ | 'activityAllTypes'
146
+ | 'activityAllActors'
147
+ | 'activityActorAgent'
148
+ | 'activityActorUser'
149
+ | 'activityActorSystem'
150
+ | 'activityUnreadOnly'
151
+ | 'activityPinned'
152
+ | 'activityRecent'
153
+ | 'activityEmptyTitle'
154
+ | 'activityEmptyHint'
155
+ | 'mentionLoading'
156
+ | 'mentionAllStatuses'
157
+ | 'mentionStatusPending'
158
+ | 'mentionStatusAcknowledged'
159
+ | 'mentionStatusCompleted'
160
+ | 'mentionStatusDismissed'
161
+ | 'mentionAllTypes'
162
+ | 'mentionTypeRequest'
163
+ | 'mentionTypeHandoff'
164
+ | 'mentionTypeReview'
165
+ | 'mentionTypeFyi'
166
+ | 'mentionEmpty'
167
+ | 'mentionUser'
168
+ | 'mentionUnknownAgent'
169
+ | 'fileLoading'
170
+ | 'canvasLoading'
171
+ | 'inputPlaceholderQueued';
172
+
173
+ const UI_COPY: Record<UiCopyKey, string> = {
174
+ taskViewEmptyTitle: 'No session selected',
175
+ taskViewEmptyBody: 'Pick a session from the sidebar or start a new one to work together',
176
+ taskPromptTitle: "What We're Working On",
177
+ taskStatusPausedTitle: 'Paused - waiting on your input',
178
+ taskStatusBlockedTitle: 'Blocked - needs approval',
179
+ taskStatusBlockedDetail: 'Approve the pending request to continue.',
180
+ taskStatusResume: 'Resume',
181
+ taskStatusResuming: 'Resuming...',
182
+ timelineTitle: "What We've Done",
183
+ timelineEmpty: 'Nothing happening yet',
184
+ mcLoading: 'Loading Mission Control...',
185
+ mcTitle: 'MISSION CONTROL',
186
+ mcAgentsActiveLabel: 'AGENTS ACTIVE',
187
+ mcTasksQueueLabel: 'TASKS IN QUEUE',
188
+ mcAgentsTitle: 'AGENTS',
189
+ mcAddAgent: 'Add Agent',
190
+ mcMissionQueueTitle: 'MISSION QUEUE',
191
+ mcLiveFeedTitle: 'LIVE FEED',
192
+ mcAllAgentsLabel: 'All Agents',
193
+ mcFeedEmpty: 'No recent activity',
194
+ mcColumnEmpty: 'No tasks',
195
+ mcFilterAll: 'All',
196
+ mcFilterTasks: 'Tasks',
197
+ mcFilterComments: 'Comments',
198
+ mcFilterStatus: 'Status',
199
+ mcStatusOnline: 'ONLINE',
200
+ mcWorkspaceLabel: 'Workspace',
201
+ mcMentionsLabel: 'MENTIONS',
202
+ mcStandupButton: 'Standup',
203
+ mcWakeAgent: 'Wake',
204
+ mcNoActiveTask: 'No active task',
205
+ mcTaskTab: 'TASK',
206
+ mcClearTask: 'Clear',
207
+ mcTaskUpdatedAt: 'Updated {time}',
208
+ mcTaskAssigneeLabel: 'Assignee',
209
+ mcTaskUnassigned: 'Unassigned',
210
+ mcTaskStageLabel: 'Stage',
211
+ mcTaskBriefTitle: 'Brief',
212
+ mcTaskUpdatesTitle: 'Updates',
213
+ mcTaskUpdatePlaceholder: 'Post an update...',
214
+ mcTaskPosting: 'Posting...',
215
+ mcTaskPostUpdate: 'Post Update',
216
+ mcTaskMentionsTitle: 'Mentions',
217
+ mcTaskMentionPlaceholder: 'Type @ to mention an agent...',
218
+ mcTaskEmpty: 'Select a task to view details',
219
+ mcHeartbeatNext: 'next {time}',
220
+ mcHeartbeatFound: 'found {mentions} mentions, {tasks} tasks',
221
+ taskBoardEmptyTitle: 'No tasks',
222
+ taskBoardEmptyHint: 'Drag tasks here',
223
+ rightProgressTitle: 'OUR PROGRESS',
224
+ rightProgressEmptyHint: '# standing by...',
225
+ rightQueueTitle: 'LINEUP',
226
+ rightQueueActiveLabel: '# active:',
227
+ rightQueueNextLabel: '# next up:',
228
+ rightFilesTitle: 'FILES',
229
+ rightFilesEmptyHint: '# no file changes yet',
230
+ rightContextTitle: 'CONTEXT',
231
+ rightContextEmptyHint: '# no context loaded',
232
+ rightFooterText: 'local execution only',
233
+ workingStateLoading: 'Loading working state...',
234
+ workingStateTitle: 'Working State',
235
+ workingStateEdit: 'Edit',
236
+ workingStateAdd: 'Add',
237
+ workingStateEmptyHint: 'No {label} recorded yet.',
238
+ workingStateReferencedFiles: 'Referenced files:',
239
+ workingStateHistoryTitle: 'Working State History',
240
+ workingStateHistoryLoading: 'Loading history...',
241
+ workingStateHistoryAllTypes: 'All Types',
242
+ workingStateHistoryEntries: '{count} entries',
243
+ workingStateHistoryEmpty: 'No history entries found.',
244
+ workingStateHistoryCurrent: 'Current',
245
+ workingStateHistoryRestore: 'Restore',
246
+ workingStateHistoryRestoring: 'Restoring...',
247
+ workingStateHistoryDelete: 'Delete',
248
+ workingStateHistoryDeleteConfirm: 'Delete this history entry?',
249
+ workingStateHistoryFilesLabel: 'Files:',
250
+ standupTitle: 'Daily Standup Reports',
251
+ standupGenerate: 'Generate Report',
252
+ standupGenerating: 'Generating...',
253
+ standupHistoryTitle: 'Report History',
254
+ standupEmpty: 'No reports yet. Generate your first report to get started.',
255
+ standupGeneratedAt: 'Generated at {time}',
256
+ standupCompletedTitle: 'Completed',
257
+ standupInProgressTitle: 'In Progress',
258
+ standupBlockedTitle: 'Blocked',
259
+ standupCompletedEmpty: 'No tasks completed',
260
+ standupInProgressEmpty: 'No tasks in progress',
261
+ standupBlockedEmpty: 'No blocked tasks',
262
+ mcpEmptyTitle: 'No MCP servers configured.',
263
+ mcpEmptyHint: 'Click "Add Server" to connect to an MCP server and extend CoWork\'s capabilities.',
264
+ scheduledNoWorkspaces: 'No workspaces available',
265
+ standupLoading: 'Loading standup reports...',
266
+ taskBoardLoading: 'Loading task board...',
267
+ taskBoardTitle: 'Task Board',
268
+ taskBoardCount: '{count} tasks',
269
+ taskBoardAllAgents: 'All Agents',
270
+ taskBoardAllLabels: 'All Labels',
271
+ taskBoardAllPriorities: 'All Priorities',
272
+ taskBoardManageLabels: 'Manage Labels',
273
+ activityLoading: 'Loading activities...',
274
+ activityTitle: 'Activity',
275
+ activityMarkAllRead: 'Mark all read',
276
+ activityAllTypes: 'All Types',
277
+ activityAllActors: 'All Actors',
278
+ activityActorAgent: 'Agent',
279
+ activityActorUser: 'User',
280
+ activityActorSystem: 'System',
281
+ activityUnreadOnly: 'Unread only',
282
+ activityPinned: 'Pinned',
283
+ activityRecent: 'Recent',
284
+ activityEmptyTitle: 'No activities yet',
285
+ activityEmptyHint: 'Activities will appear here as you work on tasks',
286
+ mentionLoading: 'Loading mentions...',
287
+ mentionAllStatuses: 'All Statuses',
288
+ mentionStatusPending: 'Pending',
289
+ mentionStatusAcknowledged: 'Acknowledged',
290
+ mentionStatusCompleted: 'Completed',
291
+ mentionStatusDismissed: 'Dismissed',
292
+ mentionAllTypes: 'All Types',
293
+ mentionTypeRequest: 'Request',
294
+ mentionTypeHandoff: 'Handoff',
295
+ mentionTypeReview: 'Review',
296
+ mentionTypeFyi: 'FYI',
297
+ mentionEmpty: 'No mentions yet',
298
+ mentionUser: 'User',
299
+ mentionUnknownAgent: 'Unknown Agent',
300
+ fileLoading: 'Loading file...',
301
+ canvasLoading: 'Loading canvas...',
302
+ inputPlaceholderQueued: 'Message queued...',
303
+ };
304
+
305
+ const PERSONA_UI_OVERRIDES: Partial<Record<PersonaId, Partial<Record<UiCopyKey, string>>>> = {
306
+ companion: {
307
+ taskViewEmptyTitle: 'No session selected yet',
308
+ taskViewEmptyBody: "Pick a session from the sidebar or start a new one, and we'll begin.",
309
+ taskPromptTitle: "What we're working on",
310
+ taskStatusPausedTitle: "Paused - I'm waiting on your cue.",
311
+ taskStatusBlockedTitle: 'Blocked - I need your approval.',
312
+ taskStatusBlockedDetail: 'Approve the pending request so I can continue.',
313
+ taskStatusResume: 'Continue',
314
+ taskStatusResuming: 'Continuing...',
315
+ timelineTitle: "What we've done so far",
316
+ timelineEmpty: 'Nothing to show yet',
317
+ mcLoading: 'Getting Mission Control ready...',
318
+ mcAgentsActiveLabel: 'AGENTS ONLINE',
319
+ mcTasksQueueLabel: 'TASKS WAITING',
320
+ mcAddAgent: 'Add agent',
321
+ mcAllAgentsLabel: 'All agents',
322
+ mcFeedEmpty: 'Quiet right now',
323
+ mcColumnEmpty: 'Nothing here yet',
324
+ mcWorkspaceLabel: 'Workspace',
325
+ mcMentionsLabel: 'MENTIONS',
326
+ mcStandupButton: 'Check-in',
327
+ mcWakeAgent: 'Nudge',
328
+ mcNoActiveTask: 'Nothing active yet',
329
+ mcTaskTab: 'TASK',
330
+ mcClearTask: 'Clear',
331
+ mcTaskUpdatedAt: 'Updated {time}',
332
+ mcTaskAssigneeLabel: 'Assignee',
333
+ mcTaskUnassigned: 'Unassigned',
334
+ mcTaskStageLabel: 'Stage',
335
+ mcTaskBriefTitle: 'Brief',
336
+ mcTaskUpdatesTitle: 'Updates',
337
+ mcTaskUpdatePlaceholder: 'Share an update...',
338
+ mcTaskPosting: 'Sending...',
339
+ mcTaskPostUpdate: 'Send update',
340
+ mcTaskMentionsTitle: 'Mentions',
341
+ mcTaskMentionPlaceholder: 'Type @ to loop in an agent...',
342
+ mcTaskEmpty: 'Select a task to see details',
343
+ mcHeartbeatNext: 'next {time}',
344
+ mcHeartbeatFound: 'I found {mentions} mentions, {tasks} tasks',
345
+ taskBoardEmptyTitle: 'No tasks yet',
346
+ taskBoardEmptyHint: 'Drag tasks here when you are ready',
347
+ rightProgressEmptyHint: '# here when you are ready',
348
+ rightFilesEmptyHint: '# nothing changed yet',
349
+ rightContextEmptyHint: '# waiting for context',
350
+ rightFooterText: 'local work only',
351
+ workingStateLoading: 'Getting working state...',
352
+ workingStateTitle: 'Working State',
353
+ workingStateEdit: 'Edit',
354
+ workingStateAdd: 'Add',
355
+ workingStateEmptyHint: 'No {label} yet.',
356
+ workingStateReferencedFiles: 'Referenced files:',
357
+ workingStateHistoryTitle: 'Working State History',
358
+ workingStateHistoryLoading: 'Loading history...',
359
+ workingStateHistoryAllTypes: 'All Types',
360
+ workingStateHistoryEntries: '{count} moments',
361
+ workingStateHistoryEmpty: 'No history entries yet.',
362
+ workingStateHistoryCurrent: 'Current',
363
+ workingStateHistoryRestore: 'Restore',
364
+ workingStateHistoryRestoring: 'Restoring...',
365
+ workingStateHistoryDelete: 'Delete',
366
+ workingStateHistoryDeleteConfirm: 'Delete this history entry?',
367
+ workingStateHistoryFilesLabel: 'Files:',
368
+ standupTitle: 'Daily Standup Reports',
369
+ standupGenerate: 'Generate Report',
370
+ standupGenerating: 'Generating...',
371
+ standupHistoryTitle: 'Report History',
372
+ standupEmpty: 'No reports yet. Generate your first report to get started.',
373
+ standupGeneratedAt: 'Generated at {time}',
374
+ standupCompletedTitle: 'Completed',
375
+ standupInProgressTitle: 'In Progress',
376
+ standupBlockedTitle: 'Blocked',
377
+ standupCompletedEmpty: 'No tasks completed',
378
+ standupInProgressEmpty: 'No tasks in progress',
379
+ standupBlockedEmpty: 'No blocked tasks',
380
+ mcpEmptyTitle: 'No MCP servers configured.',
381
+ mcpEmptyHint: 'Click "Add Server" to connect to an MCP server and extend CoWork\'s capabilities.',
382
+ scheduledNoWorkspaces: 'No workspaces available',
383
+ standupLoading: 'Loading standup reports...',
384
+ taskBoardLoading: 'Getting the board ready...',
385
+ taskBoardTitle: 'Task board',
386
+ taskBoardCount: '{count} tasks',
387
+ taskBoardAllAgents: 'All agents',
388
+ taskBoardAllLabels: 'All labels',
389
+ taskBoardAllPriorities: 'All priorities',
390
+ taskBoardManageLabels: 'Manage labels',
391
+ activityLoading: 'Gathering activity...',
392
+ activityTitle: 'Activity',
393
+ activityMarkAllRead: 'Mark all read',
394
+ activityAllTypes: 'All types',
395
+ activityAllActors: 'All actors',
396
+ activityActorAgent: 'Agent',
397
+ activityActorUser: 'You',
398
+ activityActorSystem: 'System',
399
+ activityUnreadOnly: 'Unread only',
400
+ activityPinned: 'Pinned',
401
+ activityRecent: 'Recent',
402
+ activityEmptyTitle: 'No activity yet',
403
+ activityEmptyHint: 'Activity will appear here as we work',
404
+ mentionLoading: 'Gathering mentions...',
405
+ mentionAllStatuses: 'All statuses',
406
+ mentionStatusPending: 'Pending',
407
+ mentionStatusAcknowledged: 'Acknowledged',
408
+ mentionStatusCompleted: 'Completed',
409
+ mentionStatusDismissed: 'Dismissed',
410
+ mentionAllTypes: 'All types',
411
+ mentionTypeRequest: 'Request',
412
+ mentionTypeHandoff: 'Handoff',
413
+ mentionTypeReview: 'Review',
414
+ mentionTypeFyi: 'FYI',
415
+ mentionEmpty: 'No mentions yet',
416
+ mentionUser: 'User',
417
+ mentionUnknownAgent: 'Unknown agent',
418
+ fileLoading: 'Opening file...',
419
+ canvasLoading: 'Preparing canvas...',
420
+ inputPlaceholderQueued: 'Message queued — I\'ll get to it shortly...',
421
+ },
422
+ };
423
+
424
+ export function getUiCopy(
425
+ key: UiCopyKey,
426
+ ctx: AgentMessageContext,
427
+ replacements: Record<string, string | number> = {}
428
+ ): string {
429
+ const base = UI_COPY[key] || key;
430
+ const override = ctx.persona
431
+ ? PERSONA_UI_OVERRIDES[ctx.persona]?.[key]
432
+ : undefined;
433
+ const template = override || base;
434
+
435
+ if (!template) return key;
436
+
437
+ const userName = ctx.userName || '';
438
+ let result = template
439
+ .replace('{agentName}', ctx.agentName)
440
+ .replace('{userName}', userName);
441
+
442
+ Object.entries(replacements).forEach(([token, value]) => {
443
+ result = result.replace(new RegExp(`\\{${token}\\}`, 'g'), String(value));
444
+ });
445
+
446
+ return result;
447
+ }
448
+
449
+ const PERSONA_MESSAGE_OVERRIDES: Partial<Record<PersonaId, Partial<Record<MessageKey, string>>>> = {
450
+ companion: {
451
+ welcome: '{agentName} here{userGreeting}. I\'m with you.',
452
+ welcomeSubtitle: 'Tell me what you want to make or solve.',
453
+ placeholder: 'What\'s on your mind?',
454
+ placeholderActive: 'What should we do next?',
455
+ taskStart: 'Okay. I\'m starting.',
456
+ taskComplete: 'All set.',
457
+ taskWorking: 'Working on it...',
458
+ taskPaused: 'Paused - I\'m here when you\'re ready.',
459
+ taskBlocked: 'I need your ok to continue.',
460
+ planCreated: 'I sketched a path forward.',
461
+ stepStarted: 'Taking care of: {detail}',
462
+ stepCompleted: 'That step\'s done.',
463
+ error: 'I ran into a snag.',
464
+ approval: 'Can you confirm this for me?',
465
+ verifying: 'Double-checking...',
466
+ verifyPassed: 'Looks good.',
467
+ verifyFailed: 'Not quite right yet.',
468
+ retrying: 'Trying again (attempt {n}).',
469
+ disclaimer: '{agentName} can make mistakes. Please check anything important.',
470
+ },
471
+ };
472
+
473
+ const PERSONA_PLACEHOLDERS: Partial<Record<PersonaId, string[]>> = {
474
+ companion: [
475
+ 'What\'s on your mind?',
476
+ 'Tell me what you want to make.',
477
+ 'How can we move this forward?',
478
+ ],
479
+ };
480
+
481
+ /**
482
+ * Message templates organized by personality type
483
+ */
484
+ const MESSAGES: Record<PersonalityId, Record<MessageKey, string>> = {
485
+ professional: {
486
+ welcome: '{agentName} ready{userGreeting}.',
487
+ welcomeSubtitle: 'How can I assist you today?',
488
+ placeholder: 'What can I help with?',
489
+ placeholderActive: 'Next task?',
490
+ taskStart: 'Beginning task.',
491
+ taskComplete: 'Complete.',
492
+ taskWorking: 'Processing...',
493
+ taskPaused: 'Paused.',
494
+ taskBlocked: 'Needs approval.',
495
+ planCreated: 'Strategy prepared.',
496
+ stepStarted: 'Working on: {detail}',
497
+ stepCompleted: 'Step complete.',
498
+ error: 'Issue encountered.',
499
+ approval: 'Decision required.',
500
+ verifying: 'Verifying...',
501
+ verifyPassed: 'Verification passed.',
502
+ verifyFailed: 'Verification failed.',
503
+ retrying: 'Retrying (attempt {n}).',
504
+ disclaimer: '{agentName} can make mistakes. Please verify important information.',
505
+ },
506
+ friendly: {
507
+ welcome: 'Hey{userGreeting}! {agentName} here.',
508
+ welcomeSubtitle: "What should we work on?",
509
+ placeholder: "What's up?",
510
+ placeholderActive: "What's next?",
511
+ taskStart: "Let's do this!",
512
+ taskComplete: 'Done! Nice work.',
513
+ taskWorking: 'On it...',
514
+ taskPaused: 'Paused for now.',
515
+ taskBlocked: 'Need your approval.',
516
+ planCreated: "Here's the plan!",
517
+ stepStarted: 'Tackling: {detail}',
518
+ stepCompleted: 'Got it!',
519
+ error: 'Oops, hit a snag.',
520
+ approval: 'Need your input!',
521
+ verifying: 'Checking our work...',
522
+ verifyPassed: 'Looks good!',
523
+ verifyFailed: 'Not quite right.',
524
+ retrying: 'Trying again (#{n}).',
525
+ disclaimer: '{agentName} can make mistakes. Double-check anything important!',
526
+ },
527
+ concise: {
528
+ welcome: '{agentName} ready{userGreeting}.',
529
+ welcomeSubtitle: 'Ready.',
530
+ placeholder: 'Task?',
531
+ placeholderActive: 'Next?',
532
+ taskStart: 'Starting.',
533
+ taskComplete: 'Done.',
534
+ taskWorking: 'Working...',
535
+ taskPaused: 'Paused.',
536
+ taskBlocked: 'Blocked.',
537
+ planCreated: 'Plan ready.',
538
+ stepStarted: '{detail}',
539
+ stepCompleted: 'Done.',
540
+ error: 'Error.',
541
+ approval: 'Input needed.',
542
+ verifying: 'Checking...',
543
+ verifyPassed: 'Passed.',
544
+ verifyFailed: 'Failed.',
545
+ retrying: 'Retry #{n}.',
546
+ disclaimer: '{agentName} may err. Verify.',
547
+ },
548
+ creative: {
549
+ welcome: '{agentName} awakens{userGreeting}.',
550
+ welcomeSubtitle: "Let's create something amazing.",
551
+ placeholder: 'What shall we dream up?',
552
+ placeholderActive: 'What adventure awaits?',
553
+ taskStart: 'The journey begins!',
554
+ taskComplete: 'Masterpiece complete.',
555
+ taskWorking: 'Crafting magic...',
556
+ taskPaused: 'Time stands still.',
557
+ taskBlocked: 'A gate awaits your key.',
558
+ planCreated: 'The blueprint emerges.',
559
+ stepStarted: 'Weaving: {detail}',
560
+ stepCompleted: 'Another piece falls into place.',
561
+ error: 'A twist in the tale.',
562
+ approval: 'Your vision is needed.',
563
+ verifying: 'Admiring our work...',
564
+ verifyPassed: 'It shines!',
565
+ verifyFailed: 'Needs refinement.',
566
+ retrying: 'A fresh canvas (take {n}).',
567
+ disclaimer: '{agentName} is creative, not infallible. Verify the important bits.',
568
+ },
569
+ technical: {
570
+ welcome: '{agentName} online{userGreeting}.',
571
+ welcomeSubtitle: 'Awaiting input.',
572
+ placeholder: 'Enter command.',
573
+ placeholderActive: 'Next command.',
574
+ taskStart: 'Initiating.',
575
+ taskComplete: 'Execution complete.',
576
+ taskWorking: 'Processing...',
577
+ taskPaused: 'Paused.',
578
+ taskBlocked: 'Blocked: approval required.',
579
+ planCreated: 'Execution plan generated.',
580
+ stepStarted: 'Executing: {detail}',
581
+ stepCompleted: 'Step executed.',
582
+ error: 'Error encountered.',
583
+ approval: 'Awaiting user input.',
584
+ verifying: 'Running verification...',
585
+ verifyPassed: 'Verification: PASS.',
586
+ verifyFailed: 'Verification: FAIL.',
587
+ retrying: 'Retry attempt {n}.',
588
+ disclaimer: '{agentName} output may contain errors. Validate critical data.',
589
+ },
590
+ casual: {
591
+ welcome: "Yo{userGreeting}! {agentName} here.",
592
+ welcomeSubtitle: "What's the plan?",
593
+ placeholder: 'So, what are we doing?',
594
+ placeholderActive: 'And then?',
595
+ taskStart: 'Alright, here we go.',
596
+ taskComplete: 'Nailed it.',
597
+ taskWorking: 'Doing the thing...',
598
+ taskPaused: 'Paused for now.',
599
+ taskBlocked: 'Need your ok.',
600
+ planCreated: 'Got a game plan.',
601
+ stepStarted: 'On it: {detail}',
602
+ stepCompleted: 'Check.',
603
+ error: 'Uh oh.',
604
+ approval: 'Your call.',
605
+ verifying: 'Just checking...',
606
+ verifyPassed: 'We good.',
607
+ verifyFailed: 'Hmm, not quite.',
608
+ retrying: 'Round {n}, fight!',
609
+ disclaimer: "{agentName} isn't perfect. Double-check the important stuff.",
610
+ },
611
+ custom: {
612
+ welcome: '{agentName} ready{userGreeting}.',
613
+ welcomeSubtitle: 'What should we work on?',
614
+ placeholder: 'What should we work on?',
615
+ placeholderActive: "What's next?",
616
+ taskStart: 'Starting.',
617
+ taskComplete: 'Done.',
618
+ taskWorking: 'Working...',
619
+ taskPaused: 'Paused.',
620
+ taskBlocked: 'Needs approval.',
621
+ planCreated: 'Plan ready.',
622
+ stepStarted: 'Working on: {detail}',
623
+ stepCompleted: 'Step complete.',
624
+ error: 'Issue encountered.',
625
+ approval: 'Input needed.',
626
+ verifying: 'Verifying...',
627
+ verifyPassed: 'Passed.',
628
+ verifyFailed: 'Failed.',
629
+ retrying: 'Retrying ({n}).',
630
+ disclaimer: '{agentName} can make mistakes. Please verify important information.',
631
+ },
632
+ };
633
+
634
+ /**
635
+ * Add emoji based on emojiUsage setting
636
+ */
637
+ function addEmoji(message: string, key: MessageKey, emojiUsage: EmojiUsage): string {
638
+ if (emojiUsage === 'none') return message;
639
+
640
+ const emojiMap: Partial<Record<MessageKey, string>> = {
641
+ taskComplete: '✓',
642
+ error: '⚠',
643
+ approval: '❓',
644
+ verifyPassed: '✓',
645
+ verifyFailed: '✗',
646
+ };
647
+
648
+ const emoji = emojiMap[key];
649
+ if (!emoji) return message;
650
+
651
+ // For minimal, only add checkmarks
652
+ if (emojiUsage === 'minimal' && !['taskComplete', 'verifyPassed', 'stepCompleted'].includes(key)) {
653
+ return message;
654
+ }
655
+
656
+ return `${emoji} ${message}`;
657
+ }
658
+
659
+ /**
660
+ * Get a personalized message
661
+ */
662
+ export function getMessage(
663
+ key: MessageKey,
664
+ ctx: AgentMessageContext,
665
+ detail?: string
666
+ ): string {
667
+ const { agentName, userName, personality, emojiUsage, quirks, persona } = ctx;
668
+
669
+ // Get base message for personality
670
+ const messages = MESSAGES[personality] || MESSAGES.professional;
671
+ let message = messages[key] || MESSAGES.professional[key] || key;
672
+
673
+ // Apply persona override if available
674
+ if (persona) {
675
+ const personaOverrides = PERSONA_MESSAGE_OVERRIDES[persona];
676
+ if (personaOverrides?.[key]) {
677
+ message = personaOverrides[key] as string;
678
+ }
679
+ }
680
+
681
+ // Replace placeholders
682
+ const userGreeting = userName ? `, ${userName}` : '';
683
+ message = message
684
+ .replace('{agentName}', agentName)
685
+ .replace('{userGreeting}', userGreeting)
686
+ .replace('{detail}', detail || '')
687
+ .replace('{n}', detail || '1');
688
+
689
+ // Add emoji if appropriate
690
+ message = addEmoji(message, key, emojiUsage);
691
+
692
+ // Add catchphrase to welcome
693
+ if (key === 'welcomeSubtitle' && quirks.catchphrase) {
694
+ message = `${message} ${quirks.catchphrase}`;
695
+ }
696
+
697
+ // Add sign-off to completion
698
+ if (key === 'taskComplete' && quirks.signOff) {
699
+ message = `${message} ${quirks.signOff}`;
700
+ }
701
+
702
+ return message;
703
+ }
704
+
705
+ /**
706
+ * Get a random placeholder from personality-appropriate options
707
+ */
708
+ export function getRandomPlaceholder(ctx: AgentMessageContext): string {
709
+ const { personality, userName, agentName, persona } = ctx;
710
+
711
+ const placeholders: Record<PersonalityId, string[]> = {
712
+ professional: [
713
+ 'What can I help with?',
714
+ 'How may I assist?',
715
+ `${agentName} standing by.`,
716
+ ],
717
+ friendly: [
718
+ "What's on your mind?",
719
+ "What's up?",
720
+ 'Ready when you are!',
721
+ userName ? `What's next, ${userName}?` : "What's next?",
722
+ ],
723
+ concise: ['Task?', 'Input?', 'Next?'],
724
+ creative: [
725
+ 'What shall we create?',
726
+ 'What adventure awaits?',
727
+ "Let's make something.",
728
+ ],
729
+ technical: ['Enter command.', 'Awaiting input.', `${agentName} ready.`],
730
+ casual: [
731
+ "So what's the plan?",
732
+ 'What are we doing?',
733
+ userName ? `What's up, ${userName}?` : "What's up?",
734
+ ],
735
+ custom: ['What should we work on?', "What's next?", `${agentName} ready.`],
736
+ };
737
+
738
+ const personaOptions = (persona && PERSONA_PLACEHOLDERS[persona]) || [];
739
+ const options = personaOptions.length > 0
740
+ ? [...personaOptions]
741
+ : (placeholders[personality] || placeholders.professional);
742
+
743
+ if (persona === 'companion' && userName) {
744
+ options.push(`What's next, ${userName}?`);
745
+ }
746
+ return options[Math.floor(Math.random() * options.length)];
747
+ }
748
+
749
+ export default getMessage;