@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.
Files changed (88) hide show
  1. package/CHANGELOG.md +27 -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 +223 -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/render.d.ts +25 -0
  35. package/dist/render.d.ts.map +1 -0
  36. package/dist/render.js +366 -0
  37. package/dist/render.js.map +1 -0
  38. package/dist/tools/bash.d.ts +6 -0
  39. package/dist/tools/bash.d.ts.map +1 -0
  40. package/dist/tools/bash.js +101 -0
  41. package/dist/tools/bash.js.map +1 -0
  42. package/dist/tools/find.d.ts +6 -0
  43. package/dist/tools/find.d.ts.map +1 -0
  44. package/dist/tools/find.js +108 -0
  45. package/dist/tools/find.js.map +1 -0
  46. package/dist/tools/grep.d.ts +6 -0
  47. package/dist/tools/grep.d.ts.map +1 -0
  48. package/dist/tools/grep.js +121 -0
  49. package/dist/tools/grep.js.map +1 -0
  50. package/dist/tools/ls.d.ts +6 -0
  51. package/dist/tools/ls.d.ts.map +1 -0
  52. package/dist/tools/ls.js +63 -0
  53. package/dist/tools/ls.js.map +1 -0
  54. package/dist/tools/metrics.d.ts +10 -0
  55. package/dist/tools/metrics.d.ts.map +1 -0
  56. package/dist/tools/metrics.js +34 -0
  57. package/dist/tools/metrics.js.map +1 -0
  58. package/dist/tools/multi-grep.d.ts +7 -0
  59. package/dist/tools/multi-grep.d.ts.map +1 -0
  60. package/dist/tools/multi-grep.js +197 -0
  61. package/dist/tools/multi-grep.js.map +1 -0
  62. package/dist/tools/read.d.ts +6 -0
  63. package/dist/tools/read.d.ts.map +1 -0
  64. package/dist/tools/read.js +125 -0
  65. package/dist/tools/read.js.map +1 -0
  66. package/dist/types.d.ts +168 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +6 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +7 -1
  71. package/src/index.ts +1 -14
  72. package/biome.json +0 -22
  73. package/bun.lock +0 -598
  74. package/media/bash-and-read.png +0 -0
  75. package/media/icons-and-grep.png +0 -0
  76. package/media/inline-image.png +0 -0
  77. package/pi-pretty.example.json +0 -6
  78. package/release-notes/v0.3.2.md +0 -34
  79. package/release-notes/v0.3.3.md +0 -48
  80. package/release-notes/v0.4.0.md +0 -58
  81. package/release-notes/v0.4.1.md +0 -28
  82. package/release-notes/v0.4.2.md +0 -36
  83. package/release-notes/v0.4.4.md +0 -28
  84. package/release-notes/v0.5.3.md +0 -29
  85. package/test/bash-rendering.test.ts +0 -269
  86. package/test/fff-integration.test.ts +0 -800
  87. package/test/image-rendering.test.ts +0 -153
  88. package/tsconfig.json +0 -19
