pi-ghost-autocomplete 0.3.2 → 0.5.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 (170) hide show
  1. package/LICENSE +561 -0
  2. package/README.md +186 -4
  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 +46 -3
  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 +7 -2
  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-chat-provider.d.ts +31 -0
  24. package/dist/providers/openai-compat-provider.d.ts +24 -1
  25. package/dist/providers/race.d.ts +4 -1
  26. package/dist/providers/router.d.ts +59 -0
  27. package/dist/providers/types.d.ts +13 -1
  28. package/dist/recent-paths.d.ts +4 -1
  29. package/dist/replay-cli.js +1 -166
  30. package/dist/replay.d.ts +2 -7
  31. package/package.json +10 -6
  32. package/dist/bench-cli.d.ts +0 -3
  33. package/dist/bench-cli.d.ts.map +0 -1
  34. package/dist/bench-cli.js.map +0 -1
  35. package/dist/bench.d.ts.map +0 -1
  36. package/dist/bench.js.map +0 -1
  37. package/dist/cache.d.ts +0 -124
  38. package/dist/cache.d.ts.map +0 -1
  39. package/dist/cache.js +0 -173
  40. package/dist/cache.js.map +0 -1
  41. package/dist/candidate-rerank.d.ts +0 -57
  42. package/dist/candidate-rerank.d.ts.map +0 -1
  43. package/dist/candidate-rerank.js +0 -78
  44. package/dist/candidate-rerank.js.map +0 -1
  45. package/dist/config.d.ts.map +0 -1
  46. package/dist/config.js +0 -317
  47. package/dist/config.js.map +0 -1
  48. package/dist/context-aggregator.d.ts.map +0 -1
  49. package/dist/context-aggregator.js +0 -87
  50. package/dist/context-aggregator.js.map +0 -1
  51. package/dist/context-selector.d.ts +0 -128
  52. package/dist/context-selector.d.ts.map +0 -1
  53. package/dist/context-selector.js +0 -300
  54. package/dist/context-selector.js.map +0 -1
  55. package/dist/cycle-manager.d.ts.map +0 -1
  56. package/dist/cycle-manager.js +0 -168
  57. package/dist/cycle-manager.js.map +0 -1
  58. package/dist/edit-history-ring.d.ts +0 -148
  59. package/dist/edit-history-ring.d.ts.map +0 -1
  60. package/dist/edit-history-ring.js +0 -262
  61. package/dist/edit-history-ring.js.map +0 -1
  62. package/dist/entropy-stop.d.ts.map +0 -1
  63. package/dist/entropy-stop.js +0 -141
  64. package/dist/entropy-stop.js.map +0 -1
  65. package/dist/eval-dataset.d.ts.map +0 -1
  66. package/dist/eval-dataset.js +0 -127
  67. package/dist/eval-dataset.js.map +0 -1
  68. package/dist/fast-path-engine.d.ts +0 -286
  69. package/dist/fast-path-engine.d.ts.map +0 -1
  70. package/dist/fast-path-engine.js +0 -341
  71. package/dist/fast-path-engine.js.map +0 -1
  72. package/dist/fuzzy-matcher.d.ts.map +0 -1
  73. package/dist/fuzzy-matcher.js +0 -162
  74. package/dist/fuzzy-matcher.js.map +0 -1
  75. package/dist/ghost-editor.d.ts.map +0 -1
  76. package/dist/ghost-editor.js +0 -1491
  77. package/dist/ghost-editor.js.map +0 -1
  78. package/dist/index.d.ts.map +0 -1
  79. package/dist/index.js.map +0 -1
  80. package/dist/keystroke-timer.d.ts +0 -59
  81. package/dist/keystroke-timer.d.ts.map +0 -1
  82. package/dist/keystroke-timer.js +0 -94
  83. package/dist/keystroke-timer.js.map +0 -1
  84. package/dist/metrics-builder.d.ts +0 -71
  85. package/dist/metrics-builder.d.ts.map +0 -1
  86. package/dist/metrics-builder.js +0 -71
  87. package/dist/metrics-builder.js.map +0 -1
  88. package/dist/metrics.d.ts.map +0 -1
  89. package/dist/metrics.js +0 -212
  90. package/dist/metrics.js.map +0 -1
  91. package/dist/path-index.d.ts.map +0 -1
  92. package/dist/path-index.js +0 -148
  93. package/dist/path-index.js.map +0 -1
  94. package/dist/path-matcher.d.ts.map +0 -1
  95. package/dist/path-matcher.js +0 -88
  96. package/dist/path-matcher.js.map +0 -1
  97. package/dist/profile-store.d.ts.map +0 -1
  98. package/dist/profile-store.js +0 -199
  99. package/dist/profile-store.js.map +0 -1
  100. package/dist/profile.d.ts.map +0 -1
  101. package/dist/profile.js +0 -434
  102. package/dist/profile.js.map +0 -1
  103. package/dist/providers/cloud-provider.d.ts.map +0 -1
  104. package/dist/providers/cloud-provider.js +0 -109
  105. package/dist/providers/cloud-provider.js.map +0 -1
  106. package/dist/providers/local-provider.d.ts.map +0 -1
  107. package/dist/providers/local-provider.js +0 -48
  108. package/dist/providers/local-provider.js.map +0 -1
  109. package/dist/providers/openai-compat-provider.d.ts.map +0 -1
  110. package/dist/providers/openai-compat-provider.js +0 -215
  111. package/dist/providers/openai-compat-provider.js.map +0 -1
  112. package/dist/providers/openai-completions-runner.d.ts +0 -52
  113. package/dist/providers/openai-completions-runner.d.ts.map +0 -1
  114. package/dist/providers/openai-completions-runner.js +0 -141
  115. package/dist/providers/openai-completions-runner.js.map +0 -1
  116. package/dist/providers/race.d.ts.map +0 -1
  117. package/dist/providers/race.js +0 -441
  118. package/dist/providers/race.js.map +0 -1
  119. package/dist/providers/truncate.d.ts +0 -7
  120. package/dist/providers/truncate.d.ts.map +0 -1
  121. package/dist/providers/truncate.js +0 -57
  122. package/dist/providers/truncate.js.map +0 -1
  123. package/dist/providers/types.d.ts.map +0 -1
  124. package/dist/providers/types.js +0 -60
  125. package/dist/providers/types.js.map +0 -1
  126. package/dist/provisional-manager.d.ts +0 -93
  127. package/dist/provisional-manager.d.ts.map +0 -1
  128. package/dist/provisional-manager.js +0 -98
  129. package/dist/provisional-manager.js.map +0 -1
  130. package/dist/provisional.d.ts +0 -150
  131. package/dist/provisional.d.ts.map +0 -1
  132. package/dist/provisional.js +0 -238
  133. package/dist/provisional.js.map +0 -1
  134. package/dist/recent-paths.d.ts.map +0 -1
  135. package/dist/recent-paths.js +0 -114
  136. package/dist/recent-paths.js.map +0 -1
  137. package/dist/regret-tracker.d.ts +0 -84
  138. package/dist/regret-tracker.d.ts.map +0 -1
  139. package/dist/regret-tracker.js +0 -145
  140. package/dist/regret-tracker.js.map +0 -1
  141. package/dist/replay-cli.d.ts +0 -13
  142. package/dist/replay-cli.d.ts.map +0 -1
  143. package/dist/replay-cli.js.map +0 -1
  144. package/dist/replay.d.ts.map +0 -1
  145. package/dist/replay.js +0 -225
  146. package/dist/replay.js.map +0 -1
  147. package/dist/reranker.d.ts +0 -181
  148. package/dist/reranker.d.ts.map +0 -1
  149. package/dist/reranker.js +0 -324
  150. package/dist/reranker.js.map +0 -1
  151. package/dist/session-trie.d.ts +0 -103
  152. package/dist/session-trie.d.ts.map +0 -1
  153. package/dist/session-trie.js +0 -280
  154. package/dist/session-trie.js.map +0 -1
  155. package/dist/speculative.d.ts +0 -74
  156. package/dist/speculative.d.ts.map +0 -1
  157. package/dist/speculative.js +0 -107
  158. package/dist/speculative.js.map +0 -1
  159. package/dist/tool-summarize.d.ts +0 -40
  160. package/dist/tool-summarize.d.ts.map +0 -1
  161. package/dist/tool-summarize.js +0 -245
  162. package/dist/tool-summarize.js.map +0 -1
  163. package/dist/trie-sanitize.d.ts +0 -22
  164. package/dist/trie-sanitize.d.ts.map +0 -1
  165. package/dist/trie-sanitize.js +0 -142
  166. package/dist/trie-sanitize.js.map +0 -1
  167. package/dist/versions.d.ts +0 -23
  168. package/dist/versions.d.ts.map +0 -1
  169. package/dist/versions.js +0 -31
  170. package/dist/versions.js.map +0 -1
