@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/fff.js ADDED
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ /**
3
+ * pi-pretty: FFF lifecycle management.
4
+ *
5
+ * Manages the FFF file finder lifecycle: create, wait for scan, destroy.
6
+ * Tools check `isAvailable` and use `finder` directly for search operations.
7
+ * Graceful fallback: if FFF is not installed or fails, tools degrade to SDK.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.FffService = exports.CursorStore = void 0;
11
+ const node_fs_1 = require("node:fs");
12
+ const node_path_1 = require("node:path");
13
+ // ---------------------------------------------------------------------------
14
+ // Cursor store — pagination cursors for grep
15
+ // ---------------------------------------------------------------------------
16
+ class CursorStore {
17
+ cursors = new Map();
18
+ counter = 0;
19
+ maxSize;
20
+ constructor(maxSize = 200) {
21
+ this.maxSize = maxSize;
22
+ }
23
+ store(cursor) {
24
+ const id = `fff_c${++this.counter}`;
25
+ this.cursors.set(id, cursor);
26
+ if (this.cursors.size > this.maxSize) {
27
+ const first = this.cursors.keys().next().value;
28
+ if (first)
29
+ this.cursors.delete(first);
30
+ }
31
+ return id;
32
+ }
33
+ get(id) {
34
+ return this.cursors.get(id);
35
+ }
36
+ get size() {
37
+ return this.cursors.size;
38
+ }
39
+ }
40
+ exports.CursorStore = CursorStore;
41
+ // ---------------------------------------------------------------------------
42
+ // FffService — wraps a single FileFinder instance
43
+ // ---------------------------------------------------------------------------
44
+ class FffService {
45
+ finder = null;
46
+ partialIndex = false;
47
+ cursorStore = new CursorStore();
48
+ fffModule = null;
49
+ dbDir = null;
50
+ finderPromise = null;
51
+ constructor(fffModule, agentDir) {
52
+ if (fffModule) {
53
+ this.fffModule = fffModule;
54
+ if (agentDir) {
55
+ this.dbDir = (0, node_path_1.join)(agentDir, "pi-pretty", "fff");
56
+ try {
57
+ (0, node_fs_1.mkdirSync)(this.dbDir, { recursive: true });
58
+ }
59
+ catch { /* ignore */ }
60
+ }
61
+ }
62
+ }
63
+ /** Returns true if the FFF native module is loaded (installed). */
64
+ isModuleLoaded() {
65
+ return this.fffModule !== null;
66
+ }
67
+ get isAvailable() {
68
+ return this.finder !== null && !this.finder.isDestroyed;
69
+ }
70
+ /** Attempt to load FFF module dynamically (called during session_start if not injected). */
71
+ async tryLoadModule() {
72
+ if (this.fffModule)
73
+ return true;
74
+ try {
75
+ const mod = await import("@ff-labs/fff-node");
76
+ this.fffModule = mod;
77
+ if (!this.dbDir && process.env.HOME) {
78
+ this.dbDir = (0, node_path_1.join)(process.env.HOME, ".pi/agent", "pi-pretty", "fff");
79
+ try {
80
+ (0, node_fs_1.mkdirSync)(this.dbDir, { recursive: true });
81
+ }
82
+ catch { /* ignore */ }
83
+ }
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ async ensureFinder(cwd) {
91
+ if (this.finder && !this.finder.isDestroyed)
92
+ return;
93
+ if (this.finderPromise)
94
+ return this.finderPromise;
95
+ this.finderPromise = this._createFinder(cwd);
96
+ await this.finderPromise;
97
+ this.finderPromise = null;
98
+ }
99
+ async _createFinder(cwd) {
100
+ if (!this.fffModule)
101
+ return;
102
+ if (this.finder && !this.finder.isDestroyed) {
103
+ this.finder.destroy();
104
+ this.finder = null;
105
+ }
106
+ const result = this.fffModule.FileFinder.create({
107
+ basePath: cwd,
108
+ frecencyDbPath: this.dbDir ? (0, node_path_1.join)(this.dbDir, "frecency.mdb") : "",
109
+ historyDbPath: this.dbDir ? (0, node_path_1.join)(this.dbDir, "history.mdb") : "",
110
+ aiMode: true,
111
+ });
112
+ if (!result.ok) {
113
+ throw new Error(`FFF init failed: ${result.error}`);
114
+ }
115
+ this.finder = result.value;
116
+ const scan = await this.finder.waitForScan(15_000);
117
+ this.partialIndex = scan.ok && !scan.value;
118
+ }
119
+ destroy() {
120
+ if (this.finder && !this.finder.isDestroyed) {
121
+ this.finder.destroy();
122
+ this.finder = null;
123
+ }
124
+ this.partialIndex = false;
125
+ this.finderPromise = null;
126
+ }
127
+ getFinder() {
128
+ return this.finder;
129
+ }
130
+ getCursorStore() {
131
+ return this.cursorStore;
132
+ }
133
+ }
134
+ exports.FffService = FffService;
135
+ //# sourceMappingURL=fff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fff.js","sourceRoot":"","sources":["../src/fff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * pi-pretty: utility helpers.
3
+ */
4
+ export declare function normalizeLineEndings(text: string): string;
5
+ export declare function shortPath(cwd: string, home: string, p: string): string;
6
+ export declare function trimToUndefined(value: string | undefined): string | undefined;
7
+ export declare function escapeRegexLiteral(text: string): string;
8
+ export declare function buildLiteralAlternationPattern(patterns: string[]): string;
9
+ export declare function shouldIgnoreCaseForPatterns(patterns: string[]): boolean;
10
+ export declare function getConstraintBackedPath(constraints: string | undefined): string | undefined;
11
+ export declare function getErrorMessage(error: unknown): string;
12
+ export declare function humanSize(bytes: number): string;
13
+ export declare function countRipgrepMatches(text: string): number;
14
+ export declare function stripBashExitStatusLine(text: string): string;
15
+ export declare function formatElapsedMs(ms: number | undefined): string;
16
+ export declare function formatCharCount(chars: number | undefined): string;
17
+ export declare const ELAPSED_KEY = "__prettyElapsedMs";
18
+ export declare const CHARS_KEY = "__prettyOutputChars";
19
+ export declare function inferBashExitCode(text: string, fallback: number | null): number | null;
20
+ export declare function compactErrorLines(error: string): string[];
21
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG7E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAKzE;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAEvE;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM3F;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D;AAMD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK9D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKjE;AAED,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAC/C,eAAO,MAAM,SAAS,wBAAwB,CAAC;AAM/C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKtF;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUzD"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ /**
3
+ * pi-pretty: utility helpers.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CHARS_KEY = exports.ELAPSED_KEY = void 0;
7
+ exports.normalizeLineEndings = normalizeLineEndings;
8
+ exports.shortPath = shortPath;
9
+ exports.trimToUndefined = trimToUndefined;
10
+ exports.escapeRegexLiteral = escapeRegexLiteral;
11
+ exports.buildLiteralAlternationPattern = buildLiteralAlternationPattern;
12
+ exports.shouldIgnoreCaseForPatterns = shouldIgnoreCaseForPatterns;
13
+ exports.getConstraintBackedPath = getConstraintBackedPath;
14
+ exports.getErrorMessage = getErrorMessage;
15
+ exports.humanSize = humanSize;
16
+ exports.countRipgrepMatches = countRipgrepMatches;
17
+ exports.stripBashExitStatusLine = stripBashExitStatusLine;
18
+ exports.formatElapsedMs = formatElapsedMs;
19
+ exports.formatCharCount = formatCharCount;
20
+ exports.inferBashExitCode = inferBashExitCode;
21
+ exports.compactErrorLines = compactErrorLines;
22
+ const node_path_1 = require("node:path");
23
+ // ---------------------------------------------------------------------------
24
+ // String / normalization
25
+ // ---------------------------------------------------------------------------
26
+ function normalizeLineEndings(text) {
27
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
28
+ }
29
+ function shortPath(cwd, home, p) {
30
+ if (!p)
31
+ return "";
32
+ const r = (0, node_path_1.relative)(cwd, p);
33
+ if (!r.startsWith("..") && !r.startsWith("/"))
34
+ return r;
35
+ return p.replace(home, "~");
36
+ }
37
+ function trimToUndefined(value) {
38
+ const trimmed = value?.trim();
39
+ return trimmed ? trimmed : undefined;
40
+ }
41
+ function escapeRegexLiteral(text) {
42
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
43
+ }
44
+ function buildLiteralAlternationPattern(patterns) {
45
+ return patterns
46
+ .map(escapeRegexLiteral)
47
+ .sort((a, b) => b.length - a.length)
48
+ .join("|");
49
+ }
50
+ function shouldIgnoreCaseForPatterns(patterns) {
51
+ return patterns.every((pattern) => pattern.toLowerCase() === pattern);
52
+ }
53
+ function getConstraintBackedPath(constraints) {
54
+ const trimmed = trimToUndefined(constraints);
55
+ if (!trimmed || /\s/.test(trimmed) || trimmed.includes("!") || trimmed.endsWith("/") || /[*?[{]/.test(trimmed)) {
56
+ return undefined;
57
+ }
58
+ return trimmed;
59
+ }
60
+ function getErrorMessage(error) {
61
+ return error instanceof Error ? error.message : String(error);
62
+ }
63
+ function humanSize(bytes) {
64
+ if (bytes < 1024)
65
+ return `${bytes}B`;
66
+ if (bytes < 1024 * 1024)
67
+ return `${(bytes / 1024).toFixed(1)}KB`;
68
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Ripgrep match detection
72
+ // ---------------------------------------------------------------------------
73
+ function countRipgrepMatches(text) {
74
+ return text
75
+ .trim()
76
+ .split("\n")
77
+ .filter((line) => /^.+?[:-]\d+[:-]/.test(line)).length;
78
+ }
79
+ function stripBashExitStatusLine(text) {
80
+ return normalizeLineEndings(text)
81
+ .split("\n")
82
+ .filter((line) => !/^Command exited with code \d+$/i.test(line.trim()))
83
+ .join("\n");
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Tool metrics
87
+ // ---------------------------------------------------------------------------
88
+ function formatElapsedMs(ms) {
89
+ if (typeof ms !== "number" || !Number.isFinite(ms))
90
+ return "";
91
+ if (ms < 1000)
92
+ return `${Math.round(ms)}ms`;
93
+ const s = ms / 1000;
94
+ return s < 10 ? `${s.toFixed(1)}s` : `${Math.round(s)}s`;
95
+ }
96
+ function formatCharCount(chars) {
97
+ if (typeof chars !== "number" || !Number.isFinite(chars) || chars <= 0)
98
+ return "";
99
+ if (chars < 1000)
100
+ return `${chars} chars`;
101
+ if (chars < 10_000)
102
+ return `${(chars / 1000).toFixed(1)}k chars`;
103
+ return `${Math.round(chars / 1000)}k chars`;
104
+ }
105
+ exports.ELAPSED_KEY = "__prettyElapsedMs";
106
+ exports.CHARS_KEY = "__prettyOutputChars";
107
+ // ---------------------------------------------------------------------------
108
+ // Infer bash exit code
109
+ // ---------------------------------------------------------------------------
110
+ function inferBashExitCode(text, fallback) {
111
+ const exitMatch = text.match(/(?:exit code|exited with(?: code)?|exit status)[:\s]*(\d+)/i);
112
+ if (exitMatch)
113
+ return Number(exitMatch[1]);
114
+ if (text.includes("command not found") || text.includes("No such file"))
115
+ return 1;
116
+ return fallback;
117
+ }
118
+ // ---------------------------------------------------------------------------
119
+ // Compact error lines
120
+ // ---------------------------------------------------------------------------
121
+ function compactErrorLines(error) {
122
+ const compactedLines = [];
123
+ let previousBlank = false;
124
+ for (const line of normalizeLineEndings(error).trim().split("\n")) {
125
+ const isBlank = line.trim() === "";
126
+ if (isBlank && previousBlank)
127
+ continue;
128
+ compactedLines.push(line);
129
+ previousBlank = isBlank;
130
+ }
131
+ return compactedLines;
132
+ }
133
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAQH,oDAEC;AAED,8BAKC;AAED,0CAGC;AAED,gDAEC;AAED,wEAKC;AAED,kEAEC;AAED,0DAMC;AAED,0CAEC;AAED,8BAIC;AAMD,kDAKC;AAED,0DAKC;AAMD,0CAKC;AAED,0CAKC;AASD,8CAKC;AAMD,8CAUC;AAvHD,yCAAqC;AAErC,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,SAAgB,oBAAoB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,SAAS,CAAC,GAAW,EAAE,IAAY,EAAE,CAAS;IAC7D,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,GAAG,IAAA,oBAAQ,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,eAAe,CAAC,KAAyB;IACxD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,8BAA8B,CAAC,QAAkB;IAChE,OAAO,QAAQ;SACb,GAAG,CAAC,kBAAkB,CAAC;SACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;SACnC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAgB,2BAA2B,CAAC,QAAkB;IAC7D,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,uBAAuB,CAAC,WAA+B;IACtE,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChH,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAgB,eAAe,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,SAAS,CAAC,KAAa;IACtC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,SAAgB,mBAAmB,CAAC,IAAY;IAC/C,OAAO,IAAI;SACT,IAAI,EAAE;SACN,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,SAAgB,uBAAuB,CAAC,IAAY;IACnD,OAAO,oBAAoB,CAAC,IAAI,CAAC;SAC/B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SACtE,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAgB,eAAe,CAAC,EAAsB;IACrD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9D,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC;IAC5C,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1D,CAAC;AAED,SAAgB,eAAe,CAAC,KAAyB;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAClF,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,QAAQ,CAAC;IAC1C,IAAI,KAAK,GAAG,MAAM;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;AAC7C,CAAC;AAEY,QAAA,WAAW,GAAG,mBAAmB,CAAC;AAClC,QAAA,SAAS,GAAG,qBAAqB,CAAC;AAE/C,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAgB,iBAAiB,CAAC,IAAY,EAAE,QAAuB;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC5F,IAAI,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,CAAC,CAAC;IAClF,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,SAAgB,iBAAiB,CAAC,KAAa;IAC9C,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACnC,IAAI,OAAO,IAAI,aAAa;YAAE,SAAS;QACvC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,aAAa,GAAG,OAAO,CAAC;IACzB,CAAC;IACD,OAAO,cAAc,CAAC;AACvB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * pi-pretty: Terminal image rendering (iTerm2 / Kitty / Ghostty inline image protocols).
3
+ * Handles tmux passthrough for image protocols.
4
+ */
5
+ type ImageProtocol = "iterm2" | "kitty" | "none";
6
+ declare function isTmuxSession(): boolean;
7
+ declare function getOuterTerminal(): string;
8
+ declare function detectImageProtocol(): ImageProtocol;
9
+ declare function tmuxAllowsPassthrough(): boolean | null;
10
+ declare function getTmuxPassthroughWarning(protocol: ImageProtocol): string | null;
11
+ declare function tmuxWrap(seq: string): string;
12
+ export declare const __imageInternals: {
13
+ isTmuxSession: typeof isTmuxSession;
14
+ getOuterTerminal: typeof getOuterTerminal;
15
+ detectImageProtocol: typeof detectImageProtocol;
16
+ tmuxWrap: typeof tmuxWrap;
17
+ tmuxAllowsPassthrough: typeof tmuxAllowsPassthrough;
18
+ getTmuxPassthroughWarning: typeof getTmuxPassthroughWarning;
19
+ setTmuxClientTermOverrideForTests: (value: string | null | undefined) => void;
20
+ setTmuxAllowPassthroughOverrideForTests: (value: boolean | null | undefined) => void;
21
+ resetCachesForTests: () => void;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,KAAK,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAOjD,iBAAS,aAAa,IAAI,OAAO,CAEhC;AA+BD,iBAAS,gBAAgB,IAAI,MAAM,CAiBlC;AAED,iBAAS,mBAAmB,IAAI,aAAa,CAQ5C;AAED,iBAAS,qBAAqB,IAAI,OAAO,GAAG,IAAI,CAiB/C;AAED,iBAAS,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAMzE;AAED,iBAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIrC;AAED,eAAO,MAAM,gBAAgB;;;;;;;+CAOe,MAAM,GAAG,IAAI,GAAG,SAAS;qDAGnB,OAAO,GAAG,IAAI,GAAG,SAAS;;CAS3E,CAAC"}
package/dist/image.js ADDED
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * pi-pretty: Terminal image rendering (iTerm2 / Kitty / Ghostty inline image protocols).
4
+ * Handles tmux passthrough for image protocols.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.__imageInternals = void 0;
8
+ const node_child_process_1 = require("node:child_process");
9
+ let _tmuxClientTermCache;
10
+ let _tmuxAllowPassthroughCache;
11
+ let _tmuxClientTermOverrideForTests;
12
+ let _tmuxAllowPassthroughOverrideForTests;
13
+ function isTmuxSession() {
14
+ return !!process.env.TMUX || /^(tmux|screen)/.test(process.env.TERM ?? "");
15
+ }
16
+ function normalizeTerminalName(term) {
17
+ const t = term.toLowerCase();
18
+ if (t.includes("kitty"))
19
+ return "kitty";
20
+ if (t.includes("ghostty"))
21
+ return "ghostty";
22
+ if (t.includes("wezterm"))
23
+ return "WezTerm";
24
+ if (t.includes("iterm"))
25
+ return "iTerm.app";
26
+ if (t.includes("mintty"))
27
+ return "mintty";
28
+ return term;
29
+ }
30
+ function readTmuxClientTerm() {
31
+ if (_tmuxClientTermOverrideForTests !== undefined) {
32
+ return _tmuxClientTermOverrideForTests ? normalizeTerminalName(_tmuxClientTermOverrideForTests) : null;
33
+ }
34
+ if (!isTmuxSession())
35
+ return null;
36
+ if (_tmuxClientTermCache !== undefined)
37
+ return _tmuxClientTermCache;
38
+ try {
39
+ const term = (0, node_child_process_1.execFileSync)("tmux", ["display-message", "-p", "#{client_termname}"], {
40
+ encoding: "utf8",
41
+ stdio: ["ignore", "pipe", "ignore"],
42
+ timeout: 200,
43
+ }).trim();
44
+ _tmuxClientTermCache = term ? normalizeTerminalName(term) : null;
45
+ }
46
+ catch {
47
+ _tmuxClientTermCache = null;
48
+ }
49
+ return _tmuxClientTermCache;
50
+ }
51
+ function getOuterTerminal() {
52
+ if (process.env.LC_TERMINAL === "iTerm2")
53
+ return "iTerm.app";
54
+ if (process.env.GHOSTTY_RESOURCES_DIR)
55
+ return "ghostty";
56
+ if (process.env.KITTY_WINDOW_ID || process.env.KITTY_PID)
57
+ return "kitty";
58
+ if (process.env.WEZTERM_EXECUTABLE || process.env.WEZTERM_CONFIG_DIR || process.env.WEZTERM_CONFIG_FILE) {
59
+ return "WezTerm";
60
+ }
61
+ const termProgram = process.env.TERM_PROGRAM ?? "";
62
+ if (termProgram && termProgram !== "tmux" && termProgram !== "screen") {
63
+ return normalizeTerminalName(termProgram);
64
+ }
65
+ const tmuxClientTerm = readTmuxClientTerm();
66
+ if (tmuxClientTerm)
67
+ return tmuxClientTerm;
68
+ const term = process.env.TERM ?? "";
69
+ if (term)
70
+ return normalizeTerminalName(term);
71
+ if (process.env.COLORTERM === "truecolor" || process.env.COLORTERM === "24bit")
72
+ return "unknown-modern";
73
+ return termProgram;
74
+ }
75
+ function detectImageProtocol() {
76
+ const forced = (process.env.PRETTY_IMAGE_PROTOCOL ?? "").toLowerCase();
77
+ if (forced === "kitty" || forced === "iterm2" || forced === "none")
78
+ return forced;
79
+ const term = getOuterTerminal();
80
+ if (term === "ghostty" || term === "kitty")
81
+ return "kitty";
82
+ if (["iTerm.app", "WezTerm", "mintty"].includes(term))
83
+ return "iterm2";
84
+ if (process.env.LC_TERMINAL === "iTerm2")
85
+ return "iterm2";
86
+ return "none";
87
+ }
88
+ function tmuxAllowsPassthrough() {
89
+ if (_tmuxAllowPassthroughOverrideForTests !== undefined)
90
+ return _tmuxAllowPassthroughOverrideForTests;
91
+ if (!isTmuxSession())
92
+ return null;
93
+ if (_tmuxAllowPassthroughCache !== undefined)
94
+ return _tmuxAllowPassthroughCache;
95
+ try {
96
+ const value = (0, node_child_process_1.execFileSync)("tmux", ["show-options", "-gv", "allow-passthrough"], {
97
+ encoding: "utf8",
98
+ stdio: ["ignore", "pipe", "ignore"],
99
+ timeout: 200,
100
+ })
101
+ .trim()
102
+ .toLowerCase();
103
+ _tmuxAllowPassthroughCache = value === "on" || value === "all";
104
+ }
105
+ catch {
106
+ _tmuxAllowPassthroughCache = null;
107
+ }
108
+ return _tmuxAllowPassthroughCache;
109
+ }
110
+ function getTmuxPassthroughWarning(protocol) {
111
+ if (!isTmuxSession() || protocol === "none")
112
+ return null;
113
+ if (tmuxAllowsPassthrough() === false) {
114
+ return 'tmux allow-passthrough is off. Run: tmux set -g allow-passthrough on';
115
+ }
116
+ return null;
117
+ }
118
+ function tmuxWrap(seq) {
119
+ if (!isTmuxSession())
120
+ return seq;
121
+ const escaped = seq.split("\x1b").join("\x1b\x1b");
122
+ return `\x1bPtmux;${escaped}\x1b\\`;
123
+ }
124
+ exports.__imageInternals = {
125
+ isTmuxSession,
126
+ getOuterTerminal,
127
+ detectImageProtocol,
128
+ tmuxWrap,
129
+ tmuxAllowsPassthrough,
130
+ getTmuxPassthroughWarning,
131
+ setTmuxClientTermOverrideForTests: (value) => {
132
+ _tmuxClientTermOverrideForTests = value;
133
+ },
134
+ setTmuxAllowPassthroughOverrideForTests: (value) => {
135
+ _tmuxAllowPassthroughOverrideForTests = value;
136
+ },
137
+ resetCachesForTests: () => {
138
+ _tmuxClientTermCache = undefined;
139
+ _tmuxAllowPassthroughCache = undefined;
140
+ _tmuxClientTermOverrideForTests = undefined;
141
+ _tmuxAllowPassthroughOverrideForTests = undefined;
142
+ },
143
+ };
144
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * pi-pretty — Pretty terminal output for pi built-in tools.
3
+ *
4
+ * Enhances read, bash, ls, find, grep, multi_grep with:
5
+ * • Syntax-highlighted file content (Shiki)
6
+ * • Colored bash exit status + output
7
+ * • Tree-view directory listings with file-type icons
8
+ * • FFF-accelerated find/grep with SDK fallback
9
+ * • Custom ANSI rendering for all tools
10
+ */
11
+ export { __imageInternals } from "./image.js";
12
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
13
+ import type { PiPrettyDeps } from "./types.js";
14
+ export type { PiPrettyDeps };
15
+ export default function piPrettyExtension(pi: ExtensionAPI, deps?: PiPrettyDeps): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,KAAK,EAAE,YAAY,EAA6C,MAAM,iCAAiC,CAAC;AAE/G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6B/C,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CA8MrF"}