erosolar-cli 1.7.355 → 1.7.356
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/README.md +148 -24
- package/dist/alpha-zero/agentWrapper.d.ts +84 -0
- package/dist/alpha-zero/agentWrapper.d.ts.map +1 -0
- package/dist/alpha-zero/agentWrapper.js +171 -0
- package/dist/alpha-zero/agentWrapper.js.map +1 -0
- package/dist/alpha-zero/codeEvaluator.d.ts +25 -0
- package/dist/alpha-zero/codeEvaluator.d.ts.map +1 -0
- package/dist/alpha-zero/codeEvaluator.js +273 -0
- package/dist/alpha-zero/codeEvaluator.js.map +1 -0
- package/dist/alpha-zero/competitiveRunner.d.ts +66 -0
- package/dist/alpha-zero/competitiveRunner.d.ts.map +1 -0
- package/dist/alpha-zero/competitiveRunner.js +224 -0
- package/dist/alpha-zero/competitiveRunner.js.map +1 -0
- package/dist/alpha-zero/index.d.ts +67 -0
- package/dist/alpha-zero/index.d.ts.map +1 -0
- package/dist/alpha-zero/index.js +99 -0
- package/dist/alpha-zero/index.js.map +1 -0
- package/dist/alpha-zero/introspection.d.ts +128 -0
- package/dist/alpha-zero/introspection.d.ts.map +1 -0
- package/dist/alpha-zero/introspection.js +300 -0
- package/dist/alpha-zero/introspection.js.map +1 -0
- package/dist/alpha-zero/metricsTracker.d.ts +71 -0
- package/dist/alpha-zero/metricsTracker.d.ts.map +1 -0
- package/dist/{core → alpha-zero}/metricsTracker.js +5 -2
- package/dist/alpha-zero/metricsTracker.js.map +1 -0
- package/dist/alpha-zero/security/core.d.ts +125 -0
- package/dist/alpha-zero/security/core.d.ts.map +1 -0
- package/dist/alpha-zero/security/core.js +271 -0
- package/dist/alpha-zero/security/core.js.map +1 -0
- package/dist/alpha-zero/security/google.d.ts +125 -0
- package/dist/alpha-zero/security/google.d.ts.map +1 -0
- package/dist/alpha-zero/security/google.js +311 -0
- package/dist/alpha-zero/security/google.js.map +1 -0
- package/dist/alpha-zero/security/googleLoader.d.ts +17 -0
- package/dist/alpha-zero/security/googleLoader.d.ts.map +1 -0
- package/dist/alpha-zero/security/googleLoader.js +41 -0
- package/dist/alpha-zero/security/googleLoader.js.map +1 -0
- package/dist/alpha-zero/security/index.d.ts +29 -0
- package/dist/alpha-zero/security/index.d.ts.map +1 -0
- package/dist/alpha-zero/security/index.js +32 -0
- package/dist/alpha-zero/security/index.js.map +1 -0
- package/dist/alpha-zero/security/simulation.d.ts +124 -0
- package/dist/alpha-zero/security/simulation.d.ts.map +1 -0
- package/dist/alpha-zero/security/simulation.js +277 -0
- package/dist/alpha-zero/security/simulation.js.map +1 -0
- package/dist/alpha-zero/selfModification.d.ts +109 -0
- package/dist/alpha-zero/selfModification.d.ts.map +1 -0
- package/dist/alpha-zero/selfModification.js +233 -0
- package/dist/alpha-zero/selfModification.js.map +1 -0
- package/dist/alpha-zero/types.d.ts +170 -0
- package/dist/alpha-zero/types.d.ts.map +1 -0
- package/dist/alpha-zero/types.js +31 -0
- package/dist/alpha-zero/types.js.map +1 -0
- package/dist/bin/erosolar.js +21 -5
- package/dist/bin/erosolar.js.map +1 -1
- package/dist/capabilities/agentSpawningCapability.d.ts.map +1 -1
- package/dist/capabilities/agentSpawningCapability.js +31 -56
- package/dist/capabilities/agentSpawningCapability.js.map +1 -1
- package/dist/capabilities/securityTestingCapability.d.ts +13 -0
- package/dist/capabilities/securityTestingCapability.d.ts.map +1 -0
- package/dist/capabilities/securityTestingCapability.js +25 -0
- package/dist/capabilities/securityTestingCapability.js.map +1 -0
- package/dist/contracts/agent-schemas.json +15 -0
- package/dist/contracts/tools.schema.json +9 -0
- package/dist/core/agent.d.ts +2 -2
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js.map +1 -1
- package/dist/core/aiFlowOptimizer.d.ts +26 -0
- package/dist/core/aiFlowOptimizer.d.ts.map +1 -0
- package/dist/core/aiFlowOptimizer.js +31 -0
- package/dist/core/aiFlowOptimizer.js.map +1 -0
- package/dist/core/aiOptimizationEngine.d.ts +158 -0
- package/dist/core/aiOptimizationEngine.d.ts.map +1 -0
- package/dist/core/aiOptimizationEngine.js +428 -0
- package/dist/core/aiOptimizationEngine.js.map +1 -0
- package/dist/core/aiOptimizationIntegration.d.ts +93 -0
- package/dist/core/aiOptimizationIntegration.d.ts.map +1 -0
- package/dist/core/aiOptimizationIntegration.js +250 -0
- package/dist/core/aiOptimizationIntegration.js.map +1 -0
- package/dist/core/customCommands.d.ts +0 -1
- package/dist/core/customCommands.d.ts.map +1 -1
- package/dist/core/customCommands.js +0 -3
- package/dist/core/customCommands.js.map +1 -1
- package/dist/core/enhancedErrorRecovery.d.ts +100 -0
- package/dist/core/enhancedErrorRecovery.d.ts.map +1 -0
- package/dist/core/enhancedErrorRecovery.js +345 -0
- package/dist/core/enhancedErrorRecovery.js.map +1 -0
- package/dist/core/hooksSystem.d.ts +65 -0
- package/dist/core/hooksSystem.d.ts.map +1 -0
- package/dist/core/hooksSystem.js +273 -0
- package/dist/core/hooksSystem.js.map +1 -0
- package/dist/core/memorySystem.d.ts +48 -0
- package/dist/core/memorySystem.d.ts.map +1 -0
- package/dist/core/memorySystem.js +271 -0
- package/dist/core/memorySystem.js.map +1 -0
- package/dist/core/sessionStore.d.ts +0 -2
- package/dist/core/sessionStore.d.ts.map +1 -1
- package/dist/core/sessionStore.js +0 -1
- package/dist/core/sessionStore.js.map +1 -1
- package/dist/core/toolPreconditions.d.ts.map +1 -1
- package/dist/core/toolPreconditions.js +14 -0
- package/dist/core/toolPreconditions.js.map +1 -1
- package/dist/core/toolRuntime.d.ts +1 -22
- package/dist/core/toolRuntime.d.ts.map +1 -1
- package/dist/core/toolRuntime.js +5 -0
- package/dist/core/toolRuntime.js.map +1 -1
- package/dist/core/toolValidation.d.ts.map +1 -1
- package/dist/core/toolValidation.js +3 -14
- package/dist/core/toolValidation.js.map +1 -1
- package/dist/core/unified/errors.d.ts +189 -0
- package/dist/core/unified/errors.d.ts.map +1 -0
- package/dist/core/unified/errors.js +497 -0
- package/dist/core/unified/errors.js.map +1 -0
- package/dist/core/unified/index.d.ts +19 -0
- package/dist/core/unified/index.d.ts.map +1 -0
- package/dist/core/unified/index.js +68 -0
- package/dist/core/unified/index.js.map +1 -0
- package/dist/core/unified/schema.d.ts +101 -0
- package/dist/core/unified/schema.d.ts.map +1 -0
- package/dist/core/unified/schema.js +350 -0
- package/dist/core/unified/schema.js.map +1 -0
- package/dist/core/unified/toolRuntime.d.ts +179 -0
- package/dist/core/unified/toolRuntime.d.ts.map +1 -0
- package/dist/core/unified/toolRuntime.js +517 -0
- package/dist/core/unified/toolRuntime.js.map +1 -0
- package/dist/core/unified/tools.d.ts +127 -0
- package/dist/core/unified/tools.d.ts.map +1 -0
- package/dist/core/unified/tools.js +1333 -0
- package/dist/core/unified/tools.js.map +1 -0
- package/dist/core/unified/types.d.ts +352 -0
- package/dist/core/unified/types.d.ts.map +1 -0
- package/dist/core/unified/types.js +12 -0
- package/dist/core/unified/types.js.map +1 -0
- package/dist/core/unified/version.d.ts +209 -0
- package/dist/core/unified/version.d.ts.map +1 -0
- package/dist/core/unified/version.js +454 -0
- package/dist/core/unified/version.js.map +1 -0
- package/dist/core/validationRunner.d.ts +3 -1
- package/dist/core/validationRunner.d.ts.map +1 -1
- package/dist/core/validationRunner.js.map +1 -1
- package/dist/headless/headlessApp.d.ts.map +1 -1
- package/dist/headless/headlessApp.js +0 -21
- package/dist/headless/headlessApp.js.map +1 -1
- package/dist/mcp/sseClient.d.ts.map +1 -1
- package/dist/mcp/sseClient.js +18 -9
- package/dist/mcp/sseClient.js.map +1 -1
- package/dist/plugins/tools/build/buildPlugin.d.ts +6 -0
- package/dist/plugins/tools/build/buildPlugin.d.ts.map +1 -1
- package/dist/plugins/tools/build/buildPlugin.js +10 -4
- package/dist/plugins/tools/build/buildPlugin.js.map +1 -1
- package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
- package/dist/plugins/tools/nodeDefaults.js +2 -0
- package/dist/plugins/tools/nodeDefaults.js.map +1 -1
- package/dist/plugins/tools/security/securityPlugin.d.ts +3 -0
- package/dist/plugins/tools/security/securityPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/security/securityPlugin.js +12 -0
- package/dist/plugins/tools/security/securityPlugin.js.map +1 -0
- package/dist/runtime/agentSession.d.ts +2 -2
- package/dist/runtime/agentSession.d.ts.map +1 -1
- package/dist/runtime/agentSession.js +2 -2
- package/dist/runtime/agentSession.js.map +1 -1
- package/dist/security/active-stack-security.d.ts +112 -0
- package/dist/security/active-stack-security.d.ts.map +1 -0
- package/dist/security/active-stack-security.js +296 -0
- package/dist/security/active-stack-security.js.map +1 -0
- package/dist/security/advanced-persistence-research.d.ts +92 -0
- package/dist/security/advanced-persistence-research.d.ts.map +1 -0
- package/dist/security/advanced-persistence-research.js +195 -0
- package/dist/security/advanced-persistence-research.js.map +1 -0
- package/dist/security/advanced-targeting.d.ts +119 -0
- package/dist/security/advanced-targeting.d.ts.map +1 -0
- package/dist/security/advanced-targeting.js +233 -0
- package/dist/security/advanced-targeting.js.map +1 -0
- package/dist/security/assessment/vulnerabilityAssessment.d.ts +104 -0
- package/dist/security/assessment/vulnerabilityAssessment.d.ts.map +1 -0
- package/dist/security/assessment/vulnerabilityAssessment.js +315 -0
- package/dist/security/assessment/vulnerabilityAssessment.js.map +1 -0
- package/dist/security/authorization/securityAuthorization.d.ts +88 -0
- package/dist/security/authorization/securityAuthorization.d.ts.map +1 -0
- package/dist/security/authorization/securityAuthorization.js +172 -0
- package/dist/security/authorization/securityAuthorization.js.map +1 -0
- package/dist/security/comprehensive-targeting.d.ts +85 -0
- package/dist/security/comprehensive-targeting.d.ts.map +1 -0
- package/dist/security/comprehensive-targeting.js +438 -0
- package/dist/security/comprehensive-targeting.js.map +1 -0
- package/dist/security/global-security-integration.d.ts +91 -0
- package/dist/security/global-security-integration.d.ts.map +1 -0
- package/dist/security/global-security-integration.js +218 -0
- package/dist/security/global-security-integration.js.map +1 -0
- package/dist/security/index.d.ts +38 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +47 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/persistence-analyzer.d.ts +56 -0
- package/dist/security/persistence-analyzer.d.ts.map +1 -0
- package/dist/security/persistence-analyzer.js +187 -0
- package/dist/security/persistence-analyzer.js.map +1 -0
- package/dist/security/persistence-cli.d.ts +36 -0
- package/dist/security/persistence-cli.d.ts.map +1 -0
- package/dist/security/persistence-cli.js +160 -0
- package/dist/security/persistence-cli.js.map +1 -0
- package/dist/security/persistence-research.d.ts +92 -0
- package/dist/security/persistence-research.d.ts.map +1 -0
- package/dist/security/persistence-research.js +364 -0
- package/dist/security/persistence-research.js.map +1 -0
- package/dist/security/research/persistenceResearch.d.ts +97 -0
- package/dist/security/research/persistenceResearch.d.ts.map +1 -0
- package/dist/security/research/persistenceResearch.js +282 -0
- package/dist/security/research/persistenceResearch.js.map +1 -0
- package/dist/security/security-integration.d.ts +74 -0
- package/dist/security/security-integration.d.ts.map +1 -0
- package/dist/security/security-integration.js +137 -0
- package/dist/security/security-integration.js.map +1 -0
- package/dist/security/security-testing-framework.d.ts +112 -0
- package/dist/security/security-testing-framework.d.ts.map +1 -0
- package/dist/security/security-testing-framework.js +364 -0
- package/dist/security/security-testing-framework.js.map +1 -0
- package/dist/security/simulation/attackSimulation.d.ts +93 -0
- package/dist/security/simulation/attackSimulation.d.ts.map +1 -0
- package/dist/security/simulation/attackSimulation.js +341 -0
- package/dist/security/simulation/attackSimulation.js.map +1 -0
- package/dist/security/strategic-operations.d.ts +100 -0
- package/dist/security/strategic-operations.d.ts.map +1 -0
- package/dist/security/strategic-operations.js +276 -0
- package/dist/security/strategic-operations.js.map +1 -0
- package/dist/security/tool-security-wrapper.d.ts +58 -0
- package/dist/security/tool-security-wrapper.d.ts.map +1 -0
- package/dist/security/tool-security-wrapper.js +156 -0
- package/dist/security/tool-security-wrapper.js.map +1 -0
- package/dist/shell/claudeCodeStreamHandler.d.ts +145 -0
- package/dist/shell/claudeCodeStreamHandler.d.ts.map +1 -0
- package/dist/shell/claudeCodeStreamHandler.js +322 -0
- package/dist/shell/claudeCodeStreamHandler.js.map +1 -0
- package/dist/shell/inputQueueManager.d.ts +144 -0
- package/dist/shell/inputQueueManager.d.ts.map +1 -0
- package/dist/shell/inputQueueManager.js +290 -0
- package/dist/shell/inputQueueManager.js.map +1 -0
- package/dist/shell/interactiveShell.d.ts +7 -43
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +166 -418
- package/dist/shell/interactiveShell.js.map +1 -1
- package/dist/shell/metricsTracker.d.ts +60 -0
- package/dist/shell/metricsTracker.d.ts.map +1 -0
- package/dist/shell/metricsTracker.js +119 -0
- package/dist/shell/metricsTracker.js.map +1 -0
- package/dist/shell/shellApp.d.ts +0 -2
- package/dist/shell/shellApp.d.ts.map +1 -1
- package/dist/shell/shellApp.js +9 -82
- package/dist/shell/shellApp.js.map +1 -1
- package/dist/shell/streamingOutputManager.d.ts +115 -0
- package/dist/shell/streamingOutputManager.d.ts.map +1 -0
- package/dist/shell/streamingOutputManager.js +225 -0
- package/dist/shell/streamingOutputManager.js.map +1 -0
- package/dist/shell/systemPrompt.d.ts.map +1 -1
- package/dist/shell/systemPrompt.js +4 -1
- package/dist/shell/systemPrompt.js.map +1 -1
- package/dist/shell/terminalInput.d.ts +124 -258
- package/dist/shell/terminalInput.d.ts.map +1 -1
- package/dist/shell/terminalInput.js +608 -1010
- package/dist/shell/terminalInput.js.map +1 -1
- package/dist/shell/terminalInputAdapter.d.ts +24 -106
- package/dist/shell/terminalInputAdapter.d.ts.map +1 -1
- package/dist/shell/terminalInputAdapter.js +30 -140
- package/dist/shell/terminalInputAdapter.js.map +1 -1
- package/dist/subagents/taskRunner.d.ts +1 -7
- package/dist/subagents/taskRunner.d.ts.map +1 -1
- package/dist/subagents/taskRunner.js +47 -180
- package/dist/subagents/taskRunner.js.map +1 -1
- package/dist/tools/learnTools.js +4 -127
- package/dist/tools/learnTools.js.map +1 -1
- package/dist/tools/securityTools.d.ts +22 -0
- package/dist/tools/securityTools.d.ts.map +1 -0
- package/dist/tools/securityTools.js +448 -0
- package/dist/tools/securityTools.js.map +1 -0
- package/dist/ui/ShellUIAdapter.d.ts +1 -7
- package/dist/ui/ShellUIAdapter.d.ts.map +1 -1
- package/dist/ui/ShellUIAdapter.js +18 -42
- package/dist/ui/ShellUIAdapter.js.map +1 -1
- package/dist/ui/display.d.ts +45 -24
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +274 -148
- package/dist/ui/display.js.map +1 -1
- package/dist/ui/persistentPrompt.d.ts +50 -0
- package/dist/ui/persistentPrompt.d.ts.map +1 -0
- package/dist/ui/persistentPrompt.js +92 -0
- package/dist/ui/persistentPrompt.js.map +1 -0
- package/dist/ui/terminalUISchema.d.ts +195 -0
- package/dist/ui/terminalUISchema.d.ts.map +1 -0
- package/dist/ui/terminalUISchema.js +113 -0
- package/dist/ui/terminalUISchema.js.map +1 -0
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js +8 -6
- package/dist/ui/theme.js.map +1 -1
- package/dist/ui/toolDisplay.d.ts +158 -0
- package/dist/ui/toolDisplay.d.ts.map +1 -1
- package/dist/ui/toolDisplay.js +348 -0
- package/dist/ui/toolDisplay.js.map +1 -1
- package/dist/ui/unified/layout.d.ts +0 -20
- package/dist/ui/unified/layout.d.ts.map +1 -1
- package/dist/ui/unified/layout.js +216 -105
- package/dist/ui/unified/layout.js.map +1 -1
- package/package.json +4 -4
- package/scripts/deploy-security-capabilities.js +178 -0
- package/dist/core/hooks.d.ts +0 -113
- package/dist/core/hooks.d.ts.map +0 -1
- package/dist/core/hooks.js +0 -267
- package/dist/core/hooks.js.map +0 -1
- package/dist/core/metricsTracker.d.ts +0 -122
- package/dist/core/metricsTracker.d.ts.map +0 -1
- package/dist/core/metricsTracker.js.map +0 -1
- package/dist/core/securityAssessment.d.ts +0 -91
- package/dist/core/securityAssessment.d.ts.map +0 -1
- package/dist/core/securityAssessment.js +0 -580
- package/dist/core/securityAssessment.js.map +0 -1
- package/dist/core/verification.d.ts +0 -137
- package/dist/core/verification.d.ts.map +0 -1
- package/dist/core/verification.js +0 -323
- package/dist/core/verification.js.map +0 -1
- package/dist/subagents/agentConfig.d.ts +0 -27
- package/dist/subagents/agentConfig.d.ts.map +0 -1
- package/dist/subagents/agentConfig.js +0 -89
- package/dist/subagents/agentConfig.js.map +0 -1
- package/dist/subagents/agentRegistry.d.ts +0 -33
- package/dist/subagents/agentRegistry.d.ts.map +0 -1
- package/dist/subagents/agentRegistry.js +0 -162
- package/dist/subagents/agentRegistry.js.map +0 -1
- package/dist/utils/frontmatter.d.ts +0 -10
- package/dist/utils/frontmatter.d.ts.map +0 -1
- package/dist/utils/frontmatter.js +0 -78
- package/dist/utils/frontmatter.js.map +0 -1
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Testing Toolkit - Ethical penetration testing and security analysis
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: These tools are for AUTHORIZED security testing only:
|
|
5
|
+
* - Your own systems and applications
|
|
6
|
+
* - Systems you have explicit written permission to test
|
|
7
|
+
* - Bug bounty programs where you're an authorized participant
|
|
8
|
+
* - CTF competitions
|
|
9
|
+
* - Security research and education
|
|
10
|
+
*
|
|
11
|
+
* DO NOT use these tools for:
|
|
12
|
+
* - Unauthorized access to systems
|
|
13
|
+
* - Denial of service attacks
|
|
14
|
+
* - Mass scanning without permission
|
|
15
|
+
* - Any illegal activities
|
|
16
|
+
*/
|
|
17
|
+
import { exec } from 'node:child_process';
|
|
18
|
+
import { promisify } from 'node:util';
|
|
19
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
20
|
+
import { join, relative } from 'node:path';
|
|
21
|
+
const execAsync = promisify(exec);
|
|
22
|
+
// Common security patterns to detect
|
|
23
|
+
const SECRET_PATTERNS = [
|
|
24
|
+
{ name: 'AWS Access Key', pattern: /AKIA[0-9A-Z]{16}/g },
|
|
25
|
+
{ name: 'AWS Secret Key', pattern: /[A-Za-z0-9/+=]{40}/g },
|
|
26
|
+
{ name: 'GitHub Token', pattern: /gh[pousr]_[A-Za-z0-9_]{36,255}/g },
|
|
27
|
+
{ name: 'Generic API Key', pattern: /[aA][pP][iI][-_]?[kK][eE][yY][\s:=]+['"]?[A-Za-z0-9-_]{20,}/g },
|
|
28
|
+
{ name: 'Generic Secret', pattern: /[sS][eE][cC][rR][eE][tT][\s:=]+['"]?[A-Za-z0-9-_]{20,}/g },
|
|
29
|
+
{ name: 'Private Key', pattern: /-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/g },
|
|
30
|
+
{ name: 'Password in URL', pattern: /[a-zA-Z]+:\/\/[^:]+:[^@]+@/g },
|
|
31
|
+
{ name: 'JWT Token', pattern: /eyJ[A-Za-z0-9-_]+\.eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+/g },
|
|
32
|
+
];
|
|
33
|
+
// SQL injection patterns
|
|
34
|
+
const SQL_INJECTION_PATTERNS = [
|
|
35
|
+
{ name: 'String concatenation in query', pattern: /query\s*\+\s*['"`]/g },
|
|
36
|
+
{ name: 'Unparameterized query', pattern: /execute\s*\(\s*['"`][^?$]/g },
|
|
37
|
+
{ name: 'Direct variable in SQL', pattern: /SELECT.*\$\{[^}]+\}/g },
|
|
38
|
+
{ name: 'Format string in query', pattern: /f["']SELECT.*\{/g },
|
|
39
|
+
];
|
|
40
|
+
// XSS patterns
|
|
41
|
+
const XSS_PATTERNS = [
|
|
42
|
+
{ name: 'innerHTML assignment', pattern: /\.innerHTML\s*=/g },
|
|
43
|
+
{ name: 'document.write', pattern: /document\.write\s*\(/g },
|
|
44
|
+
{ name: 'eval with user input', pattern: /eval\s*\([^)]*(?:req|param|input|user)/gi },
|
|
45
|
+
{ name: 'dangerouslySetInnerHTML', pattern: /dangerouslySetInnerHTML/g },
|
|
46
|
+
];
|
|
47
|
+
// Command injection patterns
|
|
48
|
+
const COMMAND_INJECTION_PATTERNS = [
|
|
49
|
+
{ name: 'Shell execution with variable', pattern: /exec\s*\(\s*[`'"].*\$\{/g },
|
|
50
|
+
{ name: 'Child process spawn', pattern: /spawn\s*\([^)]*\+/g },
|
|
51
|
+
{ name: 'System call with concat', pattern: /system\s*\([^)]*\+/g },
|
|
52
|
+
];
|
|
53
|
+
async function scanFileForSecrets(filePath, workingDir) {
|
|
54
|
+
const findings = [];
|
|
55
|
+
try {
|
|
56
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
57
|
+
const lines = content.split('\n');
|
|
58
|
+
const relativePath = relative(workingDir, filePath);
|
|
59
|
+
for (let i = 0; i < lines.length; i++) {
|
|
60
|
+
const line = lines[i] ?? '';
|
|
61
|
+
for (const { name, pattern } of SECRET_PATTERNS) {
|
|
62
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
63
|
+
if (regex.test(line)) {
|
|
64
|
+
findings.push({
|
|
65
|
+
type: 'secret-exposure',
|
|
66
|
+
severity: 'critical',
|
|
67
|
+
file: relativePath,
|
|
68
|
+
line: i + 1,
|
|
69
|
+
description: `Potential ${name} detected`,
|
|
70
|
+
code: line.slice(0, 100) + (line.length > 100 ? '...' : ''),
|
|
71
|
+
recommendation: 'Remove hardcoded secrets and use environment variables or a secrets manager',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Skip files that can't be read
|
|
79
|
+
}
|
|
80
|
+
return findings;
|
|
81
|
+
}
|
|
82
|
+
async function scanFileForVulnerabilities(filePath, workingDir) {
|
|
83
|
+
const findings = [];
|
|
84
|
+
try {
|
|
85
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
86
|
+
const lines = content.split('\n');
|
|
87
|
+
const relativePath = relative(workingDir, filePath);
|
|
88
|
+
// SQL Injection checks
|
|
89
|
+
for (let i = 0; i < lines.length; i++) {
|
|
90
|
+
const line = lines[i] ?? '';
|
|
91
|
+
for (const { name, pattern } of SQL_INJECTION_PATTERNS) {
|
|
92
|
+
if (pattern.test(line)) {
|
|
93
|
+
findings.push({
|
|
94
|
+
type: 'sql-injection',
|
|
95
|
+
severity: 'high',
|
|
96
|
+
file: relativePath,
|
|
97
|
+
line: i + 1,
|
|
98
|
+
description: name,
|
|
99
|
+
code: line.trim().slice(0, 100),
|
|
100
|
+
recommendation: 'Use parameterized queries or prepared statements',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// XSS checks
|
|
106
|
+
for (let i = 0; i < lines.length; i++) {
|
|
107
|
+
const line = lines[i] ?? '';
|
|
108
|
+
for (const { name, pattern } of XSS_PATTERNS) {
|
|
109
|
+
if (pattern.test(line)) {
|
|
110
|
+
findings.push({
|
|
111
|
+
type: 'xss',
|
|
112
|
+
severity: 'high',
|
|
113
|
+
file: relativePath,
|
|
114
|
+
line: i + 1,
|
|
115
|
+
description: name,
|
|
116
|
+
code: line.trim().slice(0, 100),
|
|
117
|
+
recommendation: 'Sanitize user input and use safe DOM manipulation methods',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Command Injection checks
|
|
123
|
+
for (let i = 0; i < lines.length; i++) {
|
|
124
|
+
const line = lines[i] ?? '';
|
|
125
|
+
for (const { name, pattern } of COMMAND_INJECTION_PATTERNS) {
|
|
126
|
+
if (pattern.test(line)) {
|
|
127
|
+
findings.push({
|
|
128
|
+
type: 'command-injection',
|
|
129
|
+
severity: 'critical',
|
|
130
|
+
file: relativePath,
|
|
131
|
+
line: i + 1,
|
|
132
|
+
description: name,
|
|
133
|
+
code: line.trim().slice(0, 100),
|
|
134
|
+
recommendation: 'Avoid shell commands with user input, or use strict input validation',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Skip files that can't be read
|
|
142
|
+
}
|
|
143
|
+
return findings;
|
|
144
|
+
}
|
|
145
|
+
function walkDirectory(dir, extensions, ignore = ['node_modules', '.git', 'dist', 'build', '__pycache__', '.venv']) {
|
|
146
|
+
const files = [];
|
|
147
|
+
try {
|
|
148
|
+
const entries = readdirSync(dir);
|
|
149
|
+
for (const entry of entries) {
|
|
150
|
+
const fullPath = join(dir, entry);
|
|
151
|
+
if (ignore.some((ig) => entry === ig || fullPath.includes(`/${ig}/`))) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const stat = statSync(fullPath);
|
|
155
|
+
if (stat.isDirectory()) {
|
|
156
|
+
files.push(...walkDirectory(fullPath, extensions, ignore));
|
|
157
|
+
}
|
|
158
|
+
else if (extensions.some((ext) => entry.endsWith(ext))) {
|
|
159
|
+
files.push(fullPath);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Skip directories we can't read
|
|
165
|
+
}
|
|
166
|
+
return files;
|
|
167
|
+
}
|
|
168
|
+
function formatFindings(findings) {
|
|
169
|
+
if (findings.length === 0) {
|
|
170
|
+
return 'No vulnerabilities found.';
|
|
171
|
+
}
|
|
172
|
+
const critical = findings.filter((f) => f.severity === 'critical');
|
|
173
|
+
const high = findings.filter((f) => f.severity === 'high');
|
|
174
|
+
const medium = findings.filter((f) => f.severity === 'medium');
|
|
175
|
+
const low = findings.filter((f) => f.severity === 'low');
|
|
176
|
+
const lines = [];
|
|
177
|
+
lines.push(`Found ${findings.length} potential issues:\n`);
|
|
178
|
+
lines.push(` Critical: ${critical.length}`);
|
|
179
|
+
lines.push(` High: ${high.length}`);
|
|
180
|
+
lines.push(` Medium: ${medium.length}`);
|
|
181
|
+
lines.push(` Low: ${low.length}\n`);
|
|
182
|
+
const sorted = [...critical, ...high, ...medium, ...low];
|
|
183
|
+
for (const finding of sorted.slice(0, 20)) {
|
|
184
|
+
const icon = finding.severity === 'critical' ? '🔴' : finding.severity === 'high' ? '🟠' : '🟡';
|
|
185
|
+
lines.push(`${icon} [${finding.severity.toUpperCase()}] ${finding.type}`);
|
|
186
|
+
lines.push(` File: ${finding.file}:${finding.line}`);
|
|
187
|
+
lines.push(` Issue: ${finding.description}`);
|
|
188
|
+
lines.push(` Code: ${finding.code}`);
|
|
189
|
+
lines.push(` Fix: ${finding.recommendation}\n`);
|
|
190
|
+
}
|
|
191
|
+
if (sorted.length > 20) {
|
|
192
|
+
lines.push(`... and ${sorted.length - 20} more issues`);
|
|
193
|
+
}
|
|
194
|
+
return lines.join('\n');
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create security testing tools bound to a working directory
|
|
198
|
+
*/
|
|
199
|
+
export function createSecurityTools(workingDir) {
|
|
200
|
+
return [
|
|
201
|
+
{
|
|
202
|
+
name: 'security_scan',
|
|
203
|
+
description: 'Scan codebase for common security vulnerabilities (SQL injection, XSS, command injection). For authorized security testing only.',
|
|
204
|
+
parameters: {
|
|
205
|
+
type: 'object',
|
|
206
|
+
properties: {
|
|
207
|
+
path: {
|
|
208
|
+
type: 'string',
|
|
209
|
+
description: 'Directory to scan (defaults to current workspace)',
|
|
210
|
+
},
|
|
211
|
+
type: {
|
|
212
|
+
type: 'string',
|
|
213
|
+
enum: ['all', 'secrets', 'sql', 'xss', 'command-injection'],
|
|
214
|
+
description: 'Type of vulnerabilities to scan for',
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
handler: async (args) => {
|
|
219
|
+
const targetPath = args['path'] || workingDir;
|
|
220
|
+
const scanType = args['type'] || 'all';
|
|
221
|
+
const extensions = ['.js', '.ts', '.jsx', '.tsx', '.py', '.rb', '.php', '.java', '.go'];
|
|
222
|
+
const files = walkDirectory(targetPath, extensions);
|
|
223
|
+
const allFindings = [];
|
|
224
|
+
for (const file of files) {
|
|
225
|
+
if (scanType === 'all' || scanType === 'secrets') {
|
|
226
|
+
allFindings.push(...(await scanFileForSecrets(file, workingDir)));
|
|
227
|
+
}
|
|
228
|
+
if (scanType === 'all' || ['sql', 'xss', 'command-injection'].includes(scanType)) {
|
|
229
|
+
const vulns = await scanFileForVulnerabilities(file, workingDir);
|
|
230
|
+
if (scanType !== 'all') {
|
|
231
|
+
allFindings.push(...vulns.filter((v) => v.type === scanType));
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
allFindings.push(...vulns);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return formatFindings(allFindings);
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: 'secret_scan',
|
|
243
|
+
description: 'Scan for exposed secrets, API keys, and credentials in the codebase.',
|
|
244
|
+
parameters: {
|
|
245
|
+
type: 'object',
|
|
246
|
+
properties: {
|
|
247
|
+
path: {
|
|
248
|
+
type: 'string',
|
|
249
|
+
description: 'Directory to scan (defaults to current workspace)',
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
handler: async (args) => {
|
|
254
|
+
const targetPath = args['path'] || workingDir;
|
|
255
|
+
const extensions = ['.js', '.ts', '.jsx', '.tsx', '.py', '.rb', '.php', '.java', '.go', '.env', '.json', '.yaml', '.yml', '.toml', '.conf', '.cfg'];
|
|
256
|
+
const files = walkDirectory(targetPath, extensions);
|
|
257
|
+
const allFindings = [];
|
|
258
|
+
for (const file of files) {
|
|
259
|
+
allFindings.push(...(await scanFileForSecrets(file, workingDir)));
|
|
260
|
+
}
|
|
261
|
+
return formatFindings(allFindings);
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
name: 'dependency_audit',
|
|
266
|
+
description: 'Audit dependencies for known vulnerabilities using npm audit, pip-audit, or similar tools.',
|
|
267
|
+
parameters: {
|
|
268
|
+
type: 'object',
|
|
269
|
+
properties: {
|
|
270
|
+
package_manager: {
|
|
271
|
+
type: 'string',
|
|
272
|
+
enum: ['npm', 'pip', 'auto'],
|
|
273
|
+
description: 'Package manager to audit (auto-detected by default)',
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
handler: async (args) => {
|
|
278
|
+
const pm = args['package_manager'] || 'auto';
|
|
279
|
+
const results = [];
|
|
280
|
+
const hasNpm = existsSync(join(workingDir, 'package.json'));
|
|
281
|
+
const hasPip = existsSync(join(workingDir, 'requirements.txt')) ||
|
|
282
|
+
existsSync(join(workingDir, 'pyproject.toml'));
|
|
283
|
+
if ((pm === 'auto' || pm === 'npm') && hasNpm) {
|
|
284
|
+
try {
|
|
285
|
+
const { stdout } = await execAsync('npm audit --json', {
|
|
286
|
+
cwd: workingDir,
|
|
287
|
+
timeout: 60000,
|
|
288
|
+
});
|
|
289
|
+
const audit = JSON.parse(stdout || '{}');
|
|
290
|
+
results.push('=== NPM Audit Results ===');
|
|
291
|
+
if (audit.metadata) {
|
|
292
|
+
results.push(`Total dependencies: ${audit.metadata.totalDependencies || 'unknown'}`);
|
|
293
|
+
results.push(`Vulnerabilities: ${audit.metadata.vulnerabilities?.total || 0}`);
|
|
294
|
+
if (audit.metadata.vulnerabilities) {
|
|
295
|
+
const v = audit.metadata.vulnerabilities;
|
|
296
|
+
results.push(` Critical: ${v.critical || 0}`);
|
|
297
|
+
results.push(` High: ${v.high || 0}`);
|
|
298
|
+
results.push(` Moderate: ${v.moderate || 0}`);
|
|
299
|
+
results.push(` Low: ${v.low || 0}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
results.push('');
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
results.push('NPM audit failed or found vulnerabilities');
|
|
306
|
+
results.push('Run `npm audit` manually for details');
|
|
307
|
+
results.push('');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if ((pm === 'auto' || pm === 'pip') && hasPip) {
|
|
311
|
+
try {
|
|
312
|
+
const { stdout } = await execAsync('pip-audit --format=json 2>/dev/null || pip audit 2>/dev/null || echo "[]"', {
|
|
313
|
+
cwd: workingDir,
|
|
314
|
+
timeout: 60000,
|
|
315
|
+
});
|
|
316
|
+
results.push('=== Python Dependency Audit ===');
|
|
317
|
+
try {
|
|
318
|
+
const vulnerabilities = JSON.parse(stdout);
|
|
319
|
+
if (Array.isArray(vulnerabilities) && vulnerabilities.length > 0) {
|
|
320
|
+
results.push(`Found ${vulnerabilities.length} vulnerabilities`);
|
|
321
|
+
for (const v of vulnerabilities.slice(0, 10)) {
|
|
322
|
+
results.push(` - ${v.name}: ${v.vulns?.length || 0} issues`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
results.push('No known vulnerabilities found');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
results.push('Audit completed (install pip-audit for detailed results)');
|
|
331
|
+
}
|
|
332
|
+
results.push('');
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
results.push('Python audit not available');
|
|
336
|
+
results.push('Install pip-audit: pip install pip-audit');
|
|
337
|
+
results.push('');
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (results.length === 0) {
|
|
341
|
+
return 'No supported package manager found in this project.';
|
|
342
|
+
}
|
|
343
|
+
return results.join('\n');
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
name: 'port_scan',
|
|
348
|
+
description: 'Scan ports on a target host. ONLY for authorized targets (your own systems, bug bounty scope, CTF).',
|
|
349
|
+
parameters: {
|
|
350
|
+
type: 'object',
|
|
351
|
+
properties: {
|
|
352
|
+
target: {
|
|
353
|
+
type: 'string',
|
|
354
|
+
description: 'Target hostname or IP (must be authorized)',
|
|
355
|
+
},
|
|
356
|
+
ports: {
|
|
357
|
+
type: 'string',
|
|
358
|
+
description: 'Port range to scan (e.g., "80,443,8080" or "1-1000")',
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
required: ['target'],
|
|
362
|
+
},
|
|
363
|
+
handler: async (args) => {
|
|
364
|
+
const target = args['target'];
|
|
365
|
+
const portsArg = args['ports'] || '21,22,23,25,53,80,110,139,143,443,445,993,995,3306,3389,5432,5900,8080,8443';
|
|
366
|
+
try {
|
|
367
|
+
// Use nc (netcat) for basic port scanning
|
|
368
|
+
const ports = portsArg.split(',').map((p) => p.trim());
|
|
369
|
+
const results = [`Port scan results for ${target}:\n`];
|
|
370
|
+
for (const portSpec of ports.slice(0, 20)) { // Limit to prevent abuse
|
|
371
|
+
const port = parseInt(portSpec, 10);
|
|
372
|
+
if (isNaN(port))
|
|
373
|
+
continue;
|
|
374
|
+
try {
|
|
375
|
+
await execAsync(`nc -z -w1 ${target} ${port}`, { timeout: 2000 });
|
|
376
|
+
results.push(` [OPEN] Port ${port}`);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
results.push(` [CLOSED/FILTERED] Port ${port}`);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return results.join('\n');
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
return `Port scan failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
name: 'http_headers_check',
|
|
391
|
+
description: 'Check HTTP security headers on a URL. For authorized security testing only.',
|
|
392
|
+
parameters: {
|
|
393
|
+
type: 'object',
|
|
394
|
+
properties: {
|
|
395
|
+
url: {
|
|
396
|
+
type: 'string',
|
|
397
|
+
description: 'URL to check headers for',
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
required: ['url'],
|
|
401
|
+
},
|
|
402
|
+
handler: async (args) => {
|
|
403
|
+
const url = args['url'];
|
|
404
|
+
try {
|
|
405
|
+
const { stdout } = await execAsync(`curl -sI -X GET "${url}" --max-time 10`, {
|
|
406
|
+
timeout: 15000,
|
|
407
|
+
});
|
|
408
|
+
const headers = stdout.toLowerCase();
|
|
409
|
+
const findings = [`HTTP Security Headers for ${url}:\n`];
|
|
410
|
+
// Check for security headers
|
|
411
|
+
const securityHeaders = [
|
|
412
|
+
{ name: 'Strict-Transport-Security', check: 'strict-transport-security', severity: 'high' },
|
|
413
|
+
{ name: 'Content-Security-Policy', check: 'content-security-policy', severity: 'medium' },
|
|
414
|
+
{ name: 'X-Content-Type-Options', check: 'x-content-type-options', severity: 'medium' },
|
|
415
|
+
{ name: 'X-Frame-Options', check: 'x-frame-options', severity: 'medium' },
|
|
416
|
+
{ name: 'X-XSS-Protection', check: 'x-xss-protection', severity: 'low' },
|
|
417
|
+
{ name: 'Referrer-Policy', check: 'referrer-policy', severity: 'low' },
|
|
418
|
+
{ name: 'Permissions-Policy', check: 'permissions-policy', severity: 'low' },
|
|
419
|
+
];
|
|
420
|
+
for (const { name, check, severity } of securityHeaders) {
|
|
421
|
+
if (headers.includes(check)) {
|
|
422
|
+
findings.push(`✅ ${name}: Present`);
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
const icon = severity === 'high' ? '🔴' : severity === 'medium' ? '🟠' : '🟡';
|
|
426
|
+
findings.push(`${icon} ${name}: MISSING (${severity} severity)`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// Check for information leakage
|
|
430
|
+
findings.push('\nInformation Disclosure:');
|
|
431
|
+
if (headers.includes('server:')) {
|
|
432
|
+
const serverMatch = stdout.match(/server:\s*(.+)/i);
|
|
433
|
+
findings.push(`⚠️ Server header exposes: ${serverMatch?.[1]?.trim() || 'server info'}`);
|
|
434
|
+
}
|
|
435
|
+
if (headers.includes('x-powered-by:')) {
|
|
436
|
+
const poweredBy = stdout.match(/x-powered-by:\s*(.+)/i);
|
|
437
|
+
findings.push(`⚠️ X-Powered-By exposes: ${poweredBy?.[1]?.trim() || 'framework info'}`);
|
|
438
|
+
}
|
|
439
|
+
return findings.join('\n');
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
return `Header check failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
];
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=securityTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityTools.js","sourceRoot":"","sources":["../../src/tools/securityTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,15 +36,9 @@ export declare class ShellUIAdapter {
|
|
|
36
36
|
getController(): UnifiedUIController;
|
|
37
37
|
/**
|
|
38
38
|
* Create a tool observer for the agent
|
|
39
|
-
*
|
|
39
|
+
* Claude Code style: Display each tool call clearly with ⏺ prefix and results with ⎿ prefix
|
|
40
40
|
*/
|
|
41
41
|
createToolObserver(): ToolRuntimeObserver;
|
|
42
|
-
/**
|
|
43
|
-
* Determine if a tool should show initial ⏺ display
|
|
44
|
-
* Returns true for tools with streaming/progressive output
|
|
45
|
-
* Returns false for quick single-result tools to avoid duplicate displays
|
|
46
|
-
*/
|
|
47
|
-
private shouldShowToolStart;
|
|
48
42
|
/**
|
|
49
43
|
* Display tool call start with Claude Code style ⏺ prefix
|
|
50
44
|
* Routes through display module to work with scroll regions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShellUIAdapter.d.ts","sourceRoot":"","sources":["../../src/ui/ShellUIAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAA2B,MAAM,wBAAwB,CAAC;AAMtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAG7E,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,kBAAkB,CAAC,CAAiG;IAC5H,OAAO,CAAC,mBAAmB,CAAC,CAAkC;IAC9D,OAAO,CAAC,sBAAsB,CAAC,CAAgC;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsB;gBAGtD,WAAW,EAAE,OAAO,OAAO,CAAC,MAAM,EAClC,OAAO,EAAE,OAAO,EAChB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM,EAC1C,iBAAiB,CAAC,EAAE,mBAAmB;IAyBzC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,oBAAoB,IAAI,mBAAmB;IAI3C;;OAEG;IACH,aAAa,IAAI,mBAAmB;IAIpC;;;OAGG;IACH,kBAAkB,IAAI,mBAAmB;
|
|
1
|
+
{"version":3,"file":"ShellUIAdapter.d.ts","sourceRoot":"","sources":["../../src/ui/ShellUIAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { UnifiedUIController } from './UnifiedUIController.js';
|
|
6
6
|
import { InterruptPriority } from './interrupts/InterruptManager.js';
|
|
7
|
-
import { getTerminalColumns
|
|
7
|
+
import { getTerminalColumns } from './layout.js';
|
|
8
8
|
import { formatToolResultSummary } from './toolDisplay.js';
|
|
9
9
|
import { theme } from './theme.js';
|
|
10
10
|
import { UIUpdateCoordinator } from './orchestration/UIUpdateCoordinator.js';
|
|
@@ -67,18 +67,14 @@ export class ShellUIAdapter {
|
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* Create a tool observer for the agent
|
|
70
|
-
*
|
|
70
|
+
* Claude Code style: Display each tool call clearly with ⏺ prefix and results with ⎿ prefix
|
|
71
71
|
*/
|
|
72
72
|
createToolObserver() {
|
|
73
73
|
return {
|
|
74
74
|
onToolStart: (call) => {
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (showsProgressiveOutput) {
|
|
79
|
-
this.displayToolCallStart(call);
|
|
80
|
-
}
|
|
81
|
-
// Update status bar to show active tool
|
|
75
|
+
// Claude Code style: Display tool call with ⏺ prefix
|
|
76
|
+
this.displayToolCallStart(call);
|
|
77
|
+
// Update status bar
|
|
82
78
|
if (this._toolStatusCallback) {
|
|
83
79
|
const actionDesc = this.getToolActionDescription(call);
|
|
84
80
|
this._toolStatusCallback(actionDesc);
|
|
@@ -137,32 +133,13 @@ export class ShellUIAdapter {
|
|
|
137
133
|
this.uiController.onToolError(call.id, { message });
|
|
138
134
|
},
|
|
139
135
|
onCacheHit: (call) => {
|
|
140
|
-
//
|
|
141
|
-
|
|
136
|
+
// Claude Code style: Show cache hit briefly
|
|
137
|
+
this.displayToolCallStart(call, true);
|
|
142
138
|
this.uiController.onToolStart(call);
|
|
143
139
|
this.uiController.onToolComplete(call.id, 'cache-hit');
|
|
144
140
|
},
|
|
145
141
|
};
|
|
146
142
|
}
|
|
147
|
-
/**
|
|
148
|
-
* Determine if a tool should show initial ⏺ display
|
|
149
|
-
* Returns true for tools with streaming/progressive output
|
|
150
|
-
* Returns false for quick single-result tools to avoid duplicate displays
|
|
151
|
-
*/
|
|
152
|
-
shouldShowToolStart(toolName) {
|
|
153
|
-
// Tools that show streaming or progressive output - show start indicator
|
|
154
|
-
const streamingTools = new Set([
|
|
155
|
-
'Task', // Spawns agents with streaming output
|
|
156
|
-
'Bash', // Shows live command output
|
|
157
|
-
'Explore', // Lists files progressively
|
|
158
|
-
'Plan', // Planning agent with progressive output
|
|
159
|
-
'Grep', // May return many results
|
|
160
|
-
'Glob', // May return many files
|
|
161
|
-
'WebSearch', // Shows search progress
|
|
162
|
-
'WebFetch', // Shows fetch progress
|
|
163
|
-
]);
|
|
164
|
-
return streamingTools.has(toolName);
|
|
165
|
-
}
|
|
166
143
|
/**
|
|
167
144
|
* Display tool call start with Claude Code style ⏺ prefix
|
|
168
145
|
* Routes through display module to work with scroll regions
|
|
@@ -602,20 +579,19 @@ export class ShellUIAdapter {
|
|
|
602
579
|
// durationMs could be tracked if we store start times
|
|
603
580
|
});
|
|
604
581
|
if (summary && summary.trim()) {
|
|
605
|
-
|
|
606
|
-
const
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
borderColor: theme.ui.border,
|
|
615
|
-
width,
|
|
582
|
+
// Claude Code style: prefix each line with ⎿
|
|
583
|
+
const prefix = success ? theme.success('⎿') : theme.error('⎿');
|
|
584
|
+
const lines = summary.split('\n');
|
|
585
|
+
const prefixedLines = lines.map((line, i) => {
|
|
586
|
+
// First line gets the ⎿ prefix, subsequent lines get indentation
|
|
587
|
+
if (i === 0) {
|
|
588
|
+
return `${prefix} ${line}`;
|
|
589
|
+
}
|
|
590
|
+
return ` ${line}`;
|
|
616
591
|
});
|
|
592
|
+
// Add blank line after result for visual separation between events
|
|
617
593
|
// Use display.stream() to work with scroll regions
|
|
618
|
-
this.display.stream(
|
|
594
|
+
this.display.stream(`${prefixedLines.join('\n')}\n\n`);
|
|
619
595
|
}
|
|
620
596
|
}
|
|
621
597
|
/**
|