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,431 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
+
import log from 'electron-log';
|
|
4
|
+
import { AgentOrchestrator } from '../agents/AgentOrchestrator';
|
|
5
|
+
import { DatabaseManager } from '../DatabaseManager';
|
|
6
|
+
import { NotificationManager } from '../notifications/NotificationManager';
|
|
7
|
+
import { Agent, AgentStatus, TaskStatus } from '../../shared/types';
|
|
8
|
+
import { AgentTools, ToolResult } from '../agents/AgentTools';
|
|
9
|
+
import { CodeIndex } from '../agents/CodeIndex';
|
|
10
|
+
import { NativeToolCalling } from '../agents/NativeToolCalling';
|
|
11
|
+
|
|
12
|
+
interface CoworkSession {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
agentId: string;
|
|
16
|
+
status: 'idle' | 'running' | 'paused' | 'completed' | 'error';
|
|
17
|
+
objective: string;
|
|
18
|
+
progress: number;
|
|
19
|
+
createdAt: Date;
|
|
20
|
+
updatedAt: Date;
|
|
21
|
+
completedAt?: Date;
|
|
22
|
+
logs: string[];
|
|
23
|
+
deliverables: string[];
|
|
24
|
+
autoApprove: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class CoworkManager extends EventEmitter {
|
|
28
|
+
private sessions: Map<string, CoworkSession> = new Map();
|
|
29
|
+
private agentOrchestrator: AgentOrchestrator;
|
|
30
|
+
private dbManager: DatabaseManager;
|
|
31
|
+
private notificationManager: NotificationManager;
|
|
32
|
+
private checkInterval: NodeJS.Timeout | null = null;
|
|
33
|
+
|
|
34
|
+
constructor(
|
|
35
|
+
agentOrchestrator: AgentOrchestrator,
|
|
36
|
+
dbManager: DatabaseManager,
|
|
37
|
+
notificationManager: NotificationManager
|
|
38
|
+
) {
|
|
39
|
+
super();
|
|
40
|
+
this.agentOrchestrator = agentOrchestrator;
|
|
41
|
+
this.dbManager = dbManager;
|
|
42
|
+
this.notificationManager = notificationManager;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async initialize(): Promise<void> {
|
|
46
|
+
// Load existing sessions from DB
|
|
47
|
+
await this.loadSessions();
|
|
48
|
+
|
|
49
|
+
// Start monitoring loop
|
|
50
|
+
this.checkInterval = setInterval(() => this.monitorSessions(), 5000);
|
|
51
|
+
|
|
52
|
+
log.info('Cowork manager initialized');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async createSession(
|
|
56
|
+
name: string,
|
|
57
|
+
objective: string,
|
|
58
|
+
projectPath: string,
|
|
59
|
+
options: {
|
|
60
|
+
autoApprove?: boolean;
|
|
61
|
+
skills?: string[];
|
|
62
|
+
} = {}
|
|
63
|
+
): Promise<CoworkSession> {
|
|
64
|
+
const sessionId = uuidv4();
|
|
65
|
+
|
|
66
|
+
// Create background agent
|
|
67
|
+
const agent = await this.agentOrchestrator.createAgent({
|
|
68
|
+
name: `Cowork: ${name}`,
|
|
69
|
+
projectPath,
|
|
70
|
+
providerId: 'openai',
|
|
71
|
+
model: 'gpt-4o', // Use best model for autonomous work
|
|
72
|
+
skills: options.skills || ['refactoring', 'testing'],
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const session: CoworkSession = {
|
|
76
|
+
id: sessionId,
|
|
77
|
+
name,
|
|
78
|
+
agentId: agent.id,
|
|
79
|
+
status: 'idle',
|
|
80
|
+
objective,
|
|
81
|
+
progress: 0,
|
|
82
|
+
createdAt: new Date(),
|
|
83
|
+
updatedAt: new Date(),
|
|
84
|
+
logs: [],
|
|
85
|
+
deliverables: [],
|
|
86
|
+
autoApprove: options.autoApprove ?? false,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
this.sessions.set(sessionId, session);
|
|
90
|
+
await this.saveSession(session);
|
|
91
|
+
|
|
92
|
+
this.emit('session:created', session);
|
|
93
|
+
log.info(`Cowork session created: ${sessionId}`);
|
|
94
|
+
|
|
95
|
+
return session;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async startSession(sessionId: string): Promise<void> {
|
|
99
|
+
const session = this.sessions.get(sessionId);
|
|
100
|
+
if (!session) throw new Error('Session not found');
|
|
101
|
+
|
|
102
|
+
session.status = 'running';
|
|
103
|
+
session.updatedAt = new Date();
|
|
104
|
+
|
|
105
|
+
// Start the autonomous workflow
|
|
106
|
+
this.runAutonomousWorkflow(session);
|
|
107
|
+
|
|
108
|
+
await this.saveSession(session);
|
|
109
|
+
this.emit('session:started', session);
|
|
110
|
+
|
|
111
|
+
this.notificationManager.show({
|
|
112
|
+
title: 'Cowork Session Started',
|
|
113
|
+
body: `"${session.name}" is now working in the background`,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async pauseSession(sessionId: string): Promise<void> {
|
|
118
|
+
const session = this.sessions.get(sessionId);
|
|
119
|
+
if (!session) throw new Error('Session not found');
|
|
120
|
+
|
|
121
|
+
session.status = 'paused';
|
|
122
|
+
session.updatedAt = new Date();
|
|
123
|
+
|
|
124
|
+
await this.agentOrchestrator.pauseAgent(session.agentId);
|
|
125
|
+
await this.saveSession(session);
|
|
126
|
+
|
|
127
|
+
this.emit('session:paused', session);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async stopSession(sessionId: string): Promise<void> {
|
|
131
|
+
const session = this.sessions.get(sessionId);
|
|
132
|
+
if (!session) throw new Error('Session not found');
|
|
133
|
+
|
|
134
|
+
await this.agentOrchestrator.stopAgent(session.agentId);
|
|
135
|
+
|
|
136
|
+
session.status = 'completed';
|
|
137
|
+
session.completedAt = new Date();
|
|
138
|
+
session.updatedAt = new Date();
|
|
139
|
+
|
|
140
|
+
await this.saveSession(session);
|
|
141
|
+
this.emit('session:stopped', session);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private async runAutonomousWorkflow(session: CoworkSession): Promise<void> {
|
|
145
|
+
try {
|
|
146
|
+
this.addLog(session, 'Starting autonomous workflow...');
|
|
147
|
+
|
|
148
|
+
// Get agent worktree path
|
|
149
|
+
const agent = await this.agentOrchestrator.getAgent(session.agentId);
|
|
150
|
+
if (!agent) throw new Error('Agent not found');
|
|
151
|
+
|
|
152
|
+
const worktreePath = agent.worktreePath || agent.projectPath;
|
|
153
|
+
|
|
154
|
+
// Get OpenAI API key from settings
|
|
155
|
+
const apiKey = process.env.OPENAI_API_KEY || '';
|
|
156
|
+
const tools = new AgentTools(worktreePath);
|
|
157
|
+
const codeIndex = new CodeIndex(worktreePath, '.codex/index', apiKey);
|
|
158
|
+
await codeIndex.initialize();
|
|
159
|
+
|
|
160
|
+
// Initialize native tool calling if API key available
|
|
161
|
+
const toolCaller = apiKey ? new NativeToolCalling(apiKey, worktreePath) : null;
|
|
162
|
+
|
|
163
|
+
// Step 1: Index codebase
|
|
164
|
+
this.addLog(session, 'Indexing codebase for semantic search...');
|
|
165
|
+
session.progress = 5;
|
|
166
|
+
await codeIndex.indexProject();
|
|
167
|
+
|
|
168
|
+
// Step 2: Analyze with tools
|
|
169
|
+
this.addLog(session, 'Analyzing codebase structure with tools...');
|
|
170
|
+
session.progress = 15;
|
|
171
|
+
this.emit('session:progress', { sessionId: session.id, progress: 15, step: 'analysis' });
|
|
172
|
+
|
|
173
|
+
// List root directory
|
|
174
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'ls', status: 'running' });
|
|
175
|
+
const lsResult = await tools.ls({ path: '.' });
|
|
176
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'ls', status: 'completed', result: lsResult.output });
|
|
177
|
+
this.addLog(session, `Project structure:\n${lsResult.output}`);
|
|
178
|
+
|
|
179
|
+
// Search for relevant files using semantic search
|
|
180
|
+
const searchResults = await codeIndex.search(session.objective, 10);
|
|
181
|
+
const relevantFiles = searchResults.map(r => r.filePath);
|
|
182
|
+
|
|
183
|
+
this.addLog(session, `Found ${relevantFiles.length} relevant files via semantic search`);
|
|
184
|
+
|
|
185
|
+
// Read key files
|
|
186
|
+
let fileContents = '';
|
|
187
|
+
for (const file of relevantFiles.slice(0, 5)) {
|
|
188
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'view', status: 'running', params: { file_path: file } });
|
|
189
|
+
const viewResult = await tools.view({ file_path: file });
|
|
190
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'view', status: viewResult.success ? 'completed' : 'error', result: viewResult.output, error: viewResult.error });
|
|
191
|
+
if (viewResult.success) {
|
|
192
|
+
fileContents += `\n\n=== ${file} ===\n${viewResult.output}`;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
session.progress = 25;
|
|
197
|
+
this.emit('session:progress', { sessionId: session.id, progress: 25, step: 'files_read', files: relevantFiles.slice(0, 5) });
|
|
198
|
+
|
|
199
|
+
// Step 3: Create plan using actual file contents
|
|
200
|
+
this.addLog(session, 'Creating detailed implementation plan...');
|
|
201
|
+
session.progress = 35;
|
|
202
|
+
|
|
203
|
+
const planTask = await this.agentOrchestrator.sendMessage(
|
|
204
|
+
session.agentId,
|
|
205
|
+
`Based on the following codebase analysis, create a detailed plan to achieve: ${session.objective}\n\n` +
|
|
206
|
+
`Project structure:\n${lsResult.output}\n\n` +
|
|
207
|
+
`Relevant files found:\n${relevantFiles.join('\n')}\n\n` +
|
|
208
|
+
`Key file contents:${fileContents.slice(0, 8000)}\n\n` +
|
|
209
|
+
`Create a step-by-step plan with specific files to modify and actions to take.`
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
session.progress = 45;
|
|
213
|
+
|
|
214
|
+
// Step 4: Execute with native tool calling (if available) or streaming
|
|
215
|
+
this.addLog(session, 'Executing plan with tool use...');
|
|
216
|
+
session.progress = 55;
|
|
217
|
+
|
|
218
|
+
let executionResult = '';
|
|
219
|
+
|
|
220
|
+
if (toolCaller?.isAvailable()) {
|
|
221
|
+
// Use native tool calling
|
|
222
|
+
this.addLog(session, 'Using native OpenAI tool calling...');
|
|
223
|
+
|
|
224
|
+
const systemPrompt =
|
|
225
|
+
`You are an expert software developer. Execute the following objective: ${session.objective}\n\n` +
|
|
226
|
+
`You have access to tools to explore and modify the codebase. ` +
|
|
227
|
+
`Start by exploring the codebase structure, then make necessary changes. ` +
|
|
228
|
+
`After each tool use, analyze the result and decide on next steps.`;
|
|
229
|
+
|
|
230
|
+
const userPrompt =
|
|
231
|
+
`Objective: ${session.objective}\n\n` +
|
|
232
|
+
`Relevant files:\n${relevantFiles.join('\n')}\n\n` +
|
|
233
|
+
`Execute the implementation. Use tools to view, edit, and test the code.`;
|
|
234
|
+
|
|
235
|
+
executionResult = await toolCaller.executeWithTools(
|
|
236
|
+
'gpt-4o',
|
|
237
|
+
systemPrompt,
|
|
238
|
+
userPrompt,
|
|
239
|
+
(toolCall, result) => {
|
|
240
|
+
this.emit('session:tool', {
|
|
241
|
+
sessionId: session.id,
|
|
242
|
+
tool: toolCall.function.name,
|
|
243
|
+
status: result.success ? 'completed' : 'error',
|
|
244
|
+
result: result.output,
|
|
245
|
+
error: result.error
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
this.addLog(session, `Execution completed: ${executionResult.slice(0, 500)}`);
|
|
251
|
+
} else {
|
|
252
|
+
// Fallback to streaming
|
|
253
|
+
this.addLog(session, 'Using streaming mode (no native tool calling)...');
|
|
254
|
+
|
|
255
|
+
const toolDefinitions = tools.getToolDefinitions();
|
|
256
|
+
const toolDescriptions = toolDefinitions.map(t =>
|
|
257
|
+
`- ${t.name}: ${t.description}`
|
|
258
|
+
).join('\n');
|
|
259
|
+
|
|
260
|
+
const executePrompt =
|
|
261
|
+
`Execute the following objective: ${session.objective}\n\n` +
|
|
262
|
+
`You have access to the following tools:\n${toolDescriptions}\n\n` +
|
|
263
|
+
`To use a tool, respond with: TOOL: {"name": "tool_name", "params": {...}}\n\n` +
|
|
264
|
+
`First, explore the codebase to understand the structure, then make the necessary changes.`;
|
|
265
|
+
|
|
266
|
+
let streamingContent = '';
|
|
267
|
+
await this.agentOrchestrator.sendMessageStream(
|
|
268
|
+
session.agentId,
|
|
269
|
+
executePrompt,
|
|
270
|
+
{
|
|
271
|
+
onChunk: (chunk: string) => {
|
|
272
|
+
streamingContent += chunk;
|
|
273
|
+
this.emit('session:stream', { sessionId: session.id, chunk, content: streamingContent });
|
|
274
|
+
},
|
|
275
|
+
onComplete: () => {
|
|
276
|
+
this.emit('session:streamComplete', { sessionId: session.id, content: streamingContent });
|
|
277
|
+
},
|
|
278
|
+
onError: (error: Error) => {
|
|
279
|
+
this.emit('session:streamError', { sessionId: session.id, error: error.message });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
executionResult = streamingContent;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
session.progress = 75;
|
|
288
|
+
this.emit('session:progress', { sessionId: session.id, progress: 75, step: 'execution' });
|
|
289
|
+
|
|
290
|
+
// Step 5: Verify with tests
|
|
291
|
+
this.addLog(session, 'Running verification...');
|
|
292
|
+
session.progress = 85;
|
|
293
|
+
this.emit('session:progress', { sessionId: session.id, progress: 85, step: 'verification' });
|
|
294
|
+
|
|
295
|
+
// Try to run tests
|
|
296
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: 'running', params: { command: 'npm test' } });
|
|
297
|
+
const testResult = await tools.bash({ command: 'npm test || echo "No tests"' });
|
|
298
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: testResult.success ? 'completed' : 'error', result: testResult.output, error: testResult.error });
|
|
299
|
+
this.addLog(session, `Test result: ${testResult.output.slice(0, 500)}`);
|
|
300
|
+
|
|
301
|
+
// Check for TypeScript errors
|
|
302
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: 'running', params: { command: 'npx tsc --noEmit' } });
|
|
303
|
+
const typeCheck = await tools.bash({ command: 'npx tsc --noEmit 2>&1 || echo "Type check completed"' });
|
|
304
|
+
this.emit('session:tool', { sessionId: session.id, tool: 'bash', status: typeCheck.success ? 'completed' : 'error', result: typeCheck.output, error: typeCheck.error });
|
|
305
|
+
if (!typeCheck.success) {
|
|
306
|
+
this.addLog(session, `Type errors found: ${typeCheck.error?.slice(0, 300)}`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
session.progress = 95;
|
|
310
|
+
this.emit('session:progress', { sessionId: session.id, progress: 95, step: 'complete' });
|
|
311
|
+
|
|
312
|
+
// Complete
|
|
313
|
+
session.status = 'completed';
|
|
314
|
+
session.progress = 100;
|
|
315
|
+
session.completedAt = new Date();
|
|
316
|
+
session.deliverables.push('Implementation completed');
|
|
317
|
+
session.deliverables.push(`Modified files: ${relevantFiles.join(', ')}`);
|
|
318
|
+
|
|
319
|
+
this.addLog(session, 'Session completed successfully!');
|
|
320
|
+
await this.saveSession(session);
|
|
321
|
+
|
|
322
|
+
this.emit('session:completed', session);
|
|
323
|
+
|
|
324
|
+
this.notificationManager.show({
|
|
325
|
+
title: 'Cowork Session Completed',
|
|
326
|
+
body: `"${session.name}" has finished working`,
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
} catch (error) {
|
|
330
|
+
session.status = 'error';
|
|
331
|
+
this.addLog(session, `Error: ${error}`);
|
|
332
|
+
await this.saveSession(session);
|
|
333
|
+
|
|
334
|
+
this.emit('session:error', { sessionId: session.id, error });
|
|
335
|
+
|
|
336
|
+
this.notificationManager.show({
|
|
337
|
+
title: 'Cowork Session Error',
|
|
338
|
+
body: `"${session.name}" encountered an error`,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
private async waitForTask(agentId: string, taskId: string): Promise<void> {
|
|
344
|
+
return new Promise((resolve, reject) => {
|
|
345
|
+
const checkInterval = setInterval(async () => {
|
|
346
|
+
try {
|
|
347
|
+
const agent = await this.agentOrchestrator.getAgent(agentId);
|
|
348
|
+
const task = agent?.tasks.find(t => t.id === taskId);
|
|
349
|
+
|
|
350
|
+
if (!task) {
|
|
351
|
+
clearInterval(checkInterval);
|
|
352
|
+
reject(new Error('Task not found'));
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (task.status === TaskStatus.COMPLETED) {
|
|
357
|
+
clearInterval(checkInterval);
|
|
358
|
+
resolve();
|
|
359
|
+
} else if (task.status === TaskStatus.FAILED) {
|
|
360
|
+
clearInterval(checkInterval);
|
|
361
|
+
reject(new Error(task.error || 'Task failed'));
|
|
362
|
+
}
|
|
363
|
+
} catch (error) {
|
|
364
|
+
clearInterval(checkInterval);
|
|
365
|
+
reject(error);
|
|
366
|
+
}
|
|
367
|
+
}, 1000);
|
|
368
|
+
|
|
369
|
+
// Timeout after 30 minutes
|
|
370
|
+
setTimeout(() => {
|
|
371
|
+
clearInterval(checkInterval);
|
|
372
|
+
reject(new Error('Task timeout'));
|
|
373
|
+
}, 30 * 60 * 1000);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
private addLog(session: CoworkSession, message: string): void {
|
|
378
|
+
const timestamp = new Date().toISOString();
|
|
379
|
+
session.logs.push(`[${timestamp}] ${message}`);
|
|
380
|
+
this.emit('session:log', { sessionId: session.id, message });
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
private async monitorSessions(): Promise<void> {
|
|
384
|
+
for (const session of this.sessions.values()) {
|
|
385
|
+
if (session.status === 'running') {
|
|
386
|
+
// Update progress and check health
|
|
387
|
+
const agent = await this.agentOrchestrator.getAgent(session.agentId);
|
|
388
|
+
if (agent?.status === AgentStatus.ERROR) {
|
|
389
|
+
session.status = 'error';
|
|
390
|
+
this.addLog(session, 'Agent encountered an error');
|
|
391
|
+
await this.saveSession(session);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
getSessions(): CoworkSession[] {
|
|
398
|
+
return Array.from(this.sessions.values()).sort(
|
|
399
|
+
(a, b) => b.createdAt.getTime() - a.createdAt.getTime()
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
getSession(sessionId: string): CoworkSession | undefined {
|
|
404
|
+
return this.sessions.get(sessionId);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private async loadSessions(): Promise<void> {
|
|
408
|
+
// Load from database
|
|
409
|
+
const sessions = await this.dbManager.getCoworkSessions?.() || [];
|
|
410
|
+
for (const session of sessions) {
|
|
411
|
+
this.sessions.set(session.id, session);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
private async saveSession(session: CoworkSession): Promise<void> {
|
|
416
|
+
await this.dbManager.saveCoworkSession?.(session);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
async cleanup(): Promise<void> {
|
|
420
|
+
if (this.checkInterval) {
|
|
421
|
+
clearInterval(this.checkInterval);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Stop all running sessions
|
|
425
|
+
for (const session of this.sessions.values()) {
|
|
426
|
+
if (session.status === 'running') {
|
|
427
|
+
await this.stopSession(session.id);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|