@deepseekdev/coder 1.0.74
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/LICENSE +21 -0
- package/agents/agi-code.rules.json +159 -0
- package/agents/general.rules.json +181 -0
- package/dist/bin/cliMode.d.ts +8 -0
- package/dist/bin/cliMode.d.ts.map +1 -0
- package/dist/bin/cliMode.js +20 -0
- package/dist/bin/cliMode.js.map +1 -0
- package/dist/bin/deepseek.d.ts +3 -0
- package/dist/bin/deepseek.d.ts.map +1 -0
- package/dist/bin/deepseek.js +137 -0
- package/dist/bin/deepseek.js.map +1 -0
- package/dist/bin/erosolar.d.ts +7 -0
- package/dist/bin/erosolar.d.ts.map +1 -0
- package/dist/bin/erosolar.js +7 -0
- package/dist/bin/erosolar.js.map +1 -0
- package/dist/bin/lean.d.ts +9 -0
- package/dist/bin/lean.d.ts.map +1 -0
- package/dist/bin/lean.js +333 -0
- package/dist/bin/lean.js.map +1 -0
- package/dist/bin/selfTest.d.ts +14 -0
- package/dist/bin/selfTest.d.ts.map +1 -0
- package/dist/bin/selfTest.js +298 -0
- package/dist/bin/selfTest.js.map +1 -0
- package/dist/capabilities/baseCapability.d.ts +72 -0
- package/dist/capabilities/baseCapability.d.ts.map +1 -0
- package/dist/capabilities/baseCapability.js +183 -0
- package/dist/capabilities/baseCapability.js.map +1 -0
- package/dist/capabilities/bashCapability.d.ts +13 -0
- package/dist/capabilities/bashCapability.d.ts.map +1 -0
- package/dist/capabilities/bashCapability.js +24 -0
- package/dist/capabilities/bashCapability.js.map +1 -0
- package/dist/capabilities/editCapability.d.ts +17 -0
- package/dist/capabilities/editCapability.d.ts.map +1 -0
- package/dist/capabilities/editCapability.js +27 -0
- package/dist/capabilities/editCapability.js.map +1 -0
- package/dist/capabilities/enhancedGitCapability.d.ts +7 -0
- package/dist/capabilities/enhancedGitCapability.d.ts.map +1 -0
- package/dist/capabilities/enhancedGitCapability.js +220 -0
- package/dist/capabilities/enhancedGitCapability.js.map +1 -0
- package/dist/capabilities/filesystemCapability.d.ts +13 -0
- package/dist/capabilities/filesystemCapability.d.ts.map +1 -0
- package/dist/capabilities/filesystemCapability.js +24 -0
- package/dist/capabilities/filesystemCapability.js.map +1 -0
- package/dist/capabilities/gitHistoryCapability.d.ts +6 -0
- package/dist/capabilities/gitHistoryCapability.d.ts.map +1 -0
- package/dist/capabilities/gitHistoryCapability.js +160 -0
- package/dist/capabilities/gitHistoryCapability.js.map +1 -0
- package/dist/capabilities/hitlCapability.d.ts +18 -0
- package/dist/capabilities/hitlCapability.d.ts.map +1 -0
- package/dist/capabilities/hitlCapability.js +29 -0
- package/dist/capabilities/hitlCapability.js.map +1 -0
- package/dist/capabilities/index.d.ts +11 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +13 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/searchCapability.d.ts +19 -0
- package/dist/capabilities/searchCapability.d.ts.map +1 -0
- package/dist/capabilities/searchCapability.js +29 -0
- package/dist/capabilities/searchCapability.js.map +1 -0
- package/dist/capabilities/toolManifest.d.ts +3 -0
- package/dist/capabilities/toolManifest.d.ts.map +1 -0
- package/dist/capabilities/toolManifest.js +163 -0
- package/dist/capabilities/toolManifest.js.map +1 -0
- package/dist/capabilities/toolRegistry.d.ts +25 -0
- package/dist/capabilities/toolRegistry.d.ts.map +1 -0
- package/dist/capabilities/toolRegistry.js +150 -0
- package/dist/capabilities/toolRegistry.js.map +1 -0
- package/dist/capabilities/unifiedCodingCapability.d.ts +48 -0
- package/dist/capabilities/unifiedCodingCapability.d.ts.map +1 -0
- package/dist/capabilities/unifiedCodingCapability.js +631 -0
- package/dist/capabilities/unifiedCodingCapability.js.map +1 -0
- package/dist/capabilities/webCapability.d.ts +23 -0
- package/dist/capabilities/webCapability.d.ts.map +1 -0
- package/dist/capabilities/webCapability.js +33 -0
- package/dist/capabilities/webCapability.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +155 -0
- package/dist/config.js.map +1 -0
- package/dist/contracts/agent-profiles.schema.json +43 -0
- package/dist/contracts/agent-schemas.json +480 -0
- package/dist/contracts/models.schema.json +9 -0
- package/dist/contracts/module-schema.json +430 -0
- package/dist/contracts/schemas/agent-profile.schema.json +157 -0
- package/dist/contracts/schemas/agent-rules.schema.json +238 -0
- package/dist/contracts/schemas/agent-schemas.schema.json +528 -0
- package/dist/contracts/schemas/agent.schema.json +90 -0
- package/dist/contracts/schemas/tool-selection.schema.json +174 -0
- package/dist/contracts/tools.schema.json +82 -0
- package/dist/contracts/unified-schema.json +757 -0
- package/dist/contracts/v1/agent.d.ts +187 -0
- package/dist/contracts/v1/agent.d.ts.map +1 -0
- package/dist/contracts/v1/agent.js +8 -0
- package/dist/contracts/v1/agent.js.map +1 -0
- package/dist/contracts/v1/agentProfileManifest.d.ts +60 -0
- package/dist/contracts/v1/agentProfileManifest.d.ts.map +1 -0
- package/dist/contracts/v1/agentProfileManifest.js +9 -0
- package/dist/contracts/v1/agentProfileManifest.js.map +1 -0
- package/dist/contracts/v1/agentRules.d.ts +60 -0
- package/dist/contracts/v1/agentRules.d.ts.map +1 -0
- package/dist/contracts/v1/agentRules.js +10 -0
- package/dist/contracts/v1/agentRules.js.map +1 -0
- package/dist/contracts/v1/provider.d.ts +149 -0
- package/dist/contracts/v1/provider.d.ts.map +1 -0
- package/dist/contracts/v1/provider.js +7 -0
- package/dist/contracts/v1/provider.js.map +1 -0
- package/dist/contracts/v1/tool.d.ts +136 -0
- package/dist/contracts/v1/tool.d.ts.map +1 -0
- package/dist/contracts/v1/tool.js +7 -0
- package/dist/contracts/v1/tool.js.map +1 -0
- package/dist/contracts/v1/toolAccess.d.ts +43 -0
- package/dist/contracts/v1/toolAccess.d.ts.map +1 -0
- package/dist/contracts/v1/toolAccess.js +9 -0
- package/dist/contracts/v1/toolAccess.js.map +1 -0
- package/dist/core/agent.d.ts +320 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +1627 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agentProfileManifest.d.ts +3 -0
- package/dist/core/agentProfileManifest.d.ts.map +1 -0
- package/dist/core/agentProfileManifest.js +188 -0
- package/dist/core/agentProfileManifest.js.map +1 -0
- package/dist/core/agentProfiles.d.ts +22 -0
- package/dist/core/agentProfiles.d.ts.map +1 -0
- package/dist/core/agentProfiles.js +35 -0
- package/dist/core/agentProfiles.js.map +1 -0
- package/dist/core/agentRulebook.d.ts +11 -0
- package/dist/core/agentRulebook.d.ts.map +1 -0
- package/dist/core/agentRulebook.js +136 -0
- package/dist/core/agentRulebook.js.map +1 -0
- package/dist/core/agentSchemaLoader.d.ts +131 -0
- package/dist/core/agentSchemaLoader.d.ts.map +1 -0
- package/dist/core/agentSchemaLoader.js +235 -0
- package/dist/core/agentSchemaLoader.js.map +1 -0
- package/dist/core/agiCore.d.ts +312 -0
- package/dist/core/agiCore.d.ts.map +1 -0
- package/dist/core/agiCore.js +1585 -0
- package/dist/core/agiCore.js.map +1 -0
- package/dist/core/aiErrorFixer.d.ts +57 -0
- package/dist/core/aiErrorFixer.d.ts.map +1 -0
- package/dist/core/aiErrorFixer.js +214 -0
- package/dist/core/aiErrorFixer.js.map +1 -0
- package/dist/core/bashCommandGuidance.d.ts +16 -0
- package/dist/core/bashCommandGuidance.d.ts.map +1 -0
- package/dist/core/bashCommandGuidance.js +40 -0
- package/dist/core/bashCommandGuidance.js.map +1 -0
- package/dist/core/constants.d.ts +31 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +62 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/contextManager.d.ts +271 -0
- package/dist/core/contextManager.d.ts.map +1 -0
- package/dist/core/contextManager.js +1073 -0
- package/dist/core/contextManager.js.map +1 -0
- package/dist/core/contextWindow.d.ts +42 -0
- package/dist/core/contextWindow.d.ts.map +1 -0
- package/dist/core/contextWindow.js +123 -0
- package/dist/core/contextWindow.js.map +1 -0
- package/dist/core/customCommands.d.ts +19 -0
- package/dist/core/customCommands.d.ts.map +1 -0
- package/dist/core/customCommands.js +85 -0
- package/dist/core/customCommands.js.map +1 -0
- package/dist/core/deepBugAnalyzer.d.ts +25 -0
- package/dist/core/deepBugAnalyzer.d.ts.map +1 -0
- package/dist/core/deepBugAnalyzer.js +44 -0
- package/dist/core/deepBugAnalyzer.js.map +1 -0
- package/dist/core/dynamicGuardrails.d.ts +207 -0
- package/dist/core/dynamicGuardrails.d.ts.map +1 -0
- package/dist/core/dynamicGuardrails.js +455 -0
- package/dist/core/dynamicGuardrails.js.map +1 -0
- package/dist/core/embeddingProviders.d.ts +80 -0
- package/dist/core/embeddingProviders.d.ts.map +1 -0
- package/dist/core/embeddingProviders.js +241 -0
- package/dist/core/embeddingProviders.js.map +1 -0
- package/dist/core/episodicMemory.d.ts +259 -0
- package/dist/core/episodicMemory.d.ts.map +1 -0
- package/dist/core/episodicMemory.js +834 -0
- package/dist/core/episodicMemory.js.map +1 -0
- package/dist/core/errors/apiKeyErrors.d.ts +11 -0
- package/dist/core/errors/apiKeyErrors.d.ts.map +1 -0
- package/dist/core/errors/apiKeyErrors.js +159 -0
- package/dist/core/errors/apiKeyErrors.js.map +1 -0
- package/dist/core/errors/errorTypes.d.ts +111 -0
- package/dist/core/errors/errorTypes.d.ts.map +1 -0
- package/dist/core/errors/errorTypes.js +345 -0
- package/dist/core/errors/errorTypes.js.map +1 -0
- package/dist/core/errors/index.d.ts +50 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +156 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/errors/networkErrors.d.ts +14 -0
- package/dist/core/errors/networkErrors.d.ts.map +1 -0
- package/dist/core/errors/networkErrors.js +53 -0
- package/dist/core/errors/networkErrors.js.map +1 -0
- package/dist/core/errors/safetyValidator.d.ts +109 -0
- package/dist/core/errors/safetyValidator.d.ts.map +1 -0
- package/dist/core/errors/safetyValidator.js +271 -0
- package/dist/core/errors/safetyValidator.js.map +1 -0
- package/dist/core/errors.d.ts +4 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +33 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/finalResponseFormatter.d.ts +10 -0
- package/dist/core/finalResponseFormatter.d.ts.map +1 -0
- package/dist/core/finalResponseFormatter.js +14 -0
- package/dist/core/finalResponseFormatter.js.map +1 -0
- package/dist/core/flowProtection.d.ts +154 -0
- package/dist/core/flowProtection.d.ts.map +1 -0
- package/dist/core/flowProtection.js +439 -0
- package/dist/core/flowProtection.js.map +1 -0
- package/dist/core/gitWorktreeManager.d.ts +126 -0
- package/dist/core/gitWorktreeManager.d.ts.map +1 -0
- package/dist/core/gitWorktreeManager.js +403 -0
- package/dist/core/gitWorktreeManager.js.map +1 -0
- package/dist/core/global-macbook-access.d.ts +59 -0
- package/dist/core/global-macbook-access.d.ts.map +1 -0
- package/dist/core/global-macbook-access.js +101 -0
- package/dist/core/global-macbook-access.js.map +1 -0
- package/dist/core/guardrails.d.ts +146 -0
- package/dist/core/guardrails.d.ts.map +1 -0
- package/dist/core/guardrails.js +361 -0
- package/dist/core/guardrails.js.map +1 -0
- package/dist/core/hallucinationGuard.d.ts +57 -0
- package/dist/core/hallucinationGuard.d.ts.map +1 -0
- package/dist/core/hallucinationGuard.js +237 -0
- package/dist/core/hallucinationGuard.js.map +1 -0
- package/dist/core/hitl.d.ts +109 -0
- package/dist/core/hitl.d.ts.map +1 -0
- package/dist/core/hitl.js +371 -0
- package/dist/core/hitl.js.map +1 -0
- package/dist/core/hooks.d.ts +113 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +364 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/hotReload.d.ts +154 -0
- package/dist/core/hotReload.d.ts.map +1 -0
- package/dist/core/hotReload.js +451 -0
- package/dist/core/hotReload.js.map +1 -0
- package/dist/core/hypothesisEngine.d.ts +27 -0
- package/dist/core/hypothesisEngine.d.ts.map +1 -0
- package/dist/core/hypothesisEngine.js +58 -0
- package/dist/core/hypothesisEngine.js.map +1 -0
- package/dist/core/index.d.ts +18 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/initialExplorer.d.ts +53 -0
- package/dist/core/initialExplorer.d.ts.map +1 -0
- package/dist/core/initialExplorer.js +423 -0
- package/dist/core/initialExplorer.js.map +1 -0
- package/dist/core/inputProtection.d.ts +122 -0
- package/dist/core/inputProtection.d.ts.map +1 -0
- package/dist/core/inputProtection.js +422 -0
- package/dist/core/inputProtection.js.map +1 -0
- package/dist/core/liveGCPVerification.d.ts +41 -0
- package/dist/core/liveGCPVerification.d.ts.map +1 -0
- package/dist/core/liveGCPVerification.js +745 -0
- package/dist/core/liveGCPVerification.js.map +1 -0
- package/dist/core/modelDiscovery.d.ts +105 -0
- package/dist/core/modelDiscovery.d.ts.map +1 -0
- package/dist/core/modelDiscovery.js +768 -0
- package/dist/core/modelDiscovery.js.map +1 -0
- package/dist/core/multilinePasteHandler.d.ts +35 -0
- package/dist/core/multilinePasteHandler.d.ts.map +1 -0
- package/dist/core/multilinePasteHandler.js +81 -0
- package/dist/core/multilinePasteHandler.js.map +1 -0
- package/dist/core/parallelExecutor.d.ts +215 -0
- package/dist/core/parallelExecutor.d.ts.map +1 -0
- package/dist/core/parallelExecutor.js +584 -0
- package/dist/core/parallelExecutor.js.map +1 -0
- package/dist/core/preferences.d.ts +71 -0
- package/dist/core/preferences.d.ts.map +1 -0
- package/dist/core/preferences.js +341 -0
- package/dist/core/preferences.js.map +1 -0
- package/dist/core/productTestHarness.d.ts +46 -0
- package/dist/core/productTestHarness.d.ts.map +1 -0
- package/dist/core/productTestHarness.js +128 -0
- package/dist/core/productTestHarness.js.map +1 -0
- package/dist/core/providerKeys.d.ts +20 -0
- package/dist/core/providerKeys.d.ts.map +1 -0
- package/dist/core/providerKeys.js +40 -0
- package/dist/core/providerKeys.js.map +1 -0
- package/dist/core/resultVerification.d.ts +47 -0
- package/dist/core/resultVerification.d.ts.map +1 -0
- package/dist/core/resultVerification.js +126 -0
- package/dist/core/resultVerification.js.map +1 -0
- package/dist/core/revenueEnvValidator.d.ts +30 -0
- package/dist/core/revenueEnvValidator.d.ts.map +1 -0
- package/dist/core/revenueEnvValidator.js +244 -0
- package/dist/core/revenueEnvValidator.js.map +1 -0
- package/dist/core/schemaValidator.d.ts +49 -0
- package/dist/core/schemaValidator.d.ts.map +1 -0
- package/dist/core/schemaValidator.js +234 -0
- package/dist/core/schemaValidator.js.map +1 -0
- package/dist/core/secretStore.d.ts +48 -0
- package/dist/core/secretStore.d.ts.map +1 -0
- package/dist/core/secretStore.js +295 -0
- package/dist/core/secretStore.js.map +1 -0
- package/dist/core/selfUpgrade.d.ts +79 -0
- package/dist/core/selfUpgrade.d.ts.map +1 -0
- package/dist/core/selfUpgrade.js +92 -0
- package/dist/core/selfUpgrade.js.map +1 -0
- package/dist/core/sessionStorage.d.ts +10 -0
- package/dist/core/sessionStorage.d.ts.map +1 -0
- package/dist/core/sessionStorage.js +46 -0
- package/dist/core/sessionStorage.js.map +1 -0
- package/dist/core/sessionStore.d.ts +35 -0
- package/dist/core/sessionStore.d.ts.map +1 -0
- package/dist/core/sessionStore.js +191 -0
- package/dist/core/sessionStore.js.map +1 -0
- package/dist/core/shutdown.d.ts +34 -0
- package/dist/core/shutdown.d.ts.map +1 -0
- package/dist/core/shutdown.js +173 -0
- package/dist/core/shutdown.js.map +1 -0
- package/dist/core/sudoPasswordManager.d.ts +52 -0
- package/dist/core/sudoPasswordManager.d.ts.map +1 -0
- package/dist/core/sudoPasswordManager.js +115 -0
- package/dist/core/sudoPasswordManager.js.map +1 -0
- package/dist/core/taskCompletionDetector.d.ts +112 -0
- package/dist/core/taskCompletionDetector.d.ts.map +1 -0
- package/dist/core/taskCompletionDetector.js +469 -0
- package/dist/core/taskCompletionDetector.js.map +1 -0
- package/dist/core/testFailureMonitor.d.ts +67 -0
- package/dist/core/testFailureMonitor.d.ts.map +1 -0
- package/dist/core/testFailureMonitor.js +262 -0
- package/dist/core/testFailureMonitor.js.map +1 -0
- package/dist/core/toolPreconditions.d.ts +34 -0
- package/dist/core/toolPreconditions.d.ts.map +1 -0
- package/dist/core/toolPreconditions.js +242 -0
- package/dist/core/toolPreconditions.js.map +1 -0
- package/dist/core/toolRuntime.d.ts +185 -0
- package/dist/core/toolRuntime.d.ts.map +1 -0
- package/dist/core/toolRuntime.js +412 -0
- package/dist/core/toolRuntime.js.map +1 -0
- package/dist/core/types/utilityTypes.d.ts +183 -0
- package/dist/core/types/utilityTypes.d.ts.map +1 -0
- package/dist/core/types/utilityTypes.js +273 -0
- package/dist/core/types/utilityTypes.js.map +1 -0
- package/dist/core/types.d.ts +334 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +76 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/unifiedOrchestrator.d.ts +47 -0
- package/dist/core/unifiedOrchestrator.d.ts.map +1 -0
- package/dist/core/unifiedOrchestrator.js +103 -0
- package/dist/core/unifiedOrchestrator.js.map +1 -0
- package/dist/core/unrestricted-mode.d.ts +42 -0
- package/dist/core/unrestricted-mode.d.ts.map +1 -0
- package/dist/core/unrestricted-mode.js +88 -0
- package/dist/core/unrestricted-mode.js.map +1 -0
- package/dist/core/updateChecker.d.ts +148 -0
- package/dist/core/updateChecker.d.ts.map +1 -0
- package/dist/core/updateChecker.js +593 -0
- package/dist/core/updateChecker.js.map +1 -0
- package/dist/headless/interactiveShell.d.ts +22 -0
- package/dist/headless/interactiveShell.d.ts.map +1 -0
- package/dist/headless/interactiveShell.js +4045 -0
- package/dist/headless/interactiveShell.js.map +1 -0
- package/dist/headless/quickMode.d.ts +26 -0
- package/dist/headless/quickMode.d.ts.map +1 -0
- package/dist/headless/quickMode.js +236 -0
- package/dist/headless/quickMode.js.map +1 -0
- package/dist/leanAgent.d.ts +73 -0
- package/dist/leanAgent.d.ts.map +1 -0
- package/dist/leanAgent.js +175 -0
- package/dist/leanAgent.js.map +1 -0
- package/dist/orchestration/index.d.ts +14 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +12 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/plugins/index.d.ts +49 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +104 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/providers/anthropic/index.d.ts +9 -0
- package/dist/plugins/providers/anthropic/index.d.ts.map +1 -0
- package/dist/plugins/providers/anthropic/index.js +48 -0
- package/dist/plugins/providers/anthropic/index.js.map +1 -0
- package/dist/plugins/providers/deepseek/index.d.ts +11 -0
- package/dist/plugins/providers/deepseek/index.d.ts.map +1 -0
- package/dist/plugins/providers/deepseek/index.js +54 -0
- package/dist/plugins/providers/deepseek/index.js.map +1 -0
- package/dist/plugins/providers/index.d.ts +2 -0
- package/dist/plugins/providers/index.d.ts.map +1 -0
- package/dist/plugins/providers/index.js +17 -0
- package/dist/plugins/providers/index.js.map +1 -0
- package/dist/plugins/providers/openai/index.d.ts +10 -0
- package/dist/plugins/providers/openai/index.d.ts.map +1 -0
- package/dist/plugins/providers/openai/index.js +47 -0
- package/dist/plugins/providers/openai/index.js.map +1 -0
- package/dist/plugins/providers/xai/index.d.ts +10 -0
- package/dist/plugins/providers/xai/index.d.ts.map +1 -0
- package/dist/plugins/providers/xai/index.js +47 -0
- package/dist/plugins/providers/xai/index.js.map +1 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.d.ts +10 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.js +110 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.js.map +1 -0
- package/dist/plugins/tools/bash/localBashPlugin.d.ts +3 -0
- package/dist/plugins/tools/bash/localBashPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/bash/localBashPlugin.js +14 -0
- package/dist/plugins/tools/bash/localBashPlugin.js.map +1 -0
- package/dist/plugins/tools/edit/editPlugin.d.ts +9 -0
- package/dist/plugins/tools/edit/editPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/edit/editPlugin.js +15 -0
- package/dist/plugins/tools/edit/editPlugin.js.map +1 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.d.ts +3 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.js +9 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.js.map +1 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.d.ts +3 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.js +14 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.js.map +1 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.d.ts +3 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.js +9 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.js.map +1 -0
- package/dist/plugins/tools/index.d.ts +3 -0
- package/dist/plugins/tools/index.d.ts.map +1 -0
- package/dist/plugins/tools/index.js +3 -0
- package/dist/plugins/tools/index.js.map +1 -0
- package/dist/plugins/tools/integrity/integrityPlugin.d.ts +3 -0
- package/dist/plugins/tools/integrity/integrityPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/integrity/integrityPlugin.js +31 -0
- package/dist/plugins/tools/integrity/integrityPlugin.js.map +1 -0
- package/dist/plugins/tools/mcp/mcpPlugin.d.ts +3 -0
- package/dist/plugins/tools/mcp/mcpPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/mcp/mcpPlugin.js +27 -0
- package/dist/plugins/tools/mcp/mcpPlugin.js.map +1 -0
- package/dist/plugins/tools/nodeDefaults.d.ts +13 -0
- package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -0
- package/dist/plugins/tools/nodeDefaults.js +31 -0
- package/dist/plugins/tools/nodeDefaults.js.map +1 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.d.ts +3 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.js +340 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.js.map +1 -0
- package/dist/plugins/tools/registry.d.ts +22 -0
- package/dist/plugins/tools/registry.d.ts.map +1 -0
- package/dist/plugins/tools/registry.js +58 -0
- package/dist/plugins/tools/registry.js.map +1 -0
- package/dist/plugins/tools/search/localSearchPlugin.d.ts +3 -0
- package/dist/plugins/tools/search/localSearchPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/search/localSearchPlugin.js +14 -0
- package/dist/plugins/tools/search/localSearchPlugin.js.map +1 -0
- package/dist/plugins/tools/skills/skillPlugin.d.ts +3 -0
- package/dist/plugins/tools/skills/skillPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/skills/skillPlugin.js +27 -0
- package/dist/plugins/tools/skills/skillPlugin.js.map +1 -0
- package/dist/providers/baseProvider.d.ts +148 -0
- package/dist/providers/baseProvider.d.ts.map +1 -0
- package/dist/providers/baseProvider.js +284 -0
- package/dist/providers/baseProvider.js.map +1 -0
- package/dist/providers/openaiChatCompletionsProvider.d.ts +64 -0
- package/dist/providers/openaiChatCompletionsProvider.d.ts.map +1 -0
- package/dist/providers/openaiChatCompletionsProvider.js +1003 -0
- package/dist/providers/openaiChatCompletionsProvider.js.map +1 -0
- package/dist/providers/providerFactory.d.ts +22 -0
- package/dist/providers/providerFactory.d.ts.map +1 -0
- package/dist/providers/providerFactory.js +25 -0
- package/dist/providers/providerFactory.js.map +1 -0
- package/dist/providers/resilientProvider.d.ts +103 -0
- package/dist/providers/resilientProvider.d.ts.map +1 -0
- package/dist/providers/resilientProvider.js +462 -0
- package/dist/providers/resilientProvider.js.map +1 -0
- package/dist/runtime/agentController.d.ts +114 -0
- package/dist/runtime/agentController.d.ts.map +1 -0
- package/dist/runtime/agentController.js +707 -0
- package/dist/runtime/agentController.js.map +1 -0
- package/dist/runtime/agentHost.d.ts +61 -0
- package/dist/runtime/agentHost.d.ts.map +1 -0
- package/dist/runtime/agentHost.js +157 -0
- package/dist/runtime/agentHost.js.map +1 -0
- package/dist/runtime/agentSession.d.ts +45 -0
- package/dist/runtime/agentSession.d.ts.map +1 -0
- package/dist/runtime/agentSession.js +210 -0
- package/dist/runtime/agentSession.js.map +1 -0
- package/dist/runtime/agentWorkerPool.d.ts +167 -0
- package/dist/runtime/agentWorkerPool.d.ts.map +1 -0
- package/dist/runtime/agentWorkerPool.js +435 -0
- package/dist/runtime/agentWorkerPool.js.map +1 -0
- package/dist/runtime/node.d.ts +7 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +25 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/runtime/universal.d.ts +18 -0
- package/dist/runtime/universal.d.ts.map +1 -0
- package/dist/runtime/universal.js +21 -0
- package/dist/runtime/universal.js.map +1 -0
- package/dist/shell/autoExecutor.d.ts +70 -0
- package/dist/shell/autoExecutor.d.ts.map +1 -0
- package/dist/shell/autoExecutor.js +320 -0
- package/dist/shell/autoExecutor.js.map +1 -0
- package/dist/shell/commandRegistry.d.ts +122 -0
- package/dist/shell/commandRegistry.d.ts.map +1 -0
- package/dist/shell/commandRegistry.js +398 -0
- package/dist/shell/commandRegistry.js.map +1 -0
- package/dist/shell/composableMessage.d.ts +178 -0
- package/dist/shell/composableMessage.d.ts.map +1 -0
- package/dist/shell/composableMessage.js +384 -0
- package/dist/shell/composableMessage.js.map +1 -0
- package/dist/shell/liveStatus.d.ts +27 -0
- package/dist/shell/liveStatus.d.ts.map +1 -0
- package/dist/shell/liveStatus.js +53 -0
- package/dist/shell/liveStatus.js.map +1 -0
- package/dist/shell/systemPrompt.d.ts +12 -0
- package/dist/shell/systemPrompt.d.ts.map +1 -0
- package/dist/shell/systemPrompt.js +16 -0
- package/dist/shell/systemPrompt.js.map +1 -0
- package/dist/shell/vimMode.d.ts +66 -0
- package/dist/shell/vimMode.d.ts.map +1 -0
- package/dist/shell/vimMode.js +435 -0
- package/dist/shell/vimMode.js.map +1 -0
- package/dist/tools/bashTools.d.ts +7 -0
- package/dist/tools/bashTools.d.ts.map +1 -0
- package/dist/tools/bashTools.js +773 -0
- package/dist/tools/bashTools.js.map +1 -0
- package/dist/tools/diffUtils.d.ts +43 -0
- package/dist/tools/diffUtils.d.ts.map +1 -0
- package/dist/tools/diffUtils.js +607 -0
- package/dist/tools/diffUtils.js.map +1 -0
- package/dist/tools/editTools.d.ts +29 -0
- package/dist/tools/editTools.d.ts.map +1 -0
- package/dist/tools/editTools.js +673 -0
- package/dist/tools/editTools.js.map +1 -0
- package/dist/tools/emailTools.d.ts +140 -0
- package/dist/tools/emailTools.d.ts.map +1 -0
- package/dist/tools/emailTools.js +793 -0
- package/dist/tools/emailTools.js.map +1 -0
- package/dist/tools/fileChangeTracker.d.ts +47 -0
- package/dist/tools/fileChangeTracker.d.ts.map +1 -0
- package/dist/tools/fileChangeTracker.js +154 -0
- package/dist/tools/fileChangeTracker.js.map +1 -0
- package/dist/tools/fileReadTracker.d.ts +69 -0
- package/dist/tools/fileReadTracker.d.ts.map +1 -0
- package/dist/tools/fileReadTracker.js +213 -0
- package/dist/tools/fileReadTracker.js.map +1 -0
- package/dist/tools/fileTools.d.ts +3 -0
- package/dist/tools/fileTools.d.ts.map +1 -0
- package/dist/tools/fileTools.js +333 -0
- package/dist/tools/fileTools.js.map +1 -0
- package/dist/tools/grepTools.d.ts +3 -0
- package/dist/tools/grepTools.d.ts.map +1 -0
- package/dist/tools/grepTools.js +128 -0
- package/dist/tools/grepTools.js.map +1 -0
- package/dist/tools/hitlTools.d.ts +7 -0
- package/dist/tools/hitlTools.d.ts.map +1 -0
- package/dist/tools/hitlTools.js +189 -0
- package/dist/tools/hitlTools.js.map +1 -0
- package/dist/tools/humanOpsTools.d.ts +3 -0
- package/dist/tools/humanOpsTools.d.ts.map +1 -0
- package/dist/tools/humanOpsTools.js +86 -0
- package/dist/tools/humanOpsTools.js.map +1 -0
- package/dist/tools/localExplore.d.ts +38 -0
- package/dist/tools/localExplore.d.ts.map +1 -0
- package/dist/tools/localExplore.js +30 -0
- package/dist/tools/localExplore.js.map +1 -0
- package/dist/tools/metaTools.d.ts +3 -0
- package/dist/tools/metaTools.d.ts.map +1 -0
- package/dist/tools/metaTools.js +148 -0
- package/dist/tools/metaTools.js.map +1 -0
- package/dist/tools/planningTools.d.ts +81 -0
- package/dist/tools/planningTools.d.ts.map +1 -0
- package/dist/tools/planningTools.js +370 -0
- package/dist/tools/planningTools.js.map +1 -0
- package/dist/tools/searchTools.d.ts +12 -0
- package/dist/tools/searchTools.d.ts.map +1 -0
- package/dist/tools/searchTools.js +363 -0
- package/dist/tools/searchTools.js.map +1 -0
- package/dist/tools/telemetryTools.d.ts +10 -0
- package/dist/tools/telemetryTools.d.ts.map +1 -0
- package/dist/tools/telemetryTools.js +9 -0
- package/dist/tools/telemetryTools.js.map +1 -0
- package/dist/tools/unifiedOps.d.ts +3 -0
- package/dist/tools/unifiedOps.d.ts.map +1 -0
- package/dist/tools/unifiedOps.js +57 -0
- package/dist/tools/unifiedOps.js.map +1 -0
- package/dist/tools/webTools.d.ts +26 -0
- package/dist/tools/webTools.d.ts.map +1 -0
- package/dist/tools/webTools.js +227 -0
- package/dist/tools/webTools.js.map +1 -0
- package/dist/ui/PromptController.d.ts +193 -0
- package/dist/ui/PromptController.d.ts.map +1 -0
- package/dist/ui/PromptController.js +394 -0
- package/dist/ui/PromptController.js.map +1 -0
- package/dist/ui/UnifiedUIRenderer.d.ts +843 -0
- package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -0
- package/dist/ui/UnifiedUIRenderer.js +5711 -0
- package/dist/ui/UnifiedUIRenderer.js.map +1 -0
- package/dist/ui/animatedStatus.d.ts +140 -0
- package/dist/ui/animatedStatus.d.ts.map +1 -0
- package/dist/ui/animatedStatus.js +480 -0
- package/dist/ui/animatedStatus.js.map +1 -0
- package/dist/ui/animation/AnimationScheduler.d.ts +197 -0
- package/dist/ui/animation/AnimationScheduler.d.ts.map +1 -0
- package/dist/ui/animation/AnimationScheduler.js +440 -0
- package/dist/ui/animation/AnimationScheduler.js.map +1 -0
- package/dist/ui/codeHighlighter.d.ts +6 -0
- package/dist/ui/codeHighlighter.d.ts.map +1 -0
- package/dist/ui/codeHighlighter.js +855 -0
- package/dist/ui/codeHighlighter.js.map +1 -0
- package/dist/ui/designSystem.d.ts +26 -0
- package/dist/ui/designSystem.d.ts.map +1 -0
- package/dist/ui/designSystem.js +114 -0
- package/dist/ui/designSystem.js.map +1 -0
- package/dist/ui/errorFormatter.d.ts +64 -0
- package/dist/ui/errorFormatter.d.ts.map +1 -0
- package/dist/ui/errorFormatter.js +316 -0
- package/dist/ui/errorFormatter.js.map +1 -0
- package/dist/ui/globalWriteLock.d.ts +63 -0
- package/dist/ui/globalWriteLock.d.ts.map +1 -0
- package/dist/ui/globalWriteLock.js +173 -0
- package/dist/ui/globalWriteLock.js.map +1 -0
- package/dist/ui/index.d.ts +32 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +54 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/interrupts/InterruptManager.d.ts +157 -0
- package/dist/ui/interrupts/InterruptManager.d.ts.map +1 -0
- package/dist/ui/interrupts/InterruptManager.js +501 -0
- package/dist/ui/interrupts/InterruptManager.js.map +1 -0
- package/dist/ui/layout.d.ts +27 -0
- package/dist/ui/layout.d.ts.map +1 -0
- package/dist/ui/layout.js +184 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/outputMode.d.ts +44 -0
- package/dist/ui/outputMode.d.ts.map +1 -0
- package/dist/ui/outputMode.js +123 -0
- package/dist/ui/outputMode.js.map +1 -0
- package/dist/ui/overlay/OverlayManager.d.ts +105 -0
- package/dist/ui/overlay/OverlayManager.d.ts.map +1 -0
- package/dist/ui/overlay/OverlayManager.js +304 -0
- package/dist/ui/overlay/OverlayManager.js.map +1 -0
- package/dist/ui/premiumComponents.d.ts +54 -0
- package/dist/ui/premiumComponents.d.ts.map +1 -0
- package/dist/ui/premiumComponents.js +241 -0
- package/dist/ui/premiumComponents.js.map +1 -0
- package/dist/ui/richText.d.ts +13 -0
- package/dist/ui/richText.d.ts.map +1 -0
- package/dist/ui/richText.js +444 -0
- package/dist/ui/richText.js.map +1 -0
- package/dist/ui/telemetry/ResponseTracker.d.ts +22 -0
- package/dist/ui/telemetry/ResponseTracker.d.ts.map +1 -0
- package/dist/ui/telemetry/ResponseTracker.js +60 -0
- package/dist/ui/telemetry/ResponseTracker.js.map +1 -0
- package/dist/ui/telemetry/UITelemetry.d.ts +181 -0
- package/dist/ui/telemetry/UITelemetry.d.ts.map +1 -0
- package/dist/ui/telemetry/UITelemetry.js +446 -0
- package/dist/ui/telemetry/UITelemetry.js.map +1 -0
- package/dist/ui/textHighlighter.d.ts +83 -0
- package/dist/ui/textHighlighter.d.ts.map +1 -0
- package/dist/ui/textHighlighter.js +267 -0
- package/dist/ui/textHighlighter.js.map +1 -0
- package/dist/ui/theme.d.ts +364 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +471 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/toolDisplay.d.ts +221 -0
- package/dist/ui/toolDisplay.d.ts.map +1 -0
- package/dist/ui/toolDisplay.js +1654 -0
- package/dist/ui/toolDisplay.js.map +1 -0
- package/dist/ui/uiConstants.d.ts +288 -0
- package/dist/ui/uiConstants.d.ts.map +1 -0
- package/dist/ui/uiConstants.js +472 -0
- package/dist/ui/uiConstants.js.map +1 -0
- package/dist/utils/askUserPrompt.d.ts +21 -0
- package/dist/utils/askUserPrompt.d.ts.map +1 -0
- package/dist/utils/askUserPrompt.js +87 -0
- package/dist/utils/askUserPrompt.js.map +1 -0
- package/dist/utils/asyncUtils.d.ts +95 -0
- package/dist/utils/asyncUtils.d.ts.map +1 -0
- package/dist/utils/asyncUtils.js +286 -0
- package/dist/utils/asyncUtils.js.map +1 -0
- package/dist/utils/debugLogger.d.ts +6 -0
- package/dist/utils/debugLogger.d.ts.map +1 -0
- package/dist/utils/debugLogger.js +39 -0
- package/dist/utils/debugLogger.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +12 -0
- package/dist/utils/errorUtils.d.ts.map +1 -0
- package/dist/utils/errorUtils.js +83 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +10 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +78 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/packageInfo.d.ts +14 -0
- package/dist/utils/packageInfo.d.ts.map +1 -0
- package/dist/utils/packageInfo.js +45 -0
- package/dist/utils/packageInfo.js.map +1 -0
- package/dist/utils/planFormatter.d.ts +34 -0
- package/dist/utils/planFormatter.d.ts.map +1 -0
- package/dist/utils/planFormatter.js +141 -0
- package/dist/utils/planFormatter.js.map +1 -0
- package/dist/utils/securityUtils.d.ts +132 -0
- package/dist/utils/securityUtils.d.ts.map +1 -0
- package/dist/utils/securityUtils.js +324 -0
- package/dist/utils/securityUtils.js.map +1 -0
- package/dist/utils/statusReporter.d.ts +6 -0
- package/dist/utils/statusReporter.d.ts.map +1 -0
- package/dist/utils/statusReporter.js +26 -0
- package/dist/utils/statusReporter.js.map +1 -0
- package/dist/workspace.d.ts +8 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +135 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.validator.d.ts +49 -0
- package/dist/workspace.validator.d.ts.map +1 -0
- package/dist/workspace.validator.js +215 -0
- package/dist/workspace.validator.js.map +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1,773 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { reportToolProgress } from '../core/toolRuntime.js';
|
|
5
|
+
import { validateBashCommand } from '../core/errors/safetyValidator.js';
|
|
6
|
+
import { analyzeBashFlow } from '../core/bashCommandGuidance.js';
|
|
7
|
+
import { buildError } from '../core/errors.js';
|
|
8
|
+
import { verifiedSuccess, verifiedFailure, analyzeOutput, OutputPatterns, createCommandCheck, } from '../core/resultVerification.js';
|
|
9
|
+
import { createErrorFixer } from '../core/aiErrorFixer.js';
|
|
10
|
+
import { logDebug } from '../utils/debugLogger.js';
|
|
11
|
+
import { createTestMonitor } from '../core/testFailureMonitor.js';
|
|
12
|
+
import { getSudoPassword, invalidateSudoPassword } from '../core/sudoPasswordManager.js';
|
|
13
|
+
// ANSI color codes for enhanced output
|
|
14
|
+
const ANSI_RESET = '\x1b[0m';
|
|
15
|
+
const ANSI_RED = '\x1b[31m';
|
|
16
|
+
const ANSI_GREEN = '\x1b[32m';
|
|
17
|
+
const ANSI_YELLOW = '\x1b[33m';
|
|
18
|
+
const ANSI_BLUE = '\x1b[34m';
|
|
19
|
+
const ANSI_CYAN = '\x1b[36m';
|
|
20
|
+
const ANSI_DIM = '\x1b[2m';
|
|
21
|
+
const ANSI_BOLD = '\x1b[1m';
|
|
22
|
+
const ANSI_RED_BOLD = '\x1b[1;31m';
|
|
23
|
+
const ANSI_GREEN_BOLD = '\x1b[1;32m';
|
|
24
|
+
const ANSI_YELLOW_BOLD = '\x1b[1;33m';
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Background Shell Manager (consolidated from backgroundBashTools.ts)
|
|
27
|
+
// ============================================================================
|
|
28
|
+
class BackgroundShell {
|
|
29
|
+
id;
|
|
30
|
+
command;
|
|
31
|
+
workingDir;
|
|
32
|
+
process;
|
|
33
|
+
outputBuffer = [];
|
|
34
|
+
errorBuffer = [];
|
|
35
|
+
lastReadPosition = 0;
|
|
36
|
+
isRunning = false;
|
|
37
|
+
exitCode;
|
|
38
|
+
constructor(id, command, workingDir) {
|
|
39
|
+
this.id = id;
|
|
40
|
+
this.command = command;
|
|
41
|
+
this.workingDir = workingDir;
|
|
42
|
+
}
|
|
43
|
+
start() {
|
|
44
|
+
this.process = spawn('bash', ['-c', this.command], {
|
|
45
|
+
cwd: this.workingDir,
|
|
46
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
47
|
+
});
|
|
48
|
+
this.isRunning = true;
|
|
49
|
+
this.process.stdout?.on('data', (data) => {
|
|
50
|
+
this.outputBuffer.push(data.toString());
|
|
51
|
+
});
|
|
52
|
+
this.process.stderr?.on('data', (data) => {
|
|
53
|
+
this.errorBuffer.push(data.toString());
|
|
54
|
+
});
|
|
55
|
+
this.process.on('exit', (code) => {
|
|
56
|
+
this.exitCode = code ?? 0;
|
|
57
|
+
this.isRunning = false;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
getNewOutput(filter) {
|
|
61
|
+
const allOutput = this.outputBuffer.join('');
|
|
62
|
+
const newOutput = allOutput.substring(this.lastReadPosition);
|
|
63
|
+
this.lastReadPosition = allOutput.length;
|
|
64
|
+
const allError = this.errorBuffer.join('');
|
|
65
|
+
let stdout = newOutput;
|
|
66
|
+
if (filter) {
|
|
67
|
+
const lines = newOutput.split('\n');
|
|
68
|
+
stdout = lines.filter(line => filter.test(line)).join('\n');
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
stdout,
|
|
72
|
+
stderr: allError,
|
|
73
|
+
status: this.isRunning ? 'running' : `exited with code ${this.exitCode}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
kill() {
|
|
77
|
+
if (this.process) {
|
|
78
|
+
this.process.kill('SIGTERM');
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
if (this.process && !this.process.killed) {
|
|
81
|
+
this.process.kill('SIGKILL');
|
|
82
|
+
}
|
|
83
|
+
}, 5000);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
class BackgroundShellManager {
|
|
88
|
+
shells = new Map();
|
|
89
|
+
nextId = 1;
|
|
90
|
+
createShell(command, workingDir) {
|
|
91
|
+
const shellId = `shell_${this.nextId++}`;
|
|
92
|
+
const shell = new BackgroundShell(shellId, command, workingDir);
|
|
93
|
+
this.shells.set(shellId, shell);
|
|
94
|
+
shell.start();
|
|
95
|
+
return shellId;
|
|
96
|
+
}
|
|
97
|
+
getShell(shellId) {
|
|
98
|
+
return this.shells.get(shellId);
|
|
99
|
+
}
|
|
100
|
+
killShell(shellId) {
|
|
101
|
+
const shell = this.shells.get(shellId);
|
|
102
|
+
if (shell) {
|
|
103
|
+
shell.kill();
|
|
104
|
+
this.shells.delete(shellId);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
listShells() {
|
|
110
|
+
return Array.from(this.shells.keys());
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Global shell manager instance
|
|
114
|
+
const shellManager = new BackgroundShellManager();
|
|
115
|
+
async function execWithStreaming(command, options) {
|
|
116
|
+
const MAX_BUFFER_BYTES = 1_000_000; // ~1MB per stream to prevent OOM on chatty commands
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
const stdout = [];
|
|
119
|
+
const stderr = [];
|
|
120
|
+
let stdoutBytes = 0;
|
|
121
|
+
let stderrBytes = 0;
|
|
122
|
+
let stdoutTruncated = false;
|
|
123
|
+
let stderrTruncated = false;
|
|
124
|
+
let lineCount = 0;
|
|
125
|
+
let killed = false;
|
|
126
|
+
let earlyAbort = false;
|
|
127
|
+
let abortReason;
|
|
128
|
+
const child = spawn('bash', ['-c', command], {
|
|
129
|
+
cwd: options.cwd,
|
|
130
|
+
env: options.env,
|
|
131
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
132
|
+
});
|
|
133
|
+
const timeoutId = setTimeout(() => {
|
|
134
|
+
killed = true;
|
|
135
|
+
child.kill('SIGTERM');
|
|
136
|
+
setTimeout(() => child.kill('SIGKILL'), 1000);
|
|
137
|
+
}, options.timeout);
|
|
138
|
+
// Early abort function for test failures
|
|
139
|
+
const triggerEarlyAbort = (reason) => {
|
|
140
|
+
if (earlyAbort)
|
|
141
|
+
return; // Already aborting
|
|
142
|
+
earlyAbort = true;
|
|
143
|
+
abortReason = reason;
|
|
144
|
+
logDebug(`[Bash] Early abort triggered: ${reason}`);
|
|
145
|
+
reportToolProgress({
|
|
146
|
+
current: lineCount,
|
|
147
|
+
message: `⚡ Early abort: ${reason}`,
|
|
148
|
+
});
|
|
149
|
+
child.kill('SIGTERM');
|
|
150
|
+
setTimeout(() => {
|
|
151
|
+
if (!child.killed) {
|
|
152
|
+
child.kill('SIGKILL');
|
|
153
|
+
}
|
|
154
|
+
}, 2000);
|
|
155
|
+
};
|
|
156
|
+
const processLine = (line, isStderr) => {
|
|
157
|
+
lineCount++;
|
|
158
|
+
const trimmedLine = line.slice(0, 80);
|
|
159
|
+
reportToolProgress({
|
|
160
|
+
current: lineCount,
|
|
161
|
+
message: isStderr ? `stderr: ${trimmedLine}` : trimmedLine,
|
|
162
|
+
});
|
|
163
|
+
// Feed line to test monitor for real-time failure detection
|
|
164
|
+
if (options.testMonitor && !earlyAbort) {
|
|
165
|
+
const shouldAbort = options.testMonitor.processLine(line);
|
|
166
|
+
if (shouldAbort) {
|
|
167
|
+
const state = options.testMonitor.getState();
|
|
168
|
+
triggerEarlyAbort(state.abortReason || 'Test failures detected');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
const appendChunk = (chunks, data, isStdout) => {
|
|
173
|
+
const byteLength = data.length;
|
|
174
|
+
const used = isStdout ? stdoutBytes : stderrBytes;
|
|
175
|
+
const available = MAX_BUFFER_BYTES - used;
|
|
176
|
+
if (available <= 0) {
|
|
177
|
+
if (isStdout)
|
|
178
|
+
stdoutTruncated = true;
|
|
179
|
+
else
|
|
180
|
+
stderrTruncated = true;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const slice = byteLength > available ? data.subarray(0, available) : data;
|
|
184
|
+
chunks.push(slice.toString());
|
|
185
|
+
const consumed = slice.length; // Buffer length in bytes
|
|
186
|
+
if (isStdout) {
|
|
187
|
+
stdoutBytes += consumed;
|
|
188
|
+
if (byteLength > available)
|
|
189
|
+
stdoutTruncated = true;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
stderrBytes += consumed;
|
|
193
|
+
if (byteLength > available)
|
|
194
|
+
stderrTruncated = true;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
let stdoutBuffer = '';
|
|
198
|
+
child.stdout?.on('data', (data) => {
|
|
199
|
+
const text = data.toString();
|
|
200
|
+
appendChunk(stdout, data, true);
|
|
201
|
+
stdoutBuffer += text;
|
|
202
|
+
if (stdoutBuffer.length > 4096) {
|
|
203
|
+
stdoutBuffer = stdoutBuffer.slice(-2048);
|
|
204
|
+
}
|
|
205
|
+
const lines = stdoutBuffer.split('\n');
|
|
206
|
+
stdoutBuffer = lines.pop() || '';
|
|
207
|
+
for (const line of lines) {
|
|
208
|
+
if (line.trim())
|
|
209
|
+
processLine(line, false);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
let stderrBuffer = '';
|
|
213
|
+
child.stderr?.on('data', (data) => {
|
|
214
|
+
const text = data.toString();
|
|
215
|
+
appendChunk(stderr, data, false);
|
|
216
|
+
stderrBuffer += text;
|
|
217
|
+
if (stderrBuffer.length > 4096) {
|
|
218
|
+
stderrBuffer = stderrBuffer.slice(-2048);
|
|
219
|
+
}
|
|
220
|
+
const lines = stderrBuffer.split('\n');
|
|
221
|
+
stderrBuffer = lines.pop() || '';
|
|
222
|
+
for (const line of lines) {
|
|
223
|
+
if (line.trim())
|
|
224
|
+
processLine(line, true);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
const buildOutput = (chunks, truncated) => {
|
|
228
|
+
const output = chunks.join('');
|
|
229
|
+
if (!truncated)
|
|
230
|
+
return output;
|
|
231
|
+
const limitKb = Math.round(MAX_BUFFER_BYTES / 1024);
|
|
232
|
+
const notice = `\n[output truncated after ${limitKb}KB to protect memory; rerun with narrower command to see full output]`;
|
|
233
|
+
return output ? `${output}${notice}` : notice.trim();
|
|
234
|
+
};
|
|
235
|
+
child.on('close', (code) => {
|
|
236
|
+
clearTimeout(timeoutId);
|
|
237
|
+
if (stdoutBuffer.trim())
|
|
238
|
+
processLine(stdoutBuffer, false);
|
|
239
|
+
if (stderrBuffer.trim())
|
|
240
|
+
processLine(stderrBuffer, true);
|
|
241
|
+
const stdoutText = buildOutput(stdout, stdoutTruncated);
|
|
242
|
+
const stderrText = buildOutput(stderr, stderrTruncated);
|
|
243
|
+
if (killed && !earlyAbort) {
|
|
244
|
+
reject({ killed: true, stdout: stdoutText, stderr: stderrText, code });
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
const result = {
|
|
248
|
+
stdout: stdoutText,
|
|
249
|
+
stderr: stderrText,
|
|
250
|
+
exitCode: earlyAbort ? 1 : (code ?? 0),
|
|
251
|
+
};
|
|
252
|
+
if (earlyAbort && options.testMonitor) {
|
|
253
|
+
result.earlyAbort = true;
|
|
254
|
+
result.abortReason = abortReason;
|
|
255
|
+
result.abortMessage = options.testMonitor.formatAbortMessage();
|
|
256
|
+
}
|
|
257
|
+
resolve(result);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
child.on('error', (error) => {
|
|
261
|
+
clearTimeout(timeoutId);
|
|
262
|
+
reject(error);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Execute a sudo command with password authentication
|
|
268
|
+
* Uses -S flag to read password from stdin
|
|
269
|
+
*/
|
|
270
|
+
async function execSudoWithPassword(command, password, options) {
|
|
271
|
+
const MAX_BUFFER_BYTES = 1_000_000;
|
|
272
|
+
return new Promise((resolve, reject) => {
|
|
273
|
+
const stdout = [];
|
|
274
|
+
const stderr = [];
|
|
275
|
+
let stdoutBytes = 0;
|
|
276
|
+
let stderrBytes = 0;
|
|
277
|
+
let stdoutTruncated = false;
|
|
278
|
+
let stderrTruncated = false;
|
|
279
|
+
let lineCount = 0;
|
|
280
|
+
let killed = false;
|
|
281
|
+
let passwordSent = false;
|
|
282
|
+
// Use sudo -S to read password from stdin, -k to ignore cached credentials
|
|
283
|
+
// This ensures we always use our provided password
|
|
284
|
+
const sudoCommand = command.replace(/^\s*sudo\s+/, 'sudo -S ');
|
|
285
|
+
const child = spawn('bash', ['-c', sudoCommand], {
|
|
286
|
+
cwd: options.cwd,
|
|
287
|
+
env: options.env,
|
|
288
|
+
stdio: ['pipe', 'pipe', 'pipe'], // Connect stdin for password
|
|
289
|
+
});
|
|
290
|
+
const timeoutId = setTimeout(() => {
|
|
291
|
+
killed = true;
|
|
292
|
+
child.kill('SIGTERM');
|
|
293
|
+
setTimeout(() => child.kill('SIGKILL'), 1000);
|
|
294
|
+
}, options.timeout);
|
|
295
|
+
const processLine = (line, isStderr) => {
|
|
296
|
+
// Filter out password prompt from output
|
|
297
|
+
if (line.includes('[sudo] password') || line.includes('Password:')) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
lineCount++;
|
|
301
|
+
const trimmedLine = line.slice(0, 80);
|
|
302
|
+
reportToolProgress({
|
|
303
|
+
current: lineCount,
|
|
304
|
+
message: isStderr ? `stderr: ${trimmedLine}` : trimmedLine,
|
|
305
|
+
});
|
|
306
|
+
};
|
|
307
|
+
const appendChunk = (chunks, data, isStdout) => {
|
|
308
|
+
const byteLength = data.length;
|
|
309
|
+
const used = isStdout ? stdoutBytes : stderrBytes;
|
|
310
|
+
const available = MAX_BUFFER_BYTES - used;
|
|
311
|
+
if (available <= 0) {
|
|
312
|
+
if (isStdout)
|
|
313
|
+
stdoutTruncated = true;
|
|
314
|
+
else
|
|
315
|
+
stderrTruncated = true;
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
const slice = byteLength > available ? data.subarray(0, available) : data;
|
|
319
|
+
chunks.push(slice.toString());
|
|
320
|
+
const consumed = slice.length;
|
|
321
|
+
if (isStdout) {
|
|
322
|
+
stdoutBytes += consumed;
|
|
323
|
+
if (byteLength > available)
|
|
324
|
+
stdoutTruncated = true;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
stderrBytes += consumed;
|
|
328
|
+
if (byteLength > available)
|
|
329
|
+
stderrTruncated = true;
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
let stdoutBuffer = '';
|
|
333
|
+
child.stdout?.on('data', (data) => {
|
|
334
|
+
const text = data.toString();
|
|
335
|
+
appendChunk(stdout, data, true);
|
|
336
|
+
stdoutBuffer += text;
|
|
337
|
+
if (stdoutBuffer.length > 4096) {
|
|
338
|
+
stdoutBuffer = stdoutBuffer.slice(-2048);
|
|
339
|
+
}
|
|
340
|
+
const lines = stdoutBuffer.split('\n');
|
|
341
|
+
stdoutBuffer = lines.pop() || '';
|
|
342
|
+
for (const line of lines) {
|
|
343
|
+
if (line.trim())
|
|
344
|
+
processLine(line, false);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
let stderrBuffer = '';
|
|
348
|
+
child.stderr?.on('data', (data) => {
|
|
349
|
+
const text = data.toString();
|
|
350
|
+
// Send password when sudo prompts for it
|
|
351
|
+
if (!passwordSent && (text.includes('[sudo] password') || text.includes('Password:'))) {
|
|
352
|
+
child.stdin?.write(password + '\n');
|
|
353
|
+
child.stdin?.end();
|
|
354
|
+
passwordSent = true;
|
|
355
|
+
reportToolProgress({ current: 0, message: '🔐 Authenticating with sudo...' });
|
|
356
|
+
return; // Don't add password prompt to output
|
|
357
|
+
}
|
|
358
|
+
// Filter password prompt lines from output
|
|
359
|
+
const filteredText = text.split('\n')
|
|
360
|
+
.filter(line => !line.includes('[sudo] password') && !line.includes('Password:'))
|
|
361
|
+
.join('\n');
|
|
362
|
+
if (filteredText) {
|
|
363
|
+
appendChunk(stderr, Buffer.from(filteredText), false);
|
|
364
|
+
stderrBuffer += filteredText;
|
|
365
|
+
if (stderrBuffer.length > 4096) {
|
|
366
|
+
stderrBuffer = stderrBuffer.slice(-2048);
|
|
367
|
+
}
|
|
368
|
+
const lines = stderrBuffer.split('\n');
|
|
369
|
+
stderrBuffer = lines.pop() || '';
|
|
370
|
+
for (const line of lines) {
|
|
371
|
+
if (line.trim())
|
|
372
|
+
processLine(line, true);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
// Send password immediately after spawn for cases where prompt comes fast
|
|
377
|
+
setTimeout(() => {
|
|
378
|
+
if (!passwordSent && child.stdin?.writable) {
|
|
379
|
+
child.stdin?.write(password + '\n');
|
|
380
|
+
child.stdin?.end();
|
|
381
|
+
passwordSent = true;
|
|
382
|
+
}
|
|
383
|
+
}, 100);
|
|
384
|
+
const buildOutput = (chunks, truncated) => {
|
|
385
|
+
const output = chunks.join('');
|
|
386
|
+
// Filter out any remaining password-related lines
|
|
387
|
+
const filtered = output.split('\n')
|
|
388
|
+
.filter(line => !line.includes('[sudo] password') && !line.includes('Password:') && !line.includes('Sorry, try again'))
|
|
389
|
+
.join('\n');
|
|
390
|
+
if (!truncated)
|
|
391
|
+
return filtered;
|
|
392
|
+
const limitKb = Math.round(MAX_BUFFER_BYTES / 1024);
|
|
393
|
+
const notice = `\n[output truncated after ${limitKb}KB to protect memory]`;
|
|
394
|
+
return filtered ? `${filtered}${notice}` : notice.trim();
|
|
395
|
+
};
|
|
396
|
+
child.on('close', (code) => {
|
|
397
|
+
clearTimeout(timeoutId);
|
|
398
|
+
if (stdoutBuffer.trim())
|
|
399
|
+
processLine(stdoutBuffer, false);
|
|
400
|
+
if (stderrBuffer.trim())
|
|
401
|
+
processLine(stderrBuffer, true);
|
|
402
|
+
const stdoutText = buildOutput(stdout, stdoutTruncated);
|
|
403
|
+
const stderrText = buildOutput(stderr, stderrTruncated);
|
|
404
|
+
// Check for authentication failure
|
|
405
|
+
const combinedOutput = stdoutText + stderrText;
|
|
406
|
+
if (combinedOutput.includes('Sorry, try again') ||
|
|
407
|
+
combinedOutput.includes('incorrect password') ||
|
|
408
|
+
combinedOutput.includes('Authentication failure') ||
|
|
409
|
+
(code !== 0 && combinedOutput.includes('sudo:'))) {
|
|
410
|
+
// Invalid password - invalidate cache
|
|
411
|
+
invalidateSudoPassword();
|
|
412
|
+
}
|
|
413
|
+
if (killed) {
|
|
414
|
+
reject({ killed: true, stdout: stdoutText, stderr: stderrText, code });
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
resolve({
|
|
418
|
+
stdout: stdoutText,
|
|
419
|
+
stderr: stderrText,
|
|
420
|
+
exitCode: code ?? 0,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
child.on('error', (error) => {
|
|
425
|
+
clearTimeout(timeoutId);
|
|
426
|
+
reject(error);
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
// ============================================================================
|
|
431
|
+
// Utility Functions
|
|
432
|
+
// ============================================================================
|
|
433
|
+
// Keep the shell responsive while long commands run
|
|
434
|
+
function findGuiLauncher(_command) {
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
const errorFixerCache = new Map();
|
|
438
|
+
function getErrorFixer(workingDir) {
|
|
439
|
+
let fixer = errorFixerCache.get(workingDir);
|
|
440
|
+
if (!fixer) {
|
|
441
|
+
fixer = createErrorFixer({ workingDir });
|
|
442
|
+
errorFixerCache.set(workingDir, fixer);
|
|
443
|
+
}
|
|
444
|
+
return fixer;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Smart timeout detection based on command type
|
|
448
|
+
*/
|
|
449
|
+
function getSmartTimeout(command) {
|
|
450
|
+
const cmd = command.toLowerCase().trim();
|
|
451
|
+
// Long-running commands that legitimately take time
|
|
452
|
+
if (cmd.includes('npm install') || cmd.includes('yarn install') || cmd.includes('pnpm install')) {
|
|
453
|
+
return 10 * 60 * 1000; // 10 minutes for package installs
|
|
454
|
+
}
|
|
455
|
+
if (cmd.includes('npm run build') || cmd.includes('yarn build') || cmd.includes('make')) {
|
|
456
|
+
return 10 * 60 * 1000; // 10 minutes for builds
|
|
457
|
+
}
|
|
458
|
+
if (cmd.includes('docker build') || cmd.includes('docker-compose')) {
|
|
459
|
+
return 15 * 60 * 1000; // 15 minutes for docker builds
|
|
460
|
+
}
|
|
461
|
+
if (cmd.includes('npm test') || cmd.includes('yarn test') || cmd.includes('pytest') || cmd.includes('jest')) {
|
|
462
|
+
return 10 * 60 * 1000; // 10 minutes for tests
|
|
463
|
+
}
|
|
464
|
+
if (cmd.includes('git clone') || cmd.includes('git fetch') || cmd.includes('git pull')) {
|
|
465
|
+
return 5 * 60 * 1000; // 5 minutes for git network ops
|
|
466
|
+
}
|
|
467
|
+
// Default timeout for most commands - prevents hung commands from blocking
|
|
468
|
+
return 2 * 60 * 1000; // 2 minutes default
|
|
469
|
+
}
|
|
470
|
+
const sandboxCache = new Map();
|
|
471
|
+
async function ensureSandboxPaths(workingDir) {
|
|
472
|
+
let pending = sandboxCache.get(workingDir);
|
|
473
|
+
if (!pending) {
|
|
474
|
+
pending = createSandboxPaths(workingDir);
|
|
475
|
+
sandboxCache.set(workingDir, pending);
|
|
476
|
+
}
|
|
477
|
+
return pending;
|
|
478
|
+
}
|
|
479
|
+
async function createSandboxPaths(workingDir) {
|
|
480
|
+
const root = join(workingDir, '.agi', 'shell-sandbox');
|
|
481
|
+
const home = join(root, 'home');
|
|
482
|
+
const cache = join(root, 'cache');
|
|
483
|
+
const config = join(root, 'config');
|
|
484
|
+
const data = join(root, 'data');
|
|
485
|
+
const tmp = join(root, 'tmp');
|
|
486
|
+
await Promise.all([home, cache, config, data, tmp].map((dir) => mkdir(dir, { recursive: true })));
|
|
487
|
+
return { root, home, cache, config, data, tmp };
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Detect if a command needs access to the real home directory for cloud CLI credentials.
|
|
491
|
+
* Commands like firebase, gcloud, aws, az, kubectl require access to stored credentials.
|
|
492
|
+
*/
|
|
493
|
+
function needsRealHome(command) {
|
|
494
|
+
const cloudCliPatterns = [
|
|
495
|
+
/\bfirebase\b/i, // Firebase CLI
|
|
496
|
+
/\bgcloud\b/i, // Google Cloud CLI
|
|
497
|
+
/\bgsutil\b/i, // Google Cloud Storage
|
|
498
|
+
/\baws\b/i, // AWS CLI
|
|
499
|
+
/\baz\b/i, // Azure CLI
|
|
500
|
+
/\bkubectl\b/i, // Kubernetes
|
|
501
|
+
/\bhelm\b/i, // Helm
|
|
502
|
+
/\bdocker\b/i, // Docker (for registry auth)
|
|
503
|
+
/\bnpm\s+publish\b/i, // npm publish (needs npm auth)
|
|
504
|
+
/\byarn\s+publish\b/i, // yarn publish
|
|
505
|
+
/\bpnpm\s+publish\b/i, // pnpm publish
|
|
506
|
+
/\bgh\b/i, // GitHub CLI
|
|
507
|
+
/\bvercel\b/i, // Vercel CLI
|
|
508
|
+
/\bnetlify\b/i, // Netlify CLI
|
|
509
|
+
/\bheroku\b/i, // Heroku CLI
|
|
510
|
+
/\bfly\b/i, // Fly.io CLI
|
|
511
|
+
/\bsupabase\b/i, // Supabase CLI
|
|
512
|
+
/\bwrangler\b/i, // Cloudflare Workers
|
|
513
|
+
];
|
|
514
|
+
return cloudCliPatterns.some(pattern => pattern.test(command));
|
|
515
|
+
}
|
|
516
|
+
export async function buildSandboxEnv(workingDir, options) {
|
|
517
|
+
const envPreference = process.env['AGI_PRESERVE_HOME'];
|
|
518
|
+
// Preserve home if: env var set, option passed, or command needs cloud CLI credentials
|
|
519
|
+
const commandNeedsHome = options?.command ? needsRealHome(options.command) : false;
|
|
520
|
+
const preserveHome = envPreference === '1' ? true :
|
|
521
|
+
envPreference === '0' ? false :
|
|
522
|
+
Boolean(options?.preserveHome) || commandNeedsHome;
|
|
523
|
+
const paths = await ensureSandboxPaths(workingDir);
|
|
524
|
+
const env = {
|
|
525
|
+
...process.env,
|
|
526
|
+
AGI_SANDBOX_ROOT: paths.root,
|
|
527
|
+
AGI_SANDBOX_HOME: paths.home,
|
|
528
|
+
AGI_SANDBOX_TMP: paths.tmp,
|
|
529
|
+
};
|
|
530
|
+
if (!preserveHome) {
|
|
531
|
+
env['HOME'] = paths.home;
|
|
532
|
+
env['XDG_CACHE_HOME'] = paths.cache;
|
|
533
|
+
env['XDG_CONFIG_HOME'] = paths.config;
|
|
534
|
+
env['XDG_DATA_HOME'] = paths.data;
|
|
535
|
+
}
|
|
536
|
+
// Always sandbox temp directories for safety
|
|
537
|
+
env['TMPDIR'] = paths.tmp;
|
|
538
|
+
env['TMP'] = paths.tmp;
|
|
539
|
+
env['TEMP'] = paths.tmp;
|
|
540
|
+
return env;
|
|
541
|
+
}
|
|
542
|
+
// ============================================================================
|
|
543
|
+
// Main Tool Factory
|
|
544
|
+
// ============================================================================
|
|
545
|
+
export function createBashTools(workingDir) {
|
|
546
|
+
return [
|
|
547
|
+
// Main bash execution tool
|
|
548
|
+
{
|
|
549
|
+
name: 'execute_bash',
|
|
550
|
+
description: 'Execute a bash command. Commands auto-timeout based on type. Use run_in_background: true for servers/watchers.',
|
|
551
|
+
parameters: {
|
|
552
|
+
type: 'object',
|
|
553
|
+
properties: {
|
|
554
|
+
command: { type: 'string', description: 'The bash command to execute' },
|
|
555
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds (smart defaults apply)' },
|
|
556
|
+
run_in_background: { type: 'boolean', description: 'Run in background for long-running processes' },
|
|
557
|
+
},
|
|
558
|
+
required: ['command'],
|
|
559
|
+
},
|
|
560
|
+
handler: async (args) => {
|
|
561
|
+
const command = args['command'];
|
|
562
|
+
const runInBackground = args['run_in_background'] === true;
|
|
563
|
+
const userTimeout = args['timeout'];
|
|
564
|
+
const timeout = userTimeout ?? getSmartTimeout(command);
|
|
565
|
+
// Check if this is a sudo command
|
|
566
|
+
const isSudoCommand = /^\s*sudo\s+/i.test(command);
|
|
567
|
+
// Block commands that typically require passwords or interactive input (except sudo which we handle)
|
|
568
|
+
const interactiveCommands = /\b(passwd|su\s|login|ssh\s(?!-o)|sftp|ftp|mysql\s+-p|psql\s+-W)\b/i;
|
|
569
|
+
if (interactiveCommands.test(command)) {
|
|
570
|
+
return 'Skipped: Command requires interactive authentication. Use non-interactive alternatives.';
|
|
571
|
+
}
|
|
572
|
+
// Flow guidance (debug only - don't pollute chat)
|
|
573
|
+
const flowWarnings = analyzeBashFlow(command);
|
|
574
|
+
for (const warning of flowWarnings) {
|
|
575
|
+
const suffix = warning.suggestion ? ` — ${warning.suggestion}` : '';
|
|
576
|
+
logDebug(`[Bash Flow] ${warning.message}${suffix}`);
|
|
577
|
+
}
|
|
578
|
+
// Safety validation (informational only)
|
|
579
|
+
const validation = validateBashCommand(command);
|
|
580
|
+
if (!validation.valid) {
|
|
581
|
+
logDebug(`[Bash Safety] Command validation failed: ${validation.error?.message || 'Unknown error'}`);
|
|
582
|
+
}
|
|
583
|
+
// Safety warnings (debug only - don't pollute chat)
|
|
584
|
+
if (validation.warnings.length > 0) {
|
|
585
|
+
for (const warning of validation.warnings) {
|
|
586
|
+
logDebug(`[Bash Safety] WARNING: ${warning}`);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
// GUI blocking check
|
|
590
|
+
const guiBlocked = findGuiLauncher(command);
|
|
591
|
+
if (guiBlocked) {
|
|
592
|
+
logDebug(`[Bash Safety] GUI launcher detected: ${guiBlocked}`);
|
|
593
|
+
}
|
|
594
|
+
// Background execution
|
|
595
|
+
if (runInBackground) {
|
|
596
|
+
const shellId = shellManager.createShell(command, workingDir);
|
|
597
|
+
return `Background shell started: ${shellId}\n\nUse BashOutput with bash_id="${shellId}" to monitor.\nUse KillShell with shell_id="${shellId}" to terminate.`;
|
|
598
|
+
}
|
|
599
|
+
// Foreground execution
|
|
600
|
+
const startTime = Date.now();
|
|
601
|
+
const usesRealHome = needsRealHome(command);
|
|
602
|
+
// Create test monitor for test commands to enable early abort on failures
|
|
603
|
+
const testMonitor = createTestMonitor(command);
|
|
604
|
+
if (testMonitor) {
|
|
605
|
+
logDebug(`[Bash] Test command detected, enabling failure monitoring with early abort`);
|
|
606
|
+
}
|
|
607
|
+
try {
|
|
608
|
+
const env = await buildSandboxEnv(workingDir, { command });
|
|
609
|
+
// Report sandbox status for visibility
|
|
610
|
+
const sandboxStatus = usesRealHome
|
|
611
|
+
? `${ANSI_CYAN}🔓 Using real credentials (cloud CLI detected)${ANSI_RESET}`
|
|
612
|
+
: `${ANSI_DIM}🔒 Sandboxed environment${ANSI_RESET}`;
|
|
613
|
+
reportToolProgress({ current: 0, message: sandboxStatus });
|
|
614
|
+
let result;
|
|
615
|
+
// Handle sudo commands with password authentication
|
|
616
|
+
if (isSudoCommand) {
|
|
617
|
+
logDebug('[Bash] Sudo command detected, requesting password');
|
|
618
|
+
reportToolProgress({ current: 0, message: '🔐 Sudo command detected, requesting password...' });
|
|
619
|
+
const password = await getSudoPassword();
|
|
620
|
+
if (!password) {
|
|
621
|
+
return `${ANSI_YELLOW}Sudo command cancelled: No password provided.${ANSI_RESET}\n\nTo run this command, you need to provide your sudo password when prompted.`;
|
|
622
|
+
}
|
|
623
|
+
result = await execSudoWithPassword(command, password, { cwd: workingDir, timeout, env, testMonitor });
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
result = await execWithStreaming(command, { cwd: workingDir, timeout, env, testMonitor });
|
|
627
|
+
}
|
|
628
|
+
const { stdout, stderr, exitCode, earlyAbort, abortMessage } = result;
|
|
629
|
+
const durationMs = Date.now() - startTime;
|
|
630
|
+
const combinedOutput = [stdout, stderr].filter(Boolean).join('\n');
|
|
631
|
+
// Handle early abort from test monitor - encourage replanning
|
|
632
|
+
if (earlyAbort && testMonitor) {
|
|
633
|
+
const state = testMonitor.getState();
|
|
634
|
+
const suggestions = [
|
|
635
|
+
'REPLAN: Fix the identified issues before running tests again',
|
|
636
|
+
...state.suggestions,
|
|
637
|
+
];
|
|
638
|
+
return verifiedFailure(`${ANSI_YELLOW_BOLD}Test run aborted early - replan recommended${ANSI_RESET}`, `Command: ${command}\n\n${ANSI_YELLOW}The test run was stopped early to save time.${ANSI_RESET}\n\n` +
|
|
639
|
+
`${abortMessage || ''}\n\n` +
|
|
640
|
+
`${ANSI_DIM}Partial output:${ANSI_RESET}\n${combinedOutput || '(none)'}`, suggestions, [
|
|
641
|
+
{ check: 'Early abort', passed: false, details: state.abortReason || 'Multiple test failures' },
|
|
642
|
+
{ check: 'Failed tests', passed: false, details: `${state.failedTests.length} test file(s) failed` },
|
|
643
|
+
], durationMs);
|
|
644
|
+
}
|
|
645
|
+
const commandLower = command.toLowerCase().trim();
|
|
646
|
+
let patterns = OutputPatterns.command;
|
|
647
|
+
if (commandLower.startsWith('git ') || commandLower === 'git')
|
|
648
|
+
patterns = OutputPatterns.git;
|
|
649
|
+
else if (commandLower.startsWith('npm ') || commandLower.startsWith('npx '))
|
|
650
|
+
patterns = OutputPatterns.npm;
|
|
651
|
+
const analysis = analyzeOutput(combinedOutput, patterns, exitCode);
|
|
652
|
+
const commandCheck = createCommandCheck('Command execution', exitCode, combinedOutput);
|
|
653
|
+
if (exitCode !== 0) {
|
|
654
|
+
const errorFixer = getErrorFixer(workingDir);
|
|
655
|
+
const aiErrors = errorFixer.analyzeOutput(combinedOutput, command);
|
|
656
|
+
const aiGuidance = aiErrors.length > 0 ? errorFixer.formatForAI(aiErrors) : '';
|
|
657
|
+
const suggestions = ['Review the error message', 'Fix the issue and retry'];
|
|
658
|
+
const firstError = aiErrors[0];
|
|
659
|
+
if (firstError?.suggestedFixes[0]) {
|
|
660
|
+
suggestions.unshift(`AI Suggestion: ${firstError.suggestedFixes[0].description}`);
|
|
661
|
+
}
|
|
662
|
+
// Add replan suggestion for test failures
|
|
663
|
+
if (testMonitor && testMonitor.getState().failedTests.length > 0) {
|
|
664
|
+
suggestions.unshift('REPLAN: Multiple test failures detected - consider fixing incrementally');
|
|
665
|
+
}
|
|
666
|
+
return verifiedFailure(`Command failed with exit code ${exitCode}`, `Command: ${command}\n\nOutput:\n${combinedOutput || '(none)'}${aiGuidance}`, suggestions, [commandCheck], durationMs);
|
|
667
|
+
}
|
|
668
|
+
if (analysis.isFailure) {
|
|
669
|
+
return verifiedFailure(`Command completed with exit code 0 but output indicates failure`, `Command: ${command}\n\n${ANSI_RED_BOLD}Output:${ANSI_RESET}\n${combinedOutput || '(no output)'}`, ['Review the error message in the output', 'Fix the underlying issue and retry'], [commandCheck, { check: 'Output analysis', passed: false, details: `Failure pattern: ${analysis.matchedPattern}` }], durationMs);
|
|
670
|
+
}
|
|
671
|
+
const envLabel = usesRealHome ? `${ANSI_CYAN}[real credentials]${ANSI_RESET}` : `${ANSI_DIM}[sandboxed]${ANSI_RESET}`;
|
|
672
|
+
return verifiedSuccess(combinedOutput.trim() ? `Command executed successfully ${envLabel}` : `Command executed successfully (no output) ${envLabel}`, `Command: ${command}${combinedOutput.trim() ? `\n\n${ANSI_GREEN_BOLD}Output:${ANSI_RESET}\n${combinedOutput}` : ''}`, [commandCheck, ...(analysis.isSuccess ? [{ check: 'Output analysis', passed: true, details: `Success pattern matched` }] : [])], durationMs);
|
|
673
|
+
}
|
|
674
|
+
catch (error) {
|
|
675
|
+
const execError = error;
|
|
676
|
+
const durationMs = Date.now() - startTime;
|
|
677
|
+
const exitCode = execError.code ?? 1;
|
|
678
|
+
const combinedError = [execError.stdout, execError.stderr, execError.message].filter(Boolean).join('\n');
|
|
679
|
+
if (execError.killed) {
|
|
680
|
+
return verifiedFailure(`Command timed out after ${timeout}ms`, `Command: ${command}\n\nPartial output:\n${combinedError || '(none)'}`, ['Increase timeout if command legitimately needs more time', 'Check if command is hanging'], [{ check: 'Timeout', passed: false, details: `Exceeded ${timeout}ms` }], durationMs);
|
|
681
|
+
}
|
|
682
|
+
const errorFixer = getErrorFixer(workingDir);
|
|
683
|
+
const aiErrors = errorFixer.analyzeOutput(combinedError, command);
|
|
684
|
+
const aiGuidance = aiErrors.length > 0 ? errorFixer.formatForAI(aiErrors) : '';
|
|
685
|
+
const suggestions = ['Review the error message', 'Fix the issue and retry'];
|
|
686
|
+
const firstError = aiErrors[0];
|
|
687
|
+
if (firstError?.suggestedFixes[0]) {
|
|
688
|
+
suggestions.unshift(`AI Suggestion: ${firstError.suggestedFixes[0].description}`);
|
|
689
|
+
}
|
|
690
|
+
return verifiedFailure(`Command failed with exit code ${exitCode}`, `Command: ${command}\n\nError output:\n${combinedError || '(none)'}${aiGuidance}`, suggestions, [createCommandCheck('Command execution', exitCode, combinedError)], durationMs);
|
|
691
|
+
}
|
|
692
|
+
},
|
|
693
|
+
},
|
|
694
|
+
// Background shell output retrieval
|
|
695
|
+
{
|
|
696
|
+
name: 'BashOutput',
|
|
697
|
+
description: 'Retrieve output from a running or completed background bash shell.',
|
|
698
|
+
parameters: {
|
|
699
|
+
type: 'object',
|
|
700
|
+
properties: {
|
|
701
|
+
bash_id: { type: 'string', description: 'The ID of the background shell' },
|
|
702
|
+
filter: { type: 'string', description: 'Optional regex to filter output lines' },
|
|
703
|
+
},
|
|
704
|
+
required: ['bash_id'],
|
|
705
|
+
additionalProperties: false,
|
|
706
|
+
},
|
|
707
|
+
handler: async (args) => {
|
|
708
|
+
const bashId = args['bash_id'];
|
|
709
|
+
const filterStr = args['filter'];
|
|
710
|
+
if (typeof bashId !== 'string' || !bashId.trim()) {
|
|
711
|
+
return 'Error: bash_id must be a non-empty string.';
|
|
712
|
+
}
|
|
713
|
+
try {
|
|
714
|
+
const shell = shellManager.getShell(bashId);
|
|
715
|
+
if (!shell) {
|
|
716
|
+
const available = shellManager.listShells();
|
|
717
|
+
return `Error: Shell "${bashId}" not found.\n\nAvailable: ${available.length > 0 ? available.join(', ') : 'none'}`;
|
|
718
|
+
}
|
|
719
|
+
const filter = filterStr && typeof filterStr === 'string' ? new RegExp(filterStr) : undefined;
|
|
720
|
+
const { stdout, stderr, status } = shell.getNewOutput(filter);
|
|
721
|
+
const parts = [`Shell: ${bashId}`, `Status: ${status}`];
|
|
722
|
+
if (stdout) {
|
|
723
|
+
parts.push('\n=== New Output ===');
|
|
724
|
+
parts.push(stdout);
|
|
725
|
+
}
|
|
726
|
+
if (stderr) {
|
|
727
|
+
parts.push('\n=== Errors ===');
|
|
728
|
+
parts.push(stderr);
|
|
729
|
+
}
|
|
730
|
+
if (!stdout && !stderr)
|
|
731
|
+
parts.push('\n(No new output)');
|
|
732
|
+
return parts.join('\n');
|
|
733
|
+
}
|
|
734
|
+
catch (error) {
|
|
735
|
+
return buildError('retrieving shell output', error, { bash_id: bashId });
|
|
736
|
+
}
|
|
737
|
+
},
|
|
738
|
+
},
|
|
739
|
+
// Kill background shell
|
|
740
|
+
{
|
|
741
|
+
name: 'KillShell',
|
|
742
|
+
description: 'Kill a running background bash shell by its ID.',
|
|
743
|
+
parameters: {
|
|
744
|
+
type: 'object',
|
|
745
|
+
properties: {
|
|
746
|
+
shell_id: { type: 'string', description: 'The ID of the background shell to kill' },
|
|
747
|
+
},
|
|
748
|
+
required: ['shell_id'],
|
|
749
|
+
additionalProperties: false,
|
|
750
|
+
},
|
|
751
|
+
handler: async (args) => {
|
|
752
|
+
const shellId = args['shell_id'];
|
|
753
|
+
if (typeof shellId !== 'string' || !shellId.trim()) {
|
|
754
|
+
return 'Error: shell_id must be a non-empty string.';
|
|
755
|
+
}
|
|
756
|
+
try {
|
|
757
|
+
const success = shellManager.killShell(shellId);
|
|
758
|
+
if (success) {
|
|
759
|
+
return `Shell "${shellId}" has been terminated.`;
|
|
760
|
+
}
|
|
761
|
+
else {
|
|
762
|
+
const available = shellManager.listShells();
|
|
763
|
+
return `Error: Shell "${shellId}" not found.\n\nAvailable: ${available.length > 0 ? available.join(', ') : 'none'}`;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
catch (error) {
|
|
767
|
+
return buildError('killing shell', error, { shell_id: shellId });
|
|
768
|
+
}
|
|
769
|
+
},
|
|
770
|
+
},
|
|
771
|
+
];
|
|
772
|
+
}
|
|
773
|
+
//# sourceMappingURL=bashTools.js.map
|