@heyhuynhgiabuu/pi-pretty 0.6.3 → 0.6.5
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 +27 -0
- package/dist/autocomplete.d.ts +10 -0
- package/dist/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete.js +64 -0
- package/dist/autocomplete.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +225 -0
- package/dist/config.js.map +1 -0
- package/dist/fff-helpers.d.ts +25 -0
- package/dist/fff-helpers.d.ts.map +1 -0
- package/dist/fff-helpers.js +83 -0
- package/dist/fff-helpers.js.map +1 -0
- package/dist/fff.d.ts +37 -0
- package/dist/fff.d.ts.map +1 -0
- package/dist/fff.js +135 -0
- package/dist/fff.js.map +1 -0
- package/dist/helpers.d.ts +21 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +133 -0
- package/dist/helpers.js.map +1 -0
- package/dist/image.d.ts +24 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +144 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +223 -0
- package/dist/index.js.map +1 -0
- package/dist/multi-grep-fallback.d.ts +30 -0
- package/dist/multi-grep-fallback.d.ts.map +1 -0
- package/dist/multi-grep-fallback.js +205 -0
- package/dist/multi-grep-fallback.js.map +1 -0
- package/dist/render.d.ts +25 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +366 -0
- package/dist/render.js.map +1 -0
- package/dist/tools/bash.d.ts +6 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +101 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/find.d.ts +6 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +108 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/grep.d.ts +6 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +121 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/ls.d.ts +6 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +63 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/metrics.d.ts +10 -0
- package/dist/tools/metrics.d.ts.map +1 -0
- package/dist/tools/metrics.js +34 -0
- package/dist/tools/metrics.js.map +1 -0
- package/dist/tools/multi-grep.d.ts +7 -0
- package/dist/tools/multi-grep.d.ts.map +1 -0
- package/dist/tools/multi-grep.js +197 -0
- package/dist/tools/multi-grep.js.map +1 -0
- package/dist/tools/read.d.ts +6 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +125 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +7 -1
- package/src/index.ts +1 -14
- package/biome.json +0 -22
- package/bun.lock +0 -598
- package/media/bash-and-read.png +0 -0
- package/media/icons-and-grep.png +0 -0
- package/media/inline-image.png +0 -0
- package/pi-pretty.example.json +0 -6
- package/release-notes/v0.3.2.md +0 -34
- package/release-notes/v0.3.3.md +0 -48
- package/release-notes/v0.4.0.md +0 -58
- package/release-notes/v0.4.1.md +0 -28
- package/release-notes/v0.4.2.md +0 -36
- package/release-notes/v0.4.4.md +0 -28
- package/release-notes/v0.5.3.md +0 -29
- package/test/bash-rendering.test.ts +0 -269
- package/test/fff-integration.test.ts +0 -800
- package/test/image-rendering.test.ts +0 -153
- package/tsconfig.json +0 -19
package/dist/render.js
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pi-pretty: rendering functions for all tools.
|
|
4
|
+
*
|
|
5
|
+
* These produce ANSI-colored terminal output strings.
|
|
6
|
+
* They are async only when Shiki syntax highlighting is involved.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.RESET_WITHOUT_BG = void 0;
|
|
10
|
+
exports.isLowContrastShikiFg = isLowContrastShikiFg;
|
|
11
|
+
exports.preserveBoxBackground = preserveBoxBackground;
|
|
12
|
+
exports.fillToolBackground = fillToolBackground;
|
|
13
|
+
exports.renderToolMetrics = renderToolMetrics;
|
|
14
|
+
exports.renderToolError = renderToolError;
|
|
15
|
+
exports.renderFileContent = renderFileContent;
|
|
16
|
+
exports.renderBashOutput = renderBashOutput;
|
|
17
|
+
exports.renderTree = renderTree;
|
|
18
|
+
exports.renderFindResults = renderFindResults;
|
|
19
|
+
exports.renderGrepResults = renderGrepResults;
|
|
20
|
+
exports.makeRenderCall = makeRenderCall;
|
|
21
|
+
exports.makeRenderResult = makeRenderResult;
|
|
22
|
+
const cli_1 = require("@shikijs/cli");
|
|
23
|
+
const pi_tui_1 = require("@earendil-works/pi-tui");
|
|
24
|
+
const node_path_1 = require("node:path");
|
|
25
|
+
const config_js_1 = require("./config.js");
|
|
26
|
+
const helpers_js_1 = require("./helpers.js");
|
|
27
|
+
const DEFAULT_THEME = "github-dark";
|
|
28
|
+
function resolveTheme() {
|
|
29
|
+
const env = process.env.PRETTY_THEME;
|
|
30
|
+
if (env)
|
|
31
|
+
return env;
|
|
32
|
+
try {
|
|
33
|
+
const home = process.env.HOME;
|
|
34
|
+
if (!home)
|
|
35
|
+
return DEFAULT_THEME;
|
|
36
|
+
const settings = JSON.parse(require("node:fs").readFileSync(require("node:path").join(home, ".pi/agent/settings.json"), "utf8"));
|
|
37
|
+
return settings.theme ?? DEFAULT_THEME;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return DEFAULT_THEME;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
let THEME = resolveTheme();
|
|
44
|
+
const _cache = new Map();
|
|
45
|
+
function _touch(k, v) {
|
|
46
|
+
_cache.delete(k);
|
|
47
|
+
_cache.set(k, v);
|
|
48
|
+
while (_cache.size > config_js_1.CACHE_LIMIT) {
|
|
49
|
+
const first = _cache.keys().next().value;
|
|
50
|
+
if (first === undefined)
|
|
51
|
+
break;
|
|
52
|
+
_cache.delete(first);
|
|
53
|
+
}
|
|
54
|
+
return v;
|
|
55
|
+
}
|
|
56
|
+
async function hlBlock(code, language) {
|
|
57
|
+
if (!code)
|
|
58
|
+
return [""];
|
|
59
|
+
if (!language || code.length > config_js_1.MAX_HL_CHARS)
|
|
60
|
+
return code.split("\n");
|
|
61
|
+
const k = `${THEME}\0${language}\0${code}`;
|
|
62
|
+
const hit = _cache.get(k);
|
|
63
|
+
if (hit)
|
|
64
|
+
return _touch(k, hit);
|
|
65
|
+
try {
|
|
66
|
+
const ansi = normalizeShikiContrast(await (0, cli_1.codeToANSI)(code, language, THEME));
|
|
67
|
+
const out = (ansi.endsWith("\n") ? ansi.slice(0, -1) : ansi).split("\n");
|
|
68
|
+
return _touch(k, out);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return code.split("\n");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const ESC_RE = "\u001b";
|
|
75
|
+
const ANSI_CAPTURE_RE = new RegExp(`${ESC_RE}\\[([0-9;]*)m`, "g");
|
|
76
|
+
const FG_MUTED = "\x1b[38;2;139;148;158m";
|
|
77
|
+
function isLowContrastShikiFg(params) {
|
|
78
|
+
if (params === "30" || params === "90")
|
|
79
|
+
return true;
|
|
80
|
+
if (params === "38;5;0" || params === "38;5;8")
|
|
81
|
+
return true;
|
|
82
|
+
if (!params.startsWith("38;2;"))
|
|
83
|
+
return false;
|
|
84
|
+
const parts = params.split(";").map(Number);
|
|
85
|
+
if (parts.length !== 5 || parts.some((n) => !Number.isFinite(n)))
|
|
86
|
+
return false;
|
|
87
|
+
const [, , r, g, b] = parts;
|
|
88
|
+
const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
89
|
+
return luminance < 72;
|
|
90
|
+
}
|
|
91
|
+
function normalizeShikiContrast(ansi) {
|
|
92
|
+
return ansi.replace(ANSI_CAPTURE_RE, (seq, params) => (isLowContrastShikiFg(params) ? FG_MUTED : seq));
|
|
93
|
+
}
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// Box background helpers
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
exports.RESET_WITHOUT_BG = "\x1b[22;23;24;25;27;28;29;39m";
|
|
98
|
+
function preserveBoxBackground(ansi) {
|
|
99
|
+
return ansi.replace(ANSI_CAPTURE_RE, (_seq, params) => {
|
|
100
|
+
if (!params || params === "0")
|
|
101
|
+
return exports.RESET_WITHOUT_BG;
|
|
102
|
+
const parts = params.split(";").filter(Boolean);
|
|
103
|
+
const kept = [];
|
|
104
|
+
let i = 0;
|
|
105
|
+
while (i < parts.length) {
|
|
106
|
+
const code = Number(parts[i]);
|
|
107
|
+
if (code === 38) {
|
|
108
|
+
// Foreground extended — keep entire sequence
|
|
109
|
+
kept.push(parts[i]);
|
|
110
|
+
if (parts[i + 1] === "5") {
|
|
111
|
+
kept.push(parts[i + 1]);
|
|
112
|
+
i += 2;
|
|
113
|
+
}
|
|
114
|
+
else if (parts[i + 1] === "2") {
|
|
115
|
+
kept.push(parts[i + 1], parts[i + 2], parts[i + 3], parts[i + 4]);
|
|
116
|
+
i += 5;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
i++;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (code === 48) {
|
|
123
|
+
// Background extended — skip entirely
|
|
124
|
+
if (parts[i + 1] === "5")
|
|
125
|
+
i += 3;
|
|
126
|
+
else if (parts[i + 1] === "2")
|
|
127
|
+
i += 6;
|
|
128
|
+
else
|
|
129
|
+
i++;
|
|
130
|
+
}
|
|
131
|
+
else if (code === 49 || (code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {
|
|
132
|
+
i++;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
kept.push(parts[i]);
|
|
136
|
+
i++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return kept.length ? `\x1b[${kept.join(";")}m` : "";
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function fillToolBackground(text, bg = config_js_1.BG_BASE, width) {
|
|
143
|
+
return text
|
|
144
|
+
.split("\n")
|
|
145
|
+
.map((line) => {
|
|
146
|
+
const fitted = width ? (0, pi_tui_1.truncateToWidth)(line, width, "") : line;
|
|
147
|
+
const stripped = preserveBoxBackground(fitted);
|
|
148
|
+
// Apply background to the entire line
|
|
149
|
+
return bg ? bg + stripped : stripped;
|
|
150
|
+
})
|
|
151
|
+
.join("\n");
|
|
152
|
+
}
|
|
153
|
+
function rule(w) {
|
|
154
|
+
return `${config_js_1.FG_RULE}${"─".repeat(w)}${config_js_1.RST}`;
|
|
155
|
+
}
|
|
156
|
+
function lnum(n, w) {
|
|
157
|
+
const v = String(n);
|
|
158
|
+
return `${config_js_1.FG_LNUM}${" ".repeat(Math.max(0, w - v.length))}${v}${config_js_1.RST}`;
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Tool metrics line
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
function renderToolMetrics(result) {
|
|
164
|
+
const details = result.details;
|
|
165
|
+
if (!details)
|
|
166
|
+
return "";
|
|
167
|
+
const elapsed = (0, helpers_js_1.formatElapsedMs)(details[helpers_js_1.ELAPSED_KEY]);
|
|
168
|
+
const chars = (0, helpers_js_1.formatCharCount)(details[helpers_js_1.CHARS_KEY]);
|
|
169
|
+
if (!elapsed && !chars)
|
|
170
|
+
return "";
|
|
171
|
+
return `${config_js_1.FG_DIM}· ${[elapsed, chars].filter(Boolean).join(" · ")}${config_js_1.RST}`;
|
|
172
|
+
}
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
// Error renderer
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
function renderToolError(error, theme) {
|
|
177
|
+
const body = (0, helpers_js_1.compactErrorLines)(error)
|
|
178
|
+
.map((line) => ` ${line ? theme.fg("error", line) : ""}`)
|
|
179
|
+
.join("\n");
|
|
180
|
+
return fillToolBackground(body, config_js_1.BG_ERROR);
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// Read — syntax-highlighted file content
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
async function renderFileContent(content, filePath, offset = 0, maxLines = config_js_1.MAX_PREVIEW_LINES, width) {
|
|
186
|
+
const normalizedContent = (0, helpers_js_1.normalizeLineEndings)(content);
|
|
187
|
+
const lines = normalizedContent.split("\n");
|
|
188
|
+
const show = lines.slice(0, maxLines);
|
|
189
|
+
const lg = (0, config_js_1.detectLang)(filePath);
|
|
190
|
+
const hl = await hlBlock(show.join("\n"), lg);
|
|
191
|
+
const tw = width ?? (0, config_js_1.termWidth)();
|
|
192
|
+
const out = [];
|
|
193
|
+
for (const line of hl) {
|
|
194
|
+
out.push((0, pi_tui_1.truncateToWidth)(line ?? "", Math.max(1, tw), `${config_js_1.FG_DIM}›`));
|
|
195
|
+
}
|
|
196
|
+
return out.join("\n");
|
|
197
|
+
}
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// Bash — colored exit status
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
function renderBashOutput(text, exitCode) {
|
|
202
|
+
const isOk = exitCode === 0;
|
|
203
|
+
const statusIcon = isOk ? "✓" : "✗";
|
|
204
|
+
const codeStr = exitCode !== null
|
|
205
|
+
? `${isOk ? config_js_1.FG_GREEN : config_js_1.FG_RED}${statusIcon} exit ${exitCode}${config_js_1.RST}`
|
|
206
|
+
: `${config_js_1.FG_YELLOW}⚡ killed${config_js_1.RST}`;
|
|
207
|
+
const lines = text.split("\n");
|
|
208
|
+
const maxShow = config_js_1.MAX_PREVIEW_LINES;
|
|
209
|
+
const show = lines.slice(0, maxShow);
|
|
210
|
+
const remaining = lines.length - maxShow;
|
|
211
|
+
let body = show.join("\n");
|
|
212
|
+
if (remaining > 0)
|
|
213
|
+
body += `\n${config_js_1.FG_DIM} … ${remaining} more lines${config_js_1.RST}`;
|
|
214
|
+
return { summary: codeStr, body };
|
|
215
|
+
}
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
// Ls — tree view with icons
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
function renderTree(text, _basePath) {
|
|
220
|
+
const lines = text.trim().split("\n").filter(Boolean);
|
|
221
|
+
if (!lines.length)
|
|
222
|
+
return `${config_js_1.FG_DIM}(empty directory)${config_js_1.RST}`;
|
|
223
|
+
const out = [];
|
|
224
|
+
const total = lines.length;
|
|
225
|
+
const show = lines.slice(0, config_js_1.MAX_PREVIEW_LINES);
|
|
226
|
+
for (let i = 0; i < show.length; i++) {
|
|
227
|
+
const entry = show[i].trim();
|
|
228
|
+
const isLast = i === show.length - 1 && total <= config_js_1.MAX_PREVIEW_LINES;
|
|
229
|
+
const prefix = isLast ? "└── " : "├── ";
|
|
230
|
+
const connector = `${config_js_1.FG_RULE}${prefix}${config_js_1.RST}`;
|
|
231
|
+
const isDir = entry.endsWith("/");
|
|
232
|
+
const name = isDir ? entry.slice(0, -1) : entry;
|
|
233
|
+
const icon = isDir ? (0, config_js_1.dirIcon)() : "";
|
|
234
|
+
out.push(`${connector}${icon}${isDir ? `${config_js_1.FG_BLUE}\x1b[1m${name}${config_js_1.RST}` : name}`);
|
|
235
|
+
}
|
|
236
|
+
if (total > config_js_1.MAX_PREVIEW_LINES) {
|
|
237
|
+
out.push(`${config_js_1.FG_RULE}└── ${config_js_1.RST}${config_js_1.FG_DIM}… ${total - config_js_1.MAX_PREVIEW_LINES} more entries${config_js_1.RST}`);
|
|
238
|
+
}
|
|
239
|
+
return out.join("\n");
|
|
240
|
+
}
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
// Find — grouped file list (plain, no tree characters or icons)
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
function renderFindResults(text, theme) {
|
|
245
|
+
const lines = text.trim().split("\n").filter(Boolean);
|
|
246
|
+
if (!lines.length)
|
|
247
|
+
return theme ? theme.fg("dim", "(no matches)") : `${config_js_1.FG_DIM}(no matches)${config_js_1.RST}`;
|
|
248
|
+
const groups = new Map();
|
|
249
|
+
for (const line of lines) {
|
|
250
|
+
const trimmed = line.trim();
|
|
251
|
+
const dir = (0, node_path_1.dirname)(trimmed) || ".";
|
|
252
|
+
const file = (0, node_path_1.basename)(trimmed);
|
|
253
|
+
if (!groups.has(dir))
|
|
254
|
+
groups.set(dir, []);
|
|
255
|
+
const bucket = groups.get(dir);
|
|
256
|
+
if (bucket)
|
|
257
|
+
bucket.push(file);
|
|
258
|
+
}
|
|
259
|
+
const out = [];
|
|
260
|
+
let count = 0;
|
|
261
|
+
for (const [dir, files] of groups) {
|
|
262
|
+
if (count > 0)
|
|
263
|
+
out.push("");
|
|
264
|
+
const dirColored = theme ? theme.fg("accent", theme.bold(`${dir}/`)) : `${config_js_1.FG_BLUE}\x1b[1m${dir}/${config_js_1.RST}`;
|
|
265
|
+
out.push(dirColored);
|
|
266
|
+
for (let i = 0; i < files.length; i++) {
|
|
267
|
+
if (count >= config_js_1.MAX_PREVIEW_LINES) {
|
|
268
|
+
const more = theme ? theme.fg("dim", `… ${lines.length - count} more files`) : `${config_js_1.FG_DIM}… ${lines.length - count} more files${config_js_1.RST}`;
|
|
269
|
+
out.push(` ${more}`);
|
|
270
|
+
return out.join("\n");
|
|
271
|
+
}
|
|
272
|
+
out.push(` ${files[i]}`);
|
|
273
|
+
count++;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return out.join("\n");
|
|
277
|
+
}
|
|
278
|
+
// ---------------------------------------------------------------------------
|
|
279
|
+
// Grep — highlighted matches with line numbers
|
|
280
|
+
// ---------------------------------------------------------------------------
|
|
281
|
+
async function renderGrepResults(text, pattern) {
|
|
282
|
+
const lines = (0, helpers_js_1.normalizeLineEndings)(text).split("\n");
|
|
283
|
+
if (!lines.length || (lines.length === 1 && !lines[0].trim()))
|
|
284
|
+
return `${config_js_1.FG_DIM}(no matches)${config_js_1.RST}`;
|
|
285
|
+
const out = [];
|
|
286
|
+
let currentFile = "";
|
|
287
|
+
let count = 0;
|
|
288
|
+
let re = null;
|
|
289
|
+
try {
|
|
290
|
+
re = new RegExp(`(${pattern})`, "gi");
|
|
291
|
+
}
|
|
292
|
+
catch { /* skip highlighting */ }
|
|
293
|
+
for (const line of lines) {
|
|
294
|
+
if (count >= config_js_1.MAX_PREVIEW_LINES) {
|
|
295
|
+
out.push(`${config_js_1.FG_DIM} … more matches${config_js_1.RST}`);
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
const fileMatch = line.match(/^(.+?)[:-](\d+)[:-](.*)$/);
|
|
299
|
+
if (fileMatch) {
|
|
300
|
+
const [, file, lineNo, content] = fileMatch;
|
|
301
|
+
if (file !== currentFile) {
|
|
302
|
+
if (currentFile)
|
|
303
|
+
out.push("");
|
|
304
|
+
out.push(`${config_js_1.FG_BLUE}\x1b[1m${file}${config_js_1.RST}`);
|
|
305
|
+
currentFile = file;
|
|
306
|
+
}
|
|
307
|
+
const nw = Math.max(3, lineNo.length);
|
|
308
|
+
let display = content;
|
|
309
|
+
if (re)
|
|
310
|
+
display = content.replace(re, `${config_js_1.RST}${config_js_1.FG_YELLOW}\x1b[1m$1${config_js_1.RST}`);
|
|
311
|
+
out.push(` ${lnum(Number(lineNo), nw)} ${config_js_1.FG_RULE}│${config_js_1.RST} ${display}${config_js_1.RST}`);
|
|
312
|
+
count++;
|
|
313
|
+
}
|
|
314
|
+
else if (line.trim() === "--") {
|
|
315
|
+
out.push(` ${config_js_1.FG_DIM} ···${config_js_1.RST}`);
|
|
316
|
+
}
|
|
317
|
+
else if (line.trim()) {
|
|
318
|
+
out.push(line);
|
|
319
|
+
count++;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return out.join("\n");
|
|
323
|
+
}
|
|
324
|
+
// ---------------------------------------------------------------------------
|
|
325
|
+
// Generic renderCall / renderResult for custom tools
|
|
326
|
+
// ---------------------------------------------------------------------------
|
|
327
|
+
function makeRenderCall(toolName) {
|
|
328
|
+
return (args, theme, ctx) => {
|
|
329
|
+
(0, config_js_1.resolveBaseBackground)(theme);
|
|
330
|
+
const text = ctx.lastComponent ?? new (require("@earendil-works/pi-tui").Text)("", 0, 0);
|
|
331
|
+
const bg = ctx.isError ? config_js_1.BG_ERROR : undefined;
|
|
332
|
+
text.setText(fillToolBackground(`${theme.fg("toolTitle", theme.bold(toolName))}`, bg));
|
|
333
|
+
return text;
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function makeRenderResult() {
|
|
337
|
+
return (result, _opt, theme, ctx) => {
|
|
338
|
+
(0, config_js_1.resolveBaseBackground)(theme);
|
|
339
|
+
const text = ctx.lastComponent ?? new (require("@earendil-works/pi-tui").Text)("", 0, 0);
|
|
340
|
+
if (ctx.isError) {
|
|
341
|
+
text.setText(renderToolError(getTextContent(result) || "Error", theme));
|
|
342
|
+
return text;
|
|
343
|
+
}
|
|
344
|
+
const content = getTextContent(result);
|
|
345
|
+
if (content) {
|
|
346
|
+
const renderWidth = (0, config_js_1.termWidth)();
|
|
347
|
+
const lines = content.split("\n");
|
|
348
|
+
const maxShow = ctx.expanded ? lines.length : Math.min(lines.length, config_js_1.MAX_PREVIEW_LINES);
|
|
349
|
+
const preview = lines.slice(0, maxShow).join("\n");
|
|
350
|
+
const more = lines.length > maxShow ? `\n${config_js_1.FG_DIM}... ${lines.length - maxShow} more lines${config_js_1.RST}` : "";
|
|
351
|
+
const metrics = renderToolMetrics(result);
|
|
352
|
+
text.setText(fillToolBackground(` ${preview}${more}${metrics ? `\n ${metrics}` : ""}`, undefined, renderWidth));
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
text.setText(fillToolBackground(` ${theme.fg("dim", "(no text output)")}`));
|
|
356
|
+
}
|
|
357
|
+
return text;
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
function getTextContent(result) {
|
|
361
|
+
return (result.content ?? [])
|
|
362
|
+
.filter((c) => c.type === "text")
|
|
363
|
+
.map((c) => c.text ?? "")
|
|
364
|
+
.join("\n");
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { SdkToolDef } from "../types.js";
|
|
3
|
+
export declare function registerBashTool(pi: ExtensionAPI, _cwd: string, _fffService: unknown, sdkTool: SdkToolDef, TextComp?: new (t?: string, x?: number, y?: number) => {
|
|
4
|
+
setText(v: string): void;
|
|
5
|
+
}): void;
|
|
6
|
+
//# sourceMappingURL=bash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,YAAY,EAA+C,MAAM,iCAAiC,CAAC;AACtI,OAAO,KAAK,EAAE,UAAU,EAAqE,MAAM,aAAa,CAAC;AAQjH,wBAAgB,gBAAgB,CAC/B,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,UAAU,EACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK;IAAE,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACjF,IAAI,CAyFN"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* pi-pretty: bash tool -- command execution with styled output. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.registerBashTool = registerBashTool;
|
|
5
|
+
const config_js_1 = require("../config.js");
|
|
6
|
+
const metrics_js_1 = require("./metrics.js");
|
|
7
|
+
const render_js_1 = require("../render.js");
|
|
8
|
+
const helpers_js_1 = require("../helpers.js");
|
|
9
|
+
function registerBashTool(pi, _cwd, _fffService, sdkTool, TextComp) {
|
|
10
|
+
const TC = TextComp ?? (() => {
|
|
11
|
+
const { Text } = require("@earendil-works/pi-tui");
|
|
12
|
+
return Text;
|
|
13
|
+
})();
|
|
14
|
+
pi.registerTool({
|
|
15
|
+
name: "bash",
|
|
16
|
+
label: "Bash",
|
|
17
|
+
description: sdkTool.description ?? "Execute shell commands",
|
|
18
|
+
parameters: sdkTool.parameters,
|
|
19
|
+
renderShell: "self",
|
|
20
|
+
execute: (0, metrics_js_1.wrapExecuteWithMetrics)(async (tid, params, sig, _upd, ctx) => {
|
|
21
|
+
try {
|
|
22
|
+
return await sdkTool.execute(tid, params, sig, undefined, ctx);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
26
|
+
return { content: [{ type: "text", text: msg }], isError: true, details: { _type: "bashResult", text: msg, exitCode: 1, command: String(params.command ?? "") } };
|
|
27
|
+
}
|
|
28
|
+
}),
|
|
29
|
+
renderCall(args, theme, ctx) {
|
|
30
|
+
(0, config_js_1.resolveBaseBackground)(theme);
|
|
31
|
+
const text = ctx.lastComponent ?? new TC("", 0, 0);
|
|
32
|
+
const t = typeof args.timeout === "number" ? ` ${theme.fg("muted", `(timeout ${args.timeout}s)`)}` : "";
|
|
33
|
+
const tw = (0, config_js_1.termWidth)() || 80;
|
|
34
|
+
const rawCmd = String(args.command ?? "");
|
|
35
|
+
const cmd = rawCmd.length === 0 ? theme.fg("toolOutput", "...") : (rawCmd.length > tw - 20 ? rawCmd.slice(0, Math.max(1, tw - 20)) + "…" : rawCmd);
|
|
36
|
+
const toolWidth = ctx.expanded ? undefined : tw;
|
|
37
|
+
text.setText((0, render_js_1.fillToolBackground)(`\n ${theme.fg("toolTitle", theme.bold(`$ ${cmd}`))}${t}`, ctx.isError ? config_js_1.BG_ERROR : undefined, toolWidth));
|
|
38
|
+
return text;
|
|
39
|
+
},
|
|
40
|
+
renderResult(result, _opt, theme, ctx) {
|
|
41
|
+
(0, config_js_1.resolveBaseBackground)(theme);
|
|
42
|
+
const text = ctx.lastComponent ?? new TC("", 0, 0);
|
|
43
|
+
const details = result.details;
|
|
44
|
+
const tc = getText(result);
|
|
45
|
+
const d = details?._type === "bashResult" ? details
|
|
46
|
+
: tc || ctx.isError
|
|
47
|
+
? { _type: "bashResult", text: tc || "Error", exitCode: (0, helpers_js_1.inferBashExitCode)(tc, ctx.isError ? 1 : 0), command: "" }
|
|
48
|
+
: undefined;
|
|
49
|
+
if (d?._type === "bashResult") {
|
|
50
|
+
const isErr = ctx.isError || (d.exitCode !== null && d.exitCode !== 0);
|
|
51
|
+
const bg = isErr ? config_js_1.BG_ERROR : undefined;
|
|
52
|
+
const cleaned = (0, helpers_js_1.stripBashExitStatusLine)(d.text);
|
|
53
|
+
const output = isErr ? (0, helpers_js_1.compactErrorLines)(cleaned).join("\n") : cleaned;
|
|
54
|
+
const { summary } = (0, render_js_1.renderBashOutput)(output, d.exitCode);
|
|
55
|
+
const lineCount = output.split("\n").length;
|
|
56
|
+
const info = lineCount > 1 ? ` ${config_js_1.FG_DIM}(${lineCount} lines)${config_js_1.RST} ${(0, render_js_1.renderToolMetrics)(result)}` : ` ${(0, render_js_1.renderToolMetrics)(result)}`;
|
|
57
|
+
const header = ` ${summary}${info}`;
|
|
58
|
+
const rw = (0, config_js_1.termWidth)();
|
|
59
|
+
const renderFn = (w) => {
|
|
60
|
+
if (!output.trim())
|
|
61
|
+
return (0, render_js_1.fillToolBackground)(header, bg, w);
|
|
62
|
+
const max = ctx.expanded ? lineCount : config_js_1.MAX_PREVIEW_LINES;
|
|
63
|
+
const show = output.split("\n").slice(0, max);
|
|
64
|
+
const out = [header, rule(w), ...show.map((l) => ` ${l}`)];
|
|
65
|
+
if (lineCount > max)
|
|
66
|
+
out.push(`${config_js_1.FG_DIM} \u2026 ${lineCount - max} more lines${config_js_1.RST}`);
|
|
67
|
+
return (0, render_js_1.fillToolBackground)(out.join("\n"), bg, w);
|
|
68
|
+
};
|
|
69
|
+
text.setText(renderFn(rw));
|
|
70
|
+
const baseRender = typeof text.render === "function"
|
|
71
|
+
? text.render.bind(text)
|
|
72
|
+
: null;
|
|
73
|
+
if (baseRender) {
|
|
74
|
+
let key;
|
|
75
|
+
text.render = (w) => {
|
|
76
|
+
const width = Math.max(1, Math.floor(w || (0, config_js_1.termWidth)()));
|
|
77
|
+
const k = `bash:${ctx.expanded ? "1" : "0"}:${width}:${d.exitCode ?? "killed"}:${output.length}:${(0, render_js_1.renderToolMetrics)(result)}`;
|
|
78
|
+
if (key !== k) {
|
|
79
|
+
text.setText(renderFn(width));
|
|
80
|
+
key = k;
|
|
81
|
+
}
|
|
82
|
+
return baseRender(width);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return text;
|
|
86
|
+
}
|
|
87
|
+
if (ctx.isError) {
|
|
88
|
+
text.setText((0, render_js_1.renderToolError)(tc || "Error", theme));
|
|
89
|
+
return text;
|
|
90
|
+
}
|
|
91
|
+
const fc = result.content?.[0];
|
|
92
|
+
text.setText((0, render_js_1.fillToolBackground)(` ${theme.fg("dim", fc && "text" in fc ? String(fc.text).slice(0, 120) : "done")}`));
|
|
93
|
+
return text;
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function rule(w) { return `${config_js_1.FG_RULE}${"\u2500".repeat(w)}${config_js_1.RST}`; }
|
|
98
|
+
function getText(result) {
|
|
99
|
+
return (result.content ?? []).filter((c) => c.type === "text").map((c) => c.text).join("\n") ?? "";
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { SdkToolDef, FffServiceLike } from "../types.js";
|
|
3
|
+
export declare function registerFindTool(pi: ExtensionAPI, cwd: string, fffService: FffServiceLike | null | undefined, sdkTool: SdkToolDef, TextComp?: new (t?: string, x?: number, y?: number) => {
|
|
4
|
+
setText(v: string): void;
|
|
5
|
+
}): void;
|
|
6
|
+
//# sourceMappingURL=find.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,YAAY,EAA+C,MAAM,iCAAiC,CAAC;AAEtI,OAAO,KAAK,EAAE,UAAU,EAAe,cAAc,EAAkE,MAAM,aAAa,CAAC;AAQ3I,wBAAgB,gBAAgB,CAC/B,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EAC7C,OAAO,EAAE,UAAU,EACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK;IAAE,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACjF,IAAI,CA8FN"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* pi-pretty: find tool -- FFF-backed file search with SDK fallback. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.registerFindTool = registerFindTool;
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const config_js_1 = require("../config.js");
|
|
7
|
+
const helpers_js_1 = require("../helpers.js");
|
|
8
|
+
const metrics_js_1 = require("./metrics.js");
|
|
9
|
+
const render_js_1 = require("../render.js");
|
|
10
|
+
function registerFindTool(pi, cwd, fffService, sdkTool, TextComp) {
|
|
11
|
+
if (!TextComp) {
|
|
12
|
+
const { Text } = require("@earendil-works/pi-tui");
|
|
13
|
+
TextComp = Text;
|
|
14
|
+
}
|
|
15
|
+
const home = process.env.HOME ?? "";
|
|
16
|
+
pi.registerTool({
|
|
17
|
+
name: "find",
|
|
18
|
+
label: "Find",
|
|
19
|
+
description: sdkTool.description ?? "Find files matching a glob pattern",
|
|
20
|
+
parameters: sdkTool.parameters,
|
|
21
|
+
renderShell: "self",
|
|
22
|
+
execute: (0, metrics_js_1.wrapExecuteWithMetrics)(async (tid, params, sig, _upd, ctx) => {
|
|
23
|
+
const pattern = String(params.pattern ?? "");
|
|
24
|
+
const path = params.path ? String(params.path) : undefined;
|
|
25
|
+
const limit = params.limit;
|
|
26
|
+
const glob = params.glob;
|
|
27
|
+
const fff = fffService?.isAvailable ? fffService.getFinder() : null;
|
|
28
|
+
if (fff) {
|
|
29
|
+
try {
|
|
30
|
+
const effectiveLimit = Math.max(1, typeof limit === "number" ? limit : 100);
|
|
31
|
+
const basePathResult = fff.getBasePath();
|
|
32
|
+
const basePath = basePathResult.ok ? basePathResult.value : null;
|
|
33
|
+
let cleanPath = path ?? "";
|
|
34
|
+
if (cleanPath && (0, node_path_1.isAbsolute)(cleanPath) && basePath) {
|
|
35
|
+
cleanPath = (0, node_path_1.relative)(basePath, cleanPath) || "";
|
|
36
|
+
}
|
|
37
|
+
cleanPath = cleanPath.replace(/\/$/, "");
|
|
38
|
+
const cleanPattern = pattern.startsWith("/") ? pattern.slice(1) : pattern;
|
|
39
|
+
const globPattern = cleanPath
|
|
40
|
+
? `${cleanPath}/**/${cleanPattern}`
|
|
41
|
+
: `**/${cleanPattern}`;
|
|
42
|
+
const searchResult = fff.glob(globPattern, { pageSize: effectiveLimit });
|
|
43
|
+
if (searchResult.ok) {
|
|
44
|
+
const items = searchResult.value.items.slice(0, effectiveLimit);
|
|
45
|
+
const notices = [];
|
|
46
|
+
if (fffService?.partialIndex)
|
|
47
|
+
notices.push("Warning: partial file index");
|
|
48
|
+
if (items.length >= effectiveLimit)
|
|
49
|
+
notices.push(`${effectiveLimit} limit reached`);
|
|
50
|
+
if (searchResult.value.totalMatched > items.length)
|
|
51
|
+
notices.push(`${searchResult.value.totalMatched} total matches`);
|
|
52
|
+
const paths = items.map((i) => i.relativePath).join("\n");
|
|
53
|
+
return { content: [{ type: "text", text: paths }], details: { _type: "findResult", text: paths, pattern, matchCount: items.length, notices } };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch { /* fall through to SDK */ }
|
|
57
|
+
}
|
|
58
|
+
const result = await sdkTool.execute(tid, params, sig, undefined, ctx);
|
|
59
|
+
const tc = getText(result);
|
|
60
|
+
result.details = { _type: "findResult", text: tc, pattern, matchCount: tc ? tc.trim().split("\n").filter(Boolean).length : 0 };
|
|
61
|
+
return result;
|
|
62
|
+
}),
|
|
63
|
+
renderCall(args, theme, ctx) {
|
|
64
|
+
(0, config_js_1.resolveBaseBackground)(theme);
|
|
65
|
+
const text = ctx.lastComponent ?? new TextComp("", 0, 0);
|
|
66
|
+
const pattern = args.pattern === null || args.pattern === undefined ? "" : String(args.pattern);
|
|
67
|
+
const path = args.path === null || args.path === undefined ? "<missing>" : (0, helpers_js_1.shortPath)(cwd, home, String(args.path));
|
|
68
|
+
const limit = args.limit;
|
|
69
|
+
const glob = args.glob;
|
|
70
|
+
const findLabel = theme.fg("toolTitle", theme.bold("find"));
|
|
71
|
+
const patternPart = pattern ? theme.fg("accent", pattern) : "";
|
|
72
|
+
const inPart = theme.fg("dim", " in ");
|
|
73
|
+
const pathPart = theme.fg("toolOutput", path);
|
|
74
|
+
const limitPart = limit !== undefined && limit !== null ? theme.fg("dim", ` limit ${limit}`) : "";
|
|
75
|
+
const out = `${findLabel} ${patternPart}${inPart}${pathPart}${limitPart}`;
|
|
76
|
+
text.setText((0, render_js_1.fillToolBackground)(` \n ${out}`, ctx.isError ? config_js_1.BG_ERROR : undefined));
|
|
77
|
+
return text;
|
|
78
|
+
},
|
|
79
|
+
renderResult(result, _opt, theme, ctx) {
|
|
80
|
+
(0, config_js_1.resolveBaseBackground)(theme);
|
|
81
|
+
const text = ctx.lastComponent ?? new TextComp("", 0, 0);
|
|
82
|
+
if (ctx.isError) {
|
|
83
|
+
text.setText((0, render_js_1.renderToolError)(getText(result) || "Error", theme));
|
|
84
|
+
return text;
|
|
85
|
+
}
|
|
86
|
+
const d = result.details;
|
|
87
|
+
if (d?._type === "findResult") {
|
|
88
|
+
if (!d.text.trim()) {
|
|
89
|
+
const notices = d.notices;
|
|
90
|
+
const noticeStr = notices?.length ? `\n ${theme.fg("warning", `[${notices.join(". ")}]`)}` : "";
|
|
91
|
+
text.setText((0, render_js_1.fillToolBackground)(` \n ${theme.fg("dim", "0 files")}${noticeStr}\n `));
|
|
92
|
+
return text;
|
|
93
|
+
}
|
|
94
|
+
const rendered = (0, render_js_1.renderFindResults)(d.text, theme).split("\n").map(l => ` ${l}`).join("\n");
|
|
95
|
+
const notices = d.notices;
|
|
96
|
+
const noticeStr = notices?.length ? `\n ${theme.fg("warning", `[${notices.join(". ")}]`)}` : "";
|
|
97
|
+
text.setText((0, render_js_1.fillToolBackground)(` \n ${theme.fg("dim", `${d.matchCount} files`)}${(0, render_js_1.renderToolMetrics)(result)}\n${rendered}${noticeStr}\n `));
|
|
98
|
+
return text;
|
|
99
|
+
}
|
|
100
|
+
const fc = result.content?.[0];
|
|
101
|
+
text.setText((0, render_js_1.fillToolBackground)(` \n ${theme.fg("dim", fc && "text" in fc ? String(fc.text).slice(0, 120) : "0 files")}\n `));
|
|
102
|
+
return text;
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function appendNotices(text, notices) { return notices.length ? `${text}\n\n[${notices.join(". ")}]` : text; }
|
|
107
|
+
function getText(result) { return (result.content ?? []).filter((c) => c.type === "text").map((c) => c.text ?? "").join("\n") ?? ""; }
|
|
108
|
+
//# sourceMappingURL=find.js.map
|