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.
- package/.claude/settings.local.json +10 -0
- package/.eslintrc.json +27 -0
- package/.github/workflows/ci.yml +156 -0
- package/.huskyrc +7 -0
- package/.lintstagedrc +13 -0
- package/.prettierrc +12 -0
- package/CLAUDE.md +163 -0
- package/DESIGN_SUPERIOR.md +73 -0
- package/Dockerfile +64 -0
- package/INSTALLATION.md +152 -0
- package/LICENSE +21 -0
- package/README.md +245 -0
- package/assets/skills/code-review/instructions.md +102 -0
- package/assets/skills/code-review/skill.yaml +15 -0
- package/assets/skills/refactoring/instructions.md +149 -0
- package/assets/skills/refactoring/skill.yaml +15 -0
- package/assets/skills/testing/skill.yaml +15 -0
- package/commitlint.config.js +23 -0
- package/dist/main/DatabaseManager.js +763 -0
- package/dist/main/DatabaseManager.js.map +1 -0
- package/dist/main/SettingsManager.js +61 -0
- package/dist/main/SettingsManager.js.map +1 -0
- package/dist/main/agents/AgentOrchestrator.js +787 -0
- package/dist/main/agents/AgentOrchestrator.js.map +1 -0
- package/dist/main/agents/AgentSDK.js +219 -0
- package/dist/main/agents/AgentSDK.js.map +1 -0
- package/dist/main/agents/AgentTools.js +348 -0
- package/dist/main/agents/AgentTools.js.map +1 -0
- package/dist/main/agents/CodeIndex.js +233 -0
- package/dist/main/agents/CodeIndex.js.map +1 -0
- package/dist/main/agents/EmbeddingService.js +80 -0
- package/dist/main/agents/EmbeddingService.js.map +1 -0
- package/dist/main/agents/NativeToolCalling.js +206 -0
- package/dist/main/agents/NativeToolCalling.js.map +1 -0
- package/dist/main/api/APIServer.js +278 -0
- package/dist/main/api/APIServer.js.map +1 -0
- package/dist/main/api/RateLimiter.js +138 -0
- package/dist/main/api/RateLimiter.js.map +1 -0
- package/dist/main/api/WebSocketManager.js +300 -0
- package/dist/main/api/WebSocketManager.js.map +1 -0
- package/dist/main/assistant/ContextOptimizer.js +192 -0
- package/dist/main/assistant/ContextOptimizer.js.map +1 -0
- package/dist/main/assistant/PredictedOutputManager.js +172 -0
- package/dist/main/assistant/PredictedOutputManager.js.map +1 -0
- package/dist/main/assistant/PromptCacheManager.js +193 -0
- package/dist/main/assistant/PromptCacheManager.js.map +1 -0
- package/dist/main/assistant/PromptOptimizer.js +626 -0
- package/dist/main/assistant/PromptOptimizer.js.map +1 -0
- package/dist/main/assistant/SmartCodeAssistant.js +224 -0
- package/dist/main/assistant/SmartCodeAssistant.js.map +1 -0
- package/dist/main/auth/SessionManager.js +300 -0
- package/dist/main/auth/SessionManager.js.map +1 -0
- package/dist/main/automations/AdvancedWebhookSystem.js +212 -0
- package/dist/main/automations/AdvancedWebhookSystem.js.map +1 -0
- package/dist/main/automations/AutomationScheduler.js +269 -0
- package/dist/main/automations/AutomationScheduler.js.map +1 -0
- package/dist/main/automations/BatchProcessingSystem.js +159 -0
- package/dist/main/automations/BatchProcessingSystem.js.map +1 -0
- package/dist/main/automations/BrowserAutomationManager.js +195 -0
- package/dist/main/automations/BrowserAutomationManager.js.map +1 -0
- package/dist/main/automations/GitHubActionsManager.js +129 -0
- package/dist/main/automations/GitHubActionsManager.js.map +1 -0
- package/dist/main/automations/GitLabCIManager.js +122 -0
- package/dist/main/automations/GitLabCIManager.js.map +1 -0
- package/dist/main/automations/PriorityQueueManager.js +240 -0
- package/dist/main/automations/PriorityQueueManager.js.map +1 -0
- package/dist/main/background/BackgroundModeManager.js +117 -0
- package/dist/main/background/BackgroundModeManager.js.map +1 -0
- package/dist/main/backup/BackupManager.js +254 -0
- package/dist/main/backup/BackupManager.js.map +1 -0
- package/dist/main/backup/MigrationManager.js +114 -0
- package/dist/main/backup/MigrationManager.js.map +1 -0
- package/dist/main/commands/SlashCommandManager.js +399 -0
- package/dist/main/commands/SlashCommandManager.js.map +1 -0
- package/dist/main/config/ClaudeMdParser.js +519 -0
- package/dist/main/config/ClaudeMdParser.js.map +1 -0
- package/dist/main/config/CustomizationManager.js +381 -0
- package/dist/main/config/CustomizationManager.js.map +1 -0
- package/dist/main/config/LaunchConfigManager.js +211 -0
- package/dist/main/config/LaunchConfigManager.js.map +1 -0
- package/dist/main/config/SettingsManager.js +166 -0
- package/dist/main/config/SettingsManager.js.map +1 -0
- package/dist/main/connectors/ConnectorManager.js +151 -0
- package/dist/main/connectors/ConnectorManager.js.map +1 -0
- package/dist/main/connectors/DatabaseConnector.js +222 -0
- package/dist/main/connectors/DatabaseConnector.js.map +1 -0
- package/dist/main/cowork/CoworkManager.js +324 -0
- package/dist/main/cowork/CoworkManager.js.map +1 -0
- package/dist/main/evals/AgentEvalFramework.js +538 -0
- package/dist/main/evals/AgentEvalFramework.js.map +1 -0
- package/dist/main/evals/GraderManager.js +285 -0
- package/dist/main/evals/GraderManager.js.map +1 -0
- package/dist/main/git/GitWorktreeManager.js +214 -0
- package/dist/main/git/GitWorktreeManager.js.map +1 -0
- package/dist/main/github/GitHubPRMonitor.js +244 -0
- package/dist/main/github/GitHubPRMonitor.js.map +1 -0
- package/dist/main/ide/ContinueInManager.js +181 -0
- package/dist/main/ide/ContinueInManager.js.map +1 -0
- package/dist/main/ide/IDEIntegration.js +277 -0
- package/dist/main/ide/IDEIntegration.js.map +1 -0
- package/dist/main/integrations/LinearManager.js +252 -0
- package/dist/main/integrations/LinearManager.js.map +1 -0
- package/dist/main/integrations/SlackBotManager.js +247 -0
- package/dist/main/integrations/SlackBotManager.js.map +1 -0
- package/dist/main/lsp/LSPManager.js +394 -0
- package/dist/main/lsp/LSPManager.js.map +1 -0
- package/dist/main/main.js +1087 -0
- package/dist/main/main.js.map +1 -0
- package/dist/main/mcp/MCPConfigurationManager.js +281 -0
- package/dist/main/mcp/MCPConfigurationManager.js.map +1 -0
- package/dist/main/mcp/MCPManager.js +710 -0
- package/dist/main/mcp/MCPManager.js.map +1 -0
- package/dist/main/mcp/MCPRegistry.js +272 -0
- package/dist/main/mcp/MCPRegistry.js.map +1 -0
- package/dist/main/monitoring/ErrorRecoveryManager.js +268 -0
- package/dist/main/monitoring/ErrorRecoveryManager.js.map +1 -0
- package/dist/main/monitoring/ErrorTracker.js +57 -0
- package/dist/main/monitoring/ErrorTracker.js.map +1 -0
- package/dist/main/monitoring/MetricsCollector.js +155 -0
- package/dist/main/monitoring/MetricsCollector.js.map +1 -0
- package/dist/main/monitoring/TraceGradingSystem.js +148 -0
- package/dist/main/monitoring/TraceGradingSystem.js.map +1 -0
- package/dist/main/notifications/NotificationManager.js +67 -0
- package/dist/main/notifications/NotificationManager.js.map +1 -0
- package/dist/main/pair/AIPairProgramming.js +200 -0
- package/dist/main/pair/AIPairProgramming.js.map +1 -0
- package/dist/main/plugins/PluginManager.js +222 -0
- package/dist/main/plugins/PluginManager.js.map +1 -0
- package/dist/main/plugins/PluginMarketplace.js +237 -0
- package/dist/main/plugins/PluginMarketplace.js.map +1 -0
- package/dist/main/preload.js +189 -0
- package/dist/main/preload.js.map +1 -0
- package/dist/main/preview/PreviewSessionManager.js +170 -0
- package/dist/main/preview/PreviewSessionManager.js.map +1 -0
- package/dist/main/providers/AIProviderManager.js +327 -0
- package/dist/main/providers/AIProviderManager.js.map +1 -0
- package/dist/main/providers/FineTuningManager.js +276 -0
- package/dist/main/providers/FineTuningManager.js.map +1 -0
- package/dist/main/providers/FreeModelsProvider.js +1104 -0
- package/dist/main/providers/FreeModelsProvider.js.map +1 -0
- package/dist/main/realtime/RealtimeManager.js +116 -0
- package/dist/main/realtime/RealtimeManager.js.map +1 -0
- package/dist/main/remote/CloudEnvironmentManager.js +232 -0
- package/dist/main/remote/CloudEnvironmentManager.js.map +1 -0
- package/dist/main/remote/RemoteSessionManager.js +255 -0
- package/dist/main/remote/RemoteSessionManager.js.map +1 -0
- package/dist/main/search/DeepResearchManager.js +335 -0
- package/dist/main/search/DeepResearchManager.js.map +1 -0
- package/dist/main/search/WebSearchIntegration.js +147 -0
- package/dist/main/search/WebSearchIntegration.js.map +1 -0
- package/dist/main/security/AdminConsoleManager.js +223 -0
- package/dist/main/security/AdminConsoleManager.js.map +1 -0
- package/dist/main/security/AuditLogger.js +136 -0
- package/dist/main/security/AuditLogger.js.map +1 -0
- package/dist/main/security/PermissionManager.js +144 -0
- package/dist/main/security/PermissionManager.js.map +1 -0
- package/dist/main/security/SSOManager.js +173 -0
- package/dist/main/security/SSOManager.js.map +1 -0
- package/dist/main/security/SecurityManager.js +152 -0
- package/dist/main/security/SecurityManager.js.map +1 -0
- package/dist/main/skills/SkillsManager.js +223 -0
- package/dist/main/skills/SkillsManager.js.map +1 -0
- package/dist/main/ssh/SSHManager.js +65 -0
- package/dist/main/ssh/SSHManager.js.map +1 -0
- package/dist/main/streaming/StreamingManager.js +225 -0
- package/dist/main/streaming/StreamingManager.js.map +1 -0
- package/dist/main/sync/CloudSyncManager.js +422 -0
- package/dist/main/sync/CloudSyncManager.js.map +1 -0
- package/dist/main/types.js +28 -0
- package/dist/main/types.js.map +1 -0
- package/dist/main/verification/AutoVerifyManager.js +235 -0
- package/dist/main/verification/AutoVerifyManager.js.map +1 -0
- package/dist/main/vision/ComputerUseManager.js +376 -0
- package/dist/main/vision/ComputerUseManager.js.map +1 -0
- package/dist/main/vision/ImageVideoGenerationManager.js +401 -0
- package/dist/main/vision/ImageVideoGenerationManager.js.map +1 -0
- package/dist/main/vision/VisionManager.js +172 -0
- package/dist/main/vision/VisionManager.js.map +1 -0
- package/dist/renderer/assets/main-DJlZQBCA.js +304 -0
- package/dist/renderer/assets/main-N33ZXEr8.css +1 -0
- package/dist/renderer/index.html +21 -0
- package/dist/renderer/manifest.json +42 -0
- package/dist/renderer/sw.ts +109 -0
- package/dist/shared/types.js +35 -0
- package/dist/shared/types.js.map +1 -0
- package/docker-compose.yml +65 -0
- package/docs/API.md +307 -0
- package/docs/USER_GUIDE.md +476 -0
- package/examples/plugins/sample-plugin/package.json +41 -0
- package/examples/plugins/sample-plugin/src/index.ts +75 -0
- package/index.html +20 -0
- package/jest.config.js +39 -0
- package/package.json +180 -0
- package/packages/cli/package.json +29 -0
- package/packages/cli/src/commands/agents.ts +199 -0
- package/packages/cli/src/commands/tasks.ts +61 -0
- package/packages/cli/src/index.ts +91 -0
- package/packages/cli/src/utils/api.ts +45 -0
- package/packages/cli/src/utils/config.ts +61 -0
- package/packages/npm-installer/bin/codex-linux +126 -0
- package/packages/npm-installer/lib/download.js +273 -0
- package/packages/npm-installer/package.json +42 -0
- package/packages/vscode-extension/package.json +167 -0
- package/packages/vscode-extension/src/api.ts +68 -0
- package/packages/vscode-extension/src/extension.ts +161 -0
- package/packages/vscode-extension/src/panels/chatPanel.ts +265 -0
- package/packages/vscode-extension/src/panels/createAgentPanel.ts +227 -0
- package/packages/vscode-extension/src/providers/agentsProvider.ts +80 -0
- package/postcss.config.js +6 -0
- package/public/manifest.json +42 -0
- package/public/sw.ts +109 -0
- package/scripts/install-dev.sh +103 -0
- package/scripts/install.sh +275 -0
- package/src/main/DatabaseManager.ts +950 -0
- package/src/main/SettingsManager.ts +63 -0
- package/src/main/agents/AgentOrchestrator.ts +930 -0
- package/src/main/agents/AgentSDK.ts +269 -0
- package/src/main/agents/AgentTools.ts +380 -0
- package/src/main/agents/CodeIndex.ts +240 -0
- package/src/main/agents/EmbeddingService.ts +88 -0
- package/src/main/agents/NativeToolCalling.ts +245 -0
- package/src/main/api/APIServer.ts +316 -0
- package/src/main/api/RateLimiter.ts +165 -0
- package/src/main/api/WebSocketManager.ts +398 -0
- package/src/main/assistant/ContextOptimizer.ts +214 -0
- package/src/main/assistant/PredictedOutputManager.ts +265 -0
- package/src/main/assistant/PromptCacheManager.ts +280 -0
- package/src/main/assistant/PromptOptimizer.ts +746 -0
- package/src/main/assistant/SmartCodeAssistant.ts +234 -0
- package/src/main/auth/SessionManager.ts +415 -0
- package/src/main/automations/AdvancedWebhookSystem.ts +281 -0
- package/src/main/automations/AutomationScheduler.ts +272 -0
- package/src/main/automations/BatchProcessingSystem.ts +207 -0
- package/src/main/automations/BrowserAutomationManager.ts +203 -0
- package/src/main/automations/GitHubActionsManager.ts +151 -0
- package/src/main/automations/GitLabCIManager.ts +206 -0
- package/src/main/automations/PriorityQueueManager.ts +328 -0
- package/src/main/background/BackgroundModeManager.ts +130 -0
- package/src/main/backup/BackupManager.ts +287 -0
- package/src/main/backup/MigrationManager.ts +132 -0
- package/src/main/commands/SlashCommandManager.ts +407 -0
- package/src/main/config/ClaudeMdParser.ts +539 -0
- package/src/main/config/CustomizationManager.ts +493 -0
- package/src/main/config/LaunchConfigManager.ts +212 -0
- package/src/main/config/SettingsManager.ts +163 -0
- package/src/main/connectors/ConnectorManager.ts +175 -0
- package/src/main/connectors/DatabaseConnector.ts +212 -0
- package/src/main/cowork/CoworkManager.ts +431 -0
- package/src/main/evals/AgentEvalFramework.ts +665 -0
- package/src/main/evals/GraderManager.ts +417 -0
- package/src/main/git/GitWorktreeManager.ts +211 -0
- package/src/main/github/GitHubPRMonitor.ts +317 -0
- package/src/main/ide/ContinueInManager.ts +180 -0
- package/src/main/ide/IDEIntegration.ts +288 -0
- package/src/main/integrations/LinearManager.ts +327 -0
- package/src/main/integrations/SlackBotManager.ts +312 -0
- package/src/main/lsp/LSPManager.ts +445 -0
- package/src/main/main.ts +1221 -0
- package/src/main/mcp/MCPConfigurationManager.ts +281 -0
- package/src/main/mcp/MCPManager.ts +799 -0
- package/src/main/mcp/MCPRegistry.ts +273 -0
- package/src/main/monitoring/ErrorRecoveryManager.ts +359 -0
- package/src/main/monitoring/ErrorTracker.ts +60 -0
- package/src/main/monitoring/MetricsCollector.ts +196 -0
- package/src/main/monitoring/TraceGradingSystem.ts +196 -0
- package/src/main/notifications/NotificationManager.ts +96 -0
- package/src/main/pair/AIPairProgramming.ts +290 -0
- package/src/main/plugins/PluginManager.ts +266 -0
- package/src/main/plugins/PluginMarketplace.ts +318 -0
- package/src/main/preload.ts +215 -0
- package/src/main/preview/PreviewSessionManager.ts +186 -0
- package/src/main/providers/AIProviderManager.ts +394 -0
- package/src/main/providers/FineTuningManager.ts +390 -0
- package/src/main/providers/FreeModelsProvider.ts +1156 -0
- package/src/main/realtime/RealtimeManager.ts +147 -0
- package/src/main/remote/CloudEnvironmentManager.ts +253 -0
- package/src/main/remote/RemoteSessionManager.ts +323 -0
- package/src/main/search/DeepResearchManager.ts +458 -0
- package/src/main/search/WebSearchIntegration.ts +203 -0
- package/src/main/security/AdminConsoleManager.ts +244 -0
- package/src/main/security/AuditLogger.ts +143 -0
- package/src/main/security/PermissionManager.ts +184 -0
- package/src/main/security/SSOManager.ts +241 -0
- package/src/main/security/SecurityManager.ts +139 -0
- package/src/main/skills/SkillsManager.ts +218 -0
- package/src/main/ssh/SSHManager.ts +86 -0
- package/src/main/streaming/StreamingManager.ts +306 -0
- package/src/main/sync/CloudSyncManager.ts +532 -0
- package/src/main/verification/AutoVerifyManager.ts +285 -0
- package/src/main/vision/ComputerUseManager.ts +475 -0
- package/src/main/vision/ImageVideoGenerationManager.ts +526 -0
- package/src/main/vision/VisionManager.ts +186 -0
- package/src/renderer/App.tsx +314 -0
- package/src/renderer/components/AdvancedSettingsPanel.tsx +225 -0
- package/src/renderer/components/AgentPanel.tsx +760 -0
- package/src/renderer/components/AppPreview.tsx +220 -0
- package/src/renderer/components/AuditTrailPanel.tsx +148 -0
- package/src/renderer/components/AutomationPanel.tsx +220 -0
- package/src/renderer/components/ChatInterface.tsx +595 -0
- package/src/renderer/components/ChatTab.tsx +296 -0
- package/src/renderer/components/CodeEditor.tsx +257 -0
- package/src/renderer/components/CodeReviewPanel.tsx +256 -0
- package/src/renderer/components/CodeWorkspace.tsx +192 -0
- package/src/renderer/components/CodebaseDashboard.tsx +295 -0
- package/src/renderer/components/ComputerUsePanel.tsx +262 -0
- package/src/renderer/components/ConnectorsPanel.tsx +471 -0
- package/src/renderer/components/ContextMenu.tsx +155 -0
- package/src/renderer/components/ContextUsageDisplay.tsx +248 -0
- package/src/renderer/components/CoworkPanel.tsx +415 -0
- package/src/renderer/components/DiffViewer.tsx +452 -0
- package/src/renderer/components/ErrorBoundary.tsx +273 -0
- package/src/renderer/components/ExtendedThinkingToggle.tsx +244 -0
- package/src/renderer/components/FileAttachments.tsx +247 -0
- package/src/renderer/components/FileExplorer.tsx +242 -0
- package/src/renderer/components/FileExplorerPanel.tsx +302 -0
- package/src/renderer/components/GitPanel.tsx +154 -0
- package/src/renderer/components/Header.tsx +113 -0
- package/src/renderer/components/MCPPanel.tsx +326 -0
- package/src/renderer/components/MentionAutocomplete.tsx +239 -0
- package/src/renderer/components/PermissionPanel.tsx +159 -0
- package/src/renderer/components/PermissionSelector.tsx +203 -0
- package/src/renderer/components/PluginMarketplace.tsx +325 -0
- package/src/renderer/components/PromptOptimizerPanel.tsx +399 -0
- package/src/renderer/components/SearchPanel.tsx +173 -0
- package/src/renderer/components/SearchReplace.tsx +284 -0
- package/src/renderer/components/SessionSidebar.tsx +367 -0
- package/src/renderer/components/SettingsPanel.tsx +426 -0
- package/src/renderer/components/Sidebar.tsx +100 -0
- package/src/renderer/components/SkillsPanel.tsx +245 -0
- package/src/renderer/components/SplitPane.tsx +173 -0
- package/src/renderer/components/Terminal.tsx +190 -0
- package/src/renderer/components/VoiceCommand.tsx +129 -0
- package/src/renderer/components/WorktreePanel.tsx +163 -0
- package/src/renderer/components/ui/AriaComponents.tsx +193 -0
- package/src/renderer/components/ui/Button.tsx +68 -0
- package/src/renderer/components/ui/Card.tsx +102 -0
- package/src/renderer/components/ui/Input.tsx +44 -0
- package/src/renderer/components/ui/Skeleton.tsx +55 -0
- package/src/renderer/components/ui/VirtualList.tsx +196 -0
- package/src/renderer/i18n/I18nProvider.tsx +101 -0
- package/src/renderer/i18n/de.ts +161 -0
- package/src/renderer/i18n/en.ts +163 -0
- package/src/renderer/i18n/es.ts +161 -0
- package/src/renderer/i18n/fr.ts +161 -0
- package/src/renderer/i18n/index.ts +44 -0
- package/src/renderer/index.css +129 -0
- package/src/renderer/lib/accessibility.tsx +287 -0
- package/src/renderer/lib/hooks.ts +304 -0
- package/src/renderer/lib/utils.ts +6 -0
- package/src/renderer/main.tsx +25 -0
- package/src/renderer/styles/minimalist.css +539 -0
- package/src/renderer/sw.ts +180 -0
- package/src/renderer/types.d.ts +138 -0
- package/src/shared/types.ts +813 -0
- package/supabase/schema.sql +234 -0
- package/tailwind.config.js +78 -0
- package/tests/e2e/package.json +15 -0
- package/tests/e2e/playwright.config.ts +31 -0
- package/tests/e2e/specs/app.spec.ts +194 -0
- package/tests/setup.ts +99 -0
- package/tests/unit/AgentOrchestrator.test.ts +274 -0
- package/tests/unit/DatabaseManager.test.ts +262 -0
- package/tests/unit/GitWorktreeManager.test.ts +150 -0
- package/tests/unit/SecurityManager.test.ts +110 -0
- package/tsconfig.main.json +22 -0
- package/tsconfig.renderer.json +27 -0
- package/vite.config.ts +28 -0
|
@@ -0,0 +1,1087 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const electron_1 = require("electron");
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const fs = __importStar(require("fs/promises"));
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const electron_log_1 = __importDefault(require("electron-log"));
|
|
44
|
+
const electron_store_1 = __importDefault(require("electron-store"));
|
|
45
|
+
const electron_updater_1 = require("electron-updater");
|
|
46
|
+
const AgentOrchestrator_1 = require("./agents/AgentOrchestrator");
|
|
47
|
+
const GitWorktreeManager_1 = require("./git/GitWorktreeManager");
|
|
48
|
+
const SkillsManager_1 = require("./skills/SkillsManager");
|
|
49
|
+
const AutomationScheduler_1 = require("./automations/AutomationScheduler");
|
|
50
|
+
const DatabaseManager_1 = require("./DatabaseManager");
|
|
51
|
+
const SettingsManager_1 = require("./SettingsManager");
|
|
52
|
+
const AIProviderManager_1 = require("./providers/AIProviderManager");
|
|
53
|
+
const SecurityManager_1 = require("./security/SecurityManager");
|
|
54
|
+
const AuditLogger_1 = require("./security/AuditLogger");
|
|
55
|
+
const BackupManager_1 = require("./backup/BackupManager");
|
|
56
|
+
const MigrationManager_1 = require("./backup/MigrationManager");
|
|
57
|
+
const APIServer_1 = require("./api/APIServer");
|
|
58
|
+
const PluginManager_1 = require("./plugins/PluginManager");
|
|
59
|
+
const CoworkManager_1 = require("./cowork/CoworkManager");
|
|
60
|
+
const GitHubPRMonitor_1 = require("./github/GitHubPRMonitor");
|
|
61
|
+
const MCPManager_1 = require("./mcp/MCPManager");
|
|
62
|
+
const AIPairProgramming_1 = require("./pair/AIPairProgramming");
|
|
63
|
+
const ErrorTracker_1 = require("./monitoring/ErrorTracker");
|
|
64
|
+
const MetricsCollector_1 = require("./monitoring/MetricsCollector");
|
|
65
|
+
const NotificationManager_1 = require("./notifications/NotificationManager");
|
|
66
|
+
const SmartCodeAssistant_1 = require("./assistant/SmartCodeAssistant");
|
|
67
|
+
const zod_1 = require("zod");
|
|
68
|
+
// Validation schemas
|
|
69
|
+
const AgentConfigSchema = zod_1.z.object({
|
|
70
|
+
name: zod_1.z.string().min(1).max(100),
|
|
71
|
+
projectPath: zod_1.z.string().min(1),
|
|
72
|
+
providerId: zod_1.z.string(),
|
|
73
|
+
model: zod_1.z.string(),
|
|
74
|
+
skills: zod_1.z.array(zod_1.z.string()).optional(),
|
|
75
|
+
systemPrompt: zod_1.z.string().optional(),
|
|
76
|
+
}).strict();
|
|
77
|
+
const store = new electron_store_1.default();
|
|
78
|
+
let mainWindow = null;
|
|
79
|
+
let agentOrchestrator;
|
|
80
|
+
let gitWorktreeManager;
|
|
81
|
+
let skillsManager;
|
|
82
|
+
let automationScheduler;
|
|
83
|
+
let dbManager;
|
|
84
|
+
let settingsManager;
|
|
85
|
+
let aiProviderManager;
|
|
86
|
+
let securityManager;
|
|
87
|
+
let auditLogger;
|
|
88
|
+
let backupManager;
|
|
89
|
+
let migrationManager;
|
|
90
|
+
let apiServer;
|
|
91
|
+
let pluginManager;
|
|
92
|
+
let coworkManager;
|
|
93
|
+
let githubPRMonitor;
|
|
94
|
+
let mcpManager;
|
|
95
|
+
let aiPairProgramming;
|
|
96
|
+
let errorTracker;
|
|
97
|
+
let notificationManager;
|
|
98
|
+
let smartCodeAssistant;
|
|
99
|
+
electron_log_1.default.info('Starting Codex Linux...');
|
|
100
|
+
function createWindow() {
|
|
101
|
+
mainWindow = new electron_1.BrowserWindow({
|
|
102
|
+
width: 1600,
|
|
103
|
+
height: 1000,
|
|
104
|
+
minWidth: 1200,
|
|
105
|
+
minHeight: 800,
|
|
106
|
+
titleBarStyle: 'hiddenInset',
|
|
107
|
+
webPreferences: {
|
|
108
|
+
nodeIntegration: false,
|
|
109
|
+
contextIsolation: true,
|
|
110
|
+
preload: path.join(__dirname, 'preload.js'),
|
|
111
|
+
sandbox: false
|
|
112
|
+
},
|
|
113
|
+
show: false,
|
|
114
|
+
icon: path.join(__dirname, '../../assets/icon.png')
|
|
115
|
+
});
|
|
116
|
+
if (process.env.VITE_DEV_SERVER_URL) {
|
|
117
|
+
mainWindow.loadURL(process.env.VITE_DEV_SERVER_URL);
|
|
118
|
+
mainWindow.webContents.openDevTools();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
mainWindow.loadFile(path.join(__dirname, '../renderer/index.html'));
|
|
122
|
+
}
|
|
123
|
+
mainWindow.once('ready-to-show', () => {
|
|
124
|
+
mainWindow?.show();
|
|
125
|
+
});
|
|
126
|
+
mainWindow.on('closed', () => {
|
|
127
|
+
mainWindow = null;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
let tray = null;
|
|
131
|
+
function createTray() {
|
|
132
|
+
const iconPath = path.join(__dirname, '../../assets/icon.png');
|
|
133
|
+
try {
|
|
134
|
+
const icon = electron_1.nativeImage.createFromPath(iconPath);
|
|
135
|
+
tray = new electron_1.Tray(icon.isEmpty() ? electron_1.nativeImage.createEmpty() : icon);
|
|
136
|
+
const contextMenu = electron_1.Menu.buildFromTemplate([
|
|
137
|
+
{
|
|
138
|
+
label: 'Show Codex',
|
|
139
|
+
click: () => {
|
|
140
|
+
if (mainWindow) {
|
|
141
|
+
mainWindow.show();
|
|
142
|
+
mainWindow.focus();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{ type: 'separator' },
|
|
147
|
+
{
|
|
148
|
+
label: 'New Agent',
|
|
149
|
+
click: () => {
|
|
150
|
+
if (mainWindow) {
|
|
151
|
+
mainWindow.show();
|
|
152
|
+
mainWindow.webContents.send('create-new-agent');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
label: 'Open Settings',
|
|
158
|
+
click: () => {
|
|
159
|
+
if (mainWindow) {
|
|
160
|
+
mainWindow.show();
|
|
161
|
+
mainWindow.webContents.send('open-settings');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
{ type: 'separator' },
|
|
166
|
+
{
|
|
167
|
+
label: 'Quit',
|
|
168
|
+
click: () => {
|
|
169
|
+
electron_1.app.quit();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
]);
|
|
173
|
+
tray.setToolTip('Codex Linux');
|
|
174
|
+
tray.setContextMenu(contextMenu);
|
|
175
|
+
tray.on('click', () => {
|
|
176
|
+
if (mainWindow) {
|
|
177
|
+
if (mainWindow.isVisible()) {
|
|
178
|
+
mainWindow.hide();
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
mainWindow.show();
|
|
182
|
+
mainWindow.focus();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
electron_log_1.default.info('System tray initialized');
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
electron_log_1.default.warn('Failed to create system tray:', error);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function registerGlobalShortcuts() {
|
|
193
|
+
try {
|
|
194
|
+
electron_1.globalShortcut.register('CommandOrControl+Shift+C', () => {
|
|
195
|
+
if (mainWindow) {
|
|
196
|
+
if (mainWindow.isVisible()) {
|
|
197
|
+
mainWindow.hide();
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
mainWindow.show();
|
|
201
|
+
mainWindow.focus();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
electron_1.globalShortcut.register('CommandOrControl+Shift+N', () => {
|
|
206
|
+
if (mainWindow) {
|
|
207
|
+
mainWindow.show();
|
|
208
|
+
mainWindow.webContents.send('create-new-agent');
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
electron_1.globalShortcut.register('CommandOrControl+Shift+K', () => {
|
|
212
|
+
if (mainWindow) {
|
|
213
|
+
mainWindow.show();
|
|
214
|
+
mainWindow.webContents.send('open-search');
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
electron_log_1.default.info('Global shortcuts registered');
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
electron_log_1.default.warn('Failed to register global shortcuts:', error);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async function initializeServices() {
|
|
224
|
+
try {
|
|
225
|
+
// Initialize security first
|
|
226
|
+
securityManager = new SecurityManager_1.SecurityManager();
|
|
227
|
+
await securityManager.initialize();
|
|
228
|
+
electron_log_1.default.info('Security manager initialized');
|
|
229
|
+
// Initialize database
|
|
230
|
+
dbManager = new DatabaseManager_1.DatabaseManager();
|
|
231
|
+
await dbManager.initialize();
|
|
232
|
+
electron_log_1.default.info('Database initialized');
|
|
233
|
+
// Run migrations
|
|
234
|
+
migrationManager = new MigrationManager_1.MigrationManager(dbManager);
|
|
235
|
+
await migrationManager.initialize();
|
|
236
|
+
electron_log_1.default.info('Migrations completed');
|
|
237
|
+
// Initialize settings
|
|
238
|
+
settingsManager = new SettingsManager_1.SettingsManager(store);
|
|
239
|
+
electron_log_1.default.info('Settings manager initialized');
|
|
240
|
+
// Initialize AI provider manager
|
|
241
|
+
aiProviderManager = new AIProviderManager_1.AIProviderManager(settingsManager);
|
|
242
|
+
electron_log_1.default.info('AI provider manager initialized');
|
|
243
|
+
// Initialize notification manager
|
|
244
|
+
notificationManager = new NotificationManager_1.NotificationManager();
|
|
245
|
+
electron_log_1.default.info('Notification manager initialized');
|
|
246
|
+
// Initialize Git worktree manager
|
|
247
|
+
gitWorktreeManager = new GitWorktreeManager_1.GitWorktreeManager();
|
|
248
|
+
electron_log_1.default.info('Git worktree manager initialized');
|
|
249
|
+
// Initialize skills manager
|
|
250
|
+
skillsManager = new SkillsManager_1.SkillsManager();
|
|
251
|
+
await skillsManager.initialize();
|
|
252
|
+
electron_log_1.default.info('Skills manager initialized');
|
|
253
|
+
// Initialize automation scheduler
|
|
254
|
+
automationScheduler = new AutomationScheduler_1.AutomationScheduler();
|
|
255
|
+
automationScheduler.setNotificationManager(notificationManager);
|
|
256
|
+
await automationScheduler.initialize();
|
|
257
|
+
electron_log_1.default.info('Automation scheduler initialized');
|
|
258
|
+
// Initialize agent orchestrator
|
|
259
|
+
agentOrchestrator = new AgentOrchestrator_1.AgentOrchestrator(aiProviderManager, gitWorktreeManager, skillsManager, dbManager);
|
|
260
|
+
await agentOrchestrator.initialize();
|
|
261
|
+
electron_log_1.default.info('Agent orchestrator initialized');
|
|
262
|
+
agentOrchestrator.on('changes:created', (payload) => {
|
|
263
|
+
if (mainWindow) {
|
|
264
|
+
mainWindow.webContents.send('changes:created', payload);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
agentOrchestrator.on('agent:taskCompleted', (payload) => {
|
|
268
|
+
if (mainWindow) {
|
|
269
|
+
mainWindow.webContents.send('agent:taskCompleted', payload);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
agentOrchestrator.on('agent:taskStarted', (payload) => {
|
|
273
|
+
if (mainWindow) {
|
|
274
|
+
mainWindow.webContents.send('agent:taskStarted', payload);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
agentOrchestrator.on('agent:taskFailed', (payload) => {
|
|
278
|
+
if (mainWindow) {
|
|
279
|
+
mainWindow.webContents.send('agent:taskFailed', payload);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
agentOrchestrator.on('agent:paused', (payload) => {
|
|
283
|
+
if (mainWindow) {
|
|
284
|
+
mainWindow.webContents.send('agent:paused', payload);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
agentOrchestrator.on('agent:resumed', (payload) => {
|
|
288
|
+
if (mainWindow) {
|
|
289
|
+
mainWindow.webContents.send('agent:resumed', payload);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
agentOrchestrator.on('agent:stopped', (payload) => {
|
|
293
|
+
if (mainWindow) {
|
|
294
|
+
mainWindow.webContents.send('agent:stopped', payload);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
// Initialize backup manager
|
|
298
|
+
backupManager = new BackupManager_1.BackupManager();
|
|
299
|
+
await backupManager.initialize();
|
|
300
|
+
electron_log_1.default.info('Backup manager initialized');
|
|
301
|
+
// Initialize plugin manager
|
|
302
|
+
pluginManager = new PluginManager_1.PluginManager();
|
|
303
|
+
await pluginManager.initialize();
|
|
304
|
+
electron_log_1.default.info('Plugin manager initialized');
|
|
305
|
+
// Initialize cowork manager
|
|
306
|
+
coworkManager = new CoworkManager_1.CoworkManager(agentOrchestrator, dbManager, notificationManager);
|
|
307
|
+
await coworkManager.initialize();
|
|
308
|
+
electron_log_1.default.info('Cowork manager initialized');
|
|
309
|
+
// Initialize AI pair programming
|
|
310
|
+
aiPairProgramming = new AIPairProgramming_1.AIPairProgramming(agentOrchestrator, aiProviderManager);
|
|
311
|
+
electron_log_1.default.info('AI pair programming initialized');
|
|
312
|
+
// Initialize smart code assistant
|
|
313
|
+
smartCodeAssistant = new SmartCodeAssistant_1.SmartCodeAssistant(aiProviderManager);
|
|
314
|
+
electron_log_1.default.info('Smart code assistant initialized');
|
|
315
|
+
// Initialize MCP manager
|
|
316
|
+
mcpManager = new MCPManager_1.MCPManager();
|
|
317
|
+
await mcpManager.initialize();
|
|
318
|
+
electron_log_1.default.info('MCP manager initialized');
|
|
319
|
+
// Initialize audit logger
|
|
320
|
+
auditLogger = new AuditLogger_1.AuditLogger();
|
|
321
|
+
await auditLogger.initialize();
|
|
322
|
+
electron_log_1.default.info('Audit logger initialized');
|
|
323
|
+
const sentryDsn = settingsManager.get('sentryDsn');
|
|
324
|
+
if (sentryDsn) {
|
|
325
|
+
errorTracker = new ErrorTracker_1.ErrorTracker();
|
|
326
|
+
errorTracker.initialize(sentryDsn);
|
|
327
|
+
electron_log_1.default.info('Error tracker initialized');
|
|
328
|
+
}
|
|
329
|
+
// Start system metrics
|
|
330
|
+
(0, MetricsCollector_1.startSystemMetrics)();
|
|
331
|
+
electron_log_1.default.info('System metrics started');
|
|
332
|
+
// Initialize API server
|
|
333
|
+
apiServer = new APIServer_1.APIServer(agentOrchestrator, securityManager, auditLogger);
|
|
334
|
+
await apiServer.start();
|
|
335
|
+
electron_log_1.default.info('API server started on port 3001');
|
|
336
|
+
// Initialize GitHub PR Monitor if token available
|
|
337
|
+
const githubToken = settingsManager.get('githubToken');
|
|
338
|
+
if (githubToken) {
|
|
339
|
+
githubPRMonitor = new GitHubPRMonitor_1.GitHubPRMonitor(githubToken, agentOrchestrator, gitWorktreeManager, notificationManager);
|
|
340
|
+
await githubPRMonitor.initialize();
|
|
341
|
+
electron_log_1.default.info('GitHub PR monitor initialized');
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
electron_log_1.default.error('Failed to initialize services:', error);
|
|
346
|
+
throw error;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// App event handlers
|
|
350
|
+
electron_1.app.whenReady().then(async () => {
|
|
351
|
+
try {
|
|
352
|
+
await initializeServices();
|
|
353
|
+
createWindow();
|
|
354
|
+
createTray();
|
|
355
|
+
registerGlobalShortcuts();
|
|
356
|
+
setupIPC();
|
|
357
|
+
setupAutoUpdater();
|
|
358
|
+
setupAutoUpdaterIPC();
|
|
359
|
+
electron_1.app.on('activate', () => {
|
|
360
|
+
if (electron_1.BrowserWindow.getAllWindows().length === 0) {
|
|
361
|
+
createWindow();
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
electron_log_1.default.error('Failed to start application:', error);
|
|
367
|
+
electron_1.dialog.showErrorBox('Startup Error', 'Failed to initialize Codex Linux. Please check the logs.');
|
|
368
|
+
electron_1.app.quit();
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
electron_1.app.on('window-all-closed', () => {
|
|
372
|
+
if (process.platform !== 'darwin') {
|
|
373
|
+
electron_1.app.quit();
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
electron_1.app.on('before-quit', async () => {
|
|
377
|
+
await cleanup();
|
|
378
|
+
});
|
|
379
|
+
function setupAutoUpdater() {
|
|
380
|
+
if (electron_1.app.isPackaged) {
|
|
381
|
+
electron_updater_1.autoUpdater.logger = electron_log_1.default;
|
|
382
|
+
electron_updater_1.autoUpdater.autoDownload = true;
|
|
383
|
+
electron_updater_1.autoUpdater.autoInstallOnAppQuit = true;
|
|
384
|
+
electron_updater_1.autoUpdater.on('checking-for-update', () => {
|
|
385
|
+
electron_log_1.default.info('Checking for updates...');
|
|
386
|
+
});
|
|
387
|
+
electron_updater_1.autoUpdater.on('update-available', (info) => {
|
|
388
|
+
electron_log_1.default.info('Update available:', info.version);
|
|
389
|
+
if (mainWindow) {
|
|
390
|
+
mainWindow.webContents.send('update-available', info);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
electron_updater_1.autoUpdater.on('update-not-available', () => {
|
|
394
|
+
electron_log_1.default.info('No updates available');
|
|
395
|
+
});
|
|
396
|
+
electron_updater_1.autoUpdater.on('download-progress', (progress) => {
|
|
397
|
+
electron_log_1.default.info(`Download progress: ${progress.percent}%`);
|
|
398
|
+
if (mainWindow) {
|
|
399
|
+
mainWindow.webContents.send('update-progress', progress);
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
electron_updater_1.autoUpdater.on('update-downloaded', (info) => {
|
|
403
|
+
electron_log_1.default.info('Update downloaded:', info.version);
|
|
404
|
+
if (mainWindow) {
|
|
405
|
+
mainWindow.webContents.send('update-downloaded', info);
|
|
406
|
+
}
|
|
407
|
+
if (electron_1.Notification.isSupported()) {
|
|
408
|
+
new electron_1.Notification({
|
|
409
|
+
title: 'Update Ready',
|
|
410
|
+
body: `Codex Linux ${info.version} is ready to install. Restart to update.`
|
|
411
|
+
}).show();
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
electron_updater_1.autoUpdater.on('error', (error) => {
|
|
415
|
+
electron_log_1.default.error('Auto-updater error:', error);
|
|
416
|
+
});
|
|
417
|
+
electron_updater_1.autoUpdater.checkForUpdatesAndNotify().catch(err => {
|
|
418
|
+
electron_log_1.default.warn('Failed to check for updates:', err);
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
function setupAutoUpdaterIPC() {
|
|
423
|
+
electron_1.ipcMain.handle('update:check', async () => {
|
|
424
|
+
if (!electron_1.app.isPackaged) {
|
|
425
|
+
return { available: false, message: 'Updates only work in packaged app' };
|
|
426
|
+
}
|
|
427
|
+
try {
|
|
428
|
+
const result = await electron_updater_1.autoUpdater.checkForUpdates();
|
|
429
|
+
return { available: !!result?.updateInfo, version: result?.updateInfo?.version };
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
electron_log_1.default.error('Update check failed:', error);
|
|
433
|
+
return { available: false, message: 'Update check failed' };
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
electron_1.ipcMain.handle('update:download', async () => {
|
|
437
|
+
if (!electron_1.app.isPackaged) {
|
|
438
|
+
return { success: false, message: 'Updates only work in packaged app' };
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
await electron_updater_1.autoUpdater.downloadUpdate();
|
|
442
|
+
return { success: true };
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
electron_log_1.default.error('Update download failed:', error);
|
|
446
|
+
return { success: false, message: 'Update download failed' };
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
electron_1.ipcMain.handle('update:install', () => {
|
|
450
|
+
electron_updater_1.autoUpdater.quitAndInstall(false, true);
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
async function cleanup() {
|
|
454
|
+
electron_log_1.default.info('Starting cleanup...');
|
|
455
|
+
try {
|
|
456
|
+
electron_1.globalShortcut.unregisterAll();
|
|
457
|
+
tray?.destroy();
|
|
458
|
+
tray = null;
|
|
459
|
+
if (agentOrchestrator) {
|
|
460
|
+
agentOrchestrator.removeAllListeners('changes:created');
|
|
461
|
+
agentOrchestrator.removeAllListeners('agent:taskCompleted');
|
|
462
|
+
agentOrchestrator.removeAllListeners('agent:taskStarted');
|
|
463
|
+
agentOrchestrator.removeAllListeners('agent:taskFailed');
|
|
464
|
+
agentOrchestrator.removeAllListeners('agent:paused');
|
|
465
|
+
agentOrchestrator.removeAllListeners('agent:resumed');
|
|
466
|
+
agentOrchestrator.removeAllListeners('agent:stopped');
|
|
467
|
+
}
|
|
468
|
+
await Promise.all([
|
|
469
|
+
agentOrchestrator?.cleanup(),
|
|
470
|
+
automationScheduler?.cleanup(),
|
|
471
|
+
coworkManager?.cleanup(),
|
|
472
|
+
apiServer?.stop(),
|
|
473
|
+
pluginManager?.cleanup(),
|
|
474
|
+
mcpManager?.cleanup(),
|
|
475
|
+
githubPRMonitor?.cleanup(),
|
|
476
|
+
backupManager?.cleanup?.(),
|
|
477
|
+
auditLogger?.cleanup?.(),
|
|
478
|
+
dbManager?.close()
|
|
479
|
+
]);
|
|
480
|
+
electron_log_1.default.info('Cleanup completed');
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
electron_log_1.default.error('Error during cleanup:', error);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
function setupIPC() {
|
|
487
|
+
// Window controls
|
|
488
|
+
electron_1.ipcMain.handle('window:minimize', () => {
|
|
489
|
+
mainWindow?.minimize();
|
|
490
|
+
});
|
|
491
|
+
electron_1.ipcMain.handle('window:maximize', () => {
|
|
492
|
+
if (mainWindow?.isMaximized()) {
|
|
493
|
+
mainWindow.unmaximize();
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
mainWindow?.maximize();
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
electron_1.ipcMain.handle('window:close', () => {
|
|
500
|
+
mainWindow?.close();
|
|
501
|
+
});
|
|
502
|
+
// File system operations
|
|
503
|
+
electron_1.ipcMain.handle('dialog:selectFolder', async () => {
|
|
504
|
+
if (!mainWindow) {
|
|
505
|
+
throw new Error('No main window available');
|
|
506
|
+
}
|
|
507
|
+
const result = await electron_1.dialog.showOpenDialog(mainWindow, {
|
|
508
|
+
properties: ['openDirectory']
|
|
509
|
+
});
|
|
510
|
+
return result.filePaths[0] || null;
|
|
511
|
+
});
|
|
512
|
+
electron_1.ipcMain.handle('dialog:selectFile', async (event, filters) => {
|
|
513
|
+
if (!mainWindow) {
|
|
514
|
+
throw new Error('No main window available');
|
|
515
|
+
}
|
|
516
|
+
const result = await electron_1.dialog.showOpenDialog(mainWindow, {
|
|
517
|
+
properties: ['openFile'],
|
|
518
|
+
filters
|
|
519
|
+
});
|
|
520
|
+
return result.filePaths[0] || null;
|
|
521
|
+
});
|
|
522
|
+
electron_1.ipcMain.handle('shell:openExternal', (event, url) => {
|
|
523
|
+
electron_1.shell.openExternal(url);
|
|
524
|
+
});
|
|
525
|
+
electron_1.ipcMain.handle('shell:openPath', (event, path) => {
|
|
526
|
+
electron_1.shell.openPath(path);
|
|
527
|
+
});
|
|
528
|
+
// Agent operations with validation
|
|
529
|
+
electron_1.ipcMain.handle('agent:create', async (event, config) => {
|
|
530
|
+
try {
|
|
531
|
+
const validatedConfig = AgentConfigSchema.parse(config);
|
|
532
|
+
const result = await agentOrchestrator.createAgent(validatedConfig);
|
|
533
|
+
await auditLogger.log('agent_created', { agentId: result.id });
|
|
534
|
+
return result;
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
electron_log_1.default.error('Failed to create agent:', error);
|
|
538
|
+
throw error;
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
electron_1.ipcMain.handle('agent:list', async () => {
|
|
542
|
+
return await agentOrchestrator.listAgents();
|
|
543
|
+
});
|
|
544
|
+
electron_1.ipcMain.handle('agent:get', async (event, agentId) => {
|
|
545
|
+
return await agentOrchestrator.getAgent(agentId);
|
|
546
|
+
});
|
|
547
|
+
electron_1.ipcMain.handle('agent:sendMessage', async (event, agentId, message) => {
|
|
548
|
+
try {
|
|
549
|
+
return await agentOrchestrator.sendMessage(agentId, message);
|
|
550
|
+
}
|
|
551
|
+
catch (error) {
|
|
552
|
+
electron_log_1.default.error('Failed to send message:', error);
|
|
553
|
+
throw error;
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
electron_1.ipcMain.handle('agent:sendMessageStream', async (event, agentId, message) => {
|
|
557
|
+
try {
|
|
558
|
+
const stream = await agentOrchestrator.sendMessageStream(agentId, message, {
|
|
559
|
+
onChunk: (chunk) => {
|
|
560
|
+
event.sender.send('agent:streamChunk', { agentId, chunk });
|
|
561
|
+
},
|
|
562
|
+
onComplete: () => {
|
|
563
|
+
event.sender.send('agent:streamEnd', { agentId });
|
|
564
|
+
},
|
|
565
|
+
onError: (error) => {
|
|
566
|
+
event.sender.send('agent:streamError', { agentId, error: error.message });
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
return { success: true };
|
|
570
|
+
}
|
|
571
|
+
catch (error) {
|
|
572
|
+
electron_log_1.default.error('Failed to start stream:', error);
|
|
573
|
+
throw error;
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
electron_1.ipcMain.handle('agent:executeTask', async (event, agentId, task) => {
|
|
577
|
+
return await agentOrchestrator.executeTask(agentId, task);
|
|
578
|
+
});
|
|
579
|
+
electron_1.ipcMain.handle('agent:pause', async (event, agentId) => {
|
|
580
|
+
return await agentOrchestrator.pauseAgent(agentId);
|
|
581
|
+
});
|
|
582
|
+
electron_1.ipcMain.handle('agent:resume', async (event, agentId) => {
|
|
583
|
+
return await agentOrchestrator.resumeAgent(agentId);
|
|
584
|
+
});
|
|
585
|
+
electron_1.ipcMain.handle('agent:stop', async (event, agentId) => {
|
|
586
|
+
return await agentOrchestrator.stopAgent(agentId);
|
|
587
|
+
});
|
|
588
|
+
electron_1.ipcMain.handle('agent:delete', async (event, agentId) => {
|
|
589
|
+
try {
|
|
590
|
+
await agentOrchestrator.deleteAgent(agentId);
|
|
591
|
+
await auditLogger.log('agent_deleted', { agentId });
|
|
592
|
+
return { success: true };
|
|
593
|
+
}
|
|
594
|
+
catch (error) {
|
|
595
|
+
electron_log_1.default.error('Failed to delete agent:', error);
|
|
596
|
+
throw error;
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
// Worktree operations
|
|
600
|
+
electron_1.ipcMain.handle('worktree:create', async (event, repoPath, name) => {
|
|
601
|
+
return await gitWorktreeManager.createWorktree(repoPath, name);
|
|
602
|
+
});
|
|
603
|
+
electron_1.ipcMain.handle('worktree:list', async (event, repoPath) => {
|
|
604
|
+
return await gitWorktreeManager.listWorktrees(repoPath);
|
|
605
|
+
});
|
|
606
|
+
electron_1.ipcMain.handle('worktree:remove', async (event, repoPath, name) => {
|
|
607
|
+
return await gitWorktreeManager.removeWorktree(repoPath, name);
|
|
608
|
+
});
|
|
609
|
+
// Skills operations
|
|
610
|
+
electron_1.ipcMain.handle('skills:list', async () => {
|
|
611
|
+
return await skillsManager.listSkills();
|
|
612
|
+
});
|
|
613
|
+
electron_1.ipcMain.handle('skills:get', async (event, skillId) => {
|
|
614
|
+
return await skillsManager.getSkill(skillId);
|
|
615
|
+
});
|
|
616
|
+
electron_1.ipcMain.handle('skills:create', async (event, skillConfig) => {
|
|
617
|
+
return await skillsManager.createSkill(skillConfig);
|
|
618
|
+
});
|
|
619
|
+
electron_1.ipcMain.handle('skills:update', async (event, skillId, skillConfig) => {
|
|
620
|
+
return await skillsManager.updateSkill(skillId, skillConfig);
|
|
621
|
+
});
|
|
622
|
+
electron_1.ipcMain.handle('skills:delete', async (event, skillId) => {
|
|
623
|
+
return await skillsManager.deleteSkill(skillId);
|
|
624
|
+
});
|
|
625
|
+
electron_1.ipcMain.handle('skills:applyToAgent', async (event, agentId, skillIds) => {
|
|
626
|
+
return await agentOrchestrator.applySkills(agentId, skillIds);
|
|
627
|
+
});
|
|
628
|
+
// Automation operations
|
|
629
|
+
electron_1.ipcMain.handle('automation:list', async () => {
|
|
630
|
+
return await automationScheduler.listAutomations();
|
|
631
|
+
});
|
|
632
|
+
electron_1.ipcMain.handle('automation:create', async (event, config) => {
|
|
633
|
+
return await automationScheduler.createAutomation(config);
|
|
634
|
+
});
|
|
635
|
+
electron_1.ipcMain.handle('automation:update', async (event, automationId, config) => {
|
|
636
|
+
return await automationScheduler.updateAutomation(automationId, config);
|
|
637
|
+
});
|
|
638
|
+
electron_1.ipcMain.handle('automation:delete', async (event, automationId) => {
|
|
639
|
+
return await automationScheduler.deleteAutomation(automationId);
|
|
640
|
+
});
|
|
641
|
+
electron_1.ipcMain.handle('automation:toggle', async (event, automationId, enabled) => {
|
|
642
|
+
return await automationScheduler.toggleAutomation(automationId, enabled);
|
|
643
|
+
});
|
|
644
|
+
// Settings operations
|
|
645
|
+
electron_1.ipcMain.handle('settings:get', (event, key) => {
|
|
646
|
+
return settingsManager.getAny(key);
|
|
647
|
+
});
|
|
648
|
+
electron_1.ipcMain.handle('settings:set', (event, key, value) => {
|
|
649
|
+
settingsManager.setAny(key, value);
|
|
650
|
+
});
|
|
651
|
+
electron_1.ipcMain.handle('settings:getAll', () => {
|
|
652
|
+
return settingsManager.getAll();
|
|
653
|
+
});
|
|
654
|
+
// AI Provider operations
|
|
655
|
+
electron_1.ipcMain.handle('providers:list', () => {
|
|
656
|
+
return aiProviderManager.listProviders();
|
|
657
|
+
});
|
|
658
|
+
electron_1.ipcMain.handle('providers:getActive', () => {
|
|
659
|
+
return aiProviderManager.getActiveProvider();
|
|
660
|
+
});
|
|
661
|
+
electron_1.ipcMain.handle('providers:setActive', (event, providerId) => {
|
|
662
|
+
return aiProviderManager.setActiveProvider(providerId);
|
|
663
|
+
});
|
|
664
|
+
electron_1.ipcMain.handle('providers:configure', (event, providerId, config) => {
|
|
665
|
+
return aiProviderManager.configureProvider(providerId, config);
|
|
666
|
+
});
|
|
667
|
+
electron_1.ipcMain.handle('providers:test', async (event, providerId) => {
|
|
668
|
+
return await aiProviderManager.testProvider(providerId);
|
|
669
|
+
});
|
|
670
|
+
// File system operations
|
|
671
|
+
electron_1.ipcMain.handle('fs:readdir', async (event, dirPath, options) => {
|
|
672
|
+
try {
|
|
673
|
+
const normalizedPath = path.normalize(dirPath);
|
|
674
|
+
if (normalizedPath.includes('..')) {
|
|
675
|
+
throw new Error('Path traversal not allowed');
|
|
676
|
+
}
|
|
677
|
+
const entries = await fs.readdir(normalizedPath, { withFileTypes: true });
|
|
678
|
+
return entries.map((entry) => ({
|
|
679
|
+
name: entry.name,
|
|
680
|
+
isDirectory: entry.isDirectory(),
|
|
681
|
+
isFile: entry.isFile()
|
|
682
|
+
}));
|
|
683
|
+
}
|
|
684
|
+
catch (error) {
|
|
685
|
+
electron_log_1.default.error('Failed to read directory:', error);
|
|
686
|
+
throw error;
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
electron_1.ipcMain.handle('fs:readFile', async (event, filePath, encoding) => {
|
|
690
|
+
try {
|
|
691
|
+
const normalizedPath = path.normalize(filePath);
|
|
692
|
+
if (normalizedPath.includes('..')) {
|
|
693
|
+
throw new Error('Path traversal not allowed');
|
|
694
|
+
}
|
|
695
|
+
const content = await fs.readFile(normalizedPath, encoding || 'utf-8');
|
|
696
|
+
return content;
|
|
697
|
+
}
|
|
698
|
+
catch (error) {
|
|
699
|
+
electron_log_1.default.error('Failed to read file:', error);
|
|
700
|
+
throw error;
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
electron_1.ipcMain.handle('fs:writeFile', async (event, filePath, content) => {
|
|
704
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
705
|
+
throw new Error('File path is required');
|
|
706
|
+
}
|
|
707
|
+
const normalizedPath = path.normalize(filePath);
|
|
708
|
+
if (normalizedPath.includes('..') || normalizedPath.startsWith('/etc') || normalizedPath.startsWith('/root') || normalizedPath.startsWith('/sys') || normalizedPath.startsWith('/proc')) {
|
|
709
|
+
throw new Error('Path traversal or restricted path not allowed');
|
|
710
|
+
}
|
|
711
|
+
try {
|
|
712
|
+
await fs.writeFile(normalizedPath, content, 'utf-8');
|
|
713
|
+
}
|
|
714
|
+
catch (error) {
|
|
715
|
+
electron_log_1.default.error('Failed to write file:', error);
|
|
716
|
+
throw error;
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
electron_1.ipcMain.handle('fs:stat', async (event, filePath) => {
|
|
720
|
+
try {
|
|
721
|
+
const normalizedPath = path.normalize(filePath);
|
|
722
|
+
if (normalizedPath.includes('..')) {
|
|
723
|
+
throw new Error('Path traversal not allowed');
|
|
724
|
+
}
|
|
725
|
+
const stats = await fs.stat(normalizedPath);
|
|
726
|
+
return {
|
|
727
|
+
isFile: stats.isFile(),
|
|
728
|
+
isDirectory: stats.isDirectory(),
|
|
729
|
+
size: stats.size,
|
|
730
|
+
mtime: stats.mtime,
|
|
731
|
+
ctime: stats.ctime
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
catch (error) {
|
|
735
|
+
electron_log_1.default.error('Failed to stat file:', error);
|
|
736
|
+
throw error;
|
|
737
|
+
}
|
|
738
|
+
});
|
|
739
|
+
// Terminal operations
|
|
740
|
+
const ALLOWED_COMMANDS = new Set([
|
|
741
|
+
'npm', 'node', 'pnpm', 'yarn', 'bun', 'deno',
|
|
742
|
+
'git', 'docker', 'docker-compose', 'kubectl',
|
|
743
|
+
'python', 'python3', 'pip', 'pip3',
|
|
744
|
+
'make', 'cmake', 'gcc', 'g++', 'clang', 'rustc',
|
|
745
|
+
'cargo', 'go', 'java', 'javac', 'gradle', 'maven',
|
|
746
|
+
'ls', 'cat', 'grep', 'find', 'chmod', 'chown', 'mkdir', 'rm', 'rmdir', 'cp', 'mv', 'touch',
|
|
747
|
+
'code', 'codex', 'opencode'
|
|
748
|
+
]);
|
|
749
|
+
const terminalProcesses = new Map();
|
|
750
|
+
let terminalIdCounter = 0;
|
|
751
|
+
function parseCommandLine(command) {
|
|
752
|
+
const args = [];
|
|
753
|
+
let current = '';
|
|
754
|
+
let inQuote = false;
|
|
755
|
+
let quoteChar = '';
|
|
756
|
+
for (let i = 0; i < command.length; i++) {
|
|
757
|
+
const char = command[i];
|
|
758
|
+
if ((char === '"' || char === "'") && !inQuote) {
|
|
759
|
+
inQuote = true;
|
|
760
|
+
quoteChar = char;
|
|
761
|
+
}
|
|
762
|
+
else if (char === quoteChar && inQuote) {
|
|
763
|
+
inQuote = false;
|
|
764
|
+
quoteChar = '';
|
|
765
|
+
}
|
|
766
|
+
else if (char === ' ' && !inQuote) {
|
|
767
|
+
if (current) {
|
|
768
|
+
args.push(current);
|
|
769
|
+
current = '';
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
current += char;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
if (current)
|
|
777
|
+
args.push(current);
|
|
778
|
+
return args;
|
|
779
|
+
}
|
|
780
|
+
electron_1.ipcMain.handle('terminal:execute', async (event, { command, cwd }) => {
|
|
781
|
+
if (!command || typeof command !== 'string') {
|
|
782
|
+
throw new Error('Command is required');
|
|
783
|
+
}
|
|
784
|
+
if (!cwd || typeof cwd !== 'string') {
|
|
785
|
+
throw new Error('CWD is required');
|
|
786
|
+
}
|
|
787
|
+
const parsedArgs = parseCommandLine(command);
|
|
788
|
+
if (parsedArgs.length === 0) {
|
|
789
|
+
throw new Error('Command is required');
|
|
790
|
+
}
|
|
791
|
+
const cmd = parsedArgs[0];
|
|
792
|
+
const args = parsedArgs.slice(1);
|
|
793
|
+
if (!ALLOWED_COMMANDS.has(cmd)) {
|
|
794
|
+
throw new Error(`Command "${cmd}" is not allowed. Allowed commands: ${[...ALLOWED_COMMANDS].join(', ')}`);
|
|
795
|
+
}
|
|
796
|
+
const currentTerminalId = ++terminalIdCounter;
|
|
797
|
+
return new Promise((resolve) => {
|
|
798
|
+
const proc = (0, child_process_1.spawn)(cmd, args, {
|
|
799
|
+
cwd,
|
|
800
|
+
shell: false,
|
|
801
|
+
env: { ...process.env, FORCE_COLOR: '1' }
|
|
802
|
+
});
|
|
803
|
+
terminalProcesses.set(currentTerminalId, proc);
|
|
804
|
+
let stdout = '';
|
|
805
|
+
let stderr = '';
|
|
806
|
+
proc.stdout?.on('data', (data) => {
|
|
807
|
+
stdout += data.toString();
|
|
808
|
+
});
|
|
809
|
+
proc.stderr?.on('data', (data) => {
|
|
810
|
+
stderr += data.toString();
|
|
811
|
+
});
|
|
812
|
+
const cleanup = () => {
|
|
813
|
+
terminalProcesses.delete(currentTerminalId);
|
|
814
|
+
};
|
|
815
|
+
proc.on('close', (code) => {
|
|
816
|
+
cleanup();
|
|
817
|
+
resolve({
|
|
818
|
+
stdout,
|
|
819
|
+
stderr,
|
|
820
|
+
exitCode: code,
|
|
821
|
+
error: code !== 0 ? `Process exited with code ${code}` : null
|
|
822
|
+
});
|
|
823
|
+
});
|
|
824
|
+
proc.on('error', (error) => {
|
|
825
|
+
cleanup();
|
|
826
|
+
resolve({
|
|
827
|
+
stdout,
|
|
828
|
+
stderr,
|
|
829
|
+
exitCode: -1,
|
|
830
|
+
error: error.message
|
|
831
|
+
});
|
|
832
|
+
});
|
|
833
|
+
});
|
|
834
|
+
});
|
|
835
|
+
electron_1.ipcMain.handle('terminal:kill', () => {
|
|
836
|
+
for (const [id, proc] of terminalProcesses) {
|
|
837
|
+
proc.kill();
|
|
838
|
+
terminalProcesses.delete(id);
|
|
839
|
+
}
|
|
840
|
+
});
|
|
841
|
+
// Code changes operations
|
|
842
|
+
electron_1.ipcMain.handle('changes:list', async (event, agentId) => {
|
|
843
|
+
return await dbManager.getCodeChanges(agentId);
|
|
844
|
+
});
|
|
845
|
+
electron_1.ipcMain.handle('changes:approve', async (event, changeId) => {
|
|
846
|
+
return await dbManager.approveCodeChange(changeId);
|
|
847
|
+
});
|
|
848
|
+
electron_1.ipcMain.handle('changes:reject', async (event, changeId, comment) => {
|
|
849
|
+
return await dbManager.rejectCodeChange(changeId, comment);
|
|
850
|
+
});
|
|
851
|
+
electron_1.ipcMain.handle('changes:apply', async (event, changeId) => {
|
|
852
|
+
return await dbManager.applyCodeChange(changeId);
|
|
853
|
+
});
|
|
854
|
+
// Checkpoints operations
|
|
855
|
+
electron_1.ipcMain.handle('checkpoints:list', async (event, agentId) => {
|
|
856
|
+
return await dbManager.listCheckpoints(agentId);
|
|
857
|
+
});
|
|
858
|
+
electron_1.ipcMain.handle('checkpoints:restore', async (event, checkpointId) => {
|
|
859
|
+
return await dbManager.restoreCheckpoint(checkpointId);
|
|
860
|
+
});
|
|
861
|
+
electron_1.ipcMain.handle('checkpoints:restoreLast', async (event, agentId) => {
|
|
862
|
+
return await dbManager.restoreLastCheckpoint(agentId);
|
|
863
|
+
});
|
|
864
|
+
// Agent queue operations
|
|
865
|
+
electron_1.ipcMain.handle('queue:list', async (event, agentId) => {
|
|
866
|
+
return await dbManager.listAgentQueueItems(agentId);
|
|
867
|
+
});
|
|
868
|
+
electron_1.ipcMain.handle('queue:enqueue', async (event, agentId, type, content) => {
|
|
869
|
+
return await dbManager.enqueueAgentQueueItem(agentId, type, content);
|
|
870
|
+
});
|
|
871
|
+
electron_1.ipcMain.handle('queue:delete', async (event, agentId, itemId) => {
|
|
872
|
+
return await dbManager.deleteAgentQueueItem(agentId, itemId);
|
|
873
|
+
});
|
|
874
|
+
electron_1.ipcMain.handle('queue:moveUp', async (event, agentId, itemId) => {
|
|
875
|
+
return await dbManager.moveAgentQueueItemUp(agentId, itemId);
|
|
876
|
+
});
|
|
877
|
+
electron_1.ipcMain.handle('queue:claimNext', async (event, agentId) => {
|
|
878
|
+
return await dbManager.claimNextAgentQueueItem(agentId);
|
|
879
|
+
});
|
|
880
|
+
electron_1.ipcMain.handle('queue:complete', async (event, agentId, itemId, outcome, error) => {
|
|
881
|
+
return await dbManager.completeAgentQueueItem(agentId, itemId, outcome, error);
|
|
882
|
+
});
|
|
883
|
+
electron_1.ipcMain.handle('queue:history', async (event, agentId, limit) => {
|
|
884
|
+
return await dbManager.getQueueHistory(agentId, limit);
|
|
885
|
+
});
|
|
886
|
+
// Git operations
|
|
887
|
+
electron_1.ipcMain.handle('git:status', async (event, repoPath) => {
|
|
888
|
+
return await gitWorktreeManager.getChanges(repoPath);
|
|
889
|
+
});
|
|
890
|
+
electron_1.ipcMain.handle('git:commit', async (event, { repoPath, message, files }) => {
|
|
891
|
+
return await gitWorktreeManager.commitChanges(repoPath, message, files);
|
|
892
|
+
});
|
|
893
|
+
electron_1.ipcMain.handle('git:diff', async (event, { repoPath, filePath }) => {
|
|
894
|
+
return await gitWorktreeManager.getDiff(repoPath, filePath);
|
|
895
|
+
});
|
|
896
|
+
// Search operations
|
|
897
|
+
electron_1.ipcMain.handle('search:files', async (event, { query, path, pattern }) => {
|
|
898
|
+
try {
|
|
899
|
+
const results = [];
|
|
900
|
+
async function searchDir(dirPath) {
|
|
901
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
902
|
+
for (const entry of entries) {
|
|
903
|
+
const fullPath = `${dirPath}/${entry.name}`;
|
|
904
|
+
if (entry.isDirectory()) {
|
|
905
|
+
if (!entry.name.startsWith('.') &&
|
|
906
|
+
entry.name !== 'node_modules' &&
|
|
907
|
+
entry.name !== 'dist' &&
|
|
908
|
+
entry.name !== 'build') {
|
|
909
|
+
await searchDir(fullPath);
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
else if (entry.isFile()) {
|
|
913
|
+
if (pattern && !entry.name.match(pattern))
|
|
914
|
+
continue;
|
|
915
|
+
try {
|
|
916
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
917
|
+
const lines = content.split('\n');
|
|
918
|
+
const matches = [];
|
|
919
|
+
lines.forEach((line, index) => {
|
|
920
|
+
if (line.toLowerCase().includes(query.toLowerCase())) {
|
|
921
|
+
matches.push({ line: index + 1, content: line.trim() });
|
|
922
|
+
}
|
|
923
|
+
});
|
|
924
|
+
if (matches.length > 0) {
|
|
925
|
+
results.push({ path: fullPath, matches });
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
catch {
|
|
929
|
+
// Skip binary or unreadable files
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
await searchDir(path);
|
|
935
|
+
return results;
|
|
936
|
+
}
|
|
937
|
+
catch (error) {
|
|
938
|
+
electron_log_1.default.error('Search failed:', error);
|
|
939
|
+
throw error;
|
|
940
|
+
}
|
|
941
|
+
});
|
|
942
|
+
// Audit log operations
|
|
943
|
+
electron_1.ipcMain.handle('audit:recent', async (event, limit = 100) => {
|
|
944
|
+
return await auditLogger.getRecentEvents(limit);
|
|
945
|
+
});
|
|
946
|
+
electron_1.ipcMain.handle('audit:byAction', async (event, action, limit = 100) => {
|
|
947
|
+
return await auditLogger.getEventsByAction(action, limit);
|
|
948
|
+
});
|
|
949
|
+
electron_1.ipcMain.handle('audit:export', async (event, exportPath) => {
|
|
950
|
+
await auditLogger.exportLogs(exportPath);
|
|
951
|
+
return { success: true };
|
|
952
|
+
});
|
|
953
|
+
electron_1.ipcMain.handle('notification:show', (event, { title, body }) => {
|
|
954
|
+
if (electron_1.Notification.isSupported()) {
|
|
955
|
+
new electron_1.Notification({
|
|
956
|
+
title,
|
|
957
|
+
body,
|
|
958
|
+
icon: path.join(__dirname, '../../assets/icon.png')
|
|
959
|
+
}).show();
|
|
960
|
+
}
|
|
961
|
+
});
|
|
962
|
+
// Export/Import
|
|
963
|
+
electron_1.ipcMain.handle('data:export', async (event, exportPath) => {
|
|
964
|
+
try {
|
|
965
|
+
const data = {
|
|
966
|
+
agents: await dbManager.getAllAgents(),
|
|
967
|
+
automations: await automationScheduler.listAutomations(),
|
|
968
|
+
skills: await skillsManager.listSkills(),
|
|
969
|
+
settings: settingsManager.getAll(),
|
|
970
|
+
exportedAt: new Date().toISOString()
|
|
971
|
+
};
|
|
972
|
+
await fs.writeFile(exportPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
973
|
+
return true;
|
|
974
|
+
}
|
|
975
|
+
catch (error) {
|
|
976
|
+
electron_log_1.default.error('Export failed:', error);
|
|
977
|
+
throw error;
|
|
978
|
+
}
|
|
979
|
+
});
|
|
980
|
+
electron_1.ipcMain.handle('data:import', async (event, importPath) => {
|
|
981
|
+
try {
|
|
982
|
+
const normalizedPath = path.normalize(importPath);
|
|
983
|
+
if (normalizedPath.includes('..')) {
|
|
984
|
+
throw new Error('Path traversal not allowed');
|
|
985
|
+
}
|
|
986
|
+
const content = await fs.readFile(normalizedPath, 'utf-8');
|
|
987
|
+
let data;
|
|
988
|
+
try {
|
|
989
|
+
data = JSON.parse(content);
|
|
990
|
+
}
|
|
991
|
+
catch {
|
|
992
|
+
throw new Error('Invalid JSON format');
|
|
993
|
+
}
|
|
994
|
+
if (!data || typeof data !== 'object') {
|
|
995
|
+
throw new Error('Invalid import data: must be an object');
|
|
996
|
+
}
|
|
997
|
+
if (data.agents) {
|
|
998
|
+
if (!Array.isArray(data.agents)) {
|
|
999
|
+
throw new Error('Invalid import data: agents must be an array');
|
|
1000
|
+
}
|
|
1001
|
+
for (const agent of data.agents) {
|
|
1002
|
+
if (!agent.name || !agent.projectPath || typeof agent.name !== 'string' || typeof agent.projectPath !== 'string') {
|
|
1003
|
+
throw new Error('Invalid agent: name and projectPath are required strings');
|
|
1004
|
+
}
|
|
1005
|
+
if (agent.projectPath.includes('..') || agent.projectPath.startsWith('/etc') || agent.projectPath.startsWith('/root')) {
|
|
1006
|
+
throw new Error('Invalid agent projectPath: path traversal or restricted path not allowed');
|
|
1007
|
+
}
|
|
1008
|
+
await dbManager.createAgent(agent);
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
if (data.automations) {
|
|
1012
|
+
if (!Array.isArray(data.automations)) {
|
|
1013
|
+
throw new Error('Invalid import data: automations must be an array');
|
|
1014
|
+
}
|
|
1015
|
+
for (const automation of data.automations) {
|
|
1016
|
+
if (!automation.name || !automation.trigger) {
|
|
1017
|
+
throw new Error('Invalid automation: name and trigger are required');
|
|
1018
|
+
}
|
|
1019
|
+
await automationScheduler.createAutomation(automation);
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
if (data.settings) {
|
|
1023
|
+
if (typeof data.settings !== 'object' || Array.isArray(data.settings)) {
|
|
1024
|
+
throw new Error('Invalid import data: settings must be an object');
|
|
1025
|
+
}
|
|
1026
|
+
for (const [key, value] of Object.entries(data.settings)) {
|
|
1027
|
+
if (typeof key !== 'string') {
|
|
1028
|
+
throw new Error('Invalid settings: keys must be strings');
|
|
1029
|
+
}
|
|
1030
|
+
settingsManager.setAny(key, value);
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
return true;
|
|
1034
|
+
}
|
|
1035
|
+
catch (error) {
|
|
1036
|
+
electron_log_1.default.error('Import failed:', error);
|
|
1037
|
+
throw error;
|
|
1038
|
+
}
|
|
1039
|
+
});
|
|
1040
|
+
// Cowork operations
|
|
1041
|
+
electron_1.ipcMain.handle('cowork:create', async (event, name, objective, projectPath, options) => {
|
|
1042
|
+
return await coworkManager.createSession(name, objective, projectPath, options);
|
|
1043
|
+
});
|
|
1044
|
+
electron_1.ipcMain.handle('cowork:start', async (event, sessionId) => {
|
|
1045
|
+
return await coworkManager.startSession(sessionId);
|
|
1046
|
+
});
|
|
1047
|
+
electron_1.ipcMain.handle('cowork:pause', async (event, sessionId) => {
|
|
1048
|
+
return await coworkManager.pauseSession(sessionId);
|
|
1049
|
+
});
|
|
1050
|
+
electron_1.ipcMain.handle('cowork:stop', async (event, sessionId) => {
|
|
1051
|
+
return await coworkManager.stopSession(sessionId);
|
|
1052
|
+
});
|
|
1053
|
+
electron_1.ipcMain.handle('cowork:list', async () => {
|
|
1054
|
+
return coworkManager.getSessions();
|
|
1055
|
+
});
|
|
1056
|
+
// Pair programming operations
|
|
1057
|
+
electron_1.ipcMain.handle('pair:start', async (event, projectPath, mode, userId) => {
|
|
1058
|
+
const validModes = ['collaborative', 'teacher', 'reviewer'];
|
|
1059
|
+
const validMode = validModes.includes(mode) ? mode : 'collaborative';
|
|
1060
|
+
return await aiPairProgramming.startSession(projectPath, validMode, userId);
|
|
1061
|
+
});
|
|
1062
|
+
electron_1.ipcMain.handle('pair:chat', async (event, sessionId, message) => {
|
|
1063
|
+
return await aiPairProgramming.chat(sessionId, message);
|
|
1064
|
+
});
|
|
1065
|
+
electron_1.ipcMain.handle('pair:end', async (event, sessionId) => {
|
|
1066
|
+
return await aiPairProgramming.endSession(sessionId);
|
|
1067
|
+
});
|
|
1068
|
+
// Smart code assistant
|
|
1069
|
+
electron_1.ipcMain.handle('assistant:inlineCompletion', async (event, filePath, content, position) => {
|
|
1070
|
+
return await smartCodeAssistant.provideInlineCompletion(filePath, content, position);
|
|
1071
|
+
});
|
|
1072
|
+
electron_1.ipcMain.handle('assistant:suggestFixes', async (event, filePath, content) => {
|
|
1073
|
+
return await smartCodeAssistant.suggestFixes(filePath, content);
|
|
1074
|
+
});
|
|
1075
|
+
electron_1.ipcMain.handle('assistant:explain', async (event, code) => {
|
|
1076
|
+
return await smartCodeAssistant.explainCode(code, 'detailed');
|
|
1077
|
+
});
|
|
1078
|
+
// Metrics
|
|
1079
|
+
electron_1.ipcMain.handle('metrics:get', () => {
|
|
1080
|
+
return MetricsCollector_1.metrics.getStats();
|
|
1081
|
+
});
|
|
1082
|
+
electron_1.ipcMain.handle('metrics:export', () => {
|
|
1083
|
+
return MetricsCollector_1.metrics.exportMetrics();
|
|
1084
|
+
});
|
|
1085
|
+
electron_log_1.default.info('IPC handlers setup completed');
|
|
1086
|
+
}
|
|
1087
|
+
//# sourceMappingURL=main.js.map
|