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,288 @@
1
+ import { EventEmitter } from 'events';
2
+ import * as child_process from 'child_process';
3
+ import * as path from 'path';
4
+ import log from 'electron-log';
5
+
6
+ interface IDEConfig {
7
+ name: string;
8
+ command: string;
9
+ args: string[];
10
+ windowsCommand?: string;
11
+ macosCommand?: string;
12
+ linuxCommand?: string;
13
+ }
14
+
15
+ interface IDESession {
16
+ ide: string;
17
+ projectPath: string;
18
+ process?: child_process.ChildProcess;
19
+ }
20
+
21
+ const supportedIDEs: IDEConfig[] = [
22
+ {
23
+ name: 'VS Code',
24
+ command: 'code',
25
+ args: ['.'],
26
+ windowsCommand: 'code.cmd',
27
+ macosCommand: 'code',
28
+ linuxCommand: 'code'
29
+ },
30
+ {
31
+ name: 'WebStorm',
32
+ command: 'webstorm',
33
+ args: ['.'],
34
+ windowsCommand: 'webstorm64.exe',
35
+ macosCommand: 'webstorm',
36
+ linuxCommand: 'webstorm.sh'
37
+ },
38
+ {
39
+ name: 'IntelliJ IDEA',
40
+ command: 'idea',
41
+ args: ['.'],
42
+ windowsCommand: 'idea64.exe',
43
+ macosCommand: 'idea',
44
+ linuxCommand: 'idea.sh'
45
+ },
46
+ {
47
+ name: 'Cursor',
48
+ command: 'cursor',
49
+ args: ['.'],
50
+ windowsCommand: 'Cursor.exe',
51
+ macosCommand: 'cursor',
52
+ linuxCommand: 'cursor'
53
+ },
54
+ {
55
+ name: 'Sublime Text',
56
+ command: 'subl',
57
+ args: ['.'],
58
+ windowsCommand: 'subl.exe',
59
+ macosCommand: 'subl',
60
+ linuxCommand: 'subl'
61
+ },
62
+ {
63
+ name: 'Vim',
64
+ command: 'vim',
65
+ args: ['.'],
66
+ linuxCommand: 'vim',
67
+ macosCommand: 'vim'
68
+ },
69
+ {
70
+ name: 'Neovim',
71
+ command: 'nvim',
72
+ args: ['.'],
73
+ linuxCommand: 'nvim',
74
+ macosCommand: 'nvim'
75
+ }
76
+ ];
77
+
78
+ export class IDEIntegration extends EventEmitter {
79
+ private activeSessions: Map<string, IDESession> = new Map();
80
+ private platform: string;
81
+
82
+ constructor() {
83
+ super();
84
+ this.platform = process.platform;
85
+ }
86
+
87
+ async detectAvailableIDEs(): Promise<IDEConfig[]> {
88
+ const available: IDEConfig[] = [];
89
+
90
+ for (const ide of supportedIDEs) {
91
+ try {
92
+ const command = this.getPlatformCommand(ide);
93
+ if (await this.isCommandAvailable(command)) {
94
+ available.push(ide);
95
+ }
96
+ } catch (error) {
97
+ log.debug(`${ide.name} not found`);
98
+ }
99
+ }
100
+
101
+ return available;
102
+ }
103
+
104
+ async openInIDE(projectPath: string, ideName: string): Promise<void> {
105
+ const ide = supportedIDEs.find(i => i.name === ideName);
106
+ if (!ide) {
107
+ throw new Error(`IDE ${ideName} not supported`);
108
+ }
109
+
110
+ const command = this.getPlatformCommand(ide);
111
+ const args = ide.args.map(arg =>
112
+ arg === '.' ? projectPath : arg
113
+ );
114
+
115
+ try {
116
+ const process = child_process.spawn(command, args, {
117
+ cwd: projectPath,
118
+ detached: true,
119
+ stdio: 'ignore'
120
+ });
121
+
122
+ process.unref();
123
+
124
+ const sessionId = `ide-${Date.now()}`;
125
+ this.activeSessions.set(sessionId, {
126
+ ide: ideName,
127
+ projectPath,
128
+ process
129
+ });
130
+
131
+ this.emit('ide:opened', { sessionId, ide: ideName, projectPath });
132
+ log.info(`Opened ${ideName} at ${projectPath}`);
133
+
134
+ } catch (error) {
135
+ log.error(`Failed to open ${ideName}:`, error);
136
+ throw error;
137
+ }
138
+ }
139
+
140
+ async openVSCodeAtLine(filePath: string, line: number, column: number = 0): Promise<void> {
141
+ try {
142
+ const args = [
143
+ '--goto',
144
+ `${filePath}:${line}:${column}`
145
+ ];
146
+
147
+ const process = child_process.spawn('code', args, {
148
+ detached: true,
149
+ stdio: 'ignore'
150
+ });
151
+
152
+ process.unref();
153
+
154
+ this.emit('ide:openedAtLine', { filePath, line, column });
155
+ log.info(`Opened ${filePath} at line ${line} in VS Code`);
156
+
157
+ } catch (error) {
158
+ log.error('Failed to open file in VS Code:', error);
159
+ throw error;
160
+ }
161
+ }
162
+
163
+ async installExtension(ideName: string, extensionId: string): Promise<void> {
164
+ if (ideName !== 'VS Code') {
165
+ throw new Error('Extension installation only supported for VS Code');
166
+ }
167
+
168
+ try {
169
+ await new Promise<void>((resolve, reject) => {
170
+ const process = child_process.spawn('code', ['--install-extension', extensionId], {
171
+ stdio: 'pipe'
172
+ });
173
+
174
+ let output = '';
175
+ process.stdout?.on('data', (data) => {
176
+ output += data.toString();
177
+ });
178
+
179
+ process.on('close', (code) => {
180
+ if (code === 0) {
181
+ resolve();
182
+ } else {
183
+ reject(new Error(`Extension installation failed: ${output}`));
184
+ }
185
+ });
186
+ });
187
+
188
+ this.emit('ide:extensionInstalled', { ide: ideName, extensionId });
189
+ log.info(`Installed extension ${extensionId} in VS Code`);
190
+
191
+ } catch (error) {
192
+ log.error('Failed to install extension:', error);
193
+ throw error;
194
+ }
195
+ }
196
+
197
+ async configureWorkspace(projectPath: string, settings: Record<string, any>): Promise<void> {
198
+ const vscodeDir = path.join(projectPath, '.vscode');
199
+ const settingsPath = path.join(vscodeDir, 'settings.json');
200
+
201
+ try {
202
+ // Create .vscode directory if it doesn't exist
203
+ await fs.promises.mkdir(vscodeDir, { recursive: true });
204
+
205
+ // Read existing settings or create new
206
+ let existingSettings = {};
207
+ try {
208
+ const content = await fs.promises.readFile(settingsPath, 'utf-8');
209
+ existingSettings = JSON.parse(content);
210
+ } catch {
211
+ // File doesn't exist or is invalid, start fresh
212
+ }
213
+
214
+ // Merge settings
215
+ const newSettings = {
216
+ ...existingSettings,
217
+ ...settings
218
+ };
219
+
220
+ // Write settings
221
+ await fs.promises.writeFile(
222
+ settingsPath,
223
+ JSON.stringify(newSettings, null, 2)
224
+ );
225
+
226
+ this.emit('ide:workspaceConfigured', { projectPath, settings });
227
+ log.info(`Configured VS Code workspace at ${projectPath}`);
228
+
229
+ } catch (error) {
230
+ log.error('Failed to configure workspace:', error);
231
+ throw error;
232
+ }
233
+ }
234
+
235
+ getActiveSessions(): IDESession[] {
236
+ return Array.from(this.activeSessions.values());
237
+ }
238
+
239
+ closeSession(sessionId: string): void {
240
+ const session = this.activeSessions.get(sessionId);
241
+ if (session?.process) {
242
+ session.process.kill();
243
+ this.activeSessions.delete(sessionId);
244
+ this.emit('ide:closed', { sessionId });
245
+ }
246
+ }
247
+
248
+ private getPlatformCommand(ide: IDEConfig): string {
249
+ switch (this.platform) {
250
+ case 'win32':
251
+ return ide.windowsCommand || ide.command;
252
+ case 'darwin':
253
+ return ide.macosCommand || ide.command;
254
+ case 'linux':
255
+ return ide.linuxCommand || ide.command;
256
+ default:
257
+ return ide.command;
258
+ }
259
+ }
260
+
261
+ private async isCommandAvailable(command: string): Promise<boolean> {
262
+ return new Promise((resolve) => {
263
+ const checkCommand = this.platform === 'win32'
264
+ ? `where ${command}`
265
+ : `which ${command}`;
266
+
267
+ child_process.exec(checkCommand, (error) => {
268
+ resolve(!error);
269
+ });
270
+ });
271
+ }
272
+
273
+ cleanup(): void {
274
+ // Close all active sessions
275
+ for (const [_sessionId, session] of this.activeSessions) {
276
+ if (session.process) {
277
+ session.process.kill();
278
+ }
279
+ }
280
+ this.activeSessions.clear();
281
+ this.removeAllListeners();
282
+ }
283
+ }
284
+
285
+ // Import fs at the end to avoid circular dependencies
286
+ import * as fs from 'fs';
287
+
288
+ export default IDEIntegration;
@@ -0,0 +1,327 @@
1
+ import { EventEmitter } from 'events';
2
+ import log from 'electron-log';
3
+ import fetch from 'node-fetch';
4
+
5
+ export interface LinearConfig {
6
+ apiKey: string;
7
+ organizationId?: string;
8
+ }
9
+
10
+ export interface LinearIssue {
11
+ id: string;
12
+ title: string;
13
+ description?: string;
14
+ state: { name: string; type: string };
15
+ priority: number;
16
+ assignee?: { name: string; email: string };
17
+ labels: Array<{ name: string; color: string }>;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ }
21
+
22
+ export interface LinearComment {
23
+ id: string;
24
+ body: string;
25
+ user: { name: string };
26
+ createdAt: string;
27
+ }
28
+
29
+ export class LinearManager extends EventEmitter {
30
+ private config: LinearConfig | null = null;
31
+ private baseUrl = 'https://api.linear.app/graphql';
32
+
33
+ constructor() {
34
+ super();
35
+ }
36
+
37
+ async configure(config: LinearConfig): Promise<void> {
38
+ this.config = config;
39
+ log.info('Linear configured', { organizationId: config.organizationId });
40
+ }
41
+
42
+ private async graphqlRequest(query: string, variables?: Record<string, any>): Promise<any> {
43
+ if (!this.config) throw new Error('Linear not configured');
44
+
45
+ const response = await fetch(this.baseUrl, {
46
+ method: 'POST',
47
+ headers: {
48
+ 'Content-Type': 'application/json',
49
+ 'Authorization': this.config.apiKey,
50
+ },
51
+ body: JSON.stringify({ query, variables }),
52
+ });
53
+
54
+ if (!response.ok) {
55
+ throw new Error(`Linear API error: ${response.statusText}`);
56
+ }
57
+
58
+ const jsonData = await response.json() as any;
59
+
60
+ if (jsonData.errors) {
61
+ throw new Error(`Linear GraphQL error: ${jsonData.errors[0].message}`);
62
+ }
63
+
64
+ return jsonData.data;
65
+ }
66
+
67
+ async listIssues(options?: {
68
+ teamId?: string;
69
+ assigneeId?: string;
70
+ labels?: string[];
71
+ limit?: number;
72
+ }): Promise<LinearIssue[]> {
73
+ const query = `
74
+ query Issues($first: Int, $filter: IssueFilter) {
75
+ issues(first: $first, filter: $filter) {
76
+ nodes {
77
+ id
78
+ title
79
+ description
80
+ priority
81
+ createdAt
82
+ updatedAt
83
+ state { name type }
84
+ assignee { name email }
85
+ labels { nodes { name color } }
86
+ }
87
+ }
88
+ }
89
+ `;
90
+
91
+ const variables: Record<string, any> = {
92
+ first: options?.limit || 50,
93
+ filter: {},
94
+ };
95
+
96
+ if (options?.teamId) {
97
+ variables.filter.team = { id: { eq: options.teamId } };
98
+ }
99
+ if (options?.assigneeId) {
100
+ variables.filter.assignee = { id: { eq: options.assigneeId } };
101
+ }
102
+
103
+ const data = await this.graphqlRequest(query, variables);
104
+ return data.issues.nodes.map((issue: any) => ({
105
+ ...issue,
106
+ labels: issue.labels?.nodes || [],
107
+ }));
108
+ }
109
+
110
+ async getIssue(issueId: string): Promise<LinearIssue> {
111
+ const query = `
112
+ query Issue($id: String!) {
113
+ issue(id: $id) {
114
+ id
115
+ title
116
+ description
117
+ priority
118
+ createdAt
119
+ updatedAt
120
+ state { name type }
121
+ assignee { name email }
122
+ labels { nodes { name color } }
123
+ }
124
+ }
125
+ `;
126
+
127
+ const data = await this.graphqlRequest(query, { id: issueId });
128
+ const issue = data.issue;
129
+ return {
130
+ ...issue,
131
+ labels: issue.labels?.nodes || [],
132
+ };
133
+ }
134
+
135
+ async createIssue(options: {
136
+ teamId: string;
137
+ title: string;
138
+ description?: string;
139
+ priority?: number;
140
+ assigneeId?: string;
141
+ labels?: string[];
142
+ }): Promise<LinearIssue> {
143
+ const mutation = `
144
+ mutation CreateIssue($input: IssueCreateInput!) {
145
+ issueCreate(input: $input) {
146
+ success
147
+ issue {
148
+ id
149
+ title
150
+ description
151
+ priority
152
+ createdAt
153
+ updatedAt
154
+ state { name type }
155
+ assignee { name email }
156
+ }
157
+ }
158
+ }
159
+ `;
160
+
161
+ const variables = {
162
+ input: {
163
+ teamId: options.teamId,
164
+ title: options.title,
165
+ description: options.description,
166
+ priority: options.priority || 0,
167
+ assigneeId: options.assigneeId,
168
+ labelIds: options.labels,
169
+ },
170
+ };
171
+
172
+ const data = await this.graphqlRequest(mutation, variables);
173
+
174
+ if (!data.issueCreate.success) {
175
+ throw new Error('Failed to create issue');
176
+ }
177
+
178
+ return data.issueCreate.issue;
179
+ }
180
+
181
+ async updateIssue(issueId: string, updates: {
182
+ title?: string;
183
+ description?: string;
184
+ priority?: number;
185
+ assigneeId?: string;
186
+ stateId?: string;
187
+ }): Promise<LinearIssue> {
188
+ const mutation = `
189
+ mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {
190
+ issueUpdate(id: $id, input: $input) {
191
+ success
192
+ issue {
193
+ id
194
+ title
195
+ description
196
+ priority
197
+ updatedAt
198
+ state { name type }
199
+ }
200
+ }
201
+ }
202
+ `;
203
+
204
+ const variables = {
205
+ id: issueId,
206
+ input: updates,
207
+ };
208
+
209
+ const data = await this.graphqlRequest(mutation, variables);
210
+
211
+ if (!data.issueUpdate.success) {
212
+ throw new Error('Failed to update issue');
213
+ }
214
+
215
+ return data.issueUpdate.issue;
216
+ }
217
+
218
+ async addComment(issueId: string, body: string): Promise<LinearComment> {
219
+ const mutation = `
220
+ mutation CreateComment($input: CommentCreateInput!) {
221
+ commentCreate(input: $input) {
222
+ success
223
+ comment {
224
+ id
225
+ body
226
+ user { name }
227
+ createdAt
228
+ }
229
+ }
230
+ }
231
+ `;
232
+
233
+ const variables = {
234
+ input: {
235
+ issueId,
236
+ body,
237
+ },
238
+ };
239
+
240
+ const data = await this.graphqlRequest(mutation, variables);
241
+
242
+ if (!data.commentCreate.success) {
243
+ throw new Error('Failed to add comment');
244
+ }
245
+
246
+ return data.commentCreate.comment;
247
+ }
248
+
249
+ async listComments(issueId: string): Promise<LinearComment[]> {
250
+ const query = `
251
+ query Comments($issueId: ID!) {
252
+ comments(filter: { issue: { id: { eq: $issueId } } }) {
253
+ nodes {
254
+ id
255
+ body
256
+ user { name }
257
+ createdAt
258
+ }
259
+ }
260
+ }
261
+ `;
262
+
263
+ const data = await this.graphqlRequest(query, { issueId });
264
+ return data.comments.nodes;
265
+ }
266
+
267
+ async archiveIssue(issueId: string): Promise<void> {
268
+ const mutation = `
269
+ mutation ArchiveIssue($id: String!) {
270
+ issueArchive(id: $id) {
271
+ success
272
+ }
273
+ }
274
+ `;
275
+
276
+ const data = await this.graphqlRequest(mutation, { id: issueId });
277
+
278
+ if (!data.issueArchive.success) {
279
+ throw new Error('Failed to archive issue');
280
+ }
281
+ }
282
+
283
+ async listTeams(): Promise<Array<{ id: string; name: string; key: string }>> {
284
+ const query = `
285
+ query Teams {
286
+ teams {
287
+ nodes {
288
+ id
289
+ name
290
+ key
291
+ }
292
+ }
293
+ }
294
+ `;
295
+
296
+ const data = await this.graphqlRequest(query);
297
+ return data.teams.nodes;
298
+ }
299
+
300
+ async listLabels(): Promise<Array<{ id: string; name: string; color: string }>> {
301
+ const query = `
302
+ query Labels {
303
+ labels {
304
+ nodes {
305
+ id
306
+ name
307
+ color
308
+ }
309
+ }
310
+ }
311
+ `;
312
+
313
+ const data = await this.graphqlRequest(query);
314
+ return data.labels.nodes;
315
+ }
316
+
317
+ getConfig(): LinearConfig | null {
318
+ return this.config ? { ...this.config, apiKey: '***' } : null;
319
+ }
320
+
321
+ cleanup(): void {
322
+ this.config = null;
323
+ this.removeAllListeners();
324
+ }
325
+ }
326
+
327
+ export default LinearManager;