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,302 @@
1
+ import React, { useState, useCallback } from 'react';
2
+ import { FileCode, FolderOpen, X, Save, Plus, File, ChevronRight, ChevronDown, Search } from 'lucide-react';
3
+
4
+ export interface FileItem {
5
+ name: string;
6
+ path: string;
7
+ type: 'file' | 'folder';
8
+ children?: FileItem[];
9
+ content?: string;
10
+ }
11
+
12
+ interface FileExplorerPanelProps {
13
+ files: FileItem[];
14
+ selectedFile: string | null;
15
+ onFileSelect: (path: string) => void;
16
+ onFileCreate: (path: string, type: 'file' | 'folder') => void;
17
+ onFileDelete: (path: string) => void;
18
+ onFileRename: (oldPath: string, newPath: string) => void;
19
+ }
20
+
21
+ function cn(...inputs: (string | undefined | null | boolean)[]): string {
22
+ return inputs.filter(Boolean).join(' ');
23
+ }
24
+
25
+ const FileIcon = ({ type, isOpen }: { type: 'file' | 'folder'; isOpen: boolean }) => {
26
+ if (type === 'folder') {
27
+ return isOpen ? (
28
+ <FolderOpen className="w-4 h-4 text-yellow-500" />
29
+ ) : (
30
+ <FolderOpen className="w-4 h-4 text-yellow-500" />
31
+ );
32
+ }
33
+ return <File className="w-4 h-4 text-muted-foreground" />;
34
+ };
35
+
36
+ export const FileExplorerPanel: React.FC<FileExplorerPanelProps> = ({
37
+ files,
38
+ selectedFile,
39
+ onFileSelect,
40
+ onFileCreate,
41
+ onFileDelete,
42
+ onFileRename,
43
+ }) => {
44
+ const [expandedFolders, setExpandedFolders] = useState<Set<string>>(new Set());
45
+ const [searchQuery, setSearchQuery] = useState('');
46
+ const [showNewFileInput, setShowNewFileInput] = useState<string | null>(null);
47
+ const [newFileName, setNewFileName] = useState('');
48
+ const [newFileType, setNewFileType] = useState<'file' | 'folder'>('file');
49
+ const [contextMenu, setContextMenu] = useState<{ x: number; y: number; path: string } | null>(null);
50
+ const [editingFile, setEditingFile] = useState<string | null>(null);
51
+ const [editName, setEditName] = useState('');
52
+
53
+ const toggleFolder = (path: string) => {
54
+ setExpandedFolders(prev => {
55
+ const next = new Set(prev);
56
+ if (next.has(path)) {
57
+ next.delete(path);
58
+ } else {
59
+ next.add(path);
60
+ }
61
+ return next;
62
+ });
63
+ };
64
+
65
+ const handleCreateFile = (parentPath: string) => {
66
+ if (!newFileName.trim()) return;
67
+ const fullPath = parentPath ? `${parentPath}/${newFileName}` : newFileName;
68
+ onFileCreate(fullPath, newFileType);
69
+ setShowNewFileInput(null);
70
+ setNewFileName('');
71
+ };
72
+
73
+ const handleRename = (path: string) => {
74
+ if (!editName.trim()) return;
75
+ onFileRename(path, editName);
76
+ setEditingFile(null);
77
+ setEditName('');
78
+ };
79
+
80
+ const handleContextMenu = (e: React.MouseEvent, path: string) => {
81
+ e.preventDefault();
82
+ setContextMenu({ x: e.clientX, y: e.clientY, path });
83
+ };
84
+
85
+ const filterFiles = (items: FileItem[], query: string): FileItem[] => {
86
+ if (!query) return items;
87
+ return items.filter(item => {
88
+ if (item.name.toLowerCase().includes(query.toLowerCase())) return true;
89
+ if (item.children) {
90
+ const filtered = filterFiles(item.children, query);
91
+ return filtered.length > 0;
92
+ }
93
+ return false;
94
+ });
95
+ };
96
+
97
+ const renderFile = (item: FileItem, depth: number = 0) => {
98
+ const isFolder = item.type === 'folder';
99
+ const isExpanded = expandedFolders.has(item.path);
100
+ const isSelected = selectedFile === item.path;
101
+ const isEditing = editingFile === item.path;
102
+
103
+ return (
104
+ <div key={item.path}>
105
+ <div
106
+ className={cn(
107
+ 'flex items-center gap-1 px-2 py-1 cursor-pointer rounded-md transition-colors group',
108
+ isSelected && 'bg-primary/10 text-primary',
109
+ !isSelected && 'hover:bg-muted'
110
+ )}
111
+ style={{ paddingLeft: `${depth * 12 + 8}px` }}
112
+ onClick={() => {
113
+ if (isFolder) {
114
+ toggleFolder(item.path);
115
+ } else {
116
+ onFileSelect(item.path);
117
+ }
118
+ }}
119
+ onContextMenu={(e) => handleContextMenu(e, item.path)}
120
+ >
121
+ {isFolder ? (
122
+ <button className="p-0.5 hover:bg-muted rounded">
123
+ {isExpanded ? (
124
+ <ChevronDown className="w-3 h-3" />
125
+ ) : (
126
+ <ChevronRight className="w-3 h-3" />
127
+ )}
128
+ </button>
129
+ ) : (
130
+ <span className="w-4" />
131
+ )}
132
+
133
+ <FileIcon type={item.type} isOpen={isExpanded} />
134
+
135
+ {isEditing ? (
136
+ <input
137
+ type="text"
138
+ value={editName}
139
+ onChange={(e) => setEditName(e.target.value)}
140
+ onBlur={() => handleRename(item.path)}
141
+ onKeyDown={(e) => {
142
+ if (e.key === 'Enter') handleRename(item.path);
143
+ if (e.key === 'Escape') setEditingFile(null);
144
+ }}
145
+ className="flex-1 px-1 py-0.5 text-sm bg-background border border-input rounded"
146
+ autoFocus
147
+ onClick={(e) => e.stopPropagation()}
148
+ />
149
+ ) : (
150
+ <span className="flex-1 text-sm truncate">{item.name}</span>
151
+ )}
152
+
153
+ <button
154
+ onClick={(e) => {
155
+ e.stopPropagation();
156
+ setContextMenu(null);
157
+ setShowNewFileInput(item.path);
158
+ }}
159
+ className="opacity-0 group-hover:opacity-100 p-1 hover:bg-muted rounded transition-opacity"
160
+ >
161
+ <Plus className="w-3 h-3" />
162
+ </button>
163
+ </div>
164
+
165
+ {isFolder && isExpanded && item.children && (
166
+ <div>
167
+ {item.children.map(child => renderFile(child, depth + 1))}
168
+ </div>
169
+ )}
170
+ </div>
171
+ );
172
+ };
173
+
174
+ const filteredFiles = filterFiles(files, searchQuery);
175
+
176
+ return (
177
+ <div className="flex flex-col h-full bg-card">
178
+ {/* Header */}
179
+ <div className="px-3 py-2 border-b border-border">
180
+ <div className="flex items-center gap-2 mb-2">
181
+ <FileCode className="w-4 h-4" />
182
+ <span className="text-sm font-medium">Files</span>
183
+ </div>
184
+
185
+ {/* Search */}
186
+ <div className="relative">
187
+ <Search className="absolute left-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-muted-foreground" />
188
+ <input
189
+ type="text"
190
+ value={searchQuery}
191
+ onChange={(e) => setSearchQuery(e.target.value)}
192
+ placeholder="Search files..."
193
+ className="w-full pl-8 pr-3 py-1.5 bg-muted border-0 rounded-md text-xs"
194
+ />
195
+ </div>
196
+ </div>
197
+
198
+ {/* File Tree */}
199
+ <div className="flex-1 overflow-auto p-2">
200
+ {filteredFiles.length === 0 ? (
201
+ <div className="text-center py-8 text-muted-foreground">
202
+ <FolderOpen className="w-8 h-8 mx-auto mb-2 opacity-50" />
203
+ <p className="text-sm">No files</p>
204
+ </div>
205
+ ) : (
206
+ filteredFiles.map(file => renderFile(file))
207
+ )}
208
+
209
+ {/* New file input */}
210
+ {showNewFileInput !== null && (
211
+ <div className="px-2 py-1">
212
+ <div className="flex items-center gap-1">
213
+ <FileIcon type={newFileType} isOpen={false} />
214
+ <input
215
+ type="text"
216
+ value={newFileName}
217
+ onChange={(e) => setNewFileName(e.target.value)}
218
+ onKeyDown={(e) => {
219
+ if (e.key === 'Enter') handleCreateFile(showNewFileInput);
220
+ if (e.key === 'Escape') setShowNewFileInput(null);
221
+ }}
222
+ onBlur={() => handleCreateFile(showNewFileInput)}
223
+ placeholder={newFileType === 'file' ? 'filename.ext' : 'folder name'}
224
+ className="flex-1 px-2 py-1 text-sm bg-background border border-input rounded"
225
+ autoFocus
226
+ />
227
+ <button
228
+ onClick={() => setNewFileType(newFileType === 'file' ? 'folder' : 'file')}
229
+ className="p-1 hover:bg-muted rounded text-xs"
230
+ >
231
+ {newFileType === 'file' ? 'Folder' : 'File'}
232
+ </button>
233
+ </div>
234
+ </div>
235
+ )}
236
+ </div>
237
+
238
+ {/* Root actions */}
239
+ <div className="px-3 py-2 border-t border-border flex gap-2">
240
+ <button
241
+ onClick={() => {
242
+ setShowNewFileInput('');
243
+ setNewFileType('file');
244
+ }}
245
+ className="flex items-center gap-1 px-2 py-1 text-xs hover:bg-muted rounded transition-colors"
246
+ >
247
+ <Plus className="w-3 h-3" />
248
+ New File
249
+ </button>
250
+ <button
251
+ onClick={() => {
252
+ setShowNewFileInput('');
253
+ setNewFileType('folder');
254
+ }}
255
+ className="flex items-center gap-1 px-2 py-1 text-xs hover:bg-muted rounded transition-colors"
256
+ >
257
+ <Plus className="w-3 h-3" />
258
+ New Folder
259
+ </button>
260
+ </div>
261
+
262
+ {/* Context Menu */}
263
+ {contextMenu && (
264
+ <>
265
+ <div
266
+ className="fixed inset-0 z-40"
267
+ onClick={() => setContextMenu(null)}
268
+ />
269
+ <div
270
+ className="fixed z-50 bg-background border border-border rounded-md shadow-lg py-1 min-w-[140px]"
271
+ style={{ left: contextMenu.x, top: contextMenu.y }}
272
+ >
273
+ <button
274
+ onClick={() => {
275
+ const file = files.find(f => f.path === contextMenu.path);
276
+ if (file) {
277
+ setEditingFile(contextMenu.path);
278
+ setEditName(file.name);
279
+ }
280
+ setContextMenu(null);
281
+ }}
282
+ className="w-full px-3 py-1.5 text-left text-sm hover:bg-muted flex items-center gap-2"
283
+ >
284
+ Rename
285
+ </button>
286
+ <button
287
+ onClick={() => {
288
+ onFileDelete(contextMenu.path);
289
+ setContextMenu(null);
290
+ }}
291
+ className="w-full px-3 py-1.5 text-left text-sm hover:bg-muted flex items-center gap-2 text-red-500"
292
+ >
293
+ Delete
294
+ </button>
295
+ </div>
296
+ </>
297
+ )}
298
+ </div>
299
+ );
300
+ };
301
+
302
+ export default FileExplorerPanel;
@@ -0,0 +1,154 @@
1
+ import React, { useState } from 'react';
2
+ import { GitCommit, GitBranch, GitPullRequest, Check, X, FileText, RefreshCw } from 'lucide-react';
3
+
4
+ interface GitPanelProps {
5
+ repoPath: string;
6
+ onCommit: (message: string) => void;
7
+ }
8
+
9
+ export const GitPanel: React.FC<GitPanelProps> = ({ repoPath, onCommit }) => {
10
+ const [stagedFiles, setStagedFiles] = useState<string[]>([]);
11
+ const [unstagedFiles, setUnstagedFiles] = useState<string[]>([]);
12
+ const [commitMessage, setCommitMessage] = useState('');
13
+ const [isLoading, setIsLoading] = useState(false);
14
+ const [selectedFiles, setSelectedFiles] = useState<Set<string>>(new Set());
15
+
16
+ const loadStatus = async () => {
17
+ setIsLoading(true);
18
+ try {
19
+ const status = await window.electronAPI.git.status(repoPath);
20
+ setStagedFiles(status.staged);
21
+ setUnstagedFiles(status.unstaged);
22
+ } catch (error) {
23
+ console.error('Failed to load git status:', error);
24
+ }
25
+ setIsLoading(false);
26
+ };
27
+
28
+ const handleStage = async (file: string) => {
29
+ // In a real implementation, this would call git add
30
+ setUnstagedFiles(prev => prev.filter(f => f !== file));
31
+ setStagedFiles(prev => [...prev, file]);
32
+ };
33
+
34
+ const handleUnstage = async (file: string) => {
35
+ setStagedFiles(prev => prev.filter(f => f !== file));
36
+ setUnstagedFiles(prev => [...prev, file]);
37
+ };
38
+
39
+ const handleCommit = async () => {
40
+ if (!commitMessage.trim() || stagedFiles.length === 0) return;
41
+
42
+ try {
43
+ await window.electronAPI.git.commit({
44
+ repoPath,
45
+ message: commitMessage,
46
+ files: stagedFiles
47
+ });
48
+ setCommitMessage('');
49
+ setStagedFiles([]);
50
+ onCommit(commitMessage);
51
+ } catch (error) {
52
+ console.error('Failed to commit:', error);
53
+ }
54
+ };
55
+
56
+ return (
57
+ <div className="flex flex-col h-full bg-card">
58
+ {/* Header */}
59
+ <div className="px-4 py-3 border-b border-border flex items-center justify-between bg-background/50">
60
+ <div className="flex items-center gap-2">
61
+ <GitBranch className="w-5 h-5 text-muted-foreground" />
62
+ <span className="font-medium">Git</span>
63
+ </div>
64
+ <button
65
+ onClick={loadStatus}
66
+ disabled={isLoading}
67
+ className="p-2 hover:bg-muted rounded-md disabled:opacity-50"
68
+ >
69
+ <RefreshCw className={`w-4 h-4 ${isLoading ? 'animate-spin' : ''}`} />
70
+ </button>
71
+ </div>
72
+
73
+ {/* Staged Changes */}
74
+ <div className="flex-1 overflow-auto p-4">
75
+ {stagedFiles.length > 0 && (
76
+ <div className="mb-6">
77
+ <h3 className="text-sm font-medium text-green-500 mb-2 flex items-center gap-2">
78
+ <Check className="w-4 h-4" />
79
+ Staged Changes ({stagedFiles.length})
80
+ </h3>
81
+ <div className="space-y-1">
82
+ {stagedFiles.map(file => (
83
+ <div
84
+ key={file}
85
+ className="flex items-center gap-2 px-3 py-2 bg-green-500/5 rounded-md group"
86
+ >
87
+ <FileText className="w-4 h-4 text-muted-foreground" />
88
+ <span className="text-sm flex-1 truncate">{file}</span>
89
+ <button
90
+ onClick={() => handleUnstage(file)}
91
+ className="opacity-0 group-hover:opacity-100 p-1 hover:bg-red-500/10 text-red-500 rounded"
92
+ >
93
+ <X className="w-3 h-3" />
94
+ </button>
95
+ </div>
96
+ ))}
97
+ </div>
98
+ </div>
99
+ )}
100
+
101
+ {unstagedFiles.length > 0 && (
102
+ <div>
103
+ <h3 className="text-sm font-medium text-muted-foreground mb-2">
104
+ Changes ({unstagedFiles.length})
105
+ </h3>
106
+ <div className="space-y-1">
107
+ {unstagedFiles.map(file => (
108
+ <div
109
+ key={file}
110
+ className="flex items-center gap-2 px-3 py-2 hover:bg-muted rounded-md group cursor-pointer"
111
+ onClick={() => handleStage(file)}
112
+ >
113
+ <FileText className="w-4 h-4 text-muted-foreground" />
114
+ <span className="text-sm flex-1 truncate">{file}</span>
115
+ <button className="opacity-0 group-hover:opacity-100 p-1 hover:bg-green-500/10 text-green-500 rounded">
116
+ <Check className="w-3 h-3" />
117
+ </button>
118
+ </div>
119
+ ))}
120
+ </div>
121
+ </div>
122
+ )}
123
+
124
+ {stagedFiles.length === 0 && unstagedFiles.length === 0 && (
125
+ <div className="text-center py-8 text-muted-foreground">
126
+ <GitCommit className="w-12 h-12 mx-auto mb-2 opacity-30" />
127
+ <p className="text-sm">No changes</p>
128
+ <p className="text-xs mt-1">Working tree clean</p>
129
+ </div>
130
+ )}
131
+ </div>
132
+
133
+ {/* Commit Section */}
134
+ {stagedFiles.length > 0 && (
135
+ <div className="p-4 border-t border-border bg-background/50">
136
+ <textarea
137
+ value={commitMessage}
138
+ onChange={e => setCommitMessage(e.target.value)}
139
+ placeholder="Commit message..."
140
+ className="w-full px-3 py-2 bg-background border border-input rounded-md text-sm resize-none h-20 mb-3"
141
+ />
142
+ <button
143
+ onClick={handleCommit}
144
+ disabled={!commitMessage.trim()}
145
+ className="w-full flex items-center justify-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 disabled:opacity-50"
146
+ >
147
+ <GitCommit className="w-4 h-4" />
148
+ Commit {stagedFiles.length} files
149
+ </button>
150
+ </div>
151
+ )}
152
+ </div>
153
+ );
154
+ };
@@ -0,0 +1,113 @@
1
+ import React from 'react';
2
+ import { Agent } from '../../shared/types';
3
+ import { Bot, MoreVertical, Minus, Square, X, Search } from 'lucide-react';
4
+ import { cn } from '@/lib/utils';
5
+ import { VoiceCommand } from './VoiceCommand';
6
+
7
+ interface HeaderProps {
8
+ activeTab: string;
9
+ agents: Agent[];
10
+ onSettingsClick: () => void;
11
+ }
12
+
13
+ export const Header: React.FC<HeaderProps> = ({ activeTab, agents, onSettingsClick }) => {
14
+ const runningAgents = agents.filter(a => a.status === 'running').length;
15
+
16
+ const handleVoiceCommand = (transcript: string) => {
17
+ console.log('Voice command:', transcript);
18
+ };
19
+
20
+ const getTitle = () => {
21
+ switch (activeTab) {
22
+ case 'agents': return 'Agents';
23
+ case 'worktrees': return 'Worktrees';
24
+ case 'skills': return 'Skills';
25
+ case 'automations': return 'Automations';
26
+ case 'settings': return 'Settings';
27
+ default: return 'Codex';
28
+ }
29
+ };
30
+
31
+ const getDescription = () => {
32
+ switch (activeTab) {
33
+ case 'agents': return 'Manage your AI coding agents';
34
+ case 'worktrees': return 'Isolated Git workspaces';
35
+ case 'skills': return 'Reusable AI capabilities';
36
+ case 'automations': return 'Scheduled tasks and workflows';
37
+ case 'settings': return 'Configure your preferences';
38
+ default: return '';
39
+ }
40
+ };
41
+
42
+ const handleMinimize = () => {
43
+ window.electronAPI.window.minimize();
44
+ };
45
+
46
+ const handleMaximize = () => {
47
+ window.electronAPI.window.maximize();
48
+ };
49
+
50
+ const handleClose = () => {
51
+ window.electronAPI.window.close();
52
+ };
53
+
54
+ return (
55
+ <header className="h-16 border-b border-[var(--color-border)] bg-[var(--color-bg-elevated)] flex items-center justify-between px-6" data-testid="app-header">
56
+ <div className="flex items-center gap-6">
57
+ <div>
58
+ <h1 className="text-xl font-semibold tracking-tight text-[var(--color-text-primary)]" data-testid="page-title">
59
+ {getTitle()}
60
+ </h1>
61
+ <p className="text-xs text-[var(--color-text-tertiary)]">
62
+ {getDescription()}
63
+ </p>
64
+ </div>
65
+
66
+ {activeTab === 'agents' && runningAgents > 0 && (
67
+ <div className="flex items-center gap-2 px-3 py-1.5 bg-green-50 text-green-700 rounded-full text-xs font-medium" data-testid="running-agents-badge">
68
+ <span className="relative flex h-2 w-2">
69
+ <span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"></span>
70
+ <span className="relative inline-flex rounded-full h-2 w-2 bg-green-500"></span>
71
+ </span>
72
+ {runningAgents} running
73
+ </div>
74
+ )}
75
+
76
+ {/* Search */}
77
+ <div className="relative hidden md:block">
78
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-neutral-400" />
79
+ <input
80
+ type="text"
81
+ placeholder="Search..."
82
+ className="pl-9 pr-4 py-2 bg-neutral-100 border-0 rounded-lg text-sm w-64 focus:ring-2 focus:ring-neutral-200 transition-all"
83
+ data-testid="search-input"
84
+ />
85
+ </div>
86
+ </div>
87
+
88
+ <div className="flex items-center gap-1">
89
+ <button
90
+ onClick={handleMinimize}
91
+ className="p-2 hover:bg-neutral-100 rounded-lg text-neutral-500 hover:text-neutral-900 transition-colors"
92
+ data-testid="window-minimize"
93
+ >
94
+ <Minus className="w-4 h-4" />
95
+ </button>
96
+ <button
97
+ onClick={handleMaximize}
98
+ className="p-2 hover:bg-neutral-100 rounded-lg text-neutral-500 hover:text-neutral-900 transition-colors"
99
+ data-testid="window-maximize"
100
+ >
101
+ <Square className="w-4 h-4" />
102
+ </button>
103
+ <button
104
+ onClick={handleClose}
105
+ className="p-2 hover:bg-red-50 hover:text-red-600 rounded-lg text-neutral-500 transition-colors"
106
+ data-testid="window-close"
107
+ >
108
+ <X className="w-4 h-4" />
109
+ </button>
110
+ </div>
111
+ </header>
112
+ );
113
+ };