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,1087 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const electron_1 = require("electron");
40
+ const path = __importStar(require("path"));
41
+ const fs = __importStar(require("fs/promises"));
42
+ const child_process_1 = require("child_process");
43
+ const electron_log_1 = __importDefault(require("electron-log"));
44
+ const electron_store_1 = __importDefault(require("electron-store"));
45
+ const electron_updater_1 = require("electron-updater");
46
+ const AgentOrchestrator_1 = require("./agents/AgentOrchestrator");
47
+ const GitWorktreeManager_1 = require("./git/GitWorktreeManager");
48
+ const SkillsManager_1 = require("./skills/SkillsManager");
49
+ const AutomationScheduler_1 = require("./automations/AutomationScheduler");
50
+ const DatabaseManager_1 = require("./DatabaseManager");
51
+ const SettingsManager_1 = require("./SettingsManager");
52
+ const AIProviderManager_1 = require("./providers/AIProviderManager");
53
+ const SecurityManager_1 = require("./security/SecurityManager");
54
+ const AuditLogger_1 = require("./security/AuditLogger");
55
+ const BackupManager_1 = require("./backup/BackupManager");
56
+ const MigrationManager_1 = require("./backup/MigrationManager");
57
+ const APIServer_1 = require("./api/APIServer");
58
+ const PluginManager_1 = require("./plugins/PluginManager");
59
+ const CoworkManager_1 = require("./cowork/CoworkManager");
60
+ const GitHubPRMonitor_1 = require("./github/GitHubPRMonitor");
61
+ const MCPManager_1 = require("./mcp/MCPManager");
62
+ const AIPairProgramming_1 = require("./pair/AIPairProgramming");
63
+ const ErrorTracker_1 = require("./monitoring/ErrorTracker");
64
+ const MetricsCollector_1 = require("./monitoring/MetricsCollector");
65
+ const NotificationManager_1 = require("./notifications/NotificationManager");
66
+ const SmartCodeAssistant_1 = require("./assistant/SmartCodeAssistant");
67
+ const zod_1 = require("zod");
68
+ // Validation schemas
69
+ const AgentConfigSchema = zod_1.z.object({
70
+ name: zod_1.z.string().min(1).max(100),
71
+ projectPath: zod_1.z.string().min(1),
72
+ providerId: zod_1.z.string(),
73
+ model: zod_1.z.string(),
74
+ skills: zod_1.z.array(zod_1.z.string()).optional(),
75
+ systemPrompt: zod_1.z.string().optional(),
76
+ }).strict();
77
+ const store = new electron_store_1.default();
78
+ let mainWindow = null;
79
+ let agentOrchestrator;
80
+ let gitWorktreeManager;
81
+ let skillsManager;
82
+ let automationScheduler;
83
+ let dbManager;
84
+ let settingsManager;
85
+ let aiProviderManager;
86
+ let securityManager;
87
+ let auditLogger;
88
+ let backupManager;
89
+ let migrationManager;
90
+ let apiServer;
91
+ let pluginManager;
92
+ let coworkManager;
93
+ let githubPRMonitor;
94
+ let mcpManager;
95
+ let aiPairProgramming;
96
+ let errorTracker;
97
+ let notificationManager;
98
+ let smartCodeAssistant;
99
+ electron_log_1.default.info('Starting Codex Linux...');
100
+ function createWindow() {
101
+ mainWindow = new electron_1.BrowserWindow({
102
+ width: 1600,
103
+ height: 1000,
104
+ minWidth: 1200,
105
+ minHeight: 800,
106
+ titleBarStyle: 'hiddenInset',
107
+ webPreferences: {
108
+ nodeIntegration: false,
109
+ contextIsolation: true,
110
+ preload: path.join(__dirname, 'preload.js'),
111
+ sandbox: false
112
+ },
113
+ show: false,
114
+ icon: path.join(__dirname, '../../assets/icon.png')
115
+ });
116
+ if (process.env.VITE_DEV_SERVER_URL) {
117
+ mainWindow.loadURL(process.env.VITE_DEV_SERVER_URL);
118
+ mainWindow.webContents.openDevTools();
119
+ }
120
+ else {
121
+ mainWindow.loadFile(path.join(__dirname, '../renderer/index.html'));
122
+ }
123
+ mainWindow.once('ready-to-show', () => {
124
+ mainWindow?.show();
125
+ });
126
+ mainWindow.on('closed', () => {
127
+ mainWindow = null;
128
+ });
129
+ }
130
+ let tray = null;
131
+ function createTray() {
132
+ const iconPath = path.join(__dirname, '../../assets/icon.png');
133
+ try {
134
+ const icon = electron_1.nativeImage.createFromPath(iconPath);
135
+ tray = new electron_1.Tray(icon.isEmpty() ? electron_1.nativeImage.createEmpty() : icon);
136
+ const contextMenu = electron_1.Menu.buildFromTemplate([
137
+ {
138
+ label: 'Show Codex',
139
+ click: () => {
140
+ if (mainWindow) {
141
+ mainWindow.show();
142
+ mainWindow.focus();
143
+ }
144
+ }
145
+ },
146
+ { type: 'separator' },
147
+ {
148
+ label: 'New Agent',
149
+ click: () => {
150
+ if (mainWindow) {
151
+ mainWindow.show();
152
+ mainWindow.webContents.send('create-new-agent');
153
+ }
154
+ }
155
+ },
156
+ {
157
+ label: 'Open Settings',
158
+ click: () => {
159
+ if (mainWindow) {
160
+ mainWindow.show();
161
+ mainWindow.webContents.send('open-settings');
162
+ }
163
+ }
164
+ },
165
+ { type: 'separator' },
166
+ {
167
+ label: 'Quit',
168
+ click: () => {
169
+ electron_1.app.quit();
170
+ }
171
+ }
172
+ ]);
173
+ tray.setToolTip('Codex Linux');
174
+ tray.setContextMenu(contextMenu);
175
+ tray.on('click', () => {
176
+ if (mainWindow) {
177
+ if (mainWindow.isVisible()) {
178
+ mainWindow.hide();
179
+ }
180
+ else {
181
+ mainWindow.show();
182
+ mainWindow.focus();
183
+ }
184
+ }
185
+ });
186
+ electron_log_1.default.info('System tray initialized');
187
+ }
188
+ catch (error) {
189
+ electron_log_1.default.warn('Failed to create system tray:', error);
190
+ }
191
+ }
192
+ function registerGlobalShortcuts() {
193
+ try {
194
+ electron_1.globalShortcut.register('CommandOrControl+Shift+C', () => {
195
+ if (mainWindow) {
196
+ if (mainWindow.isVisible()) {
197
+ mainWindow.hide();
198
+ }
199
+ else {
200
+ mainWindow.show();
201
+ mainWindow.focus();
202
+ }
203
+ }
204
+ });
205
+ electron_1.globalShortcut.register('CommandOrControl+Shift+N', () => {
206
+ if (mainWindow) {
207
+ mainWindow.show();
208
+ mainWindow.webContents.send('create-new-agent');
209
+ }
210
+ });
211
+ electron_1.globalShortcut.register('CommandOrControl+Shift+K', () => {
212
+ if (mainWindow) {
213
+ mainWindow.show();
214
+ mainWindow.webContents.send('open-search');
215
+ }
216
+ });
217
+ electron_log_1.default.info('Global shortcuts registered');
218
+ }
219
+ catch (error) {
220
+ electron_log_1.default.warn('Failed to register global shortcuts:', error);
221
+ }
222
+ }
223
+ async function initializeServices() {
224
+ try {
225
+ // Initialize security first
226
+ securityManager = new SecurityManager_1.SecurityManager();
227
+ await securityManager.initialize();
228
+ electron_log_1.default.info('Security manager initialized');
229
+ // Initialize database
230
+ dbManager = new DatabaseManager_1.DatabaseManager();
231
+ await dbManager.initialize();
232
+ electron_log_1.default.info('Database initialized');
233
+ // Run migrations
234
+ migrationManager = new MigrationManager_1.MigrationManager(dbManager);
235
+ await migrationManager.initialize();
236
+ electron_log_1.default.info('Migrations completed');
237
+ // Initialize settings
238
+ settingsManager = new SettingsManager_1.SettingsManager(store);
239
+ electron_log_1.default.info('Settings manager initialized');
240
+ // Initialize AI provider manager
241
+ aiProviderManager = new AIProviderManager_1.AIProviderManager(settingsManager);
242
+ electron_log_1.default.info('AI provider manager initialized');
243
+ // Initialize notification manager
244
+ notificationManager = new NotificationManager_1.NotificationManager();
245
+ electron_log_1.default.info('Notification manager initialized');
246
+ // Initialize Git worktree manager
247
+ gitWorktreeManager = new GitWorktreeManager_1.GitWorktreeManager();
248
+ electron_log_1.default.info('Git worktree manager initialized');
249
+ // Initialize skills manager
250
+ skillsManager = new SkillsManager_1.SkillsManager();
251
+ await skillsManager.initialize();
252
+ electron_log_1.default.info('Skills manager initialized');
253
+ // Initialize automation scheduler
254
+ automationScheduler = new AutomationScheduler_1.AutomationScheduler();
255
+ automationScheduler.setNotificationManager(notificationManager);
256
+ await automationScheduler.initialize();
257
+ electron_log_1.default.info('Automation scheduler initialized');
258
+ // Initialize agent orchestrator
259
+ agentOrchestrator = new AgentOrchestrator_1.AgentOrchestrator(aiProviderManager, gitWorktreeManager, skillsManager, dbManager);
260
+ await agentOrchestrator.initialize();
261
+ electron_log_1.default.info('Agent orchestrator initialized');
262
+ agentOrchestrator.on('changes:created', (payload) => {
263
+ if (mainWindow) {
264
+ mainWindow.webContents.send('changes:created', payload);
265
+ }
266
+ });
267
+ agentOrchestrator.on('agent:taskCompleted', (payload) => {
268
+ if (mainWindow) {
269
+ mainWindow.webContents.send('agent:taskCompleted', payload);
270
+ }
271
+ });
272
+ agentOrchestrator.on('agent:taskStarted', (payload) => {
273
+ if (mainWindow) {
274
+ mainWindow.webContents.send('agent:taskStarted', payload);
275
+ }
276
+ });
277
+ agentOrchestrator.on('agent:taskFailed', (payload) => {
278
+ if (mainWindow) {
279
+ mainWindow.webContents.send('agent:taskFailed', payload);
280
+ }
281
+ });
282
+ agentOrchestrator.on('agent:paused', (payload) => {
283
+ if (mainWindow) {
284
+ mainWindow.webContents.send('agent:paused', payload);
285
+ }
286
+ });
287
+ agentOrchestrator.on('agent:resumed', (payload) => {
288
+ if (mainWindow) {
289
+ mainWindow.webContents.send('agent:resumed', payload);
290
+ }
291
+ });
292
+ agentOrchestrator.on('agent:stopped', (payload) => {
293
+ if (mainWindow) {
294
+ mainWindow.webContents.send('agent:stopped', payload);
295
+ }
296
+ });
297
+ // Initialize backup manager
298
+ backupManager = new BackupManager_1.BackupManager();
299
+ await backupManager.initialize();
300
+ electron_log_1.default.info('Backup manager initialized');
301
+ // Initialize plugin manager
302
+ pluginManager = new PluginManager_1.PluginManager();
303
+ await pluginManager.initialize();
304
+ electron_log_1.default.info('Plugin manager initialized');
305
+ // Initialize cowork manager
306
+ coworkManager = new CoworkManager_1.CoworkManager(agentOrchestrator, dbManager, notificationManager);
307
+ await coworkManager.initialize();
308
+ electron_log_1.default.info('Cowork manager initialized');
309
+ // Initialize AI pair programming
310
+ aiPairProgramming = new AIPairProgramming_1.AIPairProgramming(agentOrchestrator, aiProviderManager);
311
+ electron_log_1.default.info('AI pair programming initialized');
312
+ // Initialize smart code assistant
313
+ smartCodeAssistant = new SmartCodeAssistant_1.SmartCodeAssistant(aiProviderManager);
314
+ electron_log_1.default.info('Smart code assistant initialized');
315
+ // Initialize MCP manager
316
+ mcpManager = new MCPManager_1.MCPManager();
317
+ await mcpManager.initialize();
318
+ electron_log_1.default.info('MCP manager initialized');
319
+ // Initialize audit logger
320
+ auditLogger = new AuditLogger_1.AuditLogger();
321
+ await auditLogger.initialize();
322
+ electron_log_1.default.info('Audit logger initialized');
323
+ const sentryDsn = settingsManager.get('sentryDsn');
324
+ if (sentryDsn) {
325
+ errorTracker = new ErrorTracker_1.ErrorTracker();
326
+ errorTracker.initialize(sentryDsn);
327
+ electron_log_1.default.info('Error tracker initialized');
328
+ }
329
+ // Start system metrics
330
+ (0, MetricsCollector_1.startSystemMetrics)();
331
+ electron_log_1.default.info('System metrics started');
332
+ // Initialize API server
333
+ apiServer = new APIServer_1.APIServer(agentOrchestrator, securityManager, auditLogger);
334
+ await apiServer.start();
335
+ electron_log_1.default.info('API server started on port 3001');
336
+ // Initialize GitHub PR Monitor if token available
337
+ const githubToken = settingsManager.get('githubToken');
338
+ if (githubToken) {
339
+ githubPRMonitor = new GitHubPRMonitor_1.GitHubPRMonitor(githubToken, agentOrchestrator, gitWorktreeManager, notificationManager);
340
+ await githubPRMonitor.initialize();
341
+ electron_log_1.default.info('GitHub PR monitor initialized');
342
+ }
343
+ }
344
+ catch (error) {
345
+ electron_log_1.default.error('Failed to initialize services:', error);
346
+ throw error;
347
+ }
348
+ }
349
+ // App event handlers
350
+ electron_1.app.whenReady().then(async () => {
351
+ try {
352
+ await initializeServices();
353
+ createWindow();
354
+ createTray();
355
+ registerGlobalShortcuts();
356
+ setupIPC();
357
+ setupAutoUpdater();
358
+ setupAutoUpdaterIPC();
359
+ electron_1.app.on('activate', () => {
360
+ if (electron_1.BrowserWindow.getAllWindows().length === 0) {
361
+ createWindow();
362
+ }
363
+ });
364
+ }
365
+ catch (error) {
366
+ electron_log_1.default.error('Failed to start application:', error);
367
+ electron_1.dialog.showErrorBox('Startup Error', 'Failed to initialize Codex Linux. Please check the logs.');
368
+ electron_1.app.quit();
369
+ }
370
+ });
371
+ electron_1.app.on('window-all-closed', () => {
372
+ if (process.platform !== 'darwin') {
373
+ electron_1.app.quit();
374
+ }
375
+ });
376
+ electron_1.app.on('before-quit', async () => {
377
+ await cleanup();
378
+ });
379
+ function setupAutoUpdater() {
380
+ if (electron_1.app.isPackaged) {
381
+ electron_updater_1.autoUpdater.logger = electron_log_1.default;
382
+ electron_updater_1.autoUpdater.autoDownload = true;
383
+ electron_updater_1.autoUpdater.autoInstallOnAppQuit = true;
384
+ electron_updater_1.autoUpdater.on('checking-for-update', () => {
385
+ electron_log_1.default.info('Checking for updates...');
386
+ });
387
+ electron_updater_1.autoUpdater.on('update-available', (info) => {
388
+ electron_log_1.default.info('Update available:', info.version);
389
+ if (mainWindow) {
390
+ mainWindow.webContents.send('update-available', info);
391
+ }
392
+ });
393
+ electron_updater_1.autoUpdater.on('update-not-available', () => {
394
+ electron_log_1.default.info('No updates available');
395
+ });
396
+ electron_updater_1.autoUpdater.on('download-progress', (progress) => {
397
+ electron_log_1.default.info(`Download progress: ${progress.percent}%`);
398
+ if (mainWindow) {
399
+ mainWindow.webContents.send('update-progress', progress);
400
+ }
401
+ });
402
+ electron_updater_1.autoUpdater.on('update-downloaded', (info) => {
403
+ electron_log_1.default.info('Update downloaded:', info.version);
404
+ if (mainWindow) {
405
+ mainWindow.webContents.send('update-downloaded', info);
406
+ }
407
+ if (electron_1.Notification.isSupported()) {
408
+ new electron_1.Notification({
409
+ title: 'Update Ready',
410
+ body: `Codex Linux ${info.version} is ready to install. Restart to update.`
411
+ }).show();
412
+ }
413
+ });
414
+ electron_updater_1.autoUpdater.on('error', (error) => {
415
+ electron_log_1.default.error('Auto-updater error:', error);
416
+ });
417
+ electron_updater_1.autoUpdater.checkForUpdatesAndNotify().catch(err => {
418
+ electron_log_1.default.warn('Failed to check for updates:', err);
419
+ });
420
+ }
421
+ }
422
+ function setupAutoUpdaterIPC() {
423
+ electron_1.ipcMain.handle('update:check', async () => {
424
+ if (!electron_1.app.isPackaged) {
425
+ return { available: false, message: 'Updates only work in packaged app' };
426
+ }
427
+ try {
428
+ const result = await electron_updater_1.autoUpdater.checkForUpdates();
429
+ return { available: !!result?.updateInfo, version: result?.updateInfo?.version };
430
+ }
431
+ catch (error) {
432
+ electron_log_1.default.error('Update check failed:', error);
433
+ return { available: false, message: 'Update check failed' };
434
+ }
435
+ });
436
+ electron_1.ipcMain.handle('update:download', async () => {
437
+ if (!electron_1.app.isPackaged) {
438
+ return { success: false, message: 'Updates only work in packaged app' };
439
+ }
440
+ try {
441
+ await electron_updater_1.autoUpdater.downloadUpdate();
442
+ return { success: true };
443
+ }
444
+ catch (error) {
445
+ electron_log_1.default.error('Update download failed:', error);
446
+ return { success: false, message: 'Update download failed' };
447
+ }
448
+ });
449
+ electron_1.ipcMain.handle('update:install', () => {
450
+ electron_updater_1.autoUpdater.quitAndInstall(false, true);
451
+ });
452
+ }
453
+ async function cleanup() {
454
+ electron_log_1.default.info('Starting cleanup...');
455
+ try {
456
+ electron_1.globalShortcut.unregisterAll();
457
+ tray?.destroy();
458
+ tray = null;
459
+ if (agentOrchestrator) {
460
+ agentOrchestrator.removeAllListeners('changes:created');
461
+ agentOrchestrator.removeAllListeners('agent:taskCompleted');
462
+ agentOrchestrator.removeAllListeners('agent:taskStarted');
463
+ agentOrchestrator.removeAllListeners('agent:taskFailed');
464
+ agentOrchestrator.removeAllListeners('agent:paused');
465
+ agentOrchestrator.removeAllListeners('agent:resumed');
466
+ agentOrchestrator.removeAllListeners('agent:stopped');
467
+ }
468
+ await Promise.all([
469
+ agentOrchestrator?.cleanup(),
470
+ automationScheduler?.cleanup(),
471
+ coworkManager?.cleanup(),
472
+ apiServer?.stop(),
473
+ pluginManager?.cleanup(),
474
+ mcpManager?.cleanup(),
475
+ githubPRMonitor?.cleanup(),
476
+ backupManager?.cleanup?.(),
477
+ auditLogger?.cleanup?.(),
478
+ dbManager?.close()
479
+ ]);
480
+ electron_log_1.default.info('Cleanup completed');
481
+ }
482
+ catch (error) {
483
+ electron_log_1.default.error('Error during cleanup:', error);
484
+ }
485
+ }
486
+ function setupIPC() {
487
+ // Window controls
488
+ electron_1.ipcMain.handle('window:minimize', () => {
489
+ mainWindow?.minimize();
490
+ });
491
+ electron_1.ipcMain.handle('window:maximize', () => {
492
+ if (mainWindow?.isMaximized()) {
493
+ mainWindow.unmaximize();
494
+ }
495
+ else {
496
+ mainWindow?.maximize();
497
+ }
498
+ });
499
+ electron_1.ipcMain.handle('window:close', () => {
500
+ mainWindow?.close();
501
+ });
502
+ // File system operations
503
+ electron_1.ipcMain.handle('dialog:selectFolder', async () => {
504
+ if (!mainWindow) {
505
+ throw new Error('No main window available');
506
+ }
507
+ const result = await electron_1.dialog.showOpenDialog(mainWindow, {
508
+ properties: ['openDirectory']
509
+ });
510
+ return result.filePaths[0] || null;
511
+ });
512
+ electron_1.ipcMain.handle('dialog:selectFile', async (event, filters) => {
513
+ if (!mainWindow) {
514
+ throw new Error('No main window available');
515
+ }
516
+ const result = await electron_1.dialog.showOpenDialog(mainWindow, {
517
+ properties: ['openFile'],
518
+ filters
519
+ });
520
+ return result.filePaths[0] || null;
521
+ });
522
+ electron_1.ipcMain.handle('shell:openExternal', (event, url) => {
523
+ electron_1.shell.openExternal(url);
524
+ });
525
+ electron_1.ipcMain.handle('shell:openPath', (event, path) => {
526
+ electron_1.shell.openPath(path);
527
+ });
528
+ // Agent operations with validation
529
+ electron_1.ipcMain.handle('agent:create', async (event, config) => {
530
+ try {
531
+ const validatedConfig = AgentConfigSchema.parse(config);
532
+ const result = await agentOrchestrator.createAgent(validatedConfig);
533
+ await auditLogger.log('agent_created', { agentId: result.id });
534
+ return result;
535
+ }
536
+ catch (error) {
537
+ electron_log_1.default.error('Failed to create agent:', error);
538
+ throw error;
539
+ }
540
+ });
541
+ electron_1.ipcMain.handle('agent:list', async () => {
542
+ return await agentOrchestrator.listAgents();
543
+ });
544
+ electron_1.ipcMain.handle('agent:get', async (event, agentId) => {
545
+ return await agentOrchestrator.getAgent(agentId);
546
+ });
547
+ electron_1.ipcMain.handle('agent:sendMessage', async (event, agentId, message) => {
548
+ try {
549
+ return await agentOrchestrator.sendMessage(agentId, message);
550
+ }
551
+ catch (error) {
552
+ electron_log_1.default.error('Failed to send message:', error);
553
+ throw error;
554
+ }
555
+ });
556
+ electron_1.ipcMain.handle('agent:sendMessageStream', async (event, agentId, message) => {
557
+ try {
558
+ const stream = await agentOrchestrator.sendMessageStream(agentId, message, {
559
+ onChunk: (chunk) => {
560
+ event.sender.send('agent:streamChunk', { agentId, chunk });
561
+ },
562
+ onComplete: () => {
563
+ event.sender.send('agent:streamEnd', { agentId });
564
+ },
565
+ onError: (error) => {
566
+ event.sender.send('agent:streamError', { agentId, error: error.message });
567
+ }
568
+ });
569
+ return { success: true };
570
+ }
571
+ catch (error) {
572
+ electron_log_1.default.error('Failed to start stream:', error);
573
+ throw error;
574
+ }
575
+ });
576
+ electron_1.ipcMain.handle('agent:executeTask', async (event, agentId, task) => {
577
+ return await agentOrchestrator.executeTask(agentId, task);
578
+ });
579
+ electron_1.ipcMain.handle('agent:pause', async (event, agentId) => {
580
+ return await agentOrchestrator.pauseAgent(agentId);
581
+ });
582
+ electron_1.ipcMain.handle('agent:resume', async (event, agentId) => {
583
+ return await agentOrchestrator.resumeAgent(agentId);
584
+ });
585
+ electron_1.ipcMain.handle('agent:stop', async (event, agentId) => {
586
+ return await agentOrchestrator.stopAgent(agentId);
587
+ });
588
+ electron_1.ipcMain.handle('agent:delete', async (event, agentId) => {
589
+ try {
590
+ await agentOrchestrator.deleteAgent(agentId);
591
+ await auditLogger.log('agent_deleted', { agentId });
592
+ return { success: true };
593
+ }
594
+ catch (error) {
595
+ electron_log_1.default.error('Failed to delete agent:', error);
596
+ throw error;
597
+ }
598
+ });
599
+ // Worktree operations
600
+ electron_1.ipcMain.handle('worktree:create', async (event, repoPath, name) => {
601
+ return await gitWorktreeManager.createWorktree(repoPath, name);
602
+ });
603
+ electron_1.ipcMain.handle('worktree:list', async (event, repoPath) => {
604
+ return await gitWorktreeManager.listWorktrees(repoPath);
605
+ });
606
+ electron_1.ipcMain.handle('worktree:remove', async (event, repoPath, name) => {
607
+ return await gitWorktreeManager.removeWorktree(repoPath, name);
608
+ });
609
+ // Skills operations
610
+ electron_1.ipcMain.handle('skills:list', async () => {
611
+ return await skillsManager.listSkills();
612
+ });
613
+ electron_1.ipcMain.handle('skills:get', async (event, skillId) => {
614
+ return await skillsManager.getSkill(skillId);
615
+ });
616
+ electron_1.ipcMain.handle('skills:create', async (event, skillConfig) => {
617
+ return await skillsManager.createSkill(skillConfig);
618
+ });
619
+ electron_1.ipcMain.handle('skills:update', async (event, skillId, skillConfig) => {
620
+ return await skillsManager.updateSkill(skillId, skillConfig);
621
+ });
622
+ electron_1.ipcMain.handle('skills:delete', async (event, skillId) => {
623
+ return await skillsManager.deleteSkill(skillId);
624
+ });
625
+ electron_1.ipcMain.handle('skills:applyToAgent', async (event, agentId, skillIds) => {
626
+ return await agentOrchestrator.applySkills(agentId, skillIds);
627
+ });
628
+ // Automation operations
629
+ electron_1.ipcMain.handle('automation:list', async () => {
630
+ return await automationScheduler.listAutomations();
631
+ });
632
+ electron_1.ipcMain.handle('automation:create', async (event, config) => {
633
+ return await automationScheduler.createAutomation(config);
634
+ });
635
+ electron_1.ipcMain.handle('automation:update', async (event, automationId, config) => {
636
+ return await automationScheduler.updateAutomation(automationId, config);
637
+ });
638
+ electron_1.ipcMain.handle('automation:delete', async (event, automationId) => {
639
+ return await automationScheduler.deleteAutomation(automationId);
640
+ });
641
+ electron_1.ipcMain.handle('automation:toggle', async (event, automationId, enabled) => {
642
+ return await automationScheduler.toggleAutomation(automationId, enabled);
643
+ });
644
+ // Settings operations
645
+ electron_1.ipcMain.handle('settings:get', (event, key) => {
646
+ return settingsManager.getAny(key);
647
+ });
648
+ electron_1.ipcMain.handle('settings:set', (event, key, value) => {
649
+ settingsManager.setAny(key, value);
650
+ });
651
+ electron_1.ipcMain.handle('settings:getAll', () => {
652
+ return settingsManager.getAll();
653
+ });
654
+ // AI Provider operations
655
+ electron_1.ipcMain.handle('providers:list', () => {
656
+ return aiProviderManager.listProviders();
657
+ });
658
+ electron_1.ipcMain.handle('providers:getActive', () => {
659
+ return aiProviderManager.getActiveProvider();
660
+ });
661
+ electron_1.ipcMain.handle('providers:setActive', (event, providerId) => {
662
+ return aiProviderManager.setActiveProvider(providerId);
663
+ });
664
+ electron_1.ipcMain.handle('providers:configure', (event, providerId, config) => {
665
+ return aiProviderManager.configureProvider(providerId, config);
666
+ });
667
+ electron_1.ipcMain.handle('providers:test', async (event, providerId) => {
668
+ return await aiProviderManager.testProvider(providerId);
669
+ });
670
+ // File system operations
671
+ electron_1.ipcMain.handle('fs:readdir', async (event, dirPath, options) => {
672
+ try {
673
+ const normalizedPath = path.normalize(dirPath);
674
+ if (normalizedPath.includes('..')) {
675
+ throw new Error('Path traversal not allowed');
676
+ }
677
+ const entries = await fs.readdir(normalizedPath, { withFileTypes: true });
678
+ return entries.map((entry) => ({
679
+ name: entry.name,
680
+ isDirectory: entry.isDirectory(),
681
+ isFile: entry.isFile()
682
+ }));
683
+ }
684
+ catch (error) {
685
+ electron_log_1.default.error('Failed to read directory:', error);
686
+ throw error;
687
+ }
688
+ });
689
+ electron_1.ipcMain.handle('fs:readFile', async (event, filePath, encoding) => {
690
+ try {
691
+ const normalizedPath = path.normalize(filePath);
692
+ if (normalizedPath.includes('..')) {
693
+ throw new Error('Path traversal not allowed');
694
+ }
695
+ const content = await fs.readFile(normalizedPath, encoding || 'utf-8');
696
+ return content;
697
+ }
698
+ catch (error) {
699
+ electron_log_1.default.error('Failed to read file:', error);
700
+ throw error;
701
+ }
702
+ });
703
+ electron_1.ipcMain.handle('fs:writeFile', async (event, filePath, content) => {
704
+ if (!filePath || typeof filePath !== 'string') {
705
+ throw new Error('File path is required');
706
+ }
707
+ const normalizedPath = path.normalize(filePath);
708
+ if (normalizedPath.includes('..') || normalizedPath.startsWith('/etc') || normalizedPath.startsWith('/root') || normalizedPath.startsWith('/sys') || normalizedPath.startsWith('/proc')) {
709
+ throw new Error('Path traversal or restricted path not allowed');
710
+ }
711
+ try {
712
+ await fs.writeFile(normalizedPath, content, 'utf-8');
713
+ }
714
+ catch (error) {
715
+ electron_log_1.default.error('Failed to write file:', error);
716
+ throw error;
717
+ }
718
+ });
719
+ electron_1.ipcMain.handle('fs:stat', async (event, filePath) => {
720
+ try {
721
+ const normalizedPath = path.normalize(filePath);
722
+ if (normalizedPath.includes('..')) {
723
+ throw new Error('Path traversal not allowed');
724
+ }
725
+ const stats = await fs.stat(normalizedPath);
726
+ return {
727
+ isFile: stats.isFile(),
728
+ isDirectory: stats.isDirectory(),
729
+ size: stats.size,
730
+ mtime: stats.mtime,
731
+ ctime: stats.ctime
732
+ };
733
+ }
734
+ catch (error) {
735
+ electron_log_1.default.error('Failed to stat file:', error);
736
+ throw error;
737
+ }
738
+ });
739
+ // Terminal operations
740
+ const ALLOWED_COMMANDS = new Set([
741
+ 'npm', 'node', 'pnpm', 'yarn', 'bun', 'deno',
742
+ 'git', 'docker', 'docker-compose', 'kubectl',
743
+ 'python', 'python3', 'pip', 'pip3',
744
+ 'make', 'cmake', 'gcc', 'g++', 'clang', 'rustc',
745
+ 'cargo', 'go', 'java', 'javac', 'gradle', 'maven',
746
+ 'ls', 'cat', 'grep', 'find', 'chmod', 'chown', 'mkdir', 'rm', 'rmdir', 'cp', 'mv', 'touch',
747
+ 'code', 'codex', 'opencode'
748
+ ]);
749
+ const terminalProcesses = new Map();
750
+ let terminalIdCounter = 0;
751
+ function parseCommandLine(command) {
752
+ const args = [];
753
+ let current = '';
754
+ let inQuote = false;
755
+ let quoteChar = '';
756
+ for (let i = 0; i < command.length; i++) {
757
+ const char = command[i];
758
+ if ((char === '"' || char === "'") && !inQuote) {
759
+ inQuote = true;
760
+ quoteChar = char;
761
+ }
762
+ else if (char === quoteChar && inQuote) {
763
+ inQuote = false;
764
+ quoteChar = '';
765
+ }
766
+ else if (char === ' ' && !inQuote) {
767
+ if (current) {
768
+ args.push(current);
769
+ current = '';
770
+ }
771
+ }
772
+ else {
773
+ current += char;
774
+ }
775
+ }
776
+ if (current)
777
+ args.push(current);
778
+ return args;
779
+ }
780
+ electron_1.ipcMain.handle('terminal:execute', async (event, { command, cwd }) => {
781
+ if (!command || typeof command !== 'string') {
782
+ throw new Error('Command is required');
783
+ }
784
+ if (!cwd || typeof cwd !== 'string') {
785
+ throw new Error('CWD is required');
786
+ }
787
+ const parsedArgs = parseCommandLine(command);
788
+ if (parsedArgs.length === 0) {
789
+ throw new Error('Command is required');
790
+ }
791
+ const cmd = parsedArgs[0];
792
+ const args = parsedArgs.slice(1);
793
+ if (!ALLOWED_COMMANDS.has(cmd)) {
794
+ throw new Error(`Command "${cmd}" is not allowed. Allowed commands: ${[...ALLOWED_COMMANDS].join(', ')}`);
795
+ }
796
+ const currentTerminalId = ++terminalIdCounter;
797
+ return new Promise((resolve) => {
798
+ const proc = (0, child_process_1.spawn)(cmd, args, {
799
+ cwd,
800
+ shell: false,
801
+ env: { ...process.env, FORCE_COLOR: '1' }
802
+ });
803
+ terminalProcesses.set(currentTerminalId, proc);
804
+ let stdout = '';
805
+ let stderr = '';
806
+ proc.stdout?.on('data', (data) => {
807
+ stdout += data.toString();
808
+ });
809
+ proc.stderr?.on('data', (data) => {
810
+ stderr += data.toString();
811
+ });
812
+ const cleanup = () => {
813
+ terminalProcesses.delete(currentTerminalId);
814
+ };
815
+ proc.on('close', (code) => {
816
+ cleanup();
817
+ resolve({
818
+ stdout,
819
+ stderr,
820
+ exitCode: code,
821
+ error: code !== 0 ? `Process exited with code ${code}` : null
822
+ });
823
+ });
824
+ proc.on('error', (error) => {
825
+ cleanup();
826
+ resolve({
827
+ stdout,
828
+ stderr,
829
+ exitCode: -1,
830
+ error: error.message
831
+ });
832
+ });
833
+ });
834
+ });
835
+ electron_1.ipcMain.handle('terminal:kill', () => {
836
+ for (const [id, proc] of terminalProcesses) {
837
+ proc.kill();
838
+ terminalProcesses.delete(id);
839
+ }
840
+ });
841
+ // Code changes operations
842
+ electron_1.ipcMain.handle('changes:list', async (event, agentId) => {
843
+ return await dbManager.getCodeChanges(agentId);
844
+ });
845
+ electron_1.ipcMain.handle('changes:approve', async (event, changeId) => {
846
+ return await dbManager.approveCodeChange(changeId);
847
+ });
848
+ electron_1.ipcMain.handle('changes:reject', async (event, changeId, comment) => {
849
+ return await dbManager.rejectCodeChange(changeId, comment);
850
+ });
851
+ electron_1.ipcMain.handle('changes:apply', async (event, changeId) => {
852
+ return await dbManager.applyCodeChange(changeId);
853
+ });
854
+ // Checkpoints operations
855
+ electron_1.ipcMain.handle('checkpoints:list', async (event, agentId) => {
856
+ return await dbManager.listCheckpoints(agentId);
857
+ });
858
+ electron_1.ipcMain.handle('checkpoints:restore', async (event, checkpointId) => {
859
+ return await dbManager.restoreCheckpoint(checkpointId);
860
+ });
861
+ electron_1.ipcMain.handle('checkpoints:restoreLast', async (event, agentId) => {
862
+ return await dbManager.restoreLastCheckpoint(agentId);
863
+ });
864
+ // Agent queue operations
865
+ electron_1.ipcMain.handle('queue:list', async (event, agentId) => {
866
+ return await dbManager.listAgentQueueItems(agentId);
867
+ });
868
+ electron_1.ipcMain.handle('queue:enqueue', async (event, agentId, type, content) => {
869
+ return await dbManager.enqueueAgentQueueItem(agentId, type, content);
870
+ });
871
+ electron_1.ipcMain.handle('queue:delete', async (event, agentId, itemId) => {
872
+ return await dbManager.deleteAgentQueueItem(agentId, itemId);
873
+ });
874
+ electron_1.ipcMain.handle('queue:moveUp', async (event, agentId, itemId) => {
875
+ return await dbManager.moveAgentQueueItemUp(agentId, itemId);
876
+ });
877
+ electron_1.ipcMain.handle('queue:claimNext', async (event, agentId) => {
878
+ return await dbManager.claimNextAgentQueueItem(agentId);
879
+ });
880
+ electron_1.ipcMain.handle('queue:complete', async (event, agentId, itemId, outcome, error) => {
881
+ return await dbManager.completeAgentQueueItem(agentId, itemId, outcome, error);
882
+ });
883
+ electron_1.ipcMain.handle('queue:history', async (event, agentId, limit) => {
884
+ return await dbManager.getQueueHistory(agentId, limit);
885
+ });
886
+ // Git operations
887
+ electron_1.ipcMain.handle('git:status', async (event, repoPath) => {
888
+ return await gitWorktreeManager.getChanges(repoPath);
889
+ });
890
+ electron_1.ipcMain.handle('git:commit', async (event, { repoPath, message, files }) => {
891
+ return await gitWorktreeManager.commitChanges(repoPath, message, files);
892
+ });
893
+ electron_1.ipcMain.handle('git:diff', async (event, { repoPath, filePath }) => {
894
+ return await gitWorktreeManager.getDiff(repoPath, filePath);
895
+ });
896
+ // Search operations
897
+ electron_1.ipcMain.handle('search:files', async (event, { query, path, pattern }) => {
898
+ try {
899
+ const results = [];
900
+ async function searchDir(dirPath) {
901
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
902
+ for (const entry of entries) {
903
+ const fullPath = `${dirPath}/${entry.name}`;
904
+ if (entry.isDirectory()) {
905
+ if (!entry.name.startsWith('.') &&
906
+ entry.name !== 'node_modules' &&
907
+ entry.name !== 'dist' &&
908
+ entry.name !== 'build') {
909
+ await searchDir(fullPath);
910
+ }
911
+ }
912
+ else if (entry.isFile()) {
913
+ if (pattern && !entry.name.match(pattern))
914
+ continue;
915
+ try {
916
+ const content = await fs.readFile(fullPath, 'utf-8');
917
+ const lines = content.split('\n');
918
+ const matches = [];
919
+ lines.forEach((line, index) => {
920
+ if (line.toLowerCase().includes(query.toLowerCase())) {
921
+ matches.push({ line: index + 1, content: line.trim() });
922
+ }
923
+ });
924
+ if (matches.length > 0) {
925
+ results.push({ path: fullPath, matches });
926
+ }
927
+ }
928
+ catch {
929
+ // Skip binary or unreadable files
930
+ }
931
+ }
932
+ }
933
+ }
934
+ await searchDir(path);
935
+ return results;
936
+ }
937
+ catch (error) {
938
+ electron_log_1.default.error('Search failed:', error);
939
+ throw error;
940
+ }
941
+ });
942
+ // Audit log operations
943
+ electron_1.ipcMain.handle('audit:recent', async (event, limit = 100) => {
944
+ return await auditLogger.getRecentEvents(limit);
945
+ });
946
+ electron_1.ipcMain.handle('audit:byAction', async (event, action, limit = 100) => {
947
+ return await auditLogger.getEventsByAction(action, limit);
948
+ });
949
+ electron_1.ipcMain.handle('audit:export', async (event, exportPath) => {
950
+ await auditLogger.exportLogs(exportPath);
951
+ return { success: true };
952
+ });
953
+ electron_1.ipcMain.handle('notification:show', (event, { title, body }) => {
954
+ if (electron_1.Notification.isSupported()) {
955
+ new electron_1.Notification({
956
+ title,
957
+ body,
958
+ icon: path.join(__dirname, '../../assets/icon.png')
959
+ }).show();
960
+ }
961
+ });
962
+ // Export/Import
963
+ electron_1.ipcMain.handle('data:export', async (event, exportPath) => {
964
+ try {
965
+ const data = {
966
+ agents: await dbManager.getAllAgents(),
967
+ automations: await automationScheduler.listAutomations(),
968
+ skills: await skillsManager.listSkills(),
969
+ settings: settingsManager.getAll(),
970
+ exportedAt: new Date().toISOString()
971
+ };
972
+ await fs.writeFile(exportPath, JSON.stringify(data, null, 2), 'utf-8');
973
+ return true;
974
+ }
975
+ catch (error) {
976
+ electron_log_1.default.error('Export failed:', error);
977
+ throw error;
978
+ }
979
+ });
980
+ electron_1.ipcMain.handle('data:import', async (event, importPath) => {
981
+ try {
982
+ const normalizedPath = path.normalize(importPath);
983
+ if (normalizedPath.includes('..')) {
984
+ throw new Error('Path traversal not allowed');
985
+ }
986
+ const content = await fs.readFile(normalizedPath, 'utf-8');
987
+ let data;
988
+ try {
989
+ data = JSON.parse(content);
990
+ }
991
+ catch {
992
+ throw new Error('Invalid JSON format');
993
+ }
994
+ if (!data || typeof data !== 'object') {
995
+ throw new Error('Invalid import data: must be an object');
996
+ }
997
+ if (data.agents) {
998
+ if (!Array.isArray(data.agents)) {
999
+ throw new Error('Invalid import data: agents must be an array');
1000
+ }
1001
+ for (const agent of data.agents) {
1002
+ if (!agent.name || !agent.projectPath || typeof agent.name !== 'string' || typeof agent.projectPath !== 'string') {
1003
+ throw new Error('Invalid agent: name and projectPath are required strings');
1004
+ }
1005
+ if (agent.projectPath.includes('..') || agent.projectPath.startsWith('/etc') || agent.projectPath.startsWith('/root')) {
1006
+ throw new Error('Invalid agent projectPath: path traversal or restricted path not allowed');
1007
+ }
1008
+ await dbManager.createAgent(agent);
1009
+ }
1010
+ }
1011
+ if (data.automations) {
1012
+ if (!Array.isArray(data.automations)) {
1013
+ throw new Error('Invalid import data: automations must be an array');
1014
+ }
1015
+ for (const automation of data.automations) {
1016
+ if (!automation.name || !automation.trigger) {
1017
+ throw new Error('Invalid automation: name and trigger are required');
1018
+ }
1019
+ await automationScheduler.createAutomation(automation);
1020
+ }
1021
+ }
1022
+ if (data.settings) {
1023
+ if (typeof data.settings !== 'object' || Array.isArray(data.settings)) {
1024
+ throw new Error('Invalid import data: settings must be an object');
1025
+ }
1026
+ for (const [key, value] of Object.entries(data.settings)) {
1027
+ if (typeof key !== 'string') {
1028
+ throw new Error('Invalid settings: keys must be strings');
1029
+ }
1030
+ settingsManager.setAny(key, value);
1031
+ }
1032
+ }
1033
+ return true;
1034
+ }
1035
+ catch (error) {
1036
+ electron_log_1.default.error('Import failed:', error);
1037
+ throw error;
1038
+ }
1039
+ });
1040
+ // Cowork operations
1041
+ electron_1.ipcMain.handle('cowork:create', async (event, name, objective, projectPath, options) => {
1042
+ return await coworkManager.createSession(name, objective, projectPath, options);
1043
+ });
1044
+ electron_1.ipcMain.handle('cowork:start', async (event, sessionId) => {
1045
+ return await coworkManager.startSession(sessionId);
1046
+ });
1047
+ electron_1.ipcMain.handle('cowork:pause', async (event, sessionId) => {
1048
+ return await coworkManager.pauseSession(sessionId);
1049
+ });
1050
+ electron_1.ipcMain.handle('cowork:stop', async (event, sessionId) => {
1051
+ return await coworkManager.stopSession(sessionId);
1052
+ });
1053
+ electron_1.ipcMain.handle('cowork:list', async () => {
1054
+ return coworkManager.getSessions();
1055
+ });
1056
+ // Pair programming operations
1057
+ electron_1.ipcMain.handle('pair:start', async (event, projectPath, mode, userId) => {
1058
+ const validModes = ['collaborative', 'teacher', 'reviewer'];
1059
+ const validMode = validModes.includes(mode) ? mode : 'collaborative';
1060
+ return await aiPairProgramming.startSession(projectPath, validMode, userId);
1061
+ });
1062
+ electron_1.ipcMain.handle('pair:chat', async (event, sessionId, message) => {
1063
+ return await aiPairProgramming.chat(sessionId, message);
1064
+ });
1065
+ electron_1.ipcMain.handle('pair:end', async (event, sessionId) => {
1066
+ return await aiPairProgramming.endSession(sessionId);
1067
+ });
1068
+ // Smart code assistant
1069
+ electron_1.ipcMain.handle('assistant:inlineCompletion', async (event, filePath, content, position) => {
1070
+ return await smartCodeAssistant.provideInlineCompletion(filePath, content, position);
1071
+ });
1072
+ electron_1.ipcMain.handle('assistant:suggestFixes', async (event, filePath, content) => {
1073
+ return await smartCodeAssistant.suggestFixes(filePath, content);
1074
+ });
1075
+ electron_1.ipcMain.handle('assistant:explain', async (event, code) => {
1076
+ return await smartCodeAssistant.explainCode(code, 'detailed');
1077
+ });
1078
+ // Metrics
1079
+ electron_1.ipcMain.handle('metrics:get', () => {
1080
+ return MetricsCollector_1.metrics.getStats();
1081
+ });
1082
+ electron_1.ipcMain.handle('metrics:export', () => {
1083
+ return MetricsCollector_1.metrics.exportMetrics();
1084
+ });
1085
+ electron_log_1.default.info('IPC handlers setup completed');
1086
+ }
1087
+ //# sourceMappingURL=main.js.map