pi-ghost-autocomplete 0.3.2 → 0.4.0

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 (168) hide show
  1. package/LICENSE +561 -0
  2. package/README.md +464 -331
  3. package/dist/bench-cli.js +1 -123
  4. package/dist/bench.d.ts +7 -3
  5. package/dist/bench.js +1 -522
  6. package/dist/config.d.ts +4 -1
  7. package/dist/context-aggregator.d.ts +4 -1
  8. package/dist/cycle-manager.d.ts +2 -21
  9. package/dist/entropy-stop.d.ts +4 -1
  10. package/dist/eval-dataset.d.ts +2 -13
  11. package/dist/fuzzy-matcher.d.ts +4 -1
  12. package/dist/ghost-editor.d.ts +11 -2
  13. package/dist/index.d.ts +4 -1
  14. package/dist/index.js +1 -289
  15. package/dist/intent.d.ts +179 -0
  16. package/dist/metrics.d.ts +4 -1
  17. package/dist/path-index.d.ts +4 -1
  18. package/dist/path-matcher.d.ts +4 -1
  19. package/dist/profile-store.d.ts +4 -1
  20. package/dist/profile.d.ts +2 -20
  21. package/dist/providers/cloud-provider.d.ts +4 -1
  22. package/dist/providers/local-provider.d.ts +4 -1
  23. package/dist/providers/openai-compat-provider.d.ts +24 -1
  24. package/dist/providers/race.d.ts +4 -1
  25. package/dist/providers/types.d.ts +13 -1
  26. package/dist/recent-paths.d.ts +4 -1
  27. package/dist/replay-cli.js +1 -166
  28. package/dist/replay.d.ts +2 -7
  29. package/package.json +90 -80
  30. package/dist/bench-cli.d.ts +0 -3
  31. package/dist/bench-cli.d.ts.map +0 -1
  32. package/dist/bench-cli.js.map +0 -1
  33. package/dist/bench.d.ts.map +0 -1
  34. package/dist/bench.js.map +0 -1
  35. package/dist/cache.d.ts +0 -124
  36. package/dist/cache.d.ts.map +0 -1
  37. package/dist/cache.js +0 -173
  38. package/dist/cache.js.map +0 -1
  39. package/dist/candidate-rerank.d.ts +0 -57
  40. package/dist/candidate-rerank.d.ts.map +0 -1
  41. package/dist/candidate-rerank.js +0 -78
  42. package/dist/candidate-rerank.js.map +0 -1
  43. package/dist/config.d.ts.map +0 -1
  44. package/dist/config.js +0 -317
  45. package/dist/config.js.map +0 -1
  46. package/dist/context-aggregator.d.ts.map +0 -1
  47. package/dist/context-aggregator.js +0 -87
  48. package/dist/context-aggregator.js.map +0 -1
  49. package/dist/context-selector.d.ts +0 -128
  50. package/dist/context-selector.d.ts.map +0 -1
  51. package/dist/context-selector.js +0 -300
  52. package/dist/context-selector.js.map +0 -1
  53. package/dist/cycle-manager.d.ts.map +0 -1
  54. package/dist/cycle-manager.js +0 -168
  55. package/dist/cycle-manager.js.map +0 -1
  56. package/dist/edit-history-ring.d.ts +0 -148
  57. package/dist/edit-history-ring.d.ts.map +0 -1
  58. package/dist/edit-history-ring.js +0 -262
  59. package/dist/edit-history-ring.js.map +0 -1
  60. package/dist/entropy-stop.d.ts.map +0 -1
  61. package/dist/entropy-stop.js +0 -141
  62. package/dist/entropy-stop.js.map +0 -1
  63. package/dist/eval-dataset.d.ts.map +0 -1
  64. package/dist/eval-dataset.js +0 -127
  65. package/dist/eval-dataset.js.map +0 -1
  66. package/dist/fast-path-engine.d.ts +0 -286
  67. package/dist/fast-path-engine.d.ts.map +0 -1
  68. package/dist/fast-path-engine.js +0 -341
  69. package/dist/fast-path-engine.js.map +0 -1
  70. package/dist/fuzzy-matcher.d.ts.map +0 -1
  71. package/dist/fuzzy-matcher.js +0 -162
  72. package/dist/fuzzy-matcher.js.map +0 -1
  73. package/dist/ghost-editor.d.ts.map +0 -1
  74. package/dist/ghost-editor.js +0 -1491
  75. package/dist/ghost-editor.js.map +0 -1
  76. package/dist/index.d.ts.map +0 -1
  77. package/dist/index.js.map +0 -1
  78. package/dist/keystroke-timer.d.ts +0 -59
  79. package/dist/keystroke-timer.d.ts.map +0 -1
  80. package/dist/keystroke-timer.js +0 -94
  81. package/dist/keystroke-timer.js.map +0 -1
  82. package/dist/metrics-builder.d.ts +0 -71
  83. package/dist/metrics-builder.d.ts.map +0 -1
  84. package/dist/metrics-builder.js +0 -71
  85. package/dist/metrics-builder.js.map +0 -1
  86. package/dist/metrics.d.ts.map +0 -1
  87. package/dist/metrics.js +0 -212
  88. package/dist/metrics.js.map +0 -1
  89. package/dist/path-index.d.ts.map +0 -1
  90. package/dist/path-index.js +0 -148
  91. package/dist/path-index.js.map +0 -1
  92. package/dist/path-matcher.d.ts.map +0 -1
  93. package/dist/path-matcher.js +0 -88
  94. package/dist/path-matcher.js.map +0 -1
  95. package/dist/profile-store.d.ts.map +0 -1
  96. package/dist/profile-store.js +0 -199
  97. package/dist/profile-store.js.map +0 -1
  98. package/dist/profile.d.ts.map +0 -1
  99. package/dist/profile.js +0 -434
  100. package/dist/profile.js.map +0 -1
  101. package/dist/providers/cloud-provider.d.ts.map +0 -1
  102. package/dist/providers/cloud-provider.js +0 -109
  103. package/dist/providers/cloud-provider.js.map +0 -1
  104. package/dist/providers/local-provider.d.ts.map +0 -1
  105. package/dist/providers/local-provider.js +0 -48
  106. package/dist/providers/local-provider.js.map +0 -1
  107. package/dist/providers/openai-compat-provider.d.ts.map +0 -1
  108. package/dist/providers/openai-compat-provider.js +0 -215
  109. package/dist/providers/openai-compat-provider.js.map +0 -1
  110. package/dist/providers/openai-completions-runner.d.ts +0 -52
  111. package/dist/providers/openai-completions-runner.d.ts.map +0 -1
  112. package/dist/providers/openai-completions-runner.js +0 -141
  113. package/dist/providers/openai-completions-runner.js.map +0 -1
  114. package/dist/providers/race.d.ts.map +0 -1
  115. package/dist/providers/race.js +0 -441
  116. package/dist/providers/race.js.map +0 -1
  117. package/dist/providers/truncate.d.ts +0 -7
  118. package/dist/providers/truncate.d.ts.map +0 -1
  119. package/dist/providers/truncate.js +0 -57
  120. package/dist/providers/truncate.js.map +0 -1
  121. package/dist/providers/types.d.ts.map +0 -1
  122. package/dist/providers/types.js +0 -60
  123. package/dist/providers/types.js.map +0 -1
  124. package/dist/provisional-manager.d.ts +0 -93
  125. package/dist/provisional-manager.d.ts.map +0 -1
  126. package/dist/provisional-manager.js +0 -98
  127. package/dist/provisional-manager.js.map +0 -1
  128. package/dist/provisional.d.ts +0 -150
  129. package/dist/provisional.d.ts.map +0 -1
  130. package/dist/provisional.js +0 -238
  131. package/dist/provisional.js.map +0 -1
  132. package/dist/recent-paths.d.ts.map +0 -1
  133. package/dist/recent-paths.js +0 -114
  134. package/dist/recent-paths.js.map +0 -1
  135. package/dist/regret-tracker.d.ts +0 -84
  136. package/dist/regret-tracker.d.ts.map +0 -1
  137. package/dist/regret-tracker.js +0 -145
  138. package/dist/regret-tracker.js.map +0 -1
  139. package/dist/replay-cli.d.ts +0 -13
  140. package/dist/replay-cli.d.ts.map +0 -1
  141. package/dist/replay-cli.js.map +0 -1
  142. package/dist/replay.d.ts.map +0 -1
  143. package/dist/replay.js +0 -225
  144. package/dist/replay.js.map +0 -1
  145. package/dist/reranker.d.ts +0 -181
  146. package/dist/reranker.d.ts.map +0 -1
  147. package/dist/reranker.js +0 -324
  148. package/dist/reranker.js.map +0 -1
  149. package/dist/session-trie.d.ts +0 -103
  150. package/dist/session-trie.d.ts.map +0 -1
  151. package/dist/session-trie.js +0 -280
  152. package/dist/session-trie.js.map +0 -1
  153. package/dist/speculative.d.ts +0 -74
  154. package/dist/speculative.d.ts.map +0 -1
  155. package/dist/speculative.js +0 -107
  156. package/dist/speculative.js.map +0 -1
  157. package/dist/tool-summarize.d.ts +0 -40
  158. package/dist/tool-summarize.d.ts.map +0 -1
  159. package/dist/tool-summarize.js +0 -245
  160. package/dist/tool-summarize.js.map +0 -1
  161. package/dist/trie-sanitize.d.ts +0 -22
  162. package/dist/trie-sanitize.d.ts.map +0 -1
  163. package/dist/trie-sanitize.js +0 -142
  164. package/dist/trie-sanitize.js.map +0 -1
  165. package/dist/versions.d.ts +0 -23
  166. package/dist/versions.d.ts.map +0 -1
  167. package/dist/versions.js +0 -31
  168. package/dist/versions.js.map +0 -1