@@ -1,441 +0,0 @@
1
- import { wrapAsStream } from "./types.js";
2
- /**
3
- * PRD §M8: per-member rolling stats. A member that's been slow on 8/10
4
- * recent races AND never produced the winning candidate is skipped for the
5
- * next `SKIP_RACES` races. Saves cost without hurting latency when one
6
- * member is consistently a drag.
7
- */
8
- const HISTORY_SIZE = 10;
9
- const SLOW_THRESHOLD = 8;
10
- const SKIP_RACES = 5;
11
- /**
12
- * Implements {@link GhostProvider} by racing several providers in parallel.
13
- * First non-null result wins; losers are aborted via a shared signal.
14
- *
15
- * Trace metadata for the most recent race is exposed via
16
- * {@link consumeLastTrace}. The editor reads it after `predict()` to emit a
17
- * multi-provider metrics record. Consumption is one-shot to avoid stale reuse.
18
- */
19
- export class RaceProvider {
20
- members;
21
- cfg;
22
- name;
23
- cooldownUntil = 0;
24
- lastTrace = null;
25
- stats;
26
- constructor(members, cfg) {
27
- this.members = members;
28
- this.cfg = cfg;
29
- this.name = `ghost-race:${members.map((p) => p.name).join(",")}`;
30
- this.stats = new Map();
31
- for (const p of members) {
32
- this.stats.set(p.name, { slowFlags: [], wins: 0, skipRemaining: 0 });
33
- }
34
- }
35
- /** Snapshot of per-member weighting stats. Test/diagnostic only. */
36
- getMemberStats() {
37
- return this.members.map((p) => {
38
- const s = this.stats.get(p.name);
39
- return {
40
- name: p.name,
41
- slowCount: s.slowFlags.reduce((a, b) => a + b, 0),
42
- wins: s.wins,
43
- skipRemaining: s.skipRemaining,
44
- };
45
- });
46
- }
47
- get debounceMs() {
48
- return this.cfg.pauseMs;
49
- }
50
- consumeLastTrace() {
51
- const t = this.lastTrace;
52
- this.lastTrace = null;
53
- return t;
54
- }
55
- /**
56
- * Cooldown snapshot for speculative cache warm. The editor consults this
57
- * synchronously in `handleTextChange` to decide whether the backspace-of-N
58
- * branch may serve a result (it is the most aggressive branch and is only
59
- * appropriate when a fresh race would no-op anyway). See PRD §6 M1b.
60
- */
61
- getCooldownState(now = Date.now()) {
62
- const remainingMs = Math.max(0, this.cooldownUntil - now);
63
- return { active: remainingMs > 0, remainingMs };
64
- }
65
- async predict(req) {
66
- if (this.members.length === 0)
67
- return null;
68
- const now = Date.now();
69
- if (now < this.cooldownUntil) {
70
- this.lastTrace = { providers: [] };
71
- return null;
72
- }
73
- const trace = [];
74
- const skipped = [];
75
- const localCtrl = new AbortController();
76
- const start = now;
77
- // Propagate caller cancellation; do not propagate our own internal aborts.
78
- const onUserAbort = () => localCtrl.abort();
79
- if (req.signal.aborted) {
80
- localCtrl.abort();
81
- }
82
- else {
83
- req.signal.addEventListener("abort", onUserAbort, { once: true });
84
- }
85
- const cutoffTimer = setTimeout(() => localCtrl.abort(), this.cfg.cutoffMs);
86
- // Filter out members under skip penalty (PRD §M8). Decrement their
87
- // counter and record them in the trace so metrics can attribute the
88
- // skip. If ALL members are skipped, race produces nothing — fall back
89
- // to running them anyway (otherwise the weighting policy could starve
90
- // the user permanently).
91
- const active = [];
92
- for (const p of this.members) {
93
- const s = this.stats.get(p.name);
94
- if (s.skipRemaining > 0) {
95
- s.skipRemaining--;
96
- skipped.push(p.name);
97
- continue;
98
- }
99
- active.push(p);
100
- }
101
- const toRun = active.length > 0 ? active : this.members;
102
- // NOTE: `skipped` records members that "would have been skipped" in the normal
103
- // path. In the all-skipped fallback (`toRun === this.members`), skipRemaining is
104
- // decremented for everyone but they still execute. This prevents starvation when
105
- // the weighting policy flags all providers as slow.
106
- try {
107
- const memberRuns = toRun.map((p) => this.runMember(p, { ...req, signal: localCtrl.signal }, start, trace));
108
- const winner = await firstNonNull(memberRuns);
109
- if (winner) {
110
- localCtrl.abort();
111
- // Wait for losers to push their trace entries before recording
112
- // stats — otherwise penalty accounting misses race-cancelled
113
- // members and they're never skipped.
114
- await Promise.allSettled(memberRuns);
115
- this.lastTrace = {
116
- providers: trace,
117
- winner: winner.provider,
118
- ...(skipped.length > 0 ? { skipped } : {}),
119
- };
120
- this.recordRaceOutcome(trace, winner.provider, req.signal.aborted);
121
- return winner.completion;
122
- }
123
- // Skip cooldown when the caller cancelled — that's a normal stutter,
124
- // not a sign the providers are failing. Only true non-success (empty,
125
- // rejected, error, internal-cutoff) should throttle the next race.
126
- if (!req.signal.aborted) {
127
- this.cooldownUntil = Date.now() + this.cfg.cooldownMs;
128
- }
129
- this.lastTrace = {
130
- providers: trace,
131
- ...(skipped.length > 0 ? { skipped } : {}),
132
- };
133
- this.recordRaceOutcome(trace, null, req.signal.aborted);
134
- return null;
135
- }
136
- finally {
137
- clearTimeout(cutoffTimer);
138
- req.signal.removeEventListener("abort", onUserAbort);
139
- }
140
- }
141
- /**
142
- * After a race resolves, update per-member rolling stats and decide who
143
- * gets a skip penalty for the next `SKIP_RACES`. A member earns "slow"
144
- * if it ran but didn't win this race (when there was a winner).
145
- *
146
- * `userAborted` distinguishes user-keystroke cancellation from
147
- * race-cancellation-by-winner. Member's trace result is "aborted" in
148
- * both cases; we only penalize the latter (the member could have run
149
- * to completion but lost the race). User keystrokes shouldn't drift
150
- * the weighting at all.
151
- */
152
- recordRaceOutcome(trace, winnerName, userAborted) {
153
- if (userAborted)
154
- return;
155
- for (const entry of trace) {
156
- const s = this.stats.get(entry.provider);
157
- if (!s)
158
- continue;
159
- // Aborted-by-race-cancellation IS a slow indicator. Aborted-by-user
160
- // is filtered above. Errors don't count toward slowness — that's
161
- // a different failure mode.
162
- if (entry.result === "error")
163
- continue;
164
- const slow = winnerName !== null && entry.provider !== winnerName ? 1 : 0;
165
- s.slowFlags.push(slow);
166
- while (s.slowFlags.length > HISTORY_SIZE)
167
- s.slowFlags.shift();
168
- if (entry.provider === winnerName)
169
- s.wins++;
170
- if (s.slowFlags.length >= HISTORY_SIZE &&
171
- s.wins === 0 &&
172
- s.slowFlags.reduce((a, b) => a + b, 0) >= SLOW_THRESHOLD &&
173
- s.skipRemaining === 0) {
174
- s.skipRemaining = SKIP_RACES;
175
- }
176
- }
177
- }
178
- /**
179
- * PRD §M3.5a — streaming variant of `predict`. Each member runs its own
180
- * stream under a dedicated AbortController; first member to emit a
181
- * non-empty delta wins. Losing members are aborted and their iterators
182
- * released. The winner's remaining chunks pass through untouched.
183
- *
184
- * Trace + stats are recorded identically to `predict()` so M8 weighting
185
- * works the same way: winner = first to first-chunk; losers that also
186
- * produced are still marked `produced` (they did emit), losers aborted
187
- * before producing are `aborted`.
188
- */
189
- async *predictStream(req) {
190
- if (this.members.length === 0)
191
- return;
192
- const now = Date.now();
193
- if (now < this.cooldownUntil) {
194
- this.lastTrace = { providers: [] };
195
- return;
196
- }
197
- const trace = [];
198
- const skipped = [];
199
- const localCtrl = new AbortController();
200
- const start = now;
201
- const onUserAbort = () => localCtrl.abort();
202
- if (req.signal.aborted)
203
- localCtrl.abort();
204
- else
205
- req.signal.addEventListener("abort", onUserAbort, { once: true });
206
- const cutoffTimer = setTimeout(() => localCtrl.abort(), this.cfg.cutoffMs);
207
- // Skip-penalty filter (same as predict).
208
- const active = [];
209
- for (const p of this.members) {
210
- const s = this.stats.get(p.name);
211
- if (s.skipRemaining > 0) {
212
- s.skipRemaining--;
213
- skipped.push(p.name);
214
- continue;
215
- }
216
- active.push(p);
217
- }
218
- const toRun = active.length > 0 ? active : this.members;
219
- // NOTE: `skipped` records members that "would have been skipped" in the normal
220
- // path. In the all-skipped fallback (`toRun === this.members`), skipRemaining is
221
- // decremented for everyone but they still execute. This prevents starvation when
222
- // the weighting policy flags all providers as slow.
223
- const memberCtrls = toRun.map(() => new AbortController());
224
- // Cascade localCtrl → all memberCtrls. Each member listens to its
225
- // own ctrl signal in its iterator pump; aborting localCtrl propagates.
226
- const onLocalAbort = () => {
227
- for (const c of memberCtrls)
228
- if (!c.signal.aborted)
229
- c.abort();
230
- };
231
- if (localCtrl.signal.aborted)
232
- onLocalAbort();
233
- else
234
- localCtrl.signal.addEventListener("abort", onLocalAbort, { once: true });
235
- const firstChunks = toRun.map((p, i) => this.firstChunkOf(p, req, memberCtrls[i].signal, start, trace, i));
236
- try {
237
- const winner = await firstWithChunk(firstChunks);
238
- if (!winner) {
239
- if (!req.signal.aborted)
240
- this.cooldownUntil = Date.now() + this.cfg.cooldownMs;
241
- this.lastTrace = {
242
- providers: trace,
243
- ...(skipped.length > 0 ? { skipped } : {}),
244
- };
245
- this.recordRaceOutcome(trace, null, req.signal.aborted);
246
- return;
247
- }
248
- // Abort losers. Their iterators throw AbortError on their next pump.
249
- for (let i = 0; i < memberCtrls.length; i++) {
250
- if (i !== winner.idx)
251
- memberCtrls[i].abort();
252
- }
253
- yield winner.first;
254
- try {
255
- while (true) {
256
- const { value, done } = await winner.iter.next();
257
- if (done)
258
- break;
259
- if (value.delta !== "")
260
- yield value;
261
- }
262
- }
263
- catch (err) {
264
- // Caller-abort or cutoff during drain: swallow so we can still
265
- // record trace/stats below. Re-throw non-abort errors (real
266
- // provider failures should propagate).
267
- const aborted = err?.name === "AbortError";
268
- if (!aborted)
269
- throw err;
270
- }
271
- finally {
272
- // Release winner iter (matters when consumer breaks early).
273
- if (typeof winner.iter.return === "function") {
274
- await winner.iter.return().catch(() => undefined);
275
- }
276
- }
277
- // Let losers finalize their trace entries before recording stats.
278
- await Promise.allSettled(firstChunks);
279
- // Release loser iterators that emitted but lost the race.
280
- for (const fc of firstChunks) {
281
- const r = await fc.catch(() => null);
282
- if (r && r.idx !== winner.idx && typeof r.iter.return === "function") {
283
- await r.iter.return().catch(() => undefined);
284
- }
285
- }
286
- this.lastTrace = {
287
- providers: trace,
288
- winner: toRun[winner.idx].name,
289
- ...(skipped.length > 0 ? { skipped } : {}),
290
- };
291
- this.recordRaceOutcome(trace, toRun[winner.idx].name, req.signal.aborted);
292
- }
293
- finally {
294
- clearTimeout(cutoffTimer);
295
- req.signal.removeEventListener("abort", onUserAbort);
296
- localCtrl.signal.removeEventListener("abort", onLocalAbort);
297
- }
298
- }
299
- /**
300
- * Pump a member's stream until its first non-empty delta. Resolves to
301
- * the parked iterator + that delta when produced; null on
302
- * empty/aborted/error. Trace is appended for terminal outcomes; the
303
- * `produced` entry is pushed once the first non-empty delta arrives so
304
- * its latency reflects TTFT, not end-of-stream.
305
- */
306
- async firstChunkOf(provider, req, signal, start, trace, idx) {
307
- const iter = wrapAsStream(provider, { ...req, signal })[Symbol.asyncIterator]();
308
- try {
309
- while (true) {
310
- const { value, done } = await iter.next();
311
- if (done) {
312
- trace.push({
313
- provider: provider.name,
314
- latencyMs: Date.now() - start,
315
- result: "empty",
316
- });
317
- return null;
318
- }
319
- if (value.delta !== "") {
320
- trace.push({
321
- provider: provider.name,
322
- latencyMs: Date.now() - start,
323
- result: "produced",
324
- });
325
- return { idx, iter, first: value };
326
- }
327
- }
328
- }
329
- catch (err) {
330
- const aborted = err?.name === "AbortError";
331
- trace.push({
332
- provider: provider.name,
333
- latencyMs: Date.now() - start,
334
- result: aborted ? "aborted" : "error",
335
- });
336
- return null;
337
- }
338
- }
339
- /**
340
- * Reset all rolling stats (PRD §M8: "Reset state on `setProvider` /
341
- * extension reload"). Public for editor reset paths.
342
- */
343
- resetStats() {
344
- for (const s of this.stats.values()) {
345
- s.slowFlags.length = 0;
346
- s.wins = 0;
347
- s.skipRemaining = 0;
348
- }
349
- }
350
- async runMember(provider, req, start, trace) {
351
- try {
352
- const result = await provider.predict(req);
353
- const latencyMs = Date.now() - start;
354
- if (req.signal.aborted) {
355
- trace.push({ provider: provider.name, latencyMs, result: "aborted" });
356
- return null;
357
- }
358
- if (result === null || result === "") {
359
- trace.push({ provider: provider.name, latencyMs, result: "empty" });
360
- return null;
361
- }
362
- trace.push({ provider: provider.name, latencyMs, result: "produced" });
363
- return { provider: provider.name, completion: result };
364
- }
365
- catch (err) {
366
- const latencyMs = Date.now() - start;
367
- const aborted = err?.name === "AbortError";
368
- trace.push({
369
- provider: provider.name,
370
- latencyMs,
371
- result: aborted ? "aborted" : "error",
372
- });
373
- return null;
374
- }
375
- }
376
- }
377
- /**
378
- * Resolve to the first promise that fulfils with a non-null value. Resolves
379
- * null when all produce null (or throw). Mirrors {@link firstNonNull} but
380
- * keeps the resolved object's identity (used by `predictStream` to recover
381
- * the winning iterator).
382
- */
383
- function firstWithChunk(promises) {
384
- if (promises.length === 0)
385
- return Promise.resolve(null);
386
- return new Promise((resolve) => {
387
- let remaining = promises.length;
388
- let settled = false;
389
- const finish = (v) => {
390
- if (settled)
391
- return;
392
- settled = true;
393
- resolve(v);
394
- };
395
- for (const p of promises) {
396
- p.then((v) => {
397
- if (v !== null && v.first !== null) {
398
- finish(v);
399
- return;
400
- }
401
- if (--remaining === 0)
402
- finish(null);
403
- }, () => {
404
- if (--remaining === 0)
405
- finish(null);
406
- });
407
- }
408
- });
409
- }
410
- /**
411
- * Resolve to the first non-null value among `promises`. Resolves null when
412
- * all promises produce null (or throw). Never rejects.
413
- */
414
- export function firstNonNull(promises) {
415
- if (promises.length === 0)
416
- return Promise.resolve(null);
417
- return new Promise((resolve) => {
418
- let remaining = promises.length;
419
- let settled = false;
420
- const finish = (v) => {
421
- if (settled)
422
- return;
423
- settled = true;
424
- resolve(v);
425
- };
426
- for (const p of promises) {
427
- p.then((v) => {
428
- if (v !== null) {
429
- finish(v);
430
- return;
431
- }
432
- if (--remaining === 0)
433
- finish(null);
434
- }, () => {
435
- if (--remaining === 0)
436
- finish(null);
437
- });
438
- }
439
- });
440
- }
441
- //# sourceMappingURL=race.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"race.js","sourceRoot":"","sources":["../../src/providers/race.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { GhostRequest } from "./types.js";
2
- export declare function buildPromptMessages(req: GhostRequest, maxRecent: number): {
3
- systemPrompt: string;
4
- user: string;
5
- };
6
- export declare function sanitizeCompletion(raw: string, draft: string, maxLen: number): string | null;
7
- //# sourceMappingURL=truncate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/providers/truncate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,GACf;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkBxC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB5F"}
@@ -1,57 +0,0 @@
1
- // PRD §M3d: variable-length completions — the model picks the natural
2
- // boundary (word, phrase, or full line) instead of being forced to a fixed
3
- // upper bound. `max_tokens=64` still bounds runaway outputs. Removing the
4
- // 12-word cap lets the model commit a full line where appropriate, which
5
- // the ranker can then choose against shorter candidates via lengthPrior.
6
- const SYSTEM_PROMPT = "You are a terminal autocomplete engine. The user is typing a prompt for an AI coding agent. " +
7
- "Suggest a continuation of any length: a word, a phrase, or a full line — whichever best completes the current draft. " +
8
- "Output ONLY the continuation text, with no quotes, no markdown, no leading whitespace, no explanation. " +
9
- "If you cannot confidently continue, output an empty string.";
10
- export function buildPromptMessages(req, maxRecent) {
11
- const recent = req.recentMessages
12
- .slice(-maxRecent)
13
- .map((m) => {
14
- // Chat-style providers can't use OpenAI's `role: "tool"` directly
15
- // (requires a paired tool_call_id we don't track). Map tool
16
- // entries to a `[tool NAME]` system-message prefix instead.
17
- // PRD §M6a documented decision.
18
- if (m.role === "tool") {
19
- const label = m.toolName ? `[tool ${m.toolName}]` : "[tool]";
20
- return `${label}: ${truncate(m.text, 280)}`;
21
- }
22
- return `${m.role}: ${truncate(m.text, 280)}`;
23
- })
24
- .join("\n");
25
- const ctx = recent ? `Recent conversation:\n${recent}\n\n` : "";
26
- const user = `${ctx}Current draft (cursor at end):\n${req.editorTextBeforeCursor}`;
27
- return { systemPrompt: SYSTEM_PROMPT, user };
28
- }
29
- export function sanitizeCompletion(raw, draft, maxLen) {
30
- let out = raw;
31
- out = out.replace(/^[\s\r\n]+/, "");
32
- const newlineIdx = out.indexOf("\n");
33
- if (newlineIdx >= 0)
34
- out = out.slice(0, newlineIdx);
35
- out = out.replace(/^["'`](.*)["'`]$/, "$1");
36
- if (!out)
37
- return null;
38
- const draftTail = draft.split(/\s+/).pop() ?? "";
39
- if (draftTail) {
40
- const lower = out.toLowerCase();
41
- const tail = draftTail.toLowerCase();
42
- if (lower === tail)
43
- return null;
44
- if (lower.startsWith(tail) && out.length > draftTail.length) {
45
- out = out.slice(draftTail.length);
46
- }
47
- }
48
- if (!out)
49
- return null;
50
- if (out.length > maxLen)
51
- out = out.slice(0, maxLen);
52
- return out;
53
- }
54
- function truncate(s, n) {
55
- return s.length > n ? `${s.slice(0, n)}…` : s;
56
- }
57
- //# sourceMappingURL=truncate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../src/providers/truncate.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,cAAc,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD;;;OAGG;IACH,YAAY,CAAC,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC/D;;;;;OAKG;IACH,aAAa,CAAC,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9D,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC;IACjD;;;;;;;;;OASG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAChC,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,YAAY,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAK9B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAuB,YAAY,CAClC,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,YAAY,GACf,aAAa,CAAC,WAAW,CAAC,CAQ5B;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAClC,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB"}
@@ -1,60 +0,0 @@
1
- /**
2
- * Adapt a `predict()`-only provider into the `CandidateSet | null` shape.
3
- * Used by the editor to give every provider a uniform multi-candidate
4
- * surface without forcing third-party implementations to upgrade.
5
- *
6
- * Wrapped candidates intentionally have `avgLogprob: undefined` — the
7
- * `predict()` signature returns only text, so logprobs aren't recoverable.
8
- * The reranker normalizes missing logprobs to the neutral mid-value (0.5)
9
- * per PRD §M3c, so single-candidate wrappers aren't penalized against
10
- * providers that do return logprobs.
11
- */
12
- export async function wrapAsMulti(provider, req) {
13
- if (provider.predictMulti)
14
- return provider.predictMulti(req);
15
- const text = await provider.predict(req);
16
- if (text === null || text === "")
17
- return null;
18
- return { candidates: [{ text }] };
19
- }
20
- /**
21
- * Adapt any provider to the streaming surface. Providers with
22
- * `predictStream` pass through unchanged; non-streaming providers get a
23
- * single-delta stream emitted after `predict()` resolves. `firstChunk`
24
- * is true on the only emission in the non-streaming case.
25
- *
26
- * Yields nothing when the provider returns null/empty. Consumer code
27
- * pattern:
28
- *
29
- * ```ts
30
- * let full = "";
31
- * for await (const { cumulative } of wrapAsStream(p, req)) full = cumulative;
32
- * ```
33
- */
34
- export async function* wrapAsStream(provider, req) {
35
- if (provider.predictStream) {
36
- yield* provider.predictStream(req);
37
- return;
38
- }
39
- const text = await provider.predict(req);
40
- if (text === null || text === "")
41
- return;
42
- yield { delta: text, cumulative: text, firstChunk: true };
43
- }
44
- /**
45
- * Drain a stream into its final cumulative text. Records the timestamp
46
- * of the first non-empty chunk on `out.ttftMs` (relative to `startedAt`)
47
- * for the caller. The result is the full assembled text, or null if the
48
- * stream produced no content.
49
- */
50
- export async function streamToText(stream, startedAt, out = {}) {
51
- let full = "";
52
- for await (const chunk of stream) {
53
- if (chunk.firstChunk && out.ttftMs === undefined) {
54
- out.ttftMs = Date.now() - startedAt;
55
- }
56
- full = chunk.cumulative;
57
- }
58
- return full.length > 0 ? full : null;
59
- }
60
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAkFA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,QAAuB,EACvB,GAAiB;IAEjB,IAAI,QAAQ,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,YAAY,CAClC,QAAuB,EACvB,GAAiB;IAEjB,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5B,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO;IACR,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO;IACzC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,MAAkC,EAClC,SAAiB,EACjB,MAA2B,EAAE;IAE7B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACrC,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC"}