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,296 @@
1
+ import React, { useState, useRef, useEffect } from 'react';
2
+ import { Send, Bot, User, Loader2, Copy, Check, X, Plus, Trash2, MessageSquare } from 'lucide-react';
3
+
4
+ export interface ChatMessage {
5
+ id: string;
6
+ role: 'user' | 'assistant';
7
+ content: string;
8
+ timestamp: Date;
9
+ isLoading?: boolean;
10
+ }
11
+
12
+ interface ChatTabProps {
13
+ onSendMessage?: (message: string) => Promise<string>;
14
+ onClearChat?: () => void;
15
+ initialMessages?: ChatMessage[];
16
+ }
17
+
18
+ function cn(...inputs: (string | undefined | null | boolean)[]): string {
19
+ return inputs.filter(Boolean).join(' ');
20
+ }
21
+
22
+ const formatTimestamp = (date: Date): string => {
23
+ return new Intl.DateTimeFormat('en', {
24
+ hour: '2-digit',
25
+ minute: '2-digit',
26
+ }).format(date);
27
+ };
28
+
29
+ export const ChatTab: React.FC<ChatTabProps> = ({
30
+ onSendMessage,
31
+ onClearChat,
32
+ initialMessages = [],
33
+ }) => {
34
+ const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);
35
+ const [input, setInput] = useState('');
36
+ const [isLoading, setIsLoading] = useState(false);
37
+ const [copiedId, setCopiedId] = useState<string | null>(null);
38
+ const messagesEndRef = useRef<HTMLDivElement>(null);
39
+ const inputRef = useRef<HTMLTextAreaElement>(null);
40
+
41
+ useEffect(() => {
42
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
43
+ }, [messages]);
44
+
45
+ const handleSend = async () => {
46
+ if (!input.trim() || isLoading) return;
47
+
48
+ const userMessage: ChatMessage = {
49
+ id: `msg-${Date.now()}`,
50
+ role: 'user',
51
+ content: input.trim(),
52
+ timestamp: new Date(),
53
+ };
54
+
55
+ const loadingMessage: ChatMessage = {
56
+ id: `loading-${Date.now()}`,
57
+ role: 'assistant',
58
+ content: '',
59
+ timestamp: new Date(),
60
+ isLoading: true,
61
+ };
62
+
63
+ setMessages(prev => [...prev, userMessage, loadingMessage]);
64
+ setInput('');
65
+ setIsLoading(true);
66
+
67
+ try {
68
+ let response = '';
69
+
70
+ if (onSendMessage) {
71
+ response = await onSendMessage(userMessage.content);
72
+ } else {
73
+ response = generateMockResponse(userMessage.content);
74
+ }
75
+
76
+ setMessages(prev => {
77
+ const newMessages = prev.filter(m => m.id !== loadingMessage.id);
78
+ return [
79
+ ...newMessages,
80
+ {
81
+ id: `msg-${Date.now()}`,
82
+ role: 'assistant',
83
+ content: response,
84
+ timestamp: new Date(),
85
+ },
86
+ ];
87
+ });
88
+ } catch (error) {
89
+ setMessages(prev => {
90
+ const newMessages = prev.filter(m => m.id !== loadingMessage.id);
91
+ return [
92
+ ...newMessages,
93
+ {
94
+ id: `msg-${Date.now()}`,
95
+ role: 'assistant',
96
+ content: 'Sorry, I encountered an error. Please try again.',
97
+ timestamp: new Date(),
98
+ },
99
+ ];
100
+ });
101
+ } finally {
102
+ setIsLoading(false);
103
+ }
104
+ };
105
+
106
+ const generateMockResponse = (input: string): string => {
107
+ const lowerInput = input.toLowerCase();
108
+
109
+ if (lowerInput.includes('hello') || lowerInput.includes('hi')) {
110
+ return "Hello! I'm Codex Chat - a conversational AI assistant without file access. I can help you with general questions, coding concepts, debugging strategies, and more. What would you like to chat about?";
111
+ }
112
+
113
+ if (lowerInput.includes('code') || lowerInput.includes('program')) {
114
+ return "I'd be happy to help with coding concepts! While I can't access your files in this chat mode, I can explain:\n\n- Programming patterns and best practices\n- Algorithm design\n- Debugging strategies\n- Language-specific features\n- Architecture decisions\n\nWhat would you like to learn more about?";
115
+ }
116
+
117
+ if (lowerInput.includes('help')) {
118
+ return "In this Chat mode, I can help you with:\n\n- **General questions** about programming\n- **Concept explanations** (algorithms, patterns, etc.)\n- **Debugging strategies** without seeing your code\n- **Code reviews** if you paste snippets\n- **Best practice recommendations**\n\nNote: This mode doesn't have file access. For coding tasks with file access, use the Code tab!";
119
+ }
120
+
121
+ return `I understand you're asking about "${input.slice(0, 50)}...".
122
+
123
+ In this Chat mode, I can have general conversations about:
124
+ - Programming concepts and patterns
125
+ - Debugging strategies
126
+ - Code architecture
127
+ - Best practices
128
+ - Language features
129
+
130
+ For file-based coding tasks, please switch to the **Code** tab where I can access your project files!`;
131
+ };
132
+
133
+ const handleKeyDown = (e: React.KeyboardEvent) => {
134
+ if (e.key === 'Enter' && !e.shiftKey) {
135
+ e.preventDefault();
136
+ handleSend();
137
+ }
138
+ };
139
+
140
+ const handleCopy = async (content: string, id: string) => {
141
+ await navigator.clipboard.writeText(content);
142
+ setCopiedId(id);
143
+ setTimeout(() => setCopiedId(null), 2000);
144
+ };
145
+
146
+ const handleClear = () => {
147
+ setMessages([]);
148
+ onClearChat?.();
149
+ };
150
+
151
+ return (
152
+ <div className="flex flex-col h-full bg-background">
153
+ {/* Header */}
154
+ <div className="flex items-center justify-between px-4 py-3 border-b border-border">
155
+ <div className="flex items-center gap-2">
156
+ <MessageSquare className="w-5 h-5" />
157
+ <h2 className="font-semibold">Chat</h2>
158
+ <span className="text-xs text-muted-foreground px-2 py-0.5 bg-muted rounded">
159
+ No file access
160
+ </span>
161
+ </div>
162
+
163
+ {messages.length > 0 && (
164
+ <button
165
+ onClick={handleClear}
166
+ className="flex items-center gap-1 px-2 py-1 text-xs text-muted-foreground hover:text-foreground rounded hover:bg-muted transition-colors"
167
+ >
168
+ <Trash2 className="w-3 h-3" />
169
+ Clear
170
+ </button>
171
+ )}
172
+ </div>
173
+
174
+ {/* Messages */}
175
+ <div className="flex-1 overflow-y-auto p-4 space-y-4">
176
+ {messages.length === 0 ? (
177
+ <div className="flex flex-col items-center justify-center h-full text-muted-foreground">
178
+ <Bot className="w-16 h-16 mb-4 opacity-30" />
179
+ <p className="text-lg font-medium mb-2">Welcome to Codex Chat</p>
180
+ <p className="text-sm text-center max-w-md">
181
+ A conversational AI assistant without file access.
182
+ Great for general questions, coding concepts, and debugging strategies.
183
+ </p>
184
+ <p className="text-xs mt-4 text-muted-foreground/60">
185
+ For file-based coding tasks, use the Code tab
186
+ </p>
187
+ </div>
188
+ ) : (
189
+ messages.map((message) => (
190
+ <div
191
+ key={message.id}
192
+ className={cn(
193
+ 'flex gap-3',
194
+ message.role === 'user' ? 'flex-row-reverse' : 'flex-row'
195
+ )}
196
+ >
197
+ <div className={cn(
198
+ 'w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0',
199
+ message.role === 'user' ? 'bg-primary/10' : 'bg-muted'
200
+ )}>
201
+ {message.role === 'user' ? (
202
+ <User className="w-4 h-4 text-primary" />
203
+ ) : (
204
+ <Bot className="w-4 h-4" />
205
+ )}
206
+ </div>
207
+
208
+ <div className={cn(
209
+ 'flex-1 max-w-[80%]',
210
+ message.role === 'user' ? 'text-right' : 'text-left'
211
+ )}>
212
+ <div className={cn(
213
+ 'inline-block px-4 py-2 rounded-lg',
214
+ message.role === 'user'
215
+ ? 'bg-primary text-primary-foreground'
216
+ : 'bg-muted'
217
+ )}>
218
+ {message.isLoading ? (
219
+ <div className="flex items-center gap-2">
220
+ <Loader2 className="w-4 h-4 animate-spin" />
221
+ <span className="text-sm">Thinking...</span>
222
+ </div>
223
+ ) : (
224
+ <p className="text-sm whitespace-pre-wrap">{message.content}</p>
225
+ )}
226
+ </div>
227
+
228
+ {!message.isLoading && message.role === 'assistant' && (
229
+ <div className="flex items-center gap-1 mt-1">
230
+ <button
231
+ onClick={() => handleCopy(message.content, message.id)}
232
+ className="p-1 hover:bg-muted rounded transition-colors"
233
+ title="Copy"
234
+ >
235
+ {copiedId === message.id ? (
236
+ <Check className="w-3 h-3 text-green-500" />
237
+ ) : (
238
+ <Copy className="w-3 h-3 text-muted-foreground" />
239
+ )}
240
+ </button>
241
+ <span className="text-xs text-muted-foreground">
242
+ {formatTimestamp(message.timestamp)}
243
+ </span>
244
+ </div>
245
+ )}
246
+ </div>
247
+ </div>
248
+ ))
249
+ )}
250
+ <div ref={messagesEndRef} />
251
+ </div>
252
+
253
+ {/* Input */}
254
+ <div className="p-4 border-t border-border">
255
+ <div className="flex items-end gap-2">
256
+ <div className="flex-1 relative">
257
+ <textarea
258
+ ref={inputRef}
259
+ value={input}
260
+ onChange={(e) => setInput(e.target.value)}
261
+ onKeyDown={handleKeyDown}
262
+ placeholder="Message Codex Chat..."
263
+ className="w-full px-4 py-3 bg-muted border border-input rounded-lg resize-none text-sm"
264
+ rows={1}
265
+ style={{ minHeight: '48px', maxHeight: '120px' }}
266
+ disabled={isLoading}
267
+ />
268
+ </div>
269
+
270
+ <button
271
+ onClick={handleSend}
272
+ disabled={!input.trim() || isLoading}
273
+ className={cn(
274
+ 'p-3 rounded-lg transition-colors',
275
+ input.trim() && !isLoading
276
+ ? 'bg-primary text-primary-foreground hover:bg-primary/90'
277
+ : 'bg-muted text-muted-foreground cursor-not-allowed'
278
+ )}
279
+ >
280
+ {isLoading ? (
281
+ <Loader2 className="w-5 h-5 animate-spin" />
282
+ ) : (
283
+ <Send className="w-5 h-5" />
284
+ )}
285
+ </button>
286
+ </div>
287
+
288
+ <p className="text-xs text-muted-foreground mt-2 text-center">
289
+ Press Enter to send, Shift+Enter for new line • Chat mode has no file access
290
+ </p>
291
+ </div>
292
+ </div>
293
+ );
294
+ };
295
+
296
+ export default ChatTab;
@@ -0,0 +1,257 @@
1
+ import React, { useRef, useCallback } from 'react';
2
+ import Editor, { Monaco, OnMount, DiffEditor } from '@monaco-editor/react';
3
+ import type { editor } from 'monaco-editor';
4
+ import {
5
+ Maximize2,
6
+ Minimize2,
7
+ Copy,
8
+ Download,
9
+ Search,
10
+ Settings,
11
+ RefreshCw
12
+ } from 'lucide-react';
13
+ import { Button } from './ui/Button';
14
+
15
+ interface CodeEditorProps {
16
+ value: string;
17
+ language?: string;
18
+ theme?: 'vs-dark' | 'vs-light' | 'hc-black';
19
+ readOnly?: boolean;
20
+ onChange?: (value: string | undefined) => void;
21
+ onSave?: (value: string) => void;
22
+ showLineNumbers?: boolean;
23
+ wordWrap?: 'on' | 'off' | 'wordWrapColumn' | 'bounded';
24
+ fontSize?: number;
25
+ minimap?: boolean;
26
+ lineNumbers?: 'on' | 'off' | 'relative' | 'interval';
27
+ originalValue?: string;
28
+ diffEditor?: boolean;
29
+ height?: string;
30
+ dataTestid?: string;
31
+ }
32
+
33
+ export const CodeEditor: React.FC<CodeEditorProps> = ({
34
+ value,
35
+ language = 'javascript',
36
+ theme = 'vs-dark',
37
+ readOnly = false,
38
+ onChange,
39
+ onSave,
40
+ showLineNumbers = true,
41
+ wordWrap = 'on',
42
+ fontSize = 14,
43
+ minimap = true,
44
+ lineNumbers = 'on',
45
+ originalValue,
46
+ diffEditor = false,
47
+ height = '100%',
48
+ dataTestid = 'code-editor'
49
+ }) => {
50
+ const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);
51
+ const monacoRef = useRef<Monaco | null>(null);
52
+
53
+ const handleEditorMount: OnMount = useCallback((editor, monaco) => {
54
+ editorRef.current = editor;
55
+ monacoRef.current = monaco;
56
+
57
+ monaco.languages.registerCompletionItemProvider(language, {
58
+ provideCompletionItems: (model, position) => {
59
+ const word = model.getWordUntilPosition(position);
60
+ const range = {
61
+ startLineNumber: position.lineNumber,
62
+ endLineNumber: position.lineNumber,
63
+ startColumn: word.startColumn,
64
+ endColumn: word.endColumn
65
+ };
66
+
67
+ const suggestions = [
68
+ { label: 'console.log', kind: monaco.languages.CompletionItemKind.Function, insertText: 'console.log(${1:message})', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
69
+ { label: 'const', kind: monaco.languages.CompletionItemKind.Keyword, insertText: 'const ${1:name} = ${2:value}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
70
+ { label: 'function', kind: monaco.languages.CompletionItemKind.Function, insertText: 'function ${1:name}(${2:params}) {\n\t${3:// body}\n}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
71
+ { label: 'async', kind: monaco.languages.CompletionItemKind.Keyword, insertText: 'async function ${1:name}(${2:params}) {\n\t${3:// body}\n}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
72
+ { label: 'class', kind: monaco.languages.CompletionItemKind.Class, insertText: 'class ${1:Name} {\n\tconstructor(${2:params}) {\n\t\t${3:// init}\n\t}\n}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
73
+ { label: 'interface', kind: monaco.languages.CompletionItemKind.Interface, insertText: 'interface ${1:Name} {\n\t${2:property}: ${3:type}\n}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
74
+ { label: 'import', kind: monaco.languages.CompletionItemKind.Module, insertText: "import { ${1:module} } from '${2:path}'", insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
75
+ { label: 'export', kind: monaco.languages.CompletionItemKind.Module, insertText: 'export ${1:default} ${2:statement}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, range },
76
+ ];
77
+
78
+ return { suggestions };
79
+ }
80
+ });
81
+
82
+ editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {
83
+ if (onSave && editor.getValue()) {
84
+ onSave(editor.getValue());
85
+ }
86
+ });
87
+
88
+ editor.focus();
89
+ }, [language, onSave]);
90
+
91
+ const handleCopy = useCallback(() => {
92
+ navigator.clipboard.writeText(value);
93
+ }, [value]);
94
+
95
+ const handleDownload = useCallback(() => {
96
+ const blob = new Blob([value], { type: 'text/plain' });
97
+ const url = URL.createObjectURL(blob);
98
+ const a = document.createElement('a');
99
+ a.href = url;
100
+ a.download = `code.${language === 'typescript' ? 'ts' : language === 'javascript' ? 'js' : language === 'python' ? 'py' : 'txt'}`;
101
+ a.click();
102
+ URL.revokeObjectURL(url);
103
+ }, [value, language]);
104
+
105
+ const handleFormat = useCallback(() => {
106
+ if (editorRef.current) {
107
+ editorRef.current.getAction('editor.action.formatDocument')?.run();
108
+ }
109
+ }, []);
110
+
111
+ const getLanguageFromPath = (path: string): string => {
112
+ const ext = path.split('.').pop()?.toLowerCase();
113
+ const langMap: Record<string, string> = {
114
+ 'ts': 'typescript',
115
+ 'tsx': 'typescript',
116
+ 'js': 'javascript',
117
+ 'jsx': 'javascript',
118
+ 'json': 'json',
119
+ 'html': 'html',
120
+ 'css': 'css',
121
+ 'scss': 'scss',
122
+ 'md': 'markdown',
123
+ 'py': 'python',
124
+ 'rs': 'rust',
125
+ 'go': 'go',
126
+ 'java': 'java',
127
+ 'c': 'c',
128
+ 'cpp': 'cpp',
129
+ 'h': 'c',
130
+ 'hpp': 'cpp',
131
+ 'sql': 'sql',
132
+ 'yaml': 'yaml',
133
+ 'yml': 'yaml',
134
+ 'xml': 'xml',
135
+ 'sh': 'shell',
136
+ 'bash': 'shell',
137
+ 'zsh': 'shell',
138
+ };
139
+ return langMap[ext || ''] || 'plaintext';
140
+ };
141
+
142
+ if (diffEditor && originalValue !== undefined) {
143
+ return (
144
+ <div className="flex flex-col h-full border border-border rounded-lg overflow-hidden" data-testid={dataTestid}>
145
+ <div className="flex items-center justify-between px-3 py-2 bg-muted/50 border-b border-border">
146
+ <div className="flex items-center gap-2 text-sm text-muted-foreground">
147
+ <span>Diff Editor</span>
148
+ <span className="px-2 py-0.5 bg-secondary rounded text-xs">{language}</span>
149
+ </div>
150
+ <div className="flex items-center gap-1">
151
+ <Button variant="ghost" size="sm" onClick={handleCopy}>
152
+ <Copy className="w-4 h-4" />
153
+ </Button>
154
+ </div>
155
+ </div>
156
+ <div className="flex-1">
157
+ <DiffEditor
158
+ height="100%"
159
+ language={language}
160
+ theme={theme}
161
+ original={originalValue}
162
+ modified={value}
163
+ options={{
164
+ readOnly,
165
+ renderSideBySide: true,
166
+ fontSize,
167
+ minimap: { enabled: minimap },
168
+ lineNumbers: 'on',
169
+ wordWrap,
170
+ scrollBeyondLastLine: false,
171
+ automaticLayout: true,
172
+ }}
173
+ />
174
+ </div>
175
+ </div>
176
+ );
177
+ }
178
+
179
+ return (
180
+ <div className="flex flex-col h-full border border-border rounded-lg overflow-hidden" data-testid={dataTestid}>
181
+ <div className="flex items-center justify-between px-3 py-2 bg-muted/50 border-b border-border">
182
+ <div className="flex items-center gap-2 text-sm text-muted-foreground">
183
+ <span>{language === 'typescript' ? 'TypeScript' : language === 'javascript' ? 'JavaScript' : language}</span>
184
+ <span className="px-2 py-0.5 bg-secondary rounded text-xs">{value.split('\n').length} lines</span>
185
+ </div>
186
+ <div className="flex items-center gap-1">
187
+ <Button
188
+ variant="ghost"
189
+ size="sm"
190
+ onClick={handleFormat}
191
+ title="Format code"
192
+ >
193
+ <Settings className="w-4 h-4" />
194
+ </Button>
195
+ <Button
196
+ variant="ghost"
197
+ size="sm"
198
+ onClick={handleCopy}
199
+ title="Copy to clipboard"
200
+ >
201
+ <Copy className="w-4 h-4" />
202
+ </Button>
203
+ <Button
204
+ variant="ghost"
205
+ size="sm"
206
+ onClick={handleDownload}
207
+ title="Download file"
208
+ >
209
+ <Download className="w-4 h-4" />
210
+ </Button>
211
+ </div>
212
+ </div>
213
+ <div className="flex-1" style={{ height }}>
214
+ <Editor
215
+ height="100%"
216
+ language={language}
217
+ value={value}
218
+ theme={theme}
219
+ onChange={onChange}
220
+ onMount={handleEditorMount}
221
+ options={{
222
+ readOnly,
223
+ fontSize,
224
+ minimap: { enabled: minimap },
225
+ lineNumbers: showLineNumbers ? lineNumbers : 'off',
226
+ wordWrap,
227
+ scrollBeyondLastLine: false,
228
+ automaticLayout: true,
229
+ tabSize: 2,
230
+ insertSpaces: true,
231
+ folding: true,
232
+ foldingHighlight: true,
233
+ showFoldingControls: 'always',
234
+ bracketPairColorization: { enabled: true },
235
+ padding: { top: 8, bottom: 8 },
236
+ smoothScrolling: true,
237
+ cursorBlinking: 'smooth',
238
+ cursorSmoothCaretAnimation: 'on',
239
+ renderLineHighlight: 'all',
240
+ renderWhitespace: 'selection',
241
+ guides: {
242
+ bracketPairs: true,
243
+ indentation: true,
244
+ },
245
+ }}
246
+ loading={
247
+ <div className="flex items-center justify-center h-full">
248
+ <RefreshCw className="w-6 h-6 animate-spin text-muted-foreground" />
249
+ </div>
250
+ }
251
+ />
252
+ </div>
253
+ </div>
254
+ );
255
+ };
256
+
257
+ export default CodeEditor;