@astralyn/pi 1.4.0 → 1.4.2

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.
Files changed (67) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/bundle/chunks/{chunk-BMTEURL3.js → chunk-FGPSYHTQ.js} +72 -11
  3. package/dist/bundle/chunks/{chunk-TJIPCBZF.js → chunk-HXKY52DF.js} +1 -1
  4. package/dist/bundle/chunks/{virtual-modules-3CTTTQQN.js → virtual-modules-5NSVVTKO.js} +1 -1
  5. package/dist/bundle/cli.js +1 -1
  6. package/dist/bundle/index.js +1 -1
  7. package/dist/bundle/rpc-entry.js +1 -1
  8. package/dist/core/compaction/compaction.d.ts.map +1 -1
  9. package/dist/core/compaction/compaction.js +5 -5
  10. package/dist/core/compaction/compaction.js.map +1 -1
  11. package/dist/core/extensions/index.d.ts +1 -1
  12. package/dist/core/extensions/index.d.ts.map +1 -1
  13. package/dist/core/extensions/index.js.map +1 -1
  14. package/dist/core/extensions/types.d.ts +25 -1
  15. package/dist/core/extensions/types.d.ts.map +1 -1
  16. package/dist/core/extensions/types.js.map +1 -1
  17. package/dist/extensions/cached-compaction/index.d.ts +3 -0
  18. package/dist/extensions/cached-compaction/index.d.ts.map +1 -0
  19. package/dist/extensions/cached-compaction/index.js +91 -0
  20. package/dist/extensions/cached-compaction/index.js.map +1 -0
  21. package/dist/extensions/cached-compaction/render.d.ts +11 -0
  22. package/dist/extensions/cached-compaction/render.d.ts.map +1 -0
  23. package/dist/extensions/cached-compaction/render.js +19 -0
  24. package/dist/extensions/cached-compaction/render.js.map +1 -0
  25. package/dist/extensions/cached-compaction/summary.d.ts +15 -0
  26. package/dist/extensions/cached-compaction/summary.d.ts.map +1 -0
  27. package/dist/extensions/cached-compaction/summary.js +131 -0
  28. package/dist/extensions/cached-compaction/summary.js.map +1 -0
  29. package/dist/extensions/index.d.ts.map +1 -1
  30. package/dist/extensions/index.js +4 -0
  31. package/dist/extensions/index.js.map +1 -1
  32. package/dist/extensions/tool-presentation/index.d.ts +7 -0
  33. package/dist/extensions/tool-presentation/index.d.ts.map +1 -0
  34. package/dist/extensions/tool-presentation/index.js +9 -0
  35. package/dist/extensions/tool-presentation/index.js.map +1 -0
  36. package/dist/index.d.ts +1 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/modes/interactive/components/index.d.ts +1 -1
  40. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  41. package/dist/modes/interactive/components/index.js +1 -1
  42. package/dist/modes/interactive/components/index.js.map +1 -1
  43. package/dist/modes/interactive/components/tool-execution.d.ts +85 -0
  44. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  45. package/dist/modes/interactive/components/tool-execution.js +362 -0
  46. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  47. package/dist/modes/interactive/interactive-mode.js +1 -1
  48. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  49. package/dist/modes/interactive/tool-view/chat.d.ts +1 -1
  50. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  51. package/dist/modes/interactive/tool-view/chat.js +2 -3
  52. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  53. package/dist/modes/interactive/tool-view/shell.d.ts +15 -0
  54. package/dist/modes/interactive/tool-view/shell.d.ts.map +1 -0
  55. package/dist/modes/interactive/tool-view/shell.js +51 -0
  56. package/dist/modes/interactive/tool-view/shell.js.map +1 -0
  57. package/dist/modes/interactive/tool-view/tool-execution.d.ts +10 -79
  58. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
  59. package/dist/modes/interactive/tool-view/tool-execution.js +7 -298
  60. package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
  61. package/docs/bundled/extensions/cached-compaction.md +35 -0
  62. package/docs/bundled/tool-presentation.md +9 -7
  63. package/docs/compaction.md +1 -1
  64. package/docs/docs.json +4 -0
  65. package/docs/extensions.md +3 -1
  66. package/npm-shrinkwrap.json +2 -2
  67. package/package.json +1 -1
