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,269 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import log from 'electron-log';
|
|
3
|
+
import {
|
|
4
|
+
AgentDefinition,
|
|
5
|
+
AgentGuardrail,
|
|
6
|
+
AgentExecutionContext,
|
|
7
|
+
AgentHandler,
|
|
8
|
+
Agent,
|
|
9
|
+
AgentMessage
|
|
10
|
+
} from '../../shared/types';
|
|
11
|
+
import { AIProviderManager } from '../providers/AIProviderManager';
|
|
12
|
+
|
|
13
|
+
export class AgentSDK extends EventEmitter {
|
|
14
|
+
private handlers: Map<string, AgentHandler> = new Map();
|
|
15
|
+
private guardrails: AgentGuardrail[] = [];
|
|
16
|
+
private providerManager: AIProviderManager;
|
|
17
|
+
private agentDefinitions: Map<string, AgentDefinition> = new Map();
|
|
18
|
+
|
|
19
|
+
constructor(providerManager: AIProviderManager) {
|
|
20
|
+
super();
|
|
21
|
+
this.providerManager = providerManager;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Register a custom agent definition
|
|
25
|
+
registerAgent(definition: AgentDefinition): void {
|
|
26
|
+
this.agentDefinitions.set(definition.id, definition);
|
|
27
|
+
this.emit('agent:registered', definition);
|
|
28
|
+
log.info(`Registered agent: ${definition.name} (${definition.id})`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Unregister an agent
|
|
32
|
+
unregisterAgent(agentId: string): boolean {
|
|
33
|
+
const deleted = this.agentDefinitions.delete(agentId);
|
|
34
|
+
if (deleted) {
|
|
35
|
+
this.emit('agent:unregistered', agentId);
|
|
36
|
+
}
|
|
37
|
+
return deleted;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Get all registered agents
|
|
41
|
+
getAgents(): AgentDefinition[] {
|
|
42
|
+
return Array.from(this.agentDefinitions.values());
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Get agent by ID
|
|
46
|
+
getAgent(agentId: string): AgentDefinition | undefined {
|
|
47
|
+
return this.agentDefinitions.get(agentId);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Register a custom handler (tool)
|
|
51
|
+
registerHandler(handler: AgentHandler): void {
|
|
52
|
+
this.handlers.set(handler.name, handler);
|
|
53
|
+
this.emit('handler:registered', handler);
|
|
54
|
+
log.info(`Registered handler: ${handler.name}`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Unregister a handler
|
|
58
|
+
unregisterHandler(name: string): boolean {
|
|
59
|
+
const deleted = this.handlers.delete(name);
|
|
60
|
+
if (deleted) {
|
|
61
|
+
this.emit('handler:unregistered', name);
|
|
62
|
+
}
|
|
63
|
+
return deleted;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Get all handlers
|
|
67
|
+
getHandlers(): AgentHandler[] {
|
|
68
|
+
return Array.from(this.handlers.values());
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Add guardrail
|
|
72
|
+
addGuardrail(guardrail: AgentGuardrail): void {
|
|
73
|
+
this.guardrails.push(guardrail);
|
|
74
|
+
this.emit('guardrail:added', guardrail);
|
|
75
|
+
log.info(`Added guardrail: ${guardrail.type}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Remove guardrail
|
|
79
|
+
removeGuardrail(type: string): boolean {
|
|
80
|
+
const index = this.guardrails.findIndex(g => g.type === type);
|
|
81
|
+
if (index > -1) {
|
|
82
|
+
const removed = this.guardrails.splice(index, 1)[0];
|
|
83
|
+
this.emit('guardrail:removed', removed);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Execute agent with custom handler
|
|
90
|
+
async executeWithHandler(
|
|
91
|
+
agent: Agent,
|
|
92
|
+
handlerName: string,
|
|
93
|
+
params: Record<string, any>
|
|
94
|
+
): Promise<any> {
|
|
95
|
+
const handler = this.handlers.get(handlerName);
|
|
96
|
+
if (!handler) {
|
|
97
|
+
throw new Error(`Handler not found: ${handlerName}`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const context: AgentExecutionContext = {
|
|
101
|
+
agentId: agent.id,
|
|
102
|
+
sessionId: agent.id,
|
|
103
|
+
messages: agent.messages,
|
|
104
|
+
metadata: agent.metadata,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Apply input guardrails
|
|
108
|
+
for (const guardrail of this.guardrails) {
|
|
109
|
+
if (guardrail.type === 'input_filter' && guardrail.enabled) {
|
|
110
|
+
const filtered = await this.applyGuardrail(guardrail, params);
|
|
111
|
+
params = filtered;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Execute handler
|
|
116
|
+
const result = await handler.execute(context, params);
|
|
117
|
+
|
|
118
|
+
// Apply output guardrails
|
|
119
|
+
for (const guardrail of this.guardrails) {
|
|
120
|
+
if (guardrail.type === 'output_filter' && guardrail.enabled) {
|
|
121
|
+
const filtered = await this.applyGuardrail(guardrail, result);
|
|
122
|
+
return filtered;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private async applyGuardrail(guardrail: AgentGuardrail, data: any): Promise<any> {
|
|
130
|
+
switch (guardrail.type) {
|
|
131
|
+
case 'input_filter':
|
|
132
|
+
// Apply input filtering
|
|
133
|
+
return this.filterInput(data, guardrail.config);
|
|
134
|
+
case 'output_filter':
|
|
135
|
+
// Apply output filtering
|
|
136
|
+
return this.filterOutput(data, guardrail.config);
|
|
137
|
+
case 'tool_restriction':
|
|
138
|
+
// Check tool permissions
|
|
139
|
+
this.checkToolRestriction(data, guardrail.config);
|
|
140
|
+
return data;
|
|
141
|
+
default:
|
|
142
|
+
return data;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private filterInput(data: any, config: Record<string, any>): any {
|
|
147
|
+
// Simple input filtering - in production would be more sophisticated
|
|
148
|
+
const blockedPatterns = config.blockedPatterns || [];
|
|
149
|
+
|
|
150
|
+
if (typeof data === 'string') {
|
|
151
|
+
for (const pattern of blockedPatterns) {
|
|
152
|
+
if (data.includes(pattern)) {
|
|
153
|
+
throw new Error(`Input blocked: contains "${pattern}"`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return data;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private filterOutput(data: any, config: Record<string, any>): any {
|
|
162
|
+
// Simple output filtering
|
|
163
|
+
const requiredPatterns = config.requiredPatterns || [];
|
|
164
|
+
const blockedPatterns = config.blockedPatterns || [];
|
|
165
|
+
|
|
166
|
+
if (typeof data === 'string') {
|
|
167
|
+
for (const pattern of blockedPatterns) {
|
|
168
|
+
if (data.includes(pattern)) {
|
|
169
|
+
data = data.replace(pattern, '[BLOCKED]');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (requiredPatterns.length > 0) {
|
|
174
|
+
const hasRequired = requiredPatterns.some(p => data.includes(p));
|
|
175
|
+
if (!hasRequired) {
|
|
176
|
+
log.warn('Output does not contain required patterns');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return data;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private checkToolRestriction(action: any, config: Record<string, any>): void {
|
|
185
|
+
const allowedTools = config.allowedTools;
|
|
186
|
+
const deniedTools = config.deniedTools || [];
|
|
187
|
+
const toolName = action.toolName || action.type;
|
|
188
|
+
|
|
189
|
+
if (allowedTools && !allowedTools.includes(toolName)) {
|
|
190
|
+
throw new Error(`Tool not allowed: ${toolName}`);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (deniedTools.includes(toolName)) {
|
|
194
|
+
throw new Error(`Tool denied: ${toolName}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Create agent from definition
|
|
199
|
+
async createAgentFromDefinition(
|
|
200
|
+
definitionId: string,
|
|
201
|
+
options: {
|
|
202
|
+
projectPath: string;
|
|
203
|
+
providerId?: string;
|
|
204
|
+
model?: string;
|
|
205
|
+
}
|
|
206
|
+
): Promise<Partial<Agent>> {
|
|
207
|
+
const definition = this.agentDefinitions.get(definitionId);
|
|
208
|
+
if (!definition) {
|
|
209
|
+
throw new Error(`Agent definition not found: ${definitionId}`);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const agent: Partial<Agent> = {
|
|
213
|
+
id: `agent_${Date.now()}`,
|
|
214
|
+
name: definition.name,
|
|
215
|
+
projectPath: options.projectPath,
|
|
216
|
+
providerId: options.providerId || definition.provider || 'openai',
|
|
217
|
+
model: options.model || definition.model || 'gpt-4o',
|
|
218
|
+
skills: definition.skills || [],
|
|
219
|
+
messages: [],
|
|
220
|
+
tasks: [],
|
|
221
|
+
metadata: {
|
|
222
|
+
definitionId: definition.id,
|
|
223
|
+
version: definition.version,
|
|
224
|
+
author: definition.author,
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// Add system prompt from definition
|
|
229
|
+
if (definition.systemPrompt) {
|
|
230
|
+
agent.messages = [{
|
|
231
|
+
id: `msg_${Date.now()}`,
|
|
232
|
+
role: 'system',
|
|
233
|
+
content: definition.systemPrompt,
|
|
234
|
+
timestamp: new Date(),
|
|
235
|
+
}];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
this.emit('agent:created', agent);
|
|
239
|
+
return agent;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Build system prompt from handlers
|
|
243
|
+
buildHandlerSystemPrompt(): string {
|
|
244
|
+
const parts: string[] = ['## Available Tools'];
|
|
245
|
+
|
|
246
|
+
for (const handler of this.handlers.values()) {
|
|
247
|
+
const paramsDesc = handler.parameters
|
|
248
|
+
? Object.entries(handler.parameters)
|
|
249
|
+
.map(([key, val]) => `- ${key}: ${(val as any).type || 'any'}`)
|
|
250
|
+
.join('\n')
|
|
251
|
+
: 'No parameters';
|
|
252
|
+
|
|
253
|
+
parts.push(`### ${handler.name}`);
|
|
254
|
+
parts.push(handler.description);
|
|
255
|
+
parts.push(`Parameters:\n${paramsDesc}`);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return parts.join('\n\n');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
cleanup(): void {
|
|
262
|
+
this.handlers.clear();
|
|
263
|
+
this.guardrails = [];
|
|
264
|
+
this.agentDefinitions.clear();
|
|
265
|
+
this.removeAllListeners();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export default AgentSDK;
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import log from 'electron-log';
|
|
5
|
+
|
|
6
|
+
export interface ToolResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
output: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ViewToolParams {
|
|
13
|
+
file_path: string;
|
|
14
|
+
offset?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface EditToolParams {
|
|
19
|
+
file_path: string;
|
|
20
|
+
old_string: string;
|
|
21
|
+
new_string: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface BashToolParams {
|
|
25
|
+
command: string;
|
|
26
|
+
timeout?: number;
|
|
27
|
+
cwd?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface GlobToolParams {
|
|
31
|
+
pattern: string;
|
|
32
|
+
path?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface GrepToolParams {
|
|
36
|
+
pattern: string;
|
|
37
|
+
path?: string;
|
|
38
|
+
include?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface LsToolParams {
|
|
42
|
+
path: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class AgentTools {
|
|
46
|
+
private worktreePath: string;
|
|
47
|
+
|
|
48
|
+
constructor(worktreePath: string) {
|
|
49
|
+
this.worktreePath = worktreePath;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private resolvePath(filePath: string): string {
|
|
53
|
+
const resolved = path.resolve(this.worktreePath, filePath);
|
|
54
|
+
const resolvedRoot = path.resolve(this.worktreePath);
|
|
55
|
+
if (!resolved.startsWith(resolvedRoot + path.sep) && resolved !== resolvedRoot) {
|
|
56
|
+
throw new Error('Path traversal detected: ' + filePath);
|
|
57
|
+
}
|
|
58
|
+
return resolved;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async view(params: ViewToolParams): Promise<ToolResult> {
|
|
62
|
+
try {
|
|
63
|
+
const fullPath = this.resolvePath(params.file_path);
|
|
64
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
65
|
+
const lines = content.split('\n');
|
|
66
|
+
|
|
67
|
+
const offset = params.offset || 1;
|
|
68
|
+
const limit = params.limit || 200;
|
|
69
|
+
const startLine = Math.max(0, offset - 1);
|
|
70
|
+
const endLine = Math.min(lines.length, startLine + limit);
|
|
71
|
+
|
|
72
|
+
const selectedLines = lines.slice(startLine, endLine);
|
|
73
|
+
const lineNumbers = selectedLines.map((_, idx) => startLine + idx + 1);
|
|
74
|
+
|
|
75
|
+
const output = selectedLines
|
|
76
|
+
.map((line, idx) => `${lineNumbers[idx]}${' '.repeat(6 - String(lineNumbers[idx]).length)}|${line}`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
output: output + (endLine < lines.length ? '\n... (truncated)' : '')
|
|
82
|
+
};
|
|
83
|
+
} catch (error) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
output: '',
|
|
87
|
+
error: error instanceof Error ? error.message : String(error)
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async edit(params: EditToolParams): Promise<ToolResult> {
|
|
93
|
+
try {
|
|
94
|
+
const fullPath = this.resolvePath(params.file_path);
|
|
95
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
96
|
+
|
|
97
|
+
if (!content.includes(params.old_string)) {
|
|
98
|
+
return {
|
|
99
|
+
success: false,
|
|
100
|
+
output: '',
|
|
101
|
+
error: `String not found in file: "${params.old_string.slice(0, 50)}..."`
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const occurrences = content.split(params.old_string).length - 1;
|
|
106
|
+
if (occurrences > 1) {
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
output: '',
|
|
110
|
+
error: `Multiple occurrences found (${occurrences}). Be more specific.`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const newContent = content.replace(params.old_string, params.new_string);
|
|
115
|
+
await fs.writeFile(fullPath, newContent, 'utf-8');
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
output: `File edited successfully: ${params.file_path}`
|
|
120
|
+
};
|
|
121
|
+
} catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
output: '',
|
|
125
|
+
error: error instanceof Error ? error.message : String(error)
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async bash(params: BashToolParams): Promise<ToolResult> {
|
|
131
|
+
return new Promise((resolve) => {
|
|
132
|
+
const cwd = params.cwd ? this.resolvePath(params.cwd) : this.worktreePath;
|
|
133
|
+
const timeout = params.timeout || 120000;
|
|
134
|
+
|
|
135
|
+
const [cmd, ...args] = params.command.split(' ');
|
|
136
|
+
|
|
137
|
+
const child = spawn(cmd, args, {
|
|
138
|
+
cwd,
|
|
139
|
+
shell: true,
|
|
140
|
+
env: { ...process.env, FORCE_COLOR: '1' }
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
let stdout = '';
|
|
144
|
+
let stderr = '';
|
|
145
|
+
|
|
146
|
+
child.stdout?.on('data', (data) => {
|
|
147
|
+
stdout += data.toString();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
child.stderr?.on('data', (data) => {
|
|
151
|
+
stderr += data.toString();
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const timeoutId = setTimeout(() => {
|
|
155
|
+
child.kill();
|
|
156
|
+
resolve({
|
|
157
|
+
success: false,
|
|
158
|
+
output: stdout,
|
|
159
|
+
error: `Command timed out after ${timeout}ms`
|
|
160
|
+
});
|
|
161
|
+
}, timeout);
|
|
162
|
+
|
|
163
|
+
child.on('close', (code) => {
|
|
164
|
+
clearTimeout(timeoutId);
|
|
165
|
+
resolve({
|
|
166
|
+
success: code === 0,
|
|
167
|
+
output: stdout || stderr,
|
|
168
|
+
error: code !== 0 ? `Exit code ${code}${stderr ? ': ' + stderr : ''}` : undefined
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
child.on('error', (error) => {
|
|
173
|
+
clearTimeout(timeoutId);
|
|
174
|
+
resolve({
|
|
175
|
+
success: false,
|
|
176
|
+
output: '',
|
|
177
|
+
error: error.message
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async glob(params: GlobToolParams): Promise<ToolResult> {
|
|
184
|
+
try {
|
|
185
|
+
const searchPath = params.path ? this.resolvePath(params.path) : this.worktreePath;
|
|
186
|
+
const pattern = params.pattern;
|
|
187
|
+
|
|
188
|
+
// Simple glob implementation using native fs
|
|
189
|
+
const files: string[] = [];
|
|
190
|
+
|
|
191
|
+
async function walk(dir: string, relativeDir: string) {
|
|
192
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
193
|
+
|
|
194
|
+
for (const entry of entries) {
|
|
195
|
+
const fullPath = path.join(dir, entry.name);
|
|
196
|
+
const relativePath = relativeDir ? path.join(relativeDir, entry.name) : entry.name;
|
|
197
|
+
|
|
198
|
+
if (entry.isDirectory()) {
|
|
199
|
+
if (!entry.name.startsWith('.') &&
|
|
200
|
+
entry.name !== 'node_modules' &&
|
|
201
|
+
entry.name !== 'dist' &&
|
|
202
|
+
entry.name !== 'build') {
|
|
203
|
+
await walk(fullPath, relativePath);
|
|
204
|
+
}
|
|
205
|
+
} else if (entry.isFile()) {
|
|
206
|
+
// Simple pattern matching
|
|
207
|
+
if (pattern.includes('*')) {
|
|
208
|
+
const regex = new RegExp('^' + pattern.replace(/\*\*/g, '.*').replace(/\*/g, '[^/]*') + '$');
|
|
209
|
+
if (regex.test(relativePath)) {
|
|
210
|
+
files.push(relativePath);
|
|
211
|
+
}
|
|
212
|
+
} else if (relativePath.endsWith(pattern) || relativePath.includes(pattern)) {
|
|
213
|
+
files.push(relativePath);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
await walk(searchPath, '');
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
success: true,
|
|
223
|
+
output: files.join('\n') || 'No files found'
|
|
224
|
+
};
|
|
225
|
+
} catch (error) {
|
|
226
|
+
return {
|
|
227
|
+
success: false,
|
|
228
|
+
output: '',
|
|
229
|
+
error: error instanceof Error ? error.message : String(error)
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async grep(params: GrepToolParams): Promise<ToolResult> {
|
|
235
|
+
try {
|
|
236
|
+
const searchPath = params.path ? this.resolvePath(params.path) : this.worktreePath;
|
|
237
|
+
const { pattern, include } = params;
|
|
238
|
+
|
|
239
|
+
const result = await this.bash({
|
|
240
|
+
command: `grep -r -n ${include ? `--include="${include}"` : ''} "${pattern}" .`,
|
|
241
|
+
cwd: searchPath
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
return result;
|
|
245
|
+
} catch (error) {
|
|
246
|
+
return {
|
|
247
|
+
success: false,
|
|
248
|
+
output: '',
|
|
249
|
+
error: error instanceof Error ? error.message : String(error)
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async ls(params: LsToolParams): Promise<ToolResult> {
|
|
255
|
+
try {
|
|
256
|
+
const fullPath = this.resolvePath(params.path);
|
|
257
|
+
const entries = await fs.readdir(fullPath, { withFileTypes: true });
|
|
258
|
+
|
|
259
|
+
const output = entries
|
|
260
|
+
.map(entry => {
|
|
261
|
+
const type = entry.isDirectory() ? 'd' : entry.isFile() ? 'f' : '?';
|
|
262
|
+
return `${type} ${entry.name}`;
|
|
263
|
+
})
|
|
264
|
+
.join('\n');
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
success: true,
|
|
268
|
+
output: output || '(empty directory)'
|
|
269
|
+
};
|
|
270
|
+
} catch (error) {
|
|
271
|
+
return {
|
|
272
|
+
success: false,
|
|
273
|
+
output: '',
|
|
274
|
+
error: error instanceof Error ? error.message : String(error)
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
getToolDefinitions(): Array<{ name: string; description: string; parameters: object }> {
|
|
280
|
+
return [
|
|
281
|
+
{
|
|
282
|
+
name: 'view',
|
|
283
|
+
description: 'View the contents of a file. Use offset and limit for large files.',
|
|
284
|
+
parameters: {
|
|
285
|
+
type: 'object',
|
|
286
|
+
properties: {
|
|
287
|
+
file_path: { type: 'string', description: 'Path to the file' },
|
|
288
|
+
offset: { type: 'number', description: 'Start line number (1-based)' },
|
|
289
|
+
limit: { type: 'number', description: 'Number of lines to show (max 200)' }
|
|
290
|
+
},
|
|
291
|
+
required: ['file_path']
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
name: 'edit',
|
|
296
|
+
description: 'Edit a file by replacing a specific string. The old_string must match exactly and uniquely.',
|
|
297
|
+
parameters: {
|
|
298
|
+
type: 'object',
|
|
299
|
+
properties: {
|
|
300
|
+
file_path: { type: 'string', description: 'Path to the file' },
|
|
301
|
+
old_string: { type: 'string', description: 'Exact string to replace' },
|
|
302
|
+
new_string: { type: 'string', description: 'Replacement string' }
|
|
303
|
+
},
|
|
304
|
+
required: ['file_path', 'old_string', 'new_string']
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
name: 'bash',
|
|
309
|
+
description: 'Execute a bash command in the worktree. Use for running tests, builds, git commands, etc.',
|
|
310
|
+
parameters: {
|
|
311
|
+
type: 'object',
|
|
312
|
+
properties: {
|
|
313
|
+
command: { type: 'string', description: 'Command to execute' },
|
|
314
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds (default 120000)' }
|
|
315
|
+
},
|
|
316
|
+
required: ['command']
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
name: 'glob',
|
|
321
|
+
description: 'Find files matching a glob pattern (e.g., "**/*.ts").',
|
|
322
|
+
parameters: {
|
|
323
|
+
type: 'object',
|
|
324
|
+
properties: {
|
|
325
|
+
pattern: { type: 'string', description: 'Glob pattern' },
|
|
326
|
+
path: { type: 'string', description: 'Directory to search in' }
|
|
327
|
+
},
|
|
328
|
+
required: ['pattern']
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
name: 'grep',
|
|
333
|
+
description: 'Search for a pattern in file contents using grep.',
|
|
334
|
+
parameters: {
|
|
335
|
+
type: 'object',
|
|
336
|
+
properties: {
|
|
337
|
+
pattern: { type: 'string', description: 'Search pattern' },
|
|
338
|
+
path: { type: 'string', description: 'Directory to search in' },
|
|
339
|
+
include: { type: 'string', description: 'File pattern to include (e.g., "*.ts")' }
|
|
340
|
+
},
|
|
341
|
+
required: ['pattern']
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
name: 'ls',
|
|
346
|
+
description: 'List the contents of a directory.',
|
|
347
|
+
parameters: {
|
|
348
|
+
type: 'object',
|
|
349
|
+
properties: {
|
|
350
|
+
path: { type: 'string', description: 'Directory path' }
|
|
351
|
+
},
|
|
352
|
+
required: ['path']
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
];
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
async executeTool(name: string, params: any): Promise<ToolResult> {
|
|
359
|
+
switch (name) {
|
|
360
|
+
case 'view':
|
|
361
|
+
return this.view(params);
|
|
362
|
+
case 'edit':
|
|
363
|
+
return this.edit(params);
|
|
364
|
+
case 'bash':
|
|
365
|
+
return this.bash(params);
|
|
366
|
+
case 'glob':
|
|
367
|
+
return this.glob(params);
|
|
368
|
+
case 'grep':
|
|
369
|
+
return this.grep(params);
|
|
370
|
+
case 'ls':
|
|
371
|
+
return this.ls(params);
|
|
372
|
+
default:
|
|
373
|
+
return {
|
|
374
|
+
success: false,
|
|
375
|
+
output: '',
|
|
376
|
+
error: `Unknown tool: ${name}`
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|