codebase-cli 2.0.0-pre.33 → 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.
@@ -1,22 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { diffLines, diffWordsWithSpace } from "diff";
3
2
  import { Box, Text } from "ink";
4
- import { useEffect, useState } from "react";
5
3
  import { Markdown } from "./Markdown.js";
6
- import { displayPath } from "./paths.js";
7
- import { nounForReadTool, pastVerbForReadTool, presentVerbForReadTool, toolActionLabel, toolActionPast, truncate, } from "./tool-labels.js";
8
- import { wrapText } from "./wrap.js";
9
- const SPINNER_FRAMES = ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"];
10
- function useSpinner(active, intervalMs = 90) {
11
- const [frame, setFrame] = useState(0);
12
- useEffect(() => {
13
- if (!active)
14
- return;
15
- const id = setInterval(() => setFrame((f) => (f + 1) % SPINNER_FRAMES.length), intervalMs);
16
- return () => clearInterval(id);
17
- }, [active, intervalMs]);
18
- return SPINNER_FRAMES[frame];
19
- }
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";
20
7
  const ROLE_STYLE = {
21
8
  user: { accent: "yellow", label: "you" },
22
9
  assistant: { accent: "cyan", label: "codebase" },
@@ -69,39 +56,6 @@ function MessageBody({ message, width, tools, }) {
69
56
  }
70
57
  return null;
71
58
  }