@@ -0,0 +1,362 @@
1
+ import { Box, Container, getCapabilities, Image, MouseRegion, Spacer, Text, } from "@earendil-works/pi-tui";
2
+ import { formatToolCallWithArgs, getTextOutput as getRenderedTextOutput } from "../../../core/tools/render-utils.js";
3
+ import { ensurePngTranscoder } from "../../../utils/image-convert.js";
4
+ import { theme } from "../theme/theme.js";
5
+ import { keyHint } from "./keybinding-hints.js";
6
+ const FALLBACK_PREVIEW_LINES = 10;
7
+ const DEFAULT_TOOL_ROW_GAP = { afterTool: 1, afterMultilineTool: 1, afterOther: 1 };
8
+ export class ToolExecutionComponent extends Container {
9
+ constructor(toolName, toolCallId, args, options = {}, toolDefinition, ui, cwd) {
10
+ super();
11
+ this.leadingGap = 1;
12
+ this.selfRenderOffset = 1;
13
+ this.selfRenderHeight = 0;
14
+ this.rendererState = {};
15
+ this.imageComponents = [];
16
+ /** Inputs of imageComponents, so updateDisplay can reuse images and keep their converted PNG data. */
17
+ this.imageSources = [];
18
+ this.imageSpacers = [];
19
+ this.expanded = false;
20
+ this.isPartial = true;
21
+ this.executionStarted = false;
22
+ this.argsComplete = false;
23
+ this.hideComponent = false;
24
+ this.disposed = false;
25
+ this.toolName = toolName;
26
+ this.toolCallId = toolCallId;
27
+ this.args = args;
28
+ this.toolDefinition = toolDefinition;
29
+ this.showImages = options.showImages ?? true;
30
+ this.imageWidthCells = options.imageWidthCells ?? 60;
31
+ this.outputPad = options.outputPad ?? 1;
32
+ this.ui = ui;
33
+ this.cwd = cwd;
34
+ this.gap = new Spacer(this.leadingGap);
35
+ this.addChild(this.gap);
36
+ // Always create all shell variants. contentBox is used for default renderer-based composition.
37
+ // selfRenderContainer is used when the tool renders its own framing.
38
+ // contentText is reserved for generic fallback rendering when no tool definition exists.
39
+ this.contentBox = new Box(1, 1, (text) => theme.bg("toolPendingBg", text));
40
+ this.contentText = new Text("", 1, 1, (text) => theme.bg("toolPendingBg", text));
41
+ this.contentTextRegion = this.createResultRegion(this.contentText);
42
+ this.selfRenderContainer = new Container();
43
+ if (this.hasRendererDefinition()) {
44
+ this.addChild(this.getRenderShell() === "self" ? this.selfRenderContainer : this.contentBox);
45
+ }
46
+ else {
47
+ this.addChild(this.contentTextRegion);
48
+ }
49
+ this.updateDisplay();
50
+ }
51
+ getShell() {
52
+ // An explicit self shell belongs to the tool and must not be wrapped by a presentation extension.
53
+ if (this.toolDefinition?.renderShell === "self")
54
+ return undefined;
55
+ return this.toolDefinition?.shell;
56
+ }
57
+ getCallRenderer() {
58
+ return this.toolDefinition?.renderCall ?? this.getShell()?.renderCall;
59
+ }
60
+ getResultRenderer() {
61
+ return this.toolDefinition?.renderResult ?? this.getShell()?.renderResult;
62
+ }
63
+ hasRendererDefinition() {
64
+ return this.toolDefinition !== undefined;
65
+ }
66
+ getRenderShell() {
67
+ if (this.toolDefinition?.renderShell === "self")
68
+ return "self";
69
+ return this.getShell() ? "self" : "default";
70
+ }
71
+ /** Blank lines above this row; the chat sets it from what precedes the row. */
72
+ setLeadingGap(lines) {
73
+ this.leadingGap = Math.max(0, Math.floor(lines));
74
+ this.gap.setLines(this.leadingGap);
75
+ }
76
+ /** Layout metadata for the transcript; native rows retain upstream's single blank line. */
77
+ getToolRowGap() {
78
+ return this.getShell()?.gap ?? DEFAULT_TOOL_ROW_GAP;
79
+ }
80
+ getRenderContext(lastComponent) {
81
+ return {
82
+ args: this.args,
83
+ toolCallId: this.toolCallId,
84
+ invalidate: () => {
85
+ if (this.disposed)
86
+ return;
87
+ this.invalidate();
88
+ this.ui.requestRender();
89
+ },
90
+ lastComponent,
91
+ state: this.rendererState,
92
+ cwd: this.cwd,
93
+ executionStarted: this.executionStarted,
94
+ argsComplete: this.argsComplete,
95
+ isPartial: this.isPartial,
96
+ expanded: this.expanded,
97
+ showImages: this.showImages,
98
+ isError: this.result?.isError ?? false,
99
+ durationMs: this.isPartial ? undefined : this.result?.durationMs,
100
+ outputPad: this.outputPad,
101
+ result: this.result
102
+ ? {
103
+ content: this.result.content,
104
+ details: this.result.details,
105
+ }
106
+ : undefined,
107
+ };
108
+ }
109
+ frame(component, kind, lastComponent) {
110
+ const shell = this.getShell();
111
+ return shell ? shell.frame(component, kind, this.getRenderContext(lastComponent)) : component;
112
+ }
113
+ createCallFallback() {
114
+ const shell = this.getShell();
115
+ if (shell?.renderCall) {
116
+ return shell.renderCall(this.args, theme, this.getRenderContext(this.callRendererComponent));
117
+ }
118
+ return new Text(formatToolCallWithArgs(this.toolName, this.args, theme, this.expanded), 0, 0);
119
+ }
120
+ createResultFallback() {
121
+ const shell = this.getShell();
122
+ if (shell?.renderResult && this.result) {
123
+ return shell.renderResult({ content: this.result.content, details: this.result.details }, { expanded: this.expanded, isPartial: this.isPartial }, theme, this.getRenderContext(this.resultRendererComponent));
124
+ }
125
+ const output = this.getTextOutput();
126
+ if (!output) {
127
+ return undefined;
128
+ }
129
+ const lines = output.split("\n");
130
+ const displayLines = this.expanded ? lines : lines.slice(0, FALLBACK_PREVIEW_LINES);
131
+ const remaining = lines.length - displayLines.length;
132
+ let text = displayLines.map((line) => theme.fg("toolOutput", line)).join("\n");
133
+ if (remaining > 0) {
134
+ text += `${theme.fg("muted", `\n... (${remaining} more lines,`)} ${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
135
+ }
136
+ return new Text(text, 0, 0);
137
+ }
138
+ hidesCollapsedResult() {
139
+ return this.getShell()?.shouldHideResult?.(this.getRenderContext(this.resultRendererComponent)) ?? false;
140
+ }
141
+ createResultRegion(component) {
142
+ return new MouseRegion(component, (event) => {
143
+ if (!this.result || event.type !== "click" || event.button !== "left")
144
+ return undefined;
145
+ this.setExpanded(!this.expanded);
146
+ return { handled: true };
147
+ });
148
+ }
149
+ updateArgs(args) {
150
+ this.args = args;
151
+ this.updateDisplay();
152
+ }
153
+ markExecutionStarted() {
154
+ if (this.disposed)
155
+ return;
156
+ this.executionStarted = true;
157
+ this.updateDisplay();
158
+ this.ui.requestRender();
159
+ }
160
+ setArgsComplete() {
161
+ this.argsComplete = true;
162
+ this.updateDisplay();
163
+ this.ui.requestRender();
164
+ }
165
+ updateResult(result, isPartial = false) {
166
+ this.result = result;
167
+ this.isPartial = isPartial;
168
+ this.updateDisplay();
169
+ }
170
+ setExpanded(expanded) {
171
+ this.expanded = expanded;
172
+ this.updateDisplay();
173
+ }
174
+ setOutputPad(outputPad) {
175
+ this.outputPad = outputPad;
176
+ this.updateDisplay();
177
+ }
178
+ setShowImages(show) {
179
+ this.showImages = show;
180
+ this.updateDisplay();
181
+ }
182
+ setImageWidthCells(width) {
183
+ this.imageWidthCells = Math.max(1, Math.floor(width));
184
+ this.updateDisplay();
185
+ }
186
+ invalidate() {
187
+ super.invalidate();
188
+ this.updateDisplay();
189
+ }
190
+ render(width) {
191
+ if (this.hideComponent) {
192
+ return [];
193
+ }
194
+ if (this.hasRendererDefinition() && this.getRenderShell() === "self") {
195
+ const contentLines = this.selfRenderContainer.render(width);
196
+ this.selfRenderHeight = contentLines.length;
197
+ const leadingLines = contentLines.length > 0 ? this.gap.render(width) : [];
198
+ this.selfRenderOffset = leadingLines.length;
199
+ if (contentLines.length === 0 && this.imageComponents.length === 0) {
200
+ return [];
201
+ }
202
+ const lines = [...leadingLines, ...contentLines];
203
+ for (let i = 0; i < this.imageComponents.length; i++) {
204
+ const spacer = this.imageSpacers[i];
205
+ if (spacer) {
206
+ lines.push(...spacer.render(width));
207
+ }
208
+ const imageComponent = this.imageComponents[i];
209
+ if (imageComponent) {
210
+ lines.push(...imageComponent.render(width));
211
+ }
212
+ }
213
+ return lines;
214
+ }
215
+ return super.render(width);
216
+ }
217
+ handleMouse(event) {
218
+ if (!this.hasRendererDefinition() || this.getRenderShell() !== "self")
219
+ return super.handleMouse(event);
220
+ if (event.y < this.selfRenderOffset || event.y >= this.selfRenderOffset + this.selfRenderHeight) {
221
+ return undefined;
222
+ }
223
+ return this.selfRenderContainer.handleMouse({
224
+ ...event,
225
+ y: event.y - this.selfRenderOffset,
226
+ height: this.selfRenderHeight,
227
+ });
228
+ }
229
+ updateDisplay() {
230
+ const bgFn = this.isPartial
231
+ ? (text) => theme.bg("toolPendingBg", text)
232
+ : this.result?.isError
233
+ ? (text) => theme.bg("toolErrorBg", text)
234
+ : (text) => theme.bg("toolSuccessBg", text);
235
+ let hasContent = false;
236
+ this.hideComponent = false;
237
+ if (this.hasRendererDefinition()) {
238
+ const renderContainer = this.getRenderShell() === "self" ? this.selfRenderContainer : this.contentBox;
239
+ if (renderContainer instanceof Box) {
240
+ renderContainer.setBgFn(bgFn);
241
+ renderContainer.setPaddingX(this.outputPad);
242
+ }
243
+ renderContainer.clear();
244
+ const addCall = (component) => {
245
+ renderContainer.addChild(this.createResultRegion(this.frame(component, "header", this.callRendererComponent)));
246
+ hasContent = true;
247
+ };
248
+ const addResult = (component) => {
249
+ renderContainer.addChild(this.createResultRegion(this.frame(component, "body", this.resultRendererComponent)));
250
+ hasContent = true;
251
+ };
252
+ const callRenderer = this.getCallRenderer();
253
+ if (!callRenderer) {
254
+ addCall(this.createCallFallback());
255
+ }
256
+ else {
257
+ try {
258
+ const component = callRenderer(this.args, theme, this.getRenderContext(this.callRendererComponent));
259
+ this.callRendererComponent = component;
260
+ addCall(component);
261
+ }
262
+ catch {
263
+ this.callRendererComponent = undefined;
264
+ addCall(this.createCallFallback());
265
+ }
266
+ }
267
+ if (this.result && !this.hidesCollapsedResult()) {
268
+ const resultRenderer = this.getResultRenderer();
269
+ if (!resultRenderer) {
270
+ const component = this.createResultFallback();
271
+ if (component)
272
+ addResult(component);
273
+ }
274
+ else {
275
+ try {
276
+ const component = resultRenderer({ content: this.result.content, details: this.result.details }, { expanded: this.expanded, isPartial: this.isPartial }, theme, this.getRenderContext(this.resultRendererComponent));
277
+ this.resultRendererComponent = component;
278
+ addResult(component);
279
+ }
280
+ catch {
281
+ this.resultRendererComponent = undefined;
282
+ const component = this.createResultFallback();
283
+ if (component)
284
+ addResult(component);
285
+ }
286
+ }
287
+ }
288
+ }
289
+ else {
290
+ this.contentText.setCustomBgFn(bgFn);
291
+ this.contentText.setPaddingX(this.outputPad);
292
+ this.contentText.setText(this.formatToolExecution());
293
+ hasContent = true;
294
+ }
295
+ const previousImages = this.imageComponents;
296
+ const previousSources = this.imageSources;
297
+ for (const img of this.imageComponents) {
298
+ this.removeChild(img);
299
+ }
300
+ this.imageComponents = [];
301
+ this.imageSources = [];
302
+ for (const spacer of this.imageSpacers) {
303
+ this.removeChild(spacer);
304
+ }
305
+ this.imageSpacers = [];
306
+ if (this.result) {
307
+ const imageBlocks = this.result.content.filter((c) => c.type === "image");
308
+ const caps = getCapabilities();
309
+ for (const img of imageBlocks) {
310
+ if (caps.images && this.showImages && img.data && img.mimeType) {
311
+ const spacer = new Spacer(1);
312
+ this.addChild(spacer);
313
+ this.imageSpacers.push(spacer);
314
+ const source = { data: img.data, mimeType: img.mimeType, widthCells: this.imageWidthCells };
315
+ const index = this.imageComponents.length;
316
+ const previous = previousSources[index];
317
+ const imageComponent = previous?.data === source.data &&
318
+ previous.mimeType === source.mimeType &&
319
+ previous.widthCells === source.widthCells
320
+ ? previousImages[index]
321
+ : new Image(source.data, source.mimeType, { fallbackColor: (s) => theme.fg("toolOutput", s) }, { maxWidthCells: source.widthCells });
322
+ if (source.mimeType !== "image/png") {
323
+ ensurePngTranscoder(() => {
324
+ if (this.disposed)
325
+ return;
326
+ this.invalidate();
327
+ this.ui.requestRender();
328
+ });
329
+ }
330
+ this.imageComponents.push(imageComponent);
331
+ this.imageSources.push(source);
332
+ this.addChild(imageComponent);
333
+ }
334
+ }
335
+ }
336
+ if (this.hasRendererDefinition() && !hasContent && this.imageComponents.length === 0) {
337
+ this.hideComponent = true;
338
+ }
339
+ }
340
+ getTextOutput() {
341
+ return getRenderedTextOutput(this.result, this.showImages);
342
+ }
343
+ formatToolExecution() {
344
+ let text = theme.fg("toolTitle", theme.bold(this.toolName));
345
+ const content = JSON.stringify(this.args, null, 2);
346
+ if (content) {
347
+ text += `\n\n${content}`;
348
+ }
349
+ const output = this.getTextOutput();
350
+ if (output) {
351
+ text += `\n${output}`;
352
+ }
353
+ return text;
354
+ }
355
+ dispose() {
356
+ if (this.disposed)
357
+ return;
358
+ this.disposed = true;
359
+ this.rendererState.dispose?.();
360
+ }
361
+ }
362
+ //# sourceMappingURL=tool-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-execution.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\tBox,\n\ttype Component,\n\tContainer,\n\tgetCapabilities,\n\tImage,\n\tMouseRegion,\n\tSpacer,\n\tText,\n\ttype TUI,\n\ttype TuiMouseEvent,\n} from \"@earendil-works/pi-tui\";\nimport type {\n\tToolDefinition,\n\tToolExecutionShell,\n\tToolRenderContext,\n\tToolRenderers,\n\tToolRowGap,\n} from \"../../../core/extensions/types.ts\";\n\n/** What this component needs from a tool: how to draw it, without executing it. */\nexport type { ToolRenderers };\n\nimport { formatToolCallWithArgs, getTextOutput as getRenderedTextOutput } from \"../../../core/tools/render-utils.ts\";\nimport { ensurePngTranscoder } from \"../../../utils/image-convert.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { keyHint } from \"./keybinding-hints.ts\";\n\nconst FALLBACK_PREVIEW_LINES = 10;\nconst DEFAULT_TOOL_ROW_GAP: ToolRowGap = { afterTool: 1, afterMultilineTool: 1, afterOther: 1 };\n\nexport interface ToolExecutionOptions {\n\tshowImages?: boolean;\n\timageWidthCells?: number;\n\toutputPad?: number;\n}\n\nexport class ToolExecutionComponent extends Container {\n\tprivate gap: Spacer;\n\tprivate leadingGap = 1;\n\tprivate selfRenderOffset = 1;\n\tprivate contentBox: Box;\n\tprivate contentText: Text;\n\tprivate contentTextRegion: MouseRegion;\n\tprivate selfRenderContainer: Container;\n\tprivate selfRenderHeight = 0;\n\tprivate callRendererComponent?: Component;\n\tprivate resultRendererComponent?: Component;\n\tprivate rendererState: any = {};\n\tprivate imageComponents: Image[] = [];\n\t/** Inputs of imageComponents, so updateDisplay can reuse images and keep their converted PNG data. */\n\tprivate imageSources: Array<{ data: string; mimeType: string; widthCells: number }> = [];\n\tprivate imageSpacers: Spacer[] = [];\n\tprivate toolName: string;\n\tprivate toolCallId: string;\n\tprivate args: any;\n\tprivate expanded = false;\n\tprivate showImages: boolean;\n\tprivate imageWidthCells: number;\n\tprivate outputPad: number;\n\tprivate isPartial = true;\n\tprivate toolDefinition?: ToolRenderers;\n\tprivate ui: TUI;\n\tprivate cwd: string;\n\tprivate executionStarted = false;\n\tprivate argsComplete = false;\n\tprivate result?: {\n\t\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t\tisError: boolean;\n\t\tdetails?: any;\n\t\tdurationMs?: number;\n\t};\n\tprivate hideComponent = false;\n\tprivate disposed = false;\n\n\tconstructor(\n\t\ttoolName: string,\n\t\ttoolCallId: string,\n\t\targs: any,\n\t\toptions: ToolExecutionOptions = {},\n\t\ttoolDefinition: ToolRenderers | ToolDefinition<any, any, any> | undefined,\n\t\tui: TUI,\n\t\tcwd: string,\n\t) {\n\t\tsuper();\n\t\tthis.toolName = toolName;\n\t\tthis.toolCallId = toolCallId;\n\t\tthis.args = args;\n\t\tthis.toolDefinition = toolDefinition;\n\t\tthis.showImages = options.showImages ?? true;\n\t\tthis.imageWidthCells = options.imageWidthCells ?? 60;\n\t\tthis.outputPad = options.outputPad ?? 1;\n\t\tthis.ui = ui;\n\t\tthis.cwd = cwd;\n\n\t\tthis.gap = new Spacer(this.leadingGap);\n\t\tthis.addChild(this.gap);\n\n\t\t// Always create all shell variants. contentBox is used for default renderer-based composition.\n\t\t// selfRenderContainer is used when the tool renders its own framing.\n\t\t// contentText is reserved for generic fallback rendering when no tool definition exists.\n\t\tthis.contentBox = new Box(1, 1, (text: string) => theme.bg(\"toolPendingBg\", text));\n\t\tthis.contentText = new Text(\"\", 1, 1, (text: string) => theme.bg(\"toolPendingBg\", text));\n\t\tthis.contentTextRegion = this.createResultRegion(this.contentText);\n\t\tthis.selfRenderContainer = new Container();\n\n\t\tif (this.hasRendererDefinition()) {\n\t\t\tthis.addChild(this.getRenderShell() === \"self\" ? this.selfRenderContainer : this.contentBox);\n\t\t} else {\n\t\t\tthis.addChild(this.contentTextRegion);\n\t\t}\n\n\t\tthis.updateDisplay();\n\t}\n\n\tprivate getShell(): ToolExecutionShell | undefined {\n\t\t// An explicit self shell belongs to the tool and must not be wrapped by a presentation extension.\n\t\tif (this.toolDefinition?.renderShell === \"self\") return undefined;\n\t\treturn this.toolDefinition?.shell;\n\t}\n\n\tprivate getCallRenderer(): ToolDefinition<any, any>[\"renderCall\"] | undefined {\n\t\treturn this.toolDefinition?.renderCall ?? this.getShell()?.renderCall;\n\t}\n\n\tprivate getResultRenderer(): ToolDefinition<any, any>[\"renderResult\"] | undefined {\n\t\treturn this.toolDefinition?.renderResult ?? this.getShell()?.renderResult;\n\t}\n\n\tprivate hasRendererDefinition(): boolean {\n\t\treturn this.toolDefinition !== undefined;\n\t}\n\n\tprivate getRenderShell(): \"default\" | \"self\" {\n\t\tif (this.toolDefinition?.renderShell === \"self\") return \"self\";\n\t\treturn this.getShell() ? \"self\" : \"default\";\n\t}\n\n\t/** Blank lines above this row; the chat sets it from what precedes the row. */\n\tsetLeadingGap(lines: number): void {\n\t\tthis.leadingGap = Math.max(0, Math.floor(lines));\n\t\tthis.gap.setLines(this.leadingGap);\n\t}\n\n\t/** Layout metadata for the transcript; native rows retain upstream's single blank line. */\n\tgetToolRowGap(): ToolRowGap {\n\t\treturn this.getShell()?.gap ?? DEFAULT_TOOL_ROW_GAP;\n\t}\n\n\tprivate getRenderContext(lastComponent: Component | undefined): ToolRenderContext {\n\t\treturn {\n\t\t\targs: this.args,\n\t\t\ttoolCallId: this.toolCallId,\n\t\t\tinvalidate: () => {\n\t\t\t\tif (this.disposed) return;\n\t\t\t\tthis.invalidate();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t},\n\t\t\tlastComponent,\n\t\t\tstate: this.rendererState,\n\t\t\tcwd: this.cwd,\n\t\t\texecutionStarted: this.executionStarted,\n\t\t\targsComplete: this.argsComplete,\n\t\t\tisPartial: this.isPartial,\n\t\t\texpanded: this.expanded,\n\t\t\tshowImages: this.showImages,\n\t\t\tisError: this.result?.isError ?? false,\n\t\t\tdurationMs: this.isPartial ? undefined : this.result?.durationMs,\n\t\t\toutputPad: this.outputPad,\n\t\t\tresult: this.result\n\t\t\t\t? {\n\t\t\t\t\t\tcontent: this.result.content as AgentToolResult<unknown>[\"content\"],\n\t\t\t\t\t\tdetails: this.result.details,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\tprivate frame(component: Component, kind: \"header\" | \"body\", lastComponent: Component | undefined): Component {\n\t\tconst shell = this.getShell();\n\t\treturn shell ? shell.frame(component, kind, this.getRenderContext(lastComponent)) : component;\n\t}\n\n\tprivate createCallFallback(): Component {\n\t\tconst shell = this.getShell();\n\t\tif (shell?.renderCall) {\n\t\t\treturn shell.renderCall(this.args, theme, this.getRenderContext(this.callRendererComponent));\n\t\t}\n\t\treturn new Text(formatToolCallWithArgs(this.toolName, this.args, theme, this.expanded), 0, 0);\n\t}\n\n\tprivate createResultFallback(): Component | undefined {\n\t\tconst shell = this.getShell();\n\t\tif (shell?.renderResult && this.result) {\n\t\t\treturn shell.renderResult(\n\t\t\t\t{ content: this.result.content as any, details: this.result.details },\n\t\t\t\t{ expanded: this.expanded, isPartial: this.isPartial },\n\t\t\t\ttheme,\n\t\t\t\tthis.getRenderContext(this.resultRendererComponent),\n\t\t\t);\n\t\t}\n\t\tconst output = this.getTextOutput();\n\t\tif (!output) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst displayLines = this.expanded ? lines : lines.slice(0, FALLBACK_PREVIEW_LINES);\n\t\tconst remaining = lines.length - displayLines.length;\n\t\tlet text = displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\");\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t}\n\n\tprivate hidesCollapsedResult(): boolean {\n\t\treturn this.getShell()?.shouldHideResult?.(this.getRenderContext(this.resultRendererComponent)) ?? false;\n\t}\n\n\tprivate createResultRegion(component: Component): MouseRegion {\n\t\treturn new MouseRegion(component, (event) => {\n\t\t\tif (!this.result || event.type !== \"click\" || event.button !== \"left\") return undefined;\n\t\t\tthis.setExpanded(!this.expanded);\n\t\t\treturn { handled: true };\n\t\t});\n\t}\n\n\tupdateArgs(args: any): void {\n\t\tthis.args = args;\n\t\tthis.updateDisplay();\n\t}\n\n\tmarkExecutionStarted(): void {\n\t\tif (this.disposed) return;\n\t\tthis.executionStarted = true;\n\t\tthis.updateDisplay();\n\t\tthis.ui.requestRender();\n\t}\n\n\tsetArgsComplete(): void {\n\t\tthis.argsComplete = true;\n\t\tthis.updateDisplay();\n\t\tthis.ui.requestRender();\n\t}\n\n\tupdateResult(\n\t\tresult: {\n\t\t\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t\t\tdetails?: any;\n\t\t\tisError: boolean;\n\t\t\t/** Execution time of a final result. */\n\t\t\tdurationMs?: number;\n\t\t},\n\t\tisPartial = false,\n\t): void {\n\t\tthis.result = result;\n\t\tthis.isPartial = isPartial;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetOutputPad(outputPad: number): void {\n\t\tthis.outputPad = outputPad;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetShowImages(show: boolean): void {\n\t\tthis.showImages = show;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetImageWidthCells(width: number): void {\n\t\tthis.imageWidthCells = Math.max(1, Math.floor(width));\n\t\tthis.updateDisplay();\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.updateDisplay();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tif (this.hideComponent) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (this.hasRendererDefinition() && this.getRenderShell() === \"self\") {\n\t\t\tconst contentLines = this.selfRenderContainer.render(width);\n\t\t\tthis.selfRenderHeight = contentLines.length;\n\t\t\tconst leadingLines = contentLines.length > 0 ? this.gap.render(width) : [];\n\t\t\tthis.selfRenderOffset = leadingLines.length;\n\t\t\tif (contentLines.length === 0 && this.imageComponents.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst lines: string[] = [...leadingLines, ...contentLines];\n\t\t\tfor (let i = 0; i < this.imageComponents.length; i++) {\n\t\t\t\tconst spacer = this.imageSpacers[i];\n\t\t\t\tif (spacer) {\n\t\t\t\t\tlines.push(...spacer.render(width));\n\t\t\t\t}\n\t\t\t\tconst imageComponent = this.imageComponents[i];\n\t\t\t\tif (imageComponent) {\n\t\t\t\t\tlines.push(...imageComponent.render(width));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\n\t\treturn super.render(width);\n\t}\n\n\toverride handleMouse(event: TuiMouseEvent): ReturnType<Container[\"handleMouse\"]> {\n\t\tif (!this.hasRendererDefinition() || this.getRenderShell() !== \"self\") return super.handleMouse(event);\n\t\tif (event.y < this.selfRenderOffset || event.y >= this.selfRenderOffset + this.selfRenderHeight) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.selfRenderContainer.handleMouse({\n\t\t\t...event,\n\t\t\ty: event.y - this.selfRenderOffset,\n\t\t\theight: this.selfRenderHeight,\n\t\t});\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tconst bgFn = this.isPartial\n\t\t\t? (text: string) => theme.bg(\"toolPendingBg\", text)\n\t\t\t: this.result?.isError\n\t\t\t\t? (text: string) => theme.bg(\"toolErrorBg\", text)\n\t\t\t\t: (text: string) => theme.bg(\"toolSuccessBg\", text);\n\n\t\tlet hasContent = false;\n\t\tthis.hideComponent = false;\n\t\tif (this.hasRendererDefinition()) {\n\t\t\tconst renderContainer = this.getRenderShell() === \"self\" ? this.selfRenderContainer : this.contentBox;\n\t\t\tif (renderContainer instanceof Box) {\n\t\t\t\trenderContainer.setBgFn(bgFn);\n\t\t\t\trenderContainer.setPaddingX(this.outputPad);\n\t\t\t}\n\t\t\trenderContainer.clear();\n\n\t\t\tconst addCall = (component: Component) => {\n\t\t\t\trenderContainer.addChild(\n\t\t\t\t\tthis.createResultRegion(this.frame(component, \"header\", this.callRendererComponent)),\n\t\t\t\t);\n\t\t\t\thasContent = true;\n\t\t\t};\n\t\t\tconst addResult = (component: Component) => {\n\t\t\t\trenderContainer.addChild(\n\t\t\t\t\tthis.createResultRegion(this.frame(component, \"body\", this.resultRendererComponent)),\n\t\t\t\t);\n\t\t\t\thasContent = true;\n\t\t\t};\n\n\t\t\tconst callRenderer = this.getCallRenderer();\n\t\t\tif (!callRenderer) {\n\t\t\t\taddCall(this.createCallFallback());\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tconst component = callRenderer(this.args, theme, this.getRenderContext(this.callRendererComponent));\n\t\t\t\t\tthis.callRendererComponent = component;\n\t\t\t\t\taddCall(component);\n\t\t\t\t} catch {\n\t\t\t\t\tthis.callRendererComponent = undefined;\n\t\t\t\t\taddCall(this.createCallFallback());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.result && !this.hidesCollapsedResult()) {\n\t\t\t\tconst resultRenderer = this.getResultRenderer();\n\t\t\t\tif (!resultRenderer) {\n\t\t\t\t\tconst component = this.createResultFallback();\n\t\t\t\t\tif (component) addResult(component);\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst component = resultRenderer(\n\t\t\t\t\t\t\t{ content: this.result.content as any, details: this.result.details },\n\t\t\t\t\t\t\t{ expanded: this.expanded, isPartial: this.isPartial },\n\t\t\t\t\t\t\ttheme,\n\t\t\t\t\t\t\tthis.getRenderContext(this.resultRendererComponent),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.resultRendererComponent = component;\n\t\t\t\t\t\taddResult(component);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tthis.resultRendererComponent = undefined;\n\t\t\t\t\t\tconst component = this.createResultFallback();\n\t\t\t\t\t\tif (component) addResult(component);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.contentText.setCustomBgFn(bgFn);\n\t\t\tthis.contentText.setPaddingX(this.outputPad);\n\t\t\tthis.contentText.setText(this.formatToolExecution());\n\t\t\thasContent = true;\n\t\t}\n\n\t\tconst previousImages = this.imageComponents;\n\t\tconst previousSources = this.imageSources;\n\t\tfor (const img of this.imageComponents) {\n\t\t\tthis.removeChild(img);\n\t\t}\n\t\tthis.imageComponents = [];\n\t\tthis.imageSources = [];\n\t\tfor (const spacer of this.imageSpacers) {\n\t\t\tthis.removeChild(spacer);\n\t\t}\n\t\tthis.imageSpacers = [];\n\n\t\tif (this.result) {\n\t\t\tconst imageBlocks = this.result.content.filter((c) => c.type === \"image\");\n\t\t\tconst caps = getCapabilities();\n\t\t\tfor (const img of imageBlocks) {\n\t\t\t\tif (caps.images && this.showImages && img.data && img.mimeType) {\n\t\t\t\t\tconst spacer = new Spacer(1);\n\t\t\t\t\tthis.addChild(spacer);\n\t\t\t\t\tthis.imageSpacers.push(spacer);\n\t\t\t\t\tconst source = { data: img.data, mimeType: img.mimeType, widthCells: this.imageWidthCells };\n\t\t\t\t\tconst index = this.imageComponents.length;\n\t\t\t\t\tconst previous = previousSources[index];\n\t\t\t\t\tconst imageComponent =\n\t\t\t\t\t\tprevious?.data === source.data &&\n\t\t\t\t\t\tprevious.mimeType === source.mimeType &&\n\t\t\t\t\t\tprevious.widthCells === source.widthCells\n\t\t\t\t\t\t\t? previousImages[index]\n\t\t\t\t\t\t\t: new Image(\n\t\t\t\t\t\t\t\t\tsource.data,\n\t\t\t\t\t\t\t\t\tsource.mimeType,\n\t\t\t\t\t\t\t\t\t{ fallbackColor: (s: string) => theme.fg(\"toolOutput\", s) },\n\t\t\t\t\t\t\t\t\t{ maxWidthCells: source.widthCells },\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\tif (source.mimeType !== \"image/png\") {\n\t\t\t\t\t\tensurePngTranscoder(() => {\n\t\t\t\t\t\t\tif (this.disposed) return;\n\t\t\t\t\t\t\tthis.invalidate();\n\t\t\t\t\t\t\tthis.ui.requestRender();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.imageComponents.push(imageComponent);\n\t\t\t\t\tthis.imageSources.push(source);\n\t\t\t\t\tthis.addChild(imageComponent);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.hasRendererDefinition() && !hasContent && this.imageComponents.length === 0) {\n\t\t\tthis.hideComponent = true;\n\t\t}\n\t}\n\n\tprivate getTextOutput(): string {\n\t\treturn getRenderedTextOutput(this.result, this.showImages);\n\t}\n\n\tprivate formatToolExecution(): string {\n\t\tlet text = theme.fg(\"toolTitle\", theme.bold(this.toolName));\n\t\tconst content = JSON.stringify(this.args, null, 2);\n\t\tif (content) {\n\t\t\ttext += `\\n\\n${content}`;\n\t\t}\n\t\tconst output = this.getTextOutput();\n\t\tif (output) {\n\t\t\ttext += `\\n${output}`;\n\t\t}\n\t\treturn text;\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\t(this.rendererState as { dispose?: () => void }).dispose?.();\n\t}\n}\n"]}
@@ -78,6 +78,7 @@ import { SkillInvocationMessageComponent } from "./components/skill-invocation-m
78
78
  import { BranchSummaryStatusIndicator, CompactionStatusIndicator, IdleStatus, RetryStatusIndicator, WorkingStatusIndicator, } from "./components/status-indicator.js";
79
79
  import { ThemedText } from "./components/themed-text.js";
80
80
  import { ThinkingSelectorComponent } from "./components/thinking-selector.js";
81
+ import { ToolExecutionComponent } from "./components/tool-execution.js";
81
82
  import { TreeSelectorComponent } from "./components/tree-selector.js";
82
83
  import { TrustSelectorComponent } from "./components/trust-selector.js";
83
84
  import { UserMessageComponent } from "./components/user-message.js";
@@ -91,7 +92,6 @@ import { shareSession } from "./session-share.js";
91
92
  import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, onThemeChange, SYSTEM_THEME_NAME, setRegisteredThemes, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
92
93
  import { InteractiveThemeController } from "./theme/theme-controller.js";
93
94
  import { disposeChatRows, PendingToolMap, ToolChatContainer } from "./tool-view/chat.js";
94
- import { ToolExecutionComponent } from "./tool-view/tool-execution.js";
95
95
  import { createInteractiveTui, createInteractiveTuiReference } from "./tui-renderer.js";
96
96
  export { createInteractiveTui, createInteractiveTuiReference } from "./tui-renderer.js";
97
97
  function isEmbeddedStatus(editor) {