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,269 @@
1
+ import { EventEmitter } from 'events';
2
+ import log from 'electron-log';
3
+ import {
4
+ AgentDefinition,
5
+ AgentGuardrail,
6
+ AgentExecutionContext,
7
+ AgentHandler,
8
+ Agent,
9
+ AgentMessage
10
+ } from '../../shared/types';
11
+ import { AIProviderManager } from '../providers/AIProviderManager';
12
+
13
+ export class AgentSDK extends EventEmitter {
14
+ private handlers: Map<string, AgentHandler> = new Map();
15
+ private guardrails: AgentGuardrail[] = [];
16
+ private providerManager: AIProviderManager;
17
+ private agentDefinitions: Map<string, AgentDefinition> = new Map();
18
+
19
+ constructor(providerManager: AIProviderManager) {
20
+ super();
21
+ this.providerManager = providerManager;
22
+ }
23
+
24
+ // Register a custom agent definition
25
+ registerAgent(definition: AgentDefinition): void {
26
+ this.agentDefinitions.set(definition.id, definition);
27
+ this.emit('agent:registered', definition);
28
+ log.info(`Registered agent: ${definition.name} (${definition.id})`);
29
+ }
30
+
31
+ // Unregister an agent
32
+ unregisterAgent(agentId: string): boolean {
33
+ const deleted = this.agentDefinitions.delete(agentId);
34
+ if (deleted) {
35
+ this.emit('agent:unregistered', agentId);
36
+ }
37
+ return deleted;
38
+ }
39
+
40
+ // Get all registered agents
41
+ getAgents(): AgentDefinition[] {
42
+ return Array.from(this.agentDefinitions.values());
43
+ }
44
+
45
+ // Get agent by ID
46
+ getAgent(agentId: string): AgentDefinition | undefined {
47
+ return this.agentDefinitions.get(agentId);
48
+ }
49
+
50
+ // Register a custom handler (tool)
51
+ registerHandler(handler: AgentHandler): void {
52
+ this.handlers.set(handler.name, handler);
53
+ this.emit('handler:registered', handler);
54
+ log.info(`Registered handler: ${handler.name}`);
55
+ }
56
+
57
+ // Unregister a handler
58
+ unregisterHandler(name: string): boolean {
59
+ const deleted = this.handlers.delete(name);
60
+ if (deleted) {
61
+ this.emit('handler:unregistered', name);
62
+ }
63
+ return deleted;
64
+ }
65
+
66
+ // Get all handlers
67
+ getHandlers(): AgentHandler[] {
68
+ return Array.from(this.handlers.values());
69
+ }
70
+
71
+ // Add guardrail
72
+ addGuardrail(guardrail: AgentGuardrail): void {
73
+ this.guardrails.push(guardrail);
74
+ this.emit('guardrail:added', guardrail);
75
+ log.info(`Added guardrail: ${guardrail.type}`);
76
+ }
77
+
78
+ // Remove guardrail
79
+ removeGuardrail(type: string): boolean {
80
+ const index = this.guardrails.findIndex(g => g.type === type);
81
+ if (index > -1) {
82
+ const removed = this.guardrails.splice(index, 1)[0];
83
+ this.emit('guardrail:removed', removed);
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+
89
+ // Execute agent with custom handler
90
+ async executeWithHandler(
91
+ agent: Agent,
92
+ handlerName: string,
93
+ params: Record<string, any>
94
+ ): Promise<any> {
95
+ const handler = this.handlers.get(handlerName);
96
+ if (!handler) {
97
+ throw new Error(`Handler not found: ${handlerName}`);
98
+ }
99
+
100
+ const context: AgentExecutionContext = {
101
+ agentId: agent.id,
102
+ sessionId: agent.id,
103
+ messages: agent.messages,
104
+ metadata: agent.metadata,
105
+ };
106
+
107
+ // Apply input guardrails
108
+ for (const guardrail of this.guardrails) {
109
+ if (guardrail.type === 'input_filter' && guardrail.enabled) {
110
+ const filtered = await this.applyGuardrail(guardrail, params);
111
+ params = filtered;
112
+ }
113
+ }
114
+
115
+ // Execute handler
116
+ const result = await handler.execute(context, params);
117
+
118
+ // Apply output guardrails
119
+ for (const guardrail of this.guardrails) {
120
+ if (guardrail.type === 'output_filter' && guardrail.enabled) {
121
+ const filtered = await this.applyGuardrail(guardrail, result);
122
+ return filtered;
123
+ }
124
+ }
125
+
126
+ return result;
127
+ }
128
+
129
+ private async applyGuardrail(guardrail: AgentGuardrail, data: any): Promise<any> {
130
+ switch (guardrail.type) {
131
+ case 'input_filter':
132
+ // Apply input filtering
133
+ return this.filterInput(data, guardrail.config);
134
+ case 'output_filter':
135
+ // Apply output filtering
136
+ return this.filterOutput(data, guardrail.config);
137
+ case 'tool_restriction':
138
+ // Check tool permissions
139
+ this.checkToolRestriction(data, guardrail.config);
140
+ return data;
141
+ default:
142
+ return data;
143
+ }
144
+ }
145
+
146
+ private filterInput(data: any, config: Record<string, any>): any {
147
+ // Simple input filtering - in production would be more sophisticated
148
+ const blockedPatterns = config.blockedPatterns || [];
149
+
150
+ if (typeof data === 'string') {
151
+ for (const pattern of blockedPatterns) {
152
+ if (data.includes(pattern)) {
153
+ throw new Error(`Input blocked: contains "${pattern}"`);
154
+ }
155
+ }
156
+ }
157
+
158
+ return data;
159
+ }
160
+
161
+ private filterOutput(data: any, config: Record<string, any>): any {
162
+ // Simple output filtering
163
+ const requiredPatterns = config.requiredPatterns || [];
164
+ const blockedPatterns = config.blockedPatterns || [];
165
+
166
+ if (typeof data === 'string') {
167
+ for (const pattern of blockedPatterns) {
168
+ if (data.includes(pattern)) {
169
+ data = data.replace(pattern, '[BLOCKED]');
170
+ }
171
+ }
172
+
173
+ if (requiredPatterns.length > 0) {
174
+ const hasRequired = requiredPatterns.some(p => data.includes(p));
175
+ if (!hasRequired) {
176
+ log.warn('Output does not contain required patterns');
177
+ }
178
+ }
179
+ }
180
+
181
+ return data;
182
+ }
183
+
184
+ private checkToolRestriction(action: any, config: Record<string, any>): void {
185
+ const allowedTools = config.allowedTools;
186
+ const deniedTools = config.deniedTools || [];
187
+ const toolName = action.toolName || action.type;
188
+
189
+ if (allowedTools && !allowedTools.includes(toolName)) {
190
+ throw new Error(`Tool not allowed: ${toolName}`);
191
+ }
192
+
193
+ if (deniedTools.includes(toolName)) {
194
+ throw new Error(`Tool denied: ${toolName}`);
195
+ }
196
+ }
197
+
198
+ // Create agent from definition
199
+ async createAgentFromDefinition(
200
+ definitionId: string,
201
+ options: {
202
+ projectPath: string;
203
+ providerId?: string;
204
+ model?: string;
205
+ }
206
+ ): Promise<Partial<Agent>> {
207
+ const definition = this.agentDefinitions.get(definitionId);
208
+ if (!definition) {
209
+ throw new Error(`Agent definition not found: ${definitionId}`);
210
+ }
211
+
212
+ const agent: Partial<Agent> = {
213
+ id: `agent_${Date.now()}`,
214
+ name: definition.name,
215
+ projectPath: options.projectPath,
216
+ providerId: options.providerId || definition.provider || 'openai',
217
+ model: options.model || definition.model || 'gpt-4o',
218
+ skills: definition.skills || [],
219
+ messages: [],
220
+ tasks: [],
221
+ metadata: {
222
+ definitionId: definition.id,
223
+ version: definition.version,
224
+ author: definition.author,
225
+ },
226
+ };
227
+
228
+ // Add system prompt from definition
229
+ if (definition.systemPrompt) {
230
+ agent.messages = [{
231
+ id: `msg_${Date.now()}`,
232
+ role: 'system',
233
+ content: definition.systemPrompt,
234
+ timestamp: new Date(),
235
+ }];
236
+ }
237
+
238
+ this.emit('agent:created', agent);
239
+ return agent;
240
+ }
241
+
242
+ // Build system prompt from handlers
243
+ buildHandlerSystemPrompt(): string {
244
+ const parts: string[] = ['## Available Tools'];
245
+
246
+ for (const handler of this.handlers.values()) {
247
+ const paramsDesc = handler.parameters
248
+ ? Object.entries(handler.parameters)
249
+ .map(([key, val]) => `- ${key}: ${(val as any).type || 'any'}`)
250
+ .join('\n')
251
+ : 'No parameters';
252
+
253
+ parts.push(`### ${handler.name}`);
254
+ parts.push(handler.description);
255
+ parts.push(`Parameters:\n${paramsDesc}`);
256
+ }
257
+
258
+ return parts.join('\n\n');
259
+ }
260
+
261
+ cleanup(): void {
262
+ this.handlers.clear();
263
+ this.guardrails = [];
264
+ this.agentDefinitions.clear();
265
+ this.removeAllListeners();
266
+ }
267
+ }
268
+
269
+ export default AgentSDK;
@@ -0,0 +1,380 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { spawn } from 'child_process';
4
+ import log from 'electron-log';
5
+
6
+ export interface ToolResult {
7
+ success: boolean;
8
+ output: string;
9
+ error?: string;
10
+ }
11
+
12
+ export interface ViewToolParams {
13
+ file_path: string;
14
+ offset?: number;
15
+ limit?: number;
16
+ }
17
+
18
+ export interface EditToolParams {
19
+ file_path: string;
20
+ old_string: string;
21
+ new_string: string;
22
+ }
23
+
24
+ export interface BashToolParams {
25
+ command: string;
26
+ timeout?: number;
27
+ cwd?: string;
28
+ }
29
+
30
+ export interface GlobToolParams {
31
+ pattern: string;
32
+ path?: string;
33
+ }
34
+
35
+ export interface GrepToolParams {
36
+ pattern: string;
37
+ path?: string;
38
+ include?: string;
39
+ }
40
+
41
+ export interface LsToolParams {
42
+ path: string;
43
+ }
44
+
45
+ export class AgentTools {
46
+ private worktreePath: string;
47
+
48
+ constructor(worktreePath: string) {
49
+ this.worktreePath = worktreePath;
50
+ }
51
+
52
+ private resolvePath(filePath: string): string {
53
+ const resolved = path.resolve(this.worktreePath, filePath);
54
+ const resolvedRoot = path.resolve(this.worktreePath);
55
+ if (!resolved.startsWith(resolvedRoot + path.sep) && resolved !== resolvedRoot) {
56
+ throw new Error('Path traversal detected: ' + filePath);
57
+ }
58
+ return resolved;
59
+ }
60
+
61
+ async view(params: ViewToolParams): Promise<ToolResult> {
62
+ try {
63
+ const fullPath = this.resolvePath(params.file_path);
64
+ const content = await fs.readFile(fullPath, 'utf-8');
65
+ const lines = content.split('\n');
66
+
67
+ const offset = params.offset || 1;
68
+ const limit = params.limit || 200;
69
+ const startLine = Math.max(0, offset - 1);
70
+ const endLine = Math.min(lines.length, startLine + limit);
71
+
72
+ const selectedLines = lines.slice(startLine, endLine);
73
+ const lineNumbers = selectedLines.map((_, idx) => startLine + idx + 1);
74
+
75
+ const output = selectedLines
76
+ .map((line, idx) => `${lineNumbers[idx]}${' '.repeat(6 - String(lineNumbers[idx]).length)}|${line}`)
77
+ .join('\n');
78
+
79
+ return {
80
+ success: true,
81
+ output: output + (endLine < lines.length ? '\n... (truncated)' : '')
82
+ };
83
+ } catch (error) {
84
+ return {
85
+ success: false,
86
+ output: '',
87
+ error: error instanceof Error ? error.message : String(error)
88
+ };
89
+ }
90
+ }
91
+
92
+ async edit(params: EditToolParams): Promise<ToolResult> {
93
+ try {
94
+ const fullPath = this.resolvePath(params.file_path);
95
+ const content = await fs.readFile(fullPath, 'utf-8');
96
+
97
+ if (!content.includes(params.old_string)) {
98
+ return {
99
+ success: false,
100
+ output: '',
101
+ error: `String not found in file: "${params.old_string.slice(0, 50)}..."`
102
+ };
103
+ }
104
+
105
+ const occurrences = content.split(params.old_string).length - 1;
106
+ if (occurrences > 1) {
107
+ return {
108
+ success: false,
109
+ output: '',
110
+ error: `Multiple occurrences found (${occurrences}). Be more specific.`
111
+ };
112
+ }
113
+
114
+ const newContent = content.replace(params.old_string, params.new_string);
115
+ await fs.writeFile(fullPath, newContent, 'utf-8');
116
+
117
+ return {
118
+ success: true,
119
+ output: `File edited successfully: ${params.file_path}`
120
+ };
121
+ } catch (error) {
122
+ return {
123
+ success: false,
124
+ output: '',
125
+ error: error instanceof Error ? error.message : String(error)
126
+ };
127
+ }
128
+ }
129
+
130
+ async bash(params: BashToolParams): Promise<ToolResult> {
131
+ return new Promise((resolve) => {
132
+ const cwd = params.cwd ? this.resolvePath(params.cwd) : this.worktreePath;
133
+ const timeout = params.timeout || 120000;
134
+
135
+ const [cmd, ...args] = params.command.split(' ');
136
+
137
+ const child = spawn(cmd, args, {
138
+ cwd,
139
+ shell: true,
140
+ env: { ...process.env, FORCE_COLOR: '1' }
141
+ });
142
+
143
+ let stdout = '';
144
+ let stderr = '';
145
+
146
+ child.stdout?.on('data', (data) => {
147
+ stdout += data.toString();
148
+ });
149
+
150
+ child.stderr?.on('data', (data) => {
151
+ stderr += data.toString();
152
+ });
153
+
154
+ const timeoutId = setTimeout(() => {
155
+ child.kill();
156
+ resolve({
157
+ success: false,
158
+ output: stdout,
159
+ error: `Command timed out after ${timeout}ms`
160
+ });
161
+ }, timeout);
162
+
163
+ child.on('close', (code) => {
164
+ clearTimeout(timeoutId);
165
+ resolve({
166
+ success: code === 0,
167
+ output: stdout || stderr,
168
+ error: code !== 0 ? `Exit code ${code}${stderr ? ': ' + stderr : ''}` : undefined
169
+ });
170
+ });
171
+
172
+ child.on('error', (error) => {
173
+ clearTimeout(timeoutId);
174
+ resolve({
175
+ success: false,
176
+ output: '',
177
+ error: error.message
178
+ });
179
+ });
180
+ });
181
+ }
182
+
183
+ async glob(params: GlobToolParams): Promise<ToolResult> {
184
+ try {
185
+ const searchPath = params.path ? this.resolvePath(params.path) : this.worktreePath;
186
+ const pattern = params.pattern;
187
+
188
+ // Simple glob implementation using native fs
189
+ const files: string[] = [];
190
+
191
+ async function walk(dir: string, relativeDir: string) {
192
+ const entries = await fs.readdir(dir, { withFileTypes: true });
193
+
194
+ for (const entry of entries) {
195
+ const fullPath = path.join(dir, entry.name);
196
+ const relativePath = relativeDir ? path.join(relativeDir, entry.name) : entry.name;
197
+
198
+ if (entry.isDirectory()) {
199
+ if (!entry.name.startsWith('.') &&
200
+ entry.name !== 'node_modules' &&
201
+ entry.name !== 'dist' &&
202
+ entry.name !== 'build') {
203
+ await walk(fullPath, relativePath);
204
+ }
205
+ } else if (entry.isFile()) {
206
+ // Simple pattern matching
207
+ if (pattern.includes('*')) {
208
+ const regex = new RegExp('^' + pattern.replace(/\*\*/g, '.*').replace(/\*/g, '[^/]*') + '$');
209
+ if (regex.test(relativePath)) {
210
+ files.push(relativePath);
211
+ }
212
+ } else if (relativePath.endsWith(pattern) || relativePath.includes(pattern)) {
213
+ files.push(relativePath);
214
+ }
215
+ }
216
+ }
217
+ }
218
+
219
+ await walk(searchPath, '');
220
+
221
+ return {
222
+ success: true,
223
+ output: files.join('\n') || 'No files found'
224
+ };
225
+ } catch (error) {
226
+ return {
227
+ success: false,
228
+ output: '',
229
+ error: error instanceof Error ? error.message : String(error)
230
+ };
231
+ }
232
+ }
233
+
234
+ async grep(params: GrepToolParams): Promise<ToolResult> {
235
+ try {
236
+ const searchPath = params.path ? this.resolvePath(params.path) : this.worktreePath;
237
+ const { pattern, include } = params;
238
+
239
+ const result = await this.bash({
240
+ command: `grep -r -n ${include ? `--include="${include}"` : ''} "${pattern}" .`,
241
+ cwd: searchPath
242
+ });
243
+
244
+ return result;
245
+ } catch (error) {
246
+ return {
247
+ success: false,
248
+ output: '',
249
+ error: error instanceof Error ? error.message : String(error)
250
+ };
251
+ }
252
+ }
253
+
254
+ async ls(params: LsToolParams): Promise<ToolResult> {
255
+ try {
256
+ const fullPath = this.resolvePath(params.path);
257
+ const entries = await fs.readdir(fullPath, { withFileTypes: true });
258
+
259
+ const output = entries
260
+ .map(entry => {
261
+ const type = entry.isDirectory() ? 'd' : entry.isFile() ? 'f' : '?';
262
+ return `${type} ${entry.name}`;
263
+ })
264
+ .join('\n');
265
+
266
+ return {
267
+ success: true,
268
+ output: output || '(empty directory)'
269
+ };
270
+ } catch (error) {
271
+ return {
272
+ success: false,
273
+ output: '',
274
+ error: error instanceof Error ? error.message : String(error)
275
+ };
276
+ }
277
+ }
278
+
279
+ getToolDefinitions(): Array<{ name: string; description: string; parameters: object }> {
280
+ return [
281
+ {
282
+ name: 'view',
283
+ description: 'View the contents of a file. Use offset and limit for large files.',
284
+ parameters: {
285
+ type: 'object',
286
+ properties: {
287
+ file_path: { type: 'string', description: 'Path to the file' },
288
+ offset: { type: 'number', description: 'Start line number (1-based)' },
289
+ limit: { type: 'number', description: 'Number of lines to show (max 200)' }
290
+ },
291
+ required: ['file_path']
292
+ }
293
+ },
294
+ {
295
+ name: 'edit',
296
+ description: 'Edit a file by replacing a specific string. The old_string must match exactly and uniquely.',
297
+ parameters: {
298
+ type: 'object',
299
+ properties: {
300
+ file_path: { type: 'string', description: 'Path to the file' },
301
+ old_string: { type: 'string', description: 'Exact string to replace' },
302
+ new_string: { type: 'string', description: 'Replacement string' }
303
+ },
304
+ required: ['file_path', 'old_string', 'new_string']
305
+ }
306
+ },
307
+ {
308
+ name: 'bash',
309
+ description: 'Execute a bash command in the worktree. Use for running tests, builds, git commands, etc.',
310
+ parameters: {
311
+ type: 'object',
312
+ properties: {
313
+ command: { type: 'string', description: 'Command to execute' },
314
+ timeout: { type: 'number', description: 'Timeout in milliseconds (default 120000)' }
315
+ },
316
+ required: ['command']
317
+ }
318
+ },
319
+ {
320
+ name: 'glob',
321
+ description: 'Find files matching a glob pattern (e.g., "**/*.ts").',
322
+ parameters: {
323
+ type: 'object',
324
+ properties: {
325
+ pattern: { type: 'string', description: 'Glob pattern' },
326
+ path: { type: 'string', description: 'Directory to search in' }
327
+ },
328
+ required: ['pattern']
329
+ }
330
+ },
331
+ {
332
+ name: 'grep',
333
+ description: 'Search for a pattern in file contents using grep.',
334
+ parameters: {
335
+ type: 'object',
336
+ properties: {
337
+ pattern: { type: 'string', description: 'Search pattern' },
338
+ path: { type: 'string', description: 'Directory to search in' },
339
+ include: { type: 'string', description: 'File pattern to include (e.g., "*.ts")' }
340
+ },
341
+ required: ['pattern']
342
+ }
343
+ },
344
+ {
345
+ name: 'ls',
346
+ description: 'List the contents of a directory.',
347
+ parameters: {
348
+ type: 'object',
349
+ properties: {
350
+ path: { type: 'string', description: 'Directory path' }
351
+ },
352
+ required: ['path']
353
+ }
354
+ }
355
+ ];
356
+ }
357
+
358
+ async executeTool(name: string, params: any): Promise<ToolResult> {
359
+ switch (name) {
360
+ case 'view':
361
+ return this.view(params);
362
+ case 'edit':
363
+ return this.edit(params);
364
+ case 'bash':
365
+ return this.bash(params);
366
+ case 'glob':
367
+ return this.glob(params);
368
+ case 'grep':
369
+ return this.grep(params);
370
+ case 'ls':
371
+ return this.ls(params);
372
+ default:
373
+ return {
374
+ success: false,
375
+ output: '',
376
+ error: `Unknown tool: ${name}`
377
+ };
378
+ }
379
+ }
380
+ }