package/dist/index.js ADDED
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ /**
3
+ * pi-pretty — Pretty terminal output for pi built-in tools.
4
+ *
5
+ * Enhances read, bash, ls, find, grep, multi_grep with:
6
+ * • Syntax-highlighted file content (Shiki)
7
+ * • Colored bash exit status + output
8
+ * • Tree-view directory listings with file-type icons
9
+ * • FFF-accelerated find/grep with SDK fallback
10
+ * • Custom ANSI rendering for all tools
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.__imageInternals = void 0;
14
+ exports.default = piPrettyExtension;
15
+ // Re-export for tests
16
+ var image_js_1 = require("./image.js");
17
+ Object.defineProperty(exports, "__imageInternals", { enumerable: true, get: function () { return image_js_1.__imageInternals; } });
18
+ const fff_js_1 = require("./fff.js");
19
+ const read_js_1 = require("./tools/read.js");
20
+ const bash_js_1 = require("./tools/bash.js");
21
+ const ls_js_1 = require("./tools/ls.js");
22
+ const find_js_1 = require("./tools/find.js");
23
+ const grep_js_1 = require("./tools/grep.js");
24
+ const multi_grep_js_1 = require("./tools/multi-grep.js");
25
+ const multi_grep_fallback_js_1 = require("./multi-grep-fallback.js");
26
+ const config_js_1 = require("./config.js");
27
+ const autocomplete_js_1 = require("./autocomplete.js");
28
+ // ---------------------------------------------------------------------------
29
+ // Config
30
+ // ---------------------------------------------------------------------------
31
+ function envDisabledTools() {
32
+ return new Set((process.env.PRETTY_DISABLE_TOOLS ?? "")
33
+ .split(",")
34
+ .map((s) => s.trim().toLowerCase())
35
+ .filter(Boolean));
36
+ }
37
+ function piPrettyExtension(pi, deps) {
38
+ const disabledTools = envDisabledTools();
39
+ const isToolEnabled = (name) => !disabledTools.has(name.toLowerCase());
40
+ const cwd = process.cwd();
41
+ // ------------------------------------------------------------------
42
+ // Resolve SDK tools
43
+ // ------------------------------------------------------------------
44
+ let sdk;
45
+ let createReadTool;
46
+ let createBashTool;
47
+ let createLsTool;
48
+ let createFindTool;
49
+ let createGrepTool;
50
+ let getAgentDir;
51
+ if (deps) {
52
+ sdk = deps.sdk ?? {};
53
+ createReadTool = sdk.createReadTool ?? sdk.createReadToolDefinition;
54
+ createBashTool = sdk.createBashTool ?? sdk.createBashToolDefinition;
55
+ createLsTool = sdk.createLsTool ?? sdk.createLsToolDefinition;
56
+ createFindTool = sdk.createFindTool ?? sdk.createFindToolDefinition;
57
+ createGrepTool = sdk.createGrepTool ?? sdk.createGrepToolDefinition;
58
+ getAgentDir = sdk.getAgentDir;
59
+ }
60
+ else {
61
+ try {
62
+ sdk = require("@earendil-works/pi-coding-agent");
63
+ createReadTool = sdk.createReadToolDefinition ?? sdk.createReadTool;
64
+ createBashTool = sdk.createBashToolDefinition ?? sdk.createBashTool;
65
+ createLsTool = sdk.createLsToolDefinition ?? sdk.createLsTool;
66
+ createFindTool = sdk.createFindToolDefinition ?? sdk.createFindTool;
67
+ createGrepTool = sdk.createGrepToolDefinition ?? sdk.createGrepTool;
68
+ }
69
+ catch {
70
+ return; // pi SDK not available
71
+ }
72
+ }
73
+ if (!createReadTool)
74
+ return;
75
+ // ------------------------------------------------------------------
76
+ // FFF service init
77
+ // ------------------------------------------------------------------
78
+ const agentDir = getAgentDir ? getAgentDir() : (0, config_js_1.getDefaultAgentDir)();
79
+ let fffService = new fff_js_1.FffService(undefined, agentDir);
80
+ if (deps?.fffModule) {
81
+ fffService = new fff_js_1.FffService(deps.fffModule, agentDir);
82
+ }
83
+ // Ripgrep fallback for multi_grep
84
+ const multiGrepFallback = deps?.multiGrepRipgrepFallback ?? multi_grep_fallback_js_1.runMultiGrepRipgrepFallback;
85
+ // Text component for custom rendering (DI-friendly)
86
+ const TextComp = deps?.TextComponent;
87
+ // ------------------------------------------------------------------
88
+ // Tool registration
89
+ // ------------------------------------------------------------------
90
+ if (isToolEnabled("read") && createReadTool) {
91
+ (0, read_js_1.registerReadTool)(pi, cwd, null, createReadTool(cwd), TextComp);
92
+ }
93
+ if (isToolEnabled("bash") && createBashTool) {
94
+ (0, bash_js_1.registerBashTool)(pi, cwd, null, createBashTool(cwd), TextComp);
95
+ }
96
+ if (isToolEnabled("ls") && createLsTool) {
97
+ (0, ls_js_1.registerLsTool)(pi, cwd, null, createLsTool(cwd), TextComp);
98
+ }
99
+ if (isToolEnabled("find") && createFindTool) {
100
+ (0, find_js_1.registerFindTool)(pi, cwd, fffService, createFindTool(cwd), TextComp);
101
+ }
102
+ if (isToolEnabled("grep") && createGrepTool) {
103
+ (0, grep_js_1.registerGrepTool)(pi, cwd, fffService, createGrepTool(cwd), TextComp);
104
+ }
105
+ if (isToolEnabled("multi_grep") && (fffService || createGrepTool)) {
106
+ (0, multi_grep_js_1.registerMultiGrepTool)(pi, cwd, fffService, createGrepTool ? createGrepTool(cwd) : undefined, multiGrepFallback, TextComp);
107
+ }
108
+ // ------------------------------------------------------------------
109
+ // FFF commands
110
+ // ------------------------------------------------------------------
111
+ if (fffService) {
112
+ pi.registerCommand("fff-health", {
113
+ description: "Show FFF file finder health and indexer status",
114
+ handler: async (_args, ctx) => {
115
+ const fff = fffService;
116
+ if (!fff.isAvailable) {
117
+ ctx.ui.notify("FFF not initialized", "warning");
118
+ return;
119
+ }
120
+ const finder = fff.getFinder();
121
+ if (!finder) {
122
+ ctx.ui.notify("FFF not initialized", "warning");
123
+ return;
124
+ }
125
+ const health = finder.healthCheck();
126
+ if (!health.ok) {
127
+ ctx.ui.notify(`Health check failed: ${health.error}`, "error");
128
+ return;
129
+ }
130
+ const h = health.value;
131
+ const lines = [
132
+ `FFF v${h.version}`,
133
+ `Git: ${h.git.repositoryFound ? `yes (${h.git.workdir ?? "unknown"})` : "no"}`,
134
+ `Picker: ${h.filePicker.initialized ? `${h.filePicker.indexedFiles ?? 0} files` : "not initialized"}`,
135
+ `Frecency: ${h.frecency.initialized ? "active" : "disabled"}`,
136
+ `Query tracker: ${h.queryTracker.initialized ? "active" : "disabled"}`,
137
+ `Partial index: ${fff.partialIndex ? "yes (scan timed out)" : "no"}`,
138
+ ];
139
+ const progress = finder.getScanProgress();
140
+ if (progress.ok) {
141
+ lines.push(`Scanning: ${progress.value.isScanning ? "yes" : "no"} (${progress.value.scannedFilesCount} files)`);
142
+ }
143
+ ctx.ui.notify(lines.join("\n"), "info");
144
+ },
145
+ });
146
+ pi.registerCommand("fff-rescan", {
147
+ description: "Trigger FFF to rescan files",
148
+ handler: async (_args, ctx) => {
149
+ const fff = fffService;
150
+ if (!fff.isAvailable) {
151
+ ctx.ui.notify("FFF not initialized", "warning");
152
+ return;
153
+ }
154
+ const finder = fff.getFinder();
155
+ if (!finder) {
156
+ ctx.ui.notify("FFF not initialized", "warning");
157
+ return;
158
+ }
159
+ const result = finder.scanFiles();
160
+ if (!result.ok) {
161
+ ctx.ui.notify(`Rescan failed: ${result.error}`, "error");
162
+ return;
163
+ }
164
+ fff.partialIndex = false;
165
+ ctx.ui.notify("FFF rescan triggered", "info");
166
+ },
167
+ });
168
+ }
169
+ // ------------------------------------------------------------------
170
+ // Session lifecycle
171
+ // ------------------------------------------------------------------
172
+ pi.on("session_start", async (_event, ctx) => {
173
+ if (!fffService)
174
+ return;
175
+ // Try dynamic import if sync require failed
176
+ if (!fffService.isModuleLoaded()) {
177
+ const loaded = await fffService.tryLoadModule();
178
+ if (!loaded)
179
+ return;
180
+ }
181
+ try {
182
+ await fffService.ensureFinder(ctx.cwd);
183
+ if (fffService.partialIndex) {
184
+ ctx.ui?.notify?.("FFF: scan timed out — using partial index. Run /fff-rescan when ready.", "warning");
185
+ }
186
+ else {
187
+ const ui = ctx.ui;
188
+ ui?.setStatus?.("fff", "FFF indexed");
189
+ setTimeout(() => ui?.setStatus?.("fff", undefined), 3000);
190
+ }
191
+ }
192
+ catch (error) {
193
+ ctx.ui?.notify?.(`FFF init failed: ${error instanceof Error ? error.message : String(error)}`, "error");
194
+ }
195
+ // Register FFF-backed @-mention autocomplete
196
+ ctx.ui?.addAutocompleteProvider?.((current) => (0, autocomplete_js_1.createFffAutocompleteProvider)(current, () => fffService?.getFinder() ?? null));
197
+ });
198
+ pi.on("session_shutdown", async () => {
199
+ fffService?.destroy();
200
+ });
201
+ // Fallback padding for SDK-rendered tool bodies. The SDK reads
202
+ // result.content[0].text and slices collapsed output to roughly the first
203
+ // 10 lines, so insert bottom padding inside that visible slice.
204
+ const PADDED_TOOLS = new Set(["read", "grep", "bash"]);
205
+ const RESULT_LEFT_PAD = " ";
206
+ const BOTTOM_PADDING_BY_TOOL = { read: 2, grep: 2, bash: 0 };
207
+ pi.on("tool_result", (event, _ctx) => {
208
+ if (!PADDED_TOOLS.has(event.toolName))
209
+ return undefined;
210
+ const first = event.content[0];
211
+ if (!first || first.type !== "text")
212
+ return undefined;
213
+ const lines = first.text.split("\n").map((line) => `${RESULT_LEFT_PAD}${line}`);
214
+ if (lines.length === 0)
215
+ return undefined;
216
+ const padCount = BOTTOM_PADDING_BY_TOOL[event.toolName] ?? 0;
217
+ lines.push(...Array.from({ length: padCount }, () => RESULT_LEFT_PAD));
218
+ return {
219
+ content: [{ type: "text", text: lines.join("\n") }, ...event.content.slice(1)],
220
+ };
221
+ });
222
+ }
223
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export type ConstraintParseResult = {
2
+ ok: true;
3
+ globs: string[];
4
+ tokens: string[];
5
+ } | {
6
+ ok: false;
7
+ error: string;
8
+ };
9
+ export type MultiGrepRipgrepFallbackParams = {
10
+ cwd: string;
11
+ patterns: string[];
12
+ path?: string;
13
+ constraints?: string;
14
+ context?: number;
15
+ limit: number;
16
+ ignoreCase: boolean;
17
+ signal?: AbortSignal;
18
+ };
19
+ export type MultiGrepRipgrepFallbackResult = {
20
+ text: string;
21
+ matchCount: number;
22
+ limitReached: boolean;
23
+ };
24
+ export type MultiGrepRipgrepFallback = (params: MultiGrepRipgrepFallbackParams) => Promise<MultiGrepRipgrepFallbackResult>;
25
+ export declare function parseMultiGrepConstraints(constraints: string | undefined): ConstraintParseResult;
26
+ export declare function getMultiGrepRipgrepArgs(params: MultiGrepRipgrepFallbackParams): ConstraintParseResult & {
27
+ args?: string[];
28
+ };
29
+ export declare function runMultiGrepRipgrepFallback(params: MultiGrepRipgrepFallbackParams): Promise<MultiGrepRipgrepFallbackResult>;
30
+ //# sourceMappingURL=multi-grep-fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-grep-fallback.d.ts","sourceRoot":"","sources":["../src/multi-grep-fallback.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnH,MAAM,MAAM,8BAA8B,GAAG;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,CACtC,MAAM,EAAE,8BAA8B,KAClC,OAAO,CAAC,8BAA8B,CAAC,CAAC;AA8E7C,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,qBAAqB,CAehG;AAqBD,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,8BAA8B,GACpC,qBAAqB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAI7C;AAED,wBAAsB,2BAA2B,CAChD,MAAM,EAAE,8BAA8B,GACpC,OAAO,CAAC,8BAA8B,CAAC,CAoGzC"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseMultiGrepConstraints = parseMultiGrepConstraints;
4
+ exports.getMultiGrepRipgrepArgs = getMultiGrepRipgrepArgs;
5
+ exports.runMultiGrepRipgrepFallback = runMultiGrepRipgrepFallback;
6
+ const node_child_process_1 = require("node:child_process");
7
+ const GLOB_META_RE = /[*?[{]/;
8
+ function trimSlashes(value) {
9
+ return value.replace(/^\/+/, "").replace(/\/+$/, "");
10
+ }
11
+ function normalizeConstraintPath(value) {
12
+ let normalized = value.replace(/\\/g, "/").trim();
13
+ while (normalized.startsWith("./"))
14
+ normalized = normalized.slice(2);
15
+ return normalized;
16
+ }
17
+ function tokenizeConstraints(constraints) {
18
+ const tokens = [];
19
+ let current = "";
20
+ let quote = null;
21
+ for (let i = 0; i < constraints.length; i++) {
22
+ const char = constraints[i];
23
+ if (quote) {
24
+ if (char === quote)
25
+ quote = null;
26
+ else
27
+ current += char;
28
+ continue;
29
+ }
30
+ if (char === '"' || char === "'") {
31
+ quote = char;
32
+ continue;
33
+ }
34
+ if (/\s/.test(char)) {
35
+ if (current) {
36
+ tokens.push(current);
37
+ current = "";
38
+ }
39
+ continue;
40
+ }
41
+ current += char;
42
+ }
43
+ if (quote)
44
+ return { ok: false, error: "unterminated quoted constraint" };
45
+ if (current)
46
+ tokens.push(current);
47
+ return { ok: true, globs: [], tokens };
48
+ }
49
+ function tokenToRipgrepGlob(token) {
50
+ let negated = false;
51
+ let body = token;
52
+ if (body.startsWith("!")) {
53
+ negated = true;
54
+ body = body.slice(1);
55
+ }
56
+ body = normalizeConstraintPath(body);
57
+ if (!body)
58
+ return { ok: false, error: `empty constraint token: ${token}` };
59
+ if (body.includes("\0"))
60
+ return { ok: false, error: `invalid NUL byte in constraint token: ${token}` };
61
+ let glob;
62
+ if (body.endsWith("/")) {
63
+ const dir = trimSlashes(body);
64
+ if (!dir)
65
+ return { ok: false, error: `empty directory constraint: ${token}` };
66
+ glob = `**/${dir}/**`;
67
+ }
68
+ else if (GLOB_META_RE.test(body) || body.includes("/")) {
69
+ glob = body.replace(/^\/+/, "");
70
+ }
71
+ else if (body.includes(".")) {
72
+ glob = `**/${body}`;
73
+ }
74
+ else {
75
+ glob = `**/${body}/**`;
76
+ }
77
+ return { ok: true, glob: negated ? `!${glob}` : glob };
78
+ }
79
+ function parseMultiGrepConstraints(constraints) {
80
+ const trimmed = constraints?.trim();
81
+ if (!trimmed)
82
+ return { ok: true, globs: [], tokens: [] };
83
+ const tokenized = tokenizeConstraints(trimmed);
84
+ if (!tokenized.ok)
85
+ return tokenized;
86
+ const globs = [];
87
+ for (const token of tokenized.tokens) {
88
+ const parsed = tokenToRipgrepGlob(token);
89
+ if (!parsed.ok)
90
+ return parsed;
91
+ globs.push(parsed.glob);
92
+ }
93
+ return { ok: true, globs, tokens: tokenized.tokens };
94
+ }
95
+ function isRipgrepMatchLine(line) {
96
+ return /^.+?:\d+:/.test(line);
97
+ }
98
+ function buildRipgrepArgs(params, globs) {
99
+ const args = ["--line-number", "--with-filename", "--color=never", "--hidden", "--fixed-strings"];
100
+ if (params.ignoreCase)
101
+ args.push("--ignore-case");
102
+ if (params.context && params.context > 0)
103
+ args.push("--context", String(params.context));
104
+ for (const glob of globs)
105
+ args.push("--glob", glob);
106
+ for (const pattern of params.patterns)
107
+ args.push("-e", pattern);
108
+ const searchPath = params.path?.trim();
109
+ if (searchPath)
110
+ args.push("--", searchPath);
111
+ return args;
112
+ }
113
+ function getMultiGrepRipgrepArgs(params) {
114
+ const parsed = parseMultiGrepConstraints(params.constraints);
115
+ if (!parsed.ok)
116
+ return parsed;
117
+ return { ...parsed, args: buildRipgrepArgs(params, parsed.globs) };
118
+ }
119
+ async function runMultiGrepRipgrepFallback(params) {
120
+ const parsed = parseMultiGrepConstraints(params.constraints);
121
+ if (!parsed.ok)
122
+ throw new Error(`unsupported constraints: ${parsed.error}`);
123
+ const args = buildRipgrepArgs(params, parsed.globs);
124
+ return new Promise((resolve, reject) => {
125
+ if (params.signal?.aborted) {
126
+ reject(new Error("Operation aborted"));
127
+ return;
128
+ }
129
+ const child = (0, node_child_process_1.spawn)("rg", args, { cwd: params.cwd, stdio: ["ignore", "pipe", "pipe"] });
130
+ const outputLines = [];
131
+ let stderr = "";
132
+ let buffer = "";
133
+ let matchCount = 0;
134
+ let limitReached = false;
135
+ let killedForLimit = false;
136
+ let settled = false;
137
+ const settle = (fn) => {
138
+ if (settled)
139
+ return;
140
+ settled = true;
141
+ fn();
142
+ };
143
+ const stopChild = (dueToLimit = false) => {
144
+ if (!child.killed) {
145
+ killedForLimit = dueToLimit;
146
+ child.kill();
147
+ }
148
+ };
149
+ const onAbort = () => stopChild(false);
150
+ params.signal?.addEventListener("abort", onAbort, { once: true });
151
+ const cleanup = () => {
152
+ params.signal?.removeEventListener("abort", onAbort);
153
+ };
154
+ const handleLine = (line) => {
155
+ if (limitReached)
156
+ return;
157
+ outputLines.push(line);
158
+ if (isRipgrepMatchLine(line)) {
159
+ matchCount++;
160
+ if (matchCount >= params.limit) {
161
+ limitReached = true;
162
+ stopChild(true);
163
+ }
164
+ }
165
+ };
166
+ child.stdout?.on("data", (chunk) => {
167
+ buffer += chunk.toString("utf8");
168
+ let newlineIndex = buffer.indexOf("\n");
169
+ while (newlineIndex >= 0) {
170
+ const line = buffer.slice(0, newlineIndex).replace(/\r$/, "");
171
+ buffer = buffer.slice(newlineIndex + 1);
172
+ handleLine(line);
173
+ newlineIndex = buffer.indexOf("\n");
174
+ }
175
+ });
176
+ child.stderr?.on("data", (chunk) => {
177
+ stderr += chunk.toString("utf8");
178
+ });
179
+ child.on("error", (error) => {
180
+ cleanup();
181
+ const message = error.code === "ENOENT" ? "ripgrep (rg) is not available" : `Failed to run ripgrep: ${error.message}`;
182
+ settle(() => reject(new Error(message)));
183
+ });
184
+ child.on("close", (code) => {
185
+ cleanup();
186
+ if (params.signal?.aborted) {
187
+ settle(() => reject(new Error("Operation aborted")));
188
+ return;
189
+ }
190
+ if (buffer && !limitReached)
191
+ handleLine(buffer.replace(/\r$/, ""));
192
+ if (!killedForLimit && code !== 0 && code !== 1) {
193
+ const message = stderr.trim() || `ripgrep exited with code ${code}`;
194
+ settle(() => reject(new Error(message)));
195
+ return;
196
+ }
197
+ settle(() => resolve({
198
+ text: outputLines.length ? outputLines.join("\n") : "No matches found",
199
+ matchCount,
200
+ limitReached,
201
+ }));
202
+ });
203
+ });
204
+ }
205
+ //# sourceMappingURL=multi-grep-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-grep-fallback.js","sourceRoot":"","sources":["../src/multi-grep-fallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * pi-pretty: rendering functions for all tools.
3
+ *
4
+ * These produce ANSI-colored terminal output strings.
5
+ * They are async only when Shiki syntax highlighting is involved.
6
+ */
7
+ import type { AgentToolResult } from "@earendil-works/pi-coding-agent";
8
+ import type { ThemeLike, RenderCtxLike as RenderContext } from "./types.js";
9
+ export declare function isLowContrastShikiFg(params: string): boolean;
10
+ export declare const RESET_WITHOUT_BG = "\u001B[22;23;24;25;27;28;29;39m";
11
+ export declare function preserveBoxBackground(ansi: string): string;
12
+ export declare function fillToolBackground(text: string, bg?: string, width?: number): string;
13
+ export declare function renderToolMetrics(result: AgentToolResult<Record<string, unknown>>): string;
14
+ export declare function renderToolError(error: string, theme: ThemeLike): string;
15
+ export declare function renderFileContent(content: string, filePath: string, offset?: number, maxLines?: number, width?: number): Promise<string>;
16
+ export declare function renderBashOutput(text: string, exitCode: number | null): {
17
+ summary: string;
18
+ body: string;
19
+ };
20
+ export declare function renderTree(text: string, _basePath: string): string;
21
+ export declare function renderFindResults(text: string, theme?: ThemeLike): string;
22
+ export declare function renderGrepResults(text: string, pattern: string): Promise<string>;
23
+ export declare function makeRenderCall(toolName: string): (args: Record<string, unknown>, theme: ThemeLike, ctx: RenderContext) => any;
24
+ export declare function makeRenderResult(): (result: AgentToolResult<Record<string, unknown>>, _opt: unknown, theme: ThemeLike, ctx: RenderContext) => any;
25
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,YAAY,CAAC;AA4D5E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAS5D;AAUD,eAAO,MAAM,gBAAgB,oCAAkC,CAAC;AAEhE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4B1D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAUrF;AAeD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAO1F;AAMD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAKvE;AAMD,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,SAAI,EACV,QAAQ,SAAoB,EAC5B,KAAK,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAcjB;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgBzG;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAwBlE;AAMG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAiCjE;AAMb,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCtF;AAMD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,IACtC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,SAAS,EAAE,KAAK,aAAa,SAO3E;AAED,wBAAgB,gBAAgB,KACvB,QAAQ,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,OAAO,EAAE,OAAO,SAAS,EAAE,KAAK,aAAa,SAqB7G"}