@heyhuynhgiabuu/pi-pretty 0.6.4 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/autocomplete.d.ts +10 -0
  3. package/dist/autocomplete.d.ts.map +1 -0
  4. package/dist/autocomplete.js +64 -0
  5. package/dist/autocomplete.js.map +1 -0
  6. package/dist/config.d.ts +33 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +225 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/fff-helpers.d.ts +25 -0
  11. package/dist/fff-helpers.d.ts.map +1 -0
  12. package/dist/fff-helpers.js +83 -0
  13. package/dist/fff-helpers.js.map +1 -0
  14. package/dist/fff.d.ts +37 -0
  15. package/dist/fff.d.ts.map +1 -0
  16. package/dist/fff.js +135 -0
  17. package/dist/fff.js.map +1 -0
  18. package/dist/helpers.d.ts +21 -0
  19. package/dist/helpers.d.ts.map +1 -0
  20. package/dist/helpers.js +133 -0
  21. package/dist/helpers.js.map +1 -0
  22. package/dist/image.d.ts +24 -0
  23. package/dist/image.d.ts.map +1 -0
  24. package/dist/image.js +144 -0
  25. package/dist/image.js.map +1 -0
  26. package/dist/index.d.ts +16 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +227 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/multi-grep-fallback.d.ts +30 -0
  31. package/dist/multi-grep-fallback.d.ts.map +1 -0
  32. package/dist/multi-grep-fallback.js +205 -0
  33. package/dist/multi-grep-fallback.js.map +1 -0
  34. package/dist/notices.d.ts +3 -0
  35. package/dist/notices.d.ts.map +1 -0
  36. package/dist/notices.js +6 -0
  37. package/dist/notices.js.map +1 -0
  38. package/dist/render.d.ts +25 -0
  39. package/dist/render.d.ts.map +1 -0
  40. package/dist/render.js +366 -0
  41. package/dist/render.js.map +1 -0
  42. package/dist/tools/bash.d.ts +6 -0
  43. package/dist/tools/bash.d.ts.map +1 -0
  44. package/dist/tools/bash.js +101 -0
  45. package/dist/tools/bash.js.map +1 -0
  46. package/dist/tools/find.d.ts +6 -0
  47. package/dist/tools/find.d.ts.map +1 -0
  48. package/dist/tools/find.js +109 -0
  49. package/dist/tools/find.js.map +1 -0
  50. package/dist/tools/grep.d.ts +6 -0
  51. package/dist/tools/grep.d.ts.map +1 -0
  52. package/dist/tools/grep.js +122 -0
  53. package/dist/tools/grep.js.map +1 -0
  54. package/dist/tools/ls.d.ts +6 -0
  55. package/dist/tools/ls.d.ts.map +1 -0
  56. package/dist/tools/ls.js +63 -0
  57. package/dist/tools/ls.js.map +1 -0
  58. package/dist/tools/metrics.d.ts +10 -0
  59. package/dist/tools/metrics.d.ts.map +1 -0
  60. package/dist/tools/metrics.js +34 -0
  61. package/dist/tools/metrics.js.map +1 -0
  62. package/dist/tools/multi-grep.d.ts +7 -0
  63. package/dist/tools/multi-grep.d.ts.map +1 -0
  64. package/dist/tools/multi-grep.js +198 -0
  65. package/dist/tools/multi-grep.js.map +1 -0
  66. package/dist/tools/read.d.ts +6 -0
  67. package/dist/tools/read.d.ts.map +1 -0
  68. package/dist/tools/read.js +125 -0
  69. package/dist/tools/read.js.map +1 -0
  70. package/dist/types.d.ts +168 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +6 -0
  73. package/dist/types.js.map +1 -0
  74. package/package.json +32 -26
  75. package/src/index.ts +30 -22
  76. package/src/notices.ts +3 -0
  77. package/src/tools/find.ts +2 -1
  78. package/src/tools/grep.ts +2 -1
  79. package/src/tools/multi-grep.ts +2 -1
  80. package/biome.json +0 -22
  81. package/bun.lock +0 -598
  82. package/media/bash-and-read.png +0 -0
  83. package/media/icons-and-grep.png +0 -0
  84. package/media/inline-image.png +0 -0
  85. package/pi-pretty.example.json +0 -6
  86. package/release-notes/v0.3.2.md +0 -34
  87. package/release-notes/v0.3.3.md +0 -48
  88. package/release-notes/v0.4.0.md +0 -58
  89. package/release-notes/v0.4.1.md +0 -28
  90. package/release-notes/v0.4.2.md +0 -36
  91. package/release-notes/v0.4.4.md +0 -28
  92. package/release-notes/v0.5.3.md +0 -29
  93. package/test/bash-rendering.test.ts +0 -269
  94. package/test/fff-integration.test.ts +0 -800
  95. package/test/image-rendering.test.ts +0 -153
  96. 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;AAS3I,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,109 @@
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
+ const notices_js_1 = require("../notices.js");
11
+ function registerFindTool(pi, cwd, fffService, sdkTool, TextComp) {
12
+ if (!TextComp) {
13
+ const { Text } = require("@earendil-works/pi-tui");
14
+ TextComp = Text;
15
+ }
16
+ const home = process.env.HOME ?? "";
17
+ pi.registerTool({
18
+ name: "find",
19
+ label: "Find",
20
+ description: sdkTool.description ?? "Find files matching a glob pattern",
21
+ parameters: sdkTool.parameters,
22
+ renderShell: "self",
23
+ execute: (0, metrics_js_1.wrapExecuteWithMetrics)(async (tid, params, sig, _upd, ctx) => {
24
+ const pattern = String(params.pattern ?? "");
25
+ const path = params.path ? String(params.path) : undefined;
26
+ const limit = params.limit;
27
+ const glob = params.glob;
28
+ const fff = fffService?.isAvailable ? fffService.getFinder() : null;
29
+ if (fff) {
30
+ try {
31
+ const effectiveLimit = Math.max(1, typeof limit === "number" ? limit : 100);
32
+ const basePathResult = fff.getBasePath();
33
+ const basePath = basePathResult.ok ? basePathResult.value : null;
34
+ let cleanPath = path ?? "";
35
+ if (cleanPath && (0, node_path_1.isAbsolute)(cleanPath) && basePath) {
36
+ cleanPath = (0, node_path_1.relative)(basePath, cleanPath) || "";
37
+ }
38
+ cleanPath = cleanPath.replace(/\/$/, "");
39
+ const cleanPattern = pattern.startsWith("/") ? pattern.slice(1) : pattern;
40
+ const globPattern = cleanPath
41
+ ? `${cleanPath}/**/${cleanPattern}`
42
+ : `**/${cleanPattern}`;
43
+ const searchResult = fff.glob(globPattern, { pageSize: effectiveLimit });
44
+ if (searchResult.ok) {
45
+ const items = searchResult.value.items.slice(0, effectiveLimit);
46
+ const notices = [];
47
+ if (fffService?.partialIndex)
48
+ notices.push(notices_js_1.NOTICE_PARTIAL_FILE_INDEX);
49
+ if (items.length >= effectiveLimit)
50
+ notices.push(`${effectiveLimit} limit reached`);
51
+ if (searchResult.value.totalMatched > items.length)
52
+ notices.push(`${searchResult.value.totalMatched} total matches`);
53
+ const paths = items.map((i) => i.relativePath).join("\n");
54
+ return { content: [{ type: "text", text: paths }], details: { _type: "findResult", text: paths, pattern, matchCount: items.length, notices } };
55
+ }
56
+ }
57
+ catch { /* fall through to SDK */ }
58
+ }
59
+ const result = await sdkTool.execute(tid, params, sig, undefined, ctx);
60
+ const tc = getText(result);
61
+ result.details = { _type: "findResult", text: tc, pattern, matchCount: tc ? tc.trim().split("\n").filter(Boolean).length : 0 };
62
+ return result;
63
+ }),
64
+ renderCall(args, theme, ctx) {
65
+ (0, config_js_1.resolveBaseBackground)(theme);
66
+ const text = ctx.lastComponent ?? new TextComp("", 0, 0);
67
+ const pattern = args.pattern === null || args.pattern === undefined ? "" : String(args.pattern);
68
+ const path = args.path === null || args.path === undefined ? "<missing>" : (0, helpers_js_1.shortPath)(cwd, home, String(args.path));
69
+ const limit = args.limit;
70
+ const glob = args.glob;
71
+ const findLabel = theme.fg("toolTitle", theme.bold("find"));
72
+ const patternPart = pattern ? theme.fg("accent", pattern) : "";
73
+ const inPart = theme.fg("dim", " in ");
74
+ const pathPart = theme.fg("toolOutput", path);
75
+ const limitPart = limit !== undefined && limit !== null ? theme.fg("dim", ` limit ${limit}`) : "";
76
+ const out = `${findLabel} ${patternPart}${inPart}${pathPart}${limitPart}`;
77
+ text.setText((0, render_js_1.fillToolBackground)(` \n ${out}`, ctx.isError ? config_js_1.BG_ERROR : undefined));
78
+ return text;
79
+ },
80
+ renderResult(result, _opt, theme, ctx) {
81
+ (0, config_js_1.resolveBaseBackground)(theme);
82
+ const text = ctx.lastComponent ?? new TextComp("", 0, 0);
83
+ if (ctx.isError) {
84
+ text.setText((0, render_js_1.renderToolError)(getText(result) || "Error", theme));
85
+ return text;
86
+ }
87
+ const d = result.details;
88
+ if (d?._type === "findResult") {
89
+ if (!d.text.trim()) {
90
+ const notices = d.notices;
91
+ const noticeStr = notices?.length ? `\n ${theme.fg("warning", `[${notices.join(". ")}]`)}` : "";
92
+ text.setText((0, render_js_1.fillToolBackground)(` \n ${theme.fg("dim", "0 files")}${noticeStr}\n `));
93
+ return text;
94
+ }
95
+ const rendered = (0, render_js_1.renderFindResults)(d.text, theme).split("\n").map(l => ` ${l}`).join("\n");
96
+ const notices = d.notices;
97
+ const noticeStr = notices?.length ? `\n ${theme.fg("warning", `[${notices.join(". ")}]`)}` : "";
98
+ text.setText((0, render_js_1.fillToolBackground)(` \n ${theme.fg("dim", `${d.matchCount} files`)}${(0, render_js_1.renderToolMetrics)(result)}\n${rendered}${noticeStr}\n `));
99
+ return text;
100
+ }
101
+ const fc = result.content?.[0];
102
+ text.setText((0, render_js_1.fillToolBackground)(` \n ${theme.fg("dim", fc && "text" in fc ? String(fc.text).slice(0, 120) : "0 files")}\n `));
103
+ return text;
104
+ },
105
+ });
106
+ }
107
+ function appendNotices(text, notices) { return notices.length ? `${text}\n\n[${notices.join(". ")}]` : text; }
108
+ function getText(result) { return (result.content ?? []).filter((c) => c.type === "text").map((c) => c.text ?? "").join("\n") ?? ""; }
109
+ //# sourceMappingURL=find.js.map