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,245 @@
1
+ import React, { useState } from 'react';
2
+ import { Skill } from '../../shared/types';
3
+ import { Wrench, Plus, FileText, Tag, Trash2, Edit2 } from 'lucide-react';
4
+
5
+ interface SkillsPanelProps {
6
+ skills: Skill[];
7
+ onCreateSkill: (config: any) => Promise<Skill>;
8
+ }
9
+
10
+ export const SkillsPanel: React.FC<SkillsPanelProps> = ({
11
+ skills,
12
+ onCreateSkill
13
+ }) => {
14
+ const [showCreateModal, setShowCreateModal] = useState(false);
15
+ const [selectedSkill, setSelectedSkill] = useState<Skill | null>(null);
16
+ const [searchQuery, setSearchQuery] = useState('');
17
+ const [newSkill, setNewSkill] = useState({
18
+ name: '',
19
+ description: '',
20
+ content: ''
21
+ });
22
+
23
+ const filteredSkills = skills.filter(skill =>
24
+ skill.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
25
+ skill.description.toLowerCase().includes(searchQuery.toLowerCase()) ||
26
+ skill.tags.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase()))
27
+ );
28
+
29
+ const handleCreate = async () => {
30
+ try {
31
+ await onCreateSkill(newSkill);
32
+ setShowCreateModal(false);
33
+ setNewSkill({ name: '', description: '', content: '' });
34
+ } catch (error) {
35
+ console.error('Failed to create skill:', error);
36
+ }
37
+ };
38
+
39
+ return (
40
+ <div className="h-full flex">
41
+ {/* Skills List */}
42
+ <div className="w-80 border-r border-border bg-card flex flex-col">
43
+ <div className="p-4 border-b border-border">
44
+ <div className="flex items-center justify-between mb-3">
45
+ <h2 className="font-semibold">Skills Library</h2>
46
+ <button
47
+ onClick={() => setShowCreateModal(true)}
48
+ className="p-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90"
49
+ >
50
+ <Plus className="w-4 h-4" />
51
+ </button>
52
+ </div>
53
+ <input
54
+ type="text"
55
+ placeholder="Search skills..."
56
+ value={searchQuery}
57
+ onChange={e => setSearchQuery(e.target.value)}
58
+ className="w-full px-3 py-2 bg-background border border-input rounded-md text-sm"
59
+ />
60
+ </div>
61
+
62
+ <div className="flex-1 overflow-auto p-2 space-y-2">
63
+ {filteredSkills.map(skill => (
64
+ <div
65
+ key={skill.id}
66
+ onClick={() => setSelectedSkill(skill)}
67
+ className={`p-3 rounded-lg cursor-pointer transition-colors ${
68
+ selectedSkill?.id === skill.id
69
+ ? 'bg-primary/10 border border-primary/30'
70
+ : 'hover:bg-muted border border-transparent'
71
+ }`}
72
+ >
73
+ <div className="flex items-center gap-2">
74
+ <Wrench className="w-4 h-4 text-muted-foreground" />
75
+ <span className="font-medium text-sm">{skill.name}</span>
76
+ </div>
77
+ <p className="mt-1 text-xs text-muted-foreground line-clamp-2">
78
+ {skill.description}
79
+ </p>
80
+ <div className="flex flex-wrap gap-1 mt-2">
81
+ {skill.tags.slice(0, 3).map(tag => (
82
+ <span key={tag} className="px-1.5 py-0.5 bg-muted rounded text-xs">
83
+ {tag}
84
+ </span>
85
+ ))}
86
+ </div>
87
+ </div>
88
+ ))}
89
+
90
+ {filteredSkills.length === 0 && (
91
+ <div className="text-center py-8 text-muted-foreground">
92
+ <Wrench className="w-12 h-12 mx-auto mb-2 opacity-50" />
93
+ <p className="text-sm">No skills found</p>
94
+ </div>
95
+ )}
96
+ </div>
97
+ </div>
98
+
99
+ {/* Skill Detail */}
100
+ <div className="flex-1 flex flex-col">
101
+ {selectedSkill ? (
102
+ <>
103
+ <div className="p-4 border-b border-border flex items-start justify-between">
104
+ <div>
105
+ <h2 className="text-lg font-semibold">{selectedSkill.name}</h2>
106
+ <p className="text-sm text-muted-foreground">{selectedSkill.description}</p>
107
+ <div className="flex flex-wrap gap-2 mt-2">
108
+ {selectedSkill.tags.map(tag => (
109
+ <span key={tag} className="px-2 py-0.5 bg-muted rounded-full text-xs">
110
+ <Tag className="w-3 h-3 inline mr-1" />
111
+ {tag}
112
+ </span>
113
+ ))}
114
+ </div>
115
+ </div>
116
+ <div className="flex gap-2">
117
+ <button className="p-2 hover:bg-muted rounded-md">
118
+ <Edit2 className="w-4 h-4" />
119
+ </button>
120
+ <button className="p-2 text-destructive hover:bg-destructive/10 rounded-md">
121
+ <Trash2 className="w-4 h-4" />
122
+ </button>
123
+ </div>
124
+ </div>
125
+
126
+ <div className="flex-1 overflow-auto p-4">
127
+ <div className="space-y-4">
128
+ <div>
129
+ <h3 className="text-sm font-medium mb-2">Files</h3>
130
+ <div className="space-y-2">
131
+ {selectedSkill.files.map(file => (
132
+ <div
133
+ key={file.path}
134
+ className="p-3 bg-muted rounded-md"
135
+ >
136
+ <div className="flex items-center gap-2 mb-2">
137
+ <FileText className="w-4 h-4 text-muted-foreground" />
138
+ <span className="text-sm font-medium">{file.path}</span>
139
+ <span className="text-xs text-muted-foreground uppercase">
140
+ {file.type}
141
+ </span>
142
+ </div>
143
+ <pre className="text-xs bg-background p-2 rounded overflow-x-auto">
144
+ <code>{file.content.slice(0, 500)}{file.content.length > 500 ? '...' : ''}</code>
145
+ </pre>
146
+ </div>
147
+ ))}
148
+ </div>
149
+ </div>
150
+
151
+ <div>
152
+ <h3 className="text-sm font-medium mb-2">Configuration</h3>
153
+ <div className="bg-muted p-3 rounded-md text-sm">
154
+ <div className="grid grid-cols-2 gap-4">
155
+ <div>
156
+ <span className="text-muted-foreground">Entry Point:</span>
157
+ <span className="ml-2">{selectedSkill.config.entryPoint}</span>
158
+ </div>
159
+ <div>
160
+ <span className="text-muted-foreground">Version:</span>
161
+ <span className="ml-2">{selectedSkill.version}</span>
162
+ </div>
163
+ <div>
164
+ <span className="text-muted-foreground">Author:</span>
165
+ <span className="ml-2">{selectedSkill.author}</span>
166
+ </div>
167
+ <div>
168
+ <span className="text-muted-foreground">Dependencies:</span>
169
+ <span className="ml-2">{selectedSkill.config.dependencies.length || 'None'}</span>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </>
177
+ ) : (
178
+ <div className="flex-1 flex items-center justify-center text-muted-foreground">
179
+ <div className="text-center">
180
+ <Wrench className="w-16 h-16 mx-auto mb-4 opacity-30" />
181
+ <p>Select a skill to view details</p>
182
+ </div>
183
+ </div>
184
+ )}
185
+ </div>
186
+
187
+ {showCreateModal && (
188
+ <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
189
+ <div className="bg-card border border-border rounded-lg p-6 w-[600px]">
190
+ <h2 className="text-lg font-semibold mb-4">Create New Skill</h2>
191
+
192
+ <div className="space-y-4">
193
+ <div>
194
+ <label className="block text-sm font-medium mb-1">Name</label>
195
+ <input
196
+ type="text"
197
+ value={newSkill.name}
198
+ onChange={e => setNewSkill({ ...newSkill, name: e.target.value })}
199
+ className="w-full px-3 py-2 bg-background border border-input rounded-md"
200
+ placeholder="My Custom Skill"
201
+ />
202
+ </div>
203
+
204
+ <div>
205
+ <label className="block text-sm font-medium mb-1">Description</label>
206
+ <textarea
207
+ value={newSkill.description}
208
+ onChange={e => setNewSkill({ ...newSkill, description: e.target.value })}
209
+ className="w-full px-3 py-2 bg-background border border-input rounded-md h-20 resize-none"
210
+ placeholder="What does this skill do?"
211
+ />
212
+ </div>
213
+
214
+ <div>
215
+ <label className="block text-sm font-medium mb-1">Content</label>
216
+ <textarea
217
+ value={newSkill.content}
218
+ onChange={e => setNewSkill({ ...newSkill, content: e.target.value })}
219
+ className="w-full px-3 py-2 bg-background border border-input rounded-md h-40 resize-none font-mono text-sm"
220
+ placeholder="Enter skill instructions..."
221
+ />
222
+ </div>
223
+ </div>
224
+
225
+ <div className="flex justify-end gap-2 mt-6">
226
+ <button
227
+ onClick={() => setShowCreateModal(false)}
228
+ className="px-4 py-2 text-muted-foreground"
229
+ >
230
+ Cancel
231
+ </button>
232
+ <button
233
+ onClick={handleCreate}
234
+ disabled={!newSkill.name || !newSkill.content}
235
+ className="px-4 py-2 bg-primary text-primary-foreground rounded-md disabled:opacity-50"
236
+ >
237
+ Create Skill
238
+ </button>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ )}
243
+ </div>
244
+ );
245
+ };
@@ -0,0 +1,173 @@
1
+ import React, { useState, useCallback } from 'react';
2
+
3
+ interface SplitPaneProps {
4
+ children: [React.ReactNode, React.ReactNode];
5
+ direction?: 'horizontal' | 'vertical';
6
+ defaultSplit?: number;
7
+ minSize?: number;
8
+ }
9
+
10
+ export const SplitPane: React.FC<SplitPaneProps> = ({
11
+ children,
12
+ direction = 'horizontal',
13
+ defaultSplit = 50,
14
+ minSize = 200,
15
+ }) => {
16
+ const [split, setSplit] = useState(defaultSplit);
17
+ const [isDragging, setIsDragging] = useState(false);
18
+
19
+ const handleMouseDown = useCallback(() => {
20
+ setIsDragging(true);
21
+ }, []);
22
+
23
+ const handleMouseUp = useCallback(() => {
24
+ setIsDragging(false);
25
+ }, []);
26
+
27
+ const handleMouseMove = useCallback(
28
+ (e: React.MouseEvent) => {
29
+ if (!isDragging) return;
30
+
31
+ const container = e.currentTarget as HTMLElement;
32
+ const rect = container.getBoundingClientRect();
33
+
34
+ let newSplit;
35
+ if (direction === 'horizontal') {
36
+ newSplit = ((e.clientX - rect.left) / rect.width) * 100;
37
+ } else {
38
+ newSplit = ((e.clientY - rect.top) / rect.height) * 100;
39
+ }
40
+
41
+ // Apply min size constraints
42
+ const minPercent = (minSize / (direction === 'horizontal' ? rect.width : rect.height)) * 100;
43
+ newSplit = Math.max(minPercent, Math.min(100 - minPercent, newSplit));
44
+
45
+ setSplit(newSplit);
46
+ },
47
+ [isDragging, direction, minSize]
48
+ );
49
+
50
+ const isHorizontal = direction === 'horizontal';
51
+
52
+ return (
53
+ <div
54
+ className={`flex ${isHorizontal ? 'flex-row' : 'flex-col'} w-full h-full`}
55
+ onMouseMove={handleMouseMove}
56
+ onMouseUp={handleMouseUp}
57
+ onMouseLeave={handleMouseUp}
58
+ >
59
+ <div
60
+ className="overflow-hidden"
61
+ style={{
62
+ [isHorizontal ? 'width' : 'height']: `${split}%`,
63
+ [isHorizontal ? 'height' : 'width']: '100%',
64
+ }}
65
+ >
66
+ {children[0]}
67
+ </div>
68
+
69
+ <div
70
+ className={`${
71
+ isHorizontal ? 'w-1 cursor-col-resize' : 'h-1 cursor-row-resize'
72
+ } bg-border hover:bg-primary transition-colors flex-shrink-0`}
73
+ onMouseDown={handleMouseDown}
74
+ style={{
75
+ userSelect: 'none',
76
+ }}
77
+ >
78
+ <div
79
+ className={`${
80
+ isHorizontal ? 'w-full h-8' : 'h-full w-8'
81
+ } mx-auto my-auto flex items-center justify-center`}
82
+ >
83
+ <div
84
+ className={`${
85
+ isHorizontal ? 'w-0.5 h-4' : 'w-4 h-0.5'
86
+ } bg-muted-foreground/30 rounded-full`}
87
+ />
88
+ </div>
89
+ </div>
90
+
91
+ <div
92
+ className="overflow-hidden flex-1"
93
+ style={{
94
+ [isHorizontal ? 'width' : 'height']: `${100 - split}%`,
95
+ }}
96
+ >
97
+ {children[1]}
98
+ </div>
99
+ </div>
100
+ );
101
+ };
102
+
103
+ // Multi-pane layout component
104
+ interface Pane {
105
+ id: string;
106
+ content: React.ReactNode;
107
+ title: string;
108
+ }
109
+
110
+ interface MultiPaneLayoutProps {
111
+ panes: Pane[];
112
+ activePaneId: string;
113
+ onPaneChange: (id: string) => void;
114
+ onPaneClose?: (id: string) => void;
115
+ }
116
+
117
+ export const MultiPaneLayout: React.FC<MultiPaneLayoutProps> = ({
118
+ panes,
119
+ activePaneId,
120
+ onPaneChange,
121
+ onPaneClose,
122
+ }) => {
123
+ const activePane = panes.find((p) => p.id === activePaneId);
124
+
125
+ return (
126
+ <div className="flex flex-col h-full">
127
+ {/* Tab bar */}
128
+ <div className="flex items-center border-b border-border bg-card">
129
+ {panes.map((pane) => (
130
+ <div
131
+ key={pane.id}
132
+ className={`group flex items-center gap-2 px-4 py-2 text-sm cursor-pointer border-r border-border transition-colors ${
133
+ pane.id === activePaneId
134
+ ? 'bg-background text-foreground border-t-2 border-t-primary'
135
+ : 'text-muted-foreground hover:bg-muted hover:text-foreground'
136
+ }`}
137
+ onClick={() => onPaneChange(pane.id)}
138
+ >
139
+ <span className="truncate max-w-[150px]">{pane.title}</span>
140
+ {onPaneClose && panes.length > 1 && (
141
+ <button
142
+ className="opacity-0 group-hover:opacity-100 p-0.5 hover:bg-muted rounded"
143
+ onClick={(e) => {
144
+ e.stopPropagation();
145
+ onPaneClose(pane.id);
146
+ }}
147
+ >
148
+ <svg
149
+ className="w-3 h-3"
150
+ fill="none"
151
+ stroke="currentColor"
152
+ viewBox="0 0 24 24"
153
+ >
154
+ <path
155
+ strokeLinecap="round"
156
+ strokeLinejoin="round"
157
+ strokeWidth={2}
158
+ d="M6 18L18 6M6 6l12 12"
159
+ />
160
+ </svg>
161
+ </button>
162
+ )}
163
+ </div>
164
+ ))}
165
+ </div>
166
+
167
+ {/* Content */}
168
+ <div className="flex-1 overflow-hidden">
169
+ {activePane?.content}
170
+ </div>
171
+ </div>
172
+ );
173
+ };
@@ -0,0 +1,190 @@
1
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
2
+ import { Terminal as XTerm } from 'xterm';
3
+ import { FitAddon } from 'xterm-addon-fit';
4
+ import { WebLinksAddon } from 'xterm-addon-web-links';
5
+ import 'xterm/css/xterm.css';
6
+ import { Play, Square, Trash2, FolderOpen } from 'lucide-react';
7
+
8
+ interface TerminalProps {
9
+ worktreePath: string;
10
+ onCommand?: (command: string) => void;
11
+ }
12
+
13
+ export const Terminal: React.FC<TerminalProps> = ({ worktreePath, onCommand }) => {
14
+ const terminalRef = useRef<HTMLDivElement>(null);
15
+ const xtermRef = useRef<XTerm | null>(null);
16
+ const fitAddonRef = useRef<FitAddon | null>(null);
17
+ const [isRunning, setIsRunning] = useState(false);
18
+ const [currentCommand, setCurrentCommand] = useState('');
19
+
20
+ useEffect(() => {
21
+ if (!terminalRef.current) return;
22
+
23
+ const term = new XTerm({
24
+ cursorBlink: true,
25
+ fontSize: 14,
26
+ fontFamily: 'JetBrains Mono, monospace',
27
+ theme: {
28
+ background: '#1e1e1e',
29
+ foreground: '#d4d4d4',
30
+ cursor: '#d4d4d4',
31
+ selectionBackground: '#264f78',
32
+ black: '#000000',
33
+ red: '#cd3131',
34
+ green: '#0dbc79',
35
+ yellow: '#e5e510',
36
+ blue: '#2472c8',
37
+ magenta: '#bc3fbc',
38
+ cyan: '#11a8cd',
39
+ white: '#e5e5e5',
40
+ brightBlack: '#666666',
41
+ brightRed: '#f14c4c',
42
+ brightGreen: '#23d18b',
43
+ brightYellow: '#f5f543',
44
+ brightBlue: '#3b8eea',
45
+ brightMagenta: '#d670d6',
46
+ brightCyan: '#29b8db',
47
+ brightWhite: '#e5e5e5'
48
+ },
49
+ rows: 20
50
+ });
51
+
52
+ const fitAddon = new FitAddon();
53
+ const webLinksAddon = new WebLinksAddon();
54
+
55
+ term.loadAddon(fitAddon);
56
+ term.loadAddon(webLinksAddon);
57
+
58
+ term.open(terminalRef.current);
59
+ fitAddon.fit();
60
+
61
+ // Write initial prompt
62
+ term.writeln(`\x1b[32m➜\x1b[0m \x1b[34m${worktreePath}\x1b[0m`);
63
+ term.write('$ ');
64
+
65
+ // Handle input
66
+ let currentLine = '';
67
+ term.onData(data => {
68
+ const code = data.charCodeAt(0);
69
+
70
+ if (code === 13) { // Enter
71
+ term.writeln('');
72
+ if (currentLine.trim()) {
73
+ executeCommand(currentLine.trim());
74
+ } else {
75
+ term.write('$ ');
76
+ }
77
+ currentLine = '';
78
+ } else if (code === 127) { // Backspace
79
+ if (currentLine.length > 0) {
80
+ currentLine = currentLine.slice(0, -1);
81
+ term.write('\b \b');
82
+ }
83
+ } else if (code >= 32 && code <= 126) { // Printable characters
84
+ currentLine += data;
85
+ term.write(data);
86
+ }
87
+ });
88
+
89
+ xtermRef.current = term;
90
+ fitAddonRef.current = fitAddon;
91
+
92
+ // Handle resize
93
+ const handleResize = () => {
94
+ fitAddon.fit();
95
+ };
96
+ window.addEventListener('resize', handleResize);
97
+
98
+ return () => {
99
+ window.removeEventListener('resize', handleResize);
100
+ term.dispose();
101
+ };
102
+ }, [worktreePath]);
103
+
104
+ const executeCommand = async (command: string) => {
105
+ if (!xtermRef.current) return;
106
+
107
+ setIsRunning(true);
108
+ setCurrentCommand(command);
109
+
110
+ if (onCommand) {
111
+ onCommand(command);
112
+ }
113
+
114
+ try {
115
+ const result = await window.electronAPI.terminal.execute({
116
+ command,
117
+ cwd: worktreePath
118
+ });
119
+
120
+ if (result.stdout) {
121
+ xtermRef.current.writeln(result.stdout);
122
+ }
123
+
124
+ if (result.stderr) {
125
+ xtermRef.current.writeln(`\x1b[31m${result.stderr}\x1b[0m`);
126
+ }
127
+
128
+ if (result.error) {
129
+ xtermRef.current.writeln(`\x1b[31mError: ${result.error}\x1b[0m`);
130
+ }
131
+ } catch (error) {
132
+ xtermRef.current.writeln(`\x1b[31mFailed to execute command\x1b[0m`);
133
+ }
134
+
135
+ setIsRunning(false);
136
+ xtermRef.current.write('\x1b[32m➜\x1b[0m \x1b[34m$\x1b[0m ');
137
+ };
138
+
139
+ const clearTerminal = () => {
140
+ xtermRef.current?.clear();
141
+ xtermRef.current?.writeln(`\x1b[32m➜\x1b[0m \x1b[34m${worktreePath}\x1b[0m`);
142
+ xtermRef.current?.write('$ ');
143
+ };
144
+
145
+ return (
146
+ <div className="flex flex-col h-full bg-[#1e1e1e] rounded-lg overflow-hidden">
147
+ {/* Terminal Header */}
148
+ <div className="flex items-center justify-between px-3 py-2 bg-[#2d2d2d] border-b border-[#3e3e3e]">
149
+ <div className="flex items-center gap-2">
150
+ <span className="text-xs text-gray-400">Terminal</span>
151
+ <span className="text-xs text-gray-600">|</span>
152
+ <span className="text-xs text-gray-400 truncate max-w-xs">{worktreePath}</span>
153
+ </div>
154
+
155
+ <div className="flex items-center gap-1">
156
+ {isRunning && (
157
+ <div className="flex items-center gap-1 text-xs text-yellow-500 mr-2">
158
+ <div className="w-2 h-2 bg-yellow-500 rounded-full animate-pulse" />
159
+ Running...
160
+ </div>
161
+ )}
162
+
163
+ <button
164
+ onClick={() => {
165
+ if (isRunning) {
166
+ window.electronAPI.terminal.kill();
167
+ }
168
+ }}
169
+ disabled={!isRunning}
170
+ className="p-1.5 hover:bg-[#3e3e3e] rounded disabled:opacity-50"
171
+ title="Stop"
172
+ >
173
+ <Square className="w-3.5 h-3.5 text-red-400" />
174
+ </button>
175
+
176
+ <button
177
+ onClick={clearTerminal}
178
+ className="p-1.5 hover:bg-[#3e3e3e] rounded"
179
+ title="Clear"
180
+ >
181
+ <Trash2 className="w-3.5 h-3.5 text-gray-400" />
182
+ </button>
183
+ </div>
184
+ </div>
185
+
186
+ {/* Terminal Output */}
187
+ <div ref={terminalRef} className="flex-1 p-2 overflow-hidden" />
188
+ </div>
189
+ );
190
+ };