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,458 @@
1
+ import { EventEmitter } from 'events';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import log from 'electron-log';
4
+ import fetch from 'node-fetch';
5
+
6
+ export type ResearchStatus = 'pending' | 'running' | 'completed' | 'failed';
7
+
8
+ export type ResearchDepth = 'shallow' | 'medium' | 'deep';
9
+
10
+ export interface ResearchSource {
11
+ url: string;
12
+ title: string;
13
+ content: string;
14
+ relevance: number;
15
+ credibility: number;
16
+ retrievedAt: Date;
17
+ }
18
+
19
+ export interface ResearchFinding {
20
+ id: string;
21
+ category: string;
22
+ statement: string;
23
+ evidence: string[];
24
+ confidence: number;
25
+ sources: string[];
26
+ }
27
+
28
+ export interface ResearchReport {
29
+ id: string;
30
+ query: string;
31
+ depth: ResearchDepth;
32
+ status: ResearchStatus;
33
+ summary: string;
34
+ findings: ResearchFinding[];
35
+ sources: ResearchSource[];
36
+ citations: string[];
37
+ createdAt: Date;
38
+ completedAt?: Date;
39
+ duration?: number;
40
+ metadata: Record<string, unknown>;
41
+ }
42
+
43
+ export interface ResearchConfig {
44
+ maxSources: number;
45
+ maxDepth: number;
46
+ includeCredibilityScore: boolean;
47
+ searchApiKey?: string;
48
+ searchEndpoint?: string;
49
+ }
50
+
51
+ export class DeepResearchManager extends EventEmitter {
52
+ private reports: Map<string, ResearchReport> = new Map();
53
+ private config: ResearchConfig;
54
+ private activeResearch: Map<string, NodeJS.Timeout> = new Map();
55
+
56
+ constructor(config?: Partial<ResearchConfig>) {
57
+ super();
58
+ this.config = {
59
+ maxSources: config?.maxSources || 20,
60
+ maxDepth: config?.maxDepth || 3,
61
+ includeCredibilityScore: config?.includeCredibilityScore ?? true,
62
+ searchApiKey: config?.searchApiKey,
63
+ searchEndpoint: config?.searchEndpoint,
64
+ };
65
+ }
66
+
67
+ configure(config: Partial<ResearchConfig>): void {
68
+ this.config = { ...this.config, ...config };
69
+ log.info('DeepResearchManager configured', {
70
+ maxSources: this.config.maxSources,
71
+ maxDepth: this.config.maxDepth,
72
+ });
73
+ }
74
+
75
+ getConfig(): ResearchConfig {
76
+ return { ...this.config };
77
+ }
78
+
79
+ async startResearch(
80
+ query: string,
81
+ options: {
82
+ depth?: ResearchDepth;
83
+ maxSources?: number;
84
+ metadata?: Record<string, unknown>;
85
+ } = {}
86
+ ): Promise<ResearchReport> {
87
+ const report: ResearchReport = {
88
+ id: uuidv4(),
89
+ query,
90
+ depth: options.depth || 'medium',
91
+ status: 'pending',
92
+ summary: '',
93
+ findings: [],
94
+ sources: [],
95
+ citations: [],
96
+ createdAt: new Date(),
97
+ metadata: options.metadata || {},
98
+ };
99
+
100
+ this.reports.set(report.id, report);
101
+ this.emit('research:started', report);
102
+ log.info(`Starting deep research: ${query}`);
103
+
104
+ this.executeResearch(report, options.maxSources);
105
+
106
+ return report;
107
+ }
108
+
109
+ private async executeResearch(
110
+ report: ResearchReport,
111
+ maxSources?: number
112
+ ): Promise<void> {
113
+ report.status = 'running';
114
+ this.emit('research:running', report);
115
+
116
+ const startTime = Date.now();
117
+ const sources = await this.gatherSources(report.query, report.depth, maxSources);
118
+ report.sources = sources;
119
+ this.emit('sources:gathered', { reportId: report.id, count: sources.length });
120
+
121
+ const findings = await this.analyzeSources(report.query, sources);
122
+ report.findings = findings;
123
+ this.emit('findings:analyzed', { reportId: report.id, count: findings.length });
124
+
125
+ const summary = await this.generateSummary(report.query, findings);
126
+ report.summary = summary;
127
+
128
+ report.citations = sources.map((s) => s.url);
129
+ report.status = 'completed';
130
+ report.completedAt = new Date();
131
+ report.duration = Date.now() - startTime;
132
+
133
+ this.emit('research:completed', report);
134
+ log.info(`Deep research completed: ${report.id} (${report.duration}ms)`);
135
+ }
136
+
137
+ private async gatherSources(
138
+ query: string,
139
+ depth: ResearchDepth,
140
+ maxSources?: number
141
+ ): Promise<ResearchSource[]> {
142
+ const depthMultiplier = {
143
+ shallow: 1,
144
+ medium: 2,
145
+ deep: 3,
146
+ };
147
+
148
+ const numQueries = depthMultiplier[depth];
149
+ const searchQueries = this.generateSearchQueries(query, numQueries);
150
+ const sources: ResearchSource[] = [];
151
+ const seenUrls = new Set<string>();
152
+
153
+ for (const searchQuery of searchQueries) {
154
+ const searchResults = await this.performSearch(searchQuery);
155
+
156
+ for (const result of searchResults) {
157
+ if (sources.length >= (maxSources || this.config.maxSources)) break;
158
+ if (seenUrls.has(result.url)) continue;
159
+
160
+ try {
161
+ const content = await this.fetchPageContent(result.url);
162
+ const relevance = this.calculateRelevance(query, content);
163
+ const credibility = this.calculateCredibility(result.url);
164
+
165
+ if (relevance > 0.3) {
166
+ seenUrls.add(result.url);
167
+ sources.push({
168
+ url: result.url,
169
+ title: result.title,
170
+ content,
171
+ relevance,
172
+ credibility,
173
+ retrievedAt: new Date(),
174
+ });
175
+ }
176
+ } catch (error) {
177
+ log.debug(`Failed to fetch ${result.url}:`, error);
178
+ }
179
+ }
180
+
181
+ if (sources.length >= (maxSources || this.config.maxSources)) break;
182
+ }
183
+
184
+ return sources.sort((a, b) => b.relevance - a.relevance);
185
+ }
186
+
187
+ private generateSearchQueries(query: string, count: number): string[] {
188
+ const baseQuery = query;
189
+ const variations = [
190
+ `${query} overview`,
191
+ `${query} definition`,
192
+ `${query} examples`,
193
+ `${query} best practices`,
194
+ `${query} research`,
195
+ `${query} analysis`,
196
+ ];
197
+
198
+ return [baseQuery, ...variations.slice(0, count - 1)];
199
+ }
200
+
201
+ private async performSearch(query: string): Promise<Array<{ url: string; title: string }>> {
202
+ if (this.config.searchEndpoint) {
203
+ try {
204
+ const response = await fetch(this.config.searchEndpoint, {
205
+ method: 'POST',
206
+ headers: {
207
+ 'Content-Type': 'application/json',
208
+ ...(this.config.searchApiKey && {
209
+ 'Authorization': `Bearer ${this.config.searchApiKey}`,
210
+ }),
211
+ },
212
+ body: JSON.stringify({ query, limit: 10 }),
213
+ });
214
+
215
+ if (response.ok) {
216
+ const data = await response.json() as { results: Array<{ url: string; title: string }> };
217
+ return data.results || [];
218
+ }
219
+ } catch (error) {
220
+ log.error('Search API error:', error);
221
+ }
222
+ }
223
+
224
+ return this.mockSearchResults(query);
225
+ }
226
+
227
+ private mockSearchResults(query: string): Array<{ url: string; title: string }> {
228
+ return [
229
+ {
230
+ url: `https://example.com/wiki/${encodeURIComponent(query)}`,
231
+ title: `${query} - Wikipedia`,
232
+ },
233
+ {
234
+ url: `https://example.com/docs/${encodeURIComponent(query)}`,
235
+ title: `Documentation about ${query}`,
236
+ },
237
+ ];
238
+ }
239
+
240
+ private async fetchPageContent(url: string): Promise<string> {
241
+ try {
242
+ const response = await fetch(url, {
243
+ headers: {
244
+ 'User-Agent': 'CodexLinux/1.0',
245
+ },
246
+ });
247
+
248
+ if (!response.ok) {
249
+ throw new Error(`HTTP ${response.status}`);
250
+ }
251
+
252
+ const html = await response.text();
253
+ return this.extractTextFromHtml(html).substring(0, 5000);
254
+ } catch (error) {
255
+ log.debug(`Failed to fetch content from ${url}:`, error);
256
+ return '';
257
+ }
258
+ }
259
+
260
+ private extractTextFromHtml(html: string): string {
261
+ return html
262
+ .replace(/<script[^>]*>.*?<\/script>/gi, '')
263
+ .replace(/<style[^>]*>.*?<\/style>/gi, '')
264
+ .replace(/<[^>]+>/g, ' ')
265
+ .replace(/\s+/g, ' ')
266
+ .trim();
267
+ }
268
+
269
+ private calculateRelevance(query: string, content: string): number {
270
+ const queryWords = query.toLowerCase().split(/\s+/);
271
+ const contentWords = content.toLowerCase().split(/\s+/);
272
+ const matches = queryWords.filter((w) => contentWords.includes(w)).length;
273
+ return Math.min(1, matches / queryWords.length);
274
+ }
275
+
276
+ private calculateCredibility(url: string): number {
277
+ const credibleDomains = ['wikipedia.org', 'github.com', 'mozilla.org', 'w3.org'];
278
+ const eduDomains = ['.edu', '.gov'];
279
+
280
+ for (const domain of credibleDomains) {
281
+ if (url.includes(domain)) return 0.9;
282
+ }
283
+
284
+ for (const domain of eduDomains) {
285
+ if (url.includes(domain)) return 0.85;
286
+ }
287
+
288
+ return 0.5;
289
+ }
290
+
291
+ private async analyzeSources(
292
+ query: string,
293
+ sources: ResearchSource[]
294
+ ): Promise<ResearchFinding[]> {
295
+ const findings: ResearchFinding[] = [];
296
+ const categories = ['definition', 'usage', 'benefits', 'limitations', 'examples'];
297
+
298
+ for (let i = 0; i < Math.min(5, sources.length); i++) {
299
+ const source = sources[i];
300
+
301
+ const category = categories[i % categories.length];
302
+ const statements = this.extractStatements(source.content, category);
303
+
304
+ statements.forEach((statement) => {
305
+ findings.push({
306
+ id: uuidv4(),
307
+ category,
308
+ statement,
309
+ evidence: [source.url],
310
+ confidence: source.relevance * source.credibility,
311
+ sources: [source.url],
312
+ });
313
+ });
314
+ }
315
+
316
+ return findings;
317
+ }
318
+
319
+ private extractStatements(content: string, category: string): string[] {
320
+ const sentences = content.split(/[.!?]+/).filter((s) => s.trim().length > 20);
321
+ return sentences.slice(0, 3).map((s) => s.trim());
322
+ }
323
+
324
+ private async generateSummary(
325
+ query: string,
326
+ findings: ResearchFinding[]
327
+ ): Promise<string> {
328
+ const topFindings = findings
329
+ .sort((a, b) => b.confidence - a.confidence)
330
+ .slice(0, 5);
331
+
332
+ if (topFindings.length === 0) {
333
+ return `Research on "${query}" did not yield sufficient findings.`;
334
+ }
335
+
336
+ const summary = [
337
+ `# Research Summary: ${query}\n`,
338
+ `Based on analysis of ${findings.length} findings from multiple sources.\n`,
339
+ '## Key Findings:\n',
340
+ ];
341
+
342
+ topFindings.forEach((finding, index) => {
343
+ summary.push(`${index + 1}. ${finding.statement} (${Math.round(finding.confidence * 100)}% confidence)`);
344
+ });
345
+
346
+ summary.push('\n## Conclusion:');
347
+ summary.push('The research indicates multiple perspectives on this topic. Further investigation may be warranted.');
348
+
349
+ return summary.join('\n');
350
+ }
351
+
352
+ getReport(id: string): ResearchReport | undefined {
353
+ return this.reports.get(id);
354
+ }
355
+
356
+ listReports(): ResearchReport[] {
357
+ return Array.from(this.reports.values()).sort(
358
+ (a, b) => b.createdAt.getTime() - a.createdAt.getTime()
359
+ );
360
+ }
361
+
362
+ cancelResearch(id: string): boolean {
363
+ const report = this.reports.get(id);
364
+ if (!report || report.status !== 'running') return false;
365
+
366
+ const timeout = this.activeResearch.get(id);
367
+ if (timeout) {
368
+ clearTimeout(timeout);
369
+ this.activeResearch.delete(id);
370
+ }
371
+
372
+ report.status = 'failed';
373
+ report.completedAt = new Date();
374
+ this.emit('research:cancelled', report);
375
+ log.info(`Research cancelled: ${id}`);
376
+ return true;
377
+ }
378
+
379
+ deleteReport(id: string): boolean {
380
+ const deleted = this.reports.delete(id);
381
+ if (deleted) {
382
+ this.emit('report:deleted', { id });
383
+ }
384
+ return deleted;
385
+ }
386
+
387
+ exportReport(id: string, format: 'json' | 'markdown' = 'json'): string | null {
388
+ const report = this.reports.get(id);
389
+ if (!report) return null;
390
+
391
+ if (format === 'markdown') {
392
+ return this.exportAsMarkdown(report);
393
+ }
394
+
395
+ return JSON.stringify(report, null, 2);
396
+ }
397
+
398
+ private exportAsMarkdown(report: ResearchReport): string {
399
+ let md = `# Research Report: ${report.query}\n\n`;
400
+ md += `**Status:** ${report.status}\n`;
401
+ md += `**Depth:** ${report.depth}\n`;
402
+ md += `**Created:** ${report.createdAt.toISOString()}\n`;
403
+
404
+ if (report.completedAt) {
405
+ md += `**Completed:** ${report.completedAt.toISOString()}\n`;
406
+ md += `**Duration:** ${report.duration}ms\n`;
407
+ }
408
+
409
+ md += `\n---\n\n## Summary\n\n${report.summary}\n\n`;
410
+ md += `## Findings (${report.findings.length})\n\n`;
411
+
412
+ report.findings.forEach((finding, index) => {
413
+ md += `### ${index + 1}. ${finding.category}\n`;
414
+ md += `${finding.statement}\n`;
415
+ md += `**Confidence:** ${Math.round(finding.confidence * 100)}%\n`;
416
+ md += `\n`;
417
+ });
418
+
419
+ md += `## Sources (${report.sources.length})\n\n`;
420
+ report.sources.forEach((source) => {
421
+ md += `- [${source.title}](${source.url})\n`;
422
+ });
423
+
424
+ return md;
425
+ }
426
+
427
+ getStats(): {
428
+ totalReports: number;
429
+ completed: number;
430
+ failed: number;
431
+ averageDuration: number;
432
+ } {
433
+ const reports = this.listReports();
434
+ const completed = reports.filter((r) => r.status === 'completed');
435
+ const failed = reports.filter((r) => r.status === 'failed');
436
+ const durations = completed.map((r) => r.duration || 0);
437
+
438
+ return {
439
+ totalReports: reports.length,
440
+ completed: completed.length,
441
+ failed: failed.length,
442
+ averageDuration:
443
+ durations.length > 0
444
+ ? durations.reduce((a, b) => a + b, 0) / durations.length
445
+ : 0,
446
+ };
447
+ }
448
+
449
+ cleanup(): void {
450
+ this.activeResearch.forEach((timeout) => clearTimeout(timeout));
451
+ this.activeResearch.clear();
452
+ this.reports.clear();
453
+ this.removeAllListeners();
454
+ log.info('DeepResearchManager cleaned up');
455
+ }
456
+ }
457
+
458
+ export default DeepResearchManager;
@@ -0,0 +1,203 @@
1
+ import { EventEmitter } from 'events';
2
+ import log from 'electron-log';
3
+ import { MCPManager } from '../mcp/MCPManager';
4
+
5
+ export interface SearchResult {
6
+ title: string;
7
+ url: string;
8
+ description: string;
9
+ favicon?: string;
10
+ publishedDate?: string;
11
+ }
12
+
13
+ export interface WebSearchOptions {
14
+ maxResults?: number;
15
+ includeImages?: boolean;
16
+ timeRange?: 'day' | 'week' | 'month' | 'year' | 'all';
17
+ safeSearch?: boolean;
18
+ }
19
+
20
+ export class WebSearchIntegration extends EventEmitter {
21
+ private mcpManager: MCPManager;
22
+ private braveServerId: string = 'brave-search';
23
+ private isEnabled: boolean = false;
24
+
25
+ constructor(mcpManager: MCPManager) {
26
+ super();
27
+ this.mcpManager = mcpManager;
28
+ }
29
+
30
+ async initialize(): Promise<void> {
31
+ // Check if Brave API key is configured
32
+ const braveApiKey = process.env.BRAVE_API_KEY || '';
33
+
34
+ if (braveApiKey) {
35
+ // Enable the Brave Search MCP server
36
+ await this.enableBraveSearch(braveApiKey);
37
+ } else {
38
+ log.info('Web Search: Brave API key not configured, search disabled');
39
+ }
40
+ }
41
+
42
+ private async enableBraveSearch(apiKey: string): Promise<void> {
43
+ try {
44
+ // Start the Brave Search MCP server
45
+ await this.mcpManager.startServer(this.braveServerId);
46
+ this.isEnabled = true;
47
+
48
+ log.info('Web Search: Brave Search MCP server enabled');
49
+ this.emit('enabled');
50
+ } catch (error) {
51
+ log.error('Web Search: Failed to enable Brave Search:', error);
52
+ this.emit('error', { type: 'enable', error });
53
+ }
54
+ }
55
+
56
+ async search(query: string, options: WebSearchOptions = {}): Promise<SearchResult[]> {
57
+ if (!this.isEnabled) {
58
+ throw new Error('Web search is not enabled. Configure BRAVE_API_KEY to enable search.');
59
+ }
60
+
61
+ const maxResults = options.maxResults || 10;
62
+
63
+ try {
64
+ log.info(`Web Search: Searching for "${query}"`);
65
+
66
+ const results = await this.mcpManager.callTool(
67
+ this.braveServerId,
68
+ 'brave_web_search',
69
+ {
70
+ query,
71
+ count: maxResults,
72
+ offset: 0
73
+ }
74
+ );
75
+
76
+ // Parse and format results
77
+ const searchResults: SearchResult[] = this.parseSearchResults(results);
78
+
79
+ log.info(`Web Search: Found ${searchResults.length} results`);
80
+ this.emit('search:completed', { query, results: searchResults });
81
+
82
+ return searchResults;
83
+ } catch (error) {
84
+ log.error('Web Search: Search failed:', error);
85
+ this.emit('search:error', { query, error });
86
+ throw error;
87
+ }
88
+ }
89
+
90
+ private parseSearchResults(rawResults: any): SearchResult[] {
91
+ if (!rawResults || !Array.isArray(rawResults.web?.results)) {
92
+ return [];
93
+ }
94
+
95
+ return rawResults.web.results.map((result: any) => ({
96
+ title: result.title || '',
97
+ url: result.url || '',
98
+ description: result.description || '',
99
+ favicon: result.profile?.img,
100
+ publishedDate: result.age
101
+ }));
102
+ }
103
+
104
+ async searchWithContext(
105
+ query: string,
106
+ context: string,
107
+ options: WebSearchOptions = {}
108
+ ): Promise<{ results: SearchResult[]; summary: string }> {
109
+ // Enhance query with context
110
+ const enhancedQuery = `${query} ${context}`.trim();
111
+
112
+ const results = await this.search(enhancedQuery, options);
113
+
114
+ // Generate summary of results
115
+ const summary = this.generateSummary(results, query);
116
+
117
+ return { results, summary };
118
+ }
119
+
120
+ private generateSummary(results: SearchResult[], query: string): string {
121
+ if (results.length === 0) {
122
+ return `No results found for "${query}".`;
123
+ }
124
+
125
+ const topResults = results.slice(0, 3);
126
+ let summary = `Found ${results.length} results for "${query}".\n\nTop results:\n`;
127
+
128
+ topResults.forEach((result, index) => {
129
+ summary += `${index + 1}. ${result.title}\n ${result.url}\n ${result.description.slice(0, 150)}...\n\n`;
130
+ });
131
+
132
+ return summary;
133
+ }
134
+
135
+ formatResultsForAgent(results: SearchResult[]): string {
136
+ if (results.length === 0) {
137
+ return 'No search results found.';
138
+ }
139
+
140
+ let formatted = 'Search Results:\n\n';
141
+
142
+ results.forEach((result, index) => {
143
+ formatted += `[${index + 1}] ${result.title}\n`;
144
+ formatted += `URL: ${result.url}\n`;
145
+ formatted += `Description: ${result.description}\n`;
146
+ if (result.publishedDate) {
147
+ formatted += `Published: ${result.publishedDate}\n`;
148
+ }
149
+ formatted += '\n';
150
+ });
151
+
152
+ return formatted;
153
+ }
154
+
155
+ async performSearchCommand(
156
+ query: string,
157
+ agentId: string,
158
+ options: WebSearchOptions = {}
159
+ ): Promise<{ results: SearchResult[]; formattedResults: string }> {
160
+ const results = await this.search(query, options);
161
+ const formattedResults = this.formatResultsForAgent(results);
162
+
163
+ this.emit('search:command', {
164
+ agentId,
165
+ query,
166
+ results,
167
+ formattedResults
168
+ });
169
+
170
+ return { results, formattedResults };
171
+ }
172
+
173
+ isSearchEnabled(): boolean {
174
+ return this.isEnabled;
175
+ }
176
+
177
+ getStatus(): {
178
+ enabled: boolean;
179
+ serverId: string;
180
+ serverStatus: string;
181
+ } {
182
+ return {
183
+ enabled: this.isEnabled,
184
+ serverId: this.braveServerId,
185
+ serverStatus: this.mcpManager.getServerStatus(this.braveServerId)
186
+ };
187
+ }
188
+
189
+ async disable(): Promise<void> {
190
+ if (this.isEnabled) {
191
+ await this.mcpManager.stopServer(this.braveServerId);
192
+ this.isEnabled = false;
193
+ log.info('Web Search: Disabled');
194
+ this.emit('disabled');
195
+ }
196
+ }
197
+
198
+ cleanup(): void {
199
+ this.removeAllListeners();
200
+ }
201
+ }
202
+
203
+ export default WebSearchIntegration;