@heyhuynhgiabuu/pi-pretty 0.6.30 → 0.7.0
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/CHANGELOG.md +33 -0
- package/README.md +21 -0
- package/dist/claude-style.d.ts +45 -0
- package/dist/claude-style.d.ts.map +1 -0
- package/dist/claude-style.js +582 -0
- package/dist/claude-style.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -12
- package/dist/index.js.map +1 -1
- package/dist/prompt-editor.d.ts +4 -1
- package/dist/prompt-editor.d.ts.map +1 -1
- package/dist/prompt-editor.js +27 -12
- package/dist/prompt-editor.js.map +1 -1
- package/dist/render.d.ts +10 -7
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +41 -25
- package/dist/render.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +17 -13
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +15 -17
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +10 -8
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/ls.d.ts.map +1 -1
- package/dist/tools/ls.js +11 -9
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +25 -21
- package/dist/tools/read.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/working-indicator.d.ts +2 -0
- package/dist/working-indicator.d.ts.map +1 -1
- package/dist/working-indicator.js +20 -8
- package/dist/working-indicator.js.map +1 -1
- package/package.json +5 -5
- package/src/claude-style.ts +650 -0
- package/src/config.ts +3 -0
- package/src/index.ts +35 -15
- package/src/prompt-editor.ts +26 -11
- package/src/render.ts +54 -24
- package/src/tools/bash.ts +28 -23
- package/src/tools/find.ts +20 -16
- package/src/tools/grep.ts +10 -6
- package/src/tools/ls.ts +17 -8
- package/src/tools/read.ts +29 -30
- package/src/types.ts +9 -0
- package/src/working-indicator.ts +20 -8
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-pretty: opt-in "claudecode" tool style (config `toolStyle: "claudecode"`).
|
|
3
|
+
*
|
|
4
|
+
* ✓ Read (src/a.ts) collapsed call row: status icon (spinner while running), bold name
|
|
5
|
+
* └ 42 lines · ◷ 0.02s collapsed result row hanging from a connector
|
|
6
|
+
* ✓ Done (3 tool calls) consecutive tool calls fold into one group row
|
|
7
|
+
* ├─ • Bash(ls)
|
|
8
|
+
* └─ • Read(a.ts)
|
|
9
|
+
*
|
|
10
|
+
* Collapsed rows replace the pretty output; Ctrl+O (expanded) keeps pi-pretty's
|
|
11
|
+
* full rendering. Grouping is a pure render-time projection of the chat children.
|
|
12
|
+
* Modeled on the look of sting8k/pi-droid-styling's `claudecode` preset.
|
|
13
|
+
*/
|
|
14
|
+
import { highlightCode, keyText } from "@earendil-works/pi-coding-agent";
|
|
15
|
+
import { Container, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
16
|
+
import { ELAPSED_KEY, shortPath } from "./helpers.js";
|
|
17
|
+
const ANSI_RE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, "g");
|
|
18
|
+
// Kitty (`ESC _G`) and iTerm2 (`ESC ]1337;File=`) inline-image payload lines.
|
|
19
|
+
const IMAGE_LINE_RE = new RegExp(`${String.fromCharCode(27)}(?:_G|\\]1337;File=)`);
|
|
20
|
+
const isImageLine = (line) => IMAGE_LINE_RE.test(line);
|
|
21
|
+
// Leading padding after any SGR prefix (thought rows start with `ESC[3m ` etc.).
|
|
22
|
+
const LEADING_SPACE_RE = new RegExp(`^((?:${String.fromCharCode(27)}\\[[0-9;]*m)*) +`);
|
|
23
|
+
const stripAnsi = (text) => text.replace(ANSI_RE, "");
|
|
24
|
+
const PLAIN_THEME = { fg: (_color, text) => text, bold: (text) => text };
|
|
25
|
+
// Theme for group rows, which are built outside any tool's render context.
|
|
26
|
+
let groupTheme = PLAIN_THEME;
|
|
27
|
+
export function setClaudeStyleTheme(theme) {
|
|
28
|
+
groupTheme = theme;
|
|
29
|
+
}
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Rows
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
34
|
+
const SPINNER_INTERVAL_MS = 80;
|
|
35
|
+
/** Time-based so every host redraw (the working indicator already ticks while streaming) advances it. */
|
|
36
|
+
const spinnerFrame = () => SPINNER_FRAMES[Math.floor(Date.now() / SPINNER_INTERVAL_MS) % SPINNER_FRAMES.length];
|
|
37
|
+
const ICON_SUCCESS = "✓";
|
|
38
|
+
const ICON_ERROR = "✗";
|
|
39
|
+
const ICON_PENDING = "·";
|
|
40
|
+
function stateIcon(theme, state) {
|
|
41
|
+
switch (state) {
|
|
42
|
+
case "pending":
|
|
43
|
+
return theme.fg("dim", ICON_PENDING);
|
|
44
|
+
case "running":
|
|
45
|
+
return theme.fg("accent", spinnerFrame());
|
|
46
|
+
case "error":
|
|
47
|
+
return theme.fg("error", ICON_ERROR);
|
|
48
|
+
default:
|
|
49
|
+
return theme.fg("success", ICON_SUCCESS);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Dim ` (ctrl+o to expand)` / ` (ctrl+o to collapse)` using the user's binding; empty when unbound. */
|
|
53
|
+
function toggleHint(theme, verb) {
|
|
54
|
+
const key = keyText("app.tools.expand");
|
|
55
|
+
return key ? ` ${theme.fg("dim", `(${key} to ${verb})`)}` : "";
|
|
56
|
+
}
|
|
57
|
+
function indentOf(ctx) {
|
|
58
|
+
const pad = ctx.outputPad;
|
|
59
|
+
return " ".repeat(typeof pad === "number" && pad >= 0 ? Math.floor(pad) : 1);
|
|
60
|
+
}
|
|
61
|
+
function oneLine(text) {
|
|
62
|
+
return text.replace(/\s*\r?\n\s*/g, " ").trim();
|
|
63
|
+
}
|
|
64
|
+
function firstString(args, keys) {
|
|
65
|
+
for (const key of keys) {
|
|
66
|
+
const value = args[key];
|
|
67
|
+
if (typeof value === "string" && value)
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
return "";
|
|
71
|
+
}
|
|
72
|
+
function callDetail(toolName, args) {
|
|
73
|
+
const home = process.env.HOME ?? "";
|
|
74
|
+
const cwd = process.cwd();
|
|
75
|
+
const path = (value) => shortPath(cwd, home, value);
|
|
76
|
+
switch (toolName) {
|
|
77
|
+
case "read": {
|
|
78
|
+
const offset = typeof args.offset === "number" ? `:${args.offset}` : "";
|
|
79
|
+
return `${path(firstString(args, ["path", "file_path"]))}${offset}`;
|
|
80
|
+
}
|
|
81
|
+
case "bash":
|
|
82
|
+
return oneLine(firstString(args, ["command"]));
|
|
83
|
+
case "grep": {
|
|
84
|
+
const where = firstString(args, ["path", "glob"]);
|
|
85
|
+
return [firstString(args, ["pattern"]), where ? path(where) : ""].filter(Boolean).join(", ");
|
|
86
|
+
}
|
|
87
|
+
case "find": {
|
|
88
|
+
const where = firstString(args, ["path"]);
|
|
89
|
+
return [firstString(args, ["pattern"]), where ? path(where) : ""].filter(Boolean).join(", ");
|
|
90
|
+
}
|
|
91
|
+
case "ls":
|
|
92
|
+
return path(firstString(args, ["path"]) || ".");
|
|
93
|
+
case "write":
|
|
94
|
+
case "edit":
|
|
95
|
+
return path(firstString(args, ["path", "file_path"]));
|
|
96
|
+
case "codemode":
|
|
97
|
+
return oneLine(firstScriptLine(firstString(args, ["code"])));
|
|
98
|
+
case "recall": {
|
|
99
|
+
const query = firstString(args, ["query"]);
|
|
100
|
+
const expand = Array.isArray(args.expand) ? args.expand.map((index) => `#${index}`).join(" ") : "";
|
|
101
|
+
const page = typeof args.page === "number" && args.page > 1 ? `page ${args.page}` : "";
|
|
102
|
+
return [
|
|
103
|
+
expand ? `expand ${expand}` : query ? `"${oneLine(query)}"` : "browse",
|
|
104
|
+
args.scope === "all" ? "all sessions" : "",
|
|
105
|
+
page,
|
|
106
|
+
]
|
|
107
|
+
.filter(Boolean)
|
|
108
|
+
.join(", ");
|
|
109
|
+
}
|
|
110
|
+
case "apply_patch": {
|
|
111
|
+
const paths = (Array.isArray(args.changes) ? args.changes : [])
|
|
112
|
+
.map((change) => (typeof change?.path === "string" ? path(change.path) : ""))
|
|
113
|
+
.filter(Boolean);
|
|
114
|
+
return paths.length > 1 ? `${paths[0]}, +${paths.length - 1} more` : (paths[0] ?? "");
|
|
115
|
+
}
|
|
116
|
+
default: {
|
|
117
|
+
const first = Object.values(args).find((value) => typeof value === "string" && value);
|
|
118
|
+
return first ? oneLine(first) : "";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** First line of a codemode script that is not its `// @options:` line. */
|
|
123
|
+
function firstScriptLine(code) {
|
|
124
|
+
return code.split("\n").find((line) => line.trim() !== "" && !/^\s*\/\/\s*@options:/.test(line)) ?? "";
|
|
125
|
+
}
|
|
126
|
+
/** The header lines codemode prepends to its output, which say nothing about what happened. */
|
|
127
|
+
const CODEMODE_HEADER_LINE = /^(Script (completed|failed)|Wall time [\d.]+ seconds|Output:|Script error:)$/;
|
|
128
|
+
function resultText(result) {
|
|
129
|
+
return (result?.content ?? [])
|
|
130
|
+
.filter((block) => block.type === "text")
|
|
131
|
+
.map((block) => block.text ?? "")
|
|
132
|
+
.join("\n");
|
|
133
|
+
}
|
|
134
|
+
function countLines(text, skip) {
|
|
135
|
+
return text.split("\n").filter((line) => line.trim() !== "" && !(skip && skip.test(line.trim()))).length;
|
|
136
|
+
}
|
|
137
|
+
function plural(count, noun, pluralNoun = `${noun}s`) {
|
|
138
|
+
return `${count} ${count === 1 ? noun : pluralNoun}`;
|
|
139
|
+
}
|
|
140
|
+
/** `2 files`, or `empty` when there is nothing to count. */
|
|
141
|
+
function countOrEmpty(count, empty, noun, pluralNoun) {
|
|
142
|
+
return count === 0 ? empty : plural(count, noun, pluralNoun);
|
|
143
|
+
}
|
|
144
|
+
/** `+3 -1` with additions in the success color and removals in the error color. */
|
|
145
|
+
function diffCounts(added, removed, theme) {
|
|
146
|
+
return [theme.fg("success", `+${added}`), theme.fg("error", `-${removed}`)].join(" ");
|
|
147
|
+
}
|
|
148
|
+
function countPatchLines(patch) {
|
|
149
|
+
let added = 0;
|
|
150
|
+
let removed = 0;
|
|
151
|
+
for (const line of patch.split("\n")) {
|
|
152
|
+
if (line.startsWith("+") && !line.startsWith("+++"))
|
|
153
|
+
added++;
|
|
154
|
+
else if (line.startsWith("-") && !line.startsWith("---"))
|
|
155
|
+
removed++;
|
|
156
|
+
}
|
|
157
|
+
return { added, removed };
|
|
158
|
+
}
|
|
159
|
+
/** pi-diff's apply_patch: per-file `diff` hunks (updates), full content (adds) or old content (deletes). */
|
|
160
|
+
function summarizeApplyPatch(result, theme) {
|
|
161
|
+
const applied = Array.isArray(result?.details?.result?.applied)
|
|
162
|
+
? result.details.result.applied
|
|
163
|
+
: [];
|
|
164
|
+
if (applied.length === 0)
|
|
165
|
+
return theme.fg("muted", "applied");
|
|
166
|
+
let added = 0;
|
|
167
|
+
let removed = 0;
|
|
168
|
+
for (const change of applied) {
|
|
169
|
+
if (typeof change.diff === "string") {
|
|
170
|
+
const counts = countPatchLines(change.diff);
|
|
171
|
+
added += counts.added;
|
|
172
|
+
removed += counts.removed;
|
|
173
|
+
}
|
|
174
|
+
else if (change.action === "add" && typeof change.newContent === "string") {
|
|
175
|
+
added += countLines(change.newContent);
|
|
176
|
+
}
|
|
177
|
+
else if (change.action === "delete" && typeof change.oldContent === "string") {
|
|
178
|
+
removed += countLines(change.oldContent);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return [diffCounts(added, removed, theme), theme.fg("muted", plural(applied.length, "file"))].join(theme.fg("dim", " · "));
|
|
182
|
+
}
|
|
183
|
+
/** Written by pi-diff (`diff`/`new`/`noChange`, `editInfo`) or Pi's builtin edit (`patch`). */
|
|
184
|
+
function summarizeFileChange(toolName, result, theme) {
|
|
185
|
+
const details = (result?.details ?? {});
|
|
186
|
+
const note = (text) => theme.fg("muted", text);
|
|
187
|
+
if (details._type === "noChange")
|
|
188
|
+
return note("no changes");
|
|
189
|
+
if (details._type === "new")
|
|
190
|
+
return [note("new file"), diffCounts(Number(details.lines) || 0, 0, theme)].join(theme.fg("dim", " · "));
|
|
191
|
+
let counts;
|
|
192
|
+
if (typeof details.linesAdded === "number" && typeof details.linesRemoved === "number") {
|
|
193
|
+
counts = { added: details.linesAdded, removed: details.linesRemoved };
|
|
194
|
+
}
|
|
195
|
+
else if (typeof details.diff?.added === "number" && typeof details.diff?.removed === "number") {
|
|
196
|
+
counts = { added: details.diff.added, removed: details.diff.removed };
|
|
197
|
+
}
|
|
198
|
+
else if (typeof details.patch === "string") {
|
|
199
|
+
counts = countPatchLines(details.patch);
|
|
200
|
+
}
|
|
201
|
+
if (!counts)
|
|
202
|
+
return note(toolName === "write" ? "written" : "edited");
|
|
203
|
+
const parts = [diffCounts(counts.added, counts.removed, theme)];
|
|
204
|
+
if (typeof details.editCount === "number" && details.editCount > 1)
|
|
205
|
+
parts.push(note(plural(details.editCount, "edit")));
|
|
206
|
+
return parts.join(theme.fg("dim", " · "));
|
|
207
|
+
}
|
|
208
|
+
/** `3 tool calls · 1 failed · 12 lines · $0.0042` for a codemode script. */
|
|
209
|
+
function summarizeCodemode(result, theme) {
|
|
210
|
+
const calls = Array.isArray(result?.details?.calls)
|
|
211
|
+
? result.details.calls
|
|
212
|
+
: [];
|
|
213
|
+
const failed = calls.filter((call) => call.status === "error").length;
|
|
214
|
+
const cost = calls.reduce((sum, call) => sum + (call.cost ?? 0), 0);
|
|
215
|
+
const outputLines = countLines(resultText(result)
|
|
216
|
+
.split("\n")
|
|
217
|
+
.filter((line) => !CODEMODE_HEADER_LINE.test(line))
|
|
218
|
+
.join("\n"));
|
|
219
|
+
const parts = [theme.fg("muted", calls.length === 0 ? "no tool calls" : plural(calls.length, "tool call"))];
|
|
220
|
+
if (failed > 0)
|
|
221
|
+
parts.push(theme.fg("error", `${failed} failed`));
|
|
222
|
+
if (outputLines > 0)
|
|
223
|
+
parts.push(theme.fg("muted", plural(outputLines, "line")));
|
|
224
|
+
if (cost > 0)
|
|
225
|
+
parts.push(theme.fg("dim", `$${cost >= 0.01 ? cost.toFixed(2) : cost.toPrecision(2)}`));
|
|
226
|
+
return parts.join(theme.fg("dim", " · "));
|
|
227
|
+
}
|
|
228
|
+
/** pikit's recall: `{ total, entries }` in details; `args.expand` fetches full entries instead of searching. */
|
|
229
|
+
function summarizeRecall(result, args, theme) {
|
|
230
|
+
const entries = Array.isArray(result?.details?.entries) ? result.details.entries : [];
|
|
231
|
+
if (Array.isArray(args?.expand))
|
|
232
|
+
return theme.fg("muted", `${plural(entries.length, "entry", "entries")} expanded`);
|
|
233
|
+
const total = typeof result?.details?.total === "number" ? result.details.total : entries.length;
|
|
234
|
+
return theme.fg("muted", total === 0 ? "no results" : plural(total, "result"));
|
|
235
|
+
}
|
|
236
|
+
function summarize(toolName, result, theme, args) {
|
|
237
|
+
if (toolName === "recall")
|
|
238
|
+
return summarizeRecall(result, args, theme);
|
|
239
|
+
if (toolName === "codemode")
|
|
240
|
+
return summarizeCodemode(result, theme);
|
|
241
|
+
if (toolName === "apply_patch")
|
|
242
|
+
return summarizeApplyPatch(result, theme);
|
|
243
|
+
if (toolName === "write" || toolName === "edit")
|
|
244
|
+
return summarizeFileChange(toolName, result, theme);
|
|
245
|
+
return theme.fg("muted", summarizeOutput(toolName, result));
|
|
246
|
+
}
|
|
247
|
+
function summarizeOutput(toolName, result) {
|
|
248
|
+
const details = result?.details;
|
|
249
|
+
const text = resultText(result);
|
|
250
|
+
switch (toolName) {
|
|
251
|
+
case "read":
|
|
252
|
+
if (details?._type === "readImage")
|
|
253
|
+
return "image";
|
|
254
|
+
return plural(typeof details?.lineCount === "number" ? details.lineCount : countLines(text), "line");
|
|
255
|
+
case "bash":
|
|
256
|
+
return countOrEmpty(countLines(typeof details?.text === "string" ? details.text : text), "no output", "line");
|
|
257
|
+
case "grep":
|
|
258
|
+
return countOrEmpty(countLines(text, /^--$/), "no matches", "line");
|
|
259
|
+
case "find":
|
|
260
|
+
return countOrEmpty(countLines(text), "no files", "file");
|
|
261
|
+
case "ls":
|
|
262
|
+
return countOrEmpty(countLines(text), "empty", "entry", "entries");
|
|
263
|
+
default:
|
|
264
|
+
return countOrEmpty(countLines(text), "done", "line");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function formatSeconds(ms) {
|
|
268
|
+
return ms < 995 ? `${(ms / 1000).toFixed(2)}s` : `${(ms / 1000).toFixed(ms < 9950 ? 1 : 0)}s`;
|
|
269
|
+
}
|
|
270
|
+
function elapsedMs(result, ctx) {
|
|
271
|
+
if (typeof ctx.durationMs === "number")
|
|
272
|
+
return ctx.durationMs;
|
|
273
|
+
const value = result?.details?.[ELAPSED_KEY];
|
|
274
|
+
return typeof value === "number" ? value : undefined;
|
|
275
|
+
}
|
|
276
|
+
function rowComponent(build) {
|
|
277
|
+
return { render: (width) => build(Math.max(1, width)), invalidate() { } };
|
|
278
|
+
}
|
|
279
|
+
function fitLine(line, width, theme) {
|
|
280
|
+
return visibleWidth(line) > width ? truncateToWidth(line, width, theme.fg("dim", "…")) : line;
|
|
281
|
+
}
|
|
282
|
+
function buildCallRow(theme, ctx, label, detail, state, hint = "", bodyLines = []) {
|
|
283
|
+
return rowComponent((width) => {
|
|
284
|
+
const head = `${indentOf(ctx)}${stateIcon(theme, state)} ${theme.bold(theme.fg("text", label))}`;
|
|
285
|
+
const body = detail ? ` ${theme.fg("dim", "(")}${theme.fg("muted", detail)}${theme.fg("dim", ")")}` : "";
|
|
286
|
+
const indent = `${indentOf(ctx)} `;
|
|
287
|
+
return [
|
|
288
|
+
fitLine(`${head}${body}${hint}`, width, theme),
|
|
289
|
+
...bodyLines.map((line) => fitLine(`${indent}${line}`, width, theme)),
|
|
290
|
+
];
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
function buildResultRow(theme, ctx, text, failed) {
|
|
294
|
+
return rowComponent((width) => {
|
|
295
|
+
const connector = theme.fg("dim", "└ ");
|
|
296
|
+
const body = failed ? theme.fg("error", text) : text;
|
|
297
|
+
return [fitLine(`${indentOf(ctx)} ${connector}${body}`, width, theme)];
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Tools wearing the claudecode rows. Only these render as compact rows, so only these may be
|
|
302
|
+
* folded into a group: other tools (apply_patch, MCP tools, …) render their own multi-line
|
|
303
|
+
* bodies, which a group's tree would flatten, so they break a run instead.
|
|
304
|
+
*/
|
|
305
|
+
const styledToolNames = new Set();
|
|
306
|
+
/** A codemode script, highlighted, shown under its call row when expanded. */
|
|
307
|
+
const codemodeSource = (args) => highlightCode(firstString(args, ["code"]).replace(/\r/g, "").replace(/\t/g, " ").trimEnd(), "javascript");
|
|
308
|
+
/** Renderer pair for one tool; `original` is the result renderer shown when expanded. */
|
|
309
|
+
function claudeRenderers(name, label, original, expandedCallBody) {
|
|
310
|
+
return {
|
|
311
|
+
renderCall(args, theme, ctx) {
|
|
312
|
+
const state = ctx.isError
|
|
313
|
+
? "error"
|
|
314
|
+
: ctx.isPartial
|
|
315
|
+
? ctx.executionStarted === false
|
|
316
|
+
? "pending"
|
|
317
|
+
: "running"
|
|
318
|
+
: "success";
|
|
319
|
+
return buildCallRow(theme, ctx, label, callDetail(name, args ?? {}), state, ctx.expanded ? toggleHint(theme, "collapse") : "", ctx.expanded && expandedCallBody ? expandedCallBody(args ?? {}) : []);
|
|
320
|
+
},
|
|
321
|
+
renderResult(result, options, theme, ctx) {
|
|
322
|
+
if (options?.isPartial)
|
|
323
|
+
return rowComponent(() => []);
|
|
324
|
+
if (ctx.expanded && original)
|
|
325
|
+
return original(result, options, theme, ctx);
|
|
326
|
+
if (ctx.isError) {
|
|
327
|
+
const message = oneLine(resultText(result)
|
|
328
|
+
.split("\n")
|
|
329
|
+
.find((line) => line.trim() !== "" && !CODEMODE_HEADER_LINE.test(line)) ?? "Error");
|
|
330
|
+
return buildResultRow(theme, ctx, message, true);
|
|
331
|
+
}
|
|
332
|
+
const ms = elapsedMs(result, ctx);
|
|
333
|
+
const parts = [summarize(name, result, theme, ctx.args)];
|
|
334
|
+
if (ms !== undefined)
|
|
335
|
+
parts.push(theme.fg("dim", `◷ ${formatSeconds(ms)}`));
|
|
336
|
+
// Labeled so a bash timeout limit is never mistaken for the measured duration.
|
|
337
|
+
if (typeof ctx.args?.timeout === "number")
|
|
338
|
+
parts.push(theme.fg("dim", `timeout ${ctx.args.timeout}s`));
|
|
339
|
+
return buildResultRow(theme, ctx, parts.join(theme.fg("dim", " · ")), false);
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Wrap a tool definition so collapsed rows use the Claude Code look. Expanded
|
|
345
|
+
* calls keep the call row but defer the result body to the original renderer.
|
|
346
|
+
*/
|
|
347
|
+
export function withClaudeToolStyle(def) {
|
|
348
|
+
styledToolNames.add(def.name);
|
|
349
|
+
return { ...def, ...claudeRenderers(def.name, def.label || def.name, def.renderResult) };
|
|
350
|
+
}
|
|
351
|
+
// ---------------------------------------------------------------------------
|
|
352
|
+
// write / edit / apply_patch (pi-diff), codemode (Pi built-in), recall (pikit): tools registered elsewhere
|
|
353
|
+
// ---------------------------------------------------------------------------
|
|
354
|
+
const EXTERNAL_TOOLS = ["write", "edit", "apply_patch", "codemode", "recall"];
|
|
355
|
+
const EXTERNAL_TOOL_ORIGINALS = Symbol.for("pi-pretty.claude-style.file-tool-originals");
|
|
356
|
+
/** Where the delegated (expanded) renderer's own component is kept between renders. */
|
|
357
|
+
const DELEGATE_COMPONENT = "__claudeDelegateComponent";
|
|
358
|
+
/**
|
|
359
|
+
* Give write/edit/apply_patch the Claude Code rows without owning their registration (pi-diff or Pi's
|
|
360
|
+
* builtins keep their schema, execute and diff renderer). Rendering is decided per component,
|
|
361
|
+
* so the host's lookups are patched by tool name, as pi-droid-styling does. Collapsed: call
|
|
362
|
+
* and `+N -N` rows; expanded: the provider's own result renderer. Pass `false` to restore.
|
|
363
|
+
*/
|
|
364
|
+
export function installClaudeExternalToolRenderers(toolExecutionComponent, enabled = true) {
|
|
365
|
+
const proto = toolExecutionComponent?.prototype;
|
|
366
|
+
if (!proto)
|
|
367
|
+
return;
|
|
368
|
+
proto[EXTERNAL_TOOL_ORIGINALS] ??= {
|
|
369
|
+
getCallRenderer: proto.getCallRenderer,
|
|
370
|
+
getResultRenderer: proto.getResultRenderer,
|
|
371
|
+
getRenderShell: proto.getRenderShell,
|
|
372
|
+
};
|
|
373
|
+
const originals = proto[EXTERNAL_TOOL_ORIGINALS];
|
|
374
|
+
if (!enabled) {
|
|
375
|
+
Object.assign(proto, originals);
|
|
376
|
+
for (const name of EXTERNAL_TOOLS)
|
|
377
|
+
styledToolNames.delete(name);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
for (const name of EXTERNAL_TOOLS)
|
|
381
|
+
styledToolNames.add(name);
|
|
382
|
+
const isExternalTool = (component) => EXTERNAL_TOOLS.includes(component.toolName ?? "");
|
|
383
|
+
const labelOf = (component) => {
|
|
384
|
+
const words = component.toolName.replace(/_/g, " ");
|
|
385
|
+
return words.charAt(0).toUpperCase() + words.slice(1);
|
|
386
|
+
};
|
|
387
|
+
proto.getCallRenderer = function () {
|
|
388
|
+
return isExternalTool(this)
|
|
389
|
+
? claudeRenderers(this.toolName, labelOf(this), undefined, this.toolName === "codemode" ? codemodeSource : undefined).renderCall
|
|
390
|
+
: originals.getCallRenderer.call(this);
|
|
391
|
+
};
|
|
392
|
+
proto.getResultRenderer = function () {
|
|
393
|
+
const original = originals.getResultRenderer.call(this);
|
|
394
|
+
if (!isExternalTool(this))
|
|
395
|
+
return original;
|
|
396
|
+
// A tool with no result renderer of its own (recall) gets the host's plain text fallback when expanded.
|
|
397
|
+
if (!original && this.expanded)
|
|
398
|
+
return undefined;
|
|
399
|
+
// A provider's renderer reuses and mutates `lastComponent`, so it must only ever be handed
|
|
400
|
+
// its own previous component, never one of this style's rows (a collapse/expand round trip).
|
|
401
|
+
const delegate = original
|
|
402
|
+
? (result, options, theme, ctx) => {
|
|
403
|
+
const lastComponent = ctx.state[DELEGATE_COMPONENT];
|
|
404
|
+
const component = original(result, options, theme, { ...ctx, lastComponent });
|
|
405
|
+
ctx.state[DELEGATE_COMPONENT] = component;
|
|
406
|
+
return component;
|
|
407
|
+
}
|
|
408
|
+
: undefined;
|
|
409
|
+
return claudeRenderers(this.toolName, labelOf(this), delegate).renderResult;
|
|
410
|
+
};
|
|
411
|
+
// The shell is fixed when the component is built, and the style draws its own rows without a box.
|
|
412
|
+
proto.getRenderShell = function () {
|
|
413
|
+
return isExternalTool(this) ? "self" : originals.getRenderShell.call(this);
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
/** Proxy `pi` so tools registered through it get the Claude Code rows. */
|
|
417
|
+
export function withClaudeToolStyleApi(pi) {
|
|
418
|
+
return new Proxy(pi, {
|
|
419
|
+
get(target, prop, receiver) {
|
|
420
|
+
if (prop === "registerTool")
|
|
421
|
+
return (def) => target.registerTool(withClaudeToolStyle(def));
|
|
422
|
+
const value = Reflect.get(target, prop, receiver);
|
|
423
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
424
|
+
},
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
// ---------------------------------------------------------------------------
|
|
428
|
+
// Tool-run grouping
|
|
429
|
+
// ---------------------------------------------------------------------------
|
|
430
|
+
const MIN_GROUPED_TOOLS = 2;
|
|
431
|
+
const fg = (color, text) => groupTheme.fg(color, text);
|
|
432
|
+
const bold = (text) => groupTheme.bold(text);
|
|
433
|
+
function isToolComponent(component) {
|
|
434
|
+
return typeof component?.toolCallId === "string" && styledToolNames.has(component.toolName);
|
|
435
|
+
}
|
|
436
|
+
/** Assistant turns with no answer text whose tool calls are all styled belong to the tool run. */
|
|
437
|
+
function toolOnlyAssistantContent(component) {
|
|
438
|
+
const message = component?.lastMessage;
|
|
439
|
+
if (message?.role !== "assistant" || !Array.isArray(message.content))
|
|
440
|
+
return null;
|
|
441
|
+
if (message.stopReason === "error" || message.stopReason === "aborted")
|
|
442
|
+
return null;
|
|
443
|
+
const content = message.content;
|
|
444
|
+
if (content.some((block) => block?.type === "text" && typeof block.text === "string" && block.text.trim()))
|
|
445
|
+
return null;
|
|
446
|
+
const calls = content.filter((block) => block?.type === "toolCall");
|
|
447
|
+
return calls.length > 0 && calls.every((block) => styledToolNames.has(block.name)) ? content : null;
|
|
448
|
+
}
|
|
449
|
+
const isGroupMember = (component) => isToolComponent(component) || toolOnlyAssistantContent(component) !== null;
|
|
450
|
+
const hasThought = (component) => Boolean(toolOnlyAssistantContent(component)?.some((block) => block?.type === "thinking" && typeof block.thinking === "string" && block.thinking.trim()));
|
|
451
|
+
const isRunning = (tool) => !tool.result || Boolean(tool.isPartial);
|
|
452
|
+
function toolLabel(tool) {
|
|
453
|
+
const label = tool.toolDefinition?.label;
|
|
454
|
+
return typeof label === "string" && label ? label : String(tool.toolName);
|
|
455
|
+
}
|
|
456
|
+
function summaryRow(members, width) {
|
|
457
|
+
const tools = members.filter(isToolComponent);
|
|
458
|
+
const running = tools.filter(isRunning);
|
|
459
|
+
const failed = tools.filter((tool) => Boolean(tool.result?.isError)).length;
|
|
460
|
+
const thoughts = members.filter(hasThought).length;
|
|
461
|
+
const parts = [fg("muted", plural(tools.length, "tool call"))];
|
|
462
|
+
if (thoughts > 0)
|
|
463
|
+
parts.push(fg("muted", plural(thoughts, "thought")));
|
|
464
|
+
if (failed > 0)
|
|
465
|
+
parts.push(fg("error", `${failed} failed`));
|
|
466
|
+
if (running.length > 0)
|
|
467
|
+
parts.push(fg("muted", toolLabel(running[running.length - 1])));
|
|
468
|
+
const icon = stateIcon(groupTheme, running.length > 0 ? "running" : failed > 0 ? "error" : "success");
|
|
469
|
+
const state = bold(fg("text", running.length > 0 ? "Running" : "Done"));
|
|
470
|
+
const row = `${icon} ${state} ${fg("dim", "(")}${parts.join(fg("dim", " · "))}${fg("dim", ")")}${toggleHint(groupTheme, "expand")}`;
|
|
471
|
+
return ["", visibleWidth(row) > width ? truncateToWidth(row, width, fg("dim", " …")) : row];
|
|
472
|
+
}
|
|
473
|
+
function treeRows(members, width) {
|
|
474
|
+
// Text-less assistant turns only contribute to the summary's thought count; their
|
|
475
|
+
// own rows (a hidden-thinking label) would read as noise between the tool rows.
|
|
476
|
+
const blocks = members
|
|
477
|
+
.filter(isToolComponent)
|
|
478
|
+
.map((member) => ({
|
|
479
|
+
member,
|
|
480
|
+
rows: member.render(width).filter((line) => stripAnsi(line).trim() !== "" && !isImageLine(line)),
|
|
481
|
+
}))
|
|
482
|
+
.filter((block) => block.rows.length > 0);
|
|
483
|
+
const lines = [];
|
|
484
|
+
// owners[i] is the tool component that line i belongs to (for click-to-expand).
|
|
485
|
+
const owners = [];
|
|
486
|
+
blocks.forEach(({ member, rows }, blockIndex) => {
|
|
487
|
+
const last = blockIndex === blocks.length - 1;
|
|
488
|
+
rows.forEach((line, lineIndex) => {
|
|
489
|
+
const guide = lineIndex === 0 ? (last ? "└─ " : "├─ ") : last ? " " : "│ ";
|
|
490
|
+
let content = line;
|
|
491
|
+
// A settled success shrinks to a small dot; errors, spinners and pending markers stay as they are.
|
|
492
|
+
if (lineIndex === 0 && stripAnsi(line).trimStart().startsWith(ICON_SUCCESS))
|
|
493
|
+
content = line.replace(ICON_SUCCESS, "•");
|
|
494
|
+
const row = ` ${fg("dim", guide)}${content.replace(LEADING_SPACE_RE, "$1")}`;
|
|
495
|
+
lines.push(visibleWidth(row) > width ? truncateToWidth(row, width, "") : row);
|
|
496
|
+
owners.push(member);
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
if (lines.length > 0) {
|
|
500
|
+
lines.push("");
|
|
501
|
+
owners.push(undefined);
|
|
502
|
+
}
|
|
503
|
+
return { lines, owners };
|
|
504
|
+
}
|
|
505
|
+
/** Mouse target for a folded group: a left click on a tool's rows toggles that tool, which unfolds the group. */
|
|
506
|
+
function groupComponent(owners) {
|
|
507
|
+
return {
|
|
508
|
+
render: () => [],
|
|
509
|
+
handleMouse(event) {
|
|
510
|
+
if (event.type !== "click" || event.button !== "left")
|
|
511
|
+
return undefined;
|
|
512
|
+
const tool = owners[event.y];
|
|
513
|
+
if (!tool?.result || typeof tool.setExpanded !== "function")
|
|
514
|
+
return undefined;
|
|
515
|
+
tool.setExpanded(!tool.expanded);
|
|
516
|
+
return { handled: true };
|
|
517
|
+
},
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
function renderGrouped(container, width) {
|
|
521
|
+
const children = container.children;
|
|
522
|
+
const lines = [];
|
|
523
|
+
const layout = [];
|
|
524
|
+
const push = (component, rendered) => {
|
|
525
|
+
layout.push({ component, height: rendered.length });
|
|
526
|
+
for (const line of rendered)
|
|
527
|
+
lines.push(line);
|
|
528
|
+
};
|
|
529
|
+
let index = 0;
|
|
530
|
+
while (index < children.length) {
|
|
531
|
+
let end = index;
|
|
532
|
+
while (end < children.length && isGroupMember(children[end]))
|
|
533
|
+
end++;
|
|
534
|
+
if (end === index) {
|
|
535
|
+
push(children[index], children[index].render(width));
|
|
536
|
+
index++;
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
const members = children.slice(index, end);
|
|
540
|
+
const tools = members.filter(isToolComponent);
|
|
541
|
+
if (tools.length < MIN_GROUPED_TOOLS || tools.some((tool) => tool.expanded)) {
|
|
542
|
+
for (const member of members)
|
|
543
|
+
push(member, member.render(width));
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
const summary = summaryRow(members, width);
|
|
547
|
+
const tree = treeRows(members, width);
|
|
548
|
+
const owners = [...summary.map(() => undefined), ...tree.owners];
|
|
549
|
+
push(groupComponent(owners), [...summary, ...tree.lines]);
|
|
550
|
+
}
|
|
551
|
+
index = end;
|
|
552
|
+
}
|
|
553
|
+
container.mouseLayout = { width, children: layout };
|
|
554
|
+
return lines;
|
|
555
|
+
}
|
|
556
|
+
const CONTAINER_ORIGINAL_RENDER = Symbol.for("pi-pretty.claude-style.container-render");
|
|
557
|
+
/**
|
|
558
|
+
* Fold consecutive tool calls into `✓ Done (...)` groups by wrapping pi-tui's base
|
|
559
|
+
* `Container.render`. Pi nests its chat container (no stable index to look it up by),
|
|
560
|
+
* but only that container holds tool components as direct children, so the wrapper
|
|
561
|
+
* stays inert for every other container. Pass `false` to restore the original render.
|
|
562
|
+
*/
|
|
563
|
+
export function installClaudeChatGrouping(enabled = true) {
|
|
564
|
+
const proto = Container.prototype;
|
|
565
|
+
const base = proto[CONTAINER_ORIGINAL_RENDER] ?? proto.render;
|
|
566
|
+
proto[CONTAINER_ORIGINAL_RENDER] = base;
|
|
567
|
+
if (!enabled) {
|
|
568
|
+
proto.render = base;
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
proto.render = function renderChatWithToolGroups(width) {
|
|
572
|
+
try {
|
|
573
|
+
if (this.children.some(isToolComponent))
|
|
574
|
+
return renderGrouped(this, width);
|
|
575
|
+
}
|
|
576
|
+
catch {
|
|
577
|
+
// fall through to the original render
|
|
578
|
+
}
|
|
579
|
+
return base.call(this, width);
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
//# sourceMappingURL=claude-style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-style.js","sourceRoot":"","sources":["../src/claude-style.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -60,6 +60,8 @@ export interface PrettyConfig {
|
|
|
60
60
|
cacheLimit?: number;
|
|
61
61
|
workingIndicator?: WorkingIndicatorConfig;
|
|
62
62
|
thinkingIndicator?: ThinkingIndicatorConfig;
|
|
63
|
+
/** "claudecode" renders collapsed tools as `✓ Name (args)` rows with grouping. */
|
|
64
|
+
toolStyle?: "default" | "claudecode";
|
|
63
65
|
fff?: FffConfig;
|
|
64
66
|
}
|
|
65
67
|
/** Normalize a comma-separated env value or JSON array into tool names. */
|