package/dist/metrics.js DELETED
@@ -1,212 +0,0 @@
1
- import { appendFile, mkdir, rename, stat } from "node:fs/promises";
2
- import { dirname, join } from "node:path";
3
- const MAX_BYTES = 10 * 1024 * 1024;
4
- const METRICS_REL = ".pi/ghost-autocomplete/metrics.jsonl";
5
- const DEBUG_REL = ".pi/ghost-autocomplete/debug.jsonl";
6
- /**
7
- * Source of truth for all completion modes. Both the type union (compile-time)
8
- * and the parser whitelist (runtime, in `bench.ts`) derive from this array so
9
- * adding a mode means updating one place.
10
- */
11
- export const COMPLETION_MODES = [
12
- "deterministic",
13
- "llm",
14
- "cache",
15
- "trie",
16
- "speculative-warm",
17
- "provisional",
18
- "profile-slash",
19
- ];
20
- /**
21
- * Fields callers may safely pass through to debug records. Anything outside
22
- * this set is JSON-quoted but with its value replaced by a `[redacted-N]`
23
- * placeholder showing only its length and type. SEC-27.
24
- *
25
- * To allow a new field type-safely, add it here and add a test in
26
- * `metrics.test.ts`.
27
- */
28
- const DEBUG_PASS_THROUGH_KEYS = new Set([
29
- "ts",
30
- "requestId",
31
- "kind",
32
- "provider",
33
- "providerName",
34
- "mode",
35
- "latencyMs",
36
- "durationMs",
37
- "length",
38
- "count",
39
- "status",
40
- "errorName",
41
- "reason",
42
- "phase",
43
- "branch",
44
- "matchedPath",
45
- ]);
46
- export function readMetricsConfigFromEnv() {
47
- return {
48
- metricsEnabled: process.env.PI_GHOST_METRICS === "1",
49
- debugEnabled: process.env.PI_GHOST_DEBUG_LOG === "1",
50
- };
51
- }
52
- export class MetricsLogger {
53
- cwd;
54
- cfg;
55
- metricsPath;
56
- debugPath;
57
- writeQueue = Promise.resolve();
58
- nextId = 1;
59
- constructor(cwd, cfg) {
60
- this.cwd = cwd;
61
- this.cfg = cfg;
62
- this.metricsPath = join(cwd, METRICS_REL);
63
- this.debugPath = join(cwd, DEBUG_REL);
64
- }
65
- get metricsEnabled() {
66
- return this.cfg.metricsEnabled;
67
- }
68
- get debugEnabled() {
69
- return this.cfg.debugEnabled;
70
- }
71
- newRequestId() {
72
- return `r${Date.now().toString(36)}-${this.nextId++}`;
73
- }
74
- logMetric(record) {
75
- if (!this.cfg.metricsEnabled)
76
- return;
77
- this.enqueue(() => writeLine(this.metricsPath, redactMetric(record)));
78
- }
79
- logDebug(record) {
80
- if (!this.cfg.debugEnabled)
81
- return;
82
- this.enqueue(() => writeLine(this.debugPath, redactDebug(record)));
83
- }
84
- async flush() {
85
- await this.writeQueue;
86
- }
87
- enqueue(fn) {
88
- this.writeQueue = this.writeQueue.then(fn, fn).catch(() => { });
89
- }
90
- }
91
- function redactMetric(rec) {
92
- const out = { ts: rec.ts, requestId: rec.requestId, mode: rec.mode, result: rec.result };
93
- if (rec.providers && rec.providers.length > 0)
94
- out.providers = rec.providers;
95
- if (rec.winner !== undefined)
96
- out.winner = rec.winner;
97
- if (rec.rejectionReason !== undefined)
98
- out.rejectionReason = rec.rejectionReason;
99
- if (rec.completionLength !== undefined)
100
- out.completionLength = rec.completionLength;
101
- if (rec.shown !== undefined)
102
- out.shown = rec.shown;
103
- if (rec.acceptance !== undefined)
104
- out.acceptance = rec.acceptance;
105
- if (rec.mode === "deterministic" && rec.matchedPath !== undefined)
106
- out.matchedPath = rec.matchedPath;
107
- // M5a — numeric/boolean fields only; no raw completion text.
108
- if (rec.acceptedChars !== undefined)
109
- out.acceptedChars = rec.acceptedChars;
110
- if (rec.prefixMatchLen !== undefined)
111
- out.prefixMatchLen = rec.prefixMatchLen;
112
- if (rec.editDistance !== undefined)
113
- out.editDistance = rec.editDistance;
114
- if (rec.partialAccepts !== undefined)
115
- out.partialAccepts = rec.partialAccepts;
116
- if (rec.candidateRank !== undefined)
117
- out.candidateRank = rec.candidateRank;
118
- if (rec.candidateCount !== undefined)
119
- out.candidateCount = rec.candidateCount;
120
- if (rec.cycledCount !== undefined)
121
- out.cycledCount = rec.cycledCount;
122
- if (rec.prefixMatchLenByRank !== undefined)
123
- out.prefixMatchLenByRank = rec.prefixMatchLenByRank;
124
- if (rec.savedAt !== undefined)
125
- out.savedAt = rec.savedAt;
126
- if (rec.displayDurationMs !== undefined)
127
- out.displayDurationMs = rec.displayDurationMs;
128
- if (rec.qualityAttribution !== undefined)
129
- out.qualityAttribution = rec.qualityAttribution;
130
- if (rec.ttftMs !== undefined)
131
- out.ttftMs = rec.ttftMs;
132
- if (rec.provisionalSwapMs !== undefined)
133
- out.provisionalSwapMs = rec.provisionalSwapMs;
134
- if (rec.provisionalWasCorrect !== undefined)
135
- out.provisionalWasCorrect = rec.provisionalWasCorrect;
136
- if (rec.provisionalSwapFlicker !== undefined)
137
- out.provisionalSwapFlicker = rec.provisionalSwapFlicker;
138
- if (rec.shortHoverDismiss !== undefined)
139
- out.shortHoverDismiss = rec.shortHoverDismiss;
140
- if (rec.typedPastDivergent !== undefined)
141
- out.typedPastDivergent = rec.typedPastDivergent;
142
- if (rec.estimatedTimeSavedMs !== undefined)
143
- out.estimatedTimeSavedMs = rec.estimatedTimeSavedMs;
144
- if (rec.acceptRegret !== undefined)
145
- out.acceptRegret = rec.acceptRegret;
146
- if (rec.regretDeletedChars !== undefined)
147
- out.regretDeletedChars = rec.regretDeletedChars;
148
- if (rec.versionFingerprint !== undefined)
149
- out.versionFingerprint = rec.versionFingerprint;
150
- return out;
151
- }
152
- /**
153
- * Strip any debug-record field not on the pass-through whitelist. Replaces
154
- * the value with a `[redacted: type=T len=N]` placeholder so debugging still
155
- * sees that *something* was there, without leaking content. SEC-27.
156
- */
157
- export function redactDebug(rec) {
158
- const out = { ts: rec.ts, requestId: rec.requestId, kind: rec.kind };
159
- for (const [k, v] of Object.entries(rec)) {
160
- if (k === "ts" || k === "requestId" || k === "kind")
161
- continue;
162
- if (DEBUG_PASS_THROUGH_KEYS.has(k)) {
163
- // Permit primitives and shallow arrays of primitives only.
164
- if (v === null ||
165
- typeof v === "boolean" ||
166
- typeof v === "number" ||
167
- typeof v === "string") {
168
- out[k] = v;
169
- }
170
- else if (Array.isArray(v) && v.every((e) => typeof e === "number" || typeof e === "string")) {
171
- out[k] = v;
172
- }
173
- else {
174
- out[k] = `[redacted: type=${typeof v}]`;
175
- }
176
- continue;
177
- }
178
- const type = typeof v;
179
- const len = typeof v === "string" ? v.length : Array.isArray(v) ? v.length : undefined;
180
- out[k] = len !== undefined ? `[redacted: type=${type} len=${len}]` : `[redacted: type=${type}]`;
181
- }
182
- return out;
183
- }
184
- async function writeLine(path, payload) {
185
- try {
186
- await mkdir(dirname(path), { recursive: true });
187
- await rotateIfNeeded(path);
188
- await appendFile(path, `${JSON.stringify(payload)}\n`, "utf8");
189
- }
190
- catch {
191
- // Logging must never break ghost completion. Swallow.
192
- }
193
- }
194
- async function rotateIfNeeded(path) {
195
- let size;
196
- try {
197
- const s = await stat(path);
198
- size = s.size;
199
- }
200
- catch {
201
- return;
202
- }
203
- if (size < MAX_BYTES)
204
- return;
205
- try {
206
- await rename(path, `${path}.1`);
207
- }
208
- catch {
209
- // Best-effort rotation; if rename fails, keep appending to the file.
210
- }
211
- }
212
- //# sourceMappingURL=metrics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-index.d.ts","sourceRoot":"","sources":["../src/path-index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACtD;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,gBAAqB,GACzB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAqB3B"}
@@ -1,148 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- const DEFAULT_CAP = 20_000;
3
- /**
4
- * Build a deterministic path index rooted at the Git toplevel of `cwd`.
5
- *
6
- * Returns null when Git is unavailable, `cwd` is outside any repo, or the
7
- * underlying commands fail. Callers should treat null as "no deterministic
8
- * path completion this session".
9
- */
10
- export async function buildPathIndex(cwd, opts = {}) {
11
- const cap = opts.cap ?? DEFAULT_CAP;
12
- const root = await gitToplevel(cwd, opts.signal);
13
- if (!root)
14
- return null;
15
- const all = await gitLsFiles(root, opts.signal);
16
- if (!all)
17
- return null;
18
- let files;
19
- let capExceeded = false;
20
- if (all.length > cap) {
21
- capExceeded = true;
22
- const rel = relPosix(root, cwd);
23
- const subtreePrefix = rel === "" ? "" : `${rel}/`;
24
- files = all.filter((f) => subtreePrefix === "" || f.startsWith(subtreePrefix));
25
- if (files.length > cap)
26
- files = files.slice(0, cap);
27
- }
28
- else {
29
- files = all;
30
- }
31
- files.sort();
32
- return new PathIndexImpl(root, cwd, files, capExceeded);
33
- }
34
- class PathIndexImpl {
35
- root;
36
- cwd;
37
- files;
38
- capExceeded;
39
- constructor(root, cwd, files, capExceeded) {
40
- this.root = root;
41
- this.cwd = cwd;
42
- this.files = files;
43
- this.capExceeded = capExceeded;
44
- }
45
- prefixMatches(token, limit) {
46
- if (!token || limit <= 0)
47
- return [];
48
- const start = lowerBound(this.files, token);
49
- const out = [];
50
- for (let i = start; i < this.files.length && out.length < limit; i++) {
51
- const f = this.files[i];
52
- if (!f || !f.startsWith(token))
53
- break;
54
- out.push(f);
55
- }
56
- return out;
57
- }
58
- }
59
- function lowerBound(arr, target) {
60
- let lo = 0;
61
- let hi = arr.length;
62
- while (lo < hi) {
63
- const mid = (lo + hi) >>> 1;
64
- const v = arr[mid];
65
- if (v !== undefined && v < target)
66
- lo = mid + 1;
67
- else
68
- hi = mid;
69
- }
70
- return lo;
71
- }
72
- function relPosix(root, cwd) {
73
- const r = normSlashes(root);
74
- const c = normSlashes(cwd);
75
- if (c === r)
76
- return "";
77
- const prefix = r.endsWith("/") ? r : `${r}/`;
78
- if (c.startsWith(prefix))
79
- return c.slice(prefix.length);
80
- return "";
81
- }
82
- function normSlashes(p) {
83
- return p.replace(/\\/g, "/").replace(/\/+$/, "");
84
- }
85
- async function gitToplevel(cwd, signal) {
86
- const res = await runGit(["rev-parse", "--show-toplevel"], cwd, signal);
87
- if (!res)
88
- return null;
89
- const line = res.split(/\r?\n/)[0]?.trim();
90
- if (!line)
91
- return null;
92
- return normSlashes(line);
93
- }
94
- async function gitLsFiles(root, signal) {
95
- const res = await runGit(["ls-files", "-z"], root, signal);
96
- if (res === null)
97
- return null;
98
- if (res === "")
99
- return [];
100
- return res.split("\0").filter((s) => s.length > 0);
101
- }
102
- function runGit(args, cwd, signal) {
103
- return new Promise((resolve) => {
104
- let proc;
105
- try {
106
- proc = spawn("git", args, { cwd, windowsHide: true });
107
- }
108
- catch {
109
- resolve(null);
110
- return;
111
- }
112
- let out = "";
113
- let err = false;
114
- const onAbort = () => {
115
- try {
116
- proc.kill();
117
- }
118
- catch {
119
- // proc may already be dead
120
- }
121
- };
122
- if (signal) {
123
- if (signal.aborted)
124
- onAbort();
125
- else
126
- signal.addEventListener("abort", onAbort, { once: true });
127
- }
128
- proc.stdout?.on("data", (chunk) => {
129
- out += chunk.toString("utf8");
130
- });
131
- proc.on("error", () => {
132
- err = true;
133
- resolve(null);
134
- });
135
- proc.on("close", (code) => {
136
- if (signal)
137
- signal.removeEventListener("abort", onAbort);
138
- if (err)
139
- return;
140
- if (code !== 0) {
141
- resolve(null);
142
- return;
143
- }
144
- resolve(out);
145
- });
146
- });
147
- }
148
- //# sourceMappingURL=path-index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-index.js","sourceRoot":"","sources":["../src/path-index.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-matcher.d.ts","sourceRoot":"","sources":["../src/path-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACjC;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;CACjD;AAKD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAevE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,qBAAqB,GAAG,MAAW,GACvC,eAAe,GAAG,IAAI,CAmCxB"}
@@ -1,88 +0,0 @@
1
- import { recentBoost } from "./recent-paths.js";
2
- const PATH_CHAR = /[A-Za-z0-9_./@\-]/;
3
- const QUOTE_CHARS = new Set(['"', "'", "`"]);
4
- /**
5
- * Extract a path-like token from the end of `before` (text before the cursor).
6
- * Returns null when no path-prefix mode is applicable: a token is only
7
- * eligible when it contains a `/` (path-prefix mode is structural, not fuzzy).
8
- *
9
- * `insideQuote` is true when the character immediately preceding the token is
10
- * a quote or backtick; callers can still trust the token in that case.
11
- */
12
- export function extractPathPrefixToken(before) {
13
- if (!before)
14
- return null;
15
- let end = before.length;
16
- let start = end;
17
- while (start > 0) {
18
- const ch = before[start - 1];
19
- if (!ch || !PATH_CHAR.test(ch))
20
- break;
21
- start--;
22
- }
23
- if (start === end)
24
- return null;
25
- const token = before.slice(start, end);
26
- if (!token.includes("/"))
27
- return null;
28
- const prev = start > 0 ? before[start - 1] : undefined;
29
- const insideQuote = prev !== undefined && QUOTE_CHARS.has(prev);
30
- return { token, insideQuote };
31
- }
32
- /**
33
- * Pick the best path-prefix match for `token`. Strategy: enumerate matches
34
- * (capped), prefer files inside `cwdRel` subtree, then shorter paths.
35
- *
36
- * Returns null when the token has no matches or matches itself exactly
37
- * (nothing to insert).
38
- */
39
- export function findPathPrefix(index, token, opts = {}) {
40
- // Back-compat: legacy callers pass a numeric `limit`.
41
- const o = typeof opts === "number" ? { limit: opts } : opts;
42
- const limit = o.limit ?? 64;
43
- const recent = o.recentPaths ?? null;
44
- const profileBoost = o.profileBoost ?? null;
45
- // Normalize a leading `./` — extractPathPrefixToken preserves it from the
46
- // user's text (e.g. "./src/con") but git ls-files entries never start with
47
- // `./`, so the prefix lookup would otherwise miss every cwd-relative entry.
48
- const lookupToken = token.startsWith("./") ? token.slice(2) : token;
49
- if (!lookupToken)
50
- return null;
51
- const matches = index.prefixMatches(lookupToken, limit);
52
- if (matches.length === 0)
53
- return null;
54
- const cwdRel = relSubtree(index.root, index.cwd);
55
- let best = null;
56
- let bestScore = -Infinity;
57
- let bestBoost = 0;
58
- for (const m of matches) {
59
- const inSub = cwdRel === "" || m.startsWith(cwdRel);
60
- const rb = recentBoost(m, recent);
61
- const pb = profileBoost ? profileBoost(m) : 0;
62
- // Lex-rank: subtree dominates, then recent-mention, then profile
63
- // frequency (tie-breaker), then short.
64
- const score = (inSub ? 1_000_000_000 : 0) + rb * 1_000_000 + pb * 1_000 - m.length;
65
- if (score > bestScore) {
66
- bestScore = score;
67
- best = m;
68
- bestBoost = rb;
69
- }
70
- }
71
- if (!best)
72
- return null;
73
- const suffix = best.slice(lookupToken.length);
74
- if (!suffix)
75
- return null;
76
- return { match: best, suffix, score: 100 + bestBoost };
77
- }
78
- function relSubtree(root, cwd) {
79
- const r = root.replace(/\\/g, "/").replace(/\/+$/, "");
80
- const c = cwd.replace(/\\/g, "/").replace(/\/+$/, "");
81
- if (c === r)
82
- return "";
83
- const prefix = `${r}/`;
84
- if (c.startsWith(prefix))
85
- return `${c.slice(prefix.length)}/`;
86
- return "";
87
- }
88
- //# sourceMappingURL=path-matcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-matcher.js","sourceRoot":"","sources":["../src/path-matcher.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-store.d.ts","sourceRoot":"","sources":["../src/profile-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAKN,kBAAkB,EASlB,KAAK,YAAY,EAEjB,MAAM,cAAc,CAAC;AAQtB,qBAAa,YAAY;IAQvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAQP;;;;OAIG;WACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,YAAY,CAAC;IAe7F,QAAQ,IAAI,YAAY;IAIxB,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,MAAmB,GAAG,MAAM;IAQ5D;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,EAAE,GAAE,MAAmB,GAAG,OAAO;IAQ/F,kEAAkE;IAClE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKtE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKjC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKtC;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAM3F,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IA0BvB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;CAmCpB;AAED,qFAAqF;AACrF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}