erosolar-cli 1.7.284 → 1.7.285
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -24
- package/dist/alpha-zero/agentWrapper.d.ts +84 -0
- package/dist/alpha-zero/agentWrapper.d.ts.map +1 -0
- package/dist/alpha-zero/agentWrapper.js +171 -0
- package/dist/alpha-zero/agentWrapper.js.map +1 -0
- package/dist/alpha-zero/codeEvaluator.d.ts +25 -0
- package/dist/alpha-zero/codeEvaluator.d.ts.map +1 -0
- package/dist/alpha-zero/codeEvaluator.js +273 -0
- package/dist/alpha-zero/codeEvaluator.js.map +1 -0
- package/dist/alpha-zero/competitiveRunner.d.ts +66 -0
- package/dist/alpha-zero/competitiveRunner.d.ts.map +1 -0
- package/dist/alpha-zero/competitiveRunner.js +224 -0
- package/dist/alpha-zero/competitiveRunner.js.map +1 -0
- package/dist/alpha-zero/index.d.ts +67 -0
- package/dist/alpha-zero/index.d.ts.map +1 -0
- package/dist/alpha-zero/index.js +99 -0
- package/dist/alpha-zero/index.js.map +1 -0
- package/dist/alpha-zero/introspection.d.ts +128 -0
- package/dist/alpha-zero/introspection.d.ts.map +1 -0
- package/dist/alpha-zero/introspection.js +300 -0
- package/dist/alpha-zero/introspection.js.map +1 -0
- package/dist/alpha-zero/metricsTracker.d.ts +71 -0
- package/dist/alpha-zero/metricsTracker.d.ts.map +1 -0
- package/dist/{core → alpha-zero}/metricsTracker.js +5 -2
- package/dist/alpha-zero/metricsTracker.js.map +1 -0
- package/dist/alpha-zero/security/core.d.ts +125 -0
- package/dist/alpha-zero/security/core.d.ts.map +1 -0
- package/dist/alpha-zero/security/core.js +271 -0
- package/dist/alpha-zero/security/core.js.map +1 -0
- package/dist/alpha-zero/security/google.d.ts +125 -0
- package/dist/alpha-zero/security/google.d.ts.map +1 -0
- package/dist/alpha-zero/security/google.js +311 -0
- package/dist/alpha-zero/security/google.js.map +1 -0
- package/dist/alpha-zero/security/googleLoader.d.ts +17 -0
- package/dist/alpha-zero/security/googleLoader.d.ts.map +1 -0
- package/dist/alpha-zero/security/googleLoader.js +41 -0
- package/dist/alpha-zero/security/googleLoader.js.map +1 -0
- package/dist/alpha-zero/security/index.d.ts +29 -0
- package/dist/alpha-zero/security/index.d.ts.map +1 -0
- package/dist/alpha-zero/security/index.js +32 -0
- package/dist/alpha-zero/security/index.js.map +1 -0
- package/dist/alpha-zero/security/simulation.d.ts +124 -0
- package/dist/alpha-zero/security/simulation.d.ts.map +1 -0
- package/dist/alpha-zero/security/simulation.js +277 -0
- package/dist/alpha-zero/security/simulation.js.map +1 -0
- package/dist/alpha-zero/selfModification.d.ts +109 -0
- package/dist/alpha-zero/selfModification.d.ts.map +1 -0
- package/dist/alpha-zero/selfModification.js +233 -0
- package/dist/alpha-zero/selfModification.js.map +1 -0
- package/dist/alpha-zero/types.d.ts +170 -0
- package/dist/alpha-zero/types.d.ts.map +1 -0
- package/dist/alpha-zero/types.js +31 -0
- package/dist/alpha-zero/types.js.map +1 -0
- package/dist/bin/erosolar.js +0 -1
- package/dist/bin/erosolar.js.map +1 -1
- package/dist/capabilities/agentSpawningCapability.d.ts.map +1 -1
- package/dist/capabilities/agentSpawningCapability.js +31 -56
- package/dist/capabilities/agentSpawningCapability.js.map +1 -1
- package/dist/capabilities/securityTestingCapability.d.ts +13 -0
- package/dist/capabilities/securityTestingCapability.d.ts.map +1 -0
- package/dist/capabilities/securityTestingCapability.js +25 -0
- package/dist/capabilities/securityTestingCapability.js.map +1 -0
- package/dist/contracts/agent-schemas.json +15 -0
- package/dist/contracts/tools.schema.json +9 -0
- package/dist/core/agent.d.ts +2 -2
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js.map +1 -1
- package/dist/core/aiFlowOptimizer.d.ts +26 -0
- package/dist/core/aiFlowOptimizer.d.ts.map +1 -0
- package/dist/core/aiFlowOptimizer.js +31 -0
- package/dist/core/aiFlowOptimizer.js.map +1 -0
- package/dist/core/aiOptimizationEngine.d.ts +158 -0
- package/dist/core/aiOptimizationEngine.d.ts.map +1 -0
- package/dist/core/aiOptimizationEngine.js +428 -0
- package/dist/core/aiOptimizationEngine.js.map +1 -0
- package/dist/core/aiOptimizationIntegration.d.ts +93 -0
- package/dist/core/aiOptimizationIntegration.d.ts.map +1 -0
- package/dist/core/aiOptimizationIntegration.js +250 -0
- package/dist/core/aiOptimizationIntegration.js.map +1 -0
- package/dist/core/customCommands.d.ts +0 -1
- package/dist/core/customCommands.d.ts.map +1 -1
- package/dist/core/customCommands.js +0 -3
- package/dist/core/customCommands.js.map +1 -1
- package/dist/core/enhancedErrorRecovery.d.ts +100 -0
- package/dist/core/enhancedErrorRecovery.d.ts.map +1 -0
- package/dist/core/enhancedErrorRecovery.js +345 -0
- package/dist/core/enhancedErrorRecovery.js.map +1 -0
- package/dist/core/hooksSystem.d.ts +65 -0
- package/dist/core/hooksSystem.d.ts.map +1 -0
- package/dist/core/hooksSystem.js +273 -0
- package/dist/core/hooksSystem.js.map +1 -0
- package/dist/core/memorySystem.d.ts +48 -0
- package/dist/core/memorySystem.d.ts.map +1 -0
- package/dist/core/memorySystem.js +271 -0
- package/dist/core/memorySystem.js.map +1 -0
- package/dist/core/toolPreconditions.d.ts.map +1 -1
- package/dist/core/toolPreconditions.js +14 -0
- package/dist/core/toolPreconditions.js.map +1 -1
- package/dist/core/toolRuntime.d.ts +1 -22
- package/dist/core/toolRuntime.d.ts.map +1 -1
- package/dist/core/toolRuntime.js +5 -0
- package/dist/core/toolRuntime.js.map +1 -1
- package/dist/core/toolValidation.d.ts.map +1 -1
- package/dist/core/toolValidation.js +3 -14
- package/dist/core/toolValidation.js.map +1 -1
- package/dist/core/unified/errors.d.ts +189 -0
- package/dist/core/unified/errors.d.ts.map +1 -0
- package/dist/core/unified/errors.js +497 -0
- package/dist/core/unified/errors.js.map +1 -0
- package/dist/core/unified/index.d.ts +19 -0
- package/dist/core/unified/index.d.ts.map +1 -0
- package/dist/core/unified/index.js +68 -0
- package/dist/core/unified/index.js.map +1 -0
- package/dist/core/unified/schema.d.ts +101 -0
- package/dist/core/unified/schema.d.ts.map +1 -0
- package/dist/core/unified/schema.js +350 -0
- package/dist/core/unified/schema.js.map +1 -0
- package/dist/core/unified/toolRuntime.d.ts +179 -0
- package/dist/core/unified/toolRuntime.d.ts.map +1 -0
- package/dist/core/unified/toolRuntime.js +517 -0
- package/dist/core/unified/toolRuntime.js.map +1 -0
- package/dist/core/unified/tools.d.ts +127 -0
- package/dist/core/unified/tools.d.ts.map +1 -0
- package/dist/core/unified/tools.js +1333 -0
- package/dist/core/unified/tools.js.map +1 -0
- package/dist/core/unified/types.d.ts +352 -0
- package/dist/core/unified/types.d.ts.map +1 -0
- package/dist/core/unified/types.js +12 -0
- package/dist/core/unified/types.js.map +1 -0
- package/dist/core/unified/version.d.ts +209 -0
- package/dist/core/unified/version.d.ts.map +1 -0
- package/dist/core/unified/version.js +454 -0
- package/dist/core/unified/version.js.map +1 -0
- package/dist/core/validationRunner.d.ts +3 -1
- package/dist/core/validationRunner.d.ts.map +1 -1
- package/dist/core/validationRunner.js.map +1 -1
- package/dist/headless/headlessApp.d.ts.map +1 -1
- package/dist/headless/headlessApp.js +0 -21
- package/dist/headless/headlessApp.js.map +1 -1
- package/dist/mcp/sseClient.d.ts.map +1 -1
- package/dist/mcp/sseClient.js +18 -9
- package/dist/mcp/sseClient.js.map +1 -1
- package/dist/plugins/tools/build/buildPlugin.d.ts +6 -0
- package/dist/plugins/tools/build/buildPlugin.d.ts.map +1 -1
- package/dist/plugins/tools/build/buildPlugin.js +10 -4
- package/dist/plugins/tools/build/buildPlugin.js.map +1 -1
- package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
- package/dist/plugins/tools/nodeDefaults.js +2 -0
- package/dist/plugins/tools/nodeDefaults.js.map +1 -1
- package/dist/plugins/tools/security/securityPlugin.d.ts +3 -0
- package/dist/plugins/tools/security/securityPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/security/securityPlugin.js +12 -0
- package/dist/plugins/tools/security/securityPlugin.js.map +1 -0
- package/dist/runtime/agentSession.d.ts +2 -2
- package/dist/runtime/agentSession.d.ts.map +1 -1
- package/dist/runtime/agentSession.js +2 -2
- package/dist/runtime/agentSession.js.map +1 -1
- package/dist/security/active-stack-security.d.ts +112 -0
- package/dist/security/active-stack-security.d.ts.map +1 -0
- package/dist/security/active-stack-security.js +296 -0
- package/dist/security/active-stack-security.js.map +1 -0
- package/dist/security/advanced-persistence-research.d.ts +92 -0
- package/dist/security/advanced-persistence-research.d.ts.map +1 -0
- package/dist/security/advanced-persistence-research.js +195 -0
- package/dist/security/advanced-persistence-research.js.map +1 -0
- package/dist/security/advanced-targeting.d.ts +119 -0
- package/dist/security/advanced-targeting.d.ts.map +1 -0
- package/dist/security/advanced-targeting.js +233 -0
- package/dist/security/advanced-targeting.js.map +1 -0
- package/dist/security/assessment/vulnerabilityAssessment.d.ts +104 -0
- package/dist/security/assessment/vulnerabilityAssessment.d.ts.map +1 -0
- package/dist/security/assessment/vulnerabilityAssessment.js +315 -0
- package/dist/security/assessment/vulnerabilityAssessment.js.map +1 -0
- package/dist/security/authorization/securityAuthorization.d.ts +88 -0
- package/dist/security/authorization/securityAuthorization.d.ts.map +1 -0
- package/dist/security/authorization/securityAuthorization.js +172 -0
- package/dist/security/authorization/securityAuthorization.js.map +1 -0
- package/dist/security/comprehensive-targeting.d.ts +85 -0
- package/dist/security/comprehensive-targeting.d.ts.map +1 -0
- package/dist/security/comprehensive-targeting.js +438 -0
- package/dist/security/comprehensive-targeting.js.map +1 -0
- package/dist/security/global-security-integration.d.ts +91 -0
- package/dist/security/global-security-integration.d.ts.map +1 -0
- package/dist/security/global-security-integration.js +218 -0
- package/dist/security/global-security-integration.js.map +1 -0
- package/dist/security/index.d.ts +38 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +47 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/persistence-analyzer.d.ts +56 -0
- package/dist/security/persistence-analyzer.d.ts.map +1 -0
- package/dist/security/persistence-analyzer.js +187 -0
- package/dist/security/persistence-analyzer.js.map +1 -0
- package/dist/security/persistence-cli.d.ts +36 -0
- package/dist/security/persistence-cli.d.ts.map +1 -0
- package/dist/security/persistence-cli.js +160 -0
- package/dist/security/persistence-cli.js.map +1 -0
- package/dist/security/persistence-research.d.ts +92 -0
- package/dist/security/persistence-research.d.ts.map +1 -0
- package/dist/security/persistence-research.js +364 -0
- package/dist/security/persistence-research.js.map +1 -0
- package/dist/security/research/persistenceResearch.d.ts +97 -0
- package/dist/security/research/persistenceResearch.d.ts.map +1 -0
- package/dist/security/research/persistenceResearch.js +282 -0
- package/dist/security/research/persistenceResearch.js.map +1 -0
- package/dist/security/security-integration.d.ts +74 -0
- package/dist/security/security-integration.d.ts.map +1 -0
- package/dist/security/security-integration.js +137 -0
- package/dist/security/security-integration.js.map +1 -0
- package/dist/security/security-testing-framework.d.ts +112 -0
- package/dist/security/security-testing-framework.d.ts.map +1 -0
- package/dist/security/security-testing-framework.js +364 -0
- package/dist/security/security-testing-framework.js.map +1 -0
- package/dist/security/simulation/attackSimulation.d.ts +93 -0
- package/dist/security/simulation/attackSimulation.d.ts.map +1 -0
- package/dist/security/simulation/attackSimulation.js +341 -0
- package/dist/security/simulation/attackSimulation.js.map +1 -0
- package/dist/security/strategic-operations.d.ts +100 -0
- package/dist/security/strategic-operations.d.ts.map +1 -0
- package/dist/security/strategic-operations.js +276 -0
- package/dist/security/strategic-operations.js.map +1 -0
- package/dist/security/tool-security-wrapper.d.ts +58 -0
- package/dist/security/tool-security-wrapper.d.ts.map +1 -0
- package/dist/security/tool-security-wrapper.js +156 -0
- package/dist/security/tool-security-wrapper.js.map +1 -0
- package/dist/shell/claudeCodeStreamHandler.d.ts +145 -0
- package/dist/shell/claudeCodeStreamHandler.d.ts.map +1 -0
- package/dist/shell/claudeCodeStreamHandler.js +322 -0
- package/dist/shell/claudeCodeStreamHandler.js.map +1 -0
- package/dist/shell/inputQueueManager.d.ts +144 -0
- package/dist/shell/inputQueueManager.d.ts.map +1 -0
- package/dist/shell/inputQueueManager.js +290 -0
- package/dist/shell/inputQueueManager.js.map +1 -0
- package/dist/shell/interactiveShell.d.ts +7 -22
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +159 -226
- package/dist/shell/interactiveShell.js.map +1 -1
- package/dist/shell/metricsTracker.d.ts +60 -0
- package/dist/shell/metricsTracker.d.ts.map +1 -0
- package/dist/shell/metricsTracker.js +119 -0
- package/dist/shell/metricsTracker.js.map +1 -0
- package/dist/shell/shellApp.d.ts +0 -2
- package/dist/shell/shellApp.d.ts.map +1 -1
- package/dist/shell/shellApp.js +9 -40
- package/dist/shell/shellApp.js.map +1 -1
- package/dist/shell/streamingOutputManager.d.ts +115 -0
- package/dist/shell/streamingOutputManager.d.ts.map +1 -0
- package/dist/shell/streamingOutputManager.js +225 -0
- package/dist/shell/streamingOutputManager.js.map +1 -0
- package/dist/shell/systemPrompt.d.ts.map +1 -1
- package/dist/shell/systemPrompt.js +4 -1
- package/dist/shell/systemPrompt.js.map +1 -1
- package/dist/shell/terminalInput.d.ts +186 -78
- package/dist/shell/terminalInput.d.ts.map +1 -1
- package/dist/shell/terminalInput.js +927 -496
- package/dist/shell/terminalInput.js.map +1 -1
- package/dist/shell/terminalInputAdapter.d.ts +35 -28
- package/dist/shell/terminalInputAdapter.d.ts.map +1 -1
- package/dist/shell/terminalInputAdapter.js +50 -26
- package/dist/shell/terminalInputAdapter.js.map +1 -1
- package/dist/subagents/taskRunner.d.ts +1 -7
- package/dist/subagents/taskRunner.d.ts.map +1 -1
- package/dist/subagents/taskRunner.js +47 -180
- package/dist/subagents/taskRunner.js.map +1 -1
- package/dist/tools/securityTools.d.ts +22 -0
- package/dist/tools/securityTools.d.ts.map +1 -0
- package/dist/tools/securityTools.js +448 -0
- package/dist/tools/securityTools.js.map +1 -0
- package/dist/ui/ShellUIAdapter.d.ts.map +1 -1
- package/dist/ui/ShellUIAdapter.js +12 -13
- package/dist/ui/ShellUIAdapter.js.map +1 -1
- package/dist/ui/display.d.ts +44 -23
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +286 -139
- package/dist/ui/display.js.map +1 -1
- package/dist/ui/persistentPrompt.d.ts +50 -0
- package/dist/ui/persistentPrompt.d.ts.map +1 -0
- package/dist/ui/persistentPrompt.js +92 -0
- package/dist/ui/persistentPrompt.js.map +1 -0
- package/dist/ui/terminalUISchema.d.ts +195 -0
- package/dist/ui/terminalUISchema.d.ts.map +1 -0
- package/dist/ui/terminalUISchema.js +113 -0
- package/dist/ui/terminalUISchema.js.map +1 -0
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js +8 -6
- package/dist/ui/theme.js.map +1 -1
- package/dist/ui/toolDisplay.d.ts +158 -0
- package/dist/ui/toolDisplay.d.ts.map +1 -1
- package/dist/ui/toolDisplay.js +348 -0
- package/dist/ui/toolDisplay.js.map +1 -1
- package/dist/ui/unified/layout.d.ts +0 -1
- package/dist/ui/unified/layout.d.ts.map +1 -1
- package/dist/ui/unified/layout.js +25 -15
- package/dist/ui/unified/layout.js.map +1 -1
- package/package.json +1 -1
- package/scripts/deploy-security-capabilities.js +178 -0
- package/dist/core/hooks.d.ts +0 -113
- package/dist/core/hooks.d.ts.map +0 -1
- package/dist/core/hooks.js +0 -267
- package/dist/core/hooks.js.map +0 -1
- package/dist/core/metricsTracker.d.ts +0 -122
- package/dist/core/metricsTracker.d.ts.map +0 -1
- package/dist/core/metricsTracker.js.map +0 -1
- package/dist/core/securityAssessment.d.ts +0 -91
- package/dist/core/securityAssessment.d.ts.map +0 -1
- package/dist/core/securityAssessment.js +0 -580
- package/dist/core/securityAssessment.js.map +0 -1
- package/dist/core/verification.d.ts +0 -137
- package/dist/core/verification.d.ts.map +0 -1
- package/dist/core/verification.js +0 -323
- package/dist/core/verification.js.map +0 -1
- package/dist/subagents/agentConfig.d.ts +0 -27
- package/dist/subagents/agentConfig.d.ts.map +0 -1
- package/dist/subagents/agentConfig.js +0 -89
- package/dist/subagents/agentConfig.js.map +0 -1
- package/dist/subagents/agentRegistry.d.ts +0 -33
- package/dist/subagents/agentRegistry.d.ts.map +0 -1
- package/dist/subagents/agentRegistry.js +0 -162
- package/dist/subagents/agentRegistry.js.map +0 -1
- package/dist/utils/frontmatter.d.ts +0 -10
- package/dist/utils/frontmatter.d.ts.map +0 -1
- package/dist/utils/frontmatter.js +0 -78
- package/dist/utils/frontmatter.js.map +0 -1
package/dist/ui/display.d.ts
CHANGED
|
@@ -18,14 +18,7 @@ interface StatusLineContextInfo {
|
|
|
18
18
|
type ActionStatus = 'pending' | 'success' | 'error' | 'info' | 'warning';
|
|
19
19
|
interface OutputInterceptor {
|
|
20
20
|
beforeWrite?: () => void;
|
|
21
|
-
afterWrite?: (
|
|
22
|
-
}
|
|
23
|
-
type CommandPaletteTone = 'info' | 'warn' | 'success' | 'muted';
|
|
24
|
-
interface CommandPaletteItem {
|
|
25
|
-
command: string;
|
|
26
|
-
description: string;
|
|
27
|
-
category?: string | null;
|
|
28
|
-
tone?: CommandPaletteTone;
|
|
21
|
+
afterWrite?: () => void;
|
|
29
22
|
}
|
|
30
23
|
/**
|
|
31
24
|
* Display class manages all terminal UI output for the application.
|
|
@@ -118,6 +111,36 @@ export declare class Display {
|
|
|
118
111
|
*/
|
|
119
112
|
getPinnedHeaderLines(): number;
|
|
120
113
|
private getColumnWidth;
|
|
114
|
+
private bannerState;
|
|
115
|
+
private bannerContext;
|
|
116
|
+
/**
|
|
117
|
+
* Stores banner information. When silent=true, only stores state without writing.
|
|
118
|
+
* The banner can then be rendered later via renderBannerToContent().
|
|
119
|
+
*
|
|
120
|
+
* @param silent If true, only store state without writing to stdout (default: true)
|
|
121
|
+
*/
|
|
122
|
+
showWelcome(profileLabel: string, profileName: string, model: string, provider: string, workingDir: string, version?: string, silent?: boolean): void;
|
|
123
|
+
/**
|
|
124
|
+
* Get the current version string (if set during showWelcome).
|
|
125
|
+
*/
|
|
126
|
+
getVersion(): string | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* Get the current banner content as a string.
|
|
129
|
+
* Used by TerminalInput to re-render the banner inside the scroll region.
|
|
130
|
+
* Returns null if no banner has been displayed yet.
|
|
131
|
+
*/
|
|
132
|
+
getBannerContent(): string | null;
|
|
133
|
+
/**
|
|
134
|
+
* Render banner directly to stdout (for unified UI re-rendering).
|
|
135
|
+
* This writes the banner without updating tracking state.
|
|
136
|
+
* Returns the number of lines written.
|
|
137
|
+
*/
|
|
138
|
+
renderBannerToContent(): number;
|
|
139
|
+
/**
|
|
140
|
+
* Updates the session information banner with new model/provider by appending
|
|
141
|
+
* a new banner entry in the scroll region (no pinned header rewriting).
|
|
142
|
+
*/
|
|
143
|
+
updateSessionInfo(model: string, provider: string): void;
|
|
121
144
|
showThinking(message?: string): void;
|
|
122
145
|
/**
|
|
123
146
|
* Format elapsed seconds as human-readable time (e.g., "5s", "1m 23s")
|
|
@@ -209,13 +232,6 @@ export declare class Display {
|
|
|
209
232
|
name: string;
|
|
210
233
|
description: string;
|
|
211
234
|
}>): void;
|
|
212
|
-
/**
|
|
213
|
-
* Show a compact launch panel of slash commands with wrapped descriptions.
|
|
214
|
-
*/
|
|
215
|
-
showCommandPalette(commands: CommandPaletteItem[], options?: {
|
|
216
|
-
title?: string;
|
|
217
|
-
intro?: string;
|
|
218
|
-
}): void;
|
|
219
235
|
/**
|
|
220
236
|
* Show ready message with keyboard shortcuts hint (compact)
|
|
221
237
|
* Note: Commands are now shown in the banner, so this is a no-op
|
|
@@ -232,7 +248,7 @@ export declare class Display {
|
|
|
232
248
|
}>): void;
|
|
233
249
|
/**
|
|
234
250
|
* Show unified status bar - Claude Code style (minimal)
|
|
235
|
-
* Note:
|
|
251
|
+
* Note: Now a no-op - status is shown in mode controls line
|
|
236
252
|
*/
|
|
237
253
|
showUnifiedStatusBar(_providers?: Array<{
|
|
238
254
|
provider: string;
|
|
@@ -241,9 +257,10 @@ export declare class Display {
|
|
|
241
257
|
error?: string;
|
|
242
258
|
}>): void;
|
|
243
259
|
/**
|
|
244
|
-
* Show streaming header
|
|
260
|
+
* Show streaming header in a unified frame with model/provider/workspace context.
|
|
261
|
+
* Keeps the streaming section visually connected to the launch banner.
|
|
245
262
|
*/
|
|
246
|
-
showStreamingHeader(
|
|
263
|
+
showStreamingHeader(options?: {
|
|
247
264
|
spaceAbove?: boolean;
|
|
248
265
|
spaceBelow?: boolean;
|
|
249
266
|
}): void;
|
|
@@ -255,17 +272,21 @@ export declare class Display {
|
|
|
255
272
|
showPlanningStep(step: string, index: number, total: number): void;
|
|
256
273
|
clear(): void;
|
|
257
274
|
newLine(): void;
|
|
275
|
+
private getBannerWidth;
|
|
276
|
+
private measureBannerHeight;
|
|
277
|
+
/**
|
|
278
|
+
* Attempts to rewrite the banner in place using terminal cursor manipulation.
|
|
279
|
+
* Returns true if successful, false if rewrite is not possible.
|
|
280
|
+
*/
|
|
281
|
+
private tryRewriteBanner;
|
|
282
|
+
private renderAndStoreBanner;
|
|
258
283
|
private formatModelLabel;
|
|
259
284
|
private compactPath;
|
|
260
285
|
private buildChatBox;
|
|
261
286
|
private resolveMessageWidth;
|
|
262
287
|
private formatTelemetryLine;
|
|
263
288
|
private formatElapsed;
|
|
264
|
-
private
|
|
265
|
-
private groupPaletteCommands;
|
|
266
|
-
private computeCommandColumnWidth;
|
|
267
|
-
private formatPaletteCategory;
|
|
268
|
-
private colorizePaletteText;
|
|
289
|
+
private buildClaudeStyleBanner;
|
|
269
290
|
/**
|
|
270
291
|
* Wraps text with a prefix on the first line and optional continuation prefix.
|
|
271
292
|
* Handles multi-line text and word wrapping intelligently.
|
package/dist/ui/display.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,KAAK,YAAY,GAAG,MAAM,CAAC,cAAc,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/display.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createSpinner } from 'nanospinner';
|
|
2
|
-
import { clearScreenDown, cursorTo } from 'node:readline';
|
|
2
|
+
import { clearScreenDown, cursorTo, moveCursor } from 'node:readline';
|
|
3
3
|
import { theme, icons } from './theme.js';
|
|
4
4
|
import { formatRichContent, renderMessagePanel, renderMessageBody } from './richText.js';
|
|
5
5
|
import { getTerminalColumns } from './layout.js';
|
|
@@ -7,7 +7,7 @@ import { highlightError } from './textHighlighter.js';
|
|
|
7
7
|
import { renderSectionHeading } from './designSystem.js';
|
|
8
8
|
import { isPlainOutputMode } from './outputMode.js';
|
|
9
9
|
import { writeLock } from './writeLock.js';
|
|
10
|
-
import { renderStatusLine } from './unified/layout.js';
|
|
10
|
+
import { renderDivider, renderSessionFrame, renderStatusLine } from './unified/layout.js';
|
|
11
11
|
import { isStreamingMode } from './globalWriteLock.js';
|
|
12
12
|
/**
|
|
13
13
|
* Output lock to prevent race conditions during spinner/stream output.
|
|
@@ -254,10 +254,10 @@ export class Display {
|
|
|
254
254
|
interceptor.beforeWrite?.();
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
|
-
notifyAfterOutput(
|
|
257
|
+
notifyAfterOutput() {
|
|
258
258
|
const interceptors = Array.from(this.outputInterceptors);
|
|
259
259
|
for (let index = interceptors.length - 1; index >= 0; index -= 1) {
|
|
260
|
-
interceptors[index]?.afterWrite?.(
|
|
260
|
+
interceptors[index]?.afterWrite?.();
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
263
|
write(value, target = this.outputStream) {
|
|
@@ -286,36 +286,29 @@ export class Display {
|
|
|
286
286
|
if (typeof content !== 'string' || !content) {
|
|
287
287
|
return;
|
|
288
288
|
}
|
|
289
|
-
//
|
|
290
|
-
//
|
|
291
|
-
const normalized = content.includes('\r')
|
|
292
|
-
? content.replace(/\r\n/g, '\n').replace(/\r/g, '\n')
|
|
293
|
-
: content;
|
|
294
|
-
// During streaming, use withLock to prevent interleaving with escape codes.
|
|
295
|
-
// This ensures the before/write/after sequence is atomic.
|
|
289
|
+
// During streaming mode, write directly without locks for smooth output
|
|
290
|
+
// StdoutLineTracker patches outputStream.write, so lines are tracked automatically
|
|
296
291
|
if (isStreamingMode()) {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
308
|
-
}, 'display.writeRaw.streaming');
|
|
292
|
+
this.notifyBeforeOutput();
|
|
293
|
+
try {
|
|
294
|
+
this.outputStream.write(content);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Ignore write failures to keep UI resilient
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
this.notifyAfterOutput();
|
|
301
|
+
}
|
|
309
302
|
return;
|
|
310
303
|
}
|
|
311
304
|
// Outside streaming mode, use locks to coordinate with other UI
|
|
312
305
|
writeLock.withLock(() => {
|
|
313
306
|
this.notifyBeforeOutput();
|
|
314
307
|
try {
|
|
315
|
-
this.write(
|
|
308
|
+
this.write(content);
|
|
316
309
|
}
|
|
317
310
|
finally {
|
|
318
|
-
this.notifyAfterOutput(
|
|
311
|
+
this.notifyAfterOutput();
|
|
319
312
|
}
|
|
320
313
|
}, 'display.writeRaw');
|
|
321
314
|
}
|
|
@@ -360,7 +353,125 @@ export class Display {
|
|
|
360
353
|
}
|
|
361
354
|
return getTerminalColumns();
|
|
362
355
|
}
|
|
363
|
-
|
|
356
|
+
bannerState = null;
|
|
357
|
+
bannerContext = null;
|
|
358
|
+
/**
|
|
359
|
+
* Stores banner information. When silent=true, only stores state without writing.
|
|
360
|
+
* The banner can then be rendered later via renderBannerToContent().
|
|
361
|
+
*
|
|
362
|
+
* @param silent If true, only store state without writing to stdout (default: true)
|
|
363
|
+
*/
|
|
364
|
+
showWelcome(profileLabel, profileName, model, provider, workingDir, version, silent = true) {
|
|
365
|
+
// Validate required inputs
|
|
366
|
+
if (!model?.trim() || !provider?.trim() || !workingDir?.trim()) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
const width = this.getBannerWidth();
|
|
370
|
+
const banner = this.buildClaudeStyleBanner(profileLabel ?? '', profileName ?? '', model, provider, workingDir, width, version);
|
|
371
|
+
if (!banner) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
const height = this.measureBannerHeight(banner);
|
|
375
|
+
this.bannerState = {
|
|
376
|
+
startLine: 0, // Will be set when actually rendered
|
|
377
|
+
height,
|
|
378
|
+
width,
|
|
379
|
+
workingDir,
|
|
380
|
+
version: version?.trim() || undefined,
|
|
381
|
+
model,
|
|
382
|
+
provider,
|
|
383
|
+
profileLabel: profileLabel ?? '',
|
|
384
|
+
profileName: profileName ?? '',
|
|
385
|
+
};
|
|
386
|
+
this.bannerContext = {
|
|
387
|
+
workingDir,
|
|
388
|
+
model,
|
|
389
|
+
provider,
|
|
390
|
+
profileLabel: profileLabel ?? '',
|
|
391
|
+
profileName: profileName ?? '',
|
|
392
|
+
version: version?.trim() || undefined,
|
|
393
|
+
};
|
|
394
|
+
// Only write to stdout if not silent
|
|
395
|
+
if (!silent) {
|
|
396
|
+
const startLine = this.stdoutTracker.totalLines;
|
|
397
|
+
this.withOutput(() => {
|
|
398
|
+
this.writeLine(banner);
|
|
399
|
+
});
|
|
400
|
+
this.bannerState.startLine = startLine;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Get the current version string (if set during showWelcome).
|
|
405
|
+
*/
|
|
406
|
+
getVersion() {
|
|
407
|
+
return this.bannerContext?.version;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Get the current banner content as a string.
|
|
411
|
+
* Used by TerminalInput to re-render the banner inside the scroll region.
|
|
412
|
+
* Returns null if no banner has been displayed yet.
|
|
413
|
+
*/
|
|
414
|
+
getBannerContent() {
|
|
415
|
+
const state = this.bannerState;
|
|
416
|
+
if (!state) {
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
const width = this.getBannerWidth();
|
|
420
|
+
return this.buildClaudeStyleBanner(state.profileLabel, state.profileName, state.model, state.provider, state.workingDir, width, state.version);
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Render banner directly to stdout (for unified UI re-rendering).
|
|
424
|
+
* This writes the banner without updating tracking state.
|
|
425
|
+
* Returns the number of lines written.
|
|
426
|
+
*/
|
|
427
|
+
renderBannerToContent() {
|
|
428
|
+
const banner = this.getBannerContent();
|
|
429
|
+
if (!banner) {
|
|
430
|
+
return 0;
|
|
431
|
+
}
|
|
432
|
+
this.withOutput(() => {
|
|
433
|
+
this.writeLine(banner);
|
|
434
|
+
});
|
|
435
|
+
return this.measureBannerHeight(banner);
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Updates the session information banner with new model/provider by appending
|
|
439
|
+
* a new banner entry in the scroll region (no pinned header rewriting).
|
|
440
|
+
*/
|
|
441
|
+
updateSessionInfo(model, provider) {
|
|
442
|
+
const state = this.bannerState;
|
|
443
|
+
if (!state) {
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
const width = this.getBannerWidth();
|
|
447
|
+
const banner = this.buildClaudeStyleBanner(state.profileLabel, state.profileName, model, provider, state.workingDir, width, state.version);
|
|
448
|
+
const height = this.measureBannerHeight(banner);
|
|
449
|
+
// If height changed or rewrite failed, do full re-render
|
|
450
|
+
if (height !== state.height || !this.tryRewriteBanner(state, banner)) {
|
|
451
|
+
this.renderAndStoreBanner(state, model, provider);
|
|
452
|
+
this.bannerContext = {
|
|
453
|
+
workingDir: state.workingDir,
|
|
454
|
+
model: state.model,
|
|
455
|
+
provider: state.provider,
|
|
456
|
+
profileLabel: state.profileLabel,
|
|
457
|
+
profileName: state.profileName,
|
|
458
|
+
version: state.version,
|
|
459
|
+
};
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
state.model = model;
|
|
463
|
+
state.provider = provider;
|
|
464
|
+
state.width = width;
|
|
465
|
+
state.height = height;
|
|
466
|
+
this.bannerContext = {
|
|
467
|
+
workingDir: state.workingDir,
|
|
468
|
+
model,
|
|
469
|
+
provider,
|
|
470
|
+
profileLabel: state.profileLabel,
|
|
471
|
+
profileName: state.profileName,
|
|
472
|
+
version: state.version,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
364
475
|
showThinking(message = 'Thinking...') {
|
|
365
476
|
// If we already have a spinner, just update its text instead of creating a new one
|
|
366
477
|
if (this.activeSpinner) {
|
|
@@ -740,23 +851,6 @@ export class Display {
|
|
|
740
851
|
// Tools are available but not listed verbosely on startup
|
|
741
852
|
// Parameter prefixed with underscore to indicate intentionally unused
|
|
742
853
|
}
|
|
743
|
-
/**
|
|
744
|
-
* Show a compact launch panel of slash commands with wrapped descriptions.
|
|
745
|
-
*/
|
|
746
|
-
showCommandPalette(commands, options) {
|
|
747
|
-
if (!commands || commands.length === 0) {
|
|
748
|
-
return;
|
|
749
|
-
}
|
|
750
|
-
const panel = this.buildCommandPalette(commands, options);
|
|
751
|
-
if (!panel.trim()) {
|
|
752
|
-
return;
|
|
753
|
-
}
|
|
754
|
-
this.withOutput(() => {
|
|
755
|
-
this.writeLine();
|
|
756
|
-
this.writeLine(panel);
|
|
757
|
-
this.writeLine();
|
|
758
|
-
});
|
|
759
|
-
}
|
|
760
854
|
/**
|
|
761
855
|
* Show ready message with keyboard shortcuts hint (compact)
|
|
762
856
|
* Note: Commands are now shown in the banner, so this is a no-op
|
|
@@ -776,16 +870,85 @@ export class Display {
|
|
|
776
870
|
}
|
|
777
871
|
/**
|
|
778
872
|
* Show unified status bar - Claude Code style (minimal)
|
|
779
|
-
* Note:
|
|
873
|
+
* Note: Now a no-op - status is shown in mode controls line
|
|
780
874
|
*/
|
|
781
875
|
showUnifiedStatusBar(_providers) {
|
|
782
|
-
|
|
876
|
+
const providers = _providers ?? [];
|
|
877
|
+
const ctx = this.bannerContext;
|
|
878
|
+
const width = Math.max(DISPLAY_CONSTANTS.MIN_ACTION_WIDTH, Math.min(this.getColumnWidth() - 2, DISPLAY_CONSTANTS.MAX_MESSAGE_WIDTH));
|
|
879
|
+
const parts = [];
|
|
880
|
+
if (ctx?.model) {
|
|
881
|
+
parts.push({ text: this.formatModelLabel(ctx.model), tone: 'info' });
|
|
882
|
+
}
|
|
883
|
+
if (ctx?.provider) {
|
|
884
|
+
const providerStatus = providers.find((p) => p.provider === ctx.provider);
|
|
885
|
+
let tone = 'muted';
|
|
886
|
+
let suffix = '';
|
|
887
|
+
if (providerStatus) {
|
|
888
|
+
tone = providerStatus.available ? 'success' : 'warn';
|
|
889
|
+
if (!providerStatus.available && providerStatus.latestModel) {
|
|
890
|
+
suffix = ` (${providerStatus.latestModel})`;
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
parts.push({ text: `@ ${ctx.provider}${suffix}`, tone });
|
|
894
|
+
}
|
|
895
|
+
if (ctx?.workingDir) {
|
|
896
|
+
parts.push({ text: this.compactPath(ctx.workingDir, Math.max(16, width - 32)), tone: 'muted' });
|
|
897
|
+
}
|
|
898
|
+
parts.push({ text: 'ready', tone: 'success' });
|
|
899
|
+
const line = renderStatusLine(parts, width);
|
|
900
|
+
this.withOutput(() => {
|
|
901
|
+
this.writeLine(renderDivider(width, 'status'));
|
|
902
|
+
this.writeLine(line);
|
|
903
|
+
this.writeLine();
|
|
904
|
+
});
|
|
783
905
|
}
|
|
784
906
|
/**
|
|
785
|
-
* Show streaming header
|
|
907
|
+
* Show streaming header in a unified frame with model/provider/workspace context.
|
|
908
|
+
* Keeps the streaming section visually connected to the launch banner.
|
|
786
909
|
*/
|
|
787
|
-
showStreamingHeader(
|
|
788
|
-
|
|
910
|
+
showStreamingHeader(options) {
|
|
911
|
+
const banner = this.bannerState;
|
|
912
|
+
const model = banner ? this.formatModelLabel(banner.model) : null;
|
|
913
|
+
const provider = banner?.provider ?? '';
|
|
914
|
+
const workspace = banner?.workingDir ?? '';
|
|
915
|
+
if (!model && !provider && !workspace) {
|
|
916
|
+
return;
|
|
917
|
+
}
|
|
918
|
+
const width = Math.min(this.getColumnWidth() - 4, DISPLAY_CONSTANTS.MAX_MESSAGE_WIDTH);
|
|
919
|
+
const spaceAbove = options?.spaceAbove ?? true;
|
|
920
|
+
const spaceBelow = options?.spaceBelow ?? true;
|
|
921
|
+
// Plain output keeps the header lightweight
|
|
922
|
+
if (isPlainOutputMode()) {
|
|
923
|
+
const label = model ? `Streaming ${model}` : 'Streaming response';
|
|
924
|
+
this.withOutput(() => {
|
|
925
|
+
if (spaceAbove) {
|
|
926
|
+
this.writeLine();
|
|
927
|
+
}
|
|
928
|
+
this.writeLine(`--- ${label} ---`);
|
|
929
|
+
if (spaceBelow) {
|
|
930
|
+
this.writeLine();
|
|
931
|
+
}
|
|
932
|
+
});
|
|
933
|
+
return;
|
|
934
|
+
}
|
|
935
|
+
const sessionFrame = renderSessionFrame({
|
|
936
|
+
profileLabel: banner?.profileLabel ?? '',
|
|
937
|
+
profileName: banner?.profileName ?? '',
|
|
938
|
+
model: model ?? '',
|
|
939
|
+
provider,
|
|
940
|
+
workspace,
|
|
941
|
+
width,
|
|
942
|
+
});
|
|
943
|
+
this.withOutput(() => {
|
|
944
|
+
if (spaceAbove) {
|
|
945
|
+
this.writeLine();
|
|
946
|
+
}
|
|
947
|
+
this.writeLine(sessionFrame);
|
|
948
|
+
if (spaceBelow) {
|
|
949
|
+
this.writeLine();
|
|
950
|
+
}
|
|
951
|
+
});
|
|
789
952
|
}
|
|
790
953
|
/**
|
|
791
954
|
* Show model commands help
|
|
@@ -850,14 +1013,78 @@ export class Display {
|
|
|
850
1013
|
}
|
|
851
1014
|
});
|
|
852
1015
|
this.stdoutTracker.reset();
|
|
853
|
-
|
|
1016
|
+
if (this.bannerState) {
|
|
1017
|
+
this.renderAndStoreBanner(this.bannerState, this.bannerState.model, this.bannerState.provider);
|
|
1018
|
+
}
|
|
854
1019
|
}
|
|
855
1020
|
newLine() {
|
|
856
1021
|
this.withOutput(() => {
|
|
857
1022
|
this.writeLine();
|
|
858
1023
|
});
|
|
859
1024
|
}
|
|
860
|
-
|
|
1025
|
+
getBannerWidth() {
|
|
1026
|
+
const availableColumns = this.getColumnWidth();
|
|
1027
|
+
const effectiveWidth = Math.max(DISPLAY_CONSTANTS.MIN_BANNER_WIDTH, availableColumns - DISPLAY_CONSTANTS.BANNER_PADDING);
|
|
1028
|
+
return Math.min(Math.max(effectiveWidth, DISPLAY_CONSTANTS.MIN_BANNER_WIDTH), DISPLAY_CONSTANTS.MAX_BANNER_WIDTH);
|
|
1029
|
+
}
|
|
1030
|
+
measureBannerHeight(banner) {
|
|
1031
|
+
if (!banner) {
|
|
1032
|
+
return 0;
|
|
1033
|
+
}
|
|
1034
|
+
return banner.split('\n').length;
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* Attempts to rewrite the banner in place using terminal cursor manipulation.
|
|
1038
|
+
* Returns true if successful, false if rewrite is not possible.
|
|
1039
|
+
*/
|
|
1040
|
+
tryRewriteBanner(state, banner) {
|
|
1041
|
+
if (!this.outputStream.isTTY) {
|
|
1042
|
+
return false;
|
|
1043
|
+
}
|
|
1044
|
+
if (!banner || state.height <= 0) {
|
|
1045
|
+
return false;
|
|
1046
|
+
}
|
|
1047
|
+
const linesWritten = this.stdoutTracker.totalLines;
|
|
1048
|
+
const linesAfterBanner = linesWritten - (state.startLine + state.height);
|
|
1049
|
+
if (linesAfterBanner < 0) {
|
|
1050
|
+
return false;
|
|
1051
|
+
}
|
|
1052
|
+
const totalOffset = linesAfterBanner + state.height;
|
|
1053
|
+
const maxRows = this.outputStream.rows;
|
|
1054
|
+
if (typeof maxRows === 'number' && maxRows > 0 && totalOffset > maxRows) {
|
|
1055
|
+
return false;
|
|
1056
|
+
}
|
|
1057
|
+
try {
|
|
1058
|
+
this.withOutput(() => {
|
|
1059
|
+
moveCursor(this.outputStream, 0, -totalOffset);
|
|
1060
|
+
cursorTo(this.outputStream, 0);
|
|
1061
|
+
this.stdoutTracker.withSuspended(() => {
|
|
1062
|
+
this.outputStream.write(`${banner}\n`);
|
|
1063
|
+
});
|
|
1064
|
+
if (linesAfterBanner > 0) {
|
|
1065
|
+
moveCursor(this.outputStream, 0, linesAfterBanner);
|
|
1066
|
+
}
|
|
1067
|
+
cursorTo(this.outputStream, 0);
|
|
1068
|
+
});
|
|
1069
|
+
return true;
|
|
1070
|
+
}
|
|
1071
|
+
catch {
|
|
1072
|
+
return false;
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
renderAndStoreBanner(state, model, provider) {
|
|
1076
|
+
const width = this.getBannerWidth();
|
|
1077
|
+
const banner = this.buildClaudeStyleBanner(state.profileLabel, state.profileName, model, provider, state.workingDir, width, state.version);
|
|
1078
|
+
const startLine = this.stdoutTracker.totalLines;
|
|
1079
|
+
this.withOutput(() => {
|
|
1080
|
+
this.writeLine(banner);
|
|
1081
|
+
});
|
|
1082
|
+
state.startLine = startLine;
|
|
1083
|
+
state.height = this.measureBannerHeight(banner);
|
|
1084
|
+
state.width = width;
|
|
1085
|
+
state.model = model;
|
|
1086
|
+
state.provider = provider;
|
|
1087
|
+
}
|
|
861
1088
|
formatModelLabel(model) {
|
|
862
1089
|
if (/gpt-5\.1-?codex/i.test(model)) {
|
|
863
1090
|
return model;
|
|
@@ -955,96 +1182,16 @@ export class Display {
|
|
|
955
1182
|
}
|
|
956
1183
|
return `${seconds}s`;
|
|
957
1184
|
}
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
const title = options?.title ?? 'Slash commands';
|
|
968
|
-
const intro = options?.intro ?? 'Describe a task or pick a command below:';
|
|
969
|
-
const lines = [];
|
|
970
|
-
lines.push(theme.gradient.primary(title));
|
|
971
|
-
const introLines = this.wrapLine(intro, width);
|
|
972
|
-
for (const line of introLines) {
|
|
973
|
-
lines.push(theme.ui.muted(line));
|
|
974
|
-
}
|
|
975
|
-
lines.push('');
|
|
976
|
-
grouped.forEach(({ category, items }, index) => {
|
|
977
|
-
const label = this.formatPaletteCategory(category);
|
|
978
|
-
if (label) {
|
|
979
|
-
lines.push(theme.bold(label));
|
|
980
|
-
}
|
|
981
|
-
for (const item of items) {
|
|
982
|
-
const wrappedDesc = this.wrapLine(item.description, descWidth);
|
|
983
|
-
const paddedCommand = item.command.padEnd(commandWidth);
|
|
984
|
-
const commandLabel = theme.primary(paddedCommand);
|
|
985
|
-
const firstLine = wrappedDesc[0] ?? '';
|
|
986
|
-
lines.push(`${indent}${commandLabel} ${this.colorizePaletteText(firstLine, item.tone)}`);
|
|
987
|
-
for (const extra of wrappedDesc.slice(1)) {
|
|
988
|
-
lines.push(`${indent}${' '.repeat(commandWidth)} ${this.colorizePaletteText(extra, item.tone)}`);
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
if (index < grouped.length - 1) {
|
|
992
|
-
lines.push('');
|
|
993
|
-
}
|
|
1185
|
+
buildClaudeStyleBanner(_profileLabel, _profileName, model, provider, workingDir, _width, version) {
|
|
1186
|
+
return renderSessionFrame({
|
|
1187
|
+
profileLabel: _profileLabel,
|
|
1188
|
+
profileName: _profileName,
|
|
1189
|
+
model: this.formatModelLabel(model),
|
|
1190
|
+
provider,
|
|
1191
|
+
workspace: workingDir,
|
|
1192
|
+
version,
|
|
1193
|
+
width: _width,
|
|
994
1194
|
});
|
|
995
|
-
return lines.join('\n').trimEnd();
|
|
996
|
-
}
|
|
997
|
-
groupPaletteCommands(commands) {
|
|
998
|
-
const FALLBACK = 'other';
|
|
999
|
-
const groups = new Map();
|
|
1000
|
-
for (const item of commands) {
|
|
1001
|
-
const key = (item.category ?? FALLBACK).toLowerCase();
|
|
1002
|
-
const bucket = groups.get(key) ?? [];
|
|
1003
|
-
bucket.push(item);
|
|
1004
|
-
groups.set(key, bucket);
|
|
1005
|
-
}
|
|
1006
|
-
const order = ['configuration', 'workspace', 'diagnostics', 'other'];
|
|
1007
|
-
const orderedKeys = [
|
|
1008
|
-
...order.filter((key) => groups.has(key)),
|
|
1009
|
-
...Array.from(groups.keys()).filter((key) => !order.includes(key)),
|
|
1010
|
-
];
|
|
1011
|
-
return orderedKeys.map((category) => ({ category, items: groups.get(category) ?? [] }));
|
|
1012
|
-
}
|
|
1013
|
-
computeCommandColumnWidth(commands, totalWidth, indentWidth) {
|
|
1014
|
-
const longest = commands.reduce((max, item) => Math.max(max, this.visibleLength(item.command)), 0);
|
|
1015
|
-
const maxAllowed = Math.max(12, Math.min(longest + 2, Math.floor(totalWidth * 0.35)));
|
|
1016
|
-
const budget = Math.max(10, totalWidth - indentWidth - DISPLAY_CONSTANTS.MIN_WRAP_WIDTH);
|
|
1017
|
-
return Math.min(maxAllowed, budget);
|
|
1018
|
-
}
|
|
1019
|
-
formatPaletteCategory(category) {
|
|
1020
|
-
if (!category) {
|
|
1021
|
-
return 'Other';
|
|
1022
|
-
}
|
|
1023
|
-
switch (category.toLowerCase()) {
|
|
1024
|
-
case 'configuration':
|
|
1025
|
-
return 'Configuration';
|
|
1026
|
-
case 'workspace':
|
|
1027
|
-
return 'Workspace';
|
|
1028
|
-
case 'diagnostics':
|
|
1029
|
-
return 'Diagnostics';
|
|
1030
|
-
case 'other':
|
|
1031
|
-
return 'Other';
|
|
1032
|
-
default:
|
|
1033
|
-
return category[0]?.toUpperCase() + category.slice(1);
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
colorizePaletteText(text, tone) {
|
|
1037
|
-
switch (tone) {
|
|
1038
|
-
case 'warn':
|
|
1039
|
-
return theme.warning(text);
|
|
1040
|
-
case 'success':
|
|
1041
|
-
return theme.success(text);
|
|
1042
|
-
case 'info':
|
|
1043
|
-
return theme.info(text);
|
|
1044
|
-
case 'muted':
|
|
1045
|
-
default:
|
|
1046
|
-
return theme.ui.muted(text);
|
|
1047
|
-
}
|
|
1048
1195
|
}
|
|
1049
1196
|
/**
|
|
1050
1197
|
* Wraps text with a prefix on the first line and optional continuation prefix.
|