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,129 @@
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+ import { Mic, MicOff, Loader2 } from 'lucide-react';
3
+
4
+ interface VoiceCommandProps {
5
+ onCommand: (transcript: string) => void;
6
+ disabled?: boolean;
7
+ }
8
+
9
+ export const VoiceCommand: React.FC<VoiceCommandProps> = ({
10
+ onCommand,
11
+ disabled = false,
12
+ }) => {
13
+ const [isListening, setIsListening] = useState(false);
14
+ const [transcript, setTranscript] = useState('');
15
+ const [recognition, setRecognition] = useState<SpeechRecognition | null>(null);
16
+ const [error, setError] = useState<string | null>(null);
17
+
18
+ useEffect(() => {
19
+ if ('webkitSpeechRecognition' in window || 'SpeechRecognition' in window) {
20
+ const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
21
+ const rec = new SpeechRecognition();
22
+
23
+ rec.continuous = false;
24
+ rec.interimResults = true;
25
+ rec.lang = 'en-US';
26
+
27
+ rec.onstart = () => {
28
+ setIsListening(true);
29
+ setError(null);
30
+ };
31
+
32
+ rec.onresult = (event) => {
33
+ const current = event.resultIndex;
34
+ const transcript = event.results[current][0].transcript;
35
+ setTranscript(transcript);
36
+
37
+ if (event.results[current].isFinal) {
38
+ onCommand(transcript);
39
+ setTranscript('');
40
+ setIsListening(false);
41
+ }
42
+ };
43
+
44
+ rec.onerror = (event) => {
45
+ setError(event.error);
46
+ setIsListening(false);
47
+ };
48
+
49
+ rec.onend = () => {
50
+ setIsListening(false);
51
+ };
52
+
53
+ setRecognition(rec);
54
+ }
55
+ }, [onCommand]);
56
+
57
+ const toggleListening = useCallback(() => {
58
+ if (!recognition) {
59
+ setError('Speech recognition not supported');
60
+ return;
61
+ }
62
+
63
+ if (isListening) {
64
+ recognition.stop();
65
+ } else {
66
+ recognition.start();
67
+ }
68
+ }, [recognition, isListening]);
69
+
70
+ const supportedCommands = [
71
+ 'Create a new agent',
72
+ 'Open file [filename]',
73
+ 'Search for [query]',
74
+ 'Run tests',
75
+ 'Commit changes',
76
+ 'Explain this code',
77
+ 'Refactor this function',
78
+ ];
79
+
80
+ if (!recognition) {
81
+ return (
82
+ <button
83
+ disabled
84
+ className="p-2 text-muted-foreground cursor-not-allowed"
85
+ title="Voice commands not supported in this browser"
86
+ >
87
+ <MicOff className="w-5 h-5" />
88
+ </button>
89
+ );
90
+ }
91
+
92
+ return (
93
+ <div className="relative">
94
+ <button
95
+ onClick={toggleListening}
96
+ disabled={disabled}
97
+ className={`p-2 rounded-full transition-all ${
98
+ isListening
99
+ ? 'bg-red-500 text-white animate-pulse'
100
+ : 'hover:bg-muted text-muted-foreground hover:text-foreground'
101
+ } disabled:opacity-50`}
102
+ title={isListening ? 'Stop listening' : 'Start voice command'}
103
+ >
104
+ {isListening ? (
105
+ <Loader2 className="w-5 h-5 animate-spin" />
106
+ ) : (
107
+ <Mic className="w-5 h-5" />
108
+ )}
109
+ </button>
110
+
111
+ {isListening && (
112
+ <div className="absolute bottom-full mb-2 left-1/2 -translate-x-1/2 bg-card border border-border rounded-lg p-3 shadow-lg whitespace-nowrap z-50">
113
+ <div className="text-sm font-medium mb-2">
114
+ {transcript || 'Listening...'}
115
+ </div>
116
+ <div className="text-xs text-muted-foreground">
117
+ Try saying: "Create a new agent" or "Explain this code"
118
+ </div>
119
+ </div>
120
+ )}
121
+
122
+ {error && (
123
+ <div className="absolute bottom-full mb-2 left-1/2 -translate-x-1/2 bg-destructive text-destructive-foreground rounded-lg p-2 text-xs whitespace-nowrap">
124
+ {error}
125
+ </div>
126
+ )}
127
+ </div>
128
+ );
129
+ };
@@ -0,0 +1,163 @@
1
+ import React, { useState } from 'react';
2
+ import { Worktree } from '../../shared/types';
3
+ import { GitBranch, Plus, Folder, Trash2, GitMerge } from 'lucide-react';
4
+
5
+ interface WorktreePanelProps {
6
+ worktrees: Worktree[];
7
+ onCreateWorktree: (repoPath: string, name: string) => Promise<Worktree>;
8
+ }
9
+
10
+ export const WorktreePanel: React.FC<WorktreePanelProps> = ({
11
+ worktrees,
12
+ onCreateWorktree
13
+ }) => {
14
+ const [showCreateModal, setShowCreateModal] = useState(false);
15
+ const [newWorktreeConfig, setNewWorktreeConfig] = useState({
16
+ repoPath: '',
17
+ name: ''
18
+ });
19
+
20
+ const handleCreate = async () => {
21
+ try {
22
+ await onCreateWorktree(newWorktreeConfig.repoPath, newWorktreeConfig.name);
23
+ setShowCreateModal(false);
24
+ setNewWorktreeConfig({ repoPath: '', name: '' });
25
+ } catch (error) {
26
+ console.error('Failed to create worktree:', error);
27
+ }
28
+ };
29
+
30
+ return (
31
+ <div className="h-full flex flex-col">
32
+ <div className="p-4 border-b border-border flex items-center justify-between">
33
+ <div>
34
+ <h2 className="text-lg font-semibold">Worktrees</h2>
35
+ <p className="text-sm text-muted-foreground">Isolated workspaces for agents</p>
36
+ </div>
37
+ <button
38
+ onClick={() => setShowCreateModal(true)}
39
+ className="flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90"
40
+ >
41
+ <Plus className="w-4 h-4" />
42
+ New Worktree
43
+ </button>
44
+ </div>
45
+
46
+ <div className="flex-1 overflow-auto p-4">
47
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
48
+ {worktrees.map(worktree => (
49
+ <div
50
+ key={worktree.name}
51
+ className="p-4 bg-card border border-border rounded-lg"
52
+ >
53
+ <div className="flex items-start justify-between mb-3">
54
+ <div className="flex items-center gap-2">
55
+ <GitBranch className="w-5 h-5 text-muted-foreground" />
56
+ <span className="font-medium">{worktree.name}</span>
57
+ </div>
58
+ {worktree.isMain && (
59
+ <span className="px-2 py-0.5 bg-primary/10 text-primary text-xs rounded-full">
60
+ Main
61
+ </span>
62
+ )}
63
+ </div>
64
+
65
+ <div className="space-y-2 text-sm text-muted-foreground">
66
+ <div className="flex items-center gap-2">
67
+ <Folder className="w-4 h-4" />
68
+ <span className="truncate">{worktree.path}</span>
69
+ </div>
70
+ <div className="flex items-center gap-2">
71
+ <GitBranch className="w-4 h-4" />
72
+ <span>{worktree.branch}</span>
73
+ </div>
74
+ <div className="text-xs font-mono truncate">
75
+ {worktree.commit?.slice(0, 8)}
76
+ </div>
77
+ </div>
78
+
79
+ {!worktree.isMain && (
80
+ <div className="flex gap-2 mt-4 pt-4 border-t border-border">
81
+ <button className="flex-1 px-3 py-1.5 text-sm bg-muted rounded-md hover:bg-muted/80">
82
+ <GitMerge className="w-4 h-4 inline mr-1" />
83
+ Merge
84
+ </button>
85
+ <button className="p-1.5 text-destructive hover:bg-destructive/10 rounded-md">
86
+ <Trash2 className="w-4 h-4" />
87
+ </button>
88
+ </div>
89
+ )}
90
+ </div>
91
+ ))}
92
+
93
+ {worktrees.length === 0 && (
94
+ <div className="col-span-full flex flex-col items-center justify-center py-12 text-muted-foreground">
95
+ <GitBranch className="w-16 h-16 mb-4 opacity-30" />
96
+ <p className="text-lg font-medium">No worktrees yet</p>
97
+ <p className="text-sm">Create a worktree to isolate agent changes</p>
98
+ </div>
99
+ )}
100
+ </div>
101
+ </div>
102
+
103
+ {showCreateModal && (
104
+ <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
105
+ <div className="bg-card border border-border rounded-lg p-6 w-[500px]">
106
+ <h2 className="text-lg font-semibold mb-4">Create New Worktree</h2>
107
+
108
+ <div className="space-y-4">
109
+ <div>
110
+ <label className="block text-sm font-medium mb-1">Repository Path</label>
111
+ <div className="flex gap-2">
112
+ <input
113
+ type="text"
114
+ value={newWorktreeConfig.repoPath}
115
+ onChange={e => setNewWorktreeConfig({ ...newWorktreeConfig, repoPath: e.target.value })}
116
+ className="flex-1 px-3 py-2 bg-background border border-input rounded-md"
117
+ placeholder="/path/to/repo"
118
+ />
119
+ <button
120
+ onClick={async () => {
121
+ const path = await window.electronAPI.dialog.selectFolder();
122
+ if (path) setNewWorktreeConfig({ ...newWorktreeConfig, repoPath: path });
123
+ }}
124
+ className="px-3 py-2 bg-muted rounded-md"
125
+ >
126
+ Browse
127
+ </button>
128
+ </div>
129
+ </div>
130
+
131
+ <div>
132
+ <label className="block text-sm font-medium mb-1">Worktree Name</label>
133
+ <input
134
+ type="text"
135
+ value={newWorktreeConfig.name}
136
+ onChange={e => setNewWorktreeConfig({ ...newWorktreeConfig, name: e.target.value })}
137
+ className="w-full px-3 py-2 bg-background border border-input rounded-md"
138
+ placeholder="feature-branch"
139
+ />
140
+ </div>
141
+ </div>
142
+
143
+ <div className="flex justify-end gap-2 mt-6">
144
+ <button
145
+ onClick={() => setShowCreateModal(false)}
146
+ className="px-4 py-2 text-muted-foreground"
147
+ >
148
+ Cancel
149
+ </button>
150
+ <button
151
+ onClick={handleCreate}
152
+ disabled={!newWorktreeConfig.repoPath || !newWorktreeConfig.name}
153
+ className="px-4 py-2 bg-primary text-primary-foreground rounded-md disabled:opacity-50"
154
+ >
155
+ Create Worktree
156
+ </button>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ )}
161
+ </div>
162
+ );
163
+ };
@@ -0,0 +1,193 @@
1
+ import React from 'react';
2
+
3
+ interface SkipLinkProps {
4
+ targetId: string;
5
+ children: React.ReactNode;
6
+ }
7
+
8
+ export const SkipLink: React.FC<SkipLinkProps> = ({ targetId, children }) => {
9
+ const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
10
+ e.preventDefault();
11
+ const target = document.getElementById(targetId);
12
+ if (target) {
13
+ target.tabIndex = -1;
14
+ target.focus();
15
+ target.scrollIntoView({ behavior: 'smooth' });
16
+ }
17
+ };
18
+
19
+ return (
20
+ <a
21
+ href={`#${targetId}`}
22
+ onClick={handleClick}
23
+ className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 focus:z-50 focus:px-4 focus:py-2 focus:bg-primary focus:text-primary-foreground focus:rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2"
24
+ >
25
+ {children}
26
+ </a>
27
+ );
28
+ };
29
+
30
+ interface LiveRegionProps {
31
+ message: string;
32
+ politeness?: 'polite' | 'assertive';
33
+ atomic?: boolean;
34
+ }
35
+
36
+ export const LiveRegion: React.FC<LiveRegionProps> = ({
37
+ message,
38
+ politeness = 'polite',
39
+ atomic = true
40
+ }) => {
41
+ return (
42
+ <div
43
+ role="status"
44
+ aria-live={politeness}
45
+ aria-atomic={atomic}
46
+ className="sr-only"
47
+ >
48
+ {message}
49
+ </div>
50
+ );
51
+ };
52
+
53
+ interface VisuallyHiddenProps {
54
+ children: React.ReactNode;
55
+ as?: keyof JSX.IntrinsicElements;
56
+ }
57
+
58
+ export const VisuallyHidden: React.FC<VisuallyHiddenProps> = ({
59
+ children,
60
+ as: Component = 'span'
61
+ }) => {
62
+ return (
63
+ <Component className="sr-only">
64
+ {children}
65
+ </Component>
66
+ );
67
+ };
68
+
69
+ interface AriaButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
70
+ ariaLabel?: string;
71
+ ariaDescribedBy?: string;
72
+ ariaExpanded?: boolean;
73
+ ariaPressed?: boolean;
74
+ }
75
+
76
+ export const AriaButton: React.FC<AriaButtonProps> = ({
77
+ ariaLabel,
78
+ ariaDescribedBy,
79
+ ariaExpanded,
80
+ ariaPressed,
81
+ children,
82
+ ...props
83
+ }) => {
84
+ return (
85
+ <button
86
+ aria-label={ariaLabel}
87
+ aria-describedby={ariaDescribedBy}
88
+ aria-expanded={ariaExpanded}
89
+ aria-pressed={ariaPressed}
90
+ {...props}
91
+ >
92
+ {children}
93
+ </button>
94
+ );
95
+ };
96
+
97
+ interface AriaDialogProps {
98
+ isOpen: boolean;
99
+ onClose: () => void;
100
+ title: string;
101
+ description?: string;
102
+ children: React.ReactNode;
103
+ }
104
+
105
+ export const AriaDialog: React.FC<AriaDialogProps> = ({
106
+ isOpen,
107
+ onClose,
108
+ title,
109
+ description,
110
+ children
111
+ }) => {
112
+ React.useEffect(() => {
113
+ if (isOpen) {
114
+ const handleEscape = (e: KeyboardEvent) => {
115
+ if (e.key === 'Escape') {
116
+ onClose();
117
+ }
118
+ };
119
+ document.addEventListener('keydown', handleEscape);
120
+ return () => document.removeEventListener('keydown', handleEscape);
121
+ }
122
+ }, [isOpen, onClose]);
123
+
124
+ if (!isOpen) return null;
125
+
126
+ return (
127
+ <div
128
+ role="dialog"
129
+ aria-modal="true"
130
+ aria-labelledby="dialog-title"
131
+ aria-describedby={description ? 'dialog-description' : undefined}
132
+ className="fixed inset-0 z-50 flex items-center justify-center"
133
+ onClick={onClose}
134
+ >
135
+ <div className="fixed inset-0 bg-black/50" aria-hidden="true" />
136
+ <div
137
+ className="relative z-10 bg-background rounded-lg shadow-lg p-6 max-w-lg w-full mx-4"
138
+ onClick={e => e.stopPropagation()}
139
+ >
140
+ <h2 id="dialog-title" className="text-lg font-semibold mb-2">
141
+ {title}
142
+ </h2>
143
+ {description && (
144
+ <p id="dialog-description" className="text-sm text-muted-foreground mb-4">
145
+ {description}
146
+ </p>
147
+ )}
148
+ {children}
149
+ </div>
150
+ </div>
151
+ );
152
+ };
153
+
154
+ interface TooltipProps {
155
+ content: string;
156
+ children: React.ReactNode;
157
+ position?: 'top' | 'bottom' | 'left' | 'right';
158
+ }
159
+
160
+ export const Tooltip: React.FC<TooltipProps> = ({
161
+ content,
162
+ children,
163
+ position = 'top'
164
+ }) => {
165
+ const [isVisible, setIsVisible] = React.useState(false);
166
+
167
+ const positionClasses = {
168
+ top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',
169
+ bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',
170
+ left: 'right-full top-1/2 -translate-y-1/2 mr-2',
171
+ right: 'left-full top-1/2 -translate-y-1/2 ml-2'
172
+ };
173
+
174
+ return (
175
+ <div
176
+ className="relative inline-block"
177
+ onMouseEnter={() => setIsVisible(true)}
178
+ onMouseLeave={() => setIsVisible(false)}
179
+ onFocus={() => setIsVisible(true)}
180
+ onBlur={() => setIsVisible(false)}
181
+ >
182
+ {children}
183
+ {isVisible && (
184
+ <div
185
+ role="tooltip"
186
+ className={`absolute ${positionClasses[position]} z-50 px-2 py-1 text-xs bg-neutral-900 text-white rounded whitespace-nowrap`}
187
+ >
188
+ {content}
189
+ </div>
190
+ )}
191
+ </div>
192
+ );
193
+ };
@@ -0,0 +1,68 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+ import { Loader2 } from 'lucide-react';
4
+ import { cn } from '@/lib/utils';
5
+
6
+ const buttonVariants = cva(
7
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'bg-neutral-900 text-white hover:bg-neutral-800 active:scale-[0.98]',
12
+ secondary: 'bg-neutral-100 text-neutral-900 hover:bg-neutral-200 active:scale-[0.98]',
13
+ outline: 'border border-neutral-200 bg-transparent hover:bg-neutral-50 hover:border-neutral-300',
14
+ ghost: 'hover:bg-neutral-100 hover:text-neutral-900',
15
+ link: 'text-neutral-900 underline-offset-4 hover:underline',
16
+ subtle: 'bg-neutral-50 text-neutral-700 hover:bg-neutral-100',
17
+ danger: 'bg-red-50 text-red-600 hover:bg-red-100',
18
+ },
19
+ size: {
20
+ default: 'h-10 px-4 py-2',
21
+ sm: 'h-8 px-3 text-xs',
22
+ lg: 'h-12 px-6',
23
+ icon: 'h-10 w-10',
24
+ 'icon-sm': 'h-8 w-8',
25
+ },
26
+ },
27
+ defaultVariants: {
28
+ variant: 'default',
29
+ size: 'default',
30
+ },
31
+ }
32
+ );
33
+
34
+ export interface ButtonProps
35
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
36
+ VariantProps<typeof buttonVariants> {
37
+ loading?: boolean;
38
+ asChild?: boolean;
39
+ ariaLabel?: string;
40
+ ariaDescribedBy?: string;
41
+ ariaExpanded?: boolean;
42
+ ariaPressed?: boolean;
43
+ }
44
+
45
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
46
+ ({ className, variant, size, loading, children, disabled, ariaLabel, ariaDescribedBy, ariaExpanded, ariaPressed, ...props }, ref) => {
47
+ return (
48
+ <button
49
+ className={cn(buttonVariants({ variant, size, className }))}
50
+ ref={ref}
51
+ disabled={disabled || loading}
52
+ aria-label={ariaLabel}
53
+ aria-describedby={ariaDescribedBy}
54
+ aria-expanded={ariaExpanded}
55
+ aria-pressed={ariaPressed}
56
+ {...props}
57
+ >
58
+ {loading && (
59
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" aria-hidden="true" />
60
+ )}
61
+ {children}
62
+ </button>
63
+ );
64
+ }
65
+ );
66
+ Button.displayName = 'Button';
67
+
68
+ export { Button, buttonVariants };
@@ -0,0 +1,102 @@
1
+ import React from 'react';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const cardVariants = cva(
6
+ 'rounded-xl bg-white border border-neutral-200 shadow-sm transition-all duration-200',
7
+ {
8
+ variants: {
9
+ variant: {
10
+ default: 'hover:shadow-md hover:border-neutral-300',
11
+ ghost: 'border-transparent shadow-none hover:bg-neutral-50',
12
+ elevated: 'shadow-md hover:shadow-lg hover:-translate-y-0.5',
13
+ interactive: 'cursor-pointer hover:shadow-md hover:border-neutral-300 active:scale-[0.99]',
14
+ },
15
+ padding: {
16
+ none: '',
17
+ sm: 'p-4',
18
+ default: 'p-6',
19
+ lg: 'p-8',
20
+ },
21
+ },
22
+ defaultVariants: {
23
+ variant: 'default',
24
+ padding: 'default',
25
+ },
26
+ }
27
+ );
28
+
29
+ export interface CardProps
30
+ extends React.HTMLAttributes<HTMLDivElement>,
31
+ VariantProps<typeof cardVariants> {}
32
+
33
+ const Card = React.forwardRef<HTMLDivElement, CardProps>(
34
+ ({ className, variant, padding, ...props }, ref) => {
35
+ return (
36
+ <div
37
+ ref={ref}
38
+ className={cn(cardVariants({ variant, padding, className }))}
39
+ {...props}
40
+ />
41
+ );
42
+ }
43
+ );
44
+ Card.displayName = 'Card';
45
+
46
+ const CardHeader = React.forwardRef<
47
+ HTMLDivElement,
48
+ React.HTMLAttributes<HTMLDivElement>
49
+ >(({ className, ...props }, ref) => (
50
+ <div
51
+ ref={ref}
52
+ className={cn('flex flex-col space-y-1.5 pb-4', className)}
53
+ {...props}
54
+ />
55
+ ));
56
+ CardHeader.displayName = 'CardHeader';
57
+
58
+ const CardTitle = React.forwardRef<
59
+ HTMLParagraphElement,
60
+ React.HTMLAttributes<HTMLHeadingElement>
61
+ >(({ className, ...props }, ref) => (
62
+ <h3
63
+ ref={ref}
64
+ className={cn('font-semibold leading-none tracking-tight text-neutral-900', className)}
65
+ {...props}
66
+ />
67
+ ));
68
+ CardTitle.displayName = 'CardTitle';
69
+
70
+ const CardDescription = React.forwardRef<
71
+ HTMLParagraphElement,
72
+ React.HTMLAttributes<HTMLParagraphElement>
73
+ >(({ className, ...props }, ref) => (
74
+ <p
75
+ ref={ref}
76
+ className={cn('text-sm text-neutral-500', className)}
77
+ {...props}
78
+ />
79
+ ));
80
+ CardDescription.displayName = 'CardDescription';
81
+
82
+ const CardContent = React.forwardRef<
83
+ HTMLDivElement,
84
+ React.HTMLAttributes<HTMLDivElement>
85
+ >(({ className, ...props }, ref) => (
86
+ <div ref={ref} className={cn('', className)} {...props} />
87
+ ));
88
+ CardContent.displayName = 'CardContent';
89
+
90
+ const CardFooter = React.forwardRef<
91
+ HTMLDivElement,
92
+ React.HTMLAttributes<HTMLDivElement>
93
+ >(({ className, ...props }, ref) => (
94
+ <div
95
+ ref={ref}
96
+ className={cn('flex items-center pt-4 mt-4 border-t border-neutral-100', className)}
97
+ {...props}
98
+ />
99
+ ));
100
+ CardFooter.displayName = 'CardFooter';
101
+
102
+ export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter };
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const inputVariants = cva(
6
+ 'flex w-full rounded-lg border border-neutral-200 bg-transparent px-3 py-2 text-sm ring-offset-white file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-neutral-400 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200',
7
+ {
8
+ variants: {
9
+ variant: {
10
+ default: 'focus:border-neutral-400',
11
+ error: 'border-red-300 focus:border-red-500 focus:ring-red-200',
12
+ success: 'border-green-300 focus:border-green-500 focus:ring-green-200',
13
+ },
14
+ size: {
15
+ default: 'h-10',
16
+ sm: 'h-8 text-xs',
17
+ lg: 'h-12 text-base',
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ variant: 'default',
22
+ size: 'default',
23
+ },
24
+ }
25
+ );
26
+
27
+ export interface InputProps
28
+ extends React.InputHTMLAttributes<HTMLInputElement>,
29
+ VariantProps<typeof inputVariants> {}
30
+
31
+ const Input = React.forwardRef<HTMLInputElement, InputProps>(
32
+ ({ className, variant, size, ...props }, ref) => {
33
+ return (
34
+ <input
35
+ className={cn(inputVariants({ variant, size, className }))}
36
+ ref={ref}
37
+ {...props}
38
+ />
39
+ );
40
+ }
41
+ );
42
+ Input.displayName = 'Input';
43
+
44
+ export { Input };