codebase-cli 2.0.0-pre.32 → 2.0.0-pre.34
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/ui/Message.js +3 -520
- package/dist/ui/Message.js.map +1 -1
- package/dist/ui/diff-summary.js +171 -0
- package/dist/ui/diff-summary.js.map +1 -0
- package/dist/ui/paths.js +41 -0
- package/dist/ui/paths.js.map +1 -0
- package/dist/ui/tool-call-line.js +83 -0
- package/dist/ui/tool-call-line.js.map +1 -0
- package/dist/ui/tool-labels.js +194 -0
- package/dist/ui/tool-labels.js.map +1 -0
- package/dist/ui/truncated-output.js +42 -0
- package/dist/ui/truncated-output.js.map +1 -0
- package/dist/ui/wrapped-lines.js +18 -0
- package/dist/ui/wrapped-lines.js.map +1 -0
- package/package.json +1 -1
package/dist/ui/Message.js
CHANGED
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { isAbsolute, sep as pathSep, relative as relativePath, resolve as resolveAbsolute } from "node:path";
|
|
3
|
-
import { diffLines, diffWordsWithSpace } from "diff";
|
|
4
2
|
import { Box, Text } from "ink";
|
|
5
|
-
import { useEffect, useState } from "react";
|
|
6
3
|
import { Markdown } from "./Markdown.js";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const [frame, setFrame] = useState(0);
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
if (!active)
|
|
13
|
-
return;
|
|
14
|
-
const id = setInterval(() => setFrame((f) => (f + 1) % SPINNER_FRAMES.length), intervalMs);
|
|
15
|
-
return () => clearInterval(id);
|
|
16
|
-
}, [active, intervalMs]);
|
|
17
|
-
return SPINNER_FRAMES[frame];
|
|
18
|
-
}
|
|
4
|
+
import { COLLAPSIBLE_READ_TOOLS, CollapsedReadGroup, ToolCallLine } from "./tool-call-line.js";
|
|
5
|
+
import { TruncatedOutput } from "./truncated-output.js";
|
|
6
|
+
import { WrappedLines } from "./wrapped-lines.js";
|
|
19
7
|
const ROLE_STYLE = {
|
|
20
8
|
user: { accent: "yellow", label: "you" },
|
|
21
9
|
assistant: { accent: "cyan", label: "codebase" },
|
|
@@ -68,39 +56,6 @@ function MessageBody({ message, width, tools, }) {
|
|
|
68
56
|
}
|
|
69
57
|
return null;
|
|
70
58
|
}
|
|
71
|
-
/**
|
|
72
|
-
* One tool-call row that morphs through three states:
|
|
73
|
-
* running → spinner + present tense ("⣾ Reading src/index.ts")
|
|
74
|
-
* done → ✓ + past tense ("✓ Read src/index.ts")
|
|
75
|
-
* error → ✗ + past tense + red ("✗ Read src/index.ts")
|
|
76
|
-
*
|
|
77
|
-
* State source: the per-session `tools` Map on ChatState. If no entry
|
|
78
|
-
* exists for this id (e.g. an old session being replayed without
|
|
79
|
-
* inflight tracking), we render the past-tense "done" form — safe
|
|
80
|
-
* fallback that never strands the UI on a fake spinner.
|
|
81
|
-
*/
|
|
82
|
-
function ToolCallLine({ id, name, args, width, keyPrefix, tools, }) {
|
|
83
|
-
const exec = tools?.get(id);
|
|
84
|
-
const status = exec?.status ?? "done";
|
|
85
|
-
const isRunning = status === "running";
|
|
86
|
-
const spinner = useSpinner(isRunning);
|
|
87
|
-
if (isRunning) {
|
|
88
|
-
return (_jsx(WrappedLines, { text: `${spinner} ${toolActionLabel(name, args)}…`, width: width, keyPrefix: keyPrefix, color: "magenta" }));
|
|
89
|
-
}
|
|
90
|
-
const isError = status === "error";
|
|
91
|
-
const glyph = isError ? "✗" : "✓";
|
|
92
|
-
const past = toolActionPast(name, args);
|
|
93
|
-
const diff = !isError ? diffSummary(name, args) : null;
|
|
94
|
-
return (_jsxs(_Fragment, { children: [_jsx(WrappedLines, { text: `${glyph} ${past}`, width: width, keyPrefix: keyPrefix, color: isError ? "red" : "magenta" }), diff ? _jsx(DiffSummary, { diff: diff, width: width, keyPrefix: `${keyPrefix}-diff` }) : null] }));
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Tool calls that are pure reads — runs of these collapse into a single
|
|
98
|
-
* "Read N files" / "Searched 3 patterns" line, the Claude Code pattern.
|
|
99
|
-
* Keep the set tight: anything that mutates state, runs shell, or has a
|
|
100
|
-
* meaningful argument shape (grep query, fetch URL) reads weird when
|
|
101
|
-
* collapsed and stays per-row.
|
|
102
|
-
*/
|
|
103
|
-
const COLLAPSIBLE_READ_TOOLS = new Set(["read_file"]);
|
|
104
59
|
/**
|
|
105
60
|
* Walk an assistant message's content blocks, collapsing runs of
|
|
106
61
|
* consecutive `read_file` (and other safe read-only) tool calls into a
|
|
@@ -153,277 +108,6 @@ function renderAssistantBlocks(content, width, tools) {
|
|
|
153
108
|
}
|
|
154
109
|
return out;
|
|
155
110
|
}
|
|
156
|
-
function CollapsedReadGroup({ calls, width, keyPrefix, tools, }) {
|
|
157
|
-
const statuses = calls.map((c) => tools?.get(c.id)?.status);
|
|
158
|
-
const anyRunning = statuses.some((s) => s === "running");
|
|
159
|
-
const anyError = statuses.some((s) => s === "error");
|
|
160
|
-
const doneCount = statuses.filter((s) => s !== "running").length;
|
|
161
|
-
const spinner = useSpinner(anyRunning);
|
|
162
|
-
const glyph = anyRunning ? spinner : anyError ? "✗" : "✓";
|
|
163
|
-
const color = anyError ? "red" : "magenta";
|
|
164
|
-
const verb = anyRunning ? presentVerbForReadTool(calls[0].name) : pastVerbForReadTool(calls[0].name);
|
|
165
|
-
const noun = nounForReadTool(calls[0].name, calls.length);
|
|
166
|
-
const header = anyRunning
|
|
167
|
-
? `${glyph} ${verb} ${doneCount} of ${calls.length} ${noun}…`
|
|
168
|
-
: `${glyph} ${verb} ${calls.length} ${noun}`;
|
|
169
|
-
return (_jsxs(_Fragment, { children: [_jsx(WrappedLines, { text: header, width: width, keyPrefix: keyPrefix, color: color }), _jsx(Box, { flexDirection: "column", marginLeft: 2, children: calls.map((c) => {
|
|
170
|
-
const a = (c.arguments ?? {});
|
|
171
|
-
const rawPath = typeof a.path === "string" ? a.path : typeof a.file_path === "string" ? a.file_path : "";
|
|
172
|
-
const path = displayPath(rawPath);
|
|
173
|
-
const status = tools?.get(c.id)?.status;
|
|
174
|
-
const failed = status === "error";
|
|
175
|
-
const running = status === "running";
|
|
176
|
-
const marker = failed ? " ✗ " : running ? " → " : " · ";
|
|
177
|
-
return (_jsxs(Text, { color: failed ? "red" : running ? "magenta" : undefined, dimColor: !failed && !running, children: [marker, truncate(path, Math.max(20, width - 6))] }, `${keyPrefix}-f-${c.id}`));
|
|
178
|
-
}) })] }));
|
|
179
|
-
}
|
|
180
|
-
function presentVerbForReadTool(name) {
|
|
181
|
-
if (name === "read_file")
|
|
182
|
-
return "Reading";
|
|
183
|
-
if (name === "list_files")
|
|
184
|
-
return "Listing";
|
|
185
|
-
if (name === "glob")
|
|
186
|
-
return "Searching";
|
|
187
|
-
if (name === "grep")
|
|
188
|
-
return "Grepping";
|
|
189
|
-
return "Running";
|
|
190
|
-
}
|
|
191
|
-
function pastVerbForReadTool(name) {
|
|
192
|
-
if (name === "read_file")
|
|
193
|
-
return "Read";
|
|
194
|
-
if (name === "list_files")
|
|
195
|
-
return "Listed";
|
|
196
|
-
if (name === "glob")
|
|
197
|
-
return "Searched";
|
|
198
|
-
if (name === "grep")
|
|
199
|
-
return "Grepped";
|
|
200
|
-
return "Ran";
|
|
201
|
-
}
|
|
202
|
-
function nounForReadTool(name, count) {
|
|
203
|
-
if (name === "read_file")
|
|
204
|
-
return count === 1 ? "file" : "files";
|
|
205
|
-
if (name === "list_files")
|
|
206
|
-
return count === 1 ? "directory" : "directories";
|
|
207
|
-
return count === 1 ? "call" : "calls";
|
|
208
|
-
}
|
|
209
|
-
/** How many change lines we'll render before collapsing to just the +/- counts. */
|
|
210
|
-
const MAX_HUNK_LINES = 12;
|
|
211
|
-
/**
|
|
212
|
-
* Build a diff summary for a completed file-edit tool call from the
|
|
213
|
-
* tool's args. We have old_string + new_string right there, so no
|
|
214
|
-
* filesystem round-trip needed. Uses the `diff` library's LCS-based
|
|
215
|
-
* line pairing — adding a single line at the top no longer marks the
|
|
216
|
-
* whole rest of the file as "changed."
|
|
217
|
-
*/
|
|
218
|
-
function diffSummary(name, args) {
|
|
219
|
-
const a = (args ?? {});
|
|
220
|
-
if (name === "edit_file") {
|
|
221
|
-
const oldStr = typeof a.old_string === "string" ? a.old_string : "";
|
|
222
|
-
const newStr = typeof a.new_string === "string" ? a.new_string : "";
|
|
223
|
-
if (!oldStr && !newStr)
|
|
224
|
-
return null;
|
|
225
|
-
return buildDiff(oldStr, newStr);
|
|
226
|
-
}
|
|
227
|
-
if (name === "multi_edit") {
|
|
228
|
-
const edits = Array.isArray(a.edits) ? a.edits : [];
|
|
229
|
-
let added = 0;
|
|
230
|
-
let removed = 0;
|
|
231
|
-
const hunks = [];
|
|
232
|
-
let truncated = false;
|
|
233
|
-
for (const e of edits) {
|
|
234
|
-
if (!e || typeof e !== "object")
|
|
235
|
-
continue;
|
|
236
|
-
const ed = e;
|
|
237
|
-
const oldStr = typeof ed.old_string === "string" ? ed.old_string : "";
|
|
238
|
-
const newStr = typeof ed.new_string === "string" ? ed.new_string : "";
|
|
239
|
-
const sub = buildDiff(oldStr, newStr);
|
|
240
|
-
added += sub.added;
|
|
241
|
-
removed += sub.removed;
|
|
242
|
-
truncated = truncated || sub.truncated;
|
|
243
|
-
hunks.push(...sub.hunks);
|
|
244
|
-
}
|
|
245
|
-
if (added === 0 && removed === 0)
|
|
246
|
-
return null;
|
|
247
|
-
return {
|
|
248
|
-
added,
|
|
249
|
-
removed,
|
|
250
|
-
hunks: hunks.slice(0, MAX_HUNK_LINES),
|
|
251
|
-
truncated: truncated || hunks.length > MAX_HUNK_LINES,
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
if (name === "write_file") {
|
|
255
|
-
const content = typeof a.content === "string" ? a.content : "";
|
|
256
|
-
if (!content)
|
|
257
|
-
return null;
|
|
258
|
-
const lines = content.split("\n").length;
|
|
259
|
-
return { added: lines, removed: 0, hunks: [], truncated: false };
|
|
260
|
-
}
|
|
261
|
-
return null;
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* LCS-based line diff, then pair adjacent remove+add changes so we can
|
|
265
|
-
* surface a word-level highlight on each paired line. When a pair has
|
|
266
|
-
* the same number of lines on each side, we line-align them and run
|
|
267
|
-
* diffWordsWithSpace per row — that's the cleanest case and matches
|
|
268
|
-
* the user expectation of "show me what actually changed in this row."
|
|
269
|
-
*/
|
|
270
|
-
function buildDiff(oldStr, newStr) {
|
|
271
|
-
const changes = diffLines(oldStr, newStr);
|
|
272
|
-
const hunks = [];
|
|
273
|
-
let added = 0;
|
|
274
|
-
let removed = 0;
|
|
275
|
-
const lineCount = (s) => (s ? s.replace(/\n$/, "").split("\n").length : 0);
|
|
276
|
-
for (let i = 0; i < changes.length; i++) {
|
|
277
|
-
const c = changes[i];
|
|
278
|
-
if (c.added)
|
|
279
|
-
added += lineCount(c.value);
|
|
280
|
-
if (c.removed)
|
|
281
|
-
removed += lineCount(c.value);
|
|
282
|
-
const next = changes[i + 1];
|
|
283
|
-
const isPair = c.removed && next?.added;
|
|
284
|
-
if (isPair) {
|
|
285
|
-
const removeLines = c.value.replace(/\n$/, "").split("\n");
|
|
286
|
-
const addLines = next.value.replace(/\n$/, "").split("\n");
|
|
287
|
-
if (removeLines.length === addLines.length) {
|
|
288
|
-
// Paired row-by-row → word-level diff per row.
|
|
289
|
-
for (let j = 0; j < removeLines.length; j++) {
|
|
290
|
-
const parts = diffWordsWithSpace(removeLines[j], addLines[j]);
|
|
291
|
-
hunks.push({
|
|
292
|
-
type: "remove",
|
|
293
|
-
text: removeLines[j],
|
|
294
|
-
wordParts: parts.filter((p) => !p.added).map((p) => ({ text: p.value, highlight: !!p.removed })),
|
|
295
|
-
});
|
|
296
|
-
hunks.push({
|
|
297
|
-
type: "add",
|
|
298
|
-
text: addLines[j],
|
|
299
|
-
wordParts: parts.filter((p) => !p.removed).map((p) => ({ text: p.value, highlight: !!p.added })),
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
// Asymmetric pair — show all removes then all adds without word diff.
|
|
305
|
-
for (const line of removeLines)
|
|
306
|
-
hunks.push({ type: "remove", text: line });
|
|
307
|
-
for (const line of addLines)
|
|
308
|
-
hunks.push({ type: "add", text: line });
|
|
309
|
-
}
|
|
310
|
-
i++; // Consume the paired add change.
|
|
311
|
-
continue;
|
|
312
|
-
}
|
|
313
|
-
if (c.removed || c.added) {
|
|
314
|
-
const type = c.added ? "add" : "remove";
|
|
315
|
-
for (const line of c.value.replace(/\n$/, "").split("\n")) {
|
|
316
|
-
hunks.push({ type, text: line });
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
// Context (neither added nor removed) is dropped — the +N/-M
|
|
320
|
-
// counts plus the change lines themselves give enough orientation
|
|
321
|
-
// for the small previews we render.
|
|
322
|
-
}
|
|
323
|
-
const truncated = hunks.length > MAX_HUNK_LINES;
|
|
324
|
-
return { added, removed, hunks: hunks.slice(0, MAX_HUNK_LINES), truncated };
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Render the +N -M summary line, then up to MAX_HUNK_LINES change lines.
|
|
328
|
-
* Removed lines render in red, added lines in green. Within a paired
|
|
329
|
-
* remove/add row, the actually-changed words get a brighter background
|
|
330
|
-
* so the eye lands on the substantive change immediately.
|
|
331
|
-
*/
|
|
332
|
-
function DiffSummary({ diff, width, keyPrefix }) {
|
|
333
|
-
const counts = diff.truncated
|
|
334
|
-
? ` +${diff.added} -${diff.removed} (preview truncated)`
|
|
335
|
-
: ` +${diff.added} -${diff.removed}`;
|
|
336
|
-
const lineWidth = Math.max(20, width - 8);
|
|
337
|
-
return (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: counts }), diff.hunks.map((h, i) => {
|
|
338
|
-
const isRemove = h.type === "remove";
|
|
339
|
-
const sign = isRemove ? " - " : " + ";
|
|
340
|
-
const lineColor = isRemove ? "red" : "green";
|
|
341
|
-
const hlBg = isRemove ? "redBright" : "greenBright";
|
|
342
|
-
const key = `${keyPrefix}-h-${i}-${h.type}-${h.text.slice(0, 24)}`;
|
|
343
|
-
if (h.wordParts && h.wordParts.length > 0) {
|
|
344
|
-
// Truncate at the part boundary that crosses the width budget.
|
|
345
|
-
let used = 0;
|
|
346
|
-
const visibleParts = [];
|
|
347
|
-
for (const p of h.wordParts) {
|
|
348
|
-
const remaining = lineWidth - used;
|
|
349
|
-
if (remaining <= 0)
|
|
350
|
-
break;
|
|
351
|
-
if (p.text.length <= remaining) {
|
|
352
|
-
visibleParts.push(p);
|
|
353
|
-
used += p.text.length;
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
visibleParts.push({ ...p, text: `${p.text.slice(0, Math.max(0, remaining - 1))}…` });
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
// Stable keys per-word: counter-suffix is only for collision when
|
|
361
|
-
// the same word appears multiple times in a line. Avoids the
|
|
362
|
-
// array-index-as-key smell while keeping React's reconciler happy.
|
|
363
|
-
const seenCounts = new Map();
|
|
364
|
-
const keyedParts = visibleParts.map((p) => {
|
|
365
|
-
const baseKey = `${p.highlight ? "h" : "n"}:${p.text}`;
|
|
366
|
-
const count = seenCounts.get(baseKey) ?? 0;
|
|
367
|
-
seenCounts.set(baseKey, count + 1);
|
|
368
|
-
return { part: p, k: `${key}-w-${baseKey}-${count}` };
|
|
369
|
-
});
|
|
370
|
-
return (_jsxs(Box, { children: [_jsx(Text, { color: lineColor, children: sign }), _jsx(Text, { children: keyedParts.map(({ part, k }) => (_jsx(Text, { color: lineColor, backgroundColor: part.highlight ? hlBg : undefined, children: part.text }, k))) })] }, key));
|
|
371
|
-
}
|
|
372
|
-
return (_jsxs(Text, { color: lineColor, children: [sign, truncate(h.text, lineWidth)] }, key));
|
|
373
|
-
})] }));
|
|
374
|
-
}
|
|
375
|
-
const DEFAULT_MAX_TOOL_OUTPUT_LINES = 12;
|
|
376
|
-
/**
|
|
377
|
-
* Per-tool display caps. Search-style tools (grep, find, glob) produce
|
|
378
|
-
* many matches, most of which the user doesn't need to read inline —
|
|
379
|
-
* the model still sees the full result. Default is 12 lines.
|
|
380
|
-
*/
|
|
381
|
-
const TOOL_OUTPUT_LIMITS = {
|
|
382
|
-
grep: 6,
|
|
383
|
-
search_files: 6,
|
|
384
|
-
glob: 8,
|
|
385
|
-
find: 8,
|
|
386
|
-
list_files: 10,
|
|
387
|
-
};
|
|
388
|
-
/**
|
|
389
|
-
* Truncate tool output past the per-tool limit into "head + (N hidden)
|
|
390
|
-
* + tail" — long shell or grep output otherwise dominates the
|
|
391
|
-
* transcript and pushes context off-screen. The agent still gets the
|
|
392
|
-
* full output; this is purely a display trim. Errors are NEVER
|
|
393
|
-
* truncated since the user needs to see exactly what blew up.
|
|
394
|
-
*/
|
|
395
|
-
function TruncatedOutput({ text, width, keyPrefix, color, toolName, }) {
|
|
396
|
-
const max = toolName && TOOL_OUTPUT_LIMITS[toolName] !== undefined
|
|
397
|
-
? TOOL_OUTPUT_LIMITS[toolName]
|
|
398
|
-
: DEFAULT_MAX_TOOL_OUTPUT_LINES;
|
|
399
|
-
// Reserve at least 1 head + 1 tail line so the user can see the
|
|
400
|
-
// shape of the truncation; rest is head-weighted (where the
|
|
401
|
-
// interesting content usually is).
|
|
402
|
-
const tailLines = max >= 8 ? 3 : 2;
|
|
403
|
-
const headLines = Math.max(1, max - tailLines - 1);
|
|
404
|
-
const lines = text.split("\n");
|
|
405
|
-
if (color === "red" || lines.length <= max) {
|
|
406
|
-
return _jsx(WrappedLines, { text: text, width: width, keyPrefix: keyPrefix, color: color });
|
|
407
|
-
}
|
|
408
|
-
const head = lines.slice(0, headLines).join("\n");
|
|
409
|
-
const tail = lines.slice(lines.length - tailLines).join("\n");
|
|
410
|
-
const hidden = lines.length - headLines - tailLines;
|
|
411
|
-
return (_jsxs(_Fragment, { children: [_jsx(WrappedLines, { text: head, width: width, keyPrefix: `${keyPrefix}-h`, color: color }), _jsx(Text, { dimColor: true, children: `… ${hidden} line${hidden === 1 ? "" : "s"} hidden …` }), _jsx(WrappedLines, { text: tail, width: width, keyPrefix: `${keyPrefix}-t`, color: color })] }));
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Render text as N <Text> elements, one per pre-wrapped line. Stacks
|
|
415
|
-
* vertically inside the parent column-flex Box. Pre-wrap means the
|
|
416
|
-
* wraps happen at word boundaries, so when the user select-and-copies
|
|
417
|
-
* they get clean line endings — no mid-word breaks at column edges.
|
|
418
|
-
*/
|
|
419
|
-
function WrappedLines({ text, width, keyPrefix, color, dimColor, italic }) {
|
|
420
|
-
const lines = wrapText(text, width);
|
|
421
|
-
return (_jsx(_Fragment, { children: lines.map((line, i) => (
|
|
422
|
-
// Wrapped lines have no per-line state — <Text> is pure-presentational —
|
|
423
|
-
// so reusing instances on re-wrap is harmless; index-as-key is fine here.
|
|
424
|
-
// biome-ignore lint/suspicious/noArrayIndexKey: stateless leaf, reuse is safe
|
|
425
|
-
_jsx(Text, { color: color, dimColor: dimColor, italic: italic, children: line.length === 0 ? " " : line }, `${keyPrefix}:${i}`))) }));
|
|
426
|
-
}
|
|
427
111
|
/**
|
|
428
112
|
* Render an array-content user message — typically text + one or more
|
|
429
113
|
* image attachments. Text blocks pass through `WrappedLines`; image
|
|
@@ -464,205 +148,4 @@ function blockKey(block, idx) {
|
|
|
464
148
|
return `tc-${block.id}`;
|
|
465
149
|
return `${block.type}-${idx}`;
|
|
466
150
|
}
|
|
467
|
-
function summarizeArgs(args) {
|
|
468
|
-
if (!args || typeof args !== "object")
|
|
469
|
-
return "";
|
|
470
|
-
const entries = Object.entries(args).slice(0, 3);
|
|
471
|
-
return entries
|
|
472
|
-
.map(([k, v]) => {
|
|
473
|
-
const s = typeof v === "string" ? `"${v.slice(0, 30)}"` : String(v);
|
|
474
|
-
return `${k}=${s}`;
|
|
475
|
-
})
|
|
476
|
-
.join(", ");
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Render a tool call as a human-friendly action label, the way Claude
|
|
480
|
-
* Code formats them: present-tense verb + the salient argument
|
|
481
|
-
* (file path, command, URL, search query, etc.) instead of the raw
|
|
482
|
-
* `toolName(k1=v1, k2=v2)` shape. Falls back to the verbose form for
|
|
483
|
-
* tools we don't have a special case for.
|
|
484
|
-
*/
|
|
485
|
-
function toolActionLabel(name, args) {
|
|
486
|
-
const a = (args ?? {});
|
|
487
|
-
const str = (k) => (typeof a[k] === "string" ? a[k] : "");
|
|
488
|
-
const path = displayPath(str("path") || str("file_path"));
|
|
489
|
-
switch (name) {
|
|
490
|
-
case "read_file":
|
|
491
|
-
return `Reading ${path}`;
|
|
492
|
-
case "write_file":
|
|
493
|
-
return `Writing ${path}`;
|
|
494
|
-
case "edit_file":
|
|
495
|
-
return `Editing ${path}`;
|
|
496
|
-
case "multi_edit":
|
|
497
|
-
return `Editing ${path}`;
|
|
498
|
-
case "notebook_edit":
|
|
499
|
-
return `Editing notebook ${path}`;
|
|
500
|
-
case "list_files":
|
|
501
|
-
return `Listing ${path || "."}`;
|
|
502
|
-
case "glob":
|
|
503
|
-
return `Searching ${str("pattern")}`;
|
|
504
|
-
case "grep":
|
|
505
|
-
return `Searching for "${str("pattern")}"`;
|
|
506
|
-
case "shell":
|
|
507
|
-
return `Running: ${truncate(str("command") || str("cmd"), 60)}`;
|
|
508
|
-
case "web_fetch":
|
|
509
|
-
return `Fetching ${str("url")}`;
|
|
510
|
-
case "web_search":
|
|
511
|
-
return `Searching: ${truncate(str("query"), 60)}`;
|
|
512
|
-
case "git_status":
|
|
513
|
-
return "git status";
|
|
514
|
-
case "git_diff":
|
|
515
|
-
return `git diff${str("target") ? ` ${str("target")}` : ""}`;
|
|
516
|
-
case "git_log":
|
|
517
|
-
return "git log";
|
|
518
|
-
case "git_commit":
|
|
519
|
-
return `git commit: ${truncate(str("message"), 50)}`;
|
|
520
|
-
case "git_branch":
|
|
521
|
-
return str("name") ? `git branch ${str("name")}` : "git branches";
|
|
522
|
-
case "enter_worktree":
|
|
523
|
-
return `Entering worktree ${str("branch") || str("name")}`;
|
|
524
|
-
case "exit_worktree":
|
|
525
|
-
return "Leaving worktree";
|
|
526
|
-
case "enter_plan_mode":
|
|
527
|
-
return "Entering plan mode";
|
|
528
|
-
case "exit_plan_mode":
|
|
529
|
-
return "Exiting plan mode";
|
|
530
|
-
case "dispatch_agent":
|
|
531
|
-
return `Dispatching subagent: ${truncate(str("task"), 60)}`;
|
|
532
|
-
case "ask_user":
|
|
533
|
-
return `Asking: ${truncate(str("question"), 60)}`;
|
|
534
|
-
case "create_task":
|
|
535
|
-
return `Task: ${truncate(str("subject"), 60)}`;
|
|
536
|
-
case "update_task":
|
|
537
|
-
return `Updating task ${str("taskId")}`;
|
|
538
|
-
case "list_tasks":
|
|
539
|
-
return "Listing tasks";
|
|
540
|
-
case "get_task":
|
|
541
|
-
return `Reading task ${str("taskId")}`;
|
|
542
|
-
case "save_memory":
|
|
543
|
-
return `Saving memory: ${str("name") || str("type")}`;
|
|
544
|
-
case "read_memory":
|
|
545
|
-
return str("filename") ? `Reading memory ${str("filename")}` : "Reading MEMORY.md";
|
|
546
|
-
case "config":
|
|
547
|
-
return str("path") ? `config(${str("path")})` : "Reading config";
|
|
548
|
-
default:
|
|
549
|
-
return `${name}(${summarizeArgs(args)})`;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
function truncate(s, n) {
|
|
553
|
-
if (s.length <= n)
|
|
554
|
-
return s;
|
|
555
|
-
return `${s.slice(0, n - 1)}…`;
|
|
556
|
-
}
|
|
557
|
-
/**
|
|
558
|
-
* Show a path relative to the working directory when it's inside (so
|
|
559
|
-
* "src/ui/Message.tsx" instead of "/home/half/.../src/ui/Message.tsx"),
|
|
560
|
-
* but keep it absolute when it points outside the project — that's
|
|
561
|
-
* useful information the user should see at full fidelity. Empty
|
|
562
|
-
* strings pass through unchanged.
|
|
563
|
-
*/
|
|
564
|
-
function displayPath(p) {
|
|
565
|
-
if (!p)
|
|
566
|
-
return p;
|
|
567
|
-
const visible = makeRelative(p);
|
|
568
|
-
return hyperlinkPath(visible, p);
|
|
569
|
-
}
|
|
570
|
-
function makeRelative(p) {
|
|
571
|
-
if (!p.startsWith(pathSep))
|
|
572
|
-
return p; // already relative
|
|
573
|
-
const cwd = process.cwd();
|
|
574
|
-
const rel = relativePath(cwd, p);
|
|
575
|
-
if (!rel || rel.startsWith(".."))
|
|
576
|
-
return p; // outside cwd — keep absolute
|
|
577
|
-
return rel;
|
|
578
|
-
}
|
|
579
|
-
/**
|
|
580
|
-
* Wrap a visible path in an OSC 8 hyperlink so terminals that support
|
|
581
|
-
* it (Ghostty, iTerm2, Kitty, recent gnome-terminal) make file paths
|
|
582
|
-
* clickable — click opens the file in $EDITOR / the OS default. The
|
|
583
|
-
* escape is zero-width and well-handled by wrap-ansi for width calc.
|
|
584
|
-
* Terminals that don't recognise OSC 8 silently strip it, so the
|
|
585
|
-
* fallback is just "non-clickable plain text" — no visible breakage.
|
|
586
|
-
* Opt-out: NO_HYPERLINK=1 (FORCE_HYPERLINK is honoured the other way,
|
|
587
|
-
* matching the common npm `supports-hyperlinks` convention).
|
|
588
|
-
*/
|
|
589
|
-
function hyperlinkPath(visible, rawPath) {
|
|
590
|
-
if (process.env.NO_HYPERLINK === "1")
|
|
591
|
-
return visible;
|
|
592
|
-
const absolute = isAbsolute(rawPath) ? rawPath : resolveAbsolute(process.cwd(), rawPath);
|
|
593
|
-
const url = `file://${absolute.split(pathSep).map(encodeURIComponent).join("/")}`;
|
|
594
|
-
return `\x1b]8;;${url}\x1b\\${visible}\x1b]8;;\x1b\\`;
|
|
595
|
-
}
|
|
596
|
-
/**
|
|
597
|
-
* Past-tense action label, used when a tool has finished. Same shape
|
|
598
|
-
* as `toolActionLabel` but with the verbs swapped to past tense:
|
|
599
|
-
* "Reading X" → "Read X", "Editing Y" → "Edited Y", etc.
|
|
600
|
-
*/
|
|
601
|
-
function toolActionPast(name, args) {
|
|
602
|
-
const a = (args ?? {});
|
|
603
|
-
const str = (k) => (typeof a[k] === "string" ? a[k] : "");
|
|
604
|
-
const path = displayPath(str("path") || str("file_path"));
|
|
605
|
-
switch (name) {
|
|
606
|
-
case "read_file":
|
|
607
|
-
return `Read ${path}`;
|
|
608
|
-
case "write_file":
|
|
609
|
-
return `Wrote ${path}`;
|
|
610
|
-
case "edit_file":
|
|
611
|
-
return `Edited ${path}`;
|
|
612
|
-
case "multi_edit":
|
|
613
|
-
return `Edited ${path}`;
|
|
614
|
-
case "notebook_edit":
|
|
615
|
-
return `Edited notebook ${path}`;
|
|
616
|
-
case "list_files":
|
|
617
|
-
return `Listed ${path || "."}`;
|
|
618
|
-
case "glob":
|
|
619
|
-
return `Searched ${str("pattern")}`;
|
|
620
|
-
case "grep":
|
|
621
|
-
return `Searched for "${str("pattern")}"`;
|
|
622
|
-
case "shell":
|
|
623
|
-
return `Ran: ${truncate(str("command") || str("cmd"), 60)}`;
|
|
624
|
-
case "web_fetch":
|
|
625
|
-
return `Fetched ${str("url")}`;
|
|
626
|
-
case "web_search":
|
|
627
|
-
return `Searched: ${truncate(str("query"), 60)}`;
|
|
628
|
-
case "git_status":
|
|
629
|
-
return "git status";
|
|
630
|
-
case "git_diff":
|
|
631
|
-
return `git diff${str("target") ? ` ${str("target")}` : ""}`;
|
|
632
|
-
case "git_log":
|
|
633
|
-
return "git log";
|
|
634
|
-
case "git_commit":
|
|
635
|
-
return `git commit: ${truncate(str("message"), 50)}`;
|
|
636
|
-
case "git_branch":
|
|
637
|
-
return str("name") ? `git branch ${str("name")}` : "git branches";
|
|
638
|
-
case "enter_worktree":
|
|
639
|
-
return `Entered worktree ${str("branch") || str("name")}`;
|
|
640
|
-
case "exit_worktree":
|
|
641
|
-
return "Left worktree";
|
|
642
|
-
case "enter_plan_mode":
|
|
643
|
-
return "Entered plan mode";
|
|
644
|
-
case "exit_plan_mode":
|
|
645
|
-
return "Exited plan mode";
|
|
646
|
-
case "dispatch_agent":
|
|
647
|
-
return `Subagent: ${truncate(str("task"), 60)}`;
|
|
648
|
-
case "ask_user":
|
|
649
|
-
return `Asked: ${truncate(str("question"), 60)}`;
|
|
650
|
-
case "create_task":
|
|
651
|
-
return `Created task: ${truncate(str("subject"), 60)}`;
|
|
652
|
-
case "update_task":
|
|
653
|
-
return `Updated task ${str("taskId")}`;
|
|
654
|
-
case "list_tasks":
|
|
655
|
-
return "Listed tasks";
|
|
656
|
-
case "get_task":
|
|
657
|
-
return `Read task ${str("taskId")}`;
|
|
658
|
-
case "save_memory":
|
|
659
|
-
return `Saved memory: ${str("name") || str("type")}`;
|
|
660
|
-
case "read_memory":
|
|
661
|
-
return str("filename") ? `Read memory ${str("filename")}` : "Read MEMORY.md";
|
|
662
|
-
case "config":
|
|
663
|
-
return str("path") ? `config(${str("path")})` : "Read config";
|
|
664
|
-
default:
|
|
665
|
-
return `${name}(${summarizeArgs(args)})`;
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
151
|
//# sourceMappingURL=Message.js.map
|
package/dist/ui/Message.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/ui/Message.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/ui/Message.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { diffLines, diffWordsWithSpace } from "diff";
|
|
3
|
+
import { Box, Text } from "ink";
|
|
4
|
+
import { truncate } from "./tool-labels.js";
|
|
5
|
+
/** How many change lines we'll render before collapsing to just the +/- counts. */
|
|
6
|
+
const MAX_HUNK_LINES = 12;
|
|
7
|
+
/**
|
|
8
|
+
* Build a diff summary for a completed file-edit tool call from the
|
|
9
|
+
* tool's args. We have old_string + new_string right there, so no
|
|
10
|
+
* filesystem round-trip needed. Uses the `diff` library's LCS-based
|
|
11
|
+
* line pairing — adding a single line at the top no longer marks the
|
|
12
|
+
* whole rest of the file as "changed."
|
|
13
|
+
*/
|
|
14
|
+
export function diffSummary(name, args) {
|
|
15
|
+
const a = (args ?? {});
|
|
16
|
+
if (name === "edit_file") {
|
|
17
|
+
const oldStr = typeof a.old_string === "string" ? a.old_string : "";
|
|
18
|
+
const newStr = typeof a.new_string === "string" ? a.new_string : "";
|
|
19
|
+
if (!oldStr && !newStr)
|
|
20
|
+
return null;
|
|
21
|
+
return buildDiff(oldStr, newStr);
|
|
22
|
+
}
|
|
23
|
+
if (name === "multi_edit") {
|
|
24
|
+
const edits = Array.isArray(a.edits) ? a.edits : [];
|
|
25
|
+
let added = 0;
|
|
26
|
+
let removed = 0;
|
|
27
|
+
const hunks = [];
|
|
28
|
+
let truncated = false;
|
|
29
|
+
for (const e of edits) {
|
|
30
|
+
if (!e || typeof e !== "object")
|
|
31
|
+
continue;
|
|
32
|
+
const ed = e;
|
|
33
|
+
const oldStr = typeof ed.old_string === "string" ? ed.old_string : "";
|
|
34
|
+
const newStr = typeof ed.new_string === "string" ? ed.new_string : "";
|
|
35
|
+
const sub = buildDiff(oldStr, newStr);
|
|
36
|
+
added += sub.added;
|
|
37
|
+
removed += sub.removed;
|
|
38
|
+
truncated = truncated || sub.truncated;
|
|
39
|
+
hunks.push(...sub.hunks);
|
|
40
|
+
}
|
|
41
|
+
if (added === 0 && removed === 0)
|
|
42
|
+
return null;
|
|
43
|
+
return {
|
|
44
|
+
added,
|
|
45
|
+
removed,
|
|
46
|
+
hunks: hunks.slice(0, MAX_HUNK_LINES),
|
|
47
|
+
truncated: truncated || hunks.length > MAX_HUNK_LINES,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (name === "write_file") {
|
|
51
|
+
const content = typeof a.content === "string" ? a.content : "";
|
|
52
|
+
if (!content)
|
|
53
|
+
return null;
|
|
54
|
+
const lines = content.split("\n").length;
|
|
55
|
+
return { added: lines, removed: 0, hunks: [], truncated: false };
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* LCS-based line diff, then pair adjacent remove+add changes so we can
|
|
61
|
+
* surface a word-level highlight on each paired line. When a pair has
|
|
62
|
+
* the same number of lines on each side, we line-align them and run
|
|
63
|
+
* diffWordsWithSpace per row — that's the cleanest case and matches
|
|
64
|
+
* the user expectation of "show me what actually changed in this row."
|
|
65
|
+
*/
|
|
66
|
+
function buildDiff(oldStr, newStr) {
|
|
67
|
+
const changes = diffLines(oldStr, newStr);
|
|
68
|
+
const hunks = [];
|
|
69
|
+
let added = 0;
|
|
70
|
+
let removed = 0;
|
|
71
|
+
const lineCount = (s) => (s ? s.replace(/\n$/, "").split("\n").length : 0);
|
|
72
|
+
for (let i = 0; i < changes.length; i++) {
|
|
73
|
+
const c = changes[i];
|
|
74
|
+
if (c.added)
|
|
75
|
+
added += lineCount(c.value);
|
|
76
|
+
if (c.removed)
|
|
77
|
+
removed += lineCount(c.value);
|
|
78
|
+
const next = changes[i + 1];
|
|
79
|
+
const isPair = c.removed && next?.added;
|
|
80
|
+
if (isPair) {
|
|
81
|
+
const removeLines = c.value.replace(/\n$/, "").split("\n");
|
|
82
|
+
const addLines = next.value.replace(/\n$/, "").split("\n");
|
|
83
|
+
if (removeLines.length === addLines.length) {
|
|
84
|
+
// Paired row-by-row → word-level diff per row.
|
|
85
|
+
for (let j = 0; j < removeLines.length; j++) {
|
|
86
|
+
const parts = diffWordsWithSpace(removeLines[j], addLines[j]);
|
|
87
|
+
hunks.push({
|
|
88
|
+
type: "remove",
|
|
89
|
+
text: removeLines[j],
|
|
90
|
+
wordParts: parts.filter((p) => !p.added).map((p) => ({ text: p.value, highlight: !!p.removed })),
|
|
91
|
+
});
|
|
92
|
+
hunks.push({
|
|
93
|
+
type: "add",
|
|
94
|
+
text: addLines[j],
|
|
95
|
+
wordParts: parts.filter((p) => !p.removed).map((p) => ({ text: p.value, highlight: !!p.added })),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Asymmetric pair — show all removes then all adds without word diff.
|
|
101
|
+
for (const line of removeLines)
|
|
102
|
+
hunks.push({ type: "remove", text: line });
|
|
103
|
+
for (const line of addLines)
|
|
104
|
+
hunks.push({ type: "add", text: line });
|
|
105
|
+
}
|
|
106
|
+
i++; // Consume the paired add change.
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (c.removed || c.added) {
|
|
110
|
+
const type = c.added ? "add" : "remove";
|
|
111
|
+
for (const line of c.value.replace(/\n$/, "").split("\n")) {
|
|
112
|
+
hunks.push({ type, text: line });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Context (neither added nor removed) is dropped — the +N/-M
|
|
116
|
+
// counts plus the change lines themselves give enough orientation
|
|
117
|
+
// for the small previews we render.
|
|
118
|
+
}
|
|
119
|
+
const truncated = hunks.length > MAX_HUNK_LINES;
|
|
120
|
+
return { added, removed, hunks: hunks.slice(0, MAX_HUNK_LINES), truncated };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Render the +N -M summary line, then up to MAX_HUNK_LINES change lines.
|
|
124
|
+
* Removed lines render in red, added lines in green. Within a paired
|
|
125
|
+
* remove/add row, the actually-changed words get a brighter background
|
|
126
|
+
* so the eye lands on the substantive change immediately.
|
|
127
|
+
*/
|
|
128
|
+
export function DiffSummary({ diff, width, keyPrefix }) {
|
|
129
|
+
const counts = diff.truncated
|
|
130
|
+
? ` +${diff.added} -${diff.removed} (preview truncated)`
|
|
131
|
+
: ` +${diff.added} -${diff.removed}`;
|
|
132
|
+
const lineWidth = Math.max(20, width - 8);
|
|
133
|
+
return (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: counts }), diff.hunks.map((h, i) => {
|
|
134
|
+
const isRemove = h.type === "remove";
|
|
135
|
+
const sign = isRemove ? " - " : " + ";
|
|
136
|
+
const lineColor = isRemove ? "red" : "green";
|
|
137
|
+
const hlBg = isRemove ? "redBright" : "greenBright";
|
|
138
|
+
const key = `${keyPrefix}-h-${i}-${h.type}-${h.text.slice(0, 24)}`;
|
|
139
|
+
if (h.wordParts && h.wordParts.length > 0) {
|
|
140
|
+
// Truncate at the part boundary that crosses the width budget.
|
|
141
|
+
let used = 0;
|
|
142
|
+
const visibleParts = [];
|
|
143
|
+
for (const p of h.wordParts) {
|
|
144
|
+
const remaining = lineWidth - used;
|
|
145
|
+
if (remaining <= 0)
|
|
146
|
+
break;
|
|
147
|
+
if (p.text.length <= remaining) {
|
|
148
|
+
visibleParts.push(p);
|
|
149
|
+
used += p.text.length;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
visibleParts.push({ ...p, text: `${p.text.slice(0, Math.max(0, remaining - 1))}…` });
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Stable keys per-word: counter-suffix is only for collision when
|
|
157
|
+
// the same word appears multiple times in a line. Avoids the
|
|
158
|
+
// array-index-as-key smell while keeping React's reconciler happy.
|
|
159
|
+
const seenCounts = new Map();
|
|
160
|
+
const keyedParts = visibleParts.map((p) => {
|
|
161
|
+
const baseKey = `${p.highlight ? "h" : "n"}:${p.text}`;
|
|
162
|
+
const count = seenCounts.get(baseKey) ?? 0;
|
|
163
|
+
seenCounts.set(baseKey, count + 1);
|
|
164
|
+
return { part: p, k: `${key}-w-${baseKey}-${count}` };
|
|
165
|
+
});
|
|
166
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: lineColor, children: sign }), _jsx(Text, { children: keyedParts.map(({ part, k }) => (_jsx(Text, { color: lineColor, backgroundColor: part.highlight ? hlBg : undefined, children: part.text }, k))) })] }, key));
|
|
167
|
+
}
|
|
168
|
+
return (_jsxs(Text, { color: lineColor, children: [sign, truncate(h.text, lineWidth)] }, key));
|
|
169
|
+
})] }));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=diff-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-summary.js","sourceRoot":"","sources":["../../src/ui/diff-summary.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/paths.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { isAbsolute, sep as pathSep, relative as relativePath, resolve as resolveAbsolute } from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Show a path relative to the working directory when it's inside (so
|
|
4
|
+
* "src/ui/Message.tsx" instead of "/home/half/.../src/ui/Message.tsx"),
|
|
5
|
+
* but keep it absolute when it points outside the project — that's
|
|
6
|
+
* useful information the user should see at full fidelity. Empty
|
|
7
|
+
* strings pass through unchanged. The returned string is wrapped in an
|
|
8
|
+
* OSC 8 hyperlink so supporting terminals make it clickable.
|
|
9
|
+
*/
|
|
10
|
+
export function displayPath(p) {
|
|
11
|
+
if (!p)
|
|
12
|
+
return p;
|
|
13
|
+
const visible = makeRelative(p);
|
|
14
|
+
return hyperlinkPath(visible, p);
|
|
15
|
+
}
|
|
16
|
+
export function makeRelative(p) {
|
|
17
|
+
if (!p.startsWith(pathSep))
|
|
18
|
+
return p; // already relative
|
|
19
|
+
const cwd = process.cwd();
|
|
20
|
+
const rel = relativePath(cwd, p);
|
|
21
|
+
if (!rel || rel.startsWith(".."))
|
|
22
|
+
return p; // outside cwd — keep absolute
|
|
23
|
+
return rel;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wrap a visible path in an OSC 8 hyperlink so terminals that support
|
|
27
|
+
* it (Ghostty, iTerm2, Kitty, recent gnome-terminal) make file paths
|
|
28
|
+
* clickable — click opens the file in $EDITOR / the OS default. The
|
|
29
|
+
* escape is zero-width and well-handled by wrap-ansi for width calc.
|
|
30
|
+
* Terminals that don't recognise OSC 8 silently strip it, so the
|
|
31
|
+
* fallback is just "non-clickable plain text" — no visible breakage.
|
|
32
|
+
* Opt-out: NO_HYPERLINK=1.
|
|
33
|
+
*/
|
|
34
|
+
export function hyperlinkPath(visible, rawPath) {
|
|
35
|
+
if (process.env.NO_HYPERLINK === "1")
|
|
36
|
+
return visible;
|
|
37
|
+
const absolute = isAbsolute(rawPath) ? rawPath : resolveAbsolute(process.cwd(), rawPath);
|
|
38
|
+
const url = `file://${absolute.split(pathSep).map(encodeURIComponent).join("/")}`;
|
|
39
|
+
return `\x1b]8;;${url}\x1b\\${visible}\x1b]8;;\x1b\\`;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/ui/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AAE7G;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACrC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B;IAC1E,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe;IAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAClF,OAAO,WAAW,GAAG,SAAS,OAAO,gBAAgB,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { DiffSummary, diffSummary } from "./diff-summary.js";
|
|
5
|
+
import { displayPath } from "./paths.js";
|
|
6
|
+
import { nounForReadTool, pastVerbForReadTool, presentVerbForReadTool, toolActionLabel, toolActionPast, truncate, } from "./tool-labels.js";
|
|
7
|
+
import { WrappedLines } from "./wrapped-lines.js";
|
|
8
|
+
const SPINNER_FRAMES = ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"];
|
|
9
|
+
export function useSpinner(active, intervalMs = 90) {
|
|
10
|
+
const [frame, setFrame] = useState(0);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!active)
|
|
13
|
+
return;
|
|
14
|
+
const id = setInterval(() => setFrame((f) => (f + 1) % SPINNER_FRAMES.length), intervalMs);
|
|
15
|
+
return () => clearInterval(id);
|
|
16
|
+
}, [active, intervalMs]);
|
|
17
|
+
return SPINNER_FRAMES[frame];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Tool calls that are pure reads — runs of these collapse into a single
|
|
21
|
+
* "Read N files" / "Searched 3 patterns" line, the Claude Code pattern.
|
|
22
|
+
* Keep the set tight: anything that mutates state, runs shell, or has a
|
|
23
|
+
* meaningful argument shape (grep query, fetch URL) reads weird when
|
|
24
|
+
* collapsed and stays per-row.
|
|
25
|
+
*/
|
|
26
|
+
export const COLLAPSIBLE_READ_TOOLS = new Set(["read_file"]);
|
|
27
|
+
/**
|
|
28
|
+
* One tool-call row that morphs through three states:
|
|
29
|
+
* running → spinner + present tense ("⣾ Reading src/index.ts")
|
|
30
|
+
* done → ✓ + past tense ("✓ Read src/index.ts")
|
|
31
|
+
* error → ✗ + past tense + red ("✗ Read src/index.ts")
|
|
32
|
+
*
|
|
33
|
+
* State source: the per-session `tools` Map on ChatState. If no entry
|
|
34
|
+
* exists for this id (e.g. an old session being replayed without
|
|
35
|
+
* inflight tracking), we render the past-tense "done" form — safe
|
|
36
|
+
* fallback that never strands the UI on a fake spinner.
|
|
37
|
+
*/
|
|
38
|
+
export function ToolCallLine({ id, name, args, width, keyPrefix, tools, }) {
|
|
39
|
+
const exec = tools?.get(id);
|
|
40
|
+
const status = exec?.status ?? "done";
|
|
41
|
+
const isRunning = status === "running";
|
|
42
|
+
const spinner = useSpinner(isRunning);
|
|
43
|
+
if (isRunning) {
|
|
44
|
+
return (_jsx(WrappedLines, { text: `${spinner} ${toolActionLabel(name, args)}…`, width: width, keyPrefix: keyPrefix, color: "magenta" }));
|
|
45
|
+
}
|
|
46
|
+
const isError = status === "error";
|
|
47
|
+
const glyph = isError ? "✗" : "✓";
|
|
48
|
+
const past = toolActionPast(name, args);
|
|
49
|
+
const diff = !isError ? diffSummary(name, args) : null;
|
|
50
|
+
return (_jsxs(_Fragment, { children: [_jsx(WrappedLines, { text: `${glyph} ${past}`, width: width, keyPrefix: keyPrefix, color: isError ? "red" : "magenta" }), diff ? _jsx(DiffSummary, { diff: diff, width: width, keyPrefix: `${keyPrefix}-diff` }) : null] }));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Collapsed row for a run of pure-read tool calls. Renders as
|
|
54
|
+
* "✓ Read N files" with the per-file paths in a dim indented list
|
|
55
|
+
* beneath. If any call errored, the glyph flips to ✗ and the line
|
|
56
|
+
* goes red — we still show the paths so the user can see what
|
|
57
|
+
* failed.
|
|
58
|
+
*/
|
|
59
|
+
export function CollapsedReadGroup({ calls, width, keyPrefix, tools, }) {
|
|
60
|
+
const statuses = calls.map((c) => tools?.get(c.id)?.status);
|
|
61
|
+
const anyRunning = statuses.some((s) => s === "running");
|
|
62
|
+
const anyError = statuses.some((s) => s === "error");
|
|
63
|
+
const doneCount = statuses.filter((s) => s !== "running").length;
|
|
64
|
+
const spinner = useSpinner(anyRunning);
|
|
65
|
+
const glyph = anyRunning ? spinner : anyError ? "✗" : "✓";
|
|
66
|
+
const color = anyError ? "red" : "magenta";
|
|
67
|
+
const verb = anyRunning ? presentVerbForReadTool(calls[0].name) : pastVerbForReadTool(calls[0].name);
|
|
68
|
+
const noun = nounForReadTool(calls[0].name, calls.length);
|
|
69
|
+
const header = anyRunning
|
|
70
|
+
? `${glyph} ${verb} ${doneCount} of ${calls.length} ${noun}…`
|
|
71
|
+
: `${glyph} ${verb} ${calls.length} ${noun}`;
|
|
72
|
+
return (_jsxs(_Fragment, { children: [_jsx(WrappedLines, { text: header, width: width, keyPrefix: keyPrefix, color: color }), _jsx(Box, { flexDirection: "column", marginLeft: 2, children: calls.map((c) => {
|
|
73
|
+
const a = (c.arguments ?? {});
|
|
74
|
+
const rawPath = typeof a.path === "string" ? a.path : typeof a.file_path === "string" ? a.file_path : "";
|
|
75
|
+
const path = displayPath(rawPath);
|
|
76
|
+
const status = tools?.get(c.id)?.status;
|
|
77
|
+
const failed = status === "error";
|
|
78
|
+
const running = status === "running";
|
|
79
|
+
const marker = failed ? " ✗ " : running ? " → " : " · ";
|
|
80
|
+
return (_jsxs(Text, { color: failed ? "red" : running ? "magenta" : undefined, dimColor: !failed && !running, children: [marker, truncate(path, Math.max(20, width - 6))] }, `${keyPrefix}-f-${c.id}`));
|
|
81
|
+
}) })] }));
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=tool-call-line.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-line.js","sourceRoot":"","sources":["../../src/ui/tool-call-line.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { displayPath } from "./paths.js";
|
|
2
|
+
/**
|
|
3
|
+
* Render a tool call as a human-friendly action label: present-tense
|
|
4
|
+
* verb + the salient argument (file path, command, URL, search query,
|
|
5
|
+
* etc.) instead of the raw `toolName(k1=v1, k2=v2)` shape. Falls back
|
|
6
|
+
* to the verbose form for tools we don't have a special case for.
|
|
7
|
+
*/
|
|
8
|
+
export function toolActionLabel(name, args) {
|
|
9
|
+
const a = (args ?? {});
|
|
10
|
+
const str = (k) => (typeof a[k] === "string" ? a[k] : "");
|
|
11
|
+
const path = displayPath(str("path") || str("file_path"));
|
|
12
|
+
switch (name) {
|
|
13
|
+
case "read_file":
|
|
14
|
+
return `Reading ${path}`;
|
|
15
|
+
case "write_file":
|
|
16
|
+
return `Writing ${path}`;
|
|
17
|
+
case "edit_file":
|
|
18
|
+
return `Editing ${path}`;
|
|
19
|
+
case "multi_edit":
|
|
20
|
+
return `Editing ${path}`;
|
|
21
|
+
case "notebook_edit":
|
|
22
|
+
return `Editing notebook ${path}`;
|
|
23
|
+
case "list_files":
|
|
24
|
+
return `Listing ${path || "."}`;
|
|
25
|
+
case "glob":
|
|
26
|
+
return `Searching ${str("pattern")}`;
|
|
27
|
+
case "grep":
|
|
28
|
+
return `Searching for "${str("pattern")}"`;
|
|
29
|
+
case "shell":
|
|
30
|
+
return `Running: ${truncate(str("command") || str("cmd"), 60)}`;
|
|
31
|
+
case "web_fetch":
|
|
32
|
+
return `Fetching ${str("url")}`;
|
|
33
|
+
case "web_search":
|
|
34
|
+
return `Searching: ${truncate(str("query"), 60)}`;
|
|
35
|
+
case "git_status":
|
|
36
|
+
return "git status";
|
|
37
|
+
case "git_diff":
|
|
38
|
+
return `git diff${str("target") ? ` ${str("target")}` : ""}`;
|
|
39
|
+
case "git_log":
|
|
40
|
+
return "git log";
|
|
41
|
+
case "git_commit":
|
|
42
|
+
return `git commit: ${truncate(str("message"), 50)}`;
|
|
43
|
+
case "git_branch":
|
|
44
|
+
return str("name") ? `git branch ${str("name")}` : "git branches";
|
|
45
|
+
case "enter_worktree":
|
|
46
|
+
return `Entering worktree ${str("branch") || str("name")}`;
|
|
47
|
+
case "exit_worktree":
|
|
48
|
+
return "Leaving worktree";
|
|
49
|
+
case "enter_plan_mode":
|
|
50
|
+
return "Entering plan mode";
|
|
51
|
+
case "exit_plan_mode":
|
|
52
|
+
return "Exiting plan mode";
|
|
53
|
+
case "dispatch_agent":
|
|
54
|
+
return `Dispatching subagent: ${truncate(str("task"), 60)}`;
|
|
55
|
+
case "ask_user":
|
|
56
|
+
return `Asking: ${truncate(str("question"), 60)}`;
|
|
57
|
+
case "create_task":
|
|
58
|
+
return `Task: ${truncate(str("subject"), 60)}`;
|
|
59
|
+
case "update_task":
|
|
60
|
+
return `Updating task ${str("taskId")}`;
|
|
61
|
+
case "list_tasks":
|
|
62
|
+
return "Listing tasks";
|
|
63
|
+
case "get_task":
|
|
64
|
+
return `Reading task ${str("taskId")}`;
|
|
65
|
+
case "save_memory":
|
|
66
|
+
return `Saving memory: ${str("name") || str("type")}`;
|
|
67
|
+
case "read_memory":
|
|
68
|
+
return str("filename") ? `Reading memory ${str("filename")}` : "Reading MEMORY.md";
|
|
69
|
+
case "config":
|
|
70
|
+
return str("path") ? `config(${str("path")})` : "Reading config";
|
|
71
|
+
default:
|
|
72
|
+
return `${name}(${summarizeArgs(args)})`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Past-tense action label, used when a tool has finished. Same shape
|
|
77
|
+
* as `toolActionLabel` but with the verbs swapped to past tense.
|
|
78
|
+
*/
|
|
79
|
+
export function toolActionPast(name, args) {
|
|
80
|
+
const a = (args ?? {});
|
|
81
|
+
const str = (k) => (typeof a[k] === "string" ? a[k] : "");
|
|
82
|
+
const path = displayPath(str("path") || str("file_path"));
|
|
83
|
+
switch (name) {
|
|
84
|
+
case "read_file":
|
|
85
|
+
return `Read ${path}`;
|
|
86
|
+
case "write_file":
|
|
87
|
+
return `Wrote ${path}`;
|
|
88
|
+
case "edit_file":
|
|
89
|
+
return `Edited ${path}`;
|
|
90
|
+
case "multi_edit":
|
|
91
|
+
return `Edited ${path}`;
|
|
92
|
+
case "notebook_edit":
|
|
93
|
+
return `Edited notebook ${path}`;
|
|
94
|
+
case "list_files":
|
|
95
|
+
return `Listed ${path || "."}`;
|
|
96
|
+
case "glob":
|
|
97
|
+
return `Searched ${str("pattern")}`;
|
|
98
|
+
case "grep":
|
|
99
|
+
return `Searched for "${str("pattern")}"`;
|
|
100
|
+
case "shell":
|
|
101
|
+
return `Ran: ${truncate(str("command") || str("cmd"), 60)}`;
|
|
102
|
+
case "web_fetch":
|
|
103
|
+
return `Fetched ${str("url")}`;
|
|
104
|
+
case "web_search":
|
|
105
|
+
return `Searched: ${truncate(str("query"), 60)}`;
|
|
106
|
+
case "git_status":
|
|
107
|
+
return "git status";
|
|
108
|
+
case "git_diff":
|
|
109
|
+
return `git diff${str("target") ? ` ${str("target")}` : ""}`;
|
|
110
|
+
case "git_log":
|
|
111
|
+
return "git log";
|
|
112
|
+
case "git_commit":
|
|
113
|
+
return `git commit: ${truncate(str("message"), 50)}`;
|
|
114
|
+
case "git_branch":
|
|
115
|
+
return str("name") ? `git branch ${str("name")}` : "git branches";
|
|
116
|
+
case "enter_worktree":
|
|
117
|
+
return `Entered worktree ${str("branch") || str("name")}`;
|
|
118
|
+
case "exit_worktree":
|
|
119
|
+
return "Left worktree";
|
|
120
|
+
case "enter_plan_mode":
|
|
121
|
+
return "Entered plan mode";
|
|
122
|
+
case "exit_plan_mode":
|
|
123
|
+
return "Exited plan mode";
|
|
124
|
+
case "dispatch_agent":
|
|
125
|
+
return `Subagent: ${truncate(str("task"), 60)}`;
|
|
126
|
+
case "ask_user":
|
|
127
|
+
return `Asked: ${truncate(str("question"), 60)}`;
|
|
128
|
+
case "create_task":
|
|
129
|
+
return `Created task: ${truncate(str("subject"), 60)}`;
|
|
130
|
+
case "update_task":
|
|
131
|
+
return `Updated task ${str("taskId")}`;
|
|
132
|
+
case "list_tasks":
|
|
133
|
+
return "Listed tasks";
|
|
134
|
+
case "get_task":
|
|
135
|
+
return `Read task ${str("taskId")}`;
|
|
136
|
+
case "save_memory":
|
|
137
|
+
return `Saved memory: ${str("name") || str("type")}`;
|
|
138
|
+
case "read_memory":
|
|
139
|
+
return str("filename") ? `Read memory ${str("filename")}` : "Read MEMORY.md";
|
|
140
|
+
case "config":
|
|
141
|
+
return str("path") ? `config(${str("path")})` : "Read config";
|
|
142
|
+
default:
|
|
143
|
+
return `${name}(${summarizeArgs(args)})`;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Verb used when describing a *running* read-style tool in collapse rows. */
|
|
147
|
+
export function presentVerbForReadTool(name) {
|
|
148
|
+
if (name === "read_file")
|
|
149
|
+
return "Reading";
|
|
150
|
+
if (name === "list_files")
|
|
151
|
+
return "Listing";
|
|
152
|
+
if (name === "glob")
|
|
153
|
+
return "Searching";
|
|
154
|
+
if (name === "grep")
|
|
155
|
+
return "Grepping";
|
|
156
|
+
return "Running";
|
|
157
|
+
}
|
|
158
|
+
/** Verb used when describing a *finished* read-style tool in collapse rows. */
|
|
159
|
+
export function pastVerbForReadTool(name) {
|
|
160
|
+
if (name === "read_file")
|
|
161
|
+
return "Read";
|
|
162
|
+
if (name === "list_files")
|
|
163
|
+
return "Listed";
|
|
164
|
+
if (name === "glob")
|
|
165
|
+
return "Searched";
|
|
166
|
+
if (name === "grep")
|
|
167
|
+
return "Grepped";
|
|
168
|
+
return "Ran";
|
|
169
|
+
}
|
|
170
|
+
/** Plural noun used to describe N items of a given read tool. */
|
|
171
|
+
export function nounForReadTool(name, count) {
|
|
172
|
+
if (name === "read_file")
|
|
173
|
+
return count === 1 ? "file" : "files";
|
|
174
|
+
if (name === "list_files")
|
|
175
|
+
return count === 1 ? "directory" : "directories";
|
|
176
|
+
return count === 1 ? "call" : "calls";
|
|
177
|
+
}
|
|
178
|
+
export function truncate(s, n) {
|
|
179
|
+
if (s.length <= n)
|
|
180
|
+
return s;
|
|
181
|
+
return `${s.slice(0, n - 1)}…`;
|
|
182
|
+
}
|
|
183
|
+
function summarizeArgs(args) {
|
|
184
|
+
if (!args || typeof args !== "object")
|
|
185
|
+
return "";
|
|
186
|
+
const entries = Object.entries(args).slice(0, 3);
|
|
187
|
+
return entries
|
|
188
|
+
.map(([k, v]) => {
|
|
189
|
+
const s = typeof v === "string" ? `"${v.slice(0, 30)}"` : String(v);
|
|
190
|
+
return `${k}=${s}`;
|
|
191
|
+
})
|
|
192
|
+
.join(", ");
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=tool-labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-labels.js","sourceRoot":"","sources":["../../src/ui/tool-labels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from "ink";
|
|
3
|
+
import { WrappedLines } from "./wrapped-lines.js";
|
|
4
|
+
const DEFAULT_MAX_TOOL_OUTPUT_LINES = 12;
|
|
5
|
+
/**
|
|
6
|
+
* Per-tool display caps. Search-style tools (grep, find, glob) produce
|
|
7
|
+
* many matches, most of which the user doesn't need to read inline —
|
|
8
|
+
* the model still sees the full result. Default is 12 lines.
|
|
9
|
+
*/
|
|
10
|
+
export const TOOL_OUTPUT_LIMITS = {
|
|
11
|
+
grep: 6,
|
|
12
|
+
search_files: 6,
|
|
13
|
+
glob: 8,
|
|
14
|
+
find: 8,
|
|
15
|
+
list_files: 10,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Truncate tool output past the per-tool limit into "head + (N hidden)
|
|
19
|
+
* + tail" — long shell or grep output otherwise dominates the
|
|
20
|
+
* transcript and pushes context off-screen. The agent still gets the
|
|
21
|
+
* full output; this is purely a display trim. Errors are NEVER
|
|
22
|
+
* truncated since the user needs to see exactly what blew up.
|
|
23
|
+
*/
|
|
24
|
+
export function TruncatedOutput({ text, width, keyPrefix, color, toolName, }) {
|
|
25
|
+
const max = toolName && TOOL_OUTPUT_LIMITS[toolName] !== undefined
|
|
26
|
+
? TOOL_OUTPUT_LIMITS[toolName]
|
|
27
|
+
: DEFAULT_MAX_TOOL_OUTPUT_LINES;
|
|
28
|
+
// Reserve at least 1 head + 1 tail line so the user can see the
|
|
29
|
+
// shape of the truncation; rest is head-weighted (where the
|
|
30
|
+
// interesting content usually is).
|
|
31
|
+
const tailLines = max >= 8 ? 3 : 2;
|
|
32
|
+
const headLines = Math.max(1, max - tailLines - 1);
|
|
33
|
+
const lines = text.split("\n");
|
|
34
|
+
if (color === "red" || lines.length <= max) {
|
|
35
|
+
return _jsx(WrappedLines, { text: text, width: width, keyPrefix: keyPrefix, color: color });
|
|
36
|
+
}
|
|
37
|
+
const head = lines.slice(0, headLines).join("\n");
|
|
38
|
+
const tail = lines.slice(lines.length - tailLines).join("\n");
|
|
39
|
+
const hidden = lines.length - headLines - tailLines;
|
|
40
|
+
return (_jsxs(_Fragment, { children: [_jsx(WrappedLines, { text: head, width: width, keyPrefix: `${keyPrefix}-h`, color: color }), _jsx(Text, { dimColor: true, children: `… ${hidden} line${hidden === 1 ? "" : "s"} hidden …` }), _jsx(WrappedLines, { text: tail, width: width, keyPrefix: `${keyPrefix}-t`, color: color })] }));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=truncated-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncated-output.js","sourceRoot":"","sources":["../../src/ui/truncated-output.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACzD,IAAI,EAAE,CAAC;IACP,YAAY,EAAE,CAAC;IACf,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,EAAE;CACd,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,GAOR;IACA,MAAM,GAAG,GACR,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,KAAK,SAAS;QACrD,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QAC9B,CAAC,CAAC,6BAA6B,CAAC;IAClC,gEAAgE;IAChE,4DAA4D;IAC5D,mCAAmC;IACnC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QAC5C,OAAO,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;IACvF,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,OAAO,CACN,8BACC,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE,KAAK,GAAI,EACrF,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,GAAQ,EAC7E,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE,KAAK,GAAI,IACnF,CACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from "ink";
|
|
3
|
+
import { wrapText } from "./wrap.js";
|
|
4
|
+
/**
|
|
5
|
+
* Render text as N <Text> elements, one per pre-wrapped line. Stacks
|
|
6
|
+
* vertically inside the parent column-flex Box. Pre-wrap means the
|
|
7
|
+
* wraps happen at word boundaries, so when the user select-and-copies
|
|
8
|
+
* they get clean line endings — no mid-word breaks at column edges.
|
|
9
|
+
*/
|
|
10
|
+
export function WrappedLines({ text, width, keyPrefix, color, dimColor, italic }) {
|
|
11
|
+
const lines = wrapText(text, width);
|
|
12
|
+
return (_jsx(_Fragment, { children: lines.map((line, i) => (
|
|
13
|
+
// Wrapped lines have no per-line state — <Text> is pure-presentational —
|
|
14
|
+
// so reusing instances on re-wrap is harmless; index-as-key is fine here.
|
|
15
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: stateless leaf, reuse is safe
|
|
16
|
+
_jsx(Text, { color: color, dimColor: dimColor, italic: italic, children: line.length === 0 ? " " : line }, `${keyPrefix}:${i}`))) }));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=wrapped-lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapped-lines.js","sourceRoot":"","sources":["../../src/ui/wrapped-lines.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAWrC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAqB;IAClG,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,CACN,4BACE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACvB,yEAAyE;QACzE,0EAA0E;QAC1E,8EAA8E;QAC9E,KAAC,IAAI,IAA2B,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,YAC9E,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IADrB,GAAG,SAAS,IAAI,CAAC,EAAE,CAEvB,CACP,CAAC,GACA,CACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED