erosolar-cli 1.7.286 → 1.7.290
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 +0 -1
- 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/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 -22
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +159 -229
- 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 -40
- 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 +157 -87
- package/dist/shell/terminalInput.d.ts.map +1 -1
- package/dist/shell/terminalInput.js +655 -558
- package/dist/shell/terminalInput.js.map +1 -1
- package/dist/shell/terminalInputAdapter.d.ts +35 -28
- package/dist/shell/terminalInputAdapter.d.ts.map +1 -1
- package/dist/shell/terminalInputAdapter.js +50 -26
- 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/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.map +1 -1
- package/dist/ui/ShellUIAdapter.js +12 -13
- 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 +259 -140
- 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 -1
- package/dist/ui/unified/layout.d.ts.map +1 -1
- package/dist/ui/unified/layout.js +25 -15
- package/dist/ui/unified/layout.js.map +1 -1
- package/package.json +1 -1
- 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,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StreamingOutputManager - Buffered output for Claude Code style UI
|
|
3
|
+
*
|
|
4
|
+
* Key design principle:
|
|
5
|
+
* - Buffer streaming output instead of writing directly to stdout
|
|
6
|
+
* - This keeps the cursor at the prompt area (no cursor movement during streaming)
|
|
7
|
+
* - Render complete response when streaming ends
|
|
8
|
+
* - The UI (prompt) stays fixed at the bottom
|
|
9
|
+
*
|
|
10
|
+
* Two modes:
|
|
11
|
+
* 1. Direct mode (bufferedMode=false): Write chunks directly to stdout (original behavior)
|
|
12
|
+
* 2. Buffered mode (bufferedMode=true): Collect chunks, render when complete
|
|
13
|
+
*/
|
|
14
|
+
import { EventEmitter } from 'node:events';
|
|
15
|
+
import { writeLock } from '../ui/writeLock.js';
|
|
16
|
+
/**
|
|
17
|
+
* Manages streaming output with optional buffering.
|
|
18
|
+
*
|
|
19
|
+
* Buffered mode:
|
|
20
|
+
* - Chunks are collected in a buffer
|
|
21
|
+
* - Output is rendered all at once when streaming ends
|
|
22
|
+
* - Cursor stays at prompt area (no jumping during streaming)
|
|
23
|
+
*
|
|
24
|
+
* Direct mode:
|
|
25
|
+
* - Chunks written directly to stdout (original behavior)
|
|
26
|
+
* - Cursor moves with output
|
|
27
|
+
*/
|
|
28
|
+
export class StreamingOutputManager extends EventEmitter {
|
|
29
|
+
state = {
|
|
30
|
+
isStreaming: false,
|
|
31
|
+
charsWritten: 0,
|
|
32
|
+
linesWritten: 0,
|
|
33
|
+
startTime: null,
|
|
34
|
+
};
|
|
35
|
+
writeStream;
|
|
36
|
+
lastChunk = '';
|
|
37
|
+
// Buffered mode support
|
|
38
|
+
bufferedMode = false;
|
|
39
|
+
outputBuffer = [];
|
|
40
|
+
constructor(writeStream = process.stdout) {
|
|
41
|
+
super();
|
|
42
|
+
this.writeStream = writeStream;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Enable or disable buffered mode
|
|
46
|
+
* When buffered, chunks are collected and rendered at the end
|
|
47
|
+
*/
|
|
48
|
+
setBufferedMode(enabled) {
|
|
49
|
+
this.bufferedMode = enabled;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if buffered mode is enabled
|
|
53
|
+
*/
|
|
54
|
+
isBufferedMode() {
|
|
55
|
+
return this.bufferedMode;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get the buffered content (for rendering)
|
|
59
|
+
*/
|
|
60
|
+
getBuffer() {
|
|
61
|
+
return this.outputBuffer.join('');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Clear the buffer
|
|
65
|
+
*/
|
|
66
|
+
clearBuffer() {
|
|
67
|
+
this.outputBuffer = [];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if currently streaming output
|
|
71
|
+
*/
|
|
72
|
+
isStreaming() {
|
|
73
|
+
return this.state.isStreaming;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Begin a streaming session
|
|
77
|
+
* Resets counters and marks streaming as active
|
|
78
|
+
* In buffered mode, clears the buffer
|
|
79
|
+
*/
|
|
80
|
+
startStream() {
|
|
81
|
+
if (this.state.isStreaming) {
|
|
82
|
+
return; // Already streaming
|
|
83
|
+
}
|
|
84
|
+
this.state = {
|
|
85
|
+
isStreaming: true,
|
|
86
|
+
charsWritten: 0,
|
|
87
|
+
linesWritten: 0,
|
|
88
|
+
startTime: Date.now(),
|
|
89
|
+
};
|
|
90
|
+
this.lastChunk = '';
|
|
91
|
+
this.outputBuffer = [];
|
|
92
|
+
this.emit('stream-start');
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Write a chunk of content
|
|
96
|
+
*
|
|
97
|
+
* In buffered mode: Collect in buffer (cursor stays at prompt)
|
|
98
|
+
* In direct mode: Write to stdout immediately
|
|
99
|
+
*/
|
|
100
|
+
writeChunk(chunk) {
|
|
101
|
+
if (!chunk) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Track statistics
|
|
105
|
+
this.state.charsWritten += chunk.length;
|
|
106
|
+
this.state.linesWritten += this.countNewlines(chunk);
|
|
107
|
+
this.lastChunk = chunk;
|
|
108
|
+
if (this.bufferedMode) {
|
|
109
|
+
// Buffered mode: collect chunks, don't write yet
|
|
110
|
+
this.outputBuffer.push(chunk);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Direct mode: write immediately
|
|
114
|
+
this.writeLocked(chunk);
|
|
115
|
+
}
|
|
116
|
+
this.emit('stream-chunk', chunk);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Write a complete line (adds newline)
|
|
120
|
+
*/
|
|
121
|
+
writeLine(line = '') {
|
|
122
|
+
this.writeChunk(`${line}\n`);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* End the streaming session
|
|
126
|
+
* In buffered mode: Renders the complete buffered output
|
|
127
|
+
* Returns statistics about what was streamed
|
|
128
|
+
*/
|
|
129
|
+
endStream() {
|
|
130
|
+
const stats = {
|
|
131
|
+
duration: this.state.startTime ? Date.now() - this.state.startTime : 0,
|
|
132
|
+
chars: this.state.charsWritten,
|
|
133
|
+
lines: this.state.linesWritten,
|
|
134
|
+
buffer: undefined,
|
|
135
|
+
};
|
|
136
|
+
if (this.bufferedMode) {
|
|
137
|
+
// In buffered mode, render the collected output now
|
|
138
|
+
const bufferedContent = this.outputBuffer.join('');
|
|
139
|
+
stats.buffer = bufferedContent;
|
|
140
|
+
if (bufferedContent) {
|
|
141
|
+
this.writeLocked(bufferedContent);
|
|
142
|
+
// Ensure we end with a newline
|
|
143
|
+
if (!bufferedContent.endsWith('\n')) {
|
|
144
|
+
this.writeLocked('\n');
|
|
145
|
+
stats.lines += 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
this.outputBuffer = [];
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Direct mode: just ensure newline
|
|
152
|
+
if (this.lastChunk && !this.lastChunk.endsWith('\n')) {
|
|
153
|
+
this.writeLocked('\n');
|
|
154
|
+
stats.lines += 1;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
this.state = {
|
|
158
|
+
isStreaming: false,
|
|
159
|
+
charsWritten: 0,
|
|
160
|
+
linesWritten: 0,
|
|
161
|
+
startTime: null,
|
|
162
|
+
};
|
|
163
|
+
this.lastChunk = '';
|
|
164
|
+
this.emit('stream-end', stats);
|
|
165
|
+
return stats;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get current streaming statistics
|
|
169
|
+
*/
|
|
170
|
+
getStats() {
|
|
171
|
+
return {
|
|
172
|
+
chars: this.state.charsWritten,
|
|
173
|
+
lines: this.state.linesWritten,
|
|
174
|
+
elapsed: this.state.startTime ? Date.now() - this.state.startTime : 0,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Force a flush (for buffered output)
|
|
179
|
+
*/
|
|
180
|
+
flush() {
|
|
181
|
+
// Cork/uncork pattern for optimal buffering
|
|
182
|
+
if (typeof this.writeStream.cork === 'function') {
|
|
183
|
+
this.writeStream.cork();
|
|
184
|
+
process.nextTick(() => {
|
|
185
|
+
if (typeof this.writeStream.uncork === 'function') {
|
|
186
|
+
this.writeStream.uncork();
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
countNewlines(text) {
|
|
192
|
+
let count = 0;
|
|
193
|
+
for (const char of text) {
|
|
194
|
+
if (char === '\n') {
|
|
195
|
+
count += 1;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return count;
|
|
199
|
+
}
|
|
200
|
+
writeLocked(chunk) {
|
|
201
|
+
// If lock is already held, write directly - we're in a protected context
|
|
202
|
+
// This prevents queuing issues where content gets delayed during streaming
|
|
203
|
+
if (writeLock.isLocked()) {
|
|
204
|
+
this.writeStream.write(chunk);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
writeLock.withLock(() => {
|
|
208
|
+
this.writeStream.write(chunk);
|
|
209
|
+
}, 'streamingOutputManager.write');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Singleton instance for global use
|
|
214
|
+
*/
|
|
215
|
+
let globalInstance = null;
|
|
216
|
+
export function getStreamingOutputManager() {
|
|
217
|
+
if (!globalInstance) {
|
|
218
|
+
globalInstance = new StreamingOutputManager();
|
|
219
|
+
}
|
|
220
|
+
return globalInstance;
|
|
221
|
+
}
|
|
222
|
+
export function resetStreamingOutputManager() {
|
|
223
|
+
globalInstance = null;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=streamingOutputManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamingOutputManager.js","sourceRoot":"","sources":["../../src/shell/streamingOutputManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemPrompt.d.ts","sourceRoot":"","sources":["../../src/shell/systemPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"systemPrompt.d.ts","sourceRoot":"","sources":["../../src/shell/systemPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG/D,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,sBAAsB,EAAE,EAC/B,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CA6DR"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { getMemoryForPrompt } from '../core/memorySystem.js';
|
|
1
2
|
export function buildInteractiveSystemPrompt(basePrompt, profileLabel, tools, workspaceDir) {
|
|
2
3
|
const name = profileLabel || 'Active Agent';
|
|
3
4
|
const toolSummary = formatToolSummary(tools, { maxDescriptionLength: 80 });
|
|
4
5
|
const workspace = workspaceDir || process.cwd();
|
|
6
|
+
const memoryContent = getMemoryForPrompt(workspace);
|
|
5
7
|
const identityBlock = `
|
|
6
8
|
CRITICAL IDENTITY: You ARE ${name}, an autonomous coding agent running INSIDE the erosolar-cli tool.
|
|
7
9
|
You have FULL ACCESS to the workspace at: ${workspace}
|
|
@@ -51,7 +53,8 @@ ${capabilityLines.join('\n')}
|
|
|
51
53
|
BEHAVIOR GUIDELINES:
|
|
52
54
|
${behaviorSection}
|
|
53
55
|
|
|
54
|
-
Remember: answer truthfully, ground everything in the workspace, and let the logs show what you actually did. You CAN modify this codebase
|
|
56
|
+
Remember: answer truthfully, ground everything in the workspace, and let the logs show what you actually did. You CAN modify this codebase.
|
|
57
|
+
${memoryContent}`;
|
|
55
58
|
}
|
|
56
59
|
function formatToolSummary(tools, options = {}) {
|
|
57
60
|
if (!tools.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemPrompt.js","sourceRoot":"","sources":["../../src/shell/systemPrompt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"systemPrompt.js","sourceRoot":"","sources":["../../src/shell/systemPrompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,UAAU,4BAA4B,CAC1C,UAAkB,EAClB,YAAoB,EACpB,KAA+B,EAC/B,YAAqB;IAErB,MAAM,IAAI,GAAG,YAAY,IAAI,cAAc,CAAC;IAC5C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAEpD,MAAM,aAAa,GAAG;6BACK,IAAI;4CACW,SAAS;;;CAGpD,CAAC;IAEA,MAAM,eAAe,GAAG;QACtB,sCAAsC;QACtC,mDAAmD;QACnD,sEAAsE;QACtE,qCAAqC;QACrC,kDAAkD;QAClD,uDAAuD;KACxD,CAAC;IAEF,MAAM,kBAAkB,GAAG;QACzB,oVAAoV;QACpV,iHAAiH;QACjH,0EAA0E;QAC1E,6DAA6D;QAC7D,+CAA+C;QAC/C,6KAA6K;QAC7K,wLAAwL;QACxL,gIAAgI;QAChI,mIAAmI;QACnI,oIAAoI;QACpI,0RAA0R;QAC1R,qVAAqV;QACrV,0OAA0O;QAC1O,oNAAoN;QACpN,8NAA8N;QAC9N,wLAAwL;QACxL,oMAAoM;KACrM,CAAC;IAEF,MAAM,eAAe,GAAG,kBAAkB;SACvC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;SAC7C,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,UAAU;EACpB,aAAa;UACL,IAAI;;;EAGZ,WAAW;;;EAGX,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG1B,eAAe;;;EAGf,aAAa,EAAE,CAAC;AAClB,CAAC;AAMD,SAAS,iBAAiB,CAAC,KAA+B,EAAE,UAA8B,EAAE;IAC1F,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,6CAA6C,CAAC;IACvD,CAAC;IACD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC;QACzG,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACpE,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;IACtC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,SAAkB;IACjD,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IAC9C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC;AACtD,CAAC"}
|
|
@@ -3,18 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Design principles:
|
|
5
5
|
* - Single source of truth for input state
|
|
6
|
-
* - One bottom-pinned chat box for the entire session (no inline anchors)
|
|
7
6
|
* - Native bracketed paste support (no heuristics)
|
|
8
7
|
* - Clean cursor model with render-time wrapping
|
|
9
8
|
* - State machine for different input modes
|
|
10
9
|
* - No readline dependency for display
|
|
11
10
|
*/
|
|
12
11
|
import { EventEmitter } from 'node:events';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*/
|
|
16
|
-
export type InputMode = 'idle' | 'streaming' | 'paste';
|
|
17
|
-
export type EditGuardMode = 'display-edits' | 'ask-permission';
|
|
12
|
+
import { type InputMode, type EditGuardMode } from '../ui/terminalUISchema.js';
|
|
13
|
+
export type { InputMode, EditGuardMode } from '../ui/terminalUISchema.js';
|
|
18
14
|
/**
|
|
19
15
|
* Events emitted by TerminalInput
|
|
20
16
|
*/
|
|
@@ -66,11 +62,6 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
66
62
|
private statusMessage;
|
|
67
63
|
private overrideStatusMessage;
|
|
68
64
|
private streamingLabel;
|
|
69
|
-
private metaElapsedSeconds;
|
|
70
|
-
private metaTokensUsed;
|
|
71
|
-
private metaTokenLimit;
|
|
72
|
-
private metaThinkingMs;
|
|
73
|
-
private metaThinkingHasContent;
|
|
74
65
|
private reservedLines;
|
|
75
66
|
private scrollRegionActive;
|
|
76
67
|
private lastRenderContent;
|
|
@@ -78,24 +69,32 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
78
69
|
private renderDirty;
|
|
79
70
|
private isRendering;
|
|
80
71
|
private pinnedTopRows;
|
|
72
|
+
private inlineAnchorRow;
|
|
73
|
+
private inlineLayout;
|
|
74
|
+
private anchorProvider;
|
|
75
|
+
private flowMode;
|
|
76
|
+
private flowModeRenderedLines;
|
|
77
|
+
private contentEndRow;
|
|
78
|
+
private commandSuggestions;
|
|
79
|
+
private filteredSuggestions;
|
|
80
|
+
private selectedSuggestionIndex;
|
|
81
|
+
private showSuggestions;
|
|
82
|
+
private maxVisibleSuggestions;
|
|
81
83
|
private disposed;
|
|
82
84
|
private enabled;
|
|
83
85
|
private contextUsage;
|
|
84
|
-
private contextAutoCompactThreshold;
|
|
85
|
-
private contentRow;
|
|
86
|
-
private thinkingModeLabel;
|
|
87
86
|
private editMode;
|
|
88
87
|
private verificationEnabled;
|
|
89
88
|
private autoContinueEnabled;
|
|
90
89
|
private verificationHotkey;
|
|
91
90
|
private autoContinueHotkey;
|
|
92
|
-
private thinkingHotkey;
|
|
93
|
-
private modelLabel;
|
|
94
|
-
private providerLabel;
|
|
95
91
|
private outputInterceptorCleanup?;
|
|
96
|
-
private
|
|
97
|
-
private
|
|
92
|
+
private streamingStartTime;
|
|
93
|
+
private tokensUsed;
|
|
94
|
+
private thinkingEnabled;
|
|
95
|
+
private modelInfo;
|
|
98
96
|
private streamingRenderTimer;
|
|
97
|
+
private unifiedUIInitialized;
|
|
99
98
|
constructor(writeStream?: NodeJS.WriteStream, config?: TerminalInputConfig);
|
|
100
99
|
/**
|
|
101
100
|
* Enable bracketed paste mode in terminal
|
|
@@ -117,17 +116,126 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
117
116
|
* Handle a keypress event
|
|
118
117
|
*/
|
|
119
118
|
handleKeypress(str: string | undefined, key: KeyInfo): void;
|
|
119
|
+
private bannerContent;
|
|
120
|
+
/**
|
|
121
|
+
* Set banner content to be written when unified UI initializes.
|
|
122
|
+
*/
|
|
123
|
+
setBannerContent(content: string | null): void;
|
|
124
|
+
/**
|
|
125
|
+
* Initialize the unified UI system.
|
|
126
|
+
*
|
|
127
|
+
* Creates a floating bottom chat box:
|
|
128
|
+
* 1. Clear screen
|
|
129
|
+
* 2. Render input area at row 1 (floating at "bottom" of empty content)
|
|
130
|
+
* 3. Track input area position
|
|
131
|
+
* 4. Banner will be streamed, pushing input area down
|
|
132
|
+
*/
|
|
133
|
+
initializeUnifiedUI(): void;
|
|
134
|
+
private inputAreaStartRow;
|
|
135
|
+
/**
|
|
136
|
+
* Get approximate current cursor row (based on content)
|
|
137
|
+
*/
|
|
138
|
+
private getCurrentRow;
|
|
139
|
+
/**
|
|
140
|
+
* Render floating input area at tracked position.
|
|
141
|
+
* Updates in place using absolute positioning.
|
|
142
|
+
*/
|
|
143
|
+
private renderFloatingInputArea;
|
|
144
|
+
/**
|
|
145
|
+
* Render input area at a specific row (inline, not pinned to bottom).
|
|
146
|
+
* Used on launch for compact layout.
|
|
147
|
+
*/
|
|
148
|
+
private renderInlineInputArea;
|
|
149
|
+
/**
|
|
150
|
+
* Render input area at current cursor position (inline, not pinned).
|
|
151
|
+
* Used after streaming ends - renders input below the streamed content.
|
|
152
|
+
*/
|
|
153
|
+
private renderInlineInputAreaAtCursor;
|
|
120
154
|
/**
|
|
121
155
|
* Set the input mode
|
|
122
156
|
*
|
|
123
|
-
* Streaming
|
|
124
|
-
*
|
|
157
|
+
* Streaming mode: Input area stays at tracked position.
|
|
158
|
+
* Content streams above the input area.
|
|
159
|
+
* After streaming ends, update input area position.
|
|
125
160
|
*/
|
|
126
161
|
setMode(mode: InputMode): void;
|
|
127
162
|
/**
|
|
128
|
-
*
|
|
163
|
+
* Clear the input area visual (before streaming replaces it with content)
|
|
164
|
+
*/
|
|
165
|
+
private clearInputAreaVisual;
|
|
166
|
+
/**
|
|
167
|
+
* Estimate current cursor row after streaming
|
|
168
|
+
*/
|
|
169
|
+
private estimateCurrentRow;
|
|
170
|
+
/**
|
|
171
|
+
* Enable or disable flow mode.
|
|
172
|
+
* In flow mode, the input renders immediately after content (wherever cursor is).
|
|
173
|
+
* When disabled, input renders at the absolute bottom of terminal.
|
|
174
|
+
*/
|
|
175
|
+
setFlowMode(enabled: boolean): void;
|
|
176
|
+
/**
|
|
177
|
+
* Check if flow mode is enabled.
|
|
178
|
+
*/
|
|
179
|
+
isFlowMode(): boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Set the row where content ends (for idle mode positioning).
|
|
182
|
+
* Input area will render starting from this row + 1.
|
|
183
|
+
*/
|
|
184
|
+
setContentEndRow(row: number): void;
|
|
185
|
+
/**
|
|
186
|
+
* Set available slash commands for auto-complete suggestions.
|
|
187
|
+
*/
|
|
188
|
+
setCommands(commands: Array<{
|
|
189
|
+
command: string;
|
|
190
|
+
description: string;
|
|
191
|
+
}>): void;
|
|
192
|
+
/**
|
|
193
|
+
* Update filtered suggestions based on current input.
|
|
194
|
+
*/
|
|
195
|
+
private updateSuggestions;
|
|
196
|
+
/**
|
|
197
|
+
* Select next suggestion (arrow down / tab).
|
|
198
|
+
*/
|
|
199
|
+
selectNextSuggestion(): void;
|
|
200
|
+
/**
|
|
201
|
+
* Select previous suggestion (arrow up / shift+tab).
|
|
202
|
+
*/
|
|
203
|
+
selectPrevSuggestion(): void;
|
|
204
|
+
/**
|
|
205
|
+
* Accept current suggestion and insert into buffer.
|
|
206
|
+
*/
|
|
207
|
+
acceptSuggestion(): boolean;
|
|
208
|
+
/**
|
|
209
|
+
* Check if suggestions are visible.
|
|
210
|
+
*/
|
|
211
|
+
areSuggestionsVisible(): boolean;
|
|
212
|
+
/**
|
|
213
|
+
* Update token count for metrics display
|
|
214
|
+
*/
|
|
215
|
+
setTokensUsed(tokens: number): void;
|
|
216
|
+
/**
|
|
217
|
+
* Toggle thinking/reasoning mode
|
|
218
|
+
*/
|
|
219
|
+
toggleThinking(): void;
|
|
220
|
+
/**
|
|
221
|
+
* Get thinking enabled state
|
|
222
|
+
*/
|
|
223
|
+
isThinkingEnabled(): boolean;
|
|
224
|
+
/**
|
|
225
|
+
* Keep the top N rows pinned (used for the launch banner tracking).
|
|
226
|
+
* Note: No longer uses scroll regions - inline rendering only.
|
|
129
227
|
*/
|
|
130
228
|
setPinnedHeaderLines(count: number): void;
|
|
229
|
+
/**
|
|
230
|
+
* Anchor prompt rendering near a specific row (inline layout). Pass null to
|
|
231
|
+
* restore the default bottom-aligned layout.
|
|
232
|
+
*/
|
|
233
|
+
setInlineAnchor(row: number | null): void;
|
|
234
|
+
/**
|
|
235
|
+
* Provide a dynamic anchor callback. When set, the prompt will follow the
|
|
236
|
+
* output by re-evaluating the anchor before each render.
|
|
237
|
+
*/
|
|
238
|
+
setInlineAnchorProvider(provider: (() => number | null | undefined) | null): void;
|
|
131
239
|
/**
|
|
132
240
|
* Get current mode
|
|
133
241
|
*/
|
|
@@ -146,8 +254,9 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
146
254
|
setBuffer(text: string, cursorPos?: number): void;
|
|
147
255
|
/**
|
|
148
256
|
* Clear the buffer
|
|
257
|
+
* @param skipRender - If true, don't trigger a re-render (used during submit flow)
|
|
149
258
|
*/
|
|
150
|
-
clear(): void;
|
|
259
|
+
clear(skipRender?: boolean): void;
|
|
151
260
|
/**
|
|
152
261
|
* Get queued inputs
|
|
153
262
|
*/
|
|
@@ -174,16 +283,6 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
174
283
|
* Can be shown alongside override status messages.
|
|
175
284
|
*/
|
|
176
285
|
setStreamingLabel(label: string | null): void;
|
|
177
|
-
/**
|
|
178
|
-
* Surface meta status just above the divider (e.g., elapsed time or token usage).
|
|
179
|
-
*/
|
|
180
|
-
setMetaStatus(meta: {
|
|
181
|
-
elapsedSeconds?: number | null;
|
|
182
|
-
tokensUsed?: number | null;
|
|
183
|
-
tokenLimit?: number | null;
|
|
184
|
-
thinkingMs?: number | null;
|
|
185
|
-
thinkingHasContent?: boolean;
|
|
186
|
-
}): void;
|
|
187
286
|
/**
|
|
188
287
|
* Keep mode toggles (verification/auto-continue) visible in the control bar.
|
|
189
288
|
* Hotkey labels remain stable so the bar looks the same before/during streaming.
|
|
@@ -193,56 +292,35 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
193
292
|
autoContinueEnabled: boolean;
|
|
194
293
|
verificationHotkey?: string;
|
|
195
294
|
autoContinueHotkey?: string;
|
|
196
|
-
thinkingModeLabel?: string | null;
|
|
197
|
-
thinkingHotkey?: string;
|
|
198
295
|
}): void;
|
|
199
296
|
/**
|
|
200
|
-
*
|
|
297
|
+
* Set the model info string (e.g., "OpenAI · gpt-4")
|
|
298
|
+
* This is displayed persistently above the input area.
|
|
201
299
|
*/
|
|
202
|
-
|
|
300
|
+
setModelInfo(info: string | null): void;
|
|
203
301
|
/**
|
|
204
|
-
*
|
|
302
|
+
* Clear all status messages at once (convenience method).
|
|
205
303
|
*/
|
|
206
|
-
|
|
207
|
-
model?: string | null;
|
|
208
|
-
provider?: string | null;
|
|
209
|
-
}): void;
|
|
304
|
+
clearAllStatus(): void;
|
|
210
305
|
/**
|
|
211
|
-
* Render the input area
|
|
306
|
+
* Render the input area
|
|
212
307
|
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
* naturally above while elapsed time and status stay fresh.
|
|
308
|
+
* Uses floating input area that updates in place at tracked position.
|
|
309
|
+
* During streaming, still renders to keep UI responsive.
|
|
216
310
|
*/
|
|
217
311
|
render(): void;
|
|
218
312
|
/**
|
|
219
|
-
* Build
|
|
220
|
-
*
|
|
221
|
-
*/
|
|
222
|
-
private buildMetaLines;
|
|
223
|
-
/**
|
|
224
|
-
* Clear the reserved bottom block (meta + divider + input + controls) before repainting.
|
|
313
|
+
* Build status bar showing streaming/ready status and key info.
|
|
314
|
+
* This is the TOP line above the input area - minimal Claude Code style.
|
|
225
315
|
*/
|
|
226
|
-
private
|
|
316
|
+
private buildStatusBar;
|
|
227
317
|
/**
|
|
228
|
-
* Build
|
|
229
|
-
*
|
|
318
|
+
* Build mode controls line showing toggles and context info.
|
|
319
|
+
* This is the BOTTOM line below the input area - Claude Code style layout with erosolar features.
|
|
320
|
+
*
|
|
321
|
+
* Layout: [toggles on left] ... [context info on right]
|
|
230
322
|
*/
|
|
231
323
|
private buildModeControls;
|
|
232
|
-
private formatHotkey;
|
|
233
|
-
private computeContextRemaining;
|
|
234
|
-
private computeTokensRemaining;
|
|
235
|
-
private formatElapsedLabel;
|
|
236
|
-
private formatTokenCount;
|
|
237
|
-
private visibleLength;
|
|
238
|
-
/**
|
|
239
|
-
* Debug-only snapshot used by tests to assert rendered strings without
|
|
240
|
-
* needing a TTY. Not used by production code.
|
|
241
|
-
*/
|
|
242
|
-
getDebugUiSnapshot(width?: number): {
|
|
243
|
-
meta: string[];
|
|
244
|
-
controls: string;
|
|
245
|
-
};
|
|
246
324
|
/**
|
|
247
325
|
* Force a re-render
|
|
248
326
|
*/
|
|
@@ -259,6 +337,9 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
259
337
|
* Register with display's output interceptor to position cursor correctly.
|
|
260
338
|
* When scroll region is active, output needs to go to the scroll region,
|
|
261
339
|
* not the protected bottom area where the input is rendered.
|
|
340
|
+
*
|
|
341
|
+
* NOTE: With scroll region properly set, content naturally stays within
|
|
342
|
+
* the region boundaries - no cursor manipulation needed per-write.
|
|
262
343
|
*/
|
|
263
344
|
registerOutputInterceptor(display: {
|
|
264
345
|
registerOutputInterceptor: (i: {
|
|
@@ -266,16 +347,6 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
266
347
|
afterWrite?: () => void;
|
|
267
348
|
}) => () => void;
|
|
268
349
|
}): void;
|
|
269
|
-
/**
|
|
270
|
-
* Write content directly into the scroll region (for banner, user prompts, etc.).
|
|
271
|
-
* Content starts at top and flows down, then scrolls when bottom is reached.
|
|
272
|
-
*/
|
|
273
|
-
writeToScrollRegion(content: string): void;
|
|
274
|
-
/**
|
|
275
|
-
* Reset content position to start of scroll region.
|
|
276
|
-
* Does NOT clear the terminal - content starts from current position.
|
|
277
|
-
*/
|
|
278
|
-
resetContentPosition(): void;
|
|
279
350
|
/**
|
|
280
351
|
* Dispose and clean up
|
|
281
352
|
*/
|
|
@@ -303,28 +374,27 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
303
374
|
private getCursorPosition;
|
|
304
375
|
private submit;
|
|
305
376
|
private finishPaste;
|
|
306
|
-
private enableScrollRegion;
|
|
307
|
-
private disableScrollRegion;
|
|
308
|
-
private applyScrollRegion;
|
|
309
|
-
private updateReservedLines;
|
|
310
377
|
private wrapBuffer;
|
|
311
378
|
private getComposedLength;
|
|
312
379
|
private assembleText;
|
|
313
380
|
private shiftPlaceholders;
|
|
314
381
|
private removeRange;
|
|
315
382
|
private insertPlainText;
|
|
316
|
-
private shouldInlineMultiline;
|
|
317
383
|
private findPlaceholderAt;
|
|
318
384
|
private buildPlaceholder;
|
|
319
385
|
private insertPastePlaceholder;
|
|
386
|
+
/**
|
|
387
|
+
* Toggle expansion of a paste placeholder at the current cursor position.
|
|
388
|
+
* When expanded, shows first 3 and last 2 lines of the content.
|
|
389
|
+
*/
|
|
390
|
+
togglePasteExpansion(): boolean;
|
|
391
|
+
private buildExpandedPlaceholder;
|
|
320
392
|
private deletePlaceholder;
|
|
321
|
-
updateContextUsage(value: number | null
|
|
393
|
+
updateContextUsage(value: number | null): void;
|
|
322
394
|
getEditMode(): EditGuardMode;
|
|
323
395
|
applyEditMode(mode: EditGuardMode): void;
|
|
324
396
|
private setEditMode;
|
|
325
397
|
toggleEditMode(): void;
|
|
326
|
-
private scheduleStreamingRender;
|
|
327
|
-
private resetStreamingRenderThrottle;
|
|
328
398
|
private scheduleRender;
|
|
329
399
|
private canRender;
|
|
330
400
|
private isTTY;
|