72
- /**
73
- * One tool-call row that morphs through three states:
74
- * running → spinner + present tense ("⣾ Reading src/index.ts")
75
- * done → ✓ + past tense ("✓ Read src/index.ts")
76
- * error → ✗ + past tense + red ("✗ Read src/index.ts")
77
- *
78
- * State source: the per-session `tools` Map on ChatState. If no entry
79
- * exists for this id (e.g. an old session being replayed without
80
- * inflight tracking), we render the past-tense "done" form — safe
81
- * fallback that never strands the UI on a fake spinner.
82
- */
83
- function ToolCallLine({ id, name, args, width, keyPrefix, tools, }) {
84
- const exec = tools?.get(id);
85
- const status = exec?.status ?? "done";
86
- const isRunning = status === "running";
87
- const spinner = useSpinner(isRunning);
88
- if (isRunning) {
89
- return (_jsx(WrappedLines, { text: `${spinner} ${toolActionLabel(name, args)}…`, width: width, keyPrefix: keyPrefix, color: "magenta" }));
90
- }
91
- const isError = status === "error";
92
- const glyph = isError ? "✗" : "✓";
93
- const past = toolActionPast(name, args);
94
- const diff = !isError ? diffSummary(name, args) : null;
95
- 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] }));
96
- }
97
- /**
98
- * Tool calls that are pure reads — runs of these collapse into a single
99
- * "Read N files" / "Searched 3 patterns" line, the Claude Code pattern.
100
- * Keep the set tight: anything that mutates state, runs shell, or has a
101
- * meaningful argument shape (grep query, fetch URL) reads weird when
102
- * collapsed and stays per-row.
103
- */
104
- const COLLAPSIBLE_READ_TOOLS = new Set(["read_file"]);
105
59
  /**
106
60
  * Walk an assistant message's content blocks, collapsing runs of
107
61
  * consecutive `read_file` (and other safe read-only) tool calls into a
@@ -154,248 +108,6 @@ function renderAssistantBlocks(content, width, tools) {
154
108
  }
155
109
  return out;
156
110
  }
157
- function CollapsedReadGroup({ calls, width, keyPrefix, tools, }) {
158
- const statuses = calls.map((c) => tools?.get(c.id)?.status);
159
- const anyRunning = statuses.some((s) => s === "running");
160
- const anyError = statuses.some((s) => s === "error");
161
- const doneCount = statuses.filter((s) => s !== "running").length;
162
- const spinner = useSpinner(anyRunning);
163
- const glyph = anyRunning ? spinner : anyError ? "✗" : "✓";
164
- const color = anyError ? "red" : "magenta";
165
- const verb = anyRunning ? presentVerbForReadTool(calls[0].name) : pastVerbForReadTool(calls[0].name);
166
- const noun = nounForReadTool(calls[0].name, calls.length);
167
- const header = anyRunning
168
- ? `${glyph} ${verb} ${doneCount} of ${calls.length} ${noun}…`
169
- : `${glyph} ${verb} ${calls.length} ${noun}`;
170
- return (_jsxs(_Fragment, { children: [_jsx(WrappedLines, { text: header, width: width, keyPrefix: keyPrefix, color: color }), _jsx(Box, { flexDirection: "column", marginLeft: 2, children: calls.map((c) => {
171
- const a = (c.arguments ?? {});
172
- const rawPath = typeof a.path === "string" ? a.path : typeof a.file_path === "string" ? a.file_path : "";
173
- const path = displayPath(rawPath);
174
- const status = tools?.get(c.id)?.status;
175
- const failed = status === "error";
176
- const running = status === "running";
177
- const marker = failed ? " ✗ " : running ? " → " : " · ";
178
- 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}`));
179
- }) })] }));
180
- }
181
- /** How many change lines we'll render before collapsing to just the +/- counts. */
182
- const MAX_HUNK_LINES = 12;
183
- /**
184
- * Build a diff summary for a completed file-edit tool call from the
185
- * tool's args. We have old_string + new_string right there, so no
186
- * filesystem round-trip needed. Uses the `diff` library's LCS-based
187
- * line pairing — adding a single line at the top no longer marks the
188
- * whole rest of the file as "changed."
189
- */
190
- function diffSummary(name, args) {
191
- const a = (args ?? {});
192
- if (name === "edit_file") {
193
- const oldStr = typeof a.old_string === "string" ? a.old_string : "";
194
- const newStr = typeof a.new_string === "string" ? a.new_string : "";
195
- if (!oldStr && !newStr)
196
- return null;
197
- return buildDiff(oldStr, newStr);
198
- }
199
- if (name === "multi_edit") {
200
- const edits = Array.isArray(a.edits) ? a.edits : [];
201
- let added = 0;
202
- let removed = 0;
203
- const hunks = [];
204
- let truncated = false;
205
- for (const e of edits) {
206
- if (!e || typeof e !== "object")
207
- continue;
208
- const ed = e;
209
- const oldStr = typeof ed.old_string === "string" ? ed.old_string : "";
210
- const newStr = typeof ed.new_string === "string" ? ed.new_string : "";
211
- const sub = buildDiff(oldStr, newStr);
212
- added += sub.added;
213
- removed += sub.removed;
214
- truncated = truncated || sub.truncated;
215
- hunks.push(...sub.hunks);
216
- }
217
- if (added === 0 && removed === 0)
218
- return null;
219
- return {
220
- added,
221
- removed,
222
- hunks: hunks.slice(0, MAX_HUNK_LINES),
223
- truncated: truncated || hunks.length > MAX_HUNK_LINES,
224
- };
225
- }
226
- if (name === "write_file") {
227
- const content = typeof a.content === "string" ? a.content : "";
228
- if (!content)
229
- return null;
230
- const lines = content.split("\n").length;
231
- return { added: lines, removed: 0, hunks: [], truncated: false };
232
- }
233
- return null;
234
- }
235
- /**
236
- * LCS-based line diff, then pair adjacent remove+add changes so we can
237
- * surface a word-level highlight on each paired line. When a pair has
238
- * the same number of lines on each side, we line-align them and run
239
- * diffWordsWithSpace per row — that's the cleanest case and matches
240
- * the user expectation of "show me what actually changed in this row."
241
- */
242
- function buildDiff(oldStr, newStr) {
243
- const changes = diffLines(oldStr, newStr);
244
- const hunks = [];
245
- let added = 0;
246
- let removed = 0;
247
- const lineCount = (s) => (s ? s.replace(/\n$/, "").split("\n").length : 0);
248
- for (let i = 0; i < changes.length; i++) {
249
- const c = changes[i];
250
- if (c.added)
251
- added += lineCount(c.value);
252
- if (c.removed)
253
- removed += lineCount(c.value);
254
- const next = changes[i + 1];
255
- const isPair = c.removed && next?.added;
256
- if (isPair) {
257
- const removeLines = c.value.replace(/\n$/, "").split("\n");
258
- const addLines = next.value.replace(/\n$/, "").split("\n");
259
- if (removeLines.length === addLines.length) {
260
- // Paired row-by-row → word-level diff per row.
261
- for (let j = 0; j < removeLines.length; j++) {
262
- const parts = diffWordsWithSpace(removeLines[j], addLines[j]);
263
- hunks.push({
264
- type: "remove",
265
- text: removeLines[j],
266
- wordParts: parts.filter((p) => !p.added).map((p) => ({ text: p.value, highlight: !!p.removed })),
267
- });
268
- hunks.push({
269
- type: "add",
270
- text: addLines[j],
271
- wordParts: parts.filter((p) => !p.removed).map((p) => ({ text: p.value, highlight: !!p.added })),
272
- });
273
- }
274
- }
275
- else {
276
- // Asymmetric pair — show all removes then all adds without word diff.
277
- for (const line of removeLines)
278
- hunks.push({ type: "remove", text: line });
279
- for (const line of addLines)
280
- hunks.push({ type: "add", text: line });
281
- }
282
- i++; // Consume the paired add change.
283
- continue;
284
- }
285
- if (c.removed || c.added) {
286
- const type = c.added ? "add" : "remove";
287
- for (const line of c.value.replace(/\n$/, "").split("\n")) {
288
- hunks.push({ type, text: line });
289
- }
290
- }
291
- // Context (neither added nor removed) is dropped — the +N/-M
292
- // counts plus the change lines themselves give enough orientation
293
- // for the small previews we render.
294
- }
295
- const truncated = hunks.length > MAX_HUNK_LINES;
296
- return { added, removed, hunks: hunks.slice(0, MAX_HUNK_LINES), truncated };
297
- }
298
- /**
299
- * Render the +N -M summary line, then up to MAX_HUNK_LINES change lines.
300
- * Removed lines render in red, added lines in green. Within a paired
301
- * remove/add row, the actually-changed words get a brighter background
302
- * so the eye lands on the substantive change immediately.
303
- */
304
- function DiffSummary({ diff, width, keyPrefix }) {
305
- const counts = diff.truncated
306
- ? ` +${diff.added} -${diff.removed} (preview truncated)`
307
- : ` +${diff.added} -${diff.removed}`;
308
- const lineWidth = Math.max(20, width - 8);
309
- return (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: counts }), diff.hunks.map((h, i) => {
310
- const isRemove = h.type === "remove";
311
- const sign = isRemove ? " - " : " + ";
312
- const lineColor = isRemove ? "red" : "green";
313
- const hlBg = isRemove ? "redBright" : "greenBright";
314
- const key = `${keyPrefix}-h-${i}-${h.type}-${h.text.slice(0, 24)}`;
315
- if (h.wordParts && h.wordParts.length > 0) {
316
- // Truncate at the part boundary that crosses the width budget.
317
- let used = 0;
318
- const visibleParts = [];
319
- for (const p of h.wordParts) {
320
- const remaining = lineWidth - used;
321
- if (remaining <= 0)
322
- break;
323
- if (p.text.length <= remaining) {
324
- visibleParts.push(p);
325
- used += p.text.length;
326
- }
327
- else {
328
- visibleParts.push({ ...p, text: `${p.text.slice(0, Math.max(0, remaining - 1))}…` });
329
- break;
330
- }
331
- }
332
- // Stable keys per-word: counter-suffix is only for collision when
333
- // the same word appears multiple times in a line. Avoids the
334
- // array-index-as-key smell while keeping React's reconciler happy.
335
- const seenCounts = new Map();
336
- const keyedParts = visibleParts.map((p) => {
337
- const baseKey = `${p.highlight ? "h" : "n"}:${p.text}`;
338
- const count = seenCounts.get(baseKey) ?? 0;
339
- seenCounts.set(baseKey, count + 1);
340
- return { part: p, k: `${key}-w-${baseKey}-${count}` };
341
- });
342
- 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));
343
- }
344
- return (_jsxs(Text, { color: lineColor, children: [sign, truncate(h.text, lineWidth)] }, key));
345
- })] }));
346
- }
347
- const DEFAULT_MAX_TOOL_OUTPUT_LINES = 12;
348
- /**
349
- * Per-tool display caps. Search-style tools (grep, find, glob) produce
350
- * many matches, most of which the user doesn't need to read inline —
351
- * the model still sees the full result. Default is 12 lines.
352
- */
353
- const TOOL_OUTPUT_LIMITS = {
354
- grep: 6,
355
- search_files: 6,
356
- glob: 8,
357
- find: 8,
358
- list_files: 10,
359
- };
360
- /**
361
- * Truncate tool output past the per-tool limit into "head + (N hidden)
362
- * + tail" — long shell or grep output otherwise dominates the
363
- * transcript and pushes context off-screen. The agent still gets the
364
- * full output; this is purely a display trim. Errors are NEVER
365
- * truncated since the user needs to see exactly what blew up.
366
- */
367
- function TruncatedOutput({ text, width, keyPrefix, color, toolName, }) {
368
- const max = toolName && TOOL_OUTPUT_LIMITS[toolName] !== undefined
369
- ? TOOL_OUTPUT_LIMITS[toolName]
370
- : DEFAULT_MAX_TOOL_OUTPUT_LINES;
371
- // Reserve at least 1 head + 1 tail line so the user can see the
372
- // shape of the truncation; rest is head-weighted (where the
373
- // interesting content usually is).
374
- const tailLines = max >= 8 ? 3 : 2;
375
- const headLines = Math.max(1, max - tailLines - 1);
376
- const lines = text.split("\n");
377
- if (color === "red" || lines.length <= max) {
378
- return _jsx(WrappedLines, { text: text, width: width, keyPrefix: keyPrefix, color: color });
379
- }
380
- const head = lines.slice(0, headLines).join("\n");
381
- const tail = lines.slice(lines.length - tailLines).join("\n");
382
- const hidden = lines.length - headLines - tailLines;
383
- 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 })] }));
384
- }
385
- /**
386
- * Render text as N <Text> elements, one per pre-wrapped line. Stacks
387
- * vertically inside the parent column-flex Box. Pre-wrap means the
388
- * wraps happen at word boundaries, so when the user select-and-copies
389
- * they get clean line endings — no mid-word breaks at column edges.
390
- */
391
- function WrappedLines({ text, width, keyPrefix, color, dimColor, italic }) {
392
- const lines = wrapText(text, width);
393
- return (_jsx(_Fragment, { children: lines.map((line, i) => (
394
- // Wrapped lines have no per-line state — <Text> is pure-presentational —
395
- // so reusing instances on re-wrap is harmless; index-as-key is fine here.
396
- // biome-ignore lint/suspicious/noArrayIndexKey: stateless leaf, reuse is safe
397
- _jsx(Text, { color: color, dimColor: dimColor, italic: italic, children: line.length === 0 ? " " : line }, `${keyPrefix}:${i}`))) }));
398
- }
399
111
  /**
400
112
  * Render an array-content user message — typically text + one or more
401
113
  * image attachments. Text blocks pass through `WrappedLines`; image
@@ -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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"}
@@ -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,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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebase-cli",
3
- "version": "2.0.0-pre.33",
3
+ "version": "2.0.0-pre.34",
4
4
  "description": "Codebase CLI — a TypeScript coding agent on the pi-mono runtime. OAuth-aware, any LLM provider, single install.",
5
5
  "keywords": [
6
6
  "ai",