@heyhuynhgiabuu/pi-pretty 0.6.12 → 0.6.14
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/dist/autocomplete.d.ts.map +1 -1
- package/dist/autocomplete.js +4 -1
- package/dist/autocomplete.js.map +1 -1
- package/dist/fff.d.ts +4 -0
- package/dist/fff.d.ts.map +1 -1
- package/dist/fff.js +71 -17
- package/dist/fff.js.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/autocomplete.ts +7 -12
- package/src/fff.ts +82 -18
- package/src/index.ts +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAoB,oBAAoB,EAA2B,MAAM,wBAAwB,CAAC;AAC9G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAcpD,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,MAAM,UAAU,GAAG,IAAI,GAChC,oBAAoB,CA6DtB"}
|
package/dist/autocomplete.js
CHANGED
|
@@ -38,7 +38,7 @@ function createFffAutocompleteProvider(current, getFinder) {
|
|
|
38
38
|
});
|
|
39
39
|
if (result.ok) {
|
|
40
40
|
const items = result.value.items.map((item) => ({
|
|
41
|
-
value: item.relativePath,
|
|
41
|
+
value: toMentionValue(item.relativePath),
|
|
42
42
|
label: item.fileName,
|
|
43
43
|
description: item.relativePath.slice(0, -(item.fileName.length + 1)),
|
|
44
44
|
}));
|
|
@@ -61,4 +61,7 @@ function createFffAutocompleteProvider(current, getFinder) {
|
|
|
61
61
|
},
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
|
+
function toMentionValue(path) {
|
|
65
|
+
return /\s/.test(path) ? `@"${path.replaceAll('"', '\\"')}"` : `@${path}`;
|
|
66
|
+
}
|
|
64
67
|
//# sourceMappingURL=autocomplete.js.map
|
package/dist/autocomplete.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":"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"}
|
package/dist/fff.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ export declare class CursorStore {
|
|
|
15
15
|
get(id: string): GrepCursor | undefined;
|
|
16
16
|
get size(): number;
|
|
17
17
|
}
|
|
18
|
+
export declare function getSharedFffService(fffModule?: typeof import("@ff-labs/fff-node"), agentDir?: string): FffService;
|
|
19
|
+
export declare function resetSharedFffServiceForTests(): void;
|
|
18
20
|
export declare class FffService {
|
|
19
21
|
finder: FffFileFinder | null;
|
|
20
22
|
partialIndex: boolean;
|
|
@@ -23,6 +25,7 @@ export declare class FffService {
|
|
|
23
25
|
private dbDir;
|
|
24
26
|
private finderPromise;
|
|
25
27
|
constructor(fffModule?: typeof import("@ff-labs/fff-node"), agentDir?: string);
|
|
28
|
+
configure(fffModule?: typeof import("@ff-labs/fff-node"), agentDir?: string): void;
|
|
26
29
|
/** Returns true if the FFF native module is loaded (installed). */
|
|
27
30
|
isModuleLoaded(): boolean;
|
|
28
31
|
get isAvailable(): boolean;
|
|
@@ -30,6 +33,7 @@ export declare class FffService {
|
|
|
30
33
|
tryLoadModule(): Promise<boolean>;
|
|
31
34
|
ensureFinder(cwd: string): Promise<void>;
|
|
32
35
|
private _createFinder;
|
|
36
|
+
private createFinder;
|
|
33
37
|
destroy(): void;
|
|
34
38
|
getFinder(): import("@ff-labs/fff-node").FileFinder | null;
|
|
35
39
|
getCursorStore(): CursorStore;
|
package/dist/fff.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAgBD,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,cAAc,mBAAmB,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAWjH;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAIpD;AAED,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;IAI7E,SAAS,CAAC,SAAS,CAAC,EAAE,cAAc,mBAAmB,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAYlF,mEAAmE;IACnE,cAAc,IAAI,OAAO;IAIzB,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,4FAA4F;IACtF,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAmBjC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAahC,aAAa;IAkB3B,OAAO,CAAC,YAAY;IA2BpB,OAAO,IAAI,IAAI;IASf,SAAS,IAAI,OAAO,mBAAmB,EAAE,UAAU,GAAG,IAAI;IAI1D,cAAc,IAAI,WAAW;CAG7B"}
|
package/dist/fff.js
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.FffService = exports.CursorStore = void 0;
|
|
11
|
+
exports.getSharedFffService = getSharedFffService;
|
|
12
|
+
exports.resetSharedFffServiceForTests = resetSharedFffServiceForTests;
|
|
11
13
|
const node_fs_1 = require("node:fs");
|
|
12
14
|
const node_path_1 = require("node:path");
|
|
13
15
|
// ---------------------------------------------------------------------------
|
|
@@ -41,6 +43,23 @@ exports.CursorStore = CursorStore;
|
|
|
41
43
|
// ---------------------------------------------------------------------------
|
|
42
44
|
// FffService — wraps a single FileFinder instance
|
|
43
45
|
// ---------------------------------------------------------------------------
|
|
46
|
+
const SHARED_FFF_SERVICE_KEY = Symbol.for("pi-pretty.fff-service");
|
|
47
|
+
function getSharedFffService(fffModule, agentDir) {
|
|
48
|
+
const sharedGlobal = globalThis;
|
|
49
|
+
const existing = sharedGlobal[SHARED_FFF_SERVICE_KEY];
|
|
50
|
+
if (existing) {
|
|
51
|
+
existing.service.configure(fffModule, agentDir);
|
|
52
|
+
return existing.service;
|
|
53
|
+
}
|
|
54
|
+
const service = new FffService(fffModule, agentDir);
|
|
55
|
+
sharedGlobal[SHARED_FFF_SERVICE_KEY] = { service };
|
|
56
|
+
return service;
|
|
57
|
+
}
|
|
58
|
+
function resetSharedFffServiceForTests() {
|
|
59
|
+
const sharedGlobal = globalThis;
|
|
60
|
+
sharedGlobal[SHARED_FFF_SERVICE_KEY]?.service.destroy();
|
|
61
|
+
delete sharedGlobal[SHARED_FFF_SERVICE_KEY];
|
|
62
|
+
}
|
|
44
63
|
class FffService {
|
|
45
64
|
finder = null;
|
|
46
65
|
partialIndex = false;
|
|
@@ -49,14 +68,18 @@ class FffService {
|
|
|
49
68
|
dbDir = null;
|
|
50
69
|
finderPromise = null;
|
|
51
70
|
constructor(fffModule, agentDir) {
|
|
52
|
-
|
|
71
|
+
this.configure(fffModule, agentDir);
|
|
72
|
+
}
|
|
73
|
+
configure(fffModule, agentDir) {
|
|
74
|
+
if (fffModule)
|
|
53
75
|
this.fffModule = fffModule;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
76
|
+
if (agentDir) {
|
|
77
|
+
this.dbDir = (0, node_path_1.join)(agentDir, "pi-pretty", "fff");
|
|
78
|
+
try {
|
|
79
|
+
(0, node_fs_1.mkdirSync)(this.dbDir, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// FFF can still run without persistent frecency/history paths.
|
|
60
83
|
}
|
|
61
84
|
}
|
|
62
85
|
}
|
|
@@ -79,7 +102,9 @@ class FffService {
|
|
|
79
102
|
try {
|
|
80
103
|
(0, node_fs_1.mkdirSync)(this.dbDir, { recursive: true });
|
|
81
104
|
}
|
|
82
|
-
catch {
|
|
105
|
+
catch {
|
|
106
|
+
/* ignore */
|
|
107
|
+
}
|
|
83
108
|
}
|
|
84
109
|
return true;
|
|
85
110
|
}
|
|
@@ -92,9 +117,15 @@ class FffService {
|
|
|
92
117
|
return;
|
|
93
118
|
if (this.finderPromise)
|
|
94
119
|
return this.finderPromise;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
120
|
+
const promise = this._createFinder(cwd);
|
|
121
|
+
this.finderPromise = promise;
|
|
122
|
+
try {
|
|
123
|
+
await promise;
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
if (this.finderPromise === promise)
|
|
127
|
+
this.finderPromise = null;
|
|
128
|
+
}
|
|
98
129
|
}
|
|
99
130
|
async _createFinder(cwd) {
|
|
100
131
|
if (!this.fffModule)
|
|
@@ -103,12 +134,7 @@ class FffService {
|
|
|
103
134
|
this.finder.destroy();
|
|
104
135
|
this.finder = null;
|
|
105
136
|
}
|
|
106
|
-
const result = this.
|
|
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
|
-
});
|
|
137
|
+
const result = this.createFinder(cwd, this.dbDir);
|
|
112
138
|
if (!result.ok) {
|
|
113
139
|
throw new Error(`FFF init failed: ${result.error}`);
|
|
114
140
|
}
|
|
@@ -116,6 +142,31 @@ class FffService {
|
|
|
116
142
|
const scan = await this.finder.waitForScan(15_000);
|
|
117
143
|
this.partialIndex = scan.ok && !scan.value;
|
|
118
144
|
}
|
|
145
|
+
createFinder(cwd, dbDir) {
|
|
146
|
+
if (!this.fffModule)
|
|
147
|
+
throw new Error("FFF module is not loaded");
|
|
148
|
+
const result = this.fffModule.FileFinder.create({
|
|
149
|
+
basePath: cwd,
|
|
150
|
+
frecencyDbPath: dbDir ? (0, node_path_1.join)(dbDir, "frecency.mdb") : "",
|
|
151
|
+
historyDbPath: dbDir ? (0, node_path_1.join)(dbDir, "history.mdb") : "",
|
|
152
|
+
aiMode: true,
|
|
153
|
+
});
|
|
154
|
+
if (result.ok || !isAlreadyOpenError(result.error) || !dbDir)
|
|
155
|
+
return result;
|
|
156
|
+
const isolatedDir = (0, node_path_1.join)(dbDir, `runtime-${process.pid}-${Date.now()}`);
|
|
157
|
+
try {
|
|
158
|
+
(0, node_fs_1.mkdirSync)(isolatedDir, { recursive: true });
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
return this.fffModule.FileFinder.create({
|
|
164
|
+
basePath: cwd,
|
|
165
|
+
frecencyDbPath: (0, node_path_1.join)(isolatedDir, "frecency.mdb"),
|
|
166
|
+
historyDbPath: (0, node_path_1.join)(isolatedDir, "history.mdb"),
|
|
167
|
+
aiMode: true,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
119
170
|
destroy() {
|
|
120
171
|
if (this.finder && !this.finder.isDestroyed) {
|
|
121
172
|
this.finder.destroy();
|
|
@@ -132,4 +183,7 @@ class FffService {
|
|
|
132
183
|
}
|
|
133
184
|
}
|
|
134
185
|
exports.FffService = FffService;
|
|
186
|
+
function isAlreadyOpenError(error) {
|
|
187
|
+
return /environment already open/i.test(error);
|
|
188
|
+
}
|
|
135
189
|
//# sourceMappingURL=fff.js.map
|
package/dist/fff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fff.js","sourceRoot":"","sources":["../src/fff.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"fff.js","sourceRoot":"","sources":["../src/fff.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -47,7 +47,7 @@ async function piPrettyExtension(pi, deps) {
|
|
|
47
47
|
// should still work even when SDK tool factories are unavailable.
|
|
48
48
|
const maybeGetAgentDir = deps?.sdk?.getAgentDir;
|
|
49
49
|
const agentDir = typeof maybeGetAgentDir === "function" ? maybeGetAgentDir() : (0, config_js_1.getDefaultAgentDir)();
|
|
50
|
-
let fffService =
|
|
50
|
+
let fffService = (0, fff_js_1.getSharedFffService)(deps?.fffModule, agentDir);
|
|
51
51
|
// Ripgrep fallback for multi_grep
|
|
52
52
|
const multiGrepFallback = deps?.multiGrepRipgrepFallback ?? multi_grep_fallback_js_1.runMultiGrepRipgrepFallback;
|
|
53
53
|
// Text component for custom rendering (DI-friendly)
|
|
@@ -143,11 +143,11 @@ async function piPrettyExtension(pi, deps) {
|
|
|
143
143
|
}
|
|
144
144
|
});
|
|
145
145
|
pi.on("session_shutdown", async () => {
|
|
146
|
-
// Intentionally
|
|
146
|
+
// Intentionally keep the native FFF finder on session shutdown.
|
|
147
147
|
// Pi can emit shutdown/start during resume or session switching while the
|
|
148
|
-
// process keeps running. Native teardown
|
|
149
|
-
//
|
|
150
|
-
|
|
148
|
+
// process keeps running. Native teardown, or dropping the JS handle while the
|
|
149
|
+
// native LMDB frecency env stays open, can make the next init fail with
|
|
150
|
+
// "environment already open in this program". Let process exit reclaim it.
|
|
151
151
|
});
|
|
152
152
|
// ------------------------------------------------------------------
|
|
153
153
|
// Resolve SDK tools, if available
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAsCH,oCAqNC;AAzPD,sBAAsB;AACtB,uCAA8C;AAArC,4GAAA,gBAAgB,OAAA;AAKzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAsCH,oCAqNC;AAzPD,sBAAsB;AACtB,uCAA8C;AAArC,4GAAA,gBAAgB,OAAA;AAKzB,qCAAgE;AAChE,6CAAmD;AACnD,6CAAmD;AACnD,yCAA+C;AAC/C,6CAAmD;AACnD,6CAAmD;AACnD,yDAA8D;AAC9D,qEAAuE;AACvE,2CAAiD;AACjD,uDAAkE;AAElE,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,SAAS,gBAAgB;IACxB,OAAO,IAAI,GAAG,CACb,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;SACtC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CACjB,CAAC;AACH,CAAC;AAQc,KAAK,UAAU,iBAAiB,CAAC,EAAgB,EAAE,IAAmB;IACpF,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,qEAAqE;IACrE,mBAAmB;IACnB,qEAAqE;IACrE,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,kEAAkE;IAElE,MAAM,gBAAgB,GAAG,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAA,8BAAkB,GAAE,CAAC;IACpG,IAAI,UAAU,GAAsB,IAAA,4BAAmB,EAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEnF,kCAAkC;IAClC,MAAM,iBAAiB,GAAG,IAAI,EAAE,wBAAwB,IAAI,oDAA2B,CAAC;IAExF,oDAAoD;IACpD,MAAM,QAAQ,GAAG,IAAI,EAAE,aAAa,CAAC;IAErC,qEAAqE;IACrE,eAAe;IACf,qEAAqE;IAErE,IAAI,UAAU,EAAE,CAAC;QAChB,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE;YAChC,WAAW,EAAE,gDAAgD;YAC7D,OAAO,EAAE,KAAK,EAAE,KAAa,EAAE,GAA4B,EAAE,EAAE;gBAC9D,MAAM,GAAG,GAAG,UAAW,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACtB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;oBAChD,OAAO;gBACR,CAAC;gBACD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACb,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;oBAChD,OAAO;gBACR,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBAChB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,wBAAwB,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC/D,OAAO;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;gBACvB,MAAM,KAAK,GAAG;oBACb,QAAQ,CAAC,CAAC,OAAO,EAAE;oBACnB,QAAQ,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC9E,WAAW,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,EAAE;oBACrG,aAAa,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE;oBAC7D,kBAAkB,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE;oBACtE,kBAAkB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE;iBACpE,CAAC;gBACF,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC1C,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CACT,aAAa,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,iBAAiB,SAAS,CACnG,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;SACD,CAAC,CAAC;QAEH,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE;YAChC,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,KAAK,EAAE,KAAa,EAAE,GAA4B,EAAE,EAAE;gBAC9D,MAAM,GAAG,GAAG,UAAW,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACtB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;oBAChD,OAAO;gBACR,CAAC;gBACD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACb,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;oBAChD,OAAO;gBACR,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBAChB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;oBACzD,OAAO;gBACR,CAAC;gBACD,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC;gBACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,oBAAoB;IACpB,qEAAqE;IAErE,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAe,EAAE,GAAqB,EAAE,EAAE;QACvE,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,IAAI,CAAC;YACJ,4CAA4C;YAC5C,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM;oBAAE,OAAO;YACrB,CAAC;YAED,MAAM,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC7B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,wEAAwE,EAAE,SAAS,CAAC,CAAC;YACvG,CAAC;iBAAM,CAAC;gBACP,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;gBAClB,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;gBACtC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC;YAED,yEAAyE;YACzE,GAAG,CAAC,EAAE,EAAE,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7C,IAAA,+CAA6B,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAC7E,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACzB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,oBAAoB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACzG,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QACpC,gEAAgE;QAChE,0EAA0E;QAC1E,8EAA8E;QAC9E,wEAAwE;QACxE,2EAA2E;IAC5E,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,kCAAkC;IAClC,qEAAqE;IACrE,4EAA4E;IAC5E,+EAA+E;IAE/E,IAAI,GAAG,GAAQ,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;IAC/B,IAAI,cAAc,GAAQ,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,wBAAwB,CAAC;IAC7E,IAAI,cAAc,GAAQ,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,wBAAwB,CAAC;IAC7E,IAAI,YAAY,GAAQ,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,sBAAsB,CAAC;IACvE,IAAI,cAAc,GAAQ,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,wBAAwB,CAAC;IAC7E,IAAI,cAAc,GAAQ,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,wBAAwB,CAAC;IAE7E,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,IAAI,CAAC;YACJ,gEAAgE;YAChE,qEAAqE;YACrE,4DAA4D;YAC5D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;YAC5D,GAAG,GAAG,GAAG,CAAC;YACV,cAAc,GAAG,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,cAAc,CAAC;YACpE,cAAc,GAAG,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,cAAc,CAAC;YACpE,YAAY,GAAG,GAAG,CAAC,sBAAsB,IAAI,GAAG,CAAC,YAAY,CAAC;YAC9D,cAAc,GAAG,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,cAAc,CAAC;YACpE,cAAc,GAAG,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,cAAc,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACR,cAAc,GAAG,SAAS,CAAC;YAC3B,cAAc,GAAG,SAAS,CAAC;YAC3B,YAAY,GAAG,SAAS,CAAC;YACzB,cAAc,GAAG,SAAS,CAAC;YAC3B,cAAc,GAAG,SAAS,CAAC;QAC5B,CAAC;IACF,CAAC;IAED,qEAAqE;IACrE,oBAAoB;IACpB,qEAAqE;IAErE,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC7C,IAAA,0BAAgB,EAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC7C,IAAA,0BAAgB,EAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;QACzC,IAAA,sBAAc,EAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC7C,IAAA,0BAAgB,EAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC7C,IAAA,0BAAgB,EAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,EAAE,CAAC;QACnE,IAAA,qCAAqB,EACpB,EAAE,EACF,GAAG,EACH,UAAU,EACV,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAChD,iBAAiB,EACjB,QAAQ,CACR,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,0EAA0E;IAC1E,gEAAgE;IAChE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,MAAM,CAAC;IAC/B,MAAM,sBAAsB,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACrF,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,eAAe,GAAG,IAAI,EAAE,CAAC,CAAC;QAChF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAEzC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;QAEvE,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACvF,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heyhuynhgiabuu/pi-pretty",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.14",
|
|
4
4
|
"description": "Pretty terminal output for pi — syntax-highlighted file reads, colored bash output, tree-view directory listings, and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"test:watch": "vitest --passWithNoTests"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@ff-labs/fff-node": "^0.9.
|
|
39
|
+
"@ff-labs/fff-node": "^0.9.6",
|
|
40
40
|
"@shikijs/cli": "^4.0.2",
|
|
41
41
|
"typebox": "1.1.38"
|
|
42
42
|
},
|
package/src/autocomplete.ts
CHANGED
|
@@ -5,11 +5,7 @@
|
|
|
5
5
|
* suggestions with FFF frecency-ranked file search results.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type {
|
|
9
|
-
AutocompleteItem,
|
|
10
|
-
AutocompleteProvider,
|
|
11
|
-
AutocompleteSuggestions,
|
|
12
|
-
} from "@earendil-works/pi-tui";
|
|
8
|
+
import type { AutocompleteItem, AutocompleteProvider, AutocompleteSuggestions } from "@earendil-works/pi-tui";
|
|
13
9
|
import type { FileFinder } from "@ff-labs/fff-node";
|
|
14
10
|
|
|
15
11
|
/** How many @-mention suggestions to show at most. */
|
|
@@ -53,12 +49,11 @@ export function createFffAutocompleteProvider(
|
|
|
53
49
|
try {
|
|
54
50
|
const result = finder.fileSearch(query, {
|
|
55
51
|
pageSize: MAX_SUGGESTIONS,
|
|
56
|
-
|
|
57
52
|
});
|
|
58
53
|
|
|
59
54
|
if (result.ok) {
|
|
60
55
|
const items: AutocompleteItem[] = result.value.items.map((item) => ({
|
|
61
|
-
value: item.relativePath,
|
|
56
|
+
value: toMentionValue(item.relativePath),
|
|
62
57
|
label: item.fileName,
|
|
63
58
|
description: item.relativePath.slice(0, -(item.fileName.length + 1)),
|
|
64
59
|
}));
|
|
@@ -85,12 +80,12 @@ export function createFffAutocompleteProvider(
|
|
|
85
80
|
return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
|
|
86
81
|
},
|
|
87
82
|
|
|
88
|
-
shouldTriggerFileCompletion(
|
|
89
|
-
lines: string[],
|
|
90
|
-
cursorLine: number,
|
|
91
|
-
cursorCol: number,
|
|
92
|
-
): boolean {
|
|
83
|
+
shouldTriggerFileCompletion(lines: string[], cursorLine: number, cursorCol: number): boolean {
|
|
93
84
|
return current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;
|
|
94
85
|
},
|
|
95
86
|
};
|
|
96
87
|
}
|
|
88
|
+
|
|
89
|
+
function toMentionValue(path: string): string {
|
|
90
|
+
return /\s/.test(path) ? `@"${path.replaceAll('"', '\\"')}"` : `@${path}`;
|
|
91
|
+
}
|
package/src/fff.ts
CHANGED
|
@@ -47,6 +47,35 @@ export class CursorStore {
|
|
|
47
47
|
// FffService — wraps a single FileFinder instance
|
|
48
48
|
// ---------------------------------------------------------------------------
|
|
49
49
|
|
|
50
|
+
const SHARED_FFF_SERVICE_KEY = Symbol.for("pi-pretty.fff-service");
|
|
51
|
+
|
|
52
|
+
type SharedFffState = {
|
|
53
|
+
service: FffService;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
type GlobalWithFffService = typeof globalThis & {
|
|
57
|
+
[SHARED_FFF_SERVICE_KEY]?: SharedFffState;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export function getSharedFffService(fffModule?: typeof import("@ff-labs/fff-node"), agentDir?: string): FffService {
|
|
61
|
+
const sharedGlobal = globalThis as GlobalWithFffService;
|
|
62
|
+
const existing = sharedGlobal[SHARED_FFF_SERVICE_KEY];
|
|
63
|
+
if (existing) {
|
|
64
|
+
existing.service.configure(fffModule, agentDir);
|
|
65
|
+
return existing.service;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const service = new FffService(fffModule, agentDir);
|
|
69
|
+
sharedGlobal[SHARED_FFF_SERVICE_KEY] = { service };
|
|
70
|
+
return service;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function resetSharedFffServiceForTests(): void {
|
|
74
|
+
const sharedGlobal = globalThis as GlobalWithFffService;
|
|
75
|
+
sharedGlobal[SHARED_FFF_SERVICE_KEY]?.service.destroy();
|
|
76
|
+
delete sharedGlobal[SHARED_FFF_SERVICE_KEY];
|
|
77
|
+
}
|
|
78
|
+
|
|
50
79
|
export class FffService {
|
|
51
80
|
finder: FffFileFinder | null = null;
|
|
52
81
|
partialIndex = false;
|
|
@@ -57,13 +86,17 @@ export class FffService {
|
|
|
57
86
|
private finderPromise: Promise<void> | null = null;
|
|
58
87
|
|
|
59
88
|
constructor(fffModule?: typeof import("@ff-labs/fff-node"), agentDir?: string) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
89
|
+
this.configure(fffModule, agentDir);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
configure(fffModule?: typeof import("@ff-labs/fff-node"), agentDir?: string): void {
|
|
93
|
+
if (fffModule) this.fffModule = fffModule;
|
|
94
|
+
if (agentDir) {
|
|
95
|
+
this.dbDir = join(agentDir, "pi-pretty", "fff");
|
|
96
|
+
try {
|
|
97
|
+
mkdirSync(this.dbDir, { recursive: true });
|
|
98
|
+
} catch {
|
|
99
|
+
// FFF can still run without persistent frecency/history paths.
|
|
67
100
|
}
|
|
68
101
|
}
|
|
69
102
|
}
|
|
@@ -87,7 +120,9 @@ export class FffService {
|
|
|
87
120
|
this.dbDir = join(process.env.HOME, ".pi/agent", "pi-pretty", "fff");
|
|
88
121
|
try {
|
|
89
122
|
mkdirSync(this.dbDir, { recursive: true });
|
|
90
|
-
} catch {
|
|
123
|
+
} catch {
|
|
124
|
+
/* ignore */
|
|
125
|
+
}
|
|
91
126
|
}
|
|
92
127
|
return true;
|
|
93
128
|
} catch {
|
|
@@ -99,9 +134,13 @@ export class FffService {
|
|
|
99
134
|
if (this.finder && !this.finder.isDestroyed) return;
|
|
100
135
|
if (this.finderPromise) return this.finderPromise;
|
|
101
136
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
137
|
+
const promise = this._createFinder(cwd);
|
|
138
|
+
this.finderPromise = promise;
|
|
139
|
+
try {
|
|
140
|
+
await promise;
|
|
141
|
+
} finally {
|
|
142
|
+
if (this.finderPromise === promise) this.finderPromise = null;
|
|
143
|
+
}
|
|
105
144
|
}
|
|
106
145
|
|
|
107
146
|
private async _createFinder(cwd: string): Promise<void> {
|
|
@@ -112,13 +151,7 @@ export class FffService {
|
|
|
112
151
|
this.finder = null;
|
|
113
152
|
}
|
|
114
153
|
|
|
115
|
-
const result = this.
|
|
116
|
-
basePath: cwd,
|
|
117
|
-
frecencyDbPath: this.dbDir ? join(this.dbDir, "frecency.mdb") : "",
|
|
118
|
-
historyDbPath: this.dbDir ? join(this.dbDir, "history.mdb") : "",
|
|
119
|
-
aiMode: true,
|
|
120
|
-
});
|
|
121
|
-
|
|
154
|
+
const result = this.createFinder(cwd, this.dbDir);
|
|
122
155
|
if (!result.ok) {
|
|
123
156
|
throw new Error(`FFF init failed: ${result.error}`);
|
|
124
157
|
}
|
|
@@ -128,6 +161,33 @@ export class FffService {
|
|
|
128
161
|
this.partialIndex = scan.ok && !scan.value;
|
|
129
162
|
}
|
|
130
163
|
|
|
164
|
+
private createFinder(
|
|
165
|
+
cwd: string,
|
|
166
|
+
dbDir: string | null,
|
|
167
|
+
): ReturnType<typeof import("@ff-labs/fff-node").FileFinder.create> {
|
|
168
|
+
if (!this.fffModule) throw new Error("FFF module is not loaded");
|
|
169
|
+
const result = this.fffModule.FileFinder.create({
|
|
170
|
+
basePath: cwd,
|
|
171
|
+
frecencyDbPath: dbDir ? join(dbDir, "frecency.mdb") : "",
|
|
172
|
+
historyDbPath: dbDir ? join(dbDir, "history.mdb") : "",
|
|
173
|
+
aiMode: true,
|
|
174
|
+
});
|
|
175
|
+
if (result.ok || !isAlreadyOpenError(result.error) || !dbDir) return result;
|
|
176
|
+
|
|
177
|
+
const isolatedDir = join(dbDir, `runtime-${process.pid}-${Date.now()}`);
|
|
178
|
+
try {
|
|
179
|
+
mkdirSync(isolatedDir, { recursive: true });
|
|
180
|
+
} catch {
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
return this.fffModule.FileFinder.create({
|
|
184
|
+
basePath: cwd,
|
|
185
|
+
frecencyDbPath: join(isolatedDir, "frecency.mdb"),
|
|
186
|
+
historyDbPath: join(isolatedDir, "history.mdb"),
|
|
187
|
+
aiMode: true,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
131
191
|
destroy(): void {
|
|
132
192
|
if (this.finder && !this.finder.isDestroyed) {
|
|
133
193
|
this.finder.destroy();
|
|
@@ -145,3 +205,7 @@ export class FffService {
|
|
|
145
205
|
return this.cursorStore;
|
|
146
206
|
}
|
|
147
207
|
}
|
|
208
|
+
|
|
209
|
+
function isAlreadyOpenError(error: string): boolean {
|
|
210
|
+
return /environment already open/i.test(error);
|
|
211
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -15,7 +15,7 @@ export { __imageInternals } from "./image.js";
|
|
|
15
15
|
import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
16
16
|
|
|
17
17
|
import type { PiPrettyDeps } from "./types.js";
|
|
18
|
-
import { FffService } from "./fff.js";
|
|
18
|
+
import { getSharedFffService, type FffService } from "./fff.js";
|
|
19
19
|
import { registerReadTool } from "./tools/read.js";
|
|
20
20
|
import { registerBashTool } from "./tools/bash.js";
|
|
21
21
|
import { registerLsTool } from "./tools/ls.js";
|
|
@@ -60,7 +60,7 @@ export default async function piPrettyExtension(pi: ExtensionAPI, deps?: PiPrett
|
|
|
60
60
|
|
|
61
61
|
const maybeGetAgentDir = deps?.sdk?.getAgentDir;
|
|
62
62
|
const agentDir = typeof maybeGetAgentDir === "function" ? maybeGetAgentDir() : getDefaultAgentDir();
|
|
63
|
-
let fffService: FffService | null =
|
|
63
|
+
let fffService: FffService | null = getSharedFffService(deps?.fffModule, agentDir);
|
|
64
64
|
|
|
65
65
|
// Ripgrep fallback for multi_grep
|
|
66
66
|
const multiGrepFallback = deps?.multiGrepRipgrepFallback ?? runMultiGrepRipgrepFallback;
|
|
@@ -167,11 +167,11 @@ export default async function piPrettyExtension(pi: ExtensionAPI, deps?: PiPrett
|
|
|
167
167
|
});
|
|
168
168
|
|
|
169
169
|
pi.on("session_shutdown", async () => {
|
|
170
|
-
// Intentionally
|
|
170
|
+
// Intentionally keep the native FFF finder on session shutdown.
|
|
171
171
|
// Pi can emit shutdown/start during resume or session switching while the
|
|
172
|
-
// process keeps running. Native teardown
|
|
173
|
-
//
|
|
174
|
-
|
|
172
|
+
// process keeps running. Native teardown, or dropping the JS handle while the
|
|
173
|
+
// native LMDB frecency env stays open, can make the next init fail with
|
|
174
|
+
// "environment already open in this program". Let process exit reclaim it.
|
|
175
175
|
});
|
|
176
176
|
|
|
177
177
|
// ------------------------------------------------------------------
|