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,471 @@
1
+ import React, { useState } from 'react';
2
+ import {
3
+ Plug,
4
+ Plus,
5
+ Trash2,
6
+ Check,
7
+ X,
8
+ ExternalLink,
9
+ RefreshCw,
10
+ MessageSquare,
11
+ Github,
12
+ Calendar,
13
+ Database,
14
+ Search,
15
+ AlertCircle,
16
+ ChevronDown,
17
+ ChevronUp
18
+ } from 'lucide-react';
19
+
20
+ interface Connector {
21
+ id: string;
22
+ name: string;
23
+ description: string;
24
+ icon: string;
25
+ category: 'communication' | 'project' | 'storage' | 'search' | 'calendar';
26
+ enabled: boolean;
27
+ configured: boolean;
28
+ config: Record<string, string>;
29
+ lastSync?: Date;
30
+ error?: string;
31
+ }
32
+
33
+ interface ConnectorsPanelProps {
34
+ connectors: Connector[];
35
+ onEnableConnector: (connectorId: string) => Promise<void>;
36
+ onDisableConnector: (connectorId: string) => Promise<void>;
37
+ onConfigureConnector: (connectorId: string, config: Record<string, string>) => Promise<void>;
38
+ onTestConnector: (connectorId: string) => Promise<boolean>;
39
+ onSyncConnector: (connectorId: string) => Promise<void>;
40
+ onRemoveConnector: (connectorId: string) => Promise<void>;
41
+ }
42
+
43
+ const connectorDefaults: Omit<Connector, 'id' | 'enabled' | 'configured' | 'config'>[] = [
44
+ {
45
+ name: 'Slack',
46
+ description: 'Send messages and interact with Slack channels',
47
+ icon: 'slack',
48
+ category: 'communication'
49
+ },
50
+ {
51
+ name: 'GitHub',
52
+ description: 'Access repositories, issues, and pull requests',
53
+ icon: 'github',
54
+ category: 'project'
55
+ },
56
+ {
57
+ name: 'Linear',
58
+ description: 'Manage issues and projects from Linear',
59
+ icon: 'linear',
60
+ category: 'project'
61
+ },
62
+ {
63
+ name: 'Notion',
64
+ description: 'Read and write to Notion databases and pages',
65
+ icon: 'notion',
66
+ category: 'storage'
67
+ },
68
+ {
69
+ name: 'Google Calendar',
70
+ description: 'Read calendar events and schedule meetings',
71
+ icon: 'calendar',
72
+ category: 'calendar'
73
+ },
74
+ {
75
+ name: 'PostgreSQL',
76
+ description: 'Query and manage PostgreSQL databases',
77
+ icon: 'database',
78
+ category: 'storage'
79
+ },
80
+ {
81
+ name: 'Brave Search',
82
+ description: 'Search the web using Brave Search API',
83
+ icon: 'search',
84
+ category: 'search'
85
+ }
86
+ ];
87
+
88
+ const getCategoryIcon = (category: string) => {
89
+ switch (category) {
90
+ case 'communication':
91
+ return <MessageSquare className="w-4 h-4" />;
92
+ case 'project':
93
+ return <Github className="w-4 h-4" />;
94
+ case 'storage':
95
+ return <Database className="w-4 h-4" />;
96
+ case 'search':
97
+ return <Search className="w-4 h-4" />;
98
+ case 'calendar':
99
+ return <Calendar className="w-4 h-4" />;
100
+ default:
101
+ return <Plug className="w-4 h-4" />;
102
+ }
103
+ };
104
+
105
+ export const ConnectorsPanel: React.FC<ConnectorsPanelProps> = ({
106
+ connectors,
107
+ onEnableConnector,
108
+ onDisableConnector,
109
+ onConfigureConnector,
110
+ onTestConnector,
111
+ onSyncConnector,
112
+ onRemoveConnector
113
+ }) => {
114
+ const [showAddModal, setShowAddModal] = useState(false);
115
+ const [selectedConnector, setSelectedConnector] = useState<Connector | null>(null);
116
+ const [editingConnector, setEditingConnector] = useState<string | null>(null);
117
+ const [configValues, setConfigValues] = useState<Record<string, string>>({});
118
+ const [testing, setTesting] = useState<string | null>(null);
119
+ const [testResult, setTestResult] = useState<{ connectorId: string; success: boolean } | null>(null);
120
+ const [expandedCategories, setExpandedCategories] = useState<Set<string>>(new Set(['communication', 'project', 'storage', 'search', 'calendar']));
121
+
122
+ const groupedConnectors = connectors.reduce((acc, connector) => {
123
+ if (!acc[connector.category]) {
124
+ acc[connector.category] = [];
125
+ }
126
+ acc[connector.category].push(connector);
127
+ return acc;
128
+ }, {} as Record<string, Connector[]>);
129
+
130
+ const handleConfigure = (connector: Connector) => {
131
+ setEditingConnector(connector.id);
132
+ setConfigValues(connector.config || {});
133
+ };
134
+
135
+ const handleSaveConfig = async (connectorId: string) => {
136
+ try {
137
+ await onConfigureConnector(connectorId, configValues);
138
+ setEditingConnector(null);
139
+ setConfigValues({});
140
+ } catch (error) {
141
+ console.error('Failed to save config:', error);
142
+ }
143
+ };
144
+
145
+ const handleTest = async (connectorId: string) => {
146
+ setTesting(connectorId);
147
+ try {
148
+ const success = await onTestConnector(connectorId);
149
+ setTestResult({ connectorId, success });
150
+ setTimeout(() => setTestResult(null), 3000);
151
+ } catch (error) {
152
+ setTestResult({ connectorId, success: false });
153
+ } finally {
154
+ setTesting(null);
155
+ }
156
+ };
157
+
158
+ const toggleCategory = (category: string) => {
159
+ setExpandedCategories(prev => {
160
+ const next = new Set(prev);
161
+ if (next.has(category)) {
162
+ next.delete(category);
163
+ } else {
164
+ next.add(category);
165
+ }
166
+ return next;
167
+ });
168
+ };
169
+
170
+ return (
171
+ <div className="h-full flex flex-col">
172
+ {/* Header */}
173
+ <div className="px-4 py-3 border-b border-border flex items-center justify-between bg-background/50">
174
+ <div className="flex items-center gap-2">
175
+ <Plug className="w-5 h-5" />
176
+ <h2 className="font-semibold">Connectors</h2>
177
+ </div>
178
+ <button
179
+ onClick={() => setShowAddModal(true)}
180
+ className="flex items-center gap-1.5 px-3 py-1.5 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 text-sm"
181
+ >
182
+ <Plus className="w-4 h-4" />
183
+ Add Connector
184
+ </button>
185
+ </div>
186
+
187
+ {/* Content */}
188
+ <div className="flex-1 overflow-auto p-4">
189
+ {connectors.length === 0 ? (
190
+ <div className="flex flex-col items-center justify-center h-full text-muted-foreground">
191
+ <Plug className="w-16 h-16 mb-4 opacity-30" />
192
+ <h3 className="text-lg font-medium">No Connectors</h3>
193
+ <p className="text-sm mt-2 text-center max-w-md">
194
+ Connect external services like Slack, GitHub, Linear, and more to extend Claude&apos;s capabilities
195
+ </p>
196
+ <button
197
+ onClick={() => setShowAddModal(true)}
198
+ className="mt-6 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90"
199
+ >
200
+ Add Your First Connector
201
+ </button>
202
+ </div>
203
+ ) : (
204
+ <div className="space-y-4 max-w-3xl">
205
+ {Object.entries(groupedConnectors).map(([category, categoryConnectors]) => (
206
+ <div key={category} className="bg-card border border-border rounded-lg overflow-hidden">
207
+ <button
208
+ onClick={() => toggleCategory(category)}
209
+ className="w-full px-4 py-3 flex items-center justify-between bg-muted/30 hover:bg-muted/50 transition-colors"
210
+ >
211
+ <div className="flex items-center gap-2">
212
+ {getCategoryIcon(category)}
213
+ <span className="font-medium capitalize">{category}</span>
214
+ <span className="text-xs text-muted-foreground">
215
+ ({categoryConnectors.length})
216
+ </span>
217
+ </div>
218
+ {expandedCategories.has(category) ? (
219
+ <ChevronUp className="w-4 h-4 text-muted-foreground" />
220
+ ) : (
221
+ <ChevronDown className="w-4 h-4 text-muted-foreground" />
222
+ )}
223
+ </button>
224
+
225
+ {expandedCategories.has(category) && (
226
+ <div className="divide-y divide-border">
227
+ {categoryConnectors.map(connector => (
228
+ <div key={connector.id} className="p-4">
229
+ <div className="flex items-start justify-between">
230
+ <div className="flex items-start gap-3">
231
+ <div className={`p-2 rounded-lg ${
232
+ connector.enabled ? 'bg-primary/10' : 'bg-muted'
233
+ }`}>
234
+ {getCategoryIcon(connector.category)}
235
+ </div>
236
+ <div>
237
+ <div className="flex items-center gap-2">
238
+ <h3 className="font-medium">{connector.name}</h3>
239
+ {connector.enabled ? (
240
+ <span className="text-xs px-2 py-0.5 bg-green-500/10 text-green-500 rounded-full">
241
+ Active
242
+ </span>
243
+ ) : (
244
+ <span className="text-xs px-2 py-0.5 bg-muted text-muted-foreground rounded-full">
245
+ Disabled
246
+ </span>
247
+ )}
248
+ </div>
249
+ <p className="text-sm text-muted-foreground mt-0.5">
250
+ {connector.description}
251
+ </p>
252
+ {connector.lastSync && (
253
+ <p className="text-xs text-muted-foreground mt-1">
254
+ Last synced: {new Date(connector.lastSync).toLocaleString()}
255
+ </p>
256
+ )}
257
+ {connector.error && (
258
+ <div className="flex items-center gap-1 text-xs text-red-500 mt-1">
259
+ <AlertCircle className="w-3 h-3" />
260
+ {connector.error}
261
+ </div>
262
+ )}
263
+ </div>
264
+ </div>
265
+
266
+ <div className="flex items-center gap-2">
267
+ {testResult?.connectorId === connector.id && (
268
+ <span className={`text-xs ${testResult.success ? 'text-green-500' : 'text-red-500'}`}>
269
+ {testResult.success ? 'Connected' : 'Failed'}
270
+ </span>
271
+ )}
272
+
273
+ {connector.configured && (
274
+ <button
275
+ onClick={() => handleTest(connector.id)}
276
+ disabled={testing === connector.id}
277
+ className="p-2 hover:bg-muted rounded-md text-muted-foreground"
278
+ title="Test connection"
279
+ >
280
+ <RefreshCw className={`w-4 h-4 ${testing === connector.id ? 'animate-spin' : ''}`} />
281
+ </button>
282
+ )}
283
+
284
+ {connector.enabled ? (
285
+ <button
286
+ onClick={() => onDisableConnector(connector.id)}
287
+ className="p-2 hover:bg-muted rounded-md text-muted-foreground"
288
+ title="Disable"
289
+ >
290
+ <X className="w-4 h-4" />
291
+ </button>
292
+ ) : (
293
+ <button
294
+ onClick={() => onEnableConnector(connector.id)}
295
+ className="p-2 hover:bg-muted rounded-md text-muted-foreground"
296
+ title="Enable"
297
+ >
298
+ <Check className="w-4 h-4" />
299
+ </button>
300
+ )}
301
+
302
+ <button
303
+ onClick={() => handleConfigure(connector)}
304
+ className="p-2 hover:bg-muted rounded-md text-muted-foreground"
305
+ title="Configure"
306
+ >
307
+ <ExternalLink className="w-4 h-4" />
308
+ </button>
309
+
310
+ <button
311
+ onClick={() => onRemoveConnector(connector.id)}
312
+ className="p-2 hover:bg-destructive/10 text-destructive rounded-md"
313
+ title="Remove"
314
+ >
315
+ <Trash2 className="w-4 h-4" />
316
+ </button>
317
+ </div>
318
+ </div>
319
+
320
+ {/* Configuration Editor */}
321
+ {editingConnector === connector.id && (
322
+ <div className="mt-4 p-4 bg-muted/50 rounded-lg">
323
+ <h4 className="text-sm font-medium mb-3">Configuration</h4>
324
+ <div className="space-y-3">
325
+ {Object.entries(getRequiredConfig(connector.name)).map(([key, label]) => (
326
+ <div key={key}>
327
+ <label className="block text-xs text-muted-foreground mb-1">
328
+ {label}
329
+ </label>
330
+ <input
331
+ type={key.toLowerCase().includes('token') || key.toLowerCase().includes('key') || key.toLowerCase().includes('secret') ? 'password' : 'text'}
332
+ value={configValues[key] || ''}
333
+ onChange={e => setConfigValues(prev => ({ ...prev, [key]: e.target.value }))}
334
+ className="w-full px-3 py-2 bg-background border border-input rounded-md text-sm"
335
+ placeholder={`Enter ${label.toLowerCase()}`}
336
+ />
337
+ </div>
338
+ ))}
339
+ </div>
340
+ <div className="flex items-center justify-end gap-2 mt-4">
341
+ <button
342
+ onClick={() => {
343
+ setEditingConnector(null);
344
+ setConfigValues({});
345
+ }}
346
+ className="px-3 py-1.5 text-sm text-muted-foreground hover:text-foreground"
347
+ >
348
+ Cancel
349
+ </button>
350
+ <button
351
+ onClick={() => handleSaveConfig(connector.id)}
352
+ className="px-3 py-1.5 bg-primary text-primary-foreground rounded-md text-sm hover:bg-primary/90"
353
+ >
354
+ Save Configuration
355
+ </button>
356
+ </div>
357
+ </div>
358
+ )}
359
+ </div>
360
+ ))}
361
+ </div>
362
+ )}
363
+ </div>
364
+ ))}
365
+ </div>
366
+ )}
367
+ </div>
368
+
369
+ {/* Add Connector Modal */}
370
+ {showAddModal && (
371
+ <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
372
+ <div className="bg-card border border-border rounded-lg p-6 w-[500px] max-w-[90vw] max-h-[80vh] overflow-auto">
373
+ <h2 className="text-lg font-semibold mb-4">Add Connector</h2>
374
+
375
+ <div className="space-y-3">
376
+ {connectorDefaults.map(connector => {
377
+ const existing = connectors.find(c => c.name === connector.name);
378
+ return (
379
+ <button
380
+ key={connector.name}
381
+ onClick={() => {
382
+ if (!existing) {
383
+ onEnableConnector(`connector-${Date.now()}`);
384
+ setShowAddModal(false);
385
+ }
386
+ }}
387
+ disabled={!!existing}
388
+ className={`w-full flex items-start gap-3 p-3 rounded-lg border text-left transition-colors ${
389
+ existing
390
+ ? 'opacity-50 cursor-not-allowed bg-muted'
391
+ : 'hover:bg-muted border-border hover:border-primary/50'
392
+ }`}
393
+ >
394
+ <div className="p-2 bg-muted rounded-lg">
395
+ {getCategoryIcon(connector.category)}
396
+ </div>
397
+ <div className="flex-1">
398
+ <div className="flex items-center justify-between">
399
+ <h3 className="font-medium">{connector.name}</h3>
400
+ {existing && (
401
+ <span className="text-xs px-2 py-0.5 bg-green-500/10 text-green-500 rounded-full">
402
+ Connected
403
+ </span>
404
+ )}
405
+ </div>
406
+ <p className="text-sm text-muted-foreground mt-0.5">
407
+ {connector.description}
408
+ </p>
409
+ </div>
410
+ </button>
411
+ );
412
+ })}
413
+ </div>
414
+
415
+ <div className="flex justify-end mt-6">
416
+ <button
417
+ onClick={() => setShowAddModal(false)}
418
+ className="px-4 py-2 text-muted-foreground hover:text-foreground"
419
+ >
420
+ Cancel
421
+ </button>
422
+ </div>
423
+ </div>
424
+ </div>
425
+ )}
426
+ </div>
427
+ );
428
+ };
429
+
430
+ // Helper function to get required config fields for each connector
431
+ function getRequiredConfig(connectorName: string): Record<string, string> {
432
+ switch (connectorName) {
433
+ case 'Slack':
434
+ return {
435
+ botToken: 'Bot Token',
436
+ signingSecret: 'Signing Secret'
437
+ };
438
+ case 'GitHub':
439
+ return {
440
+ token: 'Personal Access Token',
441
+ organization: 'Organization (optional)'
442
+ };
443
+ case 'Linear':
444
+ return {
445
+ apiKey: 'API Key'
446
+ };
447
+ case 'Notion':
448
+ return {
449
+ token: 'Integration Token'
450
+ };
451
+ case 'Google Calendar':
452
+ return {
453
+ clientId: 'Client ID',
454
+ clientSecret: 'Client Secret'
455
+ };
456
+ case 'PostgreSQL':
457
+ return {
458
+ connectionString: 'Connection String'
459
+ };
460
+ case 'Brave Search':
461
+ return {
462
+ apiKey: 'API Key'
463
+ };
464
+ default:
465
+ return {
466
+ apiKey: 'API Key'
467
+ };
468
+ }
469
+ }
470
+
471
+ export default ConnectorsPanel;
@@ -0,0 +1,155 @@
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+
3
+ interface ContextMenuItem {
4
+ label: string;
5
+ action: () => void;
6
+ icon?: React.ReactNode;
7
+ shortcut?: string;
8
+ disabled?: boolean;
9
+ divider?: boolean;
10
+ }
11
+
12
+ interface ContextMenuProps {
13
+ items: ContextMenuItem[];
14
+ x: number;
15
+ y: number;
16
+ onClose: () => void;
17
+ }
18
+
19
+ export const ContextMenu: React.FC<ContextMenuProps> = ({
20
+ items,
21
+ x,
22
+ y,
23
+ onClose,
24
+ }) => {
25
+ const menuRef = useRef<HTMLDivElement>(null);
26
+
27
+ useEffect(() => {
28
+ const handleClickOutside = (e: MouseEvent) => {
29
+ if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
30
+ onClose();
31
+ }
32
+ };
33
+
34
+ const handleEscape = (e: KeyboardEvent) => {
35
+ if (e.key === 'Escape') {
36
+ onClose();
37
+ }
38
+ };
39
+
40
+ document.addEventListener('mousedown', handleClickOutside);
41
+ document.addEventListener('keydown', handleEscape);
42
+
43
+ return () => {
44
+ document.removeEventListener('mousedown', handleClickOutside);
45
+ document.removeEventListener('keydown', handleEscape);
46
+ };
47
+ }, [onClose]);
48
+
49
+ // Adjust position to keep menu on screen
50
+ const adjustedX = Math.min(x, window.innerWidth - 200);
51
+ const adjustedY = Math.min(y, window.innerHeight - items.length * 32);
52
+
53
+ return (
54
+ <div
55
+ ref={menuRef}
56
+ className="fixed z-50 min-w-[160px] bg-card border border-border rounded-md shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100"
57
+ style={{ left: adjustedX, top: adjustedY }}
58
+ >
59
+ {items.map((item, index) =>
60
+ item.divider ? (
61
+ <div key={index} className="my-1 border-t border-border" />
62
+ ) : (
63
+ <button
64
+ key={index}
65
+ className={`w-full flex items-center justify-between px-3 py-2 text-sm transition-colors ${
66
+ item.disabled
67
+ ? 'text-muted-foreground cursor-not-allowed'
68
+ : 'hover:bg-muted text-foreground'
69
+ }`}
70
+ onClick={() => {
71
+ if (!item.disabled) {
72
+ item.action();
73
+ onClose();
74
+ }
75
+ }}
76
+ disabled={item.disabled}
77
+ >
78
+ <div className="flex items-center gap-2">
79
+ {item.icon && <span className="w-4 h-4">{item.icon}</span>}
80
+ <span>{item.label}</span>
81
+ </div>
82
+ {item.shortcut && (
83
+ <span className="text-xs text-muted-foreground ml-4">
84
+ {item.shortcut}
85
+ </span>
86
+ )}
87
+ </button>
88
+ )
89
+ )}
90
+ </div>
91
+ );
92
+ };
93
+
94
+ // Hook for context menu
95
+ export const useContextMenu = () => {
96
+ const [contextMenu, setContextMenu] = useState<{
97
+ visible: boolean;
98
+ x: number;
99
+ y: number;
100
+ items: ContextMenuItem[];
101
+ }>({
102
+ visible: false,
103
+ x: 0,
104
+ y: 0,
105
+ items: [],
106
+ });
107
+
108
+ const showContextMenu = (
109
+ e: React.MouseEvent,
110
+ items: ContextMenuItem[]
111
+ ) => {
112
+ e.preventDefault();
113
+ setContextMenu({
114
+ visible: true,
115
+ x: e.clientX,
116
+ y: e.clientY,
117
+ items,
118
+ });
119
+ };
120
+
121
+ const hideContextMenu = () => {
122
+ setContextMenu((prev) => ({ ...prev, visible: false }));
123
+ };
124
+
125
+ return {
126
+ contextMenu,
127
+ showContextMenu,
128
+ hideContextMenu,
129
+ };
130
+ };
131
+
132
+ // Common context menu presets
133
+ export const FileContextMenu = (
134
+ filePath: string,
135
+ onOpen: () => void,
136
+ onCopy: () => void,
137
+ onDelete: () => void
138
+ ): ContextMenuItem[] => [
139
+ { label: 'Open', action: onOpen, shortcut: 'Enter' },
140
+ { label: 'Copy Path', action: onCopy, shortcut: 'Ctrl+C' },
141
+ { divider: true } as ContextMenuItem,
142
+ { label: 'Delete', action: onDelete, shortcut: 'Del' },
143
+ ];
144
+
145
+ export const AgentContextMenu = (
146
+ agentId: string,
147
+ onChat: () => void,
148
+ onPause: () => void,
149
+ onDelete: () => void
150
+ ): ContextMenuItem[] => [
151
+ { label: 'Chat', action: onChat },
152
+ { label: 'Pause', action: onPause },
153
+ { divider: true } as ContextMenuItem,
154
+ { label: 'Delete', action: onDelete },
155
+ ];