erosolar-cli 1.7.337 → 1.7.338
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 +21 -5
- 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 -16
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +166 -235
- 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 +118 -149
- package/dist/shell/terminalInput.d.ts.map +1 -1
- package/dist/shell/terminalInput.js +537 -639
- package/dist/shell/terminalInput.js.map +1 -1
- package/dist/shell/terminalInputAdapter.d.ts +21 -79
- package/dist/shell/terminalInputAdapter.d.ts.map +1 -1
- package/dist/shell/terminalInputAdapter.js +30 -99
- package/dist/shell/terminalInputAdapter.js.map +1 -1
- package/dist/subagents/taskRunner.d.ts +1 -7
- package/dist/subagents/taskRunner.d.ts.map +1 -1
- package/dist/subagents/taskRunner.js +47 -180
- package/dist/subagents/taskRunner.js.map +1 -1
- package/dist/tools/securityTools.d.ts +22 -0
- package/dist/tools/securityTools.d.ts.map +1 -0
- package/dist/tools/securityTools.js +448 -0
- package/dist/tools/securityTools.js.map +1 -0
- package/dist/ui/ShellUIAdapter.d.ts.map +1 -1
- package/dist/ui/ShellUIAdapter.js +12 -13
- package/dist/ui/ShellUIAdapter.js.map +1 -1
- package/dist/ui/display.d.ts +45 -24
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +259 -140
- package/dist/ui/display.js.map +1 -1
- package/dist/ui/persistentPrompt.d.ts +50 -0
- package/dist/ui/persistentPrompt.d.ts.map +1 -0
- package/dist/ui/persistentPrompt.js +92 -0
- package/dist/ui/persistentPrompt.js.map +1 -0
- package/dist/ui/terminalUISchema.d.ts +195 -0
- package/dist/ui/terminalUISchema.d.ts.map +1 -0
- package/dist/ui/terminalUISchema.js +113 -0
- package/dist/ui/terminalUISchema.js.map +1 -0
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js +8 -6
- package/dist/ui/theme.js.map +1 -1
- package/dist/ui/toolDisplay.d.ts +158 -0
- package/dist/ui/toolDisplay.d.ts.map +1 -1
- package/dist/ui/toolDisplay.js +348 -0
- package/dist/ui/toolDisplay.js.map +1 -1
- package/dist/ui/unified/layout.d.ts +0 -1
- package/dist/ui/unified/layout.d.ts.map +1 -1
- package/dist/ui/unified/layout.js +25 -15
- package/dist/ui/unified/layout.js.map +1 -1
- package/package.json +4 -4
- 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
|
|
@@ -231,8 +247,8 @@ export declare class Display {
|
|
|
231
247
|
error?: string;
|
|
232
248
|
}>): void;
|
|
233
249
|
/**
|
|
234
|
-
* Show unified status bar -
|
|
235
|
-
*
|
|
250
|
+
* Show unified status bar - Now a no-op.
|
|
251
|
+
* Status is shown in the inline input area's 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 { 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
|
|
@@ -775,17 +869,58 @@ export class Display {
|
|
|
775
869
|
// Claude Code style: don't show providers on startup, keep it minimal
|
|
776
870
|
}
|
|
777
871
|
/**
|
|
778
|
-
* Show unified status bar -
|
|
779
|
-
*
|
|
872
|
+
* Show unified status bar - Now a no-op.
|
|
873
|
+
* Status is shown in the inline input area's mode controls line.
|
|
780
874
|
*/
|
|
781
875
|
showUnifiedStatusBar(_providers) {
|
|
782
|
-
// No-op
|
|
876
|
+
// No-op: Status is shown in the inline input area's mode controls line
|
|
783
877
|
}
|
|
784
878
|
/**
|
|
785
|
-
* Show streaming header
|
|
879
|
+
* Show streaming header in a unified frame with model/provider/workspace context.
|
|
880
|
+
* Keeps the streaming section visually connected to the launch banner.
|
|
786
881
|
*/
|
|
787
|
-
showStreamingHeader(
|
|
788
|
-
|
|
882
|
+
showStreamingHeader(options) {
|
|
883
|
+
const banner = this.bannerState;
|
|
884
|
+
const model = banner ? this.formatModelLabel(banner.model) : null;
|
|
885
|
+
const provider = banner?.provider ?? '';
|
|
886
|
+
const workspace = banner?.workingDir ?? '';
|
|
887
|
+
if (!model && !provider && !workspace) {
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
const width = Math.min(this.getColumnWidth() - 4, DISPLAY_CONSTANTS.MAX_MESSAGE_WIDTH);
|
|
891
|
+
const spaceAbove = options?.spaceAbove ?? true;
|
|
892
|
+
const spaceBelow = options?.spaceBelow ?? true;
|
|
893
|
+
// Plain output keeps the header lightweight
|
|
894
|
+
if (isPlainOutputMode()) {
|
|
895
|
+
const label = model ? `Streaming ${model}` : 'Streaming response';
|
|
896
|
+
this.withOutput(() => {
|
|
897
|
+
if (spaceAbove) {
|
|
898
|
+
this.writeLine();
|
|
899
|
+
}
|
|
900
|
+
this.writeLine(`--- ${label} ---`);
|
|
901
|
+
if (spaceBelow) {
|
|
902
|
+
this.writeLine();
|
|
903
|
+
}
|
|
904
|
+
});
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
const sessionFrame = renderSessionFrame({
|
|
908
|
+
profileLabel: banner?.profileLabel ?? '',
|
|
909
|
+
profileName: banner?.profileName ?? '',
|
|
910
|
+
model: model ?? '',
|
|
911
|
+
provider,
|
|
912
|
+
workspace,
|
|
913
|
+
width,
|
|
914
|
+
});
|
|
915
|
+
this.withOutput(() => {
|
|
916
|
+
if (spaceAbove) {
|
|
917
|
+
this.writeLine();
|
|
918
|
+
}
|
|
919
|
+
this.writeLine(sessionFrame);
|
|
920
|
+
if (spaceBelow) {
|
|
921
|
+
this.writeLine();
|
|
922
|
+
}
|
|
923
|
+
});
|
|
789
924
|
}
|
|
790
925
|
/**
|
|
791
926
|
* Show model commands help
|
|
@@ -850,14 +985,78 @@ export class Display {
|
|
|
850
985
|
}
|
|
851
986
|
});
|
|
852
987
|
this.stdoutTracker.reset();
|
|
853
|
-
|
|
988
|
+
if (this.bannerState) {
|
|
989
|
+
this.renderAndStoreBanner(this.bannerState, this.bannerState.model, this.bannerState.provider);
|
|
990
|
+
}
|
|
854
991
|
}
|
|
855
992
|
newLine() {
|
|
856
993
|
this.withOutput(() => {
|
|
857
994
|
this.writeLine();
|
|
858
995
|
});
|
|
859
996
|
}
|
|
860
|
-
|
|
997
|
+
getBannerWidth() {
|
|
998
|
+
const availableColumns = this.getColumnWidth();
|
|
999
|
+
const effectiveWidth = Math.max(DISPLAY_CONSTANTS.MIN_BANNER_WIDTH, availableColumns - DISPLAY_CONSTANTS.BANNER_PADDING);
|
|
1000
|
+
return Math.min(Math.max(effectiveWidth, DISPLAY_CONSTANTS.MIN_BANNER_WIDTH), DISPLAY_CONSTANTS.MAX_BANNER_WIDTH);
|
|
1001
|
+
}
|
|
1002
|
+
measureBannerHeight(banner) {
|
|
1003
|
+
if (!banner) {
|
|
1004
|
+
return 0;
|
|
1005
|
+
}
|
|
1006
|
+
return banner.split('\n').length;
|
|
1007
|
+
}
|
|
1008
|
+
/**
|
|
1009
|
+
* Attempts to rewrite the banner in place using terminal cursor manipulation.
|
|
1010
|
+
* Returns true if successful, false if rewrite is not possible.
|
|
1011
|
+
*/
|
|
1012
|
+
tryRewriteBanner(state, banner) {
|
|
1013
|
+
if (!this.outputStream.isTTY) {
|
|
1014
|
+
return false;
|
|
1015
|
+
}
|
|
1016
|
+
if (!banner || state.height <= 0) {
|
|
1017
|
+
return false;
|
|
1018
|
+
}
|
|
1019
|
+
const linesWritten = this.stdoutTracker.totalLines;
|
|
1020
|
+
const linesAfterBanner = linesWritten - (state.startLine + state.height);
|
|
1021
|
+
if (linesAfterBanner < 0) {
|
|
1022
|
+
return false;
|
|
1023
|
+
}
|
|
1024
|
+
const totalOffset = linesAfterBanner + state.height;
|
|
1025
|
+
const maxRows = this.outputStream.rows;
|
|
1026
|
+
if (typeof maxRows === 'number' && maxRows > 0 && totalOffset > maxRows) {
|
|
1027
|
+
return false;
|
|
1028
|
+
}
|
|
1029
|
+
try {
|
|
1030
|
+
this.withOutput(() => {
|
|
1031
|
+
moveCursor(this.outputStream, 0, -totalOffset);
|
|
1032
|
+
cursorTo(this.outputStream, 0);
|
|
1033
|
+
this.stdoutTracker.withSuspended(() => {
|
|
1034
|
+
this.outputStream.write(`${banner}\n`);
|
|
1035
|
+
});
|
|
1036
|
+
if (linesAfterBanner > 0) {
|
|
1037
|
+
moveCursor(this.outputStream, 0, linesAfterBanner);
|
|
1038
|
+
}
|
|
1039
|
+
cursorTo(this.outputStream, 0);
|
|
1040
|
+
});
|
|
1041
|
+
return true;
|
|
1042
|
+
}
|
|
1043
|
+
catch {
|
|
1044
|
+
return false;
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
renderAndStoreBanner(state, model, provider) {
|
|
1048
|
+
const width = this.getBannerWidth();
|
|
1049
|
+
const banner = this.buildClaudeStyleBanner(state.profileLabel, state.profileName, model, provider, state.workingDir, width, state.version);
|
|
1050
|
+
const startLine = this.stdoutTracker.totalLines;
|
|
1051
|
+
this.withOutput(() => {
|
|
1052
|
+
this.writeLine(banner);
|
|
1053
|
+
});
|
|
1054
|
+
state.startLine = startLine;
|
|
1055
|
+
state.height = this.measureBannerHeight(banner);
|
|
1056
|
+
state.width = width;
|
|
1057
|
+
state.model = model;
|
|
1058
|
+
state.provider = provider;
|
|
1059
|
+
}
|
|
861
1060
|
formatModelLabel(model) {
|
|
862
1061
|
if (/gpt-5\.1-?codex/i.test(model)) {
|
|
863
1062
|
return model;
|
|
@@ -955,96 +1154,16 @@ export class Display {
|
|
|
955
1154
|
}
|
|
956
1155
|
return `${seconds}s`;
|
|
957
1156
|
}
|
|
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
|
-
}
|
|
1157
|
+
buildClaudeStyleBanner(_profileLabel, _profileName, model, provider, workingDir, _width, version) {
|
|
1158
|
+
return renderSessionFrame({
|
|
1159
|
+
profileLabel: _profileLabel,
|
|
1160
|
+
profileName: _profileName,
|
|
1161
|
+
model: this.formatModelLabel(model),
|
|
1162
|
+
provider,
|
|
1163
|
+
workspace: workingDir,
|
|
1164
|
+
version,
|
|
1165
|
+
width: _width,
|
|
994
1166
|
});
|
|
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
1167
|
}
|
|
1049
1168
|
/**
|
|
1050
1169
|
* Wraps text with a prefix on the first line and optional continuation prefix.
|