erosolar-cli 2.1.9 → 2.1.11
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/dist/core/preferences.d.ts +2 -0
- package/dist/core/preferences.d.ts.map +1 -1
- package/dist/core/preferences.js +13 -0
- package/dist/core/preferences.js.map +1 -1
- package/dist/shell/interactiveShell.d.ts +5 -0
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +59 -25
- package/dist/shell/interactiveShell.js.map +1 -1
- package/dist/ui/PromptController.d.ts +12 -0
- package/dist/ui/PromptController.d.ts.map +1 -1
- package/dist/ui/PromptController.js +6 -0
- package/dist/ui/PromptController.js.map +1 -1
- package/dist/ui/ShellUIAdapter.d.ts +20 -0
- package/dist/ui/ShellUIAdapter.d.ts.map +1 -1
- package/dist/ui/ShellUIAdapter.js +189 -21
- package/dist/ui/ShellUIAdapter.js.map +1 -1
- package/dist/ui/UnifiedUIRenderer.d.ts +12 -0
- package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -1
- package/dist/ui/UnifiedUIRenderer.js +118 -12
- package/dist/ui/UnifiedUIRenderer.js.map +1 -1
- package/dist/ui/display.d.ts +1 -0
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +4 -3
- package/dist/ui/display.js.map +1 -1
- package/package.json +1 -1
|
@@ -20,6 +20,7 @@ export interface PromptCallbacks {
|
|
|
20
20
|
onToggleAutoContinue?: () => void;
|
|
21
21
|
onToggleThinking?: () => void;
|
|
22
22
|
onClearContext?: () => void;
|
|
23
|
+
onToggleCriticalApproval?: () => void;
|
|
23
24
|
}
|
|
24
25
|
export declare class PromptController {
|
|
25
26
|
private readonly renderer;
|
|
@@ -41,6 +42,8 @@ export declare class PromptController {
|
|
|
41
42
|
autoContinueHotkey?: string;
|
|
42
43
|
thinkingModeLabel?: string | null;
|
|
43
44
|
thinkingHotkey?: string;
|
|
45
|
+
criticalApprovalMode?: 'auto' | 'approval';
|
|
46
|
+
criticalApprovalHotkey?: string;
|
|
44
47
|
}): void;
|
|
45
48
|
setStatusMessage(message: string | null): void;
|
|
46
49
|
setOverrideStatus(message: string | null): void;
|
|
@@ -65,6 +68,15 @@ export declare class PromptController {
|
|
|
65
68
|
model?: string | null;
|
|
66
69
|
provider?: string | null;
|
|
67
70
|
}): void;
|
|
71
|
+
setChromeMeta(meta: {
|
|
72
|
+
profile?: string;
|
|
73
|
+
workspace?: string;
|
|
74
|
+
writes?: string;
|
|
75
|
+
sessionLabel?: string;
|
|
76
|
+
thinkingLabel?: string;
|
|
77
|
+
autosave?: boolean;
|
|
78
|
+
version?: string;
|
|
79
|
+
}): void;
|
|
68
80
|
setAvailableCommands(commands: CommandSuggestion[]): void;
|
|
69
81
|
setEditMode(mode: EditGuardMode): void;
|
|
70
82
|
applyEditMode(mode: EditGuardMode): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptController.d.ts","sourceRoot":"","sources":["../../src/ui/PromptController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEnF,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,kBAAkB,GAAG,cAAc,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAE9G,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7D,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"PromptController.d.ts","sourceRoot":"","sources":["../../src/ui/PromptController.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ export class PromptController {
|
|
|
19
19
|
this.renderer.on('change', (payload) => {
|
|
20
20
|
this.callbacks.onChange?.(payload);
|
|
21
21
|
});
|
|
22
|
+
this.renderer.on('toggle-critical-approval', () => this.callbacks.onToggleCriticalApproval?.());
|
|
22
23
|
}
|
|
23
24
|
getRenderer() {
|
|
24
25
|
return this.renderer;
|
|
@@ -49,6 +50,8 @@ export class PromptController {
|
|
|
49
50
|
autoContinueHotkey: options.autoContinueHotkey,
|
|
50
51
|
thinkingModeLabel: options.thinkingModeLabel,
|
|
51
52
|
thinkingHotkey: options.thinkingHotkey,
|
|
53
|
+
criticalApprovalMode: options.criticalApprovalMode,
|
|
54
|
+
criticalApprovalHotkey: options.criticalApprovalHotkey,
|
|
52
55
|
});
|
|
53
56
|
}
|
|
54
57
|
setStatusMessage(message) {
|
|
@@ -90,6 +93,9 @@ export class PromptController {
|
|
|
90
93
|
provider: options.provider || undefined,
|
|
91
94
|
});
|
|
92
95
|
}
|
|
96
|
+
setChromeMeta(meta) {
|
|
97
|
+
this.renderer.updateStatusMeta(meta);
|
|
98
|
+
}
|
|
93
99
|
setAvailableCommands(commands) {
|
|
94
100
|
this.renderer.setAvailableCommands(commands);
|
|
95
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptController.js","sourceRoot":"","sources":["../../src/ui/PromptController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAA0B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"PromptController.js","sourceRoot":"","sources":["../../src/ui/PromptController.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,9 @@ export declare class ShellUIAdapter {
|
|
|
35
35
|
private toolProgressSnapshots;
|
|
36
36
|
private exploreProgressState;
|
|
37
37
|
private toolUsageCounts;
|
|
38
|
+
private activeToolStatus;
|
|
39
|
+
private activeToolHeartbeatId;
|
|
40
|
+
private statusSpinnerIndex;
|
|
38
41
|
constructor(writeStream: typeof process.stdout, display: Display, config?: Partial<ShellUIAdapterConfig>, updateCoordinator?: UIUpdateCoordinator);
|
|
39
42
|
/**
|
|
40
43
|
* Setup display integration
|
|
@@ -182,6 +185,14 @@ export declare class ShellUIAdapter {
|
|
|
182
185
|
* Set tool status callback - called when tools start/complete to update dynamic status
|
|
183
186
|
*/
|
|
184
187
|
setToolStatusCallback(callback: (status: string | null) => void): void;
|
|
188
|
+
/**
|
|
189
|
+
* Keep a live status line ticking while an SSE tool or long-running tool is active.
|
|
190
|
+
* Uses a heartbeat to animate the spinner and update elapsed time without spamming writes.
|
|
191
|
+
*/
|
|
192
|
+
private startToolStatusHeartbeat;
|
|
193
|
+
private stopToolStatusHeartbeat;
|
|
194
|
+
private buildRunningStatusLine;
|
|
195
|
+
private formatElapsedMs;
|
|
185
196
|
/**
|
|
186
197
|
* Parse file changes from Edit/Write/NotebookEdit tool output
|
|
187
198
|
*/
|
|
@@ -192,6 +203,15 @@ export declare class ShellUIAdapter {
|
|
|
192
203
|
* Routes through display module to work with scroll regions
|
|
193
204
|
*/
|
|
194
205
|
private displayToolResultSummary;
|
|
206
|
+
/**
|
|
207
|
+
* Render a rich block for non-streamed SSE-style tool results so they feel like a "completed event".
|
|
208
|
+
* Returns true if a block was rendered and downstream compact formatting should be skipped.
|
|
209
|
+
*/
|
|
210
|
+
private maybeRenderRichToolResult;
|
|
211
|
+
private shouldRenderRichToolBlock;
|
|
212
|
+
private renderRichToolBlock;
|
|
213
|
+
private visibleLength;
|
|
214
|
+
private stripAnsi;
|
|
195
215
|
/**
|
|
196
216
|
* Format tool result summary in Erosolar-CLI style
|
|
197
217
|
* Returns compact summary like "Found 4 files" or "Read 50 lines"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShellUIAdapter.d.ts","sourceRoot":"","sources":["../../src/ui/ShellUIAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAA2B,MAAM,wBAAwB,CAAC;AAKtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"ShellUIAdapter.d.ts","sourceRoot":"","sources":["../../src/ui/ShellUIAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { InterruptPriority } from './interrupts/InterruptManager.js';
|
|
|
13
13
|
import { getTerminalColumns } from './layout.js';
|
|
14
14
|
import { theme, icons } from './theme.js';
|
|
15
15
|
import { UIUpdateCoordinator } from './orchestration/UIUpdateCoordinator.js';
|
|
16
|
+
import { formatRichContent } from './richText.js';
|
|
16
17
|
export class ShellUIAdapter {
|
|
17
18
|
uiController;
|
|
18
19
|
display;
|
|
@@ -32,6 +33,9 @@ export class ShellUIAdapter {
|
|
|
32
33
|
toolProgressSnapshots = new Map();
|
|
33
34
|
exploreProgressState = new Map();
|
|
34
35
|
toolUsageCounts = new Map();
|
|
36
|
+
activeToolStatus = null;
|
|
37
|
+
activeToolHeartbeatId = null;
|
|
38
|
+
statusSpinnerIndex = 0;
|
|
35
39
|
constructor(writeStream, display, config = {}, updateCoordinator) {
|
|
36
40
|
this.display = display;
|
|
37
41
|
this.config = {
|
|
@@ -105,7 +109,13 @@ export class ShellUIAdapter {
|
|
|
105
109
|
// Update status bar to show active tool
|
|
106
110
|
if (this._toolStatusCallback) {
|
|
107
111
|
const actionDesc = this.getToolActionDescription(call);
|
|
108
|
-
this.
|
|
112
|
+
this.activeToolStatus = {
|
|
113
|
+
id: call.id,
|
|
114
|
+
description: actionDesc,
|
|
115
|
+
startedAt: Date.now(),
|
|
116
|
+
};
|
|
117
|
+
this._toolStatusCallback(this.buildRunningStatusLine(actionDesc, this.activeToolStatus.startedAt));
|
|
118
|
+
this.startToolStatusHeartbeat(call.id);
|
|
109
119
|
}
|
|
110
120
|
this.uiController.onToolStart(call);
|
|
111
121
|
},
|
|
@@ -130,7 +140,17 @@ export class ShellUIAdapter {
|
|
|
130
140
|
if (this._toolStatusCallback) {
|
|
131
141
|
const description = this.getToolActionDescription(call, progress);
|
|
132
142
|
if (description) {
|
|
133
|
-
this.
|
|
143
|
+
if (this.activeToolStatus && this.activeToolStatus.id === call.id) {
|
|
144
|
+
this.activeToolStatus.description = description;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.activeToolStatus = {
|
|
148
|
+
id: call.id,
|
|
149
|
+
description: description,
|
|
150
|
+
startedAt: Date.now(),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
this._toolStatusCallback(this.buildRunningStatusLine(description, this.activeToolStatus.startedAt));
|
|
134
154
|
}
|
|
135
155
|
}
|
|
136
156
|
},
|
|
@@ -142,12 +162,15 @@ export class ShellUIAdapter {
|
|
|
142
162
|
}
|
|
143
163
|
},
|
|
144
164
|
onToolResult: (call, output) => {
|
|
165
|
+
const now = Date.now();
|
|
145
166
|
// Complete the operation tracking
|
|
146
167
|
const op = this.pendingOperations.get(call.id);
|
|
168
|
+
let durationMs;
|
|
147
169
|
if (op) {
|
|
148
170
|
op.status = 'success';
|
|
149
|
-
op.completedAt =
|
|
171
|
+
op.completedAt = now;
|
|
150
172
|
op.summary = this.extractResultSummary(call, output);
|
|
173
|
+
durationMs = op.startedAt ? Math.max(0, now - op.startedAt) : undefined;
|
|
151
174
|
this.pendingOperations.delete(call.id);
|
|
152
175
|
this.completedOperations.push(op);
|
|
153
176
|
// Keep only recent completed operations
|
|
@@ -166,20 +189,24 @@ export class ShellUIAdapter {
|
|
|
166
189
|
this.fileChangeCallback(fileChange.path, fileChange.type, fileChange.additions, fileChange.removals);
|
|
167
190
|
}
|
|
168
191
|
}
|
|
192
|
+
const renderedRich = this.maybeRenderRichToolResult(call, output, true, durationMs);
|
|
169
193
|
// Use compact display for quick single-result tools and structured edit output
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
this.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
194
|
+
if (!renderedRich) {
|
|
195
|
+
if (call.name === 'Edit' || call.name === 'edit_file') {
|
|
196
|
+
this.displayEditResult(call, output, true);
|
|
197
|
+
}
|
|
198
|
+
else if (this.compactDisplayMode && this.isCompactTool(call.name)) {
|
|
199
|
+
this.displayCompactResult(call, output, true);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Erosolar-CLI style: Display tool result with ⎿ prefix
|
|
203
|
+
this.displayToolResultSummary(call, output, true);
|
|
204
|
+
}
|
|
179
205
|
}
|
|
180
206
|
// Surface any captured preflight warnings in a structured block
|
|
181
207
|
this.flushToolWarnings(call.id, call.name);
|
|
182
208
|
// Clear status bar after showing result
|
|
209
|
+
this.stopToolStatusHeartbeat();
|
|
183
210
|
if (this._toolStatusCallback) {
|
|
184
211
|
this._toolStatusCallback(null);
|
|
185
212
|
}
|
|
@@ -188,10 +215,12 @@ export class ShellUIAdapter {
|
|
|
188
215
|
onToolError: (call, message) => {
|
|
189
216
|
// Complete the operation tracking with error
|
|
190
217
|
const op = this.pendingOperations.get(call.id);
|
|
218
|
+
let durationMs;
|
|
191
219
|
if (op) {
|
|
192
220
|
op.status = 'error';
|
|
193
221
|
op.completedAt = Date.now();
|
|
194
222
|
op.summary = message;
|
|
223
|
+
durationMs = op.startedAt ? Math.max(0, (op.completedAt ?? Date.now()) - op.startedAt) : undefined;
|
|
195
224
|
this.pendingOperations.delete(call.id);
|
|
196
225
|
this.completedOperations.push(op);
|
|
197
226
|
}
|
|
@@ -199,19 +228,23 @@ export class ShellUIAdapter {
|
|
|
199
228
|
this.logExploreCompletion(call.id, false);
|
|
200
229
|
}
|
|
201
230
|
this.clearToolState(call.id);
|
|
231
|
+
const renderedRich = this.maybeRenderRichToolResult(call, message, false, durationMs);
|
|
202
232
|
// Use compact display for errors too
|
|
203
|
-
if (
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
this.
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
233
|
+
if (!renderedRich) {
|
|
234
|
+
if (call.name === 'Edit' || call.name === 'edit_file') {
|
|
235
|
+
this.displayEditResult(call, message, false);
|
|
236
|
+
}
|
|
237
|
+
else if (this.compactDisplayMode && this.isCompactTool(call.name)) {
|
|
238
|
+
this.displayCompactResult(call, message, false);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
// Erosolar-CLI style: Display error with ⎿ prefix (error color)
|
|
242
|
+
this.displayToolResultSummary(call, message, false);
|
|
243
|
+
}
|
|
212
244
|
}
|
|
213
245
|
this.flushToolWarnings(call.id, call.name);
|
|
214
246
|
// Clear status bar after showing error
|
|
247
|
+
this.stopToolStatusHeartbeat();
|
|
215
248
|
if (this._toolStatusCallback) {
|
|
216
249
|
this._toolStatusCallback(null);
|
|
217
250
|
}
|
|
@@ -233,6 +266,10 @@ export class ShellUIAdapter {
|
|
|
233
266
|
// Erosolar-CLI style: Show tool call with (cached) indicator
|
|
234
267
|
this.displayToolCallStart(call, true);
|
|
235
268
|
this.flushToolWarnings(call.id, call.name);
|
|
269
|
+
this.stopToolStatusHeartbeat();
|
|
270
|
+
if (this._toolStatusCallback) {
|
|
271
|
+
this._toolStatusCallback(null);
|
|
272
|
+
}
|
|
236
273
|
this.uiController.onToolStart(call);
|
|
237
274
|
this.uiController.onToolComplete(call.id, 'cache-hit');
|
|
238
275
|
},
|
|
@@ -950,6 +987,72 @@ export class ShellUIAdapter {
|
|
|
950
987
|
*/
|
|
951
988
|
setToolStatusCallback(callback) {
|
|
952
989
|
this._toolStatusCallback = callback;
|
|
990
|
+
if (callback && this.activeToolStatus) {
|
|
991
|
+
callback(this.buildRunningStatusLine(this.activeToolStatus.description, this.activeToolStatus.startedAt));
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* Keep a live status line ticking while an SSE tool or long-running tool is active.
|
|
996
|
+
* Uses a heartbeat to animate the spinner and update elapsed time without spamming writes.
|
|
997
|
+
*/
|
|
998
|
+
startToolStatusHeartbeat(callId) {
|
|
999
|
+
if (!this._toolStatusCallback || !this.activeToolStatus) {
|
|
1000
|
+
return;
|
|
1001
|
+
}
|
|
1002
|
+
// Stop any previous heartbeat to avoid overlapping timers
|
|
1003
|
+
this.stopToolStatusHeartbeat();
|
|
1004
|
+
const heartbeatId = `tool-status:${callId}`;
|
|
1005
|
+
this.activeToolHeartbeatId = heartbeatId;
|
|
1006
|
+
this.updateCoordinator.startHeartbeat(heartbeatId, {
|
|
1007
|
+
intervalMs: 1000,
|
|
1008
|
+
description: 'live tool status ticker',
|
|
1009
|
+
lane: 'status',
|
|
1010
|
+
priority: 'low',
|
|
1011
|
+
mode: ['processing', 'tooling', 'streaming', 'mcp'],
|
|
1012
|
+
run: () => {
|
|
1013
|
+
if (!this._toolStatusCallback || !this.activeToolStatus) {
|
|
1014
|
+
this.stopToolStatusHeartbeat();
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
const statusLine = this.buildRunningStatusLine(this.activeToolStatus.description, this.activeToolStatus.startedAt);
|
|
1018
|
+
this._toolStatusCallback(statusLine);
|
|
1019
|
+
},
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
stopToolStatusHeartbeat() {
|
|
1023
|
+
if (this.activeToolHeartbeatId) {
|
|
1024
|
+
this.updateCoordinator.stopHeartbeat(this.activeToolHeartbeatId);
|
|
1025
|
+
}
|
|
1026
|
+
this.activeToolHeartbeatId = null;
|
|
1027
|
+
this.activeToolStatus = null;
|
|
1028
|
+
this.statusSpinnerIndex = 0;
|
|
1029
|
+
}
|
|
1030
|
+
buildRunningStatusLine(description, startedAt) {
|
|
1031
|
+
const frames = Array.isArray(icons.spinner) ? icons.spinner : [icons.loading];
|
|
1032
|
+
const frame = frames[this.statusSpinnerIndex % frames.length] ?? frames[0] ?? icons.bullet;
|
|
1033
|
+
this.statusSpinnerIndex += 1;
|
|
1034
|
+
const elapsed = this.formatElapsedMs(Date.now() - startedAt);
|
|
1035
|
+
const metaParts = [];
|
|
1036
|
+
if (elapsed) {
|
|
1037
|
+
metaParts.push(`${theme.metrics.elapsedLabel('elapsed')} ${theme.metrics.elapsedValue(elapsed)}`);
|
|
1038
|
+
}
|
|
1039
|
+
if (process.stdout.isTTY) {
|
|
1040
|
+
metaParts.push(theme.ui.muted('esc to interrupt'));
|
|
1041
|
+
}
|
|
1042
|
+
const meta = metaParts.length ? ` (${metaParts.join(theme.ui.muted(' • '))})` : '';
|
|
1043
|
+
return `${theme.info(frame)} ${description}${meta}`;
|
|
1044
|
+
}
|
|
1045
|
+
formatElapsedMs(elapsedMs) {
|
|
1046
|
+
if (typeof elapsedMs !== 'number' || !Number.isFinite(elapsedMs) || elapsedMs < 0) {
|
|
1047
|
+
return null;
|
|
1048
|
+
}
|
|
1049
|
+
const totalSeconds = Math.max(0, Math.round(elapsedMs / 1000));
|
|
1050
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
1051
|
+
const seconds = totalSeconds % 60;
|
|
1052
|
+
if (minutes > 0) {
|
|
1053
|
+
return `${minutes}m ${seconds.toString().padStart(2, '0')}s`;
|
|
1054
|
+
}
|
|
1055
|
+
return `${seconds}s`;
|
|
953
1056
|
}
|
|
954
1057
|
/**
|
|
955
1058
|
* Parse file changes from Edit/Write/NotebookEdit tool output
|
|
@@ -1012,6 +1115,71 @@ export class ShellUIAdapter {
|
|
|
1012
1115
|
this.display.stream(` ${prefix} ${summary}\n\n`);
|
|
1013
1116
|
}
|
|
1014
1117
|
}
|
|
1118
|
+
/**
|
|
1119
|
+
* Render a rich block for non-streamed SSE-style tool results so they feel like a "completed event".
|
|
1120
|
+
* Returns true if a block was rendered and downstream compact formatting should be skipped.
|
|
1121
|
+
*/
|
|
1122
|
+
maybeRenderRichToolResult(call, output, success, durationMs) {
|
|
1123
|
+
if (!this.shouldRenderRichToolBlock(call, output)) {
|
|
1124
|
+
return false;
|
|
1125
|
+
}
|
|
1126
|
+
const block = this.renderRichToolBlock(call, output, success, durationMs);
|
|
1127
|
+
if (!block.trim()) {
|
|
1128
|
+
return false;
|
|
1129
|
+
}
|
|
1130
|
+
this.display.stream(`\n${block}\n\n`);
|
|
1131
|
+
return true;
|
|
1132
|
+
}
|
|
1133
|
+
shouldRenderRichToolBlock(call, output) {
|
|
1134
|
+
const trimmed = output?.trim() ?? '';
|
|
1135
|
+
if (!trimmed)
|
|
1136
|
+
return false;
|
|
1137
|
+
// Skip tools that already have bespoke rendering
|
|
1138
|
+
if (call.name === 'Edit' || call.name === 'edit_file') {
|
|
1139
|
+
return false;
|
|
1140
|
+
}
|
|
1141
|
+
const isMcpTool = call.name.startsWith('mcp__');
|
|
1142
|
+
const isMultiline = trimmed.includes('\n');
|
|
1143
|
+
const isLong = trimmed.length > 160;
|
|
1144
|
+
return isMcpTool || isMultiline || isLong;
|
|
1145
|
+
}
|
|
1146
|
+
renderRichToolBlock(call, output, success, durationMs) {
|
|
1147
|
+
const columns = Math.max(60, Math.min(getTerminalColumns(), 120));
|
|
1148
|
+
const innerWidth = Math.max(40, columns - 4);
|
|
1149
|
+
const statusIcon = success ? theme.success(icons.success) : theme.error(icons.error);
|
|
1150
|
+
const labels = [
|
|
1151
|
+
`${statusIcon} ${theme.tool(call.name)}`,
|
|
1152
|
+
call.name.startsWith('mcp__') ? theme.ui.muted('SSE result') : theme.ui.muted('Tool result'),
|
|
1153
|
+
];
|
|
1154
|
+
const elapsed = this.formatElapsedMs(durationMs);
|
|
1155
|
+
if (elapsed) {
|
|
1156
|
+
labels.push(`${theme.metrics.elapsedLabel('elapsed')} ${theme.metrics.elapsedValue(elapsed)}`);
|
|
1157
|
+
}
|
|
1158
|
+
const title = labels.filter(Boolean).join(theme.ui.muted(' • '));
|
|
1159
|
+
const titlePadding = Math.max(0, innerWidth - this.visibleLength(title) - 2);
|
|
1160
|
+
const top = theme.ui.muted(`╭─ ${title} ${'─'.repeat(titlePadding)}╮`);
|
|
1161
|
+
const bottom = theme.ui.muted(`╰${'─'.repeat(innerWidth + 2)}╯`);
|
|
1162
|
+
const bodyLines = formatRichContent(output.trim(), innerWidth);
|
|
1163
|
+
const boxed = bodyLines.length ? bodyLines : [''];
|
|
1164
|
+
const content = boxed.map(line => {
|
|
1165
|
+
const truncated = this.visibleLength(line) > innerWidth
|
|
1166
|
+
? `${line.slice(0, Math.max(0, innerWidth - 1))}…`
|
|
1167
|
+
: line;
|
|
1168
|
+
const pad = Math.max(0, innerWidth - this.visibleLength(truncated));
|
|
1169
|
+
return `${theme.ui.muted('│')} ${truncated}${' '.repeat(pad)} ${theme.ui.muted('│')}`;
|
|
1170
|
+
});
|
|
1171
|
+
return [top, ...content, bottom].join('\n');
|
|
1172
|
+
}
|
|
1173
|
+
visibleLength(value) {
|
|
1174
|
+
if (!value)
|
|
1175
|
+
return 0;
|
|
1176
|
+
return this.stripAnsi(value).length;
|
|
1177
|
+
}
|
|
1178
|
+
stripAnsi(value) {
|
|
1179
|
+
if (!value)
|
|
1180
|
+
return '';
|
|
1181
|
+
return value.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g, '');
|
|
1182
|
+
}
|
|
1015
1183
|
/**
|
|
1016
1184
|
* Format tool result summary in Erosolar-CLI style
|
|
1017
1185
|
* Returns compact summary like "Found 4 files" or "Read 50 lines"
|