erosolar-cli 1.7.273 → 1.7.274
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 +24 -148
- package/dist/bin/erosolar.js +1 -0
- package/dist/bin/erosolar.js.map +1 -1
- package/dist/capabilities/agentSpawningCapability.d.ts.map +1 -1
- package/dist/capabilities/agentSpawningCapability.js +56 -31
- package/dist/capabilities/agentSpawningCapability.js.map +1 -1
- package/dist/contracts/agent-schemas.json +0 -15
- package/dist/contracts/tools.schema.json +0 -9
- 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/customCommands.d.ts +1 -0
- package/dist/core/customCommands.d.ts.map +1 -1
- package/dist/core/customCommands.js +3 -0
- package/dist/core/customCommands.js.map +1 -1
- package/dist/core/hooks.d.ts +113 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +267 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/metricsTracker.d.ts +122 -0
- package/dist/core/metricsTracker.d.ts.map +1 -0
- package/dist/{alpha-zero → core}/metricsTracker.js +2 -5
- package/dist/core/metricsTracker.js.map +1 -0
- package/dist/core/securityAssessment.d.ts +91 -0
- package/dist/core/securityAssessment.d.ts.map +1 -0
- package/dist/core/securityAssessment.js +580 -0
- package/dist/core/securityAssessment.js.map +1 -0
- package/dist/core/toolPreconditions.d.ts.map +1 -1
- package/dist/core/toolPreconditions.js +0 -14
- package/dist/core/toolPreconditions.js.map +1 -1
- package/dist/core/toolRuntime.d.ts +22 -1
- package/dist/core/toolRuntime.d.ts.map +1 -1
- package/dist/core/toolRuntime.js +0 -5
- package/dist/core/toolRuntime.js.map +1 -1
- package/dist/core/toolValidation.d.ts.map +1 -1
- package/dist/core/toolValidation.js +14 -3
- package/dist/core/toolValidation.js.map +1 -1
- package/dist/core/validationRunner.d.ts +1 -3
- package/dist/core/validationRunner.d.ts.map +1 -1
- package/dist/core/validationRunner.js.map +1 -1
- package/dist/core/verification.d.ts +137 -0
- package/dist/core/verification.d.ts.map +1 -0
- package/dist/core/verification.js +323 -0
- package/dist/core/verification.js.map +1 -0
- package/dist/headless/headlessApp.d.ts.map +1 -1
- package/dist/headless/headlessApp.js +21 -0
- package/dist/headless/headlessApp.js.map +1 -1
- package/dist/mcp/sseClient.d.ts.map +1 -1
- package/dist/mcp/sseClient.js +9 -18
- package/dist/mcp/sseClient.js.map +1 -1
- package/dist/plugins/tools/build/buildPlugin.d.ts +0 -6
- package/dist/plugins/tools/build/buildPlugin.d.ts.map +1 -1
- package/dist/plugins/tools/build/buildPlugin.js +4 -10
- 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 +0 -2
- package/dist/plugins/tools/nodeDefaults.js.map +1 -1
- 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/shell/interactiveShell.d.ts +10 -7
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +198 -156
- package/dist/shell/interactiveShell.js.map +1 -1
- package/dist/shell/shellApp.d.ts +2 -0
- package/dist/shell/shellApp.d.ts.map +1 -1
- package/dist/shell/shellApp.js +36 -1
- package/dist/shell/shellApp.js.map +1 -1
- package/dist/shell/systemPrompt.d.ts.map +1 -1
- package/dist/shell/systemPrompt.js +1 -4
- package/dist/shell/systemPrompt.js.map +1 -1
- package/dist/shell/terminalInput.d.ts +76 -168
- package/dist/shell/terminalInput.d.ts.map +1 -1
- package/dist/shell/terminalInput.js +492 -837
- package/dist/shell/terminalInput.js.map +1 -1
- package/dist/shell/terminalInputAdapter.d.ts +28 -25
- package/dist/shell/terminalInputAdapter.d.ts.map +1 -1
- package/dist/shell/terminalInputAdapter.js +26 -36
- package/dist/shell/terminalInputAdapter.js.map +1 -1
- package/dist/subagents/agentConfig.d.ts +27 -0
- package/dist/subagents/agentConfig.d.ts.map +1 -0
- package/dist/subagents/agentConfig.js +89 -0
- package/dist/subagents/agentConfig.js.map +1 -0
- package/dist/subagents/agentRegistry.d.ts +33 -0
- package/dist/subagents/agentRegistry.d.ts.map +1 -0
- package/dist/subagents/agentRegistry.js +162 -0
- package/dist/subagents/agentRegistry.js.map +1 -0
- package/dist/subagents/taskRunner.d.ts +7 -1
- package/dist/subagents/taskRunner.d.ts.map +1 -1
- package/dist/subagents/taskRunner.js +180 -47
- package/dist/subagents/taskRunner.js.map +1 -1
- package/dist/ui/ShellUIAdapter.d.ts.map +1 -1
- package/dist/ui/ShellUIAdapter.js +13 -12
- package/dist/ui/ShellUIAdapter.js.map +1 -1
- package/dist/ui/display.d.ts +27 -0
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +147 -33
- package/dist/ui/display.js.map +1 -1
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js +6 -8
- package/dist/ui/theme.js.map +1 -1
- package/dist/ui/toolDisplay.d.ts +0 -158
- package/dist/ui/toolDisplay.d.ts.map +1 -1
- package/dist/ui/toolDisplay.js +0 -348
- package/dist/ui/toolDisplay.js.map +1 -1
- package/dist/ui/unified/layout.d.ts +1 -0
- package/dist/ui/unified/layout.d.ts.map +1 -1
- package/dist/ui/unified/layout.js +15 -25
- package/dist/ui/unified/layout.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +10 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +78 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/package.json +1 -1
- package/dist/alpha-zero/agentWrapper.d.ts +0 -84
- package/dist/alpha-zero/agentWrapper.d.ts.map +0 -1
- package/dist/alpha-zero/agentWrapper.js +0 -171
- package/dist/alpha-zero/agentWrapper.js.map +0 -1
- package/dist/alpha-zero/codeEvaluator.d.ts +0 -25
- package/dist/alpha-zero/codeEvaluator.d.ts.map +0 -1
- package/dist/alpha-zero/codeEvaluator.js +0 -273
- package/dist/alpha-zero/codeEvaluator.js.map +0 -1
- package/dist/alpha-zero/competitiveRunner.d.ts +0 -66
- package/dist/alpha-zero/competitiveRunner.d.ts.map +0 -1
- package/dist/alpha-zero/competitiveRunner.js +0 -224
- package/dist/alpha-zero/competitiveRunner.js.map +0 -1
- package/dist/alpha-zero/index.d.ts +0 -67
- package/dist/alpha-zero/index.d.ts.map +0 -1
- package/dist/alpha-zero/index.js +0 -99
- package/dist/alpha-zero/index.js.map +0 -1
- package/dist/alpha-zero/introspection.d.ts +0 -128
- package/dist/alpha-zero/introspection.d.ts.map +0 -1
- package/dist/alpha-zero/introspection.js +0 -300
- package/dist/alpha-zero/introspection.js.map +0 -1
- package/dist/alpha-zero/metricsTracker.d.ts +0 -71
- package/dist/alpha-zero/metricsTracker.d.ts.map +0 -1
- package/dist/alpha-zero/metricsTracker.js.map +0 -1
- package/dist/alpha-zero/security/core.d.ts +0 -125
- package/dist/alpha-zero/security/core.d.ts.map +0 -1
- package/dist/alpha-zero/security/core.js +0 -271
- package/dist/alpha-zero/security/core.js.map +0 -1
- package/dist/alpha-zero/security/google.d.ts +0 -125
- package/dist/alpha-zero/security/google.d.ts.map +0 -1
- package/dist/alpha-zero/security/google.js +0 -311
- package/dist/alpha-zero/security/google.js.map +0 -1
- package/dist/alpha-zero/security/googleLoader.d.ts +0 -17
- package/dist/alpha-zero/security/googleLoader.d.ts.map +0 -1
- package/dist/alpha-zero/security/googleLoader.js +0 -41
- package/dist/alpha-zero/security/googleLoader.js.map +0 -1
- package/dist/alpha-zero/security/index.d.ts +0 -29
- package/dist/alpha-zero/security/index.d.ts.map +0 -1
- package/dist/alpha-zero/security/index.js +0 -32
- package/dist/alpha-zero/security/index.js.map +0 -1
- package/dist/alpha-zero/security/simulation.d.ts +0 -124
- package/dist/alpha-zero/security/simulation.d.ts.map +0 -1
- package/dist/alpha-zero/security/simulation.js +0 -277
- package/dist/alpha-zero/security/simulation.js.map +0 -1
- package/dist/alpha-zero/selfModification.d.ts +0 -109
- package/dist/alpha-zero/selfModification.d.ts.map +0 -1
- package/dist/alpha-zero/selfModification.js +0 -233
- package/dist/alpha-zero/selfModification.js.map +0 -1
- package/dist/alpha-zero/types.d.ts +0 -170
- package/dist/alpha-zero/types.d.ts.map +0 -1
- package/dist/alpha-zero/types.js +0 -31
- package/dist/alpha-zero/types.js.map +0 -1
- package/dist/capabilities/securityTestingCapability.d.ts +0 -13
- package/dist/capabilities/securityTestingCapability.d.ts.map +0 -1
- package/dist/capabilities/securityTestingCapability.js +0 -25
- package/dist/capabilities/securityTestingCapability.js.map +0 -1
- package/dist/core/aiFlowOptimizer.d.ts +0 -26
- package/dist/core/aiFlowOptimizer.d.ts.map +0 -1
- package/dist/core/aiFlowOptimizer.js +0 -31
- package/dist/core/aiFlowOptimizer.js.map +0 -1
- package/dist/core/aiOptimizationEngine.d.ts +0 -158
- package/dist/core/aiOptimizationEngine.d.ts.map +0 -1
- package/dist/core/aiOptimizationEngine.js +0 -428
- package/dist/core/aiOptimizationEngine.js.map +0 -1
- package/dist/core/aiOptimizationIntegration.d.ts +0 -93
- package/dist/core/aiOptimizationIntegration.d.ts.map +0 -1
- package/dist/core/aiOptimizationIntegration.js +0 -250
- package/dist/core/aiOptimizationIntegration.js.map +0 -1
- package/dist/core/enhancedErrorRecovery.d.ts +0 -100
- package/dist/core/enhancedErrorRecovery.d.ts.map +0 -1
- package/dist/core/enhancedErrorRecovery.js +0 -345
- package/dist/core/enhancedErrorRecovery.js.map +0 -1
- package/dist/core/hooksSystem.d.ts +0 -65
- package/dist/core/hooksSystem.d.ts.map +0 -1
- package/dist/core/hooksSystem.js +0 -273
- package/dist/core/hooksSystem.js.map +0 -1
- package/dist/core/memorySystem.d.ts +0 -48
- package/dist/core/memorySystem.d.ts.map +0 -1
- package/dist/core/memorySystem.js +0 -271
- package/dist/core/memorySystem.js.map +0 -1
- package/dist/core/unified/errors.d.ts +0 -189
- package/dist/core/unified/errors.d.ts.map +0 -1
- package/dist/core/unified/errors.js +0 -497
- package/dist/core/unified/errors.js.map +0 -1
- package/dist/core/unified/index.d.ts +0 -19
- package/dist/core/unified/index.d.ts.map +0 -1
- package/dist/core/unified/index.js +0 -68
- package/dist/core/unified/index.js.map +0 -1
- package/dist/core/unified/schema.d.ts +0 -101
- package/dist/core/unified/schema.d.ts.map +0 -1
- package/dist/core/unified/schema.js +0 -350
- package/dist/core/unified/schema.js.map +0 -1
- package/dist/core/unified/toolRuntime.d.ts +0 -179
- package/dist/core/unified/toolRuntime.d.ts.map +0 -1
- package/dist/core/unified/toolRuntime.js +0 -517
- package/dist/core/unified/toolRuntime.js.map +0 -1
- package/dist/core/unified/tools.d.ts +0 -127
- package/dist/core/unified/tools.d.ts.map +0 -1
- package/dist/core/unified/tools.js +0 -1333
- package/dist/core/unified/tools.js.map +0 -1
- package/dist/core/unified/types.d.ts +0 -352
- package/dist/core/unified/types.d.ts.map +0 -1
- package/dist/core/unified/types.js +0 -12
- package/dist/core/unified/types.js.map +0 -1
- package/dist/core/unified/version.d.ts +0 -209
- package/dist/core/unified/version.d.ts.map +0 -1
- package/dist/core/unified/version.js +0 -454
- package/dist/core/unified/version.js.map +0 -1
- package/dist/plugins/tools/security/securityPlugin.d.ts +0 -3
- package/dist/plugins/tools/security/securityPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/security/securityPlugin.js +0 -12
- package/dist/plugins/tools/security/securityPlugin.js.map +0 -1
- package/dist/security/active-stack-security.d.ts +0 -112
- package/dist/security/active-stack-security.d.ts.map +0 -1
- package/dist/security/active-stack-security.js +0 -296
- package/dist/security/active-stack-security.js.map +0 -1
- package/dist/security/advanced-persistence-research.d.ts +0 -92
- package/dist/security/advanced-persistence-research.d.ts.map +0 -1
- package/dist/security/advanced-persistence-research.js +0 -195
- package/dist/security/advanced-persistence-research.js.map +0 -1
- package/dist/security/advanced-targeting.d.ts +0 -119
- package/dist/security/advanced-targeting.d.ts.map +0 -1
- package/dist/security/advanced-targeting.js +0 -233
- package/dist/security/advanced-targeting.js.map +0 -1
- package/dist/security/assessment/vulnerabilityAssessment.d.ts +0 -104
- package/dist/security/assessment/vulnerabilityAssessment.d.ts.map +0 -1
- package/dist/security/assessment/vulnerabilityAssessment.js +0 -315
- package/dist/security/assessment/vulnerabilityAssessment.js.map +0 -1
- package/dist/security/authorization/securityAuthorization.d.ts +0 -88
- package/dist/security/authorization/securityAuthorization.d.ts.map +0 -1
- package/dist/security/authorization/securityAuthorization.js +0 -172
- package/dist/security/authorization/securityAuthorization.js.map +0 -1
- package/dist/security/comprehensive-targeting.d.ts +0 -85
- package/dist/security/comprehensive-targeting.d.ts.map +0 -1
- package/dist/security/comprehensive-targeting.js +0 -438
- package/dist/security/comprehensive-targeting.js.map +0 -1
- package/dist/security/global-security-integration.d.ts +0 -91
- package/dist/security/global-security-integration.d.ts.map +0 -1
- package/dist/security/global-security-integration.js +0 -218
- package/dist/security/global-security-integration.js.map +0 -1
- package/dist/security/index.d.ts +0 -38
- package/dist/security/index.d.ts.map +0 -1
- package/dist/security/index.js +0 -47
- package/dist/security/index.js.map +0 -1
- package/dist/security/persistence-analyzer.d.ts +0 -56
- package/dist/security/persistence-analyzer.d.ts.map +0 -1
- package/dist/security/persistence-analyzer.js +0 -187
- package/dist/security/persistence-analyzer.js.map +0 -1
- package/dist/security/persistence-cli.d.ts +0 -36
- package/dist/security/persistence-cli.d.ts.map +0 -1
- package/dist/security/persistence-cli.js +0 -160
- package/dist/security/persistence-cli.js.map +0 -1
- package/dist/security/persistence-research.d.ts +0 -92
- package/dist/security/persistence-research.d.ts.map +0 -1
- package/dist/security/persistence-research.js +0 -364
- package/dist/security/persistence-research.js.map +0 -1
- package/dist/security/research/persistenceResearch.d.ts +0 -97
- package/dist/security/research/persistenceResearch.d.ts.map +0 -1
- package/dist/security/research/persistenceResearch.js +0 -282
- package/dist/security/research/persistenceResearch.js.map +0 -1
- package/dist/security/security-integration.d.ts +0 -74
- package/dist/security/security-integration.d.ts.map +0 -1
- package/dist/security/security-integration.js +0 -137
- package/dist/security/security-integration.js.map +0 -1
- package/dist/security/security-testing-framework.d.ts +0 -112
- package/dist/security/security-testing-framework.d.ts.map +0 -1
- package/dist/security/security-testing-framework.js +0 -364
- package/dist/security/security-testing-framework.js.map +0 -1
- package/dist/security/simulation/attackSimulation.d.ts +0 -93
- package/dist/security/simulation/attackSimulation.d.ts.map +0 -1
- package/dist/security/simulation/attackSimulation.js +0 -341
- package/dist/security/simulation/attackSimulation.js.map +0 -1
- package/dist/security/strategic-operations.d.ts +0 -100
- package/dist/security/strategic-operations.d.ts.map +0 -1
- package/dist/security/strategic-operations.js +0 -276
- package/dist/security/strategic-operations.js.map +0 -1
- package/dist/security/tool-security-wrapper.d.ts +0 -58
- package/dist/security/tool-security-wrapper.d.ts.map +0 -1
- package/dist/security/tool-security-wrapper.js +0 -156
- package/dist/security/tool-security-wrapper.js.map +0 -1
- package/dist/shell/claudeCodeStreamHandler.d.ts +0 -145
- package/dist/shell/claudeCodeStreamHandler.d.ts.map +0 -1
- package/dist/shell/claudeCodeStreamHandler.js +0 -322
- package/dist/shell/claudeCodeStreamHandler.js.map +0 -1
- package/dist/shell/inputQueueManager.d.ts +0 -144
- package/dist/shell/inputQueueManager.d.ts.map +0 -1
- package/dist/shell/inputQueueManager.js +0 -290
- package/dist/shell/inputQueueManager.js.map +0 -1
- package/dist/shell/metricsTracker.d.ts +0 -60
- package/dist/shell/metricsTracker.d.ts.map +0 -1
- package/dist/shell/metricsTracker.js +0 -119
- package/dist/shell/metricsTracker.js.map +0 -1
- package/dist/shell/streamingOutputManager.d.ts +0 -115
- package/dist/shell/streamingOutputManager.d.ts.map +0 -1
- package/dist/shell/streamingOutputManager.js +0 -225
- package/dist/shell/streamingOutputManager.js.map +0 -1
- package/dist/tools/securityTools.d.ts +0 -22
- package/dist/tools/securityTools.d.ts.map +0 -1
- package/dist/tools/securityTools.js +0 -448
- package/dist/tools/securityTools.js.map +0 -1
- package/dist/ui/persistentPrompt.d.ts +0 -50
- package/dist/ui/persistentPrompt.d.ts.map +0 -1
- package/dist/ui/persistentPrompt.js +0 -92
- package/dist/ui/persistentPrompt.js.map +0 -1
- package/dist/ui/terminalUISchema.d.ts +0 -195
- package/dist/ui/terminalUISchema.d.ts.map +0 -1
- package/dist/ui/terminalUISchema.js +0 -113
- package/dist/ui/terminalUISchema.js.map +0 -1
- package/scripts/deploy-security-capabilities.js +0 -178
|
@@ -2,7 +2,7 @@ import { stdin as input, stdout as output, exit } from 'node:process';
|
|
|
2
2
|
import { exec } from 'node:child_process';
|
|
3
3
|
import { promisify } from 'node:util';
|
|
4
4
|
import { display } from '../ui/display.js';
|
|
5
|
-
import { theme
|
|
5
|
+
import { theme } from '../ui/theme.js';
|
|
6
6
|
import { getContextWindowTokens } from '../core/contextWindow.js';
|
|
7
7
|
import { ensureSecretForProvider, getSecretDefinitionForProvider, getSecretValue, listSecretDefinitions, maskSecret, setSecretValue, } from '../core/secretStore.js';
|
|
8
8
|
import { saveActiveProfilePreference, saveModelPreference, loadToolSettings, saveToolSettings, clearToolSettings, clearActiveProfilePreference, loadSessionPreferences, saveSessionPreferences, } from '../core/preferences.js';
|
|
@@ -19,9 +19,8 @@ import { SkillRepository } from '../skills/skillRepository.js';
|
|
|
19
19
|
import { createSkillTools } from '../tools/skillTools.js';
|
|
20
20
|
import { FileChangeTracker } from './fileChangeTracker.js';
|
|
21
21
|
import { formatShortcutsHelp } from '../ui/shortcutsHelp.js';
|
|
22
|
-
import { MetricsTracker } from '
|
|
22
|
+
import { MetricsTracker } from '../core/metricsTracker.js';
|
|
23
23
|
import { listAvailablePlugins } from '../plugins/index.js';
|
|
24
|
-
import { loadMemory, listMemoryPaths, getDefaultProjectMemoryPath, getUserMemoryEditPath, } from '../core/memorySystem.js';
|
|
25
24
|
import { TerminalInputAdapter } from './terminalInputAdapter.js';
|
|
26
25
|
import { isUpdateInProgress } from './updateManager.js';
|
|
27
26
|
import { writeLock } from '../ui/writeLock.js';
|
|
@@ -35,6 +34,7 @@ const DROPDOWN_COLORS = [
|
|
|
35
34
|
theme.success,
|
|
36
35
|
theme.warning,
|
|
37
36
|
];
|
|
37
|
+
const STREAMING_SPINNER_FRAMES = ['◐', '◓', '◑', '◒'];
|
|
38
38
|
// Load MODEL_PRESETS from centralized schema
|
|
39
39
|
const MODEL_PRESETS = getModels().map((model) => ({
|
|
40
40
|
id: model.id,
|
|
@@ -49,11 +49,13 @@ const MODEL_PRESETS = getModels().map((model) => ({
|
|
|
49
49
|
const BASE_SLASH_COMMANDS = getSlashCommands().map((cmd) => ({
|
|
50
50
|
command: cmd.command,
|
|
51
51
|
description: cmd.description,
|
|
52
|
+
category: cmd.category,
|
|
52
53
|
}));
|
|
53
54
|
// Load PROVIDER_LABELS from centralized schema
|
|
54
55
|
const PROVIDER_LABELS = Object.fromEntries(getProviders().map((provider) => [provider.id, provider.label]));
|
|
55
56
|
// Allow enough time for paste detection to kick in before flushing buffered lines
|
|
56
57
|
const CONTEXT_USAGE_THRESHOLD = 0.9;
|
|
58
|
+
const CONTEXT_AUTOCOMPACT_PERCENT = Math.round(CONTEXT_USAGE_THRESHOLD * 100);
|
|
57
59
|
const CONTEXT_RECENT_MESSAGE_COUNT = 12;
|
|
58
60
|
const CONTEXT_CLEANUP_CHARS_PER_CHUNK = 6000;
|
|
59
61
|
const CONTEXT_CLEANUP_MAX_OUTPUT_TOKENS = 800;
|
|
@@ -94,11 +96,12 @@ export class InteractiveShell {
|
|
|
94
96
|
uiAdapter;
|
|
95
97
|
uiUpdates;
|
|
96
98
|
_fileChangeTracker = new FileChangeTracker(); // Reserved for future file tracking features
|
|
97
|
-
|
|
99
|
+
alphaZeroMetrics; // Alpha Zero 2 performance tracking
|
|
98
100
|
statusSubscription = null;
|
|
99
101
|
followUpQueue = [];
|
|
100
102
|
isDrainingQueue = false;
|
|
101
103
|
activeContextWindowTokens = null;
|
|
104
|
+
latestTokenUsage = { used: null, limit: null };
|
|
102
105
|
sessionPreferences;
|
|
103
106
|
autosaveEnabled;
|
|
104
107
|
autoContinueEnabled;
|
|
@@ -129,6 +132,7 @@ export class InteractiveShell {
|
|
|
129
132
|
statusLineState = null;
|
|
130
133
|
statusMessageOverride = null;
|
|
131
134
|
promptRefreshTimer = null;
|
|
135
|
+
launchPaletteShown = false;
|
|
132
136
|
constructor(config) {
|
|
133
137
|
this.profile = config.profile;
|
|
134
138
|
this.profileLabel = config.profileLabel;
|
|
@@ -162,6 +166,7 @@ export class InteractiveShell {
|
|
|
162
166
|
this.slashCommands.push({
|
|
163
167
|
command: '/agents',
|
|
164
168
|
description: 'Select the default agent profile (applies on next launch)',
|
|
169
|
+
category: 'configuration',
|
|
165
170
|
});
|
|
166
171
|
}
|
|
167
172
|
this.customCommands = loadCustomSlashCommands();
|
|
@@ -170,18 +175,21 @@ export class InteractiveShell {
|
|
|
170
175
|
this.slashCommands.push({
|
|
171
176
|
command: custom.command,
|
|
172
177
|
description: `${custom.description} (custom)`,
|
|
178
|
+
category: custom.category ?? 'other',
|
|
173
179
|
});
|
|
174
180
|
}
|
|
175
181
|
if (!this.slashCommands.some((cmd) => cmd.command === '/exit')) {
|
|
176
182
|
this.slashCommands.push({
|
|
177
183
|
command: '/exit',
|
|
178
184
|
description: 'Quit the CLI immediately',
|
|
185
|
+
category: 'other',
|
|
179
186
|
});
|
|
180
187
|
}
|
|
181
188
|
// Add /plugins command
|
|
182
189
|
this.slashCommands.push({
|
|
183
190
|
command: '/plugins',
|
|
184
191
|
description: 'Show available and loaded plugins',
|
|
192
|
+
category: 'configuration',
|
|
185
193
|
});
|
|
186
194
|
this.statusTracker = config.statusTracker;
|
|
187
195
|
this.ui = config.ui;
|
|
@@ -216,17 +224,18 @@ export class InteractiveShell {
|
|
|
216
224
|
});
|
|
217
225
|
// Register output interceptor for cursor positioning during streaming
|
|
218
226
|
this.terminalInput.registerOutputInterceptor(display);
|
|
219
|
-
// Use flow mode: input renders inline after content for a unified layout
|
|
220
|
-
// This eliminates the blank space between banner and input area
|
|
221
|
-
this.terminalInput.setFlowMode(true);
|
|
222
|
-
// Set content end row so input renders right after startup content
|
|
223
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
224
227
|
// Initialize Alpha Zero 2 metrics tracking
|
|
225
|
-
this.
|
|
228
|
+
this.alphaZeroMetrics = new MetricsTracker(`${this.profile}-${Date.now()}`);
|
|
226
229
|
this.setupStatusTracking();
|
|
227
230
|
this.refreshContextGauge();
|
|
228
231
|
this.terminalInput.start();
|
|
229
232
|
this.refreshControlBar();
|
|
233
|
+
// Clear and re-render banner in the scroll region so it's part of the unified UI
|
|
234
|
+
this.terminalInput.clearScrollRegion();
|
|
235
|
+
const bannerContent = display.getRenderedBanner();
|
|
236
|
+
if (bannerContent) {
|
|
237
|
+
this.terminalInput.writeToScrollRegion(bannerContent + '\n');
|
|
238
|
+
}
|
|
230
239
|
this.rebuildAgent();
|
|
231
240
|
this.setupHandlers();
|
|
232
241
|
this.refreshBannerSessionInfo();
|
|
@@ -278,9 +287,15 @@ export class InteractiveShell {
|
|
|
278
287
|
await this.processInputBlock(initialPrompt);
|
|
279
288
|
return;
|
|
280
289
|
}
|
|
290
|
+
this.showLaunchCommandPalette();
|
|
281
291
|
// Ensure the terminal input is visible
|
|
282
292
|
this.terminalInput.render();
|
|
283
293
|
}
|
|
294
|
+
showLaunchCommandPalette() {
|
|
295
|
+
// Disabled: Quick commands palette takes up too much space
|
|
296
|
+
// Users can type /help to see available commands
|
|
297
|
+
this.launchPaletteShown = true;
|
|
298
|
+
}
|
|
284
299
|
/**
|
|
285
300
|
* TerminalInputAdapter submit handler
|
|
286
301
|
*/
|
|
@@ -294,9 +309,8 @@ export class InteractiveShell {
|
|
|
294
309
|
this.handleInputChange('');
|
|
295
310
|
return;
|
|
296
311
|
}
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
this.terminalInput.setStreaming(true);
|
|
312
|
+
// DON'T clear the input here - keep it visible while streaming.
|
|
313
|
+
// The input will be cleared after streaming completes in the finally block.
|
|
300
314
|
this.logUserPrompt(approved);
|
|
301
315
|
void this.processInputBlock(approved).catch((err) => {
|
|
302
316
|
display.showError(err instanceof Error ? err.message : String(err), err);
|
|
@@ -498,10 +512,9 @@ export class InteractiveShell {
|
|
|
498
512
|
// Dispose unified UI adapter
|
|
499
513
|
this.uiAdapter.dispose();
|
|
500
514
|
display.newLine();
|
|
501
|
-
console.log(theme.
|
|
502
|
-
console.log(
|
|
503
|
-
console.log(
|
|
504
|
-
console.log(theme.gradient.warm('━'.repeat(50)));
|
|
515
|
+
console.log(theme.ui.muted('━'.repeat(44)));
|
|
516
|
+
console.log(theme.ui.muted(' Goodbye! · support@ero.solar'));
|
|
517
|
+
console.log(theme.ui.muted('━'.repeat(44)));
|
|
505
518
|
exit(0);
|
|
506
519
|
}
|
|
507
520
|
/**
|
|
@@ -671,13 +684,14 @@ export class InteractiveShell {
|
|
|
671
684
|
});
|
|
672
685
|
}
|
|
673
686
|
setProcessingStatus(detail) {
|
|
687
|
+
this.latestTokenUsage = { used: null, limit: this.latestTokenUsage.limit };
|
|
674
688
|
this.statusTracker.setBase('Working on your request', {
|
|
675
689
|
detail: this.describeStatusDetail(detail),
|
|
676
690
|
tone: 'info',
|
|
677
691
|
});
|
|
678
692
|
}
|
|
679
693
|
describeStatusDetail(detail) {
|
|
680
|
-
const parts =
|
|
694
|
+
const parts = detail?.trim() ? [detail.trim()] : [];
|
|
681
695
|
const queued = this.followUpQueue.length;
|
|
682
696
|
if (queued > 0) {
|
|
683
697
|
parts.push(`${queued} follow-up${queued === 1 ? '' : 's'} queued`);
|
|
@@ -690,12 +704,18 @@ export class InteractiveShell {
|
|
|
690
704
|
}
|
|
691
705
|
refreshContextGauge() {
|
|
692
706
|
const tokens = getContextWindowTokens(this.sessionState.model);
|
|
693
|
-
|
|
694
|
-
|
|
707
|
+
const normalizedTokens = typeof tokens === 'number' && Number.isFinite(tokens) ? tokens : null;
|
|
708
|
+
this.activeContextWindowTokens = normalizedTokens;
|
|
709
|
+
if (normalizedTokens !== null) {
|
|
710
|
+
this.latestTokenUsage = {
|
|
711
|
+
used: this.latestTokenUsage.used,
|
|
712
|
+
limit: normalizedTokens,
|
|
713
|
+
};
|
|
714
|
+
}
|
|
695
715
|
}
|
|
696
716
|
updateContextUsage(percentage) {
|
|
697
717
|
this.uiAdapter.updateContextUsage(percentage);
|
|
698
|
-
this.terminalInput.setContextUsage(percentage);
|
|
718
|
+
this.terminalInput.setContextUsage(percentage, CONTEXT_AUTOCOMPACT_PERCENT);
|
|
699
719
|
}
|
|
700
720
|
refreshControlBar() {
|
|
701
721
|
this.terminalInput.setModeToggles({
|
|
@@ -703,9 +723,9 @@ export class InteractiveShell {
|
|
|
703
723
|
autoContinueEnabled: this.autoContinueEnabled,
|
|
704
724
|
verificationHotkey: 'alt+v',
|
|
705
725
|
autoContinueHotkey: 'alt+c',
|
|
726
|
+
thinkingModeLabel: this.thinkingMode,
|
|
727
|
+
thinkingHotkey: '/thinking',
|
|
706
728
|
});
|
|
707
|
-
// Update persistent model info display
|
|
708
|
-
this.terminalInput.setModelInfo(this.describeModelDetail());
|
|
709
729
|
this.refreshStatusLine();
|
|
710
730
|
this.terminalInput.render();
|
|
711
731
|
}
|
|
@@ -736,6 +756,25 @@ export class InteractiveShell {
|
|
|
736
756
|
// Set main status (tool execution, etc.) - shown when not overridden
|
|
737
757
|
const statusText = this.formatStatusLine(this.statusLineState);
|
|
738
758
|
this.terminalInput.setStatusMessage(statusText);
|
|
759
|
+
// Surface meta header (elapsed + context usage) above the divider
|
|
760
|
+
const elapsedSeconds = this.statusLineState
|
|
761
|
+
? Math.max(0, Math.floor((Date.now() - this.statusLineState.startedAt) / 1000))
|
|
762
|
+
: null;
|
|
763
|
+
const thinkingMs = display.isSpinnerActive() ? display.getThinkingElapsedMs() : null;
|
|
764
|
+
const tokensUsed = this.latestTokenUsage.used;
|
|
765
|
+
const tokenLimit = this.latestTokenUsage.limit ?? this.activeContextWindowTokens;
|
|
766
|
+
this.terminalInput.setMetaStatus({
|
|
767
|
+
elapsedSeconds,
|
|
768
|
+
tokensUsed,
|
|
769
|
+
tokenLimit,
|
|
770
|
+
thinkingMs,
|
|
771
|
+
thinkingHasContent: display.isSpinnerActive(),
|
|
772
|
+
});
|
|
773
|
+
// Keep model/provider visible in the controls bar
|
|
774
|
+
this.terminalInput.setModelContext({
|
|
775
|
+
model: this.sessionState.model,
|
|
776
|
+
provider: this.providerLabel(this.sessionState.provider),
|
|
777
|
+
});
|
|
739
778
|
if (forceRender) {
|
|
740
779
|
this.terminalInput.render();
|
|
741
780
|
}
|
|
@@ -795,13 +834,14 @@ export class InteractiveShell {
|
|
|
795
834
|
this.terminalInput.render();
|
|
796
835
|
}
|
|
797
836
|
/**
|
|
798
|
-
* Log
|
|
799
|
-
* This creates a persistent log entry that remains visible during and after streaming.
|
|
837
|
+
* Log user prompt to the scroll region so it's part of the conversation flow.
|
|
800
838
|
*/
|
|
801
839
|
logUserPrompt(text) {
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
840
|
+
if (!text.trim())
|
|
841
|
+
return;
|
|
842
|
+
// Format with user prompt prefix and write to scroll region
|
|
843
|
+
const formatted = `${theme.user('>')} ${text}\n`;
|
|
844
|
+
this.terminalInput.writeToScrollRegion(formatted);
|
|
805
845
|
}
|
|
806
846
|
requestPromptRefresh(force = false) {
|
|
807
847
|
if (force) {
|
|
@@ -829,9 +869,29 @@ export class InteractiveShell {
|
|
|
829
869
|
this.uiUpdates.setMode('streaming');
|
|
830
870
|
this.streamingHeartbeatStart = Date.now();
|
|
831
871
|
this.streamingHeartbeatFrame = 0;
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
872
|
+
const initialFrame = STREAMING_SPINNER_FRAMES[this.streamingHeartbeatFrame];
|
|
873
|
+
this.streamingStatusLabel = this.buildStreamingStatus(`${initialFrame} ${label}`, 0);
|
|
874
|
+
display.updateStreamingStatus(this.streamingStatusLabel);
|
|
875
|
+
this.refreshStatusLine(true);
|
|
876
|
+
// Periodically refresh the pinned input/status region while streaming so
|
|
877
|
+
// elapsed time remains visible without interrupting the scroll region.
|
|
878
|
+
this.uiUpdates.startHeartbeat('streaming', {
|
|
879
|
+
intervalMs: 1000,
|
|
880
|
+
lane: 'heartbeat',
|
|
881
|
+
mode: ['streaming', 'processing'],
|
|
882
|
+
coalesceKey: 'streaming:heartbeat',
|
|
883
|
+
run: () => {
|
|
884
|
+
const elapsedSeconds = this.streamingHeartbeatStart
|
|
885
|
+
? Math.max(0, Math.floor((Date.now() - this.streamingHeartbeatStart) / 1000))
|
|
886
|
+
: 0;
|
|
887
|
+
this.streamingHeartbeatFrame =
|
|
888
|
+
(this.streamingHeartbeatFrame + 1) % STREAMING_SPINNER_FRAMES.length;
|
|
889
|
+
const frame = STREAMING_SPINNER_FRAMES[this.streamingHeartbeatFrame];
|
|
890
|
+
this.streamingStatusLabel = this.buildStreamingStatus(`${frame} ${label}`, elapsedSeconds);
|
|
891
|
+
display.updateStreamingStatus(this.streamingStatusLabel);
|
|
892
|
+
this.refreshStatusLine(true);
|
|
893
|
+
},
|
|
894
|
+
});
|
|
835
895
|
}
|
|
836
896
|
stopStreamingHeartbeat() {
|
|
837
897
|
// Exit global streaming mode - allows UI to render again
|
|
@@ -847,10 +907,28 @@ export class InteractiveShell {
|
|
|
847
907
|
// Force refresh to update the input area now that streaming has ended
|
|
848
908
|
this.refreshStatusLine(true);
|
|
849
909
|
}
|
|
850
|
-
buildStreamingStatus(label) {
|
|
910
|
+
buildStreamingStatus(label, elapsedSeconds) {
|
|
851
911
|
const detail = this.describeModelDetail();
|
|
852
|
-
const
|
|
853
|
-
|
|
912
|
+
const elapsedLabel = typeof elapsedSeconds === 'number' && elapsedSeconds >= 0
|
|
913
|
+
? theme.ui.muted(this.formatElapsedShort(elapsedSeconds))
|
|
914
|
+
: null;
|
|
915
|
+
const prefix = theme.info('⏺');
|
|
916
|
+
const parts = [label];
|
|
917
|
+
if (detail) {
|
|
918
|
+
parts.push(theme.ui.muted('·'), detail);
|
|
919
|
+
}
|
|
920
|
+
if (elapsedLabel) {
|
|
921
|
+
parts.push(theme.ui.muted('·'), elapsedLabel);
|
|
922
|
+
}
|
|
923
|
+
return `${prefix} ${parts.join(' ')}`.trim();
|
|
924
|
+
}
|
|
925
|
+
formatElapsedShort(seconds) {
|
|
926
|
+
if (seconds < 60) {
|
|
927
|
+
return `${seconds}s`;
|
|
928
|
+
}
|
|
929
|
+
const minutes = Math.floor(seconds / 60);
|
|
930
|
+
const remaining = seconds % 60;
|
|
931
|
+
return remaining > 0 ? `${minutes}m ${remaining}s` : `${minutes}m`;
|
|
854
932
|
}
|
|
855
933
|
refreshQueueIndicators() {
|
|
856
934
|
if (this.isProcessing) {
|
|
@@ -1098,17 +1176,6 @@ export class InteractiveShell {
|
|
|
1098
1176
|
case '/discover':
|
|
1099
1177
|
await this.discoverModelsCommand();
|
|
1100
1178
|
break;
|
|
1101
|
-
case '/memory':
|
|
1102
|
-
this.handleMemoryCommand(input);
|
|
1103
|
-
break;
|
|
1104
|
-
case '/clear':
|
|
1105
|
-
display.clear();
|
|
1106
|
-
this.cachedHistory = [];
|
|
1107
|
-
display.showInfo('Conversation cleared.');
|
|
1108
|
-
break;
|
|
1109
|
-
case '/help':
|
|
1110
|
-
this.showHelp();
|
|
1111
|
-
break;
|
|
1112
1179
|
default:
|
|
1113
1180
|
if (!(await this.tryCustomSlashCommand(command, input))) {
|
|
1114
1181
|
display.showWarning(`Unknown command "${command}".`);
|
|
@@ -1417,99 +1484,6 @@ export class InteractiveShell {
|
|
|
1417
1484
|
// Display keyboard shortcuts help (Claude Code style)
|
|
1418
1485
|
display.showSystemMessage(formatShortcutsHelp());
|
|
1419
1486
|
}
|
|
1420
|
-
handleMemoryCommand(input) {
|
|
1421
|
-
const tokens = input.trim().split(/\s+/).slice(1);
|
|
1422
|
-
const action = (tokens.shift() ?? 'show').toLowerCase();
|
|
1423
|
-
switch (action) {
|
|
1424
|
-
case '':
|
|
1425
|
-
case 'show':
|
|
1426
|
-
case 'list': {
|
|
1427
|
-
this.showMemoryStatus();
|
|
1428
|
-
break;
|
|
1429
|
-
}
|
|
1430
|
-
case 'paths': {
|
|
1431
|
-
this.showMemoryPaths();
|
|
1432
|
-
break;
|
|
1433
|
-
}
|
|
1434
|
-
case 'edit': {
|
|
1435
|
-
const level = (tokens[0] ?? 'project').toLowerCase();
|
|
1436
|
-
this.openMemoryForEdit(level);
|
|
1437
|
-
break;
|
|
1438
|
-
}
|
|
1439
|
-
default:
|
|
1440
|
-
display.showWarning('Usage: /memory [show|paths|edit <user|project>]');
|
|
1441
|
-
break;
|
|
1442
|
-
}
|
|
1443
|
-
}
|
|
1444
|
-
showMemoryStatus() {
|
|
1445
|
-
const memory = loadMemory(this.workingDir);
|
|
1446
|
-
const lines = [];
|
|
1447
|
-
lines.push(theme.bold('Persistent Memory'));
|
|
1448
|
-
lines.push('');
|
|
1449
|
-
if (memory.sources.length === 0) {
|
|
1450
|
-
lines.push(theme.secondary('No memory files found.'));
|
|
1451
|
-
lines.push('');
|
|
1452
|
-
lines.push(`Create ${theme.info('EROSOLAR.md')} in your project to add persistent context.`);
|
|
1453
|
-
lines.push(`Use ${theme.info('/memory edit project')} to create one.`);
|
|
1454
|
-
}
|
|
1455
|
-
else {
|
|
1456
|
-
for (const source of memory.sources) {
|
|
1457
|
-
const levelLabel = source.level === 'enterprise' ? 'Enterprise' :
|
|
1458
|
-
source.level === 'user' ? 'User' : 'Project';
|
|
1459
|
-
const preview = source.content.slice(0, 200).replace(/\n/g, ' ').trim();
|
|
1460
|
-
const truncated = source.content.length > 200 ? '...' : '';
|
|
1461
|
-
lines.push(`${theme.success('●')} ${theme.bold(levelLabel)}: ${source.path}`);
|
|
1462
|
-
lines.push(` ${theme.dim(preview + truncated)}`);
|
|
1463
|
-
lines.push('');
|
|
1464
|
-
}
|
|
1465
|
-
if (memory.importedPaths.length > memory.sources.length) {
|
|
1466
|
-
lines.push(theme.secondary(`Imported ${memory.importedPaths.length - memory.sources.length} additional files via @imports.`));
|
|
1467
|
-
}
|
|
1468
|
-
}
|
|
1469
|
-
display.showSystemMessage(lines.join('\n'));
|
|
1470
|
-
}
|
|
1471
|
-
showMemoryPaths() {
|
|
1472
|
-
const paths = listMemoryPaths(this.workingDir);
|
|
1473
|
-
const lines = [];
|
|
1474
|
-
lines.push(theme.bold('Memory File Locations'));
|
|
1475
|
-
lines.push('');
|
|
1476
|
-
for (const { level, path, exists } of paths) {
|
|
1477
|
-
const icon = exists ? theme.success('✓') : theme.dim('○');
|
|
1478
|
-
const levelLabel = level.charAt(0).toUpperCase() + level.slice(1);
|
|
1479
|
-
lines.push(`${icon} ${levelLabel}: ${path}`);
|
|
1480
|
-
}
|
|
1481
|
-
lines.push('');
|
|
1482
|
-
lines.push(theme.secondary('Create any of these files to add persistent memory.'));
|
|
1483
|
-
lines.push(theme.secondary('Use @path/to/file.md syntax to import other files.'));
|
|
1484
|
-
display.showSystemMessage(lines.join('\n'));
|
|
1485
|
-
}
|
|
1486
|
-
openMemoryForEdit(level) {
|
|
1487
|
-
let targetPath;
|
|
1488
|
-
if (level === 'user') {
|
|
1489
|
-
targetPath = getUserMemoryEditPath();
|
|
1490
|
-
}
|
|
1491
|
-
else if (level === 'project') {
|
|
1492
|
-
targetPath = getDefaultProjectMemoryPath(this.workingDir);
|
|
1493
|
-
}
|
|
1494
|
-
else {
|
|
1495
|
-
display.showWarning('Specify "user" or "project" to edit. Enterprise memory is read-only.');
|
|
1496
|
-
return;
|
|
1497
|
-
}
|
|
1498
|
-
display.showInfo(`Memory file: ${targetPath}`);
|
|
1499
|
-
display.showInfo('Create or edit this file to add persistent context for the AI.');
|
|
1500
|
-
display.showInfo('');
|
|
1501
|
-
display.showInfo('Example EROSOLAR.md content:');
|
|
1502
|
-
display.showInfo('');
|
|
1503
|
-
display.showInfo(theme.dim(`# Project Guidelines
|
|
1504
|
-
|
|
1505
|
-
When working in this codebase:
|
|
1506
|
-
- Follow TypeScript strict mode conventions
|
|
1507
|
-
- Use functional patterns where appropriate
|
|
1508
|
-
- Run tests before committing
|
|
1509
|
-
|
|
1510
|
-
@./docs/coding-standards.md
|
|
1511
|
-
`));
|
|
1512
|
-
}
|
|
1513
1487
|
showFileChangeSummary() {
|
|
1514
1488
|
const summary = this._fileChangeTracker.getSummary();
|
|
1515
1489
|
const changes = this._fileChangeTracker.getAllChanges();
|
|
@@ -1552,11 +1526,11 @@ When working in this codebase:
|
|
|
1552
1526
|
display.showSystemMessage(lines.join('\n'));
|
|
1553
1527
|
}
|
|
1554
1528
|
showAlphaZeroMetrics() {
|
|
1555
|
-
const summary = this.
|
|
1529
|
+
const summary = this.alphaZeroMetrics.getPerformanceSummary();
|
|
1556
1530
|
display.showSystemMessage(summary);
|
|
1557
1531
|
}
|
|
1558
1532
|
showImprovementSuggestions() {
|
|
1559
|
-
const suggestions = this.
|
|
1533
|
+
const suggestions = this.alphaZeroMetrics.getImprovementSuggestions();
|
|
1560
1534
|
if (suggestions.length === 0) {
|
|
1561
1535
|
display.showInfo('No improvement suggestions at this time. Keep using the shell to generate metrics!');
|
|
1562
1536
|
return;
|
|
@@ -1602,7 +1576,9 @@ When working in this codebase:
|
|
|
1602
1576
|
}
|
|
1603
1577
|
}
|
|
1604
1578
|
lines.push(theme.secondary('CLI Flags:'));
|
|
1579
|
+
lines.push(' --alpha-zero Enable Alpha Zero 2 RL framework');
|
|
1605
1580
|
lines.push(' --coding Enable enhanced coding tools');
|
|
1581
|
+
lines.push(' --security Enable security research tools');
|
|
1606
1582
|
lines.push(' --all-plugins Enable all optional plugins');
|
|
1607
1583
|
display.showSystemMessage(lines.join('\n'));
|
|
1608
1584
|
}
|
|
@@ -1846,6 +1822,75 @@ When working in this codebase:
|
|
|
1846
1822
|
}
|
|
1847
1823
|
return `${warning.label}: ${warning.reason}.`;
|
|
1848
1824
|
}
|
|
1825
|
+
buildLaunchCommandPalette() {
|
|
1826
|
+
const entries = [];
|
|
1827
|
+
const secretsSummary = this.summarizeSecretsForPalette();
|
|
1828
|
+
const toolSummary = this.getToolSelectionSummary();
|
|
1829
|
+
const autosaveLabel = this.autosaveEnabled ? 'on' : 'off';
|
|
1830
|
+
for (const command of this.slashCommands) {
|
|
1831
|
+
const entry = {
|
|
1832
|
+
command: command.command,
|
|
1833
|
+
description: command.description,
|
|
1834
|
+
category: command.category ?? 'other',
|
|
1835
|
+
};
|
|
1836
|
+
switch (command.command) {
|
|
1837
|
+
case '/secrets':
|
|
1838
|
+
if (secretsSummary.text) {
|
|
1839
|
+
entry.description = `${command.description} (${secretsSummary.text})`;
|
|
1840
|
+
entry.tone = secretsSummary.tone;
|
|
1841
|
+
}
|
|
1842
|
+
break;
|
|
1843
|
+
case '/tools':
|
|
1844
|
+
if (toolSummary) {
|
|
1845
|
+
entry.description = `${command.description} (${toolSummary})`;
|
|
1846
|
+
}
|
|
1847
|
+
break;
|
|
1848
|
+
case '/sessions':
|
|
1849
|
+
entry.description = `${command.description} (autosave ${autosaveLabel})`;
|
|
1850
|
+
break;
|
|
1851
|
+
case '/model':
|
|
1852
|
+
entry.description = `${command.description} (current: ${this.sessionState.model})`;
|
|
1853
|
+
break;
|
|
1854
|
+
case '/provider':
|
|
1855
|
+
entry.description = `${command.description} (current: ${this.providerLabel(this.sessionState.provider)})`;
|
|
1856
|
+
break;
|
|
1857
|
+
default:
|
|
1858
|
+
break;
|
|
1859
|
+
}
|
|
1860
|
+
entries.push(entry);
|
|
1861
|
+
}
|
|
1862
|
+
return entries;
|
|
1863
|
+
}
|
|
1864
|
+
summarizeSecretsForPalette() {
|
|
1865
|
+
const definitions = listSecretDefinitions();
|
|
1866
|
+
if (!definitions.length) {
|
|
1867
|
+
return { text: null };
|
|
1868
|
+
}
|
|
1869
|
+
const missing = definitions.filter((definition) => !getSecretValue(definition.id));
|
|
1870
|
+
if (missing.length === 0) {
|
|
1871
|
+
return { text: 'all configured', tone: 'success' };
|
|
1872
|
+
}
|
|
1873
|
+
const labels = missing.map((definition) => definition.label ?? definition.id);
|
|
1874
|
+
return { text: `missing ${this.formatList(labels)}`, tone: 'warn' };
|
|
1875
|
+
}
|
|
1876
|
+
getToolSelectionSummary() {
|
|
1877
|
+
const toolSettings = loadToolSettings();
|
|
1878
|
+
const selection = buildEnabledToolSet(toolSettings);
|
|
1879
|
+
const options = getToolToggleOptions();
|
|
1880
|
+
if (!options.length) {
|
|
1881
|
+
return null;
|
|
1882
|
+
}
|
|
1883
|
+
const enabledCount = options.filter((option) => selection.has(option.id)).length;
|
|
1884
|
+
return `${enabledCount}/${options.length} enabled`;
|
|
1885
|
+
}
|
|
1886
|
+
formatList(values, maxItems = 3) {
|
|
1887
|
+
if (!values.length) {
|
|
1888
|
+
return '';
|
|
1889
|
+
}
|
|
1890
|
+
const shown = values.slice(0, maxItems);
|
|
1891
|
+
const suffix = values.length > maxItems ? ', …' : '';
|
|
1892
|
+
return `${shown.join(', ')}${suffix}`;
|
|
1893
|
+
}
|
|
1849
1894
|
buildSlashCommandList(header) {
|
|
1850
1895
|
const lines = [theme.gradient.primary(header), ''];
|
|
1851
1896
|
for (const command of this.slashCommands) {
|
|
@@ -2314,7 +2359,7 @@ When working in this codebase:
|
|
|
2314
2359
|
this.autosaveIfEnabled();
|
|
2315
2360
|
// Track metrics with Alpha Zero 2
|
|
2316
2361
|
const elapsedMs = Date.now() - requestStartTime;
|
|
2317
|
-
this.
|
|
2362
|
+
this.alphaZeroMetrics.recordMessage(elapsedMs);
|
|
2318
2363
|
if (!responseText?.trim()) {
|
|
2319
2364
|
display.showWarning('The provider returned an empty response. Check your API key/provider selection or retry the prompt.');
|
|
2320
2365
|
}
|
|
@@ -2332,14 +2377,10 @@ When working in this codebase:
|
|
|
2332
2377
|
this.stopStreamingHeartbeat();
|
|
2333
2378
|
this.isProcessing = false;
|
|
2334
2379
|
this.terminalInput.setStreaming(false);
|
|
2335
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
2336
2380
|
this.uiAdapter.endProcessing('Ready for prompts');
|
|
2337
2381
|
this.setIdleStatus();
|
|
2338
2382
|
display.newLine();
|
|
2339
2383
|
this.updateStatusMessage(null);
|
|
2340
|
-
// Claude Code style: Show unified status bar before prompt
|
|
2341
|
-
// This creates consistent UI between startup and post-streaming
|
|
2342
|
-
this.showUnifiedStatusBar();
|
|
2343
2384
|
queueMicrotask(() => this.uiUpdates.setMode('idle'));
|
|
2344
2385
|
// CRITICAL: Ensure readline prompt is active for user input
|
|
2345
2386
|
// Claude Code style: New prompt naturally appears at bottom
|
|
@@ -2416,13 +2457,14 @@ When truly finished with ALL tasks, explicitly state "TASK_FULLY_COMPLETE".`;
|
|
|
2416
2457
|
try {
|
|
2417
2458
|
// Send the request and capture the response (streaming disabled)
|
|
2418
2459
|
display.showThinking('Responding...');
|
|
2460
|
+
this.refreshStatusLine(true);
|
|
2419
2461
|
const response = await agent.send(currentPrompt, true);
|
|
2420
2462
|
await this.awaitPendingCleanup();
|
|
2421
2463
|
this.captureHistorySnapshot();
|
|
2422
2464
|
this.autosaveIfEnabled();
|
|
2423
2465
|
// Track metrics
|
|
2424
2466
|
const elapsedMs = Date.now() - overallStartTime;
|
|
2425
|
-
this.
|
|
2467
|
+
this.alphaZeroMetrics.recordMessage(elapsedMs);
|
|
2426
2468
|
if (!response?.trim()) {
|
|
2427
2469
|
display.showWarning('Model returned an empty response. Retrying this iteration...');
|
|
2428
2470
|
consecutiveNoProgress++;
|
|
@@ -2559,7 +2601,6 @@ What's the next action?`;
|
|
|
2559
2601
|
this.stopStreamingHeartbeat();
|
|
2560
2602
|
this.isProcessing = false;
|
|
2561
2603
|
this.terminalInput.setStreaming(false);
|
|
2562
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
2563
2604
|
this.uiAdapter.endProcessing('Ready for prompts');
|
|
2564
2605
|
this.setIdleStatus();
|
|
2565
2606
|
this.updateStatusMessage(null);
|
|
@@ -2916,8 +2957,10 @@ What's the next action?`;
|
|
|
2916
2957
|
try {
|
|
2917
2958
|
// Send the error to the agent for fixing
|
|
2918
2959
|
display.showThinking('Analyzing build errors');
|
|
2960
|
+
this.refreshStatusLine(true);
|
|
2919
2961
|
const response = await this.agent.send(prompt, true);
|
|
2920
2962
|
display.stopThinking();
|
|
2963
|
+
this.refreshStatusLine(true);
|
|
2921
2964
|
if (response) {
|
|
2922
2965
|
display.showAssistantMessage(response, { isFinal: true });
|
|
2923
2966
|
}
|
|
@@ -2967,18 +3010,16 @@ What's the next action?`;
|
|
|
2967
3010
|
display.showAssistantMessage(finalContent, enriched);
|
|
2968
3011
|
}
|
|
2969
3012
|
}
|
|
2970
|
-
//
|
|
3013
|
+
// Status shown in mode controls bar - no separate status line needed
|
|
2971
3014
|
display.stopThinking();
|
|
2972
|
-
//
|
|
2973
|
-
let contextInfo;
|
|
3015
|
+
// Update context usage for mode controls display
|
|
2974
3016
|
if (enriched.contextWindowTokens && metadata.usage) {
|
|
2975
3017
|
const total = this.totalTokens(metadata.usage);
|
|
2976
3018
|
if (total && total > 0) {
|
|
2977
3019
|
const percentage = Math.round((total / enriched.contextWindowTokens) * 100);
|
|
2978
|
-
|
|
3020
|
+
this.updateContextUsage(percentage);
|
|
2979
3021
|
}
|
|
2980
3022
|
}
|
|
2981
|
-
display.showStatusLine('Ready for prompts', enriched.elapsedMs, contextInfo);
|
|
2982
3023
|
// Auto-verify changes: build first (catches type errors), then tests
|
|
2983
3024
|
void this.enforceAutoBuild('final-response');
|
|
2984
3025
|
void this.enforceAutoTests('final-response');
|
|
@@ -3048,7 +3089,6 @@ What's the next action?`;
|
|
|
3048
3089
|
this.stopStreamingHeartbeat();
|
|
3049
3090
|
this.updateStatusMessage(null);
|
|
3050
3091
|
this.terminalInput.setStreaming(false);
|
|
3051
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
3052
3092
|
this.terminalInput.render();
|
|
3053
3093
|
},
|
|
3054
3094
|
onVerificationNeeded: () => {
|
|
@@ -3085,7 +3125,6 @@ What's the next action?`;
|
|
|
3085
3125
|
resetChatBoxAfterModelSwap() {
|
|
3086
3126
|
this.updateStatusMessage(null);
|
|
3087
3127
|
this.terminalInput.setStreaming(false);
|
|
3088
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
3089
3128
|
this.terminalInput.render();
|
|
3090
3129
|
this.ensureReadlineReady();
|
|
3091
3130
|
}
|
|
@@ -3150,9 +3189,14 @@ What's the next action?`;
|
|
|
3150
3189
|
return null;
|
|
3151
3190
|
}
|
|
3152
3191
|
const usageRatio = total / windowTokens;
|
|
3192
|
+
this.latestTokenUsage = {
|
|
3193
|
+
used: total,
|
|
3194
|
+
limit: windowTokens,
|
|
3195
|
+
};
|
|
3153
3196
|
// Always update context usage in the UI
|
|
3154
3197
|
const percentUsed = Math.round(usageRatio * 100);
|
|
3155
3198
|
this.updateContextUsage(percentUsed);
|
|
3199
|
+
this.refreshStatusLine(true);
|
|
3156
3200
|
if (usageRatio < CONTEXT_USAGE_THRESHOLD) {
|
|
3157
3201
|
return null;
|
|
3158
3202
|
}
|
|
@@ -3430,8 +3474,6 @@ What's the next action?`;
|
|
|
3430
3474
|
}
|
|
3431
3475
|
this.refreshContextGauge();
|
|
3432
3476
|
display.updateSessionInfo(nextState.model, nextState.provider);
|
|
3433
|
-
// Update the persistent model info display in terminal input
|
|
3434
|
-
this.terminalInput.setModelInfo(this.describeModelDetail());
|
|
3435
3477
|
if (!this.isProcessing) {
|
|
3436
3478
|
this.setIdleStatus();
|
|
3437
3479
|
}
|