erosolar-cli 1.7.263 → 1.7.265
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/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 +11 -7
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +190 -153
- 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 +67 -147
- package/dist/shell/terminalInput.d.ts.map +1 -1
- package/dist/shell/terminalInput.js +457 -689
- package/dist/shell/terminalInput.js.map +1 -1
- package/dist/shell/terminalInputAdapter.d.ts +20 -20
- package/dist/shell/terminalInputAdapter.d.ts.map +1 -1
- package/dist/shell/terminalInputAdapter.js +14 -29
- 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 +19 -0
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +131 -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,13 +224,8 @@ 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();
|
|
@@ -278,9 +281,15 @@ export class InteractiveShell {
|
|
|
278
281
|
await this.processInputBlock(initialPrompt);
|
|
279
282
|
return;
|
|
280
283
|
}
|
|
284
|
+
this.showLaunchCommandPalette();
|
|
281
285
|
// Ensure the terminal input is visible
|
|
282
286
|
this.terminalInput.render();
|
|
283
287
|
}
|
|
288
|
+
showLaunchCommandPalette() {
|
|
289
|
+
// Disabled: Quick commands palette takes up too much space
|
|
290
|
+
// Users can type /help to see available commands
|
|
291
|
+
this.launchPaletteShown = true;
|
|
292
|
+
}
|
|
284
293
|
/**
|
|
285
294
|
* TerminalInputAdapter submit handler
|
|
286
295
|
*/
|
|
@@ -294,9 +303,8 @@ export class InteractiveShell {
|
|
|
294
303
|
this.handleInputChange('');
|
|
295
304
|
return;
|
|
296
305
|
}
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
this.terminalInput.setStreaming(true);
|
|
306
|
+
// DON'T clear the input here - keep it visible while streaming.
|
|
307
|
+
// The input will be cleared after streaming completes in the finally block.
|
|
300
308
|
this.logUserPrompt(approved);
|
|
301
309
|
void this.processInputBlock(approved).catch((err) => {
|
|
302
310
|
display.showError(err instanceof Error ? err.message : String(err), err);
|
|
@@ -498,10 +506,9 @@ export class InteractiveShell {
|
|
|
498
506
|
// Dispose unified UI adapter
|
|
499
507
|
this.uiAdapter.dispose();
|
|
500
508
|
display.newLine();
|
|
501
|
-
console.log(theme.
|
|
502
|
-
console.log(
|
|
503
|
-
console.log(
|
|
504
|
-
console.log(theme.gradient.warm('━'.repeat(50)));
|
|
509
|
+
console.log(theme.ui.muted('━'.repeat(44)));
|
|
510
|
+
console.log(theme.ui.muted(' Goodbye! · support@ero.solar'));
|
|
511
|
+
console.log(theme.ui.muted('━'.repeat(44)));
|
|
505
512
|
exit(0);
|
|
506
513
|
}
|
|
507
514
|
/**
|
|
@@ -671,13 +678,14 @@ export class InteractiveShell {
|
|
|
671
678
|
});
|
|
672
679
|
}
|
|
673
680
|
setProcessingStatus(detail) {
|
|
681
|
+
this.latestTokenUsage = { used: null, limit: this.latestTokenUsage.limit };
|
|
674
682
|
this.statusTracker.setBase('Working on your request', {
|
|
675
683
|
detail: this.describeStatusDetail(detail),
|
|
676
684
|
tone: 'info',
|
|
677
685
|
});
|
|
678
686
|
}
|
|
679
687
|
describeStatusDetail(detail) {
|
|
680
|
-
const parts =
|
|
688
|
+
const parts = detail?.trim() ? [detail.trim()] : [];
|
|
681
689
|
const queued = this.followUpQueue.length;
|
|
682
690
|
if (queued > 0) {
|
|
683
691
|
parts.push(`${queued} follow-up${queued === 1 ? '' : 's'} queued`);
|
|
@@ -690,12 +698,18 @@ export class InteractiveShell {
|
|
|
690
698
|
}
|
|
691
699
|
refreshContextGauge() {
|
|
692
700
|
const tokens = getContextWindowTokens(this.sessionState.model);
|
|
693
|
-
|
|
694
|
-
|
|
701
|
+
const normalizedTokens = typeof tokens === 'number' && Number.isFinite(tokens) ? tokens : null;
|
|
702
|
+
this.activeContextWindowTokens = normalizedTokens;
|
|
703
|
+
if (normalizedTokens !== null) {
|
|
704
|
+
this.latestTokenUsage = {
|
|
705
|
+
used: this.latestTokenUsage.used,
|
|
706
|
+
limit: normalizedTokens,
|
|
707
|
+
};
|
|
708
|
+
}
|
|
695
709
|
}
|
|
696
710
|
updateContextUsage(percentage) {
|
|
697
711
|
this.uiAdapter.updateContextUsage(percentage);
|
|
698
|
-
this.terminalInput.setContextUsage(percentage);
|
|
712
|
+
this.terminalInput.setContextUsage(percentage, CONTEXT_AUTOCOMPACT_PERCENT);
|
|
699
713
|
}
|
|
700
714
|
refreshControlBar() {
|
|
701
715
|
this.terminalInput.setModeToggles({
|
|
@@ -703,6 +717,8 @@ export class InteractiveShell {
|
|
|
703
717
|
autoContinueEnabled: this.autoContinueEnabled,
|
|
704
718
|
verificationHotkey: 'alt+v',
|
|
705
719
|
autoContinueHotkey: 'alt+c',
|
|
720
|
+
thinkingModeLabel: this.thinkingMode,
|
|
721
|
+
thinkingHotkey: '/thinking',
|
|
706
722
|
});
|
|
707
723
|
this.refreshStatusLine();
|
|
708
724
|
this.terminalInput.render();
|
|
@@ -734,6 +750,25 @@ export class InteractiveShell {
|
|
|
734
750
|
// Set main status (tool execution, etc.) - shown when not overridden
|
|
735
751
|
const statusText = this.formatStatusLine(this.statusLineState);
|
|
736
752
|
this.terminalInput.setStatusMessage(statusText);
|
|
753
|
+
// Surface meta header (elapsed + context usage) above the divider
|
|
754
|
+
const elapsedSeconds = this.statusLineState
|
|
755
|
+
? Math.max(0, Math.floor((Date.now() - this.statusLineState.startedAt) / 1000))
|
|
756
|
+
: null;
|
|
757
|
+
const thinkingMs = display.isSpinnerActive() ? display.getThinkingElapsedMs() : null;
|
|
758
|
+
const tokensUsed = this.latestTokenUsage.used;
|
|
759
|
+
const tokenLimit = this.latestTokenUsage.limit ?? this.activeContextWindowTokens;
|
|
760
|
+
this.terminalInput.setMetaStatus({
|
|
761
|
+
elapsedSeconds,
|
|
762
|
+
tokensUsed,
|
|
763
|
+
tokenLimit,
|
|
764
|
+
thinkingMs,
|
|
765
|
+
thinkingHasContent: display.isSpinnerActive(),
|
|
766
|
+
});
|
|
767
|
+
// Keep model/provider visible in the controls bar
|
|
768
|
+
this.terminalInput.setModelContext({
|
|
769
|
+
model: this.sessionState.model,
|
|
770
|
+
provider: this.providerLabel(this.sessionState.provider),
|
|
771
|
+
});
|
|
737
772
|
if (forceRender) {
|
|
738
773
|
this.terminalInput.render();
|
|
739
774
|
}
|
|
@@ -793,13 +828,11 @@ export class InteractiveShell {
|
|
|
793
828
|
this.terminalInput.render();
|
|
794
829
|
}
|
|
795
830
|
/**
|
|
796
|
-
*
|
|
797
|
-
*
|
|
831
|
+
* Keep submissions out of the transcript to preserve the persistent input area.
|
|
832
|
+
* The chat box already holds the user's prompt, so avoid echoing it into output.
|
|
798
833
|
*/
|
|
799
|
-
logUserPrompt(
|
|
800
|
-
//
|
|
801
|
-
const prefix = formatUserPrompt();
|
|
802
|
-
display.stream(`\n${prefix}${text}\n\n`);
|
|
834
|
+
logUserPrompt(_text) {
|
|
835
|
+
// Intentionally no-op to keep the input area persistent and uncluttered.
|
|
803
836
|
}
|
|
804
837
|
requestPromptRefresh(force = false) {
|
|
805
838
|
if (force) {
|
|
@@ -827,9 +860,29 @@ export class InteractiveShell {
|
|
|
827
860
|
this.uiUpdates.setMode('streaming');
|
|
828
861
|
this.streamingHeartbeatStart = Date.now();
|
|
829
862
|
this.streamingHeartbeatFrame = 0;
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
863
|
+
const initialFrame = STREAMING_SPINNER_FRAMES[this.streamingHeartbeatFrame];
|
|
864
|
+
this.streamingStatusLabel = this.buildStreamingStatus(`${initialFrame} ${label}`, 0);
|
|
865
|
+
display.updateStreamingStatus(this.streamingStatusLabel);
|
|
866
|
+
this.refreshStatusLine(true);
|
|
867
|
+
// Periodically refresh the pinned input/status region while streaming so
|
|
868
|
+
// elapsed time remains visible without interrupting the scroll region.
|
|
869
|
+
this.uiUpdates.startHeartbeat('streaming', {
|
|
870
|
+
intervalMs: 1000,
|
|
871
|
+
lane: 'heartbeat',
|
|
872
|
+
mode: ['streaming', 'processing'],
|
|
873
|
+
coalesceKey: 'streaming:heartbeat',
|
|
874
|
+
run: () => {
|
|
875
|
+
const elapsedSeconds = this.streamingHeartbeatStart
|
|
876
|
+
? Math.max(0, Math.floor((Date.now() - this.streamingHeartbeatStart) / 1000))
|
|
877
|
+
: 0;
|
|
878
|
+
this.streamingHeartbeatFrame =
|
|
879
|
+
(this.streamingHeartbeatFrame + 1) % STREAMING_SPINNER_FRAMES.length;
|
|
880
|
+
const frame = STREAMING_SPINNER_FRAMES[this.streamingHeartbeatFrame];
|
|
881
|
+
this.streamingStatusLabel = this.buildStreamingStatus(`${frame} ${label}`, elapsedSeconds);
|
|
882
|
+
display.updateStreamingStatus(this.streamingStatusLabel);
|
|
883
|
+
this.refreshStatusLine(true);
|
|
884
|
+
},
|
|
885
|
+
});
|
|
833
886
|
}
|
|
834
887
|
stopStreamingHeartbeat() {
|
|
835
888
|
// Exit global streaming mode - allows UI to render again
|
|
@@ -845,10 +898,28 @@ export class InteractiveShell {
|
|
|
845
898
|
// Force refresh to update the input area now that streaming has ended
|
|
846
899
|
this.refreshStatusLine(true);
|
|
847
900
|
}
|
|
848
|
-
buildStreamingStatus(label) {
|
|
901
|
+
buildStreamingStatus(label, elapsedSeconds) {
|
|
849
902
|
const detail = this.describeModelDetail();
|
|
850
|
-
const
|
|
851
|
-
|
|
903
|
+
const elapsedLabel = typeof elapsedSeconds === 'number' && elapsedSeconds >= 0
|
|
904
|
+
? theme.ui.muted(this.formatElapsedShort(elapsedSeconds))
|
|
905
|
+
: null;
|
|
906
|
+
const prefix = theme.info('⏺');
|
|
907
|
+
const parts = [label];
|
|
908
|
+
if (detail) {
|
|
909
|
+
parts.push(theme.ui.muted('·'), detail);
|
|
910
|
+
}
|
|
911
|
+
if (elapsedLabel) {
|
|
912
|
+
parts.push(theme.ui.muted('·'), elapsedLabel);
|
|
913
|
+
}
|
|
914
|
+
return `${prefix} ${parts.join(' ')}`.trim();
|
|
915
|
+
}
|
|
916
|
+
formatElapsedShort(seconds) {
|
|
917
|
+
if (seconds < 60) {
|
|
918
|
+
return `${seconds}s`;
|
|
919
|
+
}
|
|
920
|
+
const minutes = Math.floor(seconds / 60);
|
|
921
|
+
const remaining = seconds % 60;
|
|
922
|
+
return remaining > 0 ? `${minutes}m ${remaining}s` : `${minutes}m`;
|
|
852
923
|
}
|
|
853
924
|
refreshQueueIndicators() {
|
|
854
925
|
if (this.isProcessing) {
|
|
@@ -1096,17 +1167,6 @@ export class InteractiveShell {
|
|
|
1096
1167
|
case '/discover':
|
|
1097
1168
|
await this.discoverModelsCommand();
|
|
1098
1169
|
break;
|
|
1099
|
-
case '/memory':
|
|
1100
|
-
this.handleMemoryCommand(input);
|
|
1101
|
-
break;
|
|
1102
|
-
case '/clear':
|
|
1103
|
-
display.clear();
|
|
1104
|
-
this.cachedHistory = [];
|
|
1105
|
-
display.showInfo('Conversation cleared.');
|
|
1106
|
-
break;
|
|
1107
|
-
case '/help':
|
|
1108
|
-
this.showHelp();
|
|
1109
|
-
break;
|
|
1110
1170
|
default:
|
|
1111
1171
|
if (!(await this.tryCustomSlashCommand(command, input))) {
|
|
1112
1172
|
display.showWarning(`Unknown command "${command}".`);
|
|
@@ -1415,99 +1475,6 @@ export class InteractiveShell {
|
|
|
1415
1475
|
// Display keyboard shortcuts help (Claude Code style)
|
|
1416
1476
|
display.showSystemMessage(formatShortcutsHelp());
|
|
1417
1477
|
}
|
|
1418
|
-
handleMemoryCommand(input) {
|
|
1419
|
-
const tokens = input.trim().split(/\s+/).slice(1);
|
|
1420
|
-
const action = (tokens.shift() ?? 'show').toLowerCase();
|
|
1421
|
-
switch (action) {
|
|
1422
|
-
case '':
|
|
1423
|
-
case 'show':
|
|
1424
|
-
case 'list': {
|
|
1425
|
-
this.showMemoryStatus();
|
|
1426
|
-
break;
|
|
1427
|
-
}
|
|
1428
|
-
case 'paths': {
|
|
1429
|
-
this.showMemoryPaths();
|
|
1430
|
-
break;
|
|
1431
|
-
}
|
|
1432
|
-
case 'edit': {
|
|
1433
|
-
const level = (tokens[0] ?? 'project').toLowerCase();
|
|
1434
|
-
this.openMemoryForEdit(level);
|
|
1435
|
-
break;
|
|
1436
|
-
}
|
|
1437
|
-
default:
|
|
1438
|
-
display.showWarning('Usage: /memory [show|paths|edit <user|project>]');
|
|
1439
|
-
break;
|
|
1440
|
-
}
|
|
1441
|
-
}
|
|
1442
|
-
showMemoryStatus() {
|
|
1443
|
-
const memory = loadMemory(this.workingDir);
|
|
1444
|
-
const lines = [];
|
|
1445
|
-
lines.push(theme.bold('Persistent Memory'));
|
|
1446
|
-
lines.push('');
|
|
1447
|
-
if (memory.sources.length === 0) {
|
|
1448
|
-
lines.push(theme.secondary('No memory files found.'));
|
|
1449
|
-
lines.push('');
|
|
1450
|
-
lines.push(`Create ${theme.info('EROSOLAR.md')} in your project to add persistent context.`);
|
|
1451
|
-
lines.push(`Use ${theme.info('/memory edit project')} to create one.`);
|
|
1452
|
-
}
|
|
1453
|
-
else {
|
|
1454
|
-
for (const source of memory.sources) {
|
|
1455
|
-
const levelLabel = source.level === 'enterprise' ? 'Enterprise' :
|
|
1456
|
-
source.level === 'user' ? 'User' : 'Project';
|
|
1457
|
-
const preview = source.content.slice(0, 200).replace(/\n/g, ' ').trim();
|
|
1458
|
-
const truncated = source.content.length > 200 ? '...' : '';
|
|
1459
|
-
lines.push(`${theme.success('●')} ${theme.bold(levelLabel)}: ${source.path}`);
|
|
1460
|
-
lines.push(` ${theme.dim(preview + truncated)}`);
|
|
1461
|
-
lines.push('');
|
|
1462
|
-
}
|
|
1463
|
-
if (memory.importedPaths.length > memory.sources.length) {
|
|
1464
|
-
lines.push(theme.secondary(`Imported ${memory.importedPaths.length - memory.sources.length} additional files via @imports.`));
|
|
1465
|
-
}
|
|
1466
|
-
}
|
|
1467
|
-
display.showSystemMessage(lines.join('\n'));
|
|
1468
|
-
}
|
|
1469
|
-
showMemoryPaths() {
|
|
1470
|
-
const paths = listMemoryPaths(this.workingDir);
|
|
1471
|
-
const lines = [];
|
|
1472
|
-
lines.push(theme.bold('Memory File Locations'));
|
|
1473
|
-
lines.push('');
|
|
1474
|
-
for (const { level, path, exists } of paths) {
|
|
1475
|
-
const icon = exists ? theme.success('✓') : theme.dim('○');
|
|
1476
|
-
const levelLabel = level.charAt(0).toUpperCase() + level.slice(1);
|
|
1477
|
-
lines.push(`${icon} ${levelLabel}: ${path}`);
|
|
1478
|
-
}
|
|
1479
|
-
lines.push('');
|
|
1480
|
-
lines.push(theme.secondary('Create any of these files to add persistent memory.'));
|
|
1481
|
-
lines.push(theme.secondary('Use @path/to/file.md syntax to import other files.'));
|
|
1482
|
-
display.showSystemMessage(lines.join('\n'));
|
|
1483
|
-
}
|
|
1484
|
-
openMemoryForEdit(level) {
|
|
1485
|
-
let targetPath;
|
|
1486
|
-
if (level === 'user') {
|
|
1487
|
-
targetPath = getUserMemoryEditPath();
|
|
1488
|
-
}
|
|
1489
|
-
else if (level === 'project') {
|
|
1490
|
-
targetPath = getDefaultProjectMemoryPath(this.workingDir);
|
|
1491
|
-
}
|
|
1492
|
-
else {
|
|
1493
|
-
display.showWarning('Specify "user" or "project" to edit. Enterprise memory is read-only.');
|
|
1494
|
-
return;
|
|
1495
|
-
}
|
|
1496
|
-
display.showInfo(`Memory file: ${targetPath}`);
|
|
1497
|
-
display.showInfo('Create or edit this file to add persistent context for the AI.');
|
|
1498
|
-
display.showInfo('');
|
|
1499
|
-
display.showInfo('Example EROSOLAR.md content:');
|
|
1500
|
-
display.showInfo('');
|
|
1501
|
-
display.showInfo(theme.dim(`# Project Guidelines
|
|
1502
|
-
|
|
1503
|
-
When working in this codebase:
|
|
1504
|
-
- Follow TypeScript strict mode conventions
|
|
1505
|
-
- Use functional patterns where appropriate
|
|
1506
|
-
- Run tests before committing
|
|
1507
|
-
|
|
1508
|
-
@./docs/coding-standards.md
|
|
1509
|
-
`));
|
|
1510
|
-
}
|
|
1511
1478
|
showFileChangeSummary() {
|
|
1512
1479
|
const summary = this._fileChangeTracker.getSummary();
|
|
1513
1480
|
const changes = this._fileChangeTracker.getAllChanges();
|
|
@@ -1550,11 +1517,11 @@ When working in this codebase:
|
|
|
1550
1517
|
display.showSystemMessage(lines.join('\n'));
|
|
1551
1518
|
}
|
|
1552
1519
|
showAlphaZeroMetrics() {
|
|
1553
|
-
const summary = this.
|
|
1520
|
+
const summary = this.alphaZeroMetrics.getPerformanceSummary();
|
|
1554
1521
|
display.showSystemMessage(summary);
|
|
1555
1522
|
}
|
|
1556
1523
|
showImprovementSuggestions() {
|
|
1557
|
-
const suggestions = this.
|
|
1524
|
+
const suggestions = this.alphaZeroMetrics.getImprovementSuggestions();
|
|
1558
1525
|
if (suggestions.length === 0) {
|
|
1559
1526
|
display.showInfo('No improvement suggestions at this time. Keep using the shell to generate metrics!');
|
|
1560
1527
|
return;
|
|
@@ -1600,7 +1567,9 @@ When working in this codebase:
|
|
|
1600
1567
|
}
|
|
1601
1568
|
}
|
|
1602
1569
|
lines.push(theme.secondary('CLI Flags:'));
|
|
1570
|
+
lines.push(' --alpha-zero Enable Alpha Zero 2 RL framework');
|
|
1603
1571
|
lines.push(' --coding Enable enhanced coding tools');
|
|
1572
|
+
lines.push(' --security Enable security research tools');
|
|
1604
1573
|
lines.push(' --all-plugins Enable all optional plugins');
|
|
1605
1574
|
display.showSystemMessage(lines.join('\n'));
|
|
1606
1575
|
}
|
|
@@ -1844,6 +1813,75 @@ When working in this codebase:
|
|
|
1844
1813
|
}
|
|
1845
1814
|
return `${warning.label}: ${warning.reason}.`;
|
|
1846
1815
|
}
|
|
1816
|
+
buildLaunchCommandPalette() {
|
|
1817
|
+
const entries = [];
|
|
1818
|
+
const secretsSummary = this.summarizeSecretsForPalette();
|
|
1819
|
+
const toolSummary = this.getToolSelectionSummary();
|
|
1820
|
+
const autosaveLabel = this.autosaveEnabled ? 'on' : 'off';
|
|
1821
|
+
for (const command of this.slashCommands) {
|
|
1822
|
+
const entry = {
|
|
1823
|
+
command: command.command,
|
|
1824
|
+
description: command.description,
|
|
1825
|
+
category: command.category ?? 'other',
|
|
1826
|
+
};
|
|
1827
|
+
switch (command.command) {
|
|
1828
|
+
case '/secrets':
|
|
1829
|
+
if (secretsSummary.text) {
|
|
1830
|
+
entry.description = `${command.description} (${secretsSummary.text})`;
|
|
1831
|
+
entry.tone = secretsSummary.tone;
|
|
1832
|
+
}
|
|
1833
|
+
break;
|
|
1834
|
+
case '/tools':
|
|
1835
|
+
if (toolSummary) {
|
|
1836
|
+
entry.description = `${command.description} (${toolSummary})`;
|
|
1837
|
+
}
|
|
1838
|
+
break;
|
|
1839
|
+
case '/sessions':
|
|
1840
|
+
entry.description = `${command.description} (autosave ${autosaveLabel})`;
|
|
1841
|
+
break;
|
|
1842
|
+
case '/model':
|
|
1843
|
+
entry.description = `${command.description} (current: ${this.sessionState.model})`;
|
|
1844
|
+
break;
|
|
1845
|
+
case '/provider':
|
|
1846
|
+
entry.description = `${command.description} (current: ${this.providerLabel(this.sessionState.provider)})`;
|
|
1847
|
+
break;
|
|
1848
|
+
default:
|
|
1849
|
+
break;
|
|
1850
|
+
}
|
|
1851
|
+
entries.push(entry);
|
|
1852
|
+
}
|
|
1853
|
+
return entries;
|
|
1854
|
+
}
|
|
1855
|
+
summarizeSecretsForPalette() {
|
|
1856
|
+
const definitions = listSecretDefinitions();
|
|
1857
|
+
if (!definitions.length) {
|
|
1858
|
+
return { text: null };
|
|
1859
|
+
}
|
|
1860
|
+
const missing = definitions.filter((definition) => !getSecretValue(definition.id));
|
|
1861
|
+
if (missing.length === 0) {
|
|
1862
|
+
return { text: 'all configured', tone: 'success' };
|
|
1863
|
+
}
|
|
1864
|
+
const labels = missing.map((definition) => definition.label ?? definition.id);
|
|
1865
|
+
return { text: `missing ${this.formatList(labels)}`, tone: 'warn' };
|
|
1866
|
+
}
|
|
1867
|
+
getToolSelectionSummary() {
|
|
1868
|
+
const toolSettings = loadToolSettings();
|
|
1869
|
+
const selection = buildEnabledToolSet(toolSettings);
|
|
1870
|
+
const options = getToolToggleOptions();
|
|
1871
|
+
if (!options.length) {
|
|
1872
|
+
return null;
|
|
1873
|
+
}
|
|
1874
|
+
const enabledCount = options.filter((option) => selection.has(option.id)).length;
|
|
1875
|
+
return `${enabledCount}/${options.length} enabled`;
|
|
1876
|
+
}
|
|
1877
|
+
formatList(values, maxItems = 3) {
|
|
1878
|
+
if (!values.length) {
|
|
1879
|
+
return '';
|
|
1880
|
+
}
|
|
1881
|
+
const shown = values.slice(0, maxItems);
|
|
1882
|
+
const suffix = values.length > maxItems ? ', …' : '';
|
|
1883
|
+
return `${shown.join(', ')}${suffix}`;
|
|
1884
|
+
}
|
|
1847
1885
|
buildSlashCommandList(header) {
|
|
1848
1886
|
const lines = [theme.gradient.primary(header), ''];
|
|
1849
1887
|
for (const command of this.slashCommands) {
|
|
@@ -2312,7 +2350,7 @@ When working in this codebase:
|
|
|
2312
2350
|
this.autosaveIfEnabled();
|
|
2313
2351
|
// Track metrics with Alpha Zero 2
|
|
2314
2352
|
const elapsedMs = Date.now() - requestStartTime;
|
|
2315
|
-
this.
|
|
2353
|
+
this.alphaZeroMetrics.recordMessage(elapsedMs);
|
|
2316
2354
|
if (!responseText?.trim()) {
|
|
2317
2355
|
display.showWarning('The provider returned an empty response. Check your API key/provider selection or retry the prompt.');
|
|
2318
2356
|
}
|
|
@@ -2330,14 +2368,10 @@ When working in this codebase:
|
|
|
2330
2368
|
this.stopStreamingHeartbeat();
|
|
2331
2369
|
this.isProcessing = false;
|
|
2332
2370
|
this.terminalInput.setStreaming(false);
|
|
2333
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
2334
2371
|
this.uiAdapter.endProcessing('Ready for prompts');
|
|
2335
2372
|
this.setIdleStatus();
|
|
2336
2373
|
display.newLine();
|
|
2337
2374
|
this.updateStatusMessage(null);
|
|
2338
|
-
// Claude Code style: Show unified status bar before prompt
|
|
2339
|
-
// This creates consistent UI between startup and post-streaming
|
|
2340
|
-
this.showUnifiedStatusBar();
|
|
2341
2375
|
queueMicrotask(() => this.uiUpdates.setMode('idle'));
|
|
2342
2376
|
// CRITICAL: Ensure readline prompt is active for user input
|
|
2343
2377
|
// Claude Code style: New prompt naturally appears at bottom
|
|
@@ -2414,13 +2448,14 @@ When truly finished with ALL tasks, explicitly state "TASK_FULLY_COMPLETE".`;
|
|
|
2414
2448
|
try {
|
|
2415
2449
|
// Send the request and capture the response (streaming disabled)
|
|
2416
2450
|
display.showThinking('Responding...');
|
|
2451
|
+
this.refreshStatusLine(true);
|
|
2417
2452
|
const response = await agent.send(currentPrompt, true);
|
|
2418
2453
|
await this.awaitPendingCleanup();
|
|
2419
2454
|
this.captureHistorySnapshot();
|
|
2420
2455
|
this.autosaveIfEnabled();
|
|
2421
2456
|
// Track metrics
|
|
2422
2457
|
const elapsedMs = Date.now() - overallStartTime;
|
|
2423
|
-
this.
|
|
2458
|
+
this.alphaZeroMetrics.recordMessage(elapsedMs);
|
|
2424
2459
|
if (!response?.trim()) {
|
|
2425
2460
|
display.showWarning('Model returned an empty response. Retrying this iteration...');
|
|
2426
2461
|
consecutiveNoProgress++;
|
|
@@ -2557,7 +2592,6 @@ What's the next action?`;
|
|
|
2557
2592
|
this.stopStreamingHeartbeat();
|
|
2558
2593
|
this.isProcessing = false;
|
|
2559
2594
|
this.terminalInput.setStreaming(false);
|
|
2560
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
2561
2595
|
this.uiAdapter.endProcessing('Ready for prompts');
|
|
2562
2596
|
this.setIdleStatus();
|
|
2563
2597
|
this.updateStatusMessage(null);
|
|
@@ -2914,8 +2948,10 @@ What's the next action?`;
|
|
|
2914
2948
|
try {
|
|
2915
2949
|
// Send the error to the agent for fixing
|
|
2916
2950
|
display.showThinking('Analyzing build errors');
|
|
2951
|
+
this.refreshStatusLine(true);
|
|
2917
2952
|
const response = await this.agent.send(prompt, true);
|
|
2918
2953
|
display.stopThinking();
|
|
2954
|
+
this.refreshStatusLine(true);
|
|
2919
2955
|
if (response) {
|
|
2920
2956
|
display.showAssistantMessage(response, { isFinal: true });
|
|
2921
2957
|
}
|
|
@@ -2965,18 +3001,16 @@ What's the next action?`;
|
|
|
2965
3001
|
display.showAssistantMessage(finalContent, enriched);
|
|
2966
3002
|
}
|
|
2967
3003
|
}
|
|
2968
|
-
//
|
|
3004
|
+
// Status shown in mode controls bar - no separate status line needed
|
|
2969
3005
|
display.stopThinking();
|
|
2970
|
-
//
|
|
2971
|
-
let contextInfo;
|
|
3006
|
+
// Update context usage for mode controls display
|
|
2972
3007
|
if (enriched.contextWindowTokens && metadata.usage) {
|
|
2973
3008
|
const total = this.totalTokens(metadata.usage);
|
|
2974
3009
|
if (total && total > 0) {
|
|
2975
3010
|
const percentage = Math.round((total / enriched.contextWindowTokens) * 100);
|
|
2976
|
-
|
|
3011
|
+
this.updateContextUsage(percentage);
|
|
2977
3012
|
}
|
|
2978
3013
|
}
|
|
2979
|
-
display.showStatusLine('Ready for prompts', enriched.elapsedMs, contextInfo);
|
|
2980
3014
|
// Auto-verify changes: build first (catches type errors), then tests
|
|
2981
3015
|
void this.enforceAutoBuild('final-response');
|
|
2982
3016
|
void this.enforceAutoTests('final-response');
|
|
@@ -3046,7 +3080,6 @@ What's the next action?`;
|
|
|
3046
3080
|
this.stopStreamingHeartbeat();
|
|
3047
3081
|
this.updateStatusMessage(null);
|
|
3048
3082
|
this.terminalInput.setStreaming(false);
|
|
3049
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
3050
3083
|
this.terminalInput.render();
|
|
3051
3084
|
},
|
|
3052
3085
|
onVerificationNeeded: () => {
|
|
@@ -3083,7 +3116,6 @@ What's the next action?`;
|
|
|
3083
3116
|
resetChatBoxAfterModelSwap() {
|
|
3084
3117
|
this.updateStatusMessage(null);
|
|
3085
3118
|
this.terminalInput.setStreaming(false);
|
|
3086
|
-
this.terminalInput.setContentEndRow(display.getTotalWrittenLines());
|
|
3087
3119
|
this.terminalInput.render();
|
|
3088
3120
|
this.ensureReadlineReady();
|
|
3089
3121
|
}
|
|
@@ -3148,9 +3180,14 @@ What's the next action?`;
|
|
|
3148
3180
|
return null;
|
|
3149
3181
|
}
|
|
3150
3182
|
const usageRatio = total / windowTokens;
|
|
3183
|
+
this.latestTokenUsage = {
|
|
3184
|
+
used: total,
|
|
3185
|
+
limit: windowTokens,
|
|
3186
|
+
};
|
|
3151
3187
|
// Always update context usage in the UI
|
|
3152
3188
|
const percentUsed = Math.round(usageRatio * 100);
|
|
3153
3189
|
this.updateContextUsage(percentUsed);
|
|
3190
|
+
this.refreshStatusLine(true);
|
|
3154
3191
|
if (usageRatio < CONTEXT_USAGE_THRESHOLD) {
|
|
3155
3192
|
return null;
|
|
3156
3193
|
}
|