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,475 @@
1
+ import { EventEmitter } from 'events';
2
+ import log from 'electron-log';
3
+ import { AIProviderManager } from '../providers/AIProviderManager';
4
+ import { VisionManager } from './VisionManager';
5
+ import { PermissionManager } from '../security/PermissionManager';
6
+
7
+ export interface UIElement {
8
+ id?: string;
9
+ type: 'button' | 'input' | 'link' | 'text' | 'image' | 'container' | 'other';
10
+ text?: string;
11
+ coordinates: {
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ };
17
+ confidence: number;
18
+ attributes?: Record<string, string>;
19
+ }
20
+
21
+ export interface ComputerAction {
22
+ type: 'click' | 'doubleClick' | 'rightClick' | 'type' | 'scroll' | 'drag' | 'wait' | 'key' | 'screenshot';
23
+ target?: {
24
+ element?: UIElement;
25
+ coordinates?: { x: number; y: number };
26
+ selector?: string;
27
+ };
28
+ value?: string;
29
+ delay?: number;
30
+ metadata?: Record<string, any>;
31
+ }
32
+
33
+ export interface ComputerTask {
34
+ id: string;
35
+ description: string;
36
+ goal: string;
37
+ maxSteps: number;
38
+ currentStep: number;
39
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
40
+ actions: ComputerAction[];
41
+ results: string[];
42
+ error?: string;
43
+ }
44
+
45
+ export interface ComputerUseSession {
46
+ id: string;
47
+ taskId: string;
48
+ startTime: Date;
49
+ endTime?: Date;
50
+ screenshots: string[];
51
+ actions: ComputerAction[];
52
+ currentUrl?: string;
53
+ currentApp?: string;
54
+ }
55
+
56
+ export class ComputerUseManager extends EventEmitter {
57
+ private visionManager: VisionManager;
58
+ private aiProviderManager: AIProviderManager;
59
+ private permissionManager: PermissionManager;
60
+ private activeSessions: Map<string, ComputerUseSession> = new Map();
61
+ private activeTasks: Map<string, ComputerTask> = new Map();
62
+ private readonly MAX_STEPS = 50;
63
+ private readonly STEP_DELAY = 2000; // 2 seconds between actions
64
+
65
+ constructor(
66
+ aiProviderManager: AIProviderManager,
67
+ permissionManager: PermissionManager
68
+ ) {
69
+ super();
70
+ this.aiProviderManager = aiProviderManager;
71
+ this.permissionManager = permissionManager;
72
+ this.visionManager = new VisionManager(aiProviderManager);
73
+ }
74
+
75
+ async executeTask(
76
+ description: string,
77
+ goal: string,
78
+ options: {
79
+ maxSteps?: number;
80
+ requirePermission?: boolean;
81
+ targetUrl?: string;
82
+ targetApp?: string;
83
+ } = {}
84
+ ): Promise<ComputerTask> {
85
+ const taskId = `task_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
86
+
87
+ const task: ComputerTask = {
88
+ id: taskId,
89
+ description,
90
+ goal,
91
+ maxSteps: options.maxSteps || this.MAX_STEPS,
92
+ currentStep: 0,
93
+ status: 'pending',
94
+ actions: [],
95
+ results: []
96
+ };
97
+
98
+ this.activeTasks.set(taskId, task);
99
+
100
+ // Check permission if required
101
+ if (options.requirePermission !== false) {
102
+ const permission = await this.permissionManager.checkPermission('computer-use', {
103
+ type: 'tool',
104
+ action: 'execute-computer-task',
105
+ details: { goal, maxSteps: task.maxSteps }
106
+ });
107
+
108
+ if (!permission.allowed) {
109
+ task.status = 'failed';
110
+ task.error = 'Permission denied';
111
+ return task;
112
+ }
113
+ }
114
+
115
+ try {
116
+ task.status = 'running';
117
+ this.emit('task:started', task);
118
+
119
+ // Create session
120
+ const session = await this.createSession(taskId, options);
121
+
122
+ // Execute steps
123
+ while (task.currentStep < task.maxSteps && task.status === 'running') {
124
+ await this.executeStep(task, session);
125
+
126
+ // Check if goal is achieved
127
+ if (await this.isGoalAchieved(task, session)) {
128
+ task.status = 'completed';
129
+ break;
130
+ }
131
+
132
+ // Delay between steps
133
+ await this.delay(this.STEP_DELAY);
134
+ }
135
+
136
+ if (task.currentStep >= task.maxSteps && task.status === 'running') {
137
+ task.status = 'completed';
138
+ task.results.push('Maximum steps reached');
139
+ }
140
+
141
+ session.endTime = new Date();
142
+ this.emit('task:completed', task);
143
+
144
+ } catch (error: any) {
145
+ task.status = 'failed';
146
+ task.error = error.message;
147
+ this.emit('task:failed', task, error);
148
+ log.error('ComputerUse: Task failed:', error);
149
+ }
150
+
151
+ return task;
152
+ }
153
+
154
+ private async createSession(
155
+ taskId: string,
156
+ options: { targetUrl?: string; targetApp?: string }
157
+ ): Promise<ComputerUseSession> {
158
+ const sessionId = `session_${Date.now()}`;
159
+
160
+ const session: ComputerUseSession = {
161
+ id: sessionId,
162
+ taskId,
163
+ startTime: new Date(),
164
+ screenshots: [],
165
+ actions: [],
166
+ currentUrl: options.targetUrl,
167
+ currentApp: options.targetApp
168
+ };
169
+
170
+ this.activeSessions.set(sessionId, session);
171
+ return session;
172
+ }
173
+
174
+ private async executeStep(task: ComputerTask, session: ComputerUseSession): Promise<void> {
175
+ task.currentStep++;
176
+
177
+ try {
178
+ // 1. Capture screenshot
179
+ const screenshot = await this.captureScreenshot();
180
+ session.screenshots.push(screenshot);
181
+
182
+ // 2. Analyze current state with AI
183
+ const analysis = await this.analyzeScreenState(screenshot, task);
184
+
185
+ // 3. Determine next action
186
+ const action = await this.determineNextAction(analysis, task, session);
187
+
188
+ if (!action) {
189
+ task.status = 'completed';
190
+ task.results.push('No further actions needed');
191
+ return;
192
+ }
193
+
194
+ // 4. Execute action
195
+ await this.executeAction(action, session);
196
+ task.actions.push(action);
197
+ session.actions.push(action);
198
+
199
+ // 5. Record result
200
+ task.results.push(`Step ${task.currentStep}: ${action.type} executed`);
201
+
202
+ this.emit('step:completed', task, action);
203
+
204
+ } catch (error: any) {
205
+ log.error(`ComputerUse: Step ${task.currentStep} failed:`, error);
206
+ task.results.push(`Step ${task.currentStep}: Error - ${error.message}`);
207
+
208
+ // Don't fail immediately, try to recover
209
+ if (task.currentStep >= 3) {
210
+ throw error;
211
+ }
212
+ }
213
+ }
214
+
215
+ private async captureScreenshot(): Promise<string> {
216
+ // Use desktopCapturer from Electron
217
+ const { desktopCapturer } = await import('electron');
218
+
219
+ const sources = await desktopCapturer.getSources({
220
+ types: ['screen', 'window'],
221
+ thumbnailSize: { width: 1920, height: 1080 }
222
+ });
223
+
224
+ if (sources.length === 0) {
225
+ throw new Error('No screen sources available');
226
+ }
227
+
228
+ // Get primary screen or first available
229
+ const primarySource = sources.find(s => s.name === 'Entire screen') || sources[0];
230
+
231
+ return primarySource.thumbnail.toDataURL();
232
+ }
233
+
234
+ private async analyzeScreenState(
235
+ screenshot: string,
236
+ task: ComputerTask
237
+ ): Promise<{
238
+ description: string;
239
+ elements: UIElement[];
240
+ currentState: string;
241
+ progress: string;
242
+ }> {
243
+ const prompt = `Analyze this screenshot and provide:
244
+ 1. A description of what is currently visible
245
+ 2. A list of interactive UI elements with their approximate coordinates
246
+ 3. The current state relative to the goal: "${task.goal}"
247
+ 4. Progress assessment
248
+
249
+ Goal: ${task.goal}
250
+ Current Step: ${task.currentStep}/${task.maxSteps}
251
+
252
+ Respond in JSON format:
253
+ {
254
+ "description": "...",
255
+ "elements": [
256
+ {"type": "button", "text": "Submit", "coordinates": {"x": 100, "y": 200, "width": 80, "height": 30}, "confidence": 0.95}
257
+ ],
258
+ "currentState": "...",
259
+ "progress": "..."
260
+ }`;
261
+
262
+ const result = await this.visionManager.analyzeScreenshot(
263
+ screenshot.replace(/^data:image\/[^;]+;base64,/, ''),
264
+ prompt
265
+ );
266
+
267
+ try {
268
+ // Try to parse JSON response
269
+ const jsonMatch = result.content.match(/\{[\s\S]*\}/);
270
+ if (jsonMatch) {
271
+ return JSON.parse(jsonMatch[0]);
272
+ }
273
+ } catch (e) {
274
+ log.warn('ComputerUse: Failed to parse AI response as JSON');
275
+ }
276
+
277
+ // Fallback to text parsing
278
+ return {
279
+ description: result.content,
280
+ elements: [],
281
+ currentState: 'Unknown',
282
+ progress: 'Unable to determine'
283
+ };
284
+ }
285
+
286
+ private async determineNextAction(
287
+ analysis: any,
288
+ task: ComputerTask,
289
+ _session: ComputerUseSession
290
+ ): Promise<ComputerAction | null> {
291
+ const prompt = `Based on the current screen state and goal, determine the next action to take.
292
+
293
+ Goal: ${task.goal}
294
+ Current Step: ${task.currentStep}/${task.maxSteps}
295
+ Screen Description: ${analysis.description}
296
+ Current State: ${analysis.currentState}
297
+ Progress: ${analysis.progress}
298
+
299
+ Available UI Elements:
300
+ ${JSON.stringify(analysis.elements, null, 2)}
301
+
302
+ Determine the single next action to progress toward the goal. Respond in JSON format:
303
+ {
304
+ "type": "click|type|scroll|wait|key",
305
+ "target": {
306
+ "element": {"type": "button", "text": "...", "coordinates": {"x": 100, "y": 200}},
307
+ "coordinates": {"x": 100, "y": 200}
308
+ },
309
+ "value": "text to type (if applicable)",
310
+ "delay": 1000,
311
+ "reason": "explanation of why this action"
312
+ }
313
+
314
+ Or respond with {"action": null} if the goal is achieved or cannot be progressed.`;
315
+
316
+ const provider = this.aiProviderManager.getActiveProviderInstance();
317
+ if (!provider) {
318
+ throw new Error('No AI provider available');
319
+ }
320
+
321
+ const response = await provider.sendMessage('gpt-4o', [
322
+ { role: 'user', content: prompt }
323
+ ] as Array<{ role: string; content: string }>);
324
+
325
+ try {
326
+ const jsonMatch = response.content.match(/\{[\s\S]*\}/);
327
+ if (jsonMatch) {
328
+ const actionData = JSON.parse(jsonMatch[0]);
329
+ if (actionData.action === null) {
330
+ return null;
331
+ }
332
+ return {
333
+ type: actionData.type,
334
+ target: actionData.target,
335
+ value: actionData.value,
336
+ delay: actionData.delay,
337
+ metadata: { reason: actionData.reason }
338
+ };
339
+ }
340
+ } catch (e) {
341
+ log.warn('ComputerUse: Failed to parse action from AI response');
342
+ }
343
+
344
+ return null;
345
+ }
346
+
347
+ private async executeAction(action: ComputerAction, session: ComputerUseSession): Promise<void> {
348
+ switch (action.type) {
349
+ case 'click':
350
+ await this.simulateClick(action.target?.coordinates || action.target?.element?.coordinates);
351
+ break;
352
+ case 'doubleClick':
353
+ await this.simulateDoubleClick(action.target?.coordinates || action.target?.element?.coordinates);
354
+ break;
355
+ case 'type':
356
+ await this.simulateType(action.value || '');
357
+ break;
358
+ case 'scroll':
359
+ await this.simulateScroll(action.target?.coordinates);
360
+ break;
361
+ case 'key':
362
+ await this.simulateKeyPress(action.value || '');
363
+ break;
364
+ case 'wait':
365
+ await this.delay(action.delay || 1000);
366
+ break;
367
+ case 'screenshot':
368
+ const screenshot = await this.captureScreenshot();
369
+ session.screenshots.push(screenshot);
370
+ break;
371
+ }
372
+
373
+ this.emit('action:executed', action);
374
+ }
375
+
376
+ private async simulateClick(coordinates?: { x: number; y: number }): Promise<void> {
377
+ if (!coordinates) {
378
+ log.warn('ComputerUse: Click action without coordinates');
379
+ return;
380
+ }
381
+
382
+ // Use robotjs or similar for actual automation
383
+ // For now, emit event for UI to handle
384
+ this.emit('action:click', coordinates);
385
+ log.info(`ComputerUse: Click at (${coordinates.x}, ${coordinates.y})`);
386
+ }
387
+
388
+ private async simulateDoubleClick(coordinates?: { x: number; y: number }): Promise<void> {
389
+ if (!coordinates) return;
390
+ this.emit('action:doubleClick', coordinates);
391
+ log.info(`ComputerUse: Double click at (${coordinates.x}, ${coordinates.y})`);
392
+ }
393
+
394
+ private async simulateType(text: string): Promise<void> {
395
+ this.emit('action:type', text);
396
+ log.info(`ComputerUse: Type "${text}"`);
397
+ }
398
+
399
+ private async simulateScroll(coordinates?: { x: number; y: number }): Promise<void> {
400
+ this.emit('action:scroll', coordinates);
401
+ log.info('ComputerUse: Scroll');
402
+ }
403
+
404
+ private async simulateKeyPress(key: string): Promise<void> {
405
+ this.emit('action:key', key);
406
+ log.info(`ComputerUse: Key press "${key}"`);
407
+ }
408
+
409
+ private async isGoalAchieved(task: ComputerTask, session: ComputerUseSession): Promise<boolean> {
410
+ if (task.currentStep === 0) return false;
411
+
412
+ const lastScreenshot = session.screenshots[session.screenshots.length - 1];
413
+ if (!lastScreenshot) return false;
414
+
415
+ const prompt = `Analyze if the goal has been achieved based on the current screenshot.
416
+
417
+ Goal: ${task.goal}
418
+ Previous Actions: ${task.actions.map(a => a.type).join(', ')}
419
+
420
+ Has the goal been achieved? Respond with only "yes" or "no".`;
421
+
422
+ try {
423
+ const result = await this.visionManager.analyzeScreenshot(
424
+ lastScreenshot.replace(/^data:image\/[^;]+;base64,/, ''),
425
+ prompt
426
+ );
427
+
428
+ return result.content.toLowerCase().includes('yes');
429
+ } catch (error) {
430
+ log.error('ComputerUse: Failed to check goal achievement:', error);
431
+ return false;
432
+ }
433
+ }
434
+
435
+ private delay(ms: number): Promise<void> {
436
+ return new Promise(resolve => setTimeout(resolve, ms));
437
+ }
438
+
439
+ async cancelTask(taskId: string): Promise<boolean> {
440
+ const task = this.activeTasks.get(taskId);
441
+ if (!task) return false;
442
+
443
+ task.status = 'cancelled';
444
+ this.emit('task:cancelled', task);
445
+ return true;
446
+ }
447
+
448
+ getActiveTask(taskId: string): ComputerTask | undefined {
449
+ return this.activeTasks.get(taskId);
450
+ }
451
+
452
+ getAllActiveTasks(): ComputerTask[] {
453
+ return Array.from(this.activeTasks.values()).filter(t => t.status === 'running');
454
+ }
455
+
456
+ getSession(sessionId: string): ComputerUseSession | undefined {
457
+ return this.activeSessions.get(sessionId);
458
+ }
459
+
460
+ cleanup(): void {
461
+ // Cancel all active tasks
462
+ for (const [taskId, task] of this.activeTasks) {
463
+ if (task.status === 'running') {
464
+ this.cancelTask(taskId);
465
+ }
466
+ }
467
+
468
+ this.activeTasks.clear();
469
+ this.activeSessions.clear();
470
+ this.visionManager.cleanup();
471
+ this.removeAllListeners();
472
+ }
473
+ }
474
+
475
+ export default ComputerUseManager;