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,710 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.mcpManager = exports.MCPManager = void 0;
40
+ const events_1 = require("events");
41
+ const child_process_1 = require("child_process");
42
+ const http = __importStar(require("http"));
43
+ const url = __importStar(require("url"));
44
+ const electron_log_1 = __importDefault(require("electron-log"));
45
+ const node_fetch_1 = __importDefault(require("node-fetch"));
46
+ const MCPRegistry_1 = require("./MCPRegistry");
47
+ const MCPConfigurationManager_1 = require("./MCPConfigurationManager");
48
+ class MCPManager extends events_1.EventEmitter {
49
+ servers = new Map();
50
+ registry;
51
+ configManager;
52
+ messageId = 0;
53
+ pendingRequests = new Map();
54
+ toolSearchCache = new Map();
55
+ toolSearchTTL = 5 * 60 * 1000;
56
+ constructor() {
57
+ super();
58
+ this.registry = new MCPRegistry_1.MCPRegistry();
59
+ this.configManager = new MCPConfigurationManager_1.MCPConfigurationManager();
60
+ }
61
+ async initialize(projectPath) {
62
+ await this.registry.initialize();
63
+ await this.configManager.initialize(projectPath);
64
+ // Load configured servers
65
+ await this.loadConfiguredServers();
66
+ electron_log_1.default.info('MCP Manager initialized with registry and config support');
67
+ }
68
+ async loadConfiguredServers() {
69
+ const servers = this.configManager.getAllServers();
70
+ for (const [id, config] of servers) {
71
+ this.servers.set(id, {
72
+ config,
73
+ process: null,
74
+ tools: [],
75
+ resources: [],
76
+ prompts: [],
77
+ status: 'stopped',
78
+ toolsLoaded: false,
79
+ toolsByCategory: new Map(),
80
+ });
81
+ // Auto-start enabled servers
82
+ if (!config.disabled) {
83
+ try {
84
+ await this.startServer(id);
85
+ }
86
+ catch (error) {
87
+ electron_log_1.default.warn(`Failed to auto-start MCP server ${id}:`, error);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ async addServer(config) {
93
+ // Save to configuration
94
+ await this.configManager.addServer(config);
95
+ // Register in memory
96
+ this.servers.set(config.id, {
97
+ config,
98
+ process: null,
99
+ tools: [],
100
+ resources: [],
101
+ prompts: [],
102
+ status: 'stopped',
103
+ toolsLoaded: false,
104
+ toolsByCategory: new Map(),
105
+ });
106
+ this.emit('server:added', config);
107
+ electron_log_1.default.info(`Registered MCP server: ${config.name} (${config.scope})`);
108
+ }
109
+ async removeServer(serverId) {
110
+ const server = this.servers.get(serverId);
111
+ if (!server)
112
+ return;
113
+ // Stop if running
114
+ if (server.status === 'running') {
115
+ await this.stopServer(serverId);
116
+ }
117
+ // Remove from config
118
+ await this.configManager.removeServer(serverId, server.config.scope);
119
+ // Remove from memory
120
+ this.servers.delete(serverId);
121
+ this.emit('server:removed', serverId);
122
+ electron_log_1.default.info(`Removed MCP server: ${serverId}`);
123
+ }
124
+ async startServer(serverId) {
125
+ const server = this.servers.get(serverId);
126
+ if (!server)
127
+ throw new Error(`Server ${serverId} not found`);
128
+ if (server.config.disabled)
129
+ throw new Error(`Server ${serverId} is disabled`);
130
+ if (server.status === 'running')
131
+ return;
132
+ server.status = 'starting';
133
+ this.emit('server:starting', serverId);
134
+ try {
135
+ if (server.config.transport === 'stdio' && server.config.command) {
136
+ await this.startStdioServer(server);
137
+ }
138
+ else if ((server.config.transport === 'http' || server.config.transport === 'streamable-http') && server.config.url) {
139
+ await this.startHttpServer(server);
140
+ }
141
+ else if (server.config.transport === 'sse' && server.config.url) {
142
+ await this.startSseServer(server);
143
+ }
144
+ else {
145
+ throw new Error(`Unsupported transport type: ${server.config.transport}`);
146
+ }
147
+ // Initialize connection
148
+ await this.initializeConnection(serverId);
149
+ // Fetch tools, resources, and prompts
150
+ await this.discoverCapabilities(serverId);
151
+ server.status = 'running';
152
+ this.emit('server:started', serverId);
153
+ electron_log_1.default.info(`MCP server started: ${server.config.name}`);
154
+ }
155
+ catch (error) {
156
+ server.status = 'error';
157
+ server.lastError = error.message;
158
+ this.emit('server:error', { serverId, error });
159
+ throw error;
160
+ }
161
+ }
162
+ async startStdioServer(server) {
163
+ const { command, args, env } = server.config;
164
+ server.process = (0, child_process_1.spawn)(command, args || [], {
165
+ env: { ...process.env, ...env },
166
+ stdio: ['pipe', 'pipe', 'pipe'],
167
+ });
168
+ // Handle stdout
169
+ server.process.stdout?.on('data', (data) => {
170
+ this.handleServerOutput(server.config.id, data);
171
+ });
172
+ // Handle stderr
173
+ server.process.stderr?.on('data', (data) => {
174
+ electron_log_1.default.error(`MCP server ${server.config.id} stderr:`, data.toString());
175
+ });
176
+ // Handle exit
177
+ server.process.on('exit', (code) => {
178
+ server.status = code === 0 ? 'stopped' : 'error';
179
+ this.emit('server:stopped', { serverId: server.config.id, code });
180
+ });
181
+ }
182
+ async startHttpServer(server) {
183
+ // For HTTP servers, we just verify connectivity
184
+ const response = await (0, node_fetch_1.default)(`${server.config.url}/health`, {
185
+ method: 'GET',
186
+ headers: server.config.headers,
187
+ }).catch(() => null);
188
+ if (!response || !response.ok) {
189
+ electron_log_1.default.warn(`HTTP MCP server ${server.config.id} health check failed, will retry on use`);
190
+ }
191
+ }
192
+ async startSseServer(server) {
193
+ // SSE servers establish connection on first use
194
+ electron_log_1.default.info(`SSE MCP server ${server.config.id} registered, connection on first use`);
195
+ }
196
+ async initializeConnection(serverId) {
197
+ const response = await this.sendMessage(serverId, {
198
+ jsonrpc: '2.0',
199
+ id: this.getNextMessageId(),
200
+ method: 'initialize',
201
+ params: {
202
+ protocolVersion: '2024-11-05',
203
+ capabilities: {
204
+ tools: {},
205
+ resources: {},
206
+ prompts: {},
207
+ logging: {},
208
+ },
209
+ clientInfo: {
210
+ name: 'codex-linux',
211
+ version: '1.0.0',
212
+ },
213
+ },
214
+ });
215
+ if (response.error) {
216
+ throw new Error(`Initialize failed: ${response.error.message}`);
217
+ }
218
+ // Send initialized notification
219
+ await this.sendNotification(serverId, 'initialized', {});
220
+ }
221
+ async discoverCapabilities(serverId) {
222
+ const server = this.servers.get(serverId);
223
+ if (!server)
224
+ return;
225
+ // Discover tools
226
+ try {
227
+ const toolsResponse = await this.sendMessage(serverId, {
228
+ jsonrpc: '2.0',
229
+ id: this.getNextMessageId(),
230
+ method: 'tools/list',
231
+ params: {},
232
+ });
233
+ if (toolsResponse.result?.tools) {
234
+ server.tools = toolsResponse.result.tools.map((t) => ({
235
+ ...t,
236
+ serverId,
237
+ }));
238
+ // Build category index for lazy loading
239
+ this.buildToolsCategoryIndex(server);
240
+ server.toolsLoaded = true;
241
+ }
242
+ }
243
+ catch (error) {
244
+ electron_log_1.default.warn(`Failed to discover tools for ${serverId}:`, error);
245
+ }
246
+ // Discover resources
247
+ try {
248
+ const resourcesResponse = await this.sendMessage(serverId, {
249
+ jsonrpc: '2.0',
250
+ id: this.getNextMessageId(),
251
+ method: 'resources/list',
252
+ params: {},
253
+ });
254
+ if (resourcesResponse.result?.resources) {
255
+ server.resources = resourcesResponse.result.resources.map((r) => ({
256
+ ...r,
257
+ serverId,
258
+ }));
259
+ }
260
+ }
261
+ catch (error) {
262
+ electron_log_1.default.warn(`Failed to discover resources for ${serverId}:`, error);
263
+ }
264
+ // Discover prompts
265
+ try {
266
+ const promptsResponse = await this.sendMessage(serverId, {
267
+ jsonrpc: '2.0',
268
+ id: this.getNextMessageId(),
269
+ method: 'prompts/list',
270
+ params: {},
271
+ });
272
+ if (promptsResponse.result?.prompts) {
273
+ server.prompts = promptsResponse.result.prompts.map((p) => ({
274
+ ...p,
275
+ serverId,
276
+ }));
277
+ }
278
+ }
279
+ catch (error) {
280
+ electron_log_1.default.warn(`Failed to discover prompts for ${serverId}:`, error);
281
+ }
282
+ this.emit('server:capabilities', {
283
+ serverId,
284
+ tools: server.tools,
285
+ resources: server.resources,
286
+ prompts: server.prompts,
287
+ });
288
+ }
289
+ async stopServer(serverId) {
290
+ const server = this.servers.get(serverId);
291
+ if (!server)
292
+ return;
293
+ if (server.process) {
294
+ server.process.kill();
295
+ server.process = null;
296
+ }
297
+ server.status = 'stopped';
298
+ server.tools = [];
299
+ server.resources = [];
300
+ server.prompts = [];
301
+ this.emit('server:stopped', serverId);
302
+ electron_log_1.default.info(`MCP server stopped: ${server.config.name}`);
303
+ }
304
+ async sendMessage(serverId, message) {
305
+ const server = this.servers.get(serverId);
306
+ if (!server)
307
+ throw new Error(`Server ${serverId} not found`);
308
+ if (server.config.transport === 'stdio') {
309
+ return this.sendStdioMessage(server, message);
310
+ }
311
+ else {
312
+ return this.sendHttpMessage(server, message);
313
+ }
314
+ }
315
+ async sendStdioMessage(server, message) {
316
+ if (!server.process?.stdin) {
317
+ throw new Error(`Server ${server.config.id} not running`);
318
+ }
319
+ return new Promise((resolve, reject) => {
320
+ const timeout = setTimeout(() => {
321
+ this.pendingRequests.delete(message.id);
322
+ reject(new Error('MCP request timeout'));
323
+ }, 30000);
324
+ this.pendingRequests.set(message.id, { resolve, reject, timeout });
325
+ server.process.stdin.write(JSON.stringify(message) + '\n');
326
+ });
327
+ }
328
+ async sendHttpMessage(server, message) {
329
+ const response = await (0, node_fetch_1.default)(`${server.config.url}/mcp`, {
330
+ method: 'POST',
331
+ headers: {
332
+ 'Content-Type': 'application/json',
333
+ ...server.config.headers,
334
+ },
335
+ body: JSON.stringify(message),
336
+ });
337
+ if (!response.ok) {
338
+ throw new Error(`HTTP error: ${response.status}`);
339
+ }
340
+ return response.json();
341
+ }
342
+ async sendNotification(serverId, method, params) {
343
+ await this.sendMessage(serverId, {
344
+ jsonrpc: '2.0',
345
+ method,
346
+ params,
347
+ });
348
+ }
349
+ handleServerOutput(serverId, data) {
350
+ const messages = data.toString().trim().split('\n');
351
+ for (const messageStr of messages) {
352
+ if (!messageStr)
353
+ continue;
354
+ try {
355
+ const message = JSON.parse(messageStr);
356
+ // Handle responses
357
+ if (message.id !== undefined && this.pendingRequests.has(message.id)) {
358
+ const pending = this.pendingRequests.get(message.id);
359
+ clearTimeout(pending.timeout);
360
+ this.pendingRequests.delete(message.id);
361
+ if (message.error) {
362
+ pending.reject(new Error(message.error.message));
363
+ }
364
+ else {
365
+ pending.resolve(message);
366
+ }
367
+ }
368
+ // Handle notifications
369
+ if (message.method) {
370
+ this.handleNotification(serverId, message);
371
+ }
372
+ }
373
+ catch (error) {
374
+ electron_log_1.default.debug(`MCP server ${serverId} output:`, messageStr);
375
+ }
376
+ }
377
+ }
378
+ handleNotification(serverId, message) {
379
+ const server = this.servers.get(serverId);
380
+ if (!server)
381
+ return;
382
+ switch (message.method) {
383
+ case 'notifications/tools/list_changed':
384
+ this.discoverCapabilities(serverId);
385
+ break;
386
+ case 'notifications/resources/list_changed':
387
+ this.discoverCapabilities(serverId);
388
+ break;
389
+ case 'notifications/prompts/list_changed':
390
+ this.discoverCapabilities(serverId);
391
+ break;
392
+ case 'notifications/message':
393
+ electron_log_1.default.info(`MCP server ${serverId}:`, message.params);
394
+ break;
395
+ }
396
+ }
397
+ async callTool(serverId, toolName, args) {
398
+ const response = await this.sendMessage(serverId, {
399
+ jsonrpc: '2.0',
400
+ id: this.getNextMessageId(),
401
+ method: 'tools/call',
402
+ params: {
403
+ name: toolName,
404
+ arguments: args,
405
+ },
406
+ });
407
+ if (response.error) {
408
+ throw new Error(response.error.message);
409
+ }
410
+ return response.result;
411
+ }
412
+ async readResource(serverId, uri) {
413
+ const response = await this.sendMessage(serverId, {
414
+ jsonrpc: '2.0',
415
+ id: this.getNextMessageId(),
416
+ method: 'resources/read',
417
+ params: { uri },
418
+ });
419
+ if (response.error) {
420
+ throw new Error(response.error.message);
421
+ }
422
+ return response.result;
423
+ }
424
+ async getPrompt(serverId, promptName, args) {
425
+ const response = await this.sendMessage(serverId, {
426
+ jsonrpc: '2.0',
427
+ id: this.getNextMessageId(),
428
+ method: 'prompts/get',
429
+ params: {
430
+ name: promptName,
431
+ arguments: args,
432
+ },
433
+ });
434
+ if (response.error) {
435
+ throw new Error(response.error.message);
436
+ }
437
+ return response.result;
438
+ }
439
+ // Tool Search Optimization
440
+ async searchTools(query) {
441
+ const result = {
442
+ query,
443
+ tools: [],
444
+ resources: [],
445
+ prompts: [],
446
+ };
447
+ const lowerQuery = query.toLowerCase();
448
+ for (const server of this.servers.values()) {
449
+ if (server.status !== 'running')
450
+ continue;
451
+ // Search tools
452
+ for (const tool of server.tools) {
453
+ if (tool.name.toLowerCase().includes(lowerQuery) ||
454
+ tool.description?.toLowerCase().includes(lowerQuery)) {
455
+ result.tools.push(tool);
456
+ }
457
+ }
458
+ // Search resources
459
+ for (const resource of server.resources) {
460
+ if (resource.name.toLowerCase().includes(lowerQuery) ||
461
+ resource.uri.toLowerCase().includes(lowerQuery)) {
462
+ result.resources.push(resource);
463
+ }
464
+ }
465
+ // Search prompts
466
+ for (const prompt of server.prompts) {
467
+ if (prompt.name.toLowerCase().includes(lowerQuery) ||
468
+ prompt.description?.toLowerCase().includes(lowerQuery)) {
469
+ result.prompts.push(prompt);
470
+ }
471
+ }
472
+ }
473
+ return result;
474
+ }
475
+ // OAuth Authentication
476
+ async authenticateServer(serverId) {
477
+ const server = this.servers.get(serverId);
478
+ if (!server?.config.oauth) {
479
+ return false;
480
+ }
481
+ const { clientId, callbackPort = 8080 } = server.config.oauth;
482
+ // Start local HTTP server for OAuth callback
483
+ const redirectUri = `http://localhost:${callbackPort}/callback`;
484
+ return new Promise((resolve, reject) => {
485
+ const httpServer = http.createServer(async (req, res) => {
486
+ const parsedUrl = url.parse(req.url || '', true);
487
+ if (parsedUrl.pathname === '/callback') {
488
+ const code = parsedUrl.query.code;
489
+ if (code) {
490
+ try {
491
+ // Exchange code for token (implementation depends on OAuth provider)
492
+ // This is a simplified version
493
+ const token = {
494
+ serverId,
495
+ accessToken: code, // In real implementation, exchange code
496
+ expiresAt: new Date(Date.now() + 3600 * 1000), // 1 hour
497
+ };
498
+ server.authToken = token;
499
+ res.writeHead(200, { 'Content-Type': 'text/html' });
500
+ res.end('<h1>Authentication successful!</h1><p>You can close this window.</p>');
501
+ httpServer.close();
502
+ resolve(true);
503
+ }
504
+ catch (error) {
505
+ res.writeHead(500, { 'Content-Type': 'text/html' });
506
+ res.end('<h1>Authentication failed</h1>');
507
+ httpServer.close();
508
+ reject(error);
509
+ }
510
+ }
511
+ else {
512
+ res.writeHead(400, { 'Content-Type': 'text/html' });
513
+ res.end('<h1>Authentication failed</h1><p>No authorization code received.</p>');
514
+ httpServer.close();
515
+ resolve(false);
516
+ }
517
+ }
518
+ });
519
+ httpServer.listen(callbackPort, () => {
520
+ electron_log_1.default.info(`OAuth callback server started on port ${callbackPort}`);
521
+ // Open browser for OAuth (would need electron shell.openExternal)
522
+ const authUrl = `${server.config.url}/auth?client_id=${clientId}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code`;
523
+ electron_log_1.default.info(`Please visit: ${authUrl}`);
524
+ });
525
+ // Timeout after 5 minutes
526
+ setTimeout(() => {
527
+ httpServer.close();
528
+ reject(new Error('OAuth timeout'));
529
+ }, 5 * 60 * 1000);
530
+ });
531
+ }
532
+ getAllTools() {
533
+ const tools = [];
534
+ for (const server of this.servers.values()) {
535
+ if (server.status === 'running') {
536
+ tools.push(...server.tools);
537
+ }
538
+ }
539
+ return tools;
540
+ }
541
+ getAllResources() {
542
+ const resources = [];
543
+ for (const server of this.servers.values()) {
544
+ if (server.status === 'running') {
545
+ resources.push(...server.resources);
546
+ }
547
+ }
548
+ return resources;
549
+ }
550
+ getAllPrompts() {
551
+ const prompts = [];
552
+ for (const server of this.servers.values()) {
553
+ if (server.status === 'running') {
554
+ prompts.push(...server.prompts);
555
+ }
556
+ }
557
+ return prompts;
558
+ }
559
+ getServerStatus(serverId) {
560
+ return this.servers.get(serverId)?.status || 'stopped';
561
+ }
562
+ getServers() {
563
+ return Array.from(this.servers.values()).map(s => ({
564
+ id: s.config.id,
565
+ name: s.config.name,
566
+ status: s.status,
567
+ disabled: s.config.disabled,
568
+ scope: s.config.scope,
569
+ transport: s.config.transport,
570
+ tools: s.tools.length,
571
+ resources: s.resources.length,
572
+ }));
573
+ }
574
+ getRegistry() {
575
+ return this.registry;
576
+ }
577
+ getConfigManager() {
578
+ return this.configManager;
579
+ }
580
+ // Lazy Loading - Build category index for tools
581
+ buildToolsCategoryIndex(server) {
582
+ server.toolsByCategory.clear();
583
+ for (const tool of server.tools) {
584
+ const category = this.categorizeTool(tool);
585
+ const existing = server.toolsByCategory.get(category) || [];
586
+ existing.push(tool);
587
+ server.toolsByCategory.set(category, existing);
588
+ }
589
+ }
590
+ categorizeTool(tool) {
591
+ const name = tool.name.toLowerCase();
592
+ const inputSchema = JSON.stringify(tool.inputSchema).toLowerCase();
593
+ if (name.includes('file') || name.includes('read') || name.includes('write') || inputSchema.includes('path')) {
594
+ return 'filesystem';
595
+ }
596
+ if (name.includes('git') || name.includes('branch') || name.includes('commit')) {
597
+ return 'git';
598
+ }
599
+ if (name.includes('search') || name.includes('find') || name.includes('query')) {
600
+ return 'search';
601
+ }
602
+ if (name.includes('db') || name.includes('database') || name.includes('sql')) {
603
+ return 'database';
604
+ }
605
+ if (name.includes('api') || name.includes('http') || name.includes('fetch')) {
606
+ return 'api';
607
+ }
608
+ if (name.includes('run') || name.includes('execute') || name.includes('command')) {
609
+ return 'execution';
610
+ }
611
+ return 'other';
612
+ }
613
+ // Get tools by category (lazy loaded)
614
+ async getToolsByCategory(serverId, category) {
615
+ const server = this.servers.get(serverId);
616
+ if (!server)
617
+ return [];
618
+ if (!server.toolsLoaded) {
619
+ await this.discoverCapabilities(serverId);
620
+ }
621
+ return server.toolsByCategory.get(category) || [];
622
+ }
623
+ // Smart tool retrieval - only loads tools when needed
624
+ async getRelevantTools(serverId, context) {
625
+ const server = this.servers.get(serverId);
626
+ if (!server)
627
+ return [];
628
+ if (!server.toolsLoaded) {
629
+ await this.discoverCapabilities(serverId);
630
+ }
631
+ const contextLower = context.toLowerCase();
632
+ const relevantTools = [];
633
+ for (const tool of server.tools) {
634
+ const name = tool.name.toLowerCase();
635
+ const desc = (tool.description || '').toLowerCase();
636
+ // Score tool relevance
637
+ let score = 0;
638
+ if (name.includes(contextLower) || desc.includes(contextLower)) {
639
+ score = 3;
640
+ }
641
+ else if (this.categorizeTool(tool) === this.inferCategoryFromContext(contextLower)) {
642
+ score = 2;
643
+ }
644
+ if (score > 0) {
645
+ relevantTools.push(tool);
646
+ }
647
+ }
648
+ // If no specific tools found, return all (for broader context)
649
+ return relevantTools.length > 0 ? relevantTools : server.tools.slice(0, 10);
650
+ }
651
+ inferCategoryFromContext(context) {
652
+ if (context.includes('file') || context.includes('folder') || context.includes('directory')) {
653
+ return 'filesystem';
654
+ }
655
+ if (context.includes('git') || context.includes('commit') || context.includes('branch')) {
656
+ return 'git';
657
+ }
658
+ if (context.includes('search') || context.includes('find')) {
659
+ return 'search';
660
+ }
661
+ if (context.includes('database') || context.includes('query') || context.includes('sql')) {
662
+ return 'database';
663
+ }
664
+ return 'other';
665
+ }
666
+ // Cached search with TTL
667
+ async searchToolsCached(query) {
668
+ const cached = this.toolSearchCache.get(query);
669
+ if (cached && Date.now() - cached.timestamp < this.toolSearchTTL) {
670
+ return {
671
+ query,
672
+ tools: cached.tools,
673
+ resources: [],
674
+ prompts: [],
675
+ };
676
+ }
677
+ const result = await this.searchTools(query);
678
+ this.toolSearchCache.set(query, {
679
+ tools: result.tools,
680
+ timestamp: Date.now(),
681
+ });
682
+ return result;
683
+ }
684
+ // Clear tool cache
685
+ clearToolCache() {
686
+ this.toolSearchCache.clear();
687
+ }
688
+ // Get tools count for UI
689
+ getToolsCount() {
690
+ let count = 0;
691
+ for (const server of this.servers.values()) {
692
+ if (server.status === 'running') {
693
+ count += server.tools.length;
694
+ }
695
+ }
696
+ return count;
697
+ }
698
+ getNextMessageId() {
699
+ return ++this.messageId;
700
+ }
701
+ async cleanup() {
702
+ for (const [serverId] of this.servers) {
703
+ await this.stopServer(serverId);
704
+ }
705
+ this.pendingRequests.clear();
706
+ }
707
+ }
708
+ exports.MCPManager = MCPManager;
709
+ exports.mcpManager = new MCPManager();
710
+ //# sourceMappingURL=MCPManager.js.map