@heyhuynhgiabuu/pi-pretty 0.6.23 → 0.6.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +51 -1
- package/dist/autocomplete.js +1 -4
- package/dist/autocomplete.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +141 -118
- package/dist/config.js.map +1 -1
- package/dist/fff-helpers.js +2 -7
- package/dist/fff-helpers.js.map +1 -1
- package/dist/fff.js +16 -23
- package/dist/fff.js.map +1 -1
- package/dist/find-glob.js +2 -6
- package/dist/find-glob.js.map +1 -1
- package/dist/helpers.js +11 -21
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +182 -59
- package/dist/index.js.map +1 -1
- package/dist/notices.js +1 -4
- package/dist/notices.js.map +1 -1
- package/dist/render.js +78 -96
- package/dist/render.js.map +1 -1
- package/dist/session-color.d.ts +30 -0
- package/dist/session-color.d.ts.map +1 -0
- package/dist/session-color.js +170 -0
- package/dist/session-color.js.map +1 -0
- package/dist/tools/bash.js +26 -29
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/find.js +31 -34
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.js +22 -25
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/labels.js +1 -4
- package/dist/tools/labels.js.map +1 -1
- package/dist/tools/ls.js +18 -21
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/metrics.js +4 -7
- package/dist/tools/metrics.js.map +1 -1
- package/dist/tools/read.js +35 -38
- package/dist/tools/read.js.map +1 -1
- package/dist/tui-text.js +5 -9
- package/dist/tui-text.js.map +1 -1
- package/dist/types.js +1 -2
- package/dist/types.js.map +1 -1
- package/dist/working-indicator.d.ts +184 -0
- package/dist/working-indicator.d.ts.map +1 -0
- package/dist/working-indicator.js +524 -0
- package/dist/working-indicator.js.map +1 -0
- package/package.json +7 -6
- package/src/config.ts +48 -0
- package/src/index.ts +177 -2
- package/src/session-color.ts +172 -0
- package/src/working-indicator.ts +691 -0
package/dist/fff-helpers.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* FFF helper functions — extracted for testability.
|
|
4
3
|
*
|
|
5
4
|
* Pure functions and classes used by the FFF integration in index.ts.
|
|
6
5
|
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.CursorStore = void 0;
|
|
9
|
-
exports.fffFormatGrepText = fffFormatGrepText;
|
|
10
6
|
function sanitizeGrepRecordContent(text) {
|
|
11
7
|
let content = text;
|
|
12
8
|
if (content.endsWith("\r\n"))
|
|
@@ -23,7 +19,7 @@ function truncateGrepRecordContent(text) {
|
|
|
23
19
|
* Store for FFF grep pagination cursors.
|
|
24
20
|
* Evicts oldest entry when exceeding maxSize.
|
|
25
21
|
*/
|
|
26
|
-
class CursorStore {
|
|
22
|
+
export class CursorStore {
|
|
27
23
|
cursors = new Map();
|
|
28
24
|
counter = 0;
|
|
29
25
|
maxSize;
|
|
@@ -47,12 +43,11 @@ class CursorStore {
|
|
|
47
43
|
return this.cursors.size;
|
|
48
44
|
}
|
|
49
45
|
}
|
|
50
|
-
exports.CursorStore = CursorStore;
|
|
51
46
|
/**
|
|
52
47
|
* Convert FFF GrepResult items to ripgrep-style "file:line:content" text.
|
|
53
48
|
* This ensures pi-pretty's renderGrepResults works unchanged.
|
|
54
49
|
*/
|
|
55
|
-
function fffFormatGrepText(items, limit) {
|
|
50
|
+
export function fffFormatGrepText(items, limit) {
|
|
56
51
|
const capped = items.slice(0, limit);
|
|
57
52
|
if (!capped.length)
|
|
58
53
|
return "No matches found";
|
package/dist/fff-helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fff-helpers.js","sourceRoot":"","sources":["../src/fff-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fff-helpers.js","sourceRoot":"","sources":["../src/fff-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/fff.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* pi-pretty: FFF lifecycle management.
|
|
4
3
|
*
|
|
@@ -6,16 +5,12 @@
|
|
|
6
5
|
* Tools check `isAvailable` and use `finder` directly for search operations.
|
|
7
6
|
* Graceful fallback: if FFF is not installed or fails, tools degrade to SDK.
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
exports.getSharedFffService = getSharedFffService;
|
|
12
|
-
exports.resetSharedFffServiceForTests = resetSharedFffServiceForTests;
|
|
13
|
-
const node_fs_1 = require("node:fs");
|
|
14
|
-
const node_path_1 = require("node:path");
|
|
8
|
+
import { mkdirSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
15
10
|
// ---------------------------------------------------------------------------
|
|
16
11
|
// Cursor store — pagination cursors for grep
|
|
17
12
|
// ---------------------------------------------------------------------------
|
|
18
|
-
class CursorStore {
|
|
13
|
+
export class CursorStore {
|
|
19
14
|
cursors = new Map();
|
|
20
15
|
counter = 0;
|
|
21
16
|
maxSize;
|
|
@@ -39,12 +34,11 @@ class CursorStore {
|
|
|
39
34
|
return this.cursors.size;
|
|
40
35
|
}
|
|
41
36
|
}
|
|
42
|
-
exports.CursorStore = CursorStore;
|
|
43
37
|
// ---------------------------------------------------------------------------
|
|
44
38
|
// FffService — wraps a single FileFinder instance
|
|
45
39
|
// ---------------------------------------------------------------------------
|
|
46
40
|
const SHARED_FFF_SERVICE_KEY = Symbol.for("pi-pretty.fff-service");
|
|
47
|
-
function getSharedFffService(fffModule, agentDir) {
|
|
41
|
+
export function getSharedFffService(fffModule, agentDir) {
|
|
48
42
|
const sharedGlobal = globalThis;
|
|
49
43
|
const existing = sharedGlobal[SHARED_FFF_SERVICE_KEY];
|
|
50
44
|
if (existing) {
|
|
@@ -55,12 +49,12 @@ function getSharedFffService(fffModule, agentDir) {
|
|
|
55
49
|
sharedGlobal[SHARED_FFF_SERVICE_KEY] = { service };
|
|
56
50
|
return service;
|
|
57
51
|
}
|
|
58
|
-
function resetSharedFffServiceForTests() {
|
|
52
|
+
export function resetSharedFffServiceForTests() {
|
|
59
53
|
const sharedGlobal = globalThis;
|
|
60
54
|
sharedGlobal[SHARED_FFF_SERVICE_KEY]?.service.destroy();
|
|
61
55
|
delete sharedGlobal[SHARED_FFF_SERVICE_KEY];
|
|
62
56
|
}
|
|
63
|
-
class FffService {
|
|
57
|
+
export class FffService {
|
|
64
58
|
finder = null;
|
|
65
59
|
partialIndex = false;
|
|
66
60
|
cursorStore = new CursorStore();
|
|
@@ -74,9 +68,9 @@ class FffService {
|
|
|
74
68
|
if (fffModule)
|
|
75
69
|
this.fffModule = fffModule;
|
|
76
70
|
if (agentDir) {
|
|
77
|
-
this.dbDir =
|
|
71
|
+
this.dbDir = join(agentDir, "pi-pretty", "fff");
|
|
78
72
|
try {
|
|
79
|
-
|
|
73
|
+
mkdirSync(this.dbDir, { recursive: true });
|
|
80
74
|
}
|
|
81
75
|
catch {
|
|
82
76
|
// FFF can still run without persistent frecency/history paths.
|
|
@@ -98,9 +92,9 @@ class FffService {
|
|
|
98
92
|
const mod = await import("@ff-labs/fff-node");
|
|
99
93
|
this.fffModule = mod;
|
|
100
94
|
if (!this.dbDir && process.env.HOME) {
|
|
101
|
-
this.dbDir =
|
|
95
|
+
this.dbDir = join(process.env.HOME, ".pi/agent", "pi-pretty", "fff");
|
|
102
96
|
try {
|
|
103
|
-
|
|
97
|
+
mkdirSync(this.dbDir, { recursive: true });
|
|
104
98
|
}
|
|
105
99
|
catch {
|
|
106
100
|
/* ignore */
|
|
@@ -147,23 +141,23 @@ class FffService {
|
|
|
147
141
|
throw new Error("FFF module is not loaded");
|
|
148
142
|
const result = this.fffModule.FileFinder.create({
|
|
149
143
|
basePath: cwd,
|
|
150
|
-
frecencyDbPath: dbDir ?
|
|
151
|
-
historyDbPath: dbDir ?
|
|
144
|
+
frecencyDbPath: dbDir ? join(dbDir, "frecency.mdb") : "",
|
|
145
|
+
historyDbPath: dbDir ? join(dbDir, "history.mdb") : "",
|
|
152
146
|
aiMode: true,
|
|
153
147
|
});
|
|
154
148
|
if (result.ok || !isAlreadyOpenError(result.error) || !dbDir)
|
|
155
149
|
return result;
|
|
156
|
-
const isolatedDir =
|
|
150
|
+
const isolatedDir = join(dbDir, `runtime-${process.pid}-${Date.now()}`);
|
|
157
151
|
try {
|
|
158
|
-
|
|
152
|
+
mkdirSync(isolatedDir, { recursive: true });
|
|
159
153
|
}
|
|
160
154
|
catch {
|
|
161
155
|
return result;
|
|
162
156
|
}
|
|
163
157
|
return this.fffModule.FileFinder.create({
|
|
164
158
|
basePath: cwd,
|
|
165
|
-
frecencyDbPath:
|
|
166
|
-
historyDbPath:
|
|
159
|
+
frecencyDbPath: join(isolatedDir, "frecency.mdb"),
|
|
160
|
+
historyDbPath: join(isolatedDir, "history.mdb"),
|
|
167
161
|
aiMode: true,
|
|
168
162
|
});
|
|
169
163
|
}
|
|
@@ -182,7 +176,6 @@ class FffService {
|
|
|
182
176
|
return this.cursorStore;
|
|
183
177
|
}
|
|
184
178
|
}
|
|
185
|
-
exports.FffService = FffService;
|
|
186
179
|
function isAlreadyOpenError(error) {
|
|
187
180
|
return /environment already open/i.test(error);
|
|
188
181
|
}
|
package/dist/fff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fff.js","sourceRoot":"","sources":["../src/fff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fff.js","sourceRoot":"","sources":["../src/fff.ts"],"names":[],"mappings":"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"}
|
package/dist/find-glob.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Glob normalization for FFF glob() (repo-relative paths).
|
|
4
3
|
* Aligns with Pi SDK find: bare *.ts searches under cwd recursively.
|
|
5
4
|
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.normalizeFindGlobPattern = normalizeFindGlobPattern;
|
|
8
|
-
exports.isLikelyGlobPattern = isLikelyGlobPattern;
|
|
9
5
|
/** Do not collapse double-star-slash-star to single star. */
|
|
10
|
-
function normalizeFindGlobPattern(pattern) {
|
|
6
|
+
export function normalizeFindGlobPattern(pattern) {
|
|
11
7
|
const p = pattern.trim();
|
|
12
8
|
if (!p)
|
|
13
9
|
return p;
|
|
@@ -20,7 +16,7 @@ function normalizeFindGlobPattern(pattern) {
|
|
|
20
16
|
return p;
|
|
21
17
|
}
|
|
22
18
|
/** Patterns where an empty FFF result is suspicious — try SDK find (fd). */
|
|
23
|
-
function isLikelyGlobPattern(pattern) {
|
|
19
|
+
export function isLikelyGlobPattern(pattern) {
|
|
24
20
|
const p = pattern.trim();
|
|
25
21
|
if (!p)
|
|
26
22
|
return false;
|
package/dist/find-glob.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-glob.js","sourceRoot":"","sources":["../src/find-glob.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"find-glob.js","sourceRoot":"","sources":["../src/find-glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6DAA6D;AAC7D,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACvD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACrD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC;AACV,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,OAAe;IAClD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/helpers.js
CHANGED
|
@@ -1,32 +1,22 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* pi-pretty: utility helpers.
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
exports.CHARS_KEY = exports.ELAPSED_KEY = void 0;
|
|
7
|
-
exports.normalizeLineEndings = normalizeLineEndings;
|
|
8
|
-
exports.shortPath = shortPath;
|
|
9
|
-
exports.stripBashExitStatusLine = stripBashExitStatusLine;
|
|
10
|
-
exports.formatElapsedMs = formatElapsedMs;
|
|
11
|
-
exports.formatCharCount = formatCharCount;
|
|
12
|
-
exports.inferBashExitCode = inferBashExitCode;
|
|
13
|
-
exports.compactErrorLines = compactErrorLines;
|
|
14
|
-
const node_path_1 = require("node:path");
|
|
4
|
+
import { relative } from "node:path";
|
|
15
5
|
// ---------------------------------------------------------------------------
|
|
16
6
|
// String / normalization
|
|
17
7
|
// ---------------------------------------------------------------------------
|
|
18
|
-
function normalizeLineEndings(text) {
|
|
8
|
+
export function normalizeLineEndings(text) {
|
|
19
9
|
return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
20
10
|
}
|
|
21
|
-
function shortPath(cwd, home, p) {
|
|
11
|
+
export function shortPath(cwd, home, p) {
|
|
22
12
|
if (!p)
|
|
23
13
|
return "";
|
|
24
|
-
const r =
|
|
14
|
+
const r = relative(cwd, p);
|
|
25
15
|
if (!r.startsWith("..") && !r.startsWith("/"))
|
|
26
16
|
return r;
|
|
27
17
|
return p.replace(home, "~");
|
|
28
18
|
}
|
|
29
|
-
function stripBashExitStatusLine(text) {
|
|
19
|
+
export function stripBashExitStatusLine(text) {
|
|
30
20
|
return normalizeLineEndings(text)
|
|
31
21
|
.split("\n")
|
|
32
22
|
.filter((line) => !/^Command exited with code \d+$/i.test(line.trim()))
|
|
@@ -35,7 +25,7 @@ function stripBashExitStatusLine(text) {
|
|
|
35
25
|
// ---------------------------------------------------------------------------
|
|
36
26
|
// Tool metrics
|
|
37
27
|
// ---------------------------------------------------------------------------
|
|
38
|
-
function formatElapsedMs(ms) {
|
|
28
|
+
export function formatElapsedMs(ms) {
|
|
39
29
|
if (typeof ms !== "number" || !Number.isFinite(ms))
|
|
40
30
|
return "";
|
|
41
31
|
if (ms < 1000)
|
|
@@ -43,7 +33,7 @@ function formatElapsedMs(ms) {
|
|
|
43
33
|
const s = ms / 1000;
|
|
44
34
|
return s < 10 ? `${s.toFixed(1)}s` : `${Math.round(s)}s`;
|
|
45
35
|
}
|
|
46
|
-
function formatCharCount(chars) {
|
|
36
|
+
export function formatCharCount(chars) {
|
|
47
37
|
if (typeof chars !== "number" || !Number.isFinite(chars) || chars <= 0)
|
|
48
38
|
return "";
|
|
49
39
|
if (chars < 1000)
|
|
@@ -52,12 +42,12 @@ function formatCharCount(chars) {
|
|
|
52
42
|
return `${(chars / 1000).toFixed(1)}k chars`;
|
|
53
43
|
return `${Math.round(chars / 1000)}k chars`;
|
|
54
44
|
}
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
export const ELAPSED_KEY = "__prettyElapsedMs";
|
|
46
|
+
export const CHARS_KEY = "__prettyOutputChars";
|
|
57
47
|
// ---------------------------------------------------------------------------
|
|
58
48
|
// Infer bash exit code
|
|
59
49
|
// ---------------------------------------------------------------------------
|
|
60
|
-
function inferBashExitCode(text, fallback) {
|
|
50
|
+
export function inferBashExitCode(text, fallback) {
|
|
61
51
|
const exitMatch = text.match(/(?:exit code|exited with(?: code)?|exit status)[:\s]*(\d+)/i);
|
|
62
52
|
if (exitMatch)
|
|
63
53
|
return Number(exitMatch[1]);
|
|
@@ -68,7 +58,7 @@ function inferBashExitCode(text, fallback) {
|
|
|
68
58
|
// ---------------------------------------------------------------------------
|
|
69
59
|
// Compact error lines
|
|
70
60
|
// ---------------------------------------------------------------------------
|
|
71
|
-
function compactErrorLines(error) {
|
|
61
|
+
export function compactErrorLines(error) {
|
|
72
62
|
const compactedLines = [];
|
|
73
63
|
let previousBlank = false;
|
|
74
64
|
for (const line of normalizeLineEndings(error).trim().split("\n")) {
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACX,YAAY,EAKZ,MAAM,iCAAiC,CAAC;AAUzC,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AA0BzD,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,wBAA8B,iBAAiB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgVpG"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* pi-pretty — Pretty terminal output for pi built-in tools.
|
|
4
3
|
*
|
|
@@ -9,61 +8,29 @@
|
|
|
9
8
|
* • FFF-accelerated find/grep with SDK fallback
|
|
10
9
|
* • Custom ANSI rendering for all tools
|
|
11
10
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
-
}) : function(o, v) {
|
|
26
|
-
o["default"] = v;
|
|
27
|
-
});
|
|
28
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
-
var ownKeys = function(o) {
|
|
30
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
-
var ar = [];
|
|
32
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
-
return ar;
|
|
34
|
-
};
|
|
35
|
-
return ownKeys(o);
|
|
36
|
-
};
|
|
37
|
-
return function (mod) {
|
|
38
|
-
if (mod && mod.__esModule) return mod;
|
|
39
|
-
var result = {};
|
|
40
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
-
__setModuleDefault(result, mod);
|
|
42
|
-
return result;
|
|
43
|
-
};
|
|
44
|
-
})();
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.default = piPrettyExtension;
|
|
47
|
-
const hostSdk = __importStar(require("@earendil-works/pi-coding-agent"));
|
|
48
|
-
const autocomplete_js_1 = require("./autocomplete.js");
|
|
49
|
-
const config_js_1 = require("./config.js");
|
|
50
|
-
const fff_js_1 = require("./fff.js");
|
|
51
|
-
const bash_js_1 = require("./tools/bash.js");
|
|
52
|
-
const find_js_1 = require("./tools/find.js");
|
|
53
|
-
const grep_js_1 = require("./tools/grep.js");
|
|
54
|
-
const ls_js_1 = require("./tools/ls.js");
|
|
55
|
-
const read_js_1 = require("./tools/read.js");
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import * as hostSdk from "@earendil-works/pi-coding-agent";
|
|
14
|
+
import { createFffAutocompleteProvider } from "./autocomplete.js";
|
|
15
|
+
import { applyConfig, getDefaultAgentDir, loadConfig, normalizeToolList, resolveToolSets } from "./config.js";
|
|
16
|
+
import { getSharedFffService } from "./fff.js";
|
|
17
|
+
import { registerBashTool } from "./tools/bash.js";
|
|
18
|
+
import { registerFindTool } from "./tools/find.js";
|
|
19
|
+
import { registerGrepTool } from "./tools/grep.js";
|
|
20
|
+
import { registerLsTool } from "./tools/ls.js";
|
|
21
|
+
import { registerReadTool } from "./tools/read.js";
|
|
22
|
+
import { createThinkingLabelAnimator, installWorkingIndicator, resolveThinkingIndicatorSettings, resolveWorkingIndicatorSettings, thinkingBlockActive, WORKING_INTERVAL_MS, } from "./working-indicator.js";
|
|
56
23
|
// ---------------------------------------------------------------------------
|
|
57
24
|
// Config
|
|
58
25
|
// ---------------------------------------------------------------------------
|
|
59
26
|
const DEFAULT_DISABLED_TOOLS = new Set(["ls"]);
|
|
60
27
|
function envTools(name) {
|
|
61
|
-
return new Set(
|
|
28
|
+
return new Set(normalizeToolList((process.env[name] ?? "").split(",")));
|
|
62
29
|
}
|
|
63
|
-
async function piPrettyExtension(pi, deps) {
|
|
64
|
-
const config =
|
|
65
|
-
|
|
66
|
-
const { disabledTools, enabledTools } =
|
|
30
|
+
export default async function piPrettyExtension(pi, deps) {
|
|
31
|
+
const config = loadConfig();
|
|
32
|
+
applyConfig(config);
|
|
33
|
+
const { disabledTools, enabledTools } = resolveToolSets(envTools("PRETTY_DISABLE_TOOLS"), envTools("PRETTY_ENABLE_TOOLS"), config);
|
|
67
34
|
const isToolEnabled = (name) => {
|
|
68
35
|
const normalizedName = name.toLowerCase();
|
|
69
36
|
return (!disabledTools.has(normalizedName) &&
|
|
@@ -78,8 +45,8 @@ async function piPrettyExtension(pi, deps) {
|
|
|
78
45
|
// has proven crash-prone across host Pi versions. FFF commands and indexing
|
|
79
46
|
// should still work even when SDK tool factories are unavailable.
|
|
80
47
|
const maybeGetAgentDir = deps?.sdk?.getAgentDir;
|
|
81
|
-
const agentDir = typeof maybeGetAgentDir === "function" ? maybeGetAgentDir() :
|
|
82
|
-
const fffService =
|
|
48
|
+
const agentDir = typeof maybeGetAgentDir === "function" ? maybeGetAgentDir() : getDefaultAgentDir();
|
|
49
|
+
const fffService = getSharedFffService(deps?.fffModule, agentDir);
|
|
83
50
|
// Text component for custom rendering (DI-friendly)
|
|
84
51
|
const TextComp = deps?.TextComponent;
|
|
85
52
|
// ------------------------------------------------------------------
|
|
@@ -146,9 +113,68 @@ async function piPrettyExtension(pi, deps) {
|
|
|
146
113
|
// ------------------------------------------------------------------
|
|
147
114
|
// Session lifecycle
|
|
148
115
|
// ------------------------------------------------------------------
|
|
116
|
+
const workingSettings = resolveWorkingIndicatorSettings(config.workingIndicator);
|
|
117
|
+
const thinkingSettings = resolveThinkingIndicatorSettings(config.thinkingIndicator);
|
|
118
|
+
let workingController;
|
|
119
|
+
let thinkingAnimator;
|
|
120
|
+
let thinkingInterval;
|
|
121
|
+
let thinkingLastMessage;
|
|
122
|
+
let thinkingHiddenCache = true;
|
|
123
|
+
let thinkingHiddenCheckedAt = 0;
|
|
124
|
+
let workingSessionName;
|
|
125
|
+
let workingStreaming = false;
|
|
126
|
+
/** pi persists the thinking-visibility toggle as a top-level settings key. */
|
|
127
|
+
const thinkingHidden = () => {
|
|
128
|
+
try {
|
|
129
|
+
const dir = getDefaultAgentDir();
|
|
130
|
+
if (!dir)
|
|
131
|
+
return false;
|
|
132
|
+
const parsed = JSON.parse(readFileSync(join(dir, "settings.json"), "utf8"));
|
|
133
|
+
return parsed.hideThinkingBlock === true;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
const safeSessionName = (ctx) => {
|
|
140
|
+
try {
|
|
141
|
+
return ctx.sessionManager?.getSessionName?.() ?? undefined;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
// (Re-)install the widget: new session, reload, or session rename (the
|
|
148
|
+
// accent tint tracks the name, omp-style). Preserves streaming state so a
|
|
149
|
+
// mid-stream rename does not drop the row.
|
|
150
|
+
const installIndicator = async (ctx) => {
|
|
151
|
+
workingController?.dispose();
|
|
152
|
+
workingController = undefined;
|
|
153
|
+
try {
|
|
154
|
+
const controller = await installWorkingIndicator(ctx.ui, workingSettings, undefined, workingSessionName);
|
|
155
|
+
workingController = controller;
|
|
156
|
+
if (workingStreaming)
|
|
157
|
+
controller.start();
|
|
158
|
+
// Noop install (disabled/blank) after a previous install → restore pi's loader.
|
|
159
|
+
if (controller.frames.length === 0)
|
|
160
|
+
ctx.ui.setWorkingVisible?.(true);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
try {
|
|
164
|
+
ctx.ui.setWorkingVisible?.(true);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Host without the API — nothing to restore.
|
|
168
|
+
}
|
|
169
|
+
ctx.ui?.notify?.(`pi-pretty working indicator failed: ${error instanceof Error ? error.message : String(error)}`, "warning");
|
|
170
|
+
}
|
|
171
|
+
};
|
|
149
172
|
pi.on("session_start", async (_event, ctx) => {
|
|
150
|
-
if (ctx.mode === "tui")
|
|
173
|
+
if (ctx.mode === "tui") {
|
|
151
174
|
ctx.ui.setToolsExpanded(false);
|
|
175
|
+
workingSessionName = safeSessionName(ctx);
|
|
176
|
+
await installIndicator(ctx);
|
|
177
|
+
}
|
|
152
178
|
if (!fffService)
|
|
153
179
|
return;
|
|
154
180
|
try {
|
|
@@ -168,13 +194,110 @@ async function piPrettyExtension(pi, deps) {
|
|
|
168
194
|
setTimeout(() => ui?.setStatus?.("fff", undefined), 3000);
|
|
169
195
|
}
|
|
170
196
|
// Register FFF-backed @-mention autocomplete only after a finder exists.
|
|
171
|
-
ctx.ui?.addAutocompleteProvider?.((current) =>
|
|
197
|
+
ctx.ui?.addAutocompleteProvider?.((current) => createFffAutocompleteProvider(current, () => fffService?.getFinder() ?? null));
|
|
172
198
|
}
|
|
173
199
|
catch (error) {
|
|
174
200
|
ctx.ui?.notify?.(`FFF init failed: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
175
201
|
}
|
|
176
202
|
});
|
|
203
|
+
// Re-apply the indicator when the session is (re)named so the accent tint
|
|
204
|
+
// tracks the name; omp derives the accent the same way.
|
|
205
|
+
pi.on("session_info_changed", async (event, ctx) => {
|
|
206
|
+
if (ctx.mode !== "tui")
|
|
207
|
+
return;
|
|
208
|
+
if (event.name === workingSessionName)
|
|
209
|
+
return;
|
|
210
|
+
workingSessionName = event.name;
|
|
211
|
+
if (workingSettings.enabled)
|
|
212
|
+
await installIndicator(ctx);
|
|
213
|
+
});
|
|
214
|
+
// Drive the widget with the streaming lifecycle (host loader is hidden).
|
|
215
|
+
pi.on("agent_start", async (_event, ctx) => {
|
|
216
|
+
if (ctx.mode !== "tui")
|
|
217
|
+
return;
|
|
218
|
+
workingStreaming = true;
|
|
219
|
+
workingController?.start();
|
|
220
|
+
});
|
|
221
|
+
const stopStreaming = async (_event, ctx) => {
|
|
222
|
+
if (ctx.mode !== "tui")
|
|
223
|
+
return;
|
|
224
|
+
workingStreaming = false;
|
|
225
|
+
workingController?.stop();
|
|
226
|
+
stopThinkingShimmer();
|
|
227
|
+
};
|
|
228
|
+
pi.on("agent_end", stopStreaming);
|
|
229
|
+
pi.on("agent_settled", stopStreaming);
|
|
230
|
+
const stopThinkingShimmer = () => {
|
|
231
|
+
if (thinkingInterval) {
|
|
232
|
+
clearInterval(thinkingInterval);
|
|
233
|
+
thinkingInterval = undefined;
|
|
234
|
+
}
|
|
235
|
+
thinkingAnimator?.restore();
|
|
236
|
+
thinkingAnimator = undefined;
|
|
237
|
+
thinkingLastMessage = undefined;
|
|
238
|
+
};
|
|
239
|
+
// Same 30fps cadence as the working row — but the interval lives ONLY while
|
|
240
|
+
// the streaming message is actively emitting a thinking block (each label
|
|
241
|
+
// change rebuilds chat children, so the moment text or tool calls stream the
|
|
242
|
+
// shimmer stops and pi's default label is restored).
|
|
243
|
+
const startThinkingShimmer = (ctx) => {
|
|
244
|
+
if (thinkingInterval || !thinkingSettings.enabled)
|
|
245
|
+
return;
|
|
246
|
+
try {
|
|
247
|
+
thinkingAnimator = createThinkingLabelAnimator(ctx.ui, workingSettings, workingSessionName, thinkingSettings);
|
|
248
|
+
thinkingHiddenCache = thinkingHidden();
|
|
249
|
+
thinkingHiddenCheckedAt = Date.now();
|
|
250
|
+
if (!thinkingHiddenCache) {
|
|
251
|
+
stopThinkingShimmer();
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
thinkingAnimator.tick();
|
|
255
|
+
thinkingInterval = setInterval(() => {
|
|
256
|
+
if (!workingStreaming) {
|
|
257
|
+
stopThinkingShimmer();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const now = Date.now();
|
|
261
|
+
if (now - thinkingHiddenCheckedAt > 500) {
|
|
262
|
+
thinkingHiddenCache = thinkingHidden();
|
|
263
|
+
thinkingHiddenCheckedAt = now;
|
|
264
|
+
if (!thinkingHiddenCache) {
|
|
265
|
+
stopThinkingShimmer();
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (!thinkingBlockActive(thinkingLastMessage)) {
|
|
270
|
+
// Thinking phase over: restore pi's default label and stop.
|
|
271
|
+
stopThinkingShimmer();
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
thinkingAnimator?.tick();
|
|
275
|
+
}, WORKING_INTERVAL_MS);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
stopThinkingShimmer();
|
|
279
|
+
ctx.ui?.notify?.(`pi-pretty thinking indicator failed: ${error instanceof Error ? error.message : String(error)}`, "warning");
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
// Remember the streaming message; lazily start the shimmer on the first
|
|
283
|
+
// thinking delta (thinkingHidden() is re-checked at most every 500ms).
|
|
284
|
+
pi.on("message_update", async (event, ctx) => {
|
|
285
|
+
if (ctx.mode !== "tui" || !workingStreaming)
|
|
286
|
+
return;
|
|
287
|
+
thinkingLastMessage = event.message;
|
|
288
|
+
if (thinkingInterval)
|
|
289
|
+
return;
|
|
290
|
+
if (!thinkingBlockActive(event.message))
|
|
291
|
+
return;
|
|
292
|
+
startThinkingShimmer(ctx);
|
|
293
|
+
});
|
|
177
294
|
pi.on("session_shutdown", async () => {
|
|
295
|
+
// Tear down the widget animation; pi re-runs session_start (and our
|
|
296
|
+
// install) after resume or session switching.
|
|
297
|
+
workingController?.dispose();
|
|
298
|
+
workingController = undefined;
|
|
299
|
+
stopThinkingShimmer();
|
|
300
|
+
workingStreaming = false;
|
|
178
301
|
// Intentionally keep the native FFF finder on session shutdown.
|
|
179
302
|
// Pi can emit shutdown/start during resume or session switching while the
|
|
180
303
|
// process keeps running. Native teardown, or dropping the JS handle while the
|
|
@@ -203,19 +326,19 @@ async function piPrettyExtension(pi, deps) {
|
|
|
203
326
|
// Tool registration
|
|
204
327
|
// ------------------------------------------------------------------
|
|
205
328
|
if (isToolEnabled("read") && createReadTool) {
|
|
206
|
-
|
|
329
|
+
registerReadTool(pi, cwd, null, createReadTool(cwd), TextComp);
|
|
207
330
|
}
|
|
208
331
|
if (isToolEnabled("bash") && createBashTool) {
|
|
209
|
-
|
|
332
|
+
registerBashTool(pi, cwd, null, createBashTool(cwd), TextComp);
|
|
210
333
|
}
|
|
211
334
|
if (isToolEnabled("ls") && createLsTool) {
|
|
212
|
-
|
|
335
|
+
registerLsTool(pi, cwd, null, createLsTool(cwd), TextComp);
|
|
213
336
|
}
|
|
214
337
|
if (isToolEnabled("find") && createFindTool) {
|
|
215
|
-
|
|
338
|
+
registerFindTool(pi, cwd, fffService, createFindTool(cwd), TextComp);
|
|
216
339
|
}
|
|
217
340
|
if (isToolEnabled("grep") && createGrepTool) {
|
|
218
|
-
|
|
341
|
+
registerGrepTool(pi, cwd, fffService, createGrepTool(cwd), TextComp);
|
|
219
342
|
}
|
|
220
343
|
}
|
|
221
344
|
//# sourceMappingURL=index.js.map
|