@heyhuynhgiabuu/pi-pretty 0.6.4 → 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 (87) hide show
  1. package/CHANGELOG.md +12 -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/biome.json +0 -22
  72. package/bun.lock +0 -598
  73. package/media/bash-and-read.png +0 -0
  74. package/media/icons-and-grep.png +0 -0
  75. package/media/inline-image.png +0 -0
  76. package/pi-pretty.example.json +0 -6
  77. package/release-notes/v0.3.2.md +0 -34
  78. package/release-notes/v0.3.3.md +0 -48
  79. package/release-notes/v0.4.0.md +0 -58
  80. package/release-notes/v0.4.1.md +0 -28
  81. package/release-notes/v0.4.2.md +0 -36
  82. package/release-notes/v0.4.4.md +0 -28
  83. package/release-notes/v0.5.3.md +0 -29
  84. package/test/bash-rendering.test.ts +0 -269
  85. package/test/fff-integration.test.ts +0 -800
  86. package/test/image-rendering.test.ts +0 -153
  87. package/tsconfig.json +0 -19
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.5] - 2026-06-16
4
+
5
+ ### Fixed
6
+
7
+ - **npm package missing dist/** — `.gitignore` excluded `dist/` from the published
8
+ npm package (`dist/` is in `.gitignore`, which npm uses as `.npmignore` by default
9
+ when no `.npmignore` exists). Pi could only see TypeScript source files, not compiled
10
+ JavaScript. The extension loaded but FFF service never initialized.
11
+
12
+ Fix: added `"files": ["dist/", "CHANGELOG.md", "src/"]` and `"main": "dist/index.js"`
13
+ to package.json to explicitly include compiled output in the published package.
14
+
3
15
  ## [0.6.4] - 2026-06-16
4
16
 
5
17
  ### Fixed
@@ -0,0 +1,10 @@
1
+ /**
2
+ * pi-pretty: FFF-backed @-mention autocomplete provider.
3
+ *
4
+ * Wraps the built-in autocomplete provider and replaces the @-mention file
5
+ * suggestions with FFF frecency-ranked file search results.
6
+ */
7
+ import type { AutocompleteProvider } from "@earendil-works/pi-tui";
8
+ import type { FileFinder } from "@ff-labs/fff-node";
9
+ export declare function createFffAutocompleteProvider(current: AutocompleteProvider, getFinder: () => FileFinder | null): AutocompleteProvider;
10
+ //# sourceMappingURL=autocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEX,oBAAoB,EAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAcpD,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,MAAM,UAAU,GAAG,IAAI,GAChC,oBAAoB,CAkEtB"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /**
3
+ * pi-pretty: FFF-backed @-mention autocomplete provider.
4
+ *
5
+ * Wraps the built-in autocomplete provider and replaces the @-mention file
6
+ * suggestions with FFF frecency-ranked file search results.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createFffAutocompleteProvider = createFffAutocompleteProvider;
10
+ /** How many @-mention suggestions to show at most. */
11
+ const MAX_SUGGESTIONS = 20;
12
+ /**
13
+ * Extract the query after a `@` character before the cursor.
14
+ * Returns the query string (empty string if bare `@`), or undefined if no `@` trigger.
15
+ */
16
+ function extractAtPrefix(textBeforeCursor) {
17
+ const match = textBeforeCursor.match(/(?:^|[ \t])@([^\s@]*)$/);
18
+ return match?.[1];
19
+ }
20
+ function createFffAutocompleteProvider(current, getFinder) {
21
+ return {
22
+ async getSuggestions(lines, cursorLine, cursorCol, options) {
23
+ const currentLine = lines[cursorLine] ?? "";
24
+ const textBeforeCursor = currentLine.slice(0, cursorCol);
25
+ const query = extractAtPrefix(textBeforeCursor);
26
+ // Not an @-mention — delegate
27
+ if (query === undefined) {
28
+ return current.getSuggestions(lines, cursorLine, cursorCol, options);
29
+ }
30
+ const finder = getFinder();
31
+ if (!finder) {
32
+ // FFF not available — delegate to built-in
33
+ return current.getSuggestions(lines, cursorLine, cursorCol, options);
34
+ }
35
+ try {
36
+ const result = finder.fileSearch(query, {
37
+ pageSize: MAX_SUGGESTIONS,
38
+ });
39
+ if (result.ok) {
40
+ const items = result.value.items.map((item) => ({
41
+ value: item.relativePath,
42
+ label: item.fileName,
43
+ description: item.relativePath.slice(0, -(item.fileName.length + 1)),
44
+ }));
45
+ if (items.length > 0) {
46
+ return { items, prefix: `@${query}` };
47
+ }
48
+ }
49
+ }
50
+ catch {
51
+ // FFF search failed — fall through to built-in
52
+ }
53
+ // FFF returned no results or failed — let built-in handle it
54
+ return current.getSuggestions(lines, cursorLine, cursorCol, options);
55
+ },
56
+ applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
57
+ return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
58
+ },
59
+ shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {
60
+ return current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=autocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAqBH,sEAqEC;AAjFD,sDAAsD;AACtD,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;GAGG;AACH,SAAS,eAAe,CAAC,gBAAwB;IAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC/D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,SAAgB,6BAA6B,CAC5C,OAA6B,EAC7B,SAAkC;IAElC,OAAO;QACN,KAAK,CAAC,cAAc,CACnB,KAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,OAAiD;YAEjD,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;YAEhD,8BAA8B;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,2CAA2C;gBAC3C,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE;oBACvC,QAAQ,EAAE,eAAe;iBAEzB,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,MAAM,KAAK,GAAuB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBACnE,KAAK,EAAE,IAAI,CAAC,YAAY;wBACxB,KAAK,EAAE,IAAI,CAAC,QAAQ;wBACpB,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;qBACpE,CAAC,CAAC,CAAC;oBAEJ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,EAAE,CAAC;oBACvC,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,+CAA+C;YAChD,CAAC;YAED,6DAA6D;YAC7D,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;QAED,eAAe,CACd,KAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,IAAsB,EACtB,MAAc;YAEd,OAAO,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5E,CAAC;QAED,2BAA2B,CAC1B,KAAe,EACf,UAAkB,EAClB,SAAiB;YAEjB,OAAO,OAAO,CAAC,2BAA2B,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC;QACpF,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * pi-pretty: ANSI codes, icons, theme, and environment config.
3
+ */
4
+ export declare let RST: string;
5
+ export declare const FG_LNUM = "\u001B[38;2;100;100;100m";
6
+ export declare const FG_DIM = "\u001B[38;2;80;80;80m";
7
+ export declare const FG_RULE = "\u001B[38;2;50;50;50m";
8
+ export declare const FG_GREEN = "\u001B[38;2;100;180;120m";
9
+ export declare const FG_RED = "\u001B[38;2;200;100;100m";
10
+ export declare const FG_YELLOW = "\u001B[38;2;220;180;80m";
11
+ export declare const FG_BLUE = "\u001B[38;2;100;140;220m";
12
+ export declare const FG_MUTED = "\u001B[38;2;139;148;158m";
13
+ export declare let BG_BASE: string;
14
+ export declare let BG_ERROR: string;
15
+ type BgThemeLike = {
16
+ getBgAnsi?: (key: string) => string;
17
+ };
18
+ export declare function resolveBaseBackground(theme: BgThemeLike | null | undefined): void;
19
+ export declare function termWidth(): number;
20
+ export declare const USE_ICONS: boolean;
21
+ export declare const NF_DIR: string;
22
+ export declare const NF_DEFAULT: string;
23
+ export declare function fileIcon(fp: string): string;
24
+ export declare function dirIcon(): string;
25
+ import type { BundledLanguage } from "shiki";
26
+ export declare function detectLang(fp: string): BundledLanguage | undefined;
27
+ export declare function envInt(name: string, fallback: number): number;
28
+ export declare const MAX_HL_CHARS: number;
29
+ export declare const MAX_PREVIEW_LINES: number;
30
+ export declare const CACHE_LIMIT: number;
31
+ export declare function getDefaultAgentDir(): string | undefined;
32
+ export {};
33
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,eAAO,IAAI,GAAG,QAAY,CAAC;AAG3B,eAAO,MAAM,OAAO,6BAA2B,CAAC;AAChD,eAAO,MAAM,MAAM,0BAAwB,CAAC;AAC5C,eAAO,MAAM,OAAO,0BAAwB,CAAC;AAC7C,eAAO,MAAM,QAAQ,6BAA2B,CAAC;AACjD,eAAO,MAAM,MAAM,6BAA2B,CAAC;AAC/C,eAAO,MAAM,SAAS,4BAA0B,CAAC;AACjD,eAAO,MAAM,OAAO,6BAA2B,CAAC;AAChD,eAAO,MAAM,QAAQ,6BAA2B,CAAC;AAGjD,eAAO,IAAI,OAAO,QAAa,CAAC;AAChC,eAAO,IAAI,QAAQ,QAAa,CAAC;AAQjC,KAAK,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAC;AAmE3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAQjF;AAMD,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAOD,eAAO,MAAM,SAAS,SAAgD,CAAC;AAEvE,eAAO,MAAM,MAAM,QAA2B,CAAC;AAC/C,eAAO,MAAM,UAAU,QAA0B,CAAC;AA4DlD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAMD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAiB7C,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAKlE;AAMD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,eAAO,MAAM,YAAY,QAAwC,CAAC;AAClE,eAAO,MAAM,iBAAiB,QAAyC,CAAC;AACxE,eAAO,MAAM,WAAW,QAAoC,CAAC;AAM7D,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAGvD"}
package/dist/config.js ADDED
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ /**
3
+ * pi-pretty: ANSI codes, icons, theme, and environment config.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CACHE_LIMIT = exports.MAX_PREVIEW_LINES = exports.MAX_HL_CHARS = exports.NF_DEFAULT = exports.NF_DIR = exports.USE_ICONS = exports.BG_ERROR = exports.BG_BASE = exports.FG_MUTED = exports.FG_BLUE = exports.FG_YELLOW = exports.FG_RED = exports.FG_GREEN = exports.FG_RULE = exports.FG_DIM = exports.FG_LNUM = exports.RST = void 0;
7
+ exports.resolveBaseBackground = resolveBaseBackground;
8
+ exports.termWidth = termWidth;
9
+ exports.fileIcon = fileIcon;
10
+ exports.dirIcon = dirIcon;
11
+ exports.detectLang = detectLang;
12
+ exports.envInt = envInt;
13
+ exports.getDefaultAgentDir = getDefaultAgentDir;
14
+ const node_fs_1 = require("node:fs");
15
+ const node_path_1 = require("node:path");
16
+ // ---------------------------------------------------------------------------
17
+ // ANSI
18
+ // ---------------------------------------------------------------------------
19
+ exports.RST = "\x1b[0m";
20
+ const BOLD = "\x1b[1m";
21
+ exports.FG_LNUM = "\x1b[38;2;100;100;100m";
22
+ exports.FG_DIM = "\x1b[38;2;80;80;80m";
23
+ exports.FG_RULE = "\x1b[38;2;50;50;50m";
24
+ exports.FG_GREEN = "\x1b[38;2;100;180;120m";
25
+ exports.FG_RED = "\x1b[38;2;200;100;100m";
26
+ exports.FG_YELLOW = "\x1b[38;2;220;180;80m";
27
+ exports.FG_BLUE = "\x1b[38;2;100;140;220m";
28
+ exports.FG_MUTED = "\x1b[38;2;139;148;158m";
29
+ const BG_DEFAULT = "\x1b[49m";
30
+ exports.BG_BASE = BG_DEFAULT;
31
+ exports.BG_ERROR = BG_DEFAULT;
32
+ const ESC_RE = "\u001b";
33
+ function parseAnsiRgb(ansi) {
34
+ const m = ansi.match(new RegExp(`${ESC_RE}\\[(?:38|48);2;(\\d+);(\\d+);(\\d+)m`));
35
+ return m ? { r: +m[1], g: +m[2], b: +m[3] } : null;
36
+ }
37
+ function getThemeBgAnsi(theme, key) {
38
+ try {
39
+ const bgAnsi = theme.getBgAnsi?.(key);
40
+ return bgAnsi && parseAnsiRgb(bgAnsi) ? bgAnsi : null;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function hexToAnsiBg(hex) {
47
+ const m = hex.match(/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);
48
+ if (!m)
49
+ return null;
50
+ const r = Number.parseInt(m[1], 16);
51
+ const g = Number.parseInt(m[2], 16);
52
+ const b = Number.parseInt(m[3], 16);
53
+ return `\x1b[48;2;${r};${g};${b}m`;
54
+ }
55
+ function readPrettyConfig(agentDir) {
56
+ if (!agentDir)
57
+ return {};
58
+ try {
59
+ const raw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(agentDir, "pi-pretty.json"), "utf8");
60
+ const parsed = JSON.parse(raw);
61
+ if (parsed.background) {
62
+ if (parsed.background.tool && !hexToAnsiBg(parsed.background.tool)) {
63
+ parsed.background.tool = undefined;
64
+ }
65
+ if (parsed.background.error && !hexToAnsiBg(parsed.background.error)) {
66
+ parsed.background.error = undefined;
67
+ }
68
+ if (!parsed.background.tool && !parsed.background.error) {
69
+ parsed.background = undefined;
70
+ }
71
+ }
72
+ return parsed;
73
+ }
74
+ catch {
75
+ return {};
76
+ }
77
+ }
78
+ function applyPrettyConfigBg(agentDir) {
79
+ const config = readPrettyConfig(agentDir);
80
+ if (!config.background?.tool)
81
+ return false;
82
+ const toolBg = hexToAnsiBg(config.background.tool);
83
+ if (!toolBg)
84
+ return false;
85
+ exports.BG_BASE = toolBg;
86
+ exports.BG_ERROR = config.background.error ? (hexToAnsiBg(config.background.error) ?? toolBg) : toolBg;
87
+ exports.RST = "\x1b[0m";
88
+ return true;
89
+ }
90
+ function resolveBaseBackground(theme) {
91
+ const home = process.env.HOME;
92
+ const configDir = process.env.PRETTY_CONFIG_DIR ?? (home ? (0, node_path_1.join)(home, ".pi/agent") : undefined);
93
+ if (applyPrettyConfigBg(configDir))
94
+ return;
95
+ if (!theme?.getBgAnsi)
96
+ return;
97
+ exports.BG_BASE = getThemeBgAnsi(theme, "toolSuccessBg") ?? getThemeBgAnsi(theme, "toolBg") ?? getThemeBgAnsi(theme, "background") ?? BG_DEFAULT;
98
+ exports.BG_ERROR = getThemeBgAnsi(theme, "toolErrorBg") ?? exports.BG_BASE;
99
+ exports.RST = "\x1b[0m";
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Terminal
103
+ // ---------------------------------------------------------------------------
104
+ function termWidth() {
105
+ if (process.stdout.columns)
106
+ return Math.max(1, Math.min(process.stdout.columns, 210));
107
+ const raw = process.stderr.columns ||
108
+ Number.parseInt(process.env.COLUMNS ?? "", 10) || 200;
109
+ return Math.max(1, Math.min(raw - 4, 210));
110
+ }
111
+ // ---------------------------------------------------------------------------
112
+ // File-type icons — Nerd Font glyphs
113
+ // ---------------------------------------------------------------------------
114
+ const ICONS_MODE = (process.env.PRETTY_ICONS ?? "nerd").toLowerCase();
115
+ exports.USE_ICONS = ICONS_MODE !== "none" && ICONS_MODE !== "off";
116
+ exports.NF_DIR = `${exports.FG_BLUE}\ue5ff${exports.RST}`;
117
+ exports.NF_DEFAULT = `${exports.FG_DIM}\uf15b${exports.RST}`;
118
+ const EXT_ICON = {
119
+ ts: `\x1b[38;2;49;120;198m\ue628${exports.RST}`,
120
+ tsx: `\x1b[38;2;49;120;198m\ue7ba${exports.RST}`,
121
+ js: `\x1b[38;2;241;224;90m\ue74e${exports.RST}`,
122
+ jsx: `\x1b[38;2;97;218;251m\ue7ba${exports.RST}`,
123
+ mjs: `\x1b[38;2;241;224;90m\ue74e${exports.RST}`,
124
+ cjs: `\x1b[38;2;241;224;90m\ue74e${exports.RST}`,
125
+ py: `\x1b[38;2;55;118;171m\ue73c${exports.RST}`,
126
+ rs: `\x1b[38;2;222;165;132m\ue7a8${exports.RST}`,
127
+ go: `\x1b[38;2;0;173;216m\ue724${exports.RST}`,
128
+ java: `\x1b[38;2;204;62;68m\ue738${exports.RST}`,
129
+ swift: `\x1b[38;2;255;172;77m\ue755${exports.RST}`,
130
+ rb: `\x1b[38;2;204;52;45m\ue739${exports.RST}`,
131
+ kt: `\x1b[38;2;126;103;200m\ue634${exports.RST}`,
132
+ c: `\x1b[38;2;85;154;211m\ue61e${exports.RST}`,
133
+ cpp: `\x1b[38;2;85;154;211m\ue61d${exports.RST}`,
134
+ cs: `\x1b[38;2;104;33;122m\ue648${exports.RST}`,
135
+ html: `\x1b[38;2;228;77;38m\ue736${exports.RST}`,
136
+ css: `\x1b[38;2;66;165;245m\ue749${exports.RST}`,
137
+ scss: `\x1b[38;2;207;100;154m\ue749${exports.RST}`,
138
+ vue: `\x1b[38;2;65;184;131m\ue6a0${exports.RST}`,
139
+ svelte: `\x1b[38;2;255;62;0m\ue697${exports.RST}`,
140
+ json: `\x1b[38;2;241;224;90m\ue60b${exports.RST}`,
141
+ yaml: `\x1b[38;2;160;116;196m\ue6a8${exports.RST}`,
142
+ yml: `\x1b[38;2;160;116;196m\ue6a8${exports.RST}`,
143
+ toml: `\x1b[38;2;160;116;196m\ue6b2${exports.RST}`,
144
+ xml: `\x1b[38;2;228;77;38m\ue619${exports.RST}`,
145
+ md: `\x1b[38;2;66;165;245m\ue73e${exports.RST}`,
146
+ mdx: `\x1b[38;2;66;165;245m\ue73e${exports.RST}`,
147
+ sql: `\x1b[38;2;218;218;218m\ue706${exports.RST}`,
148
+ sh: `\x1b[38;2;137;180;130m\ue795${exports.RST}`,
149
+ bash: `\x1b[38;2;137;180;130m\ue795${exports.RST}`,
150
+ zsh: `\x1b[38;2;137;180;130m\ue795${exports.RST}`,
151
+ lua: `\x1b[38;2;81;160;207m\ue620${exports.RST}`,
152
+ php: `\x1b[38;2;137;147;186m\ue73d${exports.RST}`,
153
+ dart: `\x1b[38;2;87;182;240m\ue798${exports.RST}`,
154
+ png: `\x1b[38;2;160;116;196m\uf1c5${exports.RST}`,
155
+ jpg: `\x1b[38;2;160;116;196m\uf1c5${exports.RST}`,
156
+ svg: `\x1b[38;2;255;180;50m\uf1c5${exports.RST}`,
157
+ webp: `\x1b[38;2;160;116;196m\uf1c5${exports.RST}`,
158
+ lock: `\x1b[38;2;130;130;130m\uf023${exports.RST}`,
159
+ env: `\x1b[38;2;241;224;90m\ue615${exports.RST}`,
160
+ graphql: `\x1b[38;2;224;51;144m\ue662${exports.RST}`,
161
+ dockerfile: `\x1b[38;2;56;152;236m\ue7b0${exports.RST}`,
162
+ };
163
+ const NAME_ICON = {
164
+ "package.json": `\x1b[38;2;137;180;130m\ue71e${exports.RST}`,
165
+ "package-lock.json": `\x1b[38;2;130;130;130m\ue71e${exports.RST}`,
166
+ "tsconfig.json": `\x1b[38;2;49;120;198m\ue628${exports.RST}`,
167
+ ".gitignore": `\x1b[38;2;222;165;132m\ue702${exports.RST}`,
168
+ ".env": `\x1b[38;2;241;224;90m\ue615${exports.RST}`,
169
+ dockerfile: `\x1b[38;2;56;152;236m\ue7b0${exports.RST}`,
170
+ makefile: `\x1b[38;2;130;130;130m\ue615${exports.RST}`,
171
+ "readme.md": `\x1b[38;2;66;165;245m\ue73e${exports.RST}`,
172
+ license: `\x1b[38;2;218;218;218m\ue60a${exports.RST}`,
173
+ };
174
+ function fileIcon(fp) {
175
+ if (!exports.USE_ICONS)
176
+ return "";
177
+ const base = (0, node_path_1.basename)(fp).toLowerCase();
178
+ if (NAME_ICON[base])
179
+ return `${NAME_ICON[base]} `;
180
+ const ext = (0, node_path_1.extname)(fp).slice(1).toLowerCase();
181
+ return EXT_ICON[ext] ? `${EXT_ICON[ext]} ` : `${exports.NF_DEFAULT} `;
182
+ }
183
+ function dirIcon() {
184
+ return exports.USE_ICONS ? `${exports.NF_DIR} ` : "";
185
+ }
186
+ const EXT_LANG = {
187
+ ts: "typescript", tsx: "tsx", js: "javascript", jsx: "jsx",
188
+ mjs: "javascript", cjs: "javascript",
189
+ py: "python", rb: "ruby", rs: "rust", go: "go", java: "java",
190
+ c: "c", cpp: "cpp", h: "c", hpp: "cpp",
191
+ cs: "csharp", swift: "swift", kt: "kotlin",
192
+ html: "html", css: "css", scss: "scss", less: "css",
193
+ json: "json", jsonc: "jsonc", yaml: "yaml", yml: "yaml",
194
+ toml: "toml", md: "markdown", mdx: "mdx", sql: "sql",
195
+ sh: "bash", bash: "bash", zsh: "bash", lua: "lua", php: "php",
196
+ dart: "dart", xml: "xml", graphql: "graphql", svelte: "svelte", vue: "vue",
197
+ dockerfile: "dockerfile", makefile: "make",
198
+ zig: "zig", nim: "nim", elixir: "elixir",
199
+ };
200
+ function detectLang(fp) {
201
+ const base = (0, node_path_1.basename)(fp).toLowerCase();
202
+ if (base === "dockerfile")
203
+ return "dockerfile";
204
+ if (base === "makefile" || base === "gnumakefile")
205
+ return "make";
206
+ return EXT_LANG[(0, node_path_1.extname)(fp).slice(1).toLowerCase()];
207
+ }
208
+ // ---------------------------------------------------------------------------
209
+ // Env helpers
210
+ // ---------------------------------------------------------------------------
211
+ function envInt(name, fallback) {
212
+ const v = Number.parseInt(process.env[name] ?? "", 10);
213
+ return Number.isFinite(v) && v > 0 ? v : fallback;
214
+ }
215
+ exports.MAX_HL_CHARS = envInt("PRETTY_MAX_HL_CHARS", 80_000);
216
+ exports.MAX_PREVIEW_LINES = envInt("PRETTY_MAX_PREVIEW_LINES", 80);
217
+ exports.CACHE_LIMIT = envInt("PRETTY_CACHE_LIMIT", 128);
218
+ // ---------------------------------------------------------------------------
219
+ // Agent directory helpers
220
+ // ---------------------------------------------------------------------------
221
+ function getDefaultAgentDir() {
222
+ const home = process.env.HOME ?? "";
223
+ return home ? (0, node_path_1.join)(home, ".pi/agent") : undefined;
224
+ }
225
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * FFF helper functions — extracted for testability.
3
+ *
4
+ * Pure functions and classes used by the FFF integration in index.ts.
5
+ */
6
+ import type { GrepCursor, GrepMatch } from "@ff-labs/fff-node";
7
+ /**
8
+ * Store for FFF grep pagination cursors.
9
+ * Evicts oldest entry when exceeding maxSize.
10
+ */
11
+ export declare class CursorStore {
12
+ private cursors;
13
+ private counter;
14
+ private maxSize;
15
+ constructor(maxSize?: number);
16
+ store(cursor: GrepCursor): string;
17
+ get(id: string): GrepCursor | undefined;
18
+ get size(): number;
19
+ }
20
+ /**
21
+ * Convert FFF GrepResult items to ripgrep-style "file:line:content" text.
22
+ * This ensures pi-pretty's renderGrepResults works unchanged.
23
+ */
24
+ export declare function fffFormatGrepText(items: GrepMatch[], limit: number): string;
25
+ //# sourceMappingURL=fff-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fff-helpers.d.ts","sourceRoot":"","sources":["../src/fff-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAe/D;;;GAGG;AACH,qBAAa,WAAW;IACvB,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAM;IAIzB,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAUjC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,IAAI,IAAI,IAAI,MAAM,CAEjB;CACD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA4B3E"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ /**
3
+ * FFF helper functions — extracted for testability.
4
+ *
5
+ * Pure functions and classes used by the FFF integration in index.ts.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CursorStore = void 0;
9
+ exports.fffFormatGrepText = fffFormatGrepText;
10
+ function sanitizeGrepRecordContent(text) {
11
+ let content = text;
12
+ if (content.endsWith("\r\n"))
13
+ content = content.slice(0, -2);
14
+ else if (content.endsWith("\r") || content.endsWith("\n"))
15
+ content = content.slice(0, -1);
16
+ return content.replace(/\r\n/g, "\\n").replace(/\r/g, "\\r").replace(/\n/g, "\\n");
17
+ }
18
+ function truncateGrepRecordContent(text) {
19
+ const content = sanitizeGrepRecordContent(text);
20
+ return content.length > 500 ? `${content.slice(0, 500)}...` : content;
21
+ }
22
+ /**
23
+ * Store for FFF grep pagination cursors.
24
+ * Evicts oldest entry when exceeding maxSize.
25
+ */
26
+ class CursorStore {
27
+ cursors = new Map();
28
+ counter = 0;
29
+ maxSize;
30
+ constructor(maxSize = 200) {
31
+ this.maxSize = maxSize;
32
+ }
33
+ store(cursor) {
34
+ const id = `fff_c${++this.counter}`;
35
+ this.cursors.set(id, cursor);
36
+ if (this.cursors.size > this.maxSize) {
37
+ const first = this.cursors.keys().next().value;
38
+ if (first)
39
+ this.cursors.delete(first);
40
+ }
41
+ return id;
42
+ }
43
+ get(id) {
44
+ return this.cursors.get(id);
45
+ }
46
+ get size() {
47
+ return this.cursors.size;
48
+ }
49
+ }
50
+ exports.CursorStore = CursorStore;
51
+ /**
52
+ * Convert FFF GrepResult items to ripgrep-style "file:line:content" text.
53
+ * This ensures pi-pretty's renderGrepResults works unchanged.
54
+ */
55
+ function fffFormatGrepText(items, limit) {
56
+ const capped = items.slice(0, limit);
57
+ if (!capped.length)
58
+ return "No matches found";
59
+ const lines = [];
60
+ let currentFile = "";
61
+ for (const match of capped) {
62
+ if (match.relativePath !== currentFile) {
63
+ if (currentFile)
64
+ lines.push("");
65
+ currentFile = match.relativePath;
66
+ }
67
+ if (match.contextBefore?.length) {
68
+ const startLine = match.lineNumber - match.contextBefore.length;
69
+ for (let i = 0; i < match.contextBefore.length; i++) {
70
+ lines.push(`${match.relativePath}-${startLine + i}-${truncateGrepRecordContent(match.contextBefore[i] ?? "")}`);
71
+ }
72
+ }
73
+ lines.push(`${match.relativePath}:${match.lineNumber}:${truncateGrepRecordContent(match.lineContent)}`);
74
+ if (match.contextAfter?.length) {
75
+ const startLine = match.lineNumber + 1;
76
+ for (let i = 0; i < match.contextAfter.length; i++) {
77
+ lines.push(`${match.relativePath}-${startLine + i}-${truncateGrepRecordContent(match.contextAfter[i] ?? "")}`);
78
+ }
79
+ }
80
+ }
81
+ return lines.join("\n");
82
+ }
83
+ //# sourceMappingURL=fff-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fff-helpers.js","sourceRoot":"","sources":["../src/fff-helpers.ts"],"names":[],"mappings":"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"}
package/dist/fff.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * pi-pretty: FFF lifecycle management.
3
+ *
4
+ * Manages the FFF file finder lifecycle: create, wait for scan, destroy.
5
+ * Tools check `isAvailable` and use `finder` directly for search operations.
6
+ * Graceful fallback: if FFF is not installed or fails, tools degrade to SDK.
7
+ */
8
+ import type { FileFinder as FffFileFinder, GrepCursor } from "@ff-labs/fff-node";
9
+ export declare class CursorStore {
10
+ private cursors;
11
+ private counter;
12
+ private maxSize;
13
+ constructor(maxSize?: number);
14
+ store(cursor: GrepCursor): string;
15
+ get(id: string): GrepCursor | undefined;
16
+ get size(): number;
17
+ }
18
+ export declare class FffService {
19
+ finder: FffFileFinder | null;
20
+ partialIndex: boolean;
21
+ cursorStore: CursorStore;
22
+ private fffModule;
23
+ private dbDir;
24
+ private finderPromise;
25
+ constructor(fffModule?: typeof import("@ff-labs/fff-node"), agentDir?: string);
26
+ /** Returns true if the FFF native module is loaded (installed). */
27
+ isModuleLoaded(): boolean;
28
+ get isAvailable(): boolean;
29
+ /** Attempt to load FFF module dynamically (called during session_start if not injected). */
30
+ tryLoadModule(): Promise<boolean>;
31
+ ensureFinder(cwd: string): Promise<void>;
32
+ private _createFinder;
33
+ destroy(): void;
34
+ getFinder(): import("@ff-labs/fff-node").FileFinder | null;
35
+ getCursorStore(): CursorStore;
36
+ }
37
+ //# sourceMappingURL=fff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fff.d.ts","sourceRoot":"","sources":["../src/fff.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,UAAU,IAAI,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMjF,qBAAa,WAAW;IACvB,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAM;IAIzB,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAUjC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,IAAI,IAAI,IAAI,MAAM,CAEjB;CACD;AAMD,qBAAa,UAAU;IACtB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAQ;IACpC,YAAY,UAAS;IACrB,WAAW,cAAqB;IAEhC,OAAO,CAAC,SAAS,CAAmD;IACpE,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,aAAa,CAA8B;gBAEvC,SAAS,CAAC,EAAE,cAAc,mBAAmB,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM;IAY7E,mEAAmE;IACnE,cAAc,IAAI,OAAO;IAIzB,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,4FAA4F;IACtF,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBjC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAShC,aAAa;IAwB3B,OAAO,IAAI,IAAI;IASf,SAAS,IAAI,OAAO,mBAAmB,EAAE,UAAU,GAAG,IAAI;IAI1D,cAAc,IAAI,WAAW;CAG7B"}