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,657 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAIProvider = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const pi_ai_1 = require("@mariozechner/pi-ai");
9
+ const openai_oauth_1 = require("./openai-oauth");
10
+ // Default model for openai-codex (ChatGPT backend)
11
+ const DEFAULT_CODEX_MODEL = 'gpt-5.1-codex-mini';
12
+ /**
13
+ * OpenAI API provider implementation
14
+ * Supports both API key and OAuth token authentication
15
+ * - API Key: Uses OpenAI SDK directly with api.openai.com
16
+ * - OAuth: Uses pi-ai SDK with ChatGPT backend (chatgpt.com/backend-api/)
17
+ */
18
+ class OpenAIProvider {
19
+ constructor(config) {
20
+ this.type = 'openai';
21
+ this.client = null;
22
+ const apiKey = config.openaiApiKey;
23
+ const accessToken = config.openaiAccessToken;
24
+ const refreshToken = config.openaiRefreshToken;
25
+ const tokenExpiresAt = config.openaiTokenExpiresAt;
26
+ this.model = config.model;
27
+ if (accessToken && refreshToken) {
28
+ // Use OAuth - will use pi-ai SDK for API calls
29
+ this.oauthTokens = {
30
+ access_token: accessToken,
31
+ refresh_token: refreshToken,
32
+ expires_at: tokenExpiresAt || 0, // Use stored expiry or 0 if not available
33
+ };
34
+ this.authMethod = 'oauth';
35
+ console.log(`[OpenAI] Using OAuth authentication with pi-ai SDK (token expires: ${tokenExpiresAt ? new Date(tokenExpiresAt).toISOString() : 'unknown'})`);
36
+ }
37
+ else if (apiKey) {
38
+ // Use API key - standard OpenAI SDK
39
+ this.client = new openai_1.default({ apiKey });
40
+ this.authMethod = 'api_key';
41
+ console.log('[OpenAI] Using API key authentication');
42
+ }
43
+ else {
44
+ throw new Error('OpenAI authentication required. Use API key or sign in with ChatGPT.');
45
+ }
46
+ }
47
+ async createMessage(request) {
48
+ if (this.authMethod === 'oauth') {
49
+ return this.createMessageWithOAuth(request);
50
+ }
51
+ else {
52
+ return this.createMessageWithApiKey(request);
53
+ }
54
+ }
55
+ /**
56
+ * Create message using API key (standard OpenAI SDK)
57
+ */
58
+ async createMessageWithApiKey(request) {
59
+ if (!this.client) {
60
+ throw new Error('OpenAI client not initialized');
61
+ }
62
+ const messages = this.convertMessages(request.messages, request.system);
63
+ const tools = request.tools ? this.convertTools(request.tools) : undefined;
64
+ try {
65
+ console.log(`[OpenAI] Calling API with model: ${request.model}`);
66
+ const response = await this.client.chat.completions.create({
67
+ model: request.model,
68
+ max_tokens: request.maxTokens,
69
+ messages,
70
+ ...(tools && tools.length > 0 && { tools }),
71
+ }, request.signal ? { signal: request.signal } : undefined);
72
+ return this.convertResponse(response);
73
+ }
74
+ catch (error) {
75
+ // Handle abort errors gracefully
76
+ if (error.name === 'AbortError' || error.message?.includes('aborted')) {
77
+ console.log(`[OpenAI] Request aborted`);
78
+ throw new Error('Request cancelled');
79
+ }
80
+ console.error(`[OpenAI] API error:`, {
81
+ status: error.status,
82
+ message: error.message,
83
+ type: error.type || error.name,
84
+ });
85
+ throw error;
86
+ }
87
+ }
88
+ /**
89
+ * Map public model names to openai-codex model IDs
90
+ */
91
+ mapToCodexModel(modelId) {
92
+ // Map common public model names to ChatGPT internal models
93
+ const modelMap = {
94
+ // Map gpt-4o models to gpt-5.1
95
+ 'gpt-4o': 'gpt-5.1',
96
+ 'gpt-4o-mini': 'gpt-5.1-codex-mini',
97
+ // Map o1/reasoning models to gpt-5.2
98
+ 'o1': 'gpt-5.2',
99
+ 'o1-mini': 'gpt-5.2-codex',
100
+ 'o1-preview': 'gpt-5.2',
101
+ // Default mappings
102
+ 'gpt-4-turbo': 'gpt-5.1',
103
+ 'gpt-4': 'gpt-5.1',
104
+ 'gpt-3.5-turbo': 'gpt-5.1-codex-mini',
105
+ };
106
+ return modelMap[modelId] || modelId;
107
+ }
108
+ /**
109
+ * Create message using OAuth (pi-ai SDK with ChatGPT backend)
110
+ */
111
+ async createMessageWithOAuth(request) {
112
+ if (!this.oauthTokens) {
113
+ throw new Error('OAuth tokens not available');
114
+ }
115
+ try {
116
+ // Map model ID to ChatGPT internal model
117
+ const codexModelId = this.mapToCodexModel(request.model);
118
+ console.log(`[OpenAI] Calling ChatGPT backend with model: ${codexModelId} (requested: ${request.model})`);
119
+ // Get the model object from pi-ai SDK
120
+ let model;
121
+ try {
122
+ // Get available models and find one that matches
123
+ const availableModels = (0, pi_ai_1.getModels)('openai-codex');
124
+ const found = availableModels.find(m => m.id === codexModelId);
125
+ if (found) {
126
+ model = found;
127
+ }
128
+ else {
129
+ // Use default if not found
130
+ console.log(`[OpenAI] Model ${codexModelId} not found, using default: ${DEFAULT_CODEX_MODEL}`);
131
+ model = availableModels.find(m => m.id === DEFAULT_CODEX_MODEL) || availableModels[0];
132
+ }
133
+ }
134
+ catch (e) {
135
+ console.error('[OpenAI] Failed to get model from pi-ai SDK:', e);
136
+ throw new Error(`Model not available: ${codexModelId}`);
137
+ }
138
+ // Convert messages to pi-ai format
139
+ const piAiMessages = this.convertMessagesToPiAi(request.messages);
140
+ // Convert tools to pi-ai format
141
+ const piAiTools = request.tools ? this.convertToolsToPiAi(request.tools) : undefined;
142
+ // Get API key from OAuth tokens (with auto-refresh)
143
+ const { apiKey, newTokens } = await openai_oauth_1.OpenAIOAuth.getApiKeyFromTokens(this.oauthTokens);
144
+ // Update tokens if they were refreshed
145
+ if (newTokens) {
146
+ this.oauthTokens = newTokens;
147
+ }
148
+ // Build context
149
+ const context = {
150
+ systemPrompt: request.system,
151
+ messages: piAiMessages,
152
+ tools: piAiTools,
153
+ };
154
+ // Make the API call using pi-ai SDK
155
+ const response = await (0, pi_ai_1.complete)(model, context, {
156
+ apiKey,
157
+ maxTokens: request.maxTokens,
158
+ signal: request.signal,
159
+ });
160
+ // Convert pi-ai response to our format
161
+ return this.convertPiAiResponse(response);
162
+ }
163
+ catch (error) {
164
+ // Handle abort errors gracefully
165
+ if (error.name === 'AbortError' || error.message?.includes('aborted')) {
166
+ console.log(`[OpenAI] Request aborted`);
167
+ throw new Error('Request cancelled');
168
+ }
169
+ console.error(`[OpenAI] ChatGPT API error:`, {
170
+ message: error.message,
171
+ type: error.type || error.name,
172
+ });
173
+ throw error;
174
+ }
175
+ }
176
+ async testConnection() {
177
+ try {
178
+ if (this.authMethod === 'oauth') {
179
+ // For OAuth, try to get the API key and make a simple request
180
+ if (!this.oauthTokens) {
181
+ return { success: false, error: 'OAuth tokens not available' };
182
+ }
183
+ const { apiKey } = await openai_oauth_1.OpenAIOAuth.getApiKeyFromTokens(this.oauthTokens);
184
+ // Get a model from the available models
185
+ const availableModels = (0, pi_ai_1.getModels)('openai-codex');
186
+ const model = availableModels.find(m => m.id === DEFAULT_CODEX_MODEL) || availableModels[0];
187
+ await (0, pi_ai_1.complete)(model, {
188
+ messages: [{
189
+ role: 'user',
190
+ content: [{ type: 'text', text: 'Hi' }],
191
+ timestamp: Date.now(),
192
+ }],
193
+ }, { apiKey, maxTokens: 10 });
194
+ return { success: true };
195
+ }
196
+ else {
197
+ // For API key, use standard OpenAI SDK
198
+ if (!this.client) {
199
+ return { success: false, error: 'OpenAI client not initialized' };
200
+ }
201
+ await this.client.chat.completions.create({
202
+ model: 'gpt-4o-mini',
203
+ max_tokens: 10,
204
+ messages: [{ role: 'user', content: 'Hi' }],
205
+ });
206
+ return { success: true };
207
+ }
208
+ }
209
+ catch (error) {
210
+ return {
211
+ success: false,
212
+ error: error.message || 'Failed to connect to OpenAI API',
213
+ };
214
+ }
215
+ }
216
+ /**
217
+ * Get available models
218
+ * For API key: uses the models.list API
219
+ * For OAuth: uses pi-ai SDK's model list for openai-codex provider
220
+ */
221
+ async getAvailableModels() {
222
+ // For OAuth authentication, use pi-ai SDK's model list
223
+ if (this.authMethod === 'oauth') {
224
+ console.log('[OpenAI] Using OAuth - fetching models from pi-ai SDK...');
225
+ try {
226
+ // Get models from pi-ai SDK for openai-codex provider
227
+ const piAiModels = (0, pi_ai_1.getModels)('openai-codex');
228
+ const models = piAiModels.map((m) => ({
229
+ id: m.id,
230
+ name: m.name || this.formatModelName(m.id),
231
+ description: this.getModelDescription(m.id),
232
+ }));
233
+ // Sort by priority
234
+ models.sort((a, b) => {
235
+ const priority = (id) => {
236
+ if (id.includes('5.1-codex-mini'))
237
+ return 0;
238
+ if (id.includes('5.1-codex-max'))
239
+ return 1;
240
+ if (id === 'gpt-5.1')
241
+ return 2;
242
+ if (id.includes('5.2-codex'))
243
+ return 3;
244
+ if (id === 'gpt-5.2')
245
+ return 4;
246
+ return 5;
247
+ };
248
+ return priority(a.id) - priority(b.id);
249
+ });
250
+ console.log(`[OpenAI] Found ${models.length} models via pi-ai SDK`);
251
+ return models;
252
+ }
253
+ catch (error) {
254
+ console.error('[OpenAI] Failed to get models from pi-ai SDK:', error);
255
+ // Return defaults on error
256
+ return this.getDefaultCodexModels();
257
+ }
258
+ }
259
+ // For API key authentication, use the standard models list API
260
+ if (this.client) {
261
+ try {
262
+ const response = await this.client.models.list();
263
+ const models = response.data
264
+ .filter((m) => m.id.startsWith('gpt-') || m.id.startsWith('o1') || m.id.startsWith('o3'))
265
+ .map((m) => ({
266
+ id: m.id,
267
+ name: this.formatModelName(m.id),
268
+ description: this.getModelDescription(m.id),
269
+ }))
270
+ .sort((a, b) => {
271
+ const priority = (id) => {
272
+ if (id.includes('gpt-4o'))
273
+ return 0;
274
+ if (id.includes('gpt-4'))
275
+ return 1;
276
+ if (id.includes('gpt-3.5'))
277
+ return 2;
278
+ if (id.includes('o1'))
279
+ return 3;
280
+ if (id.includes('o3'))
281
+ return 4;
282
+ return 5;
283
+ };
284
+ return priority(a.id) - priority(b.id);
285
+ });
286
+ return models;
287
+ }
288
+ catch (error) {
289
+ console.error('Failed to fetch OpenAI models:', error);
290
+ }
291
+ }
292
+ // Return defaults if nothing else works
293
+ return this.getDefaultModels();
294
+ }
295
+ getDefaultModels() {
296
+ return [
297
+ { id: 'gpt-4o', name: 'GPT-4o', description: 'Most capable model for complex tasks' },
298
+ { id: 'gpt-4o-mini', name: 'GPT-4o Mini', description: 'Fast and affordable for most tasks' },
299
+ { id: 'o1', name: 'o1', description: 'Advanced reasoning model' },
300
+ { id: 'o1-mini', name: 'o1 Mini', description: 'Fast reasoning model' },
301
+ { id: 'gpt-4-turbo', name: 'GPT-4 Turbo', description: 'Previous generation flagship' },
302
+ { id: 'gpt-3.5-turbo', name: 'GPT-3.5 Turbo', description: 'Fast and cost-effective' },
303
+ ];
304
+ }
305
+ getDefaultCodexModels() {
306
+ return [
307
+ { id: 'gpt-5.1-codex-mini', name: 'GPT-5.1 Codex Mini', description: 'Fast and efficient for most tasks' },
308
+ { id: 'gpt-5.1-codex-max', name: 'GPT-5.1 Codex Max', description: 'Maximum capability for complex tasks' },
309
+ { id: 'gpt-5.1', name: 'GPT-5.1', description: 'Balanced performance and capability' },
310
+ { id: 'gpt-5.2-codex', name: 'GPT-5.2 Codex', description: 'Advanced reasoning model' },
311
+ { id: 'gpt-5.2', name: 'GPT-5.2', description: 'Most advanced reasoning' },
312
+ ];
313
+ }
314
+ formatModelName(modelId) {
315
+ // Format model ID to display name
316
+ if (modelId === 'gpt-4o')
317
+ return 'GPT-4o';
318
+ if (modelId === 'gpt-4o-mini')
319
+ return 'GPT-4o Mini';
320
+ if (modelId.includes('gpt-4o-'))
321
+ return `GPT-4o (${modelId.replace('gpt-4o-', '')})`;
322
+ if (modelId === 'gpt-4-turbo')
323
+ return 'GPT-4 Turbo';
324
+ if (modelId.includes('gpt-4-turbo-'))
325
+ return `GPT-4 Turbo (${modelId.replace('gpt-4-turbo-', '')})`;
326
+ if (modelId === 'gpt-4')
327
+ return 'GPT-4';
328
+ if (modelId.includes('gpt-4-'))
329
+ return `GPT-4 (${modelId.replace('gpt-4-', '')})`;
330
+ if (modelId === 'gpt-3.5-turbo')
331
+ return 'GPT-3.5 Turbo';
332
+ if (modelId.includes('gpt-3.5-turbo-'))
333
+ return `GPT-3.5 Turbo (${modelId.replace('gpt-3.5-turbo-', '')})`;
334
+ if (modelId === 'o1')
335
+ return 'o1';
336
+ if (modelId === 'o1-mini')
337
+ return 'o1 Mini';
338
+ if (modelId === 'o1-preview')
339
+ return 'o1 Preview';
340
+ if (modelId === 'o3-mini')
341
+ return 'o3 Mini';
342
+ // ChatGPT internal models
343
+ if (modelId === 'gpt-5.1')
344
+ return 'GPT-5.1';
345
+ if (modelId === 'gpt-5.1-codex-mini')
346
+ return 'GPT-5.1 Codex Mini';
347
+ if (modelId === 'gpt-5.1-codex-max')
348
+ return 'GPT-5.1 Codex Max';
349
+ if (modelId === 'gpt-5.2')
350
+ return 'GPT-5.2';
351
+ if (modelId === 'gpt-5.2-codex')
352
+ return 'GPT-5.2 Codex';
353
+ return modelId;
354
+ }
355
+ getModelDescription(modelId) {
356
+ if (modelId.includes('gpt-4o') && !modelId.includes('mini'))
357
+ return 'Most capable model for complex tasks';
358
+ if (modelId.includes('gpt-4o-mini'))
359
+ return 'Fast and affordable for most tasks';
360
+ if (modelId.includes('gpt-4-turbo'))
361
+ return 'Previous generation flagship';
362
+ if (modelId.includes('gpt-4'))
363
+ return 'High capability model';
364
+ if (modelId.includes('gpt-3.5'))
365
+ return 'Fast and cost-effective';
366
+ if (modelId === 'o1' || modelId === 'o1-preview')
367
+ return 'Advanced reasoning model';
368
+ if (modelId === 'o1-mini')
369
+ return 'Fast reasoning model';
370
+ if (modelId.includes('o3'))
371
+ return 'Next generation reasoning';
372
+ // ChatGPT internal models
373
+ if (modelId === 'gpt-5.1')
374
+ return 'Balanced performance and capability';
375
+ if (modelId === 'gpt-5.1-codex-mini')
376
+ return 'Fast and efficient for most tasks';
377
+ if (modelId === 'gpt-5.1-codex-max')
378
+ return 'Maximum capability for complex tasks';
379
+ if (modelId === 'gpt-5.2')
380
+ return 'Most advanced reasoning';
381
+ if (modelId === 'gpt-5.2-codex')
382
+ return 'Advanced reasoning model';
383
+ return 'OpenAI model';
384
+ }
385
+ /**
386
+ * Convert messages to pi-ai SDK format
387
+ */
388
+ convertMessagesToPiAi(messages) {
389
+ const result = [];
390
+ const now = Date.now();
391
+ for (const msg of messages) {
392
+ if (typeof msg.content === 'string') {
393
+ if (msg.role === 'user') {
394
+ result.push({
395
+ role: 'user',
396
+ content: [{ type: 'text', text: msg.content }],
397
+ timestamp: now,
398
+ });
399
+ }
400
+ else {
401
+ // Assistant message
402
+ result.push({
403
+ role: 'assistant',
404
+ content: [{ type: 'text', text: msg.content }],
405
+ api: 'openai-codex-responses',
406
+ provider: 'openai-codex',
407
+ model: this.model,
408
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
409
+ stopReason: 'stop',
410
+ timestamp: now,
411
+ });
412
+ }
413
+ }
414
+ else if (Array.isArray(msg.content)) {
415
+ // Check if this is a tool result array
416
+ const toolResults = msg.content.filter((item) => item.type === 'tool_result');
417
+ if (toolResults.length > 0) {
418
+ // Convert tool results to pi-ai format
419
+ for (const toolResult of toolResults) {
420
+ result.push({
421
+ role: 'toolResult',
422
+ toolCallId: toolResult.tool_use_id,
423
+ toolName: '', // Will be filled by the SDK
424
+ content: [{ type: 'text', text: toolResult.content }],
425
+ isError: toolResult.is_error || false,
426
+ timestamp: now,
427
+ });
428
+ }
429
+ }
430
+ else {
431
+ // Handle mixed content (text and tool_use)
432
+ if (msg.role === 'user') {
433
+ const textContent = msg.content
434
+ .filter((item) => item.type === 'text')
435
+ .map((item) => ({ type: 'text', text: item.text }));
436
+ if (textContent.length > 0) {
437
+ result.push({
438
+ role: 'user',
439
+ content: textContent,
440
+ timestamp: now,
441
+ });
442
+ }
443
+ }
444
+ else {
445
+ // Assistant message with tool calls
446
+ const content = [];
447
+ for (const item of msg.content) {
448
+ if (item.type === 'text') {
449
+ content.push({ type: 'text', text: item.text });
450
+ }
451
+ else if (item.type === 'tool_use') {
452
+ content.push({
453
+ type: 'toolCall',
454
+ id: item.id,
455
+ name: item.name,
456
+ arguments: item.input,
457
+ });
458
+ }
459
+ }
460
+ if (content.length > 0) {
461
+ result.push({
462
+ role: 'assistant',
463
+ content,
464
+ api: 'openai-codex-responses',
465
+ provider: 'openai-codex',
466
+ model: this.model,
467
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
468
+ stopReason: 'stop',
469
+ timestamp: now,
470
+ });
471
+ }
472
+ }
473
+ }
474
+ }
475
+ }
476
+ return result;
477
+ }
478
+ /**
479
+ * Convert tools to pi-ai SDK format
480
+ */
481
+ convertToolsToPiAi(tools) {
482
+ return tools.map((tool) => ({
483
+ name: tool.name,
484
+ description: tool.description,
485
+ parameters: tool.input_schema,
486
+ }));
487
+ }
488
+ /**
489
+ * Convert pi-ai response to our format
490
+ */
491
+ convertPiAiResponse(response) {
492
+ const content = [];
493
+ if (response.content) {
494
+ for (const block of response.content) {
495
+ if (block.type === 'text') {
496
+ content.push({
497
+ type: 'text',
498
+ text: block.text,
499
+ });
500
+ }
501
+ else if (block.type === 'toolCall') {
502
+ content.push({
503
+ type: 'tool_use',
504
+ id: block.id,
505
+ name: block.name,
506
+ input: block.arguments || {},
507
+ });
508
+ }
509
+ }
510
+ }
511
+ // Map stop reason
512
+ let stopReason = 'end_turn';
513
+ if (response.stopReason === 'toolUse') {
514
+ stopReason = 'tool_use';
515
+ }
516
+ else if (response.stopReason === 'length') {
517
+ stopReason = 'max_tokens';
518
+ }
519
+ return {
520
+ content,
521
+ stopReason,
522
+ usage: response.usage
523
+ ? {
524
+ inputTokens: response.usage.input || 0,
525
+ outputTokens: response.usage.output || 0,
526
+ }
527
+ : undefined,
528
+ };
529
+ }
530
+ /**
531
+ * Convert messages to OpenAI format (for API key auth)
532
+ */
533
+ convertMessages(messages, system) {
534
+ const result = [];
535
+ // Add system message first if provided
536
+ if (system) {
537
+ result.push({
538
+ role: 'system',
539
+ content: system,
540
+ });
541
+ }
542
+ for (const msg of messages) {
543
+ if (typeof msg.content === 'string') {
544
+ result.push({
545
+ role: msg.role,
546
+ content: msg.content,
547
+ });
548
+ }
549
+ else if (Array.isArray(msg.content)) {
550
+ // Check if this is a tool result array
551
+ const toolResults = msg.content.filter((item) => item.type === 'tool_result');
552
+ if (toolResults.length > 0) {
553
+ // Convert tool results to OpenAI format
554
+ for (const toolResult of toolResults) {
555
+ result.push({
556
+ role: 'tool',
557
+ tool_call_id: toolResult.tool_use_id,
558
+ content: toolResult.content,
559
+ });
560
+ }
561
+ }
562
+ else {
563
+ // Handle mixed content (text and tool_use)
564
+ const textContent = msg.content
565
+ .filter((item) => item.type === 'text')
566
+ .map((item) => item.text)
567
+ .join('\n');
568
+ const toolUses = msg.content.filter((item) => item.type === 'tool_use');
569
+ if (msg.role === 'assistant') {
570
+ const assistantMsg = {
571
+ role: 'assistant',
572
+ content: textContent || null,
573
+ };
574
+ if (toolUses.length > 0) {
575
+ assistantMsg.tool_calls = toolUses.map((tool) => ({
576
+ id: tool.id,
577
+ type: 'function',
578
+ function: {
579
+ name: tool.name,
580
+ arguments: JSON.stringify(tool.input),
581
+ },
582
+ }));
583
+ }
584
+ result.push(assistantMsg);
585
+ }
586
+ else {
587
+ result.push({
588
+ role: msg.role,
589
+ content: textContent,
590
+ });
591
+ }
592
+ }
593
+ }
594
+ }
595
+ return result;
596
+ }
597
+ convertTools(tools) {
598
+ return tools.map((tool) => ({
599
+ type: 'function',
600
+ function: {
601
+ name: tool.name,
602
+ description: tool.description,
603
+ parameters: tool.input_schema,
604
+ },
605
+ }));
606
+ }
607
+ convertResponse(response) {
608
+ const choice = response.choices[0];
609
+ const content = [];
610
+ // Add text content if present
611
+ if (choice.message.content) {
612
+ content.push({
613
+ type: 'text',
614
+ text: choice.message.content,
615
+ });
616
+ }
617
+ // Add tool calls if present
618
+ if (choice.message.tool_calls) {
619
+ for (const toolCall of choice.message.tool_calls) {
620
+ // Only handle function-type tool calls
621
+ if (toolCall.type === 'function') {
622
+ content.push({
623
+ type: 'tool_use',
624
+ id: toolCall.id,
625
+ name: toolCall.function.name,
626
+ input: JSON.parse(toolCall.function.arguments || '{}'),
627
+ });
628
+ }
629
+ }
630
+ }
631
+ return {
632
+ content,
633
+ stopReason: this.mapStopReason(choice.finish_reason),
634
+ usage: response.usage
635
+ ? {
636
+ inputTokens: response.usage.prompt_tokens,
637
+ outputTokens: response.usage.completion_tokens,
638
+ }
639
+ : undefined,
640
+ };
641
+ }
642
+ mapStopReason(reason) {
643
+ switch (reason) {
644
+ case 'stop':
645
+ return 'end_turn';
646
+ case 'tool_calls':
647
+ return 'tool_use';
648
+ case 'length':
649
+ return 'max_tokens';
650
+ case 'content_filter':
651
+ return 'stop_sequence';
652
+ default:
653
+ return 'end_turn';
654
+ }
655
+ }
656
+ }
657
+ exports.OpenAIProvider = OpenAIProvider;