codex-linux 1.0.0

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 (367) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.eslintrc.json +27 -0
  3. package/.github/workflows/ci.yml +156 -0
  4. package/.huskyrc +7 -0
  5. package/.lintstagedrc +13 -0
  6. package/.prettierrc +12 -0
  7. package/CLAUDE.md +163 -0
  8. package/DESIGN_SUPERIOR.md +73 -0
  9. package/Dockerfile +64 -0
  10. package/INSTALLATION.md +152 -0
  11. package/LICENSE +21 -0
  12. package/README.md +245 -0
  13. package/assets/skills/code-review/instructions.md +102 -0
  14. package/assets/skills/code-review/skill.yaml +15 -0
  15. package/assets/skills/refactoring/instructions.md +149 -0
  16. package/assets/skills/refactoring/skill.yaml +15 -0
  17. package/assets/skills/testing/skill.yaml +15 -0
  18. package/commitlint.config.js +23 -0
  19. package/dist/main/DatabaseManager.js +763 -0
  20. package/dist/main/DatabaseManager.js.map +1 -0
  21. package/dist/main/SettingsManager.js +61 -0
  22. package/dist/main/SettingsManager.js.map +1 -0
  23. package/dist/main/agents/AgentOrchestrator.js +787 -0
  24. package/dist/main/agents/AgentOrchestrator.js.map +1 -0
  25. package/dist/main/agents/AgentSDK.js +219 -0
  26. package/dist/main/agents/AgentSDK.js.map +1 -0
  27. package/dist/main/agents/AgentTools.js +348 -0
  28. package/dist/main/agents/AgentTools.js.map +1 -0
  29. package/dist/main/agents/CodeIndex.js +233 -0
  30. package/dist/main/agents/CodeIndex.js.map +1 -0
  31. package/dist/main/agents/EmbeddingService.js +80 -0
  32. package/dist/main/agents/EmbeddingService.js.map +1 -0
  33. package/dist/main/agents/NativeToolCalling.js +206 -0
  34. package/dist/main/agents/NativeToolCalling.js.map +1 -0
  35. package/dist/main/api/APIServer.js +278 -0
  36. package/dist/main/api/APIServer.js.map +1 -0
  37. package/dist/main/api/RateLimiter.js +138 -0
  38. package/dist/main/api/RateLimiter.js.map +1 -0
  39. package/dist/main/api/WebSocketManager.js +300 -0
  40. package/dist/main/api/WebSocketManager.js.map +1 -0
  41. package/dist/main/assistant/ContextOptimizer.js +192 -0
  42. package/dist/main/assistant/ContextOptimizer.js.map +1 -0
  43. package/dist/main/assistant/PredictedOutputManager.js +172 -0
  44. package/dist/main/assistant/PredictedOutputManager.js.map +1 -0
  45. package/dist/main/assistant/PromptCacheManager.js +193 -0
  46. package/dist/main/assistant/PromptCacheManager.js.map +1 -0
  47. package/dist/main/assistant/PromptOptimizer.js +626 -0
  48. package/dist/main/assistant/PromptOptimizer.js.map +1 -0
  49. package/dist/main/assistant/SmartCodeAssistant.js +224 -0
  50. package/dist/main/assistant/SmartCodeAssistant.js.map +1 -0
  51. package/dist/main/auth/SessionManager.js +300 -0
  52. package/dist/main/auth/SessionManager.js.map +1 -0
  53. package/dist/main/automations/AdvancedWebhookSystem.js +212 -0
  54. package/dist/main/automations/AdvancedWebhookSystem.js.map +1 -0
  55. package/dist/main/automations/AutomationScheduler.js +269 -0
  56. package/dist/main/automations/AutomationScheduler.js.map +1 -0
  57. package/dist/main/automations/BatchProcessingSystem.js +159 -0
  58. package/dist/main/automations/BatchProcessingSystem.js.map +1 -0
  59. package/dist/main/automations/BrowserAutomationManager.js +195 -0
  60. package/dist/main/automations/BrowserAutomationManager.js.map +1 -0
  61. package/dist/main/automations/GitHubActionsManager.js +129 -0
  62. package/dist/main/automations/GitHubActionsManager.js.map +1 -0
  63. package/dist/main/automations/GitLabCIManager.js +122 -0
  64. package/dist/main/automations/GitLabCIManager.js.map +1 -0
  65. package/dist/main/automations/PriorityQueueManager.js +240 -0
  66. package/dist/main/automations/PriorityQueueManager.js.map +1 -0
  67. package/dist/main/background/BackgroundModeManager.js +117 -0
  68. package/dist/main/background/BackgroundModeManager.js.map +1 -0
  69. package/dist/main/backup/BackupManager.js +254 -0
  70. package/dist/main/backup/BackupManager.js.map +1 -0
  71. package/dist/main/backup/MigrationManager.js +114 -0
  72. package/dist/main/backup/MigrationManager.js.map +1 -0
  73. package/dist/main/commands/SlashCommandManager.js +399 -0
  74. package/dist/main/commands/SlashCommandManager.js.map +1 -0
  75. package/dist/main/config/ClaudeMdParser.js +519 -0
  76. package/dist/main/config/ClaudeMdParser.js.map +1 -0
  77. package/dist/main/config/CustomizationManager.js +381 -0
  78. package/dist/main/config/CustomizationManager.js.map +1 -0
  79. package/dist/main/config/LaunchConfigManager.js +211 -0
  80. package/dist/main/config/LaunchConfigManager.js.map +1 -0
  81. package/dist/main/config/SettingsManager.js +166 -0
  82. package/dist/main/config/SettingsManager.js.map +1 -0
  83. package/dist/main/connectors/ConnectorManager.js +151 -0
  84. package/dist/main/connectors/ConnectorManager.js.map +1 -0
  85. package/dist/main/connectors/DatabaseConnector.js +222 -0
  86. package/dist/main/connectors/DatabaseConnector.js.map +1 -0
  87. package/dist/main/cowork/CoworkManager.js +324 -0
  88. package/dist/main/cowork/CoworkManager.js.map +1 -0
  89. package/dist/main/evals/AgentEvalFramework.js +538 -0
  90. package/dist/main/evals/AgentEvalFramework.js.map +1 -0
  91. package/dist/main/evals/GraderManager.js +285 -0
  92. package/dist/main/evals/GraderManager.js.map +1 -0
  93. package/dist/main/git/GitWorktreeManager.js +214 -0
  94. package/dist/main/git/GitWorktreeManager.js.map +1 -0
  95. package/dist/main/github/GitHubPRMonitor.js +244 -0
  96. package/dist/main/github/GitHubPRMonitor.js.map +1 -0
  97. package/dist/main/ide/ContinueInManager.js +181 -0
  98. package/dist/main/ide/ContinueInManager.js.map +1 -0
  99. package/dist/main/ide/IDEIntegration.js +277 -0
  100. package/dist/main/ide/IDEIntegration.js.map +1 -0
  101. package/dist/main/integrations/LinearManager.js +252 -0
  102. package/dist/main/integrations/LinearManager.js.map +1 -0
  103. package/dist/main/integrations/SlackBotManager.js +247 -0
  104. package/dist/main/integrations/SlackBotManager.js.map +1 -0
  105. package/dist/main/lsp/LSPManager.js +394 -0
  106. package/dist/main/lsp/LSPManager.js.map +1 -0
  107. package/dist/main/main.js +1087 -0
  108. package/dist/main/main.js.map +1 -0
  109. package/dist/main/mcp/MCPConfigurationManager.js +281 -0
  110. package/dist/main/mcp/MCPConfigurationManager.js.map +1 -0
  111. package/dist/main/mcp/MCPManager.js +710 -0
  112. package/dist/main/mcp/MCPManager.js.map +1 -0
  113. package/dist/main/mcp/MCPRegistry.js +272 -0
  114. package/dist/main/mcp/MCPRegistry.js.map +1 -0
  115. package/dist/main/monitoring/ErrorRecoveryManager.js +268 -0
  116. package/dist/main/monitoring/ErrorRecoveryManager.js.map +1 -0
  117. package/dist/main/monitoring/ErrorTracker.js +57 -0
  118. package/dist/main/monitoring/ErrorTracker.js.map +1 -0
  119. package/dist/main/monitoring/MetricsCollector.js +155 -0
  120. package/dist/main/monitoring/MetricsCollector.js.map +1 -0
  121. package/dist/main/monitoring/TraceGradingSystem.js +148 -0
  122. package/dist/main/monitoring/TraceGradingSystem.js.map +1 -0
  123. package/dist/main/notifications/NotificationManager.js +67 -0
  124. package/dist/main/notifications/NotificationManager.js.map +1 -0
  125. package/dist/main/pair/AIPairProgramming.js +200 -0
  126. package/dist/main/pair/AIPairProgramming.js.map +1 -0
  127. package/dist/main/plugins/PluginManager.js +222 -0
  128. package/dist/main/plugins/PluginManager.js.map +1 -0
  129. package/dist/main/plugins/PluginMarketplace.js +237 -0
  130. package/dist/main/plugins/PluginMarketplace.js.map +1 -0
  131. package/dist/main/preload.js +189 -0
  132. package/dist/main/preload.js.map +1 -0
  133. package/dist/main/preview/PreviewSessionManager.js +170 -0
  134. package/dist/main/preview/PreviewSessionManager.js.map +1 -0
  135. package/dist/main/providers/AIProviderManager.js +327 -0
  136. package/dist/main/providers/AIProviderManager.js.map +1 -0
  137. package/dist/main/providers/FineTuningManager.js +276 -0
  138. package/dist/main/providers/FineTuningManager.js.map +1 -0
  139. package/dist/main/providers/FreeModelsProvider.js +1104 -0
  140. package/dist/main/providers/FreeModelsProvider.js.map +1 -0
  141. package/dist/main/realtime/RealtimeManager.js +116 -0
  142. package/dist/main/realtime/RealtimeManager.js.map +1 -0
  143. package/dist/main/remote/CloudEnvironmentManager.js +232 -0
  144. package/dist/main/remote/CloudEnvironmentManager.js.map +1 -0
  145. package/dist/main/remote/RemoteSessionManager.js +255 -0
  146. package/dist/main/remote/RemoteSessionManager.js.map +1 -0
  147. package/dist/main/search/DeepResearchManager.js +335 -0
  148. package/dist/main/search/DeepResearchManager.js.map +1 -0
  149. package/dist/main/search/WebSearchIntegration.js +147 -0
  150. package/dist/main/search/WebSearchIntegration.js.map +1 -0
  151. package/dist/main/security/AdminConsoleManager.js +223 -0
  152. package/dist/main/security/AdminConsoleManager.js.map +1 -0
  153. package/dist/main/security/AuditLogger.js +136 -0
  154. package/dist/main/security/AuditLogger.js.map +1 -0
  155. package/dist/main/security/PermissionManager.js +144 -0
  156. package/dist/main/security/PermissionManager.js.map +1 -0
  157. package/dist/main/security/SSOManager.js +173 -0
  158. package/dist/main/security/SSOManager.js.map +1 -0
  159. package/dist/main/security/SecurityManager.js +152 -0
  160. package/dist/main/security/SecurityManager.js.map +1 -0
  161. package/dist/main/skills/SkillsManager.js +223 -0
  162. package/dist/main/skills/SkillsManager.js.map +1 -0
  163. package/dist/main/ssh/SSHManager.js +65 -0
  164. package/dist/main/ssh/SSHManager.js.map +1 -0
  165. package/dist/main/streaming/StreamingManager.js +225 -0
  166. package/dist/main/streaming/StreamingManager.js.map +1 -0
  167. package/dist/main/sync/CloudSyncManager.js +422 -0
  168. package/dist/main/sync/CloudSyncManager.js.map +1 -0
  169. package/dist/main/types.js +28 -0
  170. package/dist/main/types.js.map +1 -0
  171. package/dist/main/verification/AutoVerifyManager.js +235 -0
  172. package/dist/main/verification/AutoVerifyManager.js.map +1 -0
  173. package/dist/main/vision/ComputerUseManager.js +376 -0
  174. package/dist/main/vision/ComputerUseManager.js.map +1 -0
  175. package/dist/main/vision/ImageVideoGenerationManager.js +401 -0
  176. package/dist/main/vision/ImageVideoGenerationManager.js.map +1 -0
  177. package/dist/main/vision/VisionManager.js +172 -0
  178. package/dist/main/vision/VisionManager.js.map +1 -0
  179. package/dist/renderer/assets/main-DJlZQBCA.js +304 -0
  180. package/dist/renderer/assets/main-N33ZXEr8.css +1 -0
  181. package/dist/renderer/index.html +21 -0
  182. package/dist/renderer/manifest.json +42 -0
  183. package/dist/renderer/sw.ts +109 -0
  184. package/dist/shared/types.js +35 -0
  185. package/dist/shared/types.js.map +1 -0
  186. package/docker-compose.yml +65 -0
  187. package/docs/API.md +307 -0
  188. package/docs/USER_GUIDE.md +476 -0
  189. package/examples/plugins/sample-plugin/package.json +41 -0
  190. package/examples/plugins/sample-plugin/src/index.ts +75 -0
  191. package/index.html +20 -0
  192. package/jest.config.js +39 -0
  193. package/package.json +180 -0
  194. package/packages/cli/package.json +29 -0
  195. package/packages/cli/src/commands/agents.ts +199 -0
  196. package/packages/cli/src/commands/tasks.ts +61 -0
  197. package/packages/cli/src/index.ts +91 -0
  198. package/packages/cli/src/utils/api.ts +45 -0
  199. package/packages/cli/src/utils/config.ts +61 -0
  200. package/packages/npm-installer/bin/codex-linux +126 -0
  201. package/packages/npm-installer/lib/download.js +273 -0
  202. package/packages/npm-installer/package.json +42 -0
  203. package/packages/vscode-extension/package.json +167 -0
  204. package/packages/vscode-extension/src/api.ts +68 -0
  205. package/packages/vscode-extension/src/extension.ts +161 -0
  206. package/packages/vscode-extension/src/panels/chatPanel.ts +265 -0
  207. package/packages/vscode-extension/src/panels/createAgentPanel.ts +227 -0
  208. package/packages/vscode-extension/src/providers/agentsProvider.ts +80 -0
  209. package/postcss.config.js +6 -0
  210. package/public/manifest.json +42 -0
  211. package/public/sw.ts +109 -0
  212. package/scripts/install-dev.sh +103 -0
  213. package/scripts/install.sh +275 -0
  214. package/src/main/DatabaseManager.ts +950 -0
  215. package/src/main/SettingsManager.ts +63 -0
  216. package/src/main/agents/AgentOrchestrator.ts +930 -0
  217. package/src/main/agents/AgentSDK.ts +269 -0
  218. package/src/main/agents/AgentTools.ts +380 -0
  219. package/src/main/agents/CodeIndex.ts +240 -0
  220. package/src/main/agents/EmbeddingService.ts +88 -0
  221. package/src/main/agents/NativeToolCalling.ts +245 -0
  222. package/src/main/api/APIServer.ts +316 -0
  223. package/src/main/api/RateLimiter.ts +165 -0
  224. package/src/main/api/WebSocketManager.ts +398 -0
  225. package/src/main/assistant/ContextOptimizer.ts +214 -0
  226. package/src/main/assistant/PredictedOutputManager.ts +265 -0
  227. package/src/main/assistant/PromptCacheManager.ts +280 -0
  228. package/src/main/assistant/PromptOptimizer.ts +746 -0
  229. package/src/main/assistant/SmartCodeAssistant.ts +234 -0
  230. package/src/main/auth/SessionManager.ts +415 -0
  231. package/src/main/automations/AdvancedWebhookSystem.ts +281 -0
  232. package/src/main/automations/AutomationScheduler.ts +272 -0
  233. package/src/main/automations/BatchProcessingSystem.ts +207 -0
  234. package/src/main/automations/BrowserAutomationManager.ts +203 -0
  235. package/src/main/automations/GitHubActionsManager.ts +151 -0
  236. package/src/main/automations/GitLabCIManager.ts +206 -0
  237. package/src/main/automations/PriorityQueueManager.ts +328 -0
  238. package/src/main/background/BackgroundModeManager.ts +130 -0
  239. package/src/main/backup/BackupManager.ts +287 -0
  240. package/src/main/backup/MigrationManager.ts +132 -0
  241. package/src/main/commands/SlashCommandManager.ts +407 -0
  242. package/src/main/config/ClaudeMdParser.ts +539 -0
  243. package/src/main/config/CustomizationManager.ts +493 -0
  244. package/src/main/config/LaunchConfigManager.ts +212 -0
  245. package/src/main/config/SettingsManager.ts +163 -0
  246. package/src/main/connectors/ConnectorManager.ts +175 -0
  247. package/src/main/connectors/DatabaseConnector.ts +212 -0
  248. package/src/main/cowork/CoworkManager.ts +431 -0
  249. package/src/main/evals/AgentEvalFramework.ts +665 -0
  250. package/src/main/evals/GraderManager.ts +417 -0
  251. package/src/main/git/GitWorktreeManager.ts +211 -0
  252. package/src/main/github/GitHubPRMonitor.ts +317 -0
  253. package/src/main/ide/ContinueInManager.ts +180 -0
  254. package/src/main/ide/IDEIntegration.ts +288 -0
  255. package/src/main/integrations/LinearManager.ts +327 -0
  256. package/src/main/integrations/SlackBotManager.ts +312 -0
  257. package/src/main/lsp/LSPManager.ts +445 -0
  258. package/src/main/main.ts +1221 -0
  259. package/src/main/mcp/MCPConfigurationManager.ts +281 -0
  260. package/src/main/mcp/MCPManager.ts +799 -0
  261. package/src/main/mcp/MCPRegistry.ts +273 -0
  262. package/src/main/monitoring/ErrorRecoveryManager.ts +359 -0
  263. package/src/main/monitoring/ErrorTracker.ts +60 -0
  264. package/src/main/monitoring/MetricsCollector.ts +196 -0
  265. package/src/main/monitoring/TraceGradingSystem.ts +196 -0
  266. package/src/main/notifications/NotificationManager.ts +96 -0
  267. package/src/main/pair/AIPairProgramming.ts +290 -0
  268. package/src/main/plugins/PluginManager.ts +266 -0
  269. package/src/main/plugins/PluginMarketplace.ts +318 -0
  270. package/src/main/preload.ts +215 -0
  271. package/src/main/preview/PreviewSessionManager.ts +186 -0
  272. package/src/main/providers/AIProviderManager.ts +394 -0
  273. package/src/main/providers/FineTuningManager.ts +390 -0
  274. package/src/main/providers/FreeModelsProvider.ts +1156 -0
  275. package/src/main/realtime/RealtimeManager.ts +147 -0
  276. package/src/main/remote/CloudEnvironmentManager.ts +253 -0
  277. package/src/main/remote/RemoteSessionManager.ts +323 -0
  278. package/src/main/search/DeepResearchManager.ts +458 -0
  279. package/src/main/search/WebSearchIntegration.ts +203 -0
  280. package/src/main/security/AdminConsoleManager.ts +244 -0
  281. package/src/main/security/AuditLogger.ts +143 -0
  282. package/src/main/security/PermissionManager.ts +184 -0
  283. package/src/main/security/SSOManager.ts +241 -0
  284. package/src/main/security/SecurityManager.ts +139 -0
  285. package/src/main/skills/SkillsManager.ts +218 -0
  286. package/src/main/ssh/SSHManager.ts +86 -0
  287. package/src/main/streaming/StreamingManager.ts +306 -0
  288. package/src/main/sync/CloudSyncManager.ts +532 -0
  289. package/src/main/verification/AutoVerifyManager.ts +285 -0
  290. package/src/main/vision/ComputerUseManager.ts +475 -0
  291. package/src/main/vision/ImageVideoGenerationManager.ts +526 -0
  292. package/src/main/vision/VisionManager.ts +186 -0
  293. package/src/renderer/App.tsx +314 -0
  294. package/src/renderer/components/AdvancedSettingsPanel.tsx +225 -0
  295. package/src/renderer/components/AgentPanel.tsx +760 -0
  296. package/src/renderer/components/AppPreview.tsx +220 -0
  297. package/src/renderer/components/AuditTrailPanel.tsx +148 -0
  298. package/src/renderer/components/AutomationPanel.tsx +220 -0
  299. package/src/renderer/components/ChatInterface.tsx +595 -0
  300. package/src/renderer/components/ChatTab.tsx +296 -0
  301. package/src/renderer/components/CodeEditor.tsx +257 -0
  302. package/src/renderer/components/CodeReviewPanel.tsx +256 -0
  303. package/src/renderer/components/CodeWorkspace.tsx +192 -0
  304. package/src/renderer/components/CodebaseDashboard.tsx +295 -0
  305. package/src/renderer/components/ComputerUsePanel.tsx +262 -0
  306. package/src/renderer/components/ConnectorsPanel.tsx +471 -0
  307. package/src/renderer/components/ContextMenu.tsx +155 -0
  308. package/src/renderer/components/ContextUsageDisplay.tsx +248 -0
  309. package/src/renderer/components/CoworkPanel.tsx +415 -0
  310. package/src/renderer/components/DiffViewer.tsx +452 -0
  311. package/src/renderer/components/ErrorBoundary.tsx +273 -0
  312. package/src/renderer/components/ExtendedThinkingToggle.tsx +244 -0
  313. package/src/renderer/components/FileAttachments.tsx +247 -0
  314. package/src/renderer/components/FileExplorer.tsx +242 -0
  315. package/src/renderer/components/FileExplorerPanel.tsx +302 -0
  316. package/src/renderer/components/GitPanel.tsx +154 -0
  317. package/src/renderer/components/Header.tsx +113 -0
  318. package/src/renderer/components/MCPPanel.tsx +326 -0
  319. package/src/renderer/components/MentionAutocomplete.tsx +239 -0
  320. package/src/renderer/components/PermissionPanel.tsx +159 -0
  321. package/src/renderer/components/PermissionSelector.tsx +203 -0
  322. package/src/renderer/components/PluginMarketplace.tsx +325 -0
  323. package/src/renderer/components/PromptOptimizerPanel.tsx +399 -0
  324. package/src/renderer/components/SearchPanel.tsx +173 -0
  325. package/src/renderer/components/SearchReplace.tsx +284 -0
  326. package/src/renderer/components/SessionSidebar.tsx +367 -0
  327. package/src/renderer/components/SettingsPanel.tsx +426 -0
  328. package/src/renderer/components/Sidebar.tsx +100 -0
  329. package/src/renderer/components/SkillsPanel.tsx +245 -0
  330. package/src/renderer/components/SplitPane.tsx +173 -0
  331. package/src/renderer/components/Terminal.tsx +190 -0
  332. package/src/renderer/components/VoiceCommand.tsx +129 -0
  333. package/src/renderer/components/WorktreePanel.tsx +163 -0
  334. package/src/renderer/components/ui/AriaComponents.tsx +193 -0
  335. package/src/renderer/components/ui/Button.tsx +68 -0
  336. package/src/renderer/components/ui/Card.tsx +102 -0
  337. package/src/renderer/components/ui/Input.tsx +44 -0
  338. package/src/renderer/components/ui/Skeleton.tsx +55 -0
  339. package/src/renderer/components/ui/VirtualList.tsx +196 -0
  340. package/src/renderer/i18n/I18nProvider.tsx +101 -0
  341. package/src/renderer/i18n/de.ts +161 -0
  342. package/src/renderer/i18n/en.ts +163 -0
  343. package/src/renderer/i18n/es.ts +161 -0
  344. package/src/renderer/i18n/fr.ts +161 -0
  345. package/src/renderer/i18n/index.ts +44 -0
  346. package/src/renderer/index.css +129 -0
  347. package/src/renderer/lib/accessibility.tsx +287 -0
  348. package/src/renderer/lib/hooks.ts +304 -0
  349. package/src/renderer/lib/utils.ts +6 -0
  350. package/src/renderer/main.tsx +25 -0
  351. package/src/renderer/styles/minimalist.css +539 -0
  352. package/src/renderer/sw.ts +180 -0
  353. package/src/renderer/types.d.ts +138 -0
  354. package/src/shared/types.ts +813 -0
  355. package/supabase/schema.sql +234 -0
  356. package/tailwind.config.js +78 -0
  357. package/tests/e2e/package.json +15 -0
  358. package/tests/e2e/playwright.config.ts +31 -0
  359. package/tests/e2e/specs/app.spec.ts +194 -0
  360. package/tests/setup.ts +99 -0
  361. package/tests/unit/AgentOrchestrator.test.ts +274 -0
  362. package/tests/unit/DatabaseManager.test.ts +262 -0
  363. package/tests/unit/GitWorktreeManager.test.ts +150 -0
  364. package/tests/unit/SecurityManager.test.ts +110 -0
  365. package/tsconfig.main.json +22 -0
  366. package/tsconfig.renderer.json +27 -0
  367. package/vite.config.ts +28 -0
@@ -0,0 +1,431 @@
1
+ import { EventEmitter } from 'events';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import log from 'electron-log';
4
+ import { AgentOrchestrator } from '../agents/AgentOrchestrator';
5
+ import { DatabaseManager } from '../DatabaseManager';
6
+ import { NotificationManager } from '../notifications/NotificationManager';
7
+ import { Agent, AgentStatus, TaskStatus } from '../../shared/types';
8
+ import { AgentTools, ToolResult } from '../agents/AgentTools';
9
+ import { CodeIndex } from '../agents/CodeIndex';
10
+ import { NativeToolCalling } from '../agents/NativeToolCalling';
11
+
12
+ interface CoworkSession {
13
+ id: string;
14
+ name: string;
15
+ agentId: string;
16
+ status: 'idle' | 'running' | 'paused' | 'completed' | 'error';
17
+ objective: string;
18
+ progress: number;
19
+ createdAt: Date;
20
+ updatedAt: Date;
21
+ completedAt?: Date;
22
+ logs: string[];
23
+ deliverables: string[];
24
+ autoApprove: boolean;
25
+ }
26
+
27
+ export class CoworkManager extends EventEmitter {
28
+ private sessions: Map<string, CoworkSession> = new Map();
29
+ private agentOrchestrator: AgentOrchestrator;
30
+ private dbManager: DatabaseManager;
31
+ private notificationManager: NotificationManager;
32
+ private checkInterval: NodeJS.Timeout | null = null;
33
+
34
+ constructor(
35
+ agentOrchestrator: AgentOrchestrator,
36
+ dbManager: DatabaseManager,
37
+ notificationManager: NotificationManager
38
+ ) {
39
+ super();
40
+ this.agentOrchestrator = agentOrchestrator;
41
+ this.dbManager = dbManager;
42
+ this.notificationManager = notificationManager;
43
+ }
44
+
45
+ async initialize(): Promise<void> {
46
+ // Load existing sessions from DB
47
+ await this.loadSessions();
48
+
49
+ // Start monitoring loop
50
+ this.checkInterval = setInterval(() => this.monitorSessions(), 5000);
51
+
52
+ log.info('Cowork manager initialized');
53
+ }
54
+
55
+ async createSession(
56
+ name: string,
57
+ objective: string,
58
+ projectPath: string,
59
+ options: {
60
+ autoApprove?: boolean;
61
+ skills?: string[];
62
+ } = {}
63
+ ): Promise<CoworkSession> {
64
+ const sessionId = uuidv4();
65
+
66
+ // Create background agent
67
+ const agent = await this.agentOrchestrator.createAgent({
68
+ name: `Cowork: ${name}`,
69
+ projectPath,
70
+ providerId: 'openai',
71
+ model: 'gpt-4o', // Use best model for autonomous work
72
+ skills: options.skills || ['refactoring', 'testing'],
73
+ });
74
+
75
+ const session: CoworkSession = {
76
+ id: sessionId,
77
+ name,
78
+ agentId: agent.id,
79
+ status: 'idle',
80
+ objective,
81
+ progress: 0,
82
+ createdAt: new Date(),
83
+ updatedAt: new Date(),
84
+ logs: [],
85
+ deliverables: [],
86
+ autoApprove: options.autoApprove ?? false,
87
+ };
88
+
89
+ this.sessions.set(sessionId, session);
90
+ await this.saveSession(session);
91
+
92
+ this.emit('session:created', session);
93
+ log.info(`Cowork session created: ${sessionId}`);
94
+
95
+ return session;
96
+ }
97
+
98
+ async startSession(sessionId: string): Promise<void> {
99
+ const session = this.sessions.get(sessionId);
100
+ if (!session) throw new Error('Session not found');
101
+
102
+ session.status = 'running';
103
+ session.updatedAt = new Date();
104
+
105
+ // Start the autonomous workflow
106
+ this.runAutonomousWorkflow(session);
107
+
108
+ await this.saveSession(session);
109
+ this.emit('session:started', session);
110
+
111
+ this.notificationManager.show({
112
+ title: 'Cowork Session Started',
113
+ body: `"${session.name}" is now working in the background`,
114
+ });
115
+ }
116
+
117
+ async pauseSession(sessionId: string): Promise<void> {
118
+ const session = this.sessions.get(sessionId);
119
+ if (!session) throw new Error('Session not found');
120
+
121
+ session.status = 'paused';
122
+ session.updatedAt = new Date();
123
+
124
+ await this.agentOrchestrator.pauseAgent(session.agentId);
125
+ await this.saveSession(session);
126
+
127
+ this.emit('session:paused', session);
128
+ }
129
+
130
+ async stopSession(sessionId: string): Promise<void> {
131
+ const session = this.sessions.get(sessionId);
132
+ if (!session) throw new Error('Session not found');
133
+
134
+ await this.agentOrchestrator.stopAgent(session.agentId);
135
+
136
+ session.status = 'completed';
137
+ session.completedAt = new Date();
138
+ session.updatedAt = new Date();
139
+
140
+ await this.saveSession(session);
141
+ this.emit('session:stopped', session);
142
+ }
143
+
144
+ private async runAutonomousWorkflow(session: CoworkSession): Promise<void> {
145
+ try {
146
+ this.addLog(session, 'Starting autonomous workflow...');
147
+
148
+ // Get agent worktree path
149
+ const agent = await this.agentOrchestrator.getAgent(session.agentId);
150
+ if (!agent) throw new Error('Agent not found');
151
+
152
+ const worktreePath = agent.worktreePath || agent.projectPath;
153
+
154
+ // Get OpenAI API key from settings
155
+ const apiKey = process.env.OPENAI_API_KEY || '';
156
+ const tools = new AgentTools(worktreePath);
157
+ const codeIndex = new CodeIndex(worktreePath, '.codex/index', apiKey);
158
+ await codeIndex.initialize();
159
+
160
+ // Initialize native tool calling if API key available
161
+ const toolCaller = apiKey ? new NativeToolCalling(apiKey, worktreePath) : null;
162
+
163
+ // Step 1: Index codebase
164
+ this.addLog(session, 'Indexing codebase for semantic search...');
165
+ session.progress = 5;
166
+ await codeIndex.indexProject();
167
+
168
+ // Step 2: Analyze with tools
169
+ this.addLog(session, 'Analyzing codebase structure with tools...');
170
+ session.progress = 15;
171
+ this.emit('session:progress', { sessionId: session.id, progress: 15, step: 'analysis' });
172
+
173
+ // List root directory
174
+ this.emit('session:tool', { sessionId: session.id, tool: 'ls', status: 'running' });
175
+ const lsResult = await tools.ls({ path: '.' });
176
+ this.emit('session:tool', { sessionId: session.id, tool: 'ls', status: 'completed', result: lsResult.output });
177
+ this.addLog(session, `Project structure:\n${lsResult.output}`);
178
+
179
+ // Search for relevant files using semantic search
180
+ const searchResults = await codeIndex.search(session.objective, 10);
181
+ const relevantFiles = searchResults.map(r => r.filePath);
182
+
183
+ this.addLog(session, `Found ${relevantFiles.length} relevant files via semantic search`);
184
+
185
+ // Read key files
186
+ let fileContents = '';
187
+ for (const file of relevantFiles.slice(0, 5)) {
188
+ this.emit('session:tool', { sessionId: session.id, tool: 'view', status: 'running', params: { file_path: file } });
189
+ const viewResult = await tools.view({ file_path: file });
190
+ this.emit('session:tool', { sessionId: session.id, tool: 'view', status: viewResult.success ? 'completed' : 'error', result: viewResult.output, error: viewResult.error });
191
+ if (viewResult.success) {
192
+ fileContents += `\n\n=== ${file} ===\n${viewResult.output}`;
193
+ }
194
+ }
195
+
196
+ session.progress = 25;
197
+ this.emit('session:progress', { sessionId: session.id, progress: 25, step: 'files_read', files: relevantFiles.slice(0, 5) });
198
+
199
+ // Step 3: Create plan using actual file contents
200
+ this.addLog(session, 'Creating detailed implementation plan...');
201
+ session.progress = 35;
202
+
203
+ const planTask = await this.agentOrchestrator.sendMessage(
204
+ session.agentId,
205
+ `Based on the following codebase analysis, create a detailed plan to achieve: ${session.objective}\n\n` +
206
+ `Project structure:\n${lsResult.output}\n\n` +
207
+ `Relevant files found:\n${relevantFiles.join('\n')}\n\n` +
208
+ `Key file contents:${fileContents.slice(0, 8000)}\n\n` +
209
+ `Create a step-by-step plan with specific files to modify and actions to take.`
210
+ );
211
+
212
+ session.progress = 45;
213
+
214
+ // Step 4: Execute with native tool calling (if available) or streaming
215
+ this.addLog(session, 'Executing plan with tool use...');
216
+ session.progress = 55;
217
+
218
+ let executionResult = '';
219
+
220
+ if (toolCaller?.isAvailable()) {
221
+ // Use native tool calling
222
+ this.addLog(session, 'Using native OpenAI tool calling...');
223
+
224
+ const systemPrompt =
225
+ `You are an expert software developer. Execute the following objective: ${session.objective}\n\n` +
226
+ `You have access to tools to explore and modify the codebase. ` +
227
+ `Start by exploring the codebase structure, then make necessary changes. ` +
228
+ `After each tool use, analyze the result and decide on next steps.`;
229
+
230
+ const userPrompt =
231
+ `Objective: ${session.objective}\n\n` +
232
+ `Relevant files:\n${relevantFiles.join('\n')}\n\n` +
233
+ `Execute the implementation. Use tools to view, edit, and test the code.`;
234
+
235
+ executionResult = await toolCaller.executeWithTools(
236
+ 'gpt-4o',
237
+ systemPrompt,
238
+ userPrompt,
239
+ (toolCall, result) => {
240
+ this.emit('session:tool', {
241
+ sessionId: session.id,
242
+ tool: toolCall.function.name,
243
+ status: result.success ? 'completed' : 'error',
244
+ result: result.output,
245
+ error: result.error
246
+ });
247
+ }
248
+ );
249
+
250
+ this.addLog(session, `Execution completed: ${executionResult.slice(0, 500)}`);
251
+ } else {
252
+ // Fallback to streaming
253
+ this.addLog(session, 'Using streaming mode (no native tool calling)...');
254
+
255
+ const toolDefinitions = tools.getToolDefinitions();
256
+ const toolDescriptions = toolDefinitions.map(t =>
257
+ `- ${t.name}: ${t.description}`
258
+ ).join('\n');
259
+
260
+ const executePrompt =
261
+ `Execute the following objective: ${session.objective}\n\n` +
262
+ `You have access to the following tools:\n${toolDescriptions}\n\n` +
263
+ `To use a tool, respond with: TOOL: {"name": "tool_name", "params": {...}}\n\n` +
264
+ `First, explore the codebase to understand the structure, then make the necessary changes.`;
265
+
266
+ let streamingContent = '';
267
+ await this.agentOrchestrator.sendMessageStream(
268
+ session.agentId,
269
+ executePrompt,
270
+ {
271
+ onChunk: (chunk: string) => {
272
+ streamingContent += chunk;
273
+ this.emit('session:stream', { sessionId: session.id, chunk, content: streamingContent });
274
+ },
275
+ onComplete: () => {
276
+ this.emit('session:streamComplete', { sessionId: session.id, content: streamingContent });
277
+ },
278
+ onError: (error: Error) => {
279
+ this.emit('session:streamError', { sessionId: session.id, error: error.message });
280
+ }
281
+ }
282
+ );
283
+
284
+ executionResult = streamingContent;
285
+ }
286
+
287
+ session.progress = 75;
288
+ this.emit('session:progress', { sessionId: session.id, progress: 75, step: 'execution' });
289
+
290
+ // Step 5: Verify with tests
291
+ this.addLog(session, 'Running verification...');
292
+ session.progress = 85;
293
+ this.emit('session:progress', { sessionId: session.id, progress: 85, step: 'verification' });
294
+
295
+ // Try to run tests
296
+ this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: 'running', params: { command: 'npm test' } });
297
+ const testResult = await tools.bash({ command: 'npm test || echo "No tests"' });
298
+ this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: testResult.success ? 'completed' : 'error', result: testResult.output, error: testResult.error });
299
+ this.addLog(session, `Test result: ${testResult.output.slice(0, 500)}`);
300
+
301
+ // Check for TypeScript errors
302
+ this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: 'running', params: { command: 'npx tsc --noEmit' } });
303
+ const typeCheck = await tools.bash({ command: 'npx tsc --noEmit 2>&1 || echo "Type check completed"' });
304
+ this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: typeCheck.success ? 'completed' : 'error', result: typeCheck.output, error: typeCheck.error });
305
+ if (!typeCheck.success) {
306
+ this.addLog(session, `Type errors found: ${typeCheck.error?.slice(0, 300)}`);
307
+ }
308
+
309
+ session.progress = 95;
310
+ this.emit('session:progress', { sessionId: session.id, progress: 95, step: 'complete' });
311
+
312
+ // Complete
313
+ session.status = 'completed';
314
+ session.progress = 100;
315
+ session.completedAt = new Date();
316
+ session.deliverables.push('Implementation completed');
317
+ session.deliverables.push(`Modified files: ${relevantFiles.join(', ')}`);
318
+
319
+ this.addLog(session, 'Session completed successfully!');
320
+ await this.saveSession(session);
321
+
322
+ this.emit('session:completed', session);
323
+
324
+ this.notificationManager.show({
325
+ title: 'Cowork Session Completed',
326
+ body: `"${session.name}" has finished working`,
327
+ });
328
+
329
+ } catch (error) {
330
+ session.status = 'error';
331
+ this.addLog(session, `Error: ${error}`);
332
+ await this.saveSession(session);
333
+
334
+ this.emit('session:error', { sessionId: session.id, error });
335
+
336
+ this.notificationManager.show({
337
+ title: 'Cowork Session Error',
338
+ body: `"${session.name}" encountered an error`,
339
+ });
340
+ }
341
+ }
342
+
343
+ private async waitForTask(agentId: string, taskId: string): Promise<void> {
344
+ return new Promise((resolve, reject) => {
345
+ const checkInterval = setInterval(async () => {
346
+ try {
347
+ const agent = await this.agentOrchestrator.getAgent(agentId);
348
+ const task = agent?.tasks.find(t => t.id === taskId);
349
+
350
+ if (!task) {
351
+ clearInterval(checkInterval);
352
+ reject(new Error('Task not found'));
353
+ return;
354
+ }
355
+
356
+ if (task.status === TaskStatus.COMPLETED) {
357
+ clearInterval(checkInterval);
358
+ resolve();
359
+ } else if (task.status === TaskStatus.FAILED) {
360
+ clearInterval(checkInterval);
361
+ reject(new Error(task.error || 'Task failed'));
362
+ }
363
+ } catch (error) {
364
+ clearInterval(checkInterval);
365
+ reject(error);
366
+ }
367
+ }, 1000);
368
+
369
+ // Timeout after 30 minutes
370
+ setTimeout(() => {
371
+ clearInterval(checkInterval);
372
+ reject(new Error('Task timeout'));
373
+ }, 30 * 60 * 1000);
374
+ });
375
+ }
376
+
377
+ private addLog(session: CoworkSession, message: string): void {
378
+ const timestamp = new Date().toISOString();
379
+ session.logs.push(`[${timestamp}] ${message}`);
380
+ this.emit('session:log', { sessionId: session.id, message });
381
+ }
382
+
383
+ private async monitorSessions(): Promise<void> {
384
+ for (const session of this.sessions.values()) {
385
+ if (session.status === 'running') {
386
+ // Update progress and check health
387
+ const agent = await this.agentOrchestrator.getAgent(session.agentId);
388
+ if (agent?.status === AgentStatus.ERROR) {
389
+ session.status = 'error';
390
+ this.addLog(session, 'Agent encountered an error');
391
+ await this.saveSession(session);
392
+ }
393
+ }
394
+ }
395
+ }
396
+
397
+ getSessions(): CoworkSession[] {
398
+ return Array.from(this.sessions.values()).sort(
399
+ (a, b) => b.createdAt.getTime() - a.createdAt.getTime()
400
+ );
401
+ }
402
+
403
+ getSession(sessionId: string): CoworkSession | undefined {
404
+ return this.sessions.get(sessionId);
405
+ }
406
+
407
+ private async loadSessions(): Promise<void> {
408
+ // Load from database
409
+ const sessions = await this.dbManager.getCoworkSessions?.() || [];
410
+ for (const session of sessions) {
411
+ this.sessions.set(session.id, session);
412
+ }
413
+ }
414
+
415
+ private async saveSession(session: CoworkSession): Promise<void> {
416
+ await this.dbManager.saveCoworkSession?.(session);
417
+ }
418
+
419
+ async cleanup(): Promise<void> {
420
+ if (this.checkInterval) {
421
+ clearInterval(this.checkInterval);
422
+ }
423
+
424
+ // Stop all running sessions
425
+ for (const session of this.sessions.values()) {
426
+ if (session.status === 'running') {
427
+ await this.stopSession(session.id);
428
+ }
429
+ }
430
+ }
431
+ }