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,326 @@
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+
3
+ interface MCPServer {
4
+ id: string;
5
+ name: string;
6
+ status: string;
7
+ disabled?: boolean;
8
+ scope: string;
9
+ transport: string;
10
+ tools: number;
11
+ resources: number;
12
+ }
13
+
14
+ interface MCPRegistryEntry {
15
+ id: string;
16
+ name: string;
17
+ description: string;
18
+ publisher: string;
19
+ version: string;
20
+ transport: string[];
21
+ categories: string[];
22
+ tags: string[];
23
+ installs: number;
24
+ rating: number;
25
+ }
26
+
27
+ interface MCPPanelProps {
28
+ servers?: MCPServer[];
29
+ registryEntries?: MCPRegistryEntry[];
30
+ onAddServer?: (entryId: string, scope: string) => Promise<void>;
31
+ onRemoveServer?: (serverId: string) => Promise<void>;
32
+ onToggleServer?: (serverId: string, enabled: boolean) => Promise<void>;
33
+ onSearchRegistry?: (query: string) => Promise<MCPRegistryEntry[]>;
34
+ onSyncRegistry?: () => Promise<void>;
35
+ }
36
+
37
+ export const MCPPanel: React.FC<MCPPanelProps> = ({
38
+ servers = [],
39
+ registryEntries = [],
40
+ onAddServer,
41
+ onRemoveServer,
42
+ onToggleServer,
43
+ onSearchRegistry,
44
+ onSyncRegistry,
45
+ }) => {
46
+ const [activeTab, setActiveTab] = useState<'installed' | 'registry'>('installed');
47
+ const [searchQuery, setSearchQuery] = useState('');
48
+ const [searchResults, setSearchResults] = useState<MCPRegistryEntry[]>(registryEntries);
49
+ const [selectedScope, setSelectedScope] = useState<string>('local');
50
+ const [isSyncing, setIsSyncing] = useState(false);
51
+ const [selectedCategories, setSelectedCategories] = useState<string[]>([]);
52
+
53
+ const categories = Array.from(new Set(registryEntries.flatMap(e => e.categories)));
54
+
55
+ const handleSearch = useCallback(async () => {
56
+ if (onSearchRegistry) {
57
+ const results = await onSearchRegistry(searchQuery);
58
+ setSearchResults(results);
59
+ }
60
+ }, [searchQuery, onSearchRegistry]);
61
+
62
+ useEffect(() => {
63
+ if (activeTab === 'registry' && searchQuery) {
64
+ handleSearch();
65
+ }
66
+ }, [searchQuery, activeTab, handleSearch]);
67
+
68
+ const handleSync = async () => {
69
+ if (onSyncRegistry) {
70
+ setIsSyncing(true);
71
+ await onSyncRegistry();
72
+ setIsSyncing(false);
73
+ }
74
+ };
75
+
76
+ const getStatusColor = (status: string, disabled?: boolean) => {
77
+ if (disabled) return 'text-gray-500';
78
+ switch (status) {
79
+ case 'running': return 'text-green-400';
80
+ case 'starting': return 'text-yellow-400';
81
+ case 'error': return 'text-red-400';
82
+ default: return 'text-gray-400';
83
+ }
84
+ };
85
+
86
+ const getScopeLabel = (scope: string) => {
87
+ switch (scope) {
88
+ case 'local': return '👤 Local';
89
+ case 'project': return '📁 Project';
90
+ case 'user': return '🏠 User';
91
+ default: return scope;
92
+ }
93
+ };
94
+
95
+ return (
96
+ <div className="flex flex-col h-full bg-gray-900 text-gray-100 p-4">
97
+ {/* Header */}
98
+ <div className="mb-4">
99
+ <h2 className="text-2xl font-bold mb-2">🔌 MCP Registry</h2>
100
+ <p className="text-gray-400 text-sm">
101
+ Connect to external tools and services via Model Context Protocol
102
+ </p>
103
+ </div>
104
+
105
+ {/* Tabs */}
106
+ <div className="flex gap-2 mb-4">
107
+ <button
108
+ onClick={() => setActiveTab('installed')}
109
+ className={`px-4 py-2 rounded font-medium transition-colors ${
110
+ activeTab === 'installed'
111
+ ? 'bg-blue-600 text-white'
112
+ : 'bg-gray-800 text-gray-400 hover:bg-gray-700'
113
+ }`}
114
+ >
115
+ Installed ({servers.length})
116
+ </button>
117
+ <button
118
+ onClick={() => setActiveTab('registry')}
119
+ className={`px-4 py-2 rounded font-medium transition-colors ${
120
+ activeTab === 'registry'
121
+ ? 'bg-blue-600 text-white'
122
+ : 'bg-gray-800 text-gray-400 hover:bg-gray-700'
123
+ }`}
124
+ >
125
+ Registry ({registryEntries.length})
126
+ </button>
127
+ </div>
128
+
129
+ {/* Installed Servers Tab */}
130
+ {activeTab === 'installed' && (
131
+ <div className="flex-1 overflow-y-auto">
132
+ {servers.length === 0 ? (
133
+ <div className="text-center py-12 text-gray-500">
134
+ <p className="text-lg mb-2">No MCP servers installed</p>
135
+ <p className="text-sm">Go to the Registry tab to discover and add servers</p>
136
+ </div>
137
+ ) : (
138
+ <div className="space-y-3">
139
+ {servers.map((server) => (
140
+ <div
141
+ key={server.id}
142
+ className="bg-gray-800 rounded-lg p-4 border border-gray-700"
143
+ >
144
+ <div className="flex justify-between items-start mb-2">
145
+ <div>
146
+ <h3 className="font-semibold text-lg">{server.name}</h3>
147
+ <span className="text-xs text-gray-500">{server.id}</span>
148
+ </div>
149
+ <div className="flex items-center gap-2">
150
+ <span className={`text-sm font-medium ${getStatusColor(server.status, server.disabled)}`}>
151
+ {server.disabled ? 'Disabled' : server.status}
152
+ </span>
153
+ <button
154
+ onClick={() => onToggleServer?.(server.id, !!server.disabled)}
155
+ className={`w-12 h-6 rounded-full transition-colors relative ${
156
+ server.disabled ? 'bg-gray-600' : 'bg-green-500'
157
+ }`}
158
+ >
159
+ <span
160
+ className={`absolute top-1 w-4 h-4 bg-white rounded-full transition-transform ${
161
+ server.disabled ? 'left-1' : 'right-1'
162
+ }`}
163
+ />
164
+ </button>
165
+ </div>
166
+ </div>
167
+
168
+ <div className="flex items-center gap-4 text-sm text-gray-400 mb-3">
169
+ <span>{getScopeLabel(server.scope)}</span>
170
+ <span>•</span>
171
+ <span className="uppercase text-xs bg-gray-700 px-2 py-1 rounded">
172
+ {server.transport}
173
+ </span>
174
+ <span>•</span>
175
+ <span>{server.tools} tools</span>
176
+ <span>•</span>
177
+ <span>{server.resources} resources</span>
178
+ </div>
179
+
180
+ <button
181
+ onClick={() => onRemoveServer?.(server.id)}
182
+ className="text-red-400 hover:text-red-300 text-sm"
183
+ >
184
+ Remove
185
+ </button>
186
+ </div>
187
+ ))}
188
+ </div>
189
+ )}
190
+ </div>
191
+ )}
192
+
193
+ {/* Registry Tab */}
194
+ {activeTab === 'registry' && (
195
+ <div className="flex-1 flex flex-col">
196
+ {/* Search Bar */}
197
+ <div className="flex gap-2 mb-4">
198
+ <input
199
+ type="text"
200
+ value={searchQuery}
201
+ onChange={(e) => setSearchQuery(e.target.value)}
202
+ placeholder="Search MCP servers..."
203
+ className="flex-1 bg-gray-800 border border-gray-700 rounded px-3 py-2 text-white placeholder-gray-500 focus:outline-none focus:border-blue-500"
204
+ />
205
+ <button
206
+ onClick={handleSync}
207
+ disabled={isSyncing}
208
+ className="bg-gray-800 hover:bg-gray-700 disabled:opacity-50 px-4 py-2 rounded transition-colors"
209
+ >
210
+ {isSyncing ? '🔄' : '📥'}
211
+ </button>
212
+ </div>
213
+
214
+ {/* Category Filters */}
215
+ <div className="flex flex-wrap gap-2 mb-4">
216
+ {categories.map((category) => (
217
+ <button
218
+ key={category}
219
+ onClick={() => {
220
+ if (selectedCategories.includes(category)) {
221
+ setSelectedCategories(selectedCategories.filter(c => c !== category));
222
+ } else {
223
+ setSelectedCategories([...selectedCategories, category]);
224
+ }
225
+ }}
226
+ className={`text-xs px-3 py-1 rounded-full transition-colors ${
227
+ selectedCategories.includes(category)
228
+ ? 'bg-blue-600 text-white'
229
+ : 'bg-gray-800 text-gray-400 hover:bg-gray-700'
230
+ }`}
231
+ >
232
+ {category}
233
+ </button>
234
+ ))}
235
+ </div>
236
+
237
+ {/* Scope Selector */}
238
+ <div className="flex gap-2 mb-4">
239
+ <span className="text-sm text-gray-400 py-2">Install to:</span>
240
+ {['local', 'project', 'user'].map((scope) => (
241
+ <button
242
+ key={scope}
243
+ onClick={() => setSelectedScope(scope)}
244
+ className={`text-sm px-3 py-1 rounded transition-colors ${
245
+ selectedScope === scope
246
+ ? 'bg-blue-600 text-white'
247
+ : 'bg-gray-800 text-gray-400 hover:bg-gray-700'
248
+ }`}
249
+ >
250
+ {getScopeLabel(scope)}
251
+ </button>
252
+ ))}
253
+ </div>
254
+
255
+ {/* Registry Entries */}
256
+ <div className="flex-1 overflow-y-auto">
257
+ {searchResults.length === 0 ? (
258
+ <div className="text-center py-12 text-gray-500">
259
+ <p>No MCP servers found</p>
260
+ <p className="text-sm mt-2">Try syncing with the registry</p>
261
+ </div>
262
+ ) : (
263
+ <div className="space-y-3">
264
+ {searchResults
265
+ .filter(entry =>
266
+ selectedCategories.length === 0 ||
267
+ entry.categories.some(c => selectedCategories.includes(c))
268
+ )
269
+ .map((entry) => (
270
+ <div
271
+ key={entry.id}
272
+ className="bg-gray-800 rounded-lg p-4 border border-gray-700 hover:border-gray-600 transition-colors"
273
+ >
274
+ <div className="flex justify-between items-start mb-2">
275
+ <div>
276
+ <h3 className="font-semibold text-lg">{entry.name}</h3>
277
+ <p className="text-sm text-gray-400">{entry.description}</p>
278
+ </div>
279
+ <button
280
+ onClick={() => onAddServer?.(entry.id, selectedScope)}
281
+ className="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded text-sm font-medium transition-colors"
282
+ >
283
+ Install
284
+ </button>
285
+ </div>
286
+
287
+ <div className="flex flex-wrap items-center gap-3 text-sm text-gray-400 mb-2">
288
+ <span className="text-blue-400">@{entry.publisher}</span>
289
+ <span>•</span>
290
+ <span>v{entry.version}</span>
291
+ <span>•</span>
292
+ <span>⭐ {entry.rating.toFixed(1)}</span>
293
+ <span>•</span>
294
+ <span>📥 {entry.installs.toLocaleString()}</span>
295
+ </div>
296
+
297
+ <div className="flex flex-wrap gap-2">
298
+ {entry.categories.map((category) => (
299
+ <span
300
+ key={category}
301
+ className="text-xs bg-gray-700 text-gray-300 px-2 py-1 rounded"
302
+ >
303
+ {category}
304
+ </span>
305
+ ))}
306
+ {entry.tags.slice(0, 3).map((tag) => (
307
+ <span
308
+ key={tag}
309
+ className="text-xs bg-gray-800 text-gray-400 px-2 py-1 rounded"
310
+ >
311
+ #{tag}
312
+ </span>
313
+ ))}
314
+ </div>
315
+ </div>
316
+ ))}
317
+ </div>
318
+ )}
319
+ </div>
320
+ </div>
321
+ )}
322
+ </div>
323
+ );
324
+ };
325
+
326
+ export default MCPPanel;
@@ -0,0 +1,239 @@
1
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
2
+ import { FileText, Folder } from 'lucide-react';
3
+
4
+ interface MentionAutocompleteProps {
5
+ input: string;
6
+ cursorPosition: number;
7
+ projectPath: string;
8
+ onSelect: (filePath: string) => void;
9
+ onClose: () => void;
10
+ }
11
+
12
+ interface FileItem {
13
+ path: string;
14
+ name: string;
15
+ isDirectory: boolean;
16
+ }
17
+
18
+ export const MentionAutocomplete: React.FC<MentionAutocompleteProps> = ({
19
+ input,
20
+ cursorPosition,
21
+ projectPath,
22
+ onSelect,
23
+ onClose
24
+ }) => {
25
+ const [files, setFiles] = useState<FileItem[]>([]);
26
+ const [filteredFiles, setFilteredFiles] = useState<FileItem[]>([]);
27
+ const [selectedIndex, setSelectedIndex] = useState(0);
28
+ const [mentionQuery, setMentionQuery] = useState('');
29
+ const [showDropdown, setShowDropdown] = useState(false);
30
+ const containerRef = useRef<HTMLDivElement>(null);
31
+
32
+ // Extract mention query from input
33
+ useEffect(() => {
34
+ const textBeforeCursor = input.slice(0, cursorPosition);
35
+ const mentionMatch = textBeforeCursor.match(/@([^\s]*)$/);
36
+
37
+ if (mentionMatch) {
38
+ setMentionQuery(mentionMatch[1]);
39
+ setShowDropdown(true);
40
+ } else {
41
+ setShowDropdown(false);
42
+ }
43
+ }, [input, cursorPosition]);
44
+
45
+ // Load files from project recursively
46
+ useEffect(() => {
47
+ const loadFiles = async () => {
48
+ if (!projectPath || !showDropdown) return;
49
+
50
+ try {
51
+ const fileItems: FileItem[] = [];
52
+
53
+ const scanDirectory = async (dirPath: string, basePath: string) => {
54
+ try {
55
+ const entries = await window.electronAPI.fs.readdir(dirPath, { withFileTypes: true });
56
+
57
+ for (const entry of entries) {
58
+ const fullPath = `${dirPath}/${entry.name}`;
59
+ const relativePath = fullPath.replace(basePath + '/', '');
60
+
61
+ // Skip node_modules and hidden files
62
+ if (entry.name.startsWith('.') || entry.name === 'node_modules') {
63
+ continue;
64
+ }
65
+
66
+ fileItems.push({
67
+ path: relativePath,
68
+ name: entry.name,
69
+ isDirectory: entry.isDirectory()
70
+ });
71
+
72
+ // Recursively scan directories
73
+ if (entry.isDirectory()) {
74
+ await scanDirectory(fullPath, basePath);
75
+ }
76
+ }
77
+ } catch (error) {
78
+ // Skip directories we can't read
79
+ console.debug('Skipping directory:', dirPath);
80
+ }
81
+ };
82
+
83
+ await scanDirectory(projectPath, projectPath);
84
+ setFiles(fileItems);
85
+ } catch (error) {
86
+ console.error('Failed to load files:', error);
87
+ }
88
+ };
89
+
90
+ loadFiles();
91
+ }, [projectPath, showDropdown]);
92
+
93
+ // Filter files based on query
94
+ useEffect(() => {
95
+ if (!mentionQuery) {
96
+ // Show recent/frequent files when no query
97
+ setFilteredFiles(files.slice(0, 10));
98
+ } else {
99
+ const query = mentionQuery.toLowerCase();
100
+ const filtered = files
101
+ .filter(file =>
102
+ file.name.toLowerCase().includes(query) ||
103
+ file.path.toLowerCase().includes(query)
104
+ )
105
+ .slice(0, 10);
106
+ setFilteredFiles(filtered);
107
+ }
108
+ setSelectedIndex(0);
109
+ }, [mentionQuery, files]);
110
+
111
+ // Handle keyboard navigation
112
+ const handleKeyDown = useCallback((e: KeyboardEvent) => {
113
+ if (!showDropdown) return;
114
+
115
+ switch (e.key) {
116
+ case 'ArrowDown':
117
+ e.preventDefault();
118
+ setSelectedIndex(prev =>
119
+ prev < filteredFiles.length - 1 ? prev + 1 : prev
120
+ );
121
+ break;
122
+ case 'ArrowUp':
123
+ e.preventDefault();
124
+ setSelectedIndex(prev => prev > 0 ? prev - 1 : 0);
125
+ break;
126
+ case 'Enter':
127
+ e.preventDefault();
128
+ if (filteredFiles[selectedIndex]) {
129
+ handleSelect(filteredFiles[selectedIndex]);
130
+ }
131
+ break;
132
+ case 'Escape':
133
+ onClose();
134
+ break;
135
+ }
136
+ }, [showDropdown, filteredFiles, selectedIndex, onClose]);
137
+
138
+ useEffect(() => {
139
+ document.addEventListener('keydown', handleKeyDown);
140
+ return () => document.removeEventListener('keydown', handleKeyDown);
141
+ }, [handleKeyDown]);
142
+
143
+ // Close dropdown when clicking outside
144
+ useEffect(() => {
145
+ const handleClickOutside = (e: MouseEvent) => {
146
+ if (containerRef.current && !containerRef.current.contains(e.target as Node)) {
147
+ onClose();
148
+ }
149
+ };
150
+
151
+ if (showDropdown) {
152
+ document.addEventListener('mousedown', handleClickOutside);
153
+ return () => document.removeEventListener('mousedown', handleClickOutside);
154
+ }
155
+ }, [showDropdown, onClose]);
156
+
157
+ const handleSelect = (file: FileItem) => {
158
+ const textBeforeCursor = input.slice(0, cursorPosition);
159
+ const textAfterCursor = input.slice(cursorPosition);
160
+
161
+ // Replace the mention query with the selected file path
162
+ const mentionStart = textBeforeCursor.lastIndexOf('@');
163
+ const newTextBeforeCursor = textBeforeCursor.slice(0, mentionStart) + `@${file.path}`;
164
+
165
+ onSelect(newTextBeforeCursor + textAfterCursor);
166
+ onClose();
167
+ };
168
+
169
+ const highlightMatch = (text: string, query: string) => {
170
+ if (!query) return text;
171
+
172
+ const parts = text.split(new RegExp(`(${query})`, 'gi'));
173
+ return parts.map((part, i) =>
174
+ part.toLowerCase() === query.toLowerCase() ? (
175
+ <mark key={i} className="bg-primary text-primary-foreground rounded px-0.5">
176
+ {part}
177
+ </mark>
178
+ ) : (
179
+ part
180
+ )
181
+ );
182
+ };
183
+
184
+ if (!showDropdown || filteredFiles.length === 0) {
185
+ return null;
186
+ }
187
+
188
+ return (
189
+ <div
190
+ ref={containerRef}
191
+ className="absolute bottom-full left-0 mb-2 w-80 max-h-64 bg-card border border-border rounded-lg shadow-lg overflow-hidden z-50"
192
+ >
193
+ <div className="px-3 py-2 border-b border-border bg-muted/50">
194
+ <span className="text-xs font-medium text-muted-foreground">
195
+ {mentionQuery ? 'Matching files' : 'Recent files'}
196
+ </span>
197
+ </div>
198
+
199
+ <div className="overflow-y-auto max-h-52">
200
+ {filteredFiles.map((file, index) => (
201
+ <button
202
+ key={file.path}
203
+ onClick={() => handleSelect(file)}
204
+ className={`w-full flex items-center gap-2 px-3 py-2 text-left transition-colors ${
205
+ index === selectedIndex
206
+ ? 'bg-primary/10'
207
+ : 'hover:bg-muted'
208
+ }`}
209
+ >
210
+ {file.isDirectory ? (
211
+ <Folder className="w-4 h-4 text-yellow-500" />
212
+ ) : (
213
+ <FileText className="w-4 h-4 text-blue-500" />
214
+ )}
215
+ <div className="flex-1 min-w-0">
216
+ <div className="text-sm truncate">
217
+ {highlightMatch(file.name, mentionQuery)}
218
+ </div>
219
+ <div className="text-xs text-muted-foreground truncate">
220
+ {highlightMatch(file.path, mentionQuery)}
221
+ </div>
222
+ </div>
223
+ </button>
224
+ ))}
225
+ </div>
226
+
227
+ <div className="px-3 py-2 border-t border-border bg-muted/50 flex items-center justify-between text-xs text-muted-foreground">
228
+ <div className="flex gap-2">
229
+ <span>↑↓ to navigate</span>
230
+ <span>↵ to select</span>
231
+ <span>Esc to close</span>
232
+ </div>
233
+ <span>{filteredFiles.length} files</span>
234
+ </div>
235
+ </div>
236
+ );
237
+ };
238
+
239
+ export default MentionAutocomplete;