erosolar-cli 1.7.281 → 1.7.282
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 -17
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +159 -218
- 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 +180 -78
- package/dist/shell/terminalInput.d.ts.map +1 -1
- package/dist/shell/terminalInput.js +886 -494
- 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 +43 -22
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +283 -136
- 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,121 @@ 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 immediately.
|
|
126
|
+
* Sets up scroll region (reserving bottom for input area), writes the banner
|
|
127
|
+
* as the first content, and positions cursor after it.
|
|
128
|
+
*/
|
|
129
|
+
initializeUnifiedUI(): void;
|
|
120
130
|
/**
|
|
121
131
|
* Set the input mode
|
|
122
132
|
*
|
|
123
|
-
* Streaming
|
|
124
|
-
*
|
|
133
|
+
* Streaming mode disables scroll region and lets content flow naturally.
|
|
134
|
+
* The input area will be re-rendered after streaming ends at wherever
|
|
135
|
+
* the cursor is (below the streamed content).
|
|
125
136
|
*/
|
|
126
137
|
setMode(mode: InputMode): void;
|
|
138
|
+
/**
|
|
139
|
+
* Update streaming status label (called by timer)
|
|
140
|
+
*/
|
|
141
|
+
private updateStreamingStatus;
|
|
142
|
+
/**
|
|
143
|
+
* Render input area - unified for streaming and normal modes.
|
|
144
|
+
*
|
|
145
|
+
* In streaming mode: renders at absolute bottom, uses cursor save/restore
|
|
146
|
+
* In normal mode: renders right after the banner (pinnedTopRows + 1)
|
|
147
|
+
*/
|
|
148
|
+
private renderPinnedInputArea;
|
|
149
|
+
/**
|
|
150
|
+
* Render input area during streaming (alias for unified method)
|
|
151
|
+
*/
|
|
152
|
+
private renderStreamingInputArea;
|
|
153
|
+
/**
|
|
154
|
+
* Render bottom input area - UNIFIED for all modes.
|
|
155
|
+
* Uses cursor save/restore to update bottom without affecting content flow.
|
|
156
|
+
*
|
|
157
|
+
* Layout (same for idle/streaming/ready):
|
|
158
|
+
* - Status bar (streaming timer or "Type a message")
|
|
159
|
+
* - Model info line (provider · model · ctx)
|
|
160
|
+
* - Divider
|
|
161
|
+
* - Input area
|
|
162
|
+
* - Divider
|
|
163
|
+
* - Mode controls
|
|
164
|
+
*/
|
|
165
|
+
private renderBottomInputArea;
|
|
166
|
+
/**
|
|
167
|
+
* Enable or disable flow mode.
|
|
168
|
+
* In flow mode, the input renders immediately after content (wherever cursor is).
|
|
169
|
+
* When disabled, input renders at the absolute bottom of terminal.
|
|
170
|
+
*/
|
|
171
|
+
setFlowMode(enabled: boolean): void;
|
|
172
|
+
/**
|
|
173
|
+
* Check if flow mode is enabled.
|
|
174
|
+
*/
|
|
175
|
+
isFlowMode(): boolean;
|
|
176
|
+
/**
|
|
177
|
+
* Set the row where content ends (for idle mode positioning).
|
|
178
|
+
* Input area will render starting from this row + 1.
|
|
179
|
+
*/
|
|
180
|
+
setContentEndRow(row: number): void;
|
|
181
|
+
/**
|
|
182
|
+
* Set available slash commands for auto-complete suggestions.
|
|
183
|
+
*/
|
|
184
|
+
setCommands(commands: Array<{
|
|
185
|
+
command: string;
|
|
186
|
+
description: string;
|
|
187
|
+
}>): void;
|
|
188
|
+
/**
|
|
189
|
+
* Update filtered suggestions based on current input.
|
|
190
|
+
*/
|
|
191
|
+
private updateSuggestions;
|
|
192
|
+
/**
|
|
193
|
+
* Select next suggestion (arrow down / tab).
|
|
194
|
+
*/
|
|
195
|
+
selectNextSuggestion(): void;
|
|
196
|
+
/**
|
|
197
|
+
* Select previous suggestion (arrow up / shift+tab).
|
|
198
|
+
*/
|
|
199
|
+
selectPrevSuggestion(): void;
|
|
200
|
+
/**
|
|
201
|
+
* Accept current suggestion and insert into buffer.
|
|
202
|
+
*/
|
|
203
|
+
acceptSuggestion(): boolean;
|
|
204
|
+
/**
|
|
205
|
+
* Check if suggestions are visible.
|
|
206
|
+
*/
|
|
207
|
+
areSuggestionsVisible(): boolean;
|
|
208
|
+
/**
|
|
209
|
+
* Update token count for metrics display
|
|
210
|
+
*/
|
|
211
|
+
setTokensUsed(tokens: number): void;
|
|
212
|
+
/**
|
|
213
|
+
* Toggle thinking/reasoning mode
|
|
214
|
+
*/
|
|
215
|
+
toggleThinking(): void;
|
|
216
|
+
/**
|
|
217
|
+
* Get thinking enabled state
|
|
218
|
+
*/
|
|
219
|
+
isThinkingEnabled(): boolean;
|
|
127
220
|
/**
|
|
128
221
|
* Keep the top N rows pinned outside the scroll region (used for the launch banner).
|
|
129
222
|
*/
|
|
130
223
|
setPinnedHeaderLines(count: number): void;
|
|
224
|
+
/**
|
|
225
|
+
* Anchor prompt rendering near a specific row (inline layout). Pass null to
|
|
226
|
+
* restore the default bottom-aligned layout.
|
|
227
|
+
*/
|
|
228
|
+
setInlineAnchor(row: number | null): void;
|
|
229
|
+
/**
|
|
230
|
+
* Provide a dynamic anchor callback. When set, the prompt will follow the
|
|
231
|
+
* output by re-evaluating the anchor before each render.
|
|
232
|
+
*/
|
|
233
|
+
setInlineAnchorProvider(provider: (() => number | null | undefined) | null): void;
|
|
131
234
|
/**
|
|
132
235
|
* Get current mode
|
|
133
236
|
*/
|
|
@@ -174,16 +277,6 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
174
277
|
* Can be shown alongside override status messages.
|
|
175
278
|
*/
|
|
176
279
|
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
280
|
/**
|
|
188
281
|
* Keep mode toggles (verification/auto-continue) visible in the control bar.
|
|
189
282
|
* Hotkey labels remain stable so the bar looks the same before/during streaming.
|
|
@@ -193,56 +286,69 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
193
286
|
autoContinueEnabled: boolean;
|
|
194
287
|
verificationHotkey?: string;
|
|
195
288
|
autoContinueHotkey?: string;
|
|
196
|
-
thinkingModeLabel?: string | null;
|
|
197
|
-
thinkingHotkey?: string;
|
|
198
289
|
}): void;
|
|
290
|
+
/**
|
|
291
|
+
* Set the model info string (e.g., "OpenAI · gpt-4")
|
|
292
|
+
* This is displayed persistently above the input area.
|
|
293
|
+
*/
|
|
294
|
+
setModelInfo(info: string | null): void;
|
|
199
295
|
/**
|
|
200
296
|
* Clear all status messages at once (convenience method).
|
|
201
297
|
*/
|
|
202
298
|
clearAllStatus(): void;
|
|
203
299
|
/**
|
|
204
|
-
*
|
|
300
|
+
* Render the input area - UNIFIED for all modes
|
|
301
|
+
*
|
|
302
|
+
* Uses the same bottom-pinned layout with scroll regions for:
|
|
303
|
+
* - Idle mode: Shows "Type a message" hint
|
|
304
|
+
* - Streaming mode: Shows "● Streaming Xs" timer
|
|
305
|
+
* - Ready mode: Shows status info
|
|
205
306
|
*/
|
|
206
|
-
|
|
207
|
-
model?: string | null;
|
|
208
|
-
provider?: string | null;
|
|
209
|
-
}): void;
|
|
307
|
+
render(): void;
|
|
210
308
|
/**
|
|
211
|
-
* Render
|
|
309
|
+
* Render in flow mode - delegates to bottom-pinned for stability.
|
|
212
310
|
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
* naturally above while elapsed time and status stay fresh.
|
|
311
|
+
* Flow mode attempted inline rendering but caused duplicate renders
|
|
312
|
+
* due to unreliable cursor position tracking. Bottom-pinned is reliable.
|
|
216
313
|
*/
|
|
217
|
-
|
|
314
|
+
private renderFlowMode;
|
|
315
|
+
/**
|
|
316
|
+
* Render in bottom-pinned mode - Claude Code style with suggestions
|
|
317
|
+
*
|
|
318
|
+
* Works for both normal and streaming modes:
|
|
319
|
+
* - During streaming: saves/restores cursor position
|
|
320
|
+
* - Status bar shows streaming info or "Type a message"
|
|
321
|
+
*
|
|
322
|
+
* Layout when suggestions visible:
|
|
323
|
+
* - Top divider
|
|
324
|
+
* - Input line(s)
|
|
325
|
+
* - Bottom divider
|
|
326
|
+
* - Suggestions (command list)
|
|
327
|
+
*
|
|
328
|
+
* Layout when suggestions hidden:
|
|
329
|
+
* - Status bar (Ready/Streaming)
|
|
330
|
+
* - Top divider
|
|
331
|
+
* - Input line(s)
|
|
332
|
+
* - Bottom divider
|
|
333
|
+
* - Mode controls
|
|
334
|
+
*/
|
|
335
|
+
private renderBottomPinned;
|
|
218
336
|
/**
|
|
219
|
-
* Build
|
|
220
|
-
* During streaming, shows model line pinned above streaming info.
|
|
337
|
+
* Build status bar for streaming mode (shows elapsed time, queue count).
|
|
221
338
|
*/
|
|
222
|
-
private
|
|
339
|
+
private buildStreamingStatusBar;
|
|
223
340
|
/**
|
|
224
|
-
*
|
|
341
|
+
* Build status bar showing streaming/ready status and key info.
|
|
342
|
+
* This is the TOP line above the input area - minimal Claude Code style.
|
|
225
343
|
*/
|
|
226
|
-
private
|
|
344
|
+
private buildStatusBar;
|
|
227
345
|
/**
|
|
228
|
-
* Build
|
|
229
|
-
*
|
|
346
|
+
* Build mode controls line showing toggles and context info.
|
|
347
|
+
* This is the BOTTOM line below the input area - Claude Code style layout with erosolar features.
|
|
348
|
+
*
|
|
349
|
+
* Layout: [toggles on left] ... [context info on right]
|
|
230
350
|
*/
|
|
231
351
|
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
352
|
/**
|
|
247
353
|
* Force a re-render
|
|
248
354
|
*/
|
|
@@ -259,6 +365,9 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
259
365
|
* Register with display's output interceptor to position cursor correctly.
|
|
260
366
|
* When scroll region is active, output needs to go to the scroll region,
|
|
261
367
|
* not the protected bottom area where the input is rendered.
|
|
368
|
+
*
|
|
369
|
+
* NOTE: With scroll region properly set, content naturally stays within
|
|
370
|
+
* the region boundaries - no cursor manipulation needed per-write.
|
|
262
371
|
*/
|
|
263
372
|
registerOutputInterceptor(display: {
|
|
264
373
|
registerOutputInterceptor: (i: {
|
|
@@ -266,16 +375,6 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
266
375
|
afterWrite?: () => void;
|
|
267
376
|
}) => () => void;
|
|
268
377
|
}): 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
378
|
/**
|
|
280
379
|
* Dispose and clean up
|
|
281
380
|
*/
|
|
@@ -313,18 +412,21 @@ export declare class TerminalInput extends EventEmitter {
|
|
|
313
412
|
private shiftPlaceholders;
|
|
314
413
|
private removeRange;
|
|
315
414
|
private insertPlainText;
|
|
316
|
-
private shouldInlineMultiline;
|
|
317
415
|
private findPlaceholderAt;
|
|
318
416
|
private buildPlaceholder;
|
|
319
417
|
private insertPastePlaceholder;
|
|
418
|
+
/**
|
|
419
|
+
* Toggle expansion of a paste placeholder at the current cursor position.
|
|
420
|
+
* When expanded, shows first 3 and last 2 lines of the content.
|
|
421
|
+
*/
|
|
422
|
+
togglePasteExpansion(): boolean;
|
|
423
|
+
private buildExpandedPlaceholder;
|
|
320
424
|
private deletePlaceholder;
|
|
321
|
-
updateContextUsage(value: number | null
|
|
425
|
+
updateContextUsage(value: number | null): void;
|
|
322
426
|
getEditMode(): EditGuardMode;
|
|
323
427
|
applyEditMode(mode: EditGuardMode): void;
|
|
324
428
|
private setEditMode;
|
|
325
429
|
toggleEditMode(): void;
|
|
326
|
-
private scheduleStreamingRender;
|
|
327
|
-
private resetStreamingRenderThrottle;
|
|
328
430
|
private scheduleRender;
|
|
329
431
|
private canRender;
|
|
330
432
|
private isTTY;
|