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.
- package/LICENSE +561 -0
- package/README.md +464 -331
- package/dist/bench-cli.js +1 -123
- package/dist/bench.d.ts +7 -3
- package/dist/bench.js +1 -522
- package/dist/config.d.ts +4 -1
- package/dist/context-aggregator.d.ts +4 -1
- package/dist/cycle-manager.d.ts +2 -21
- package/dist/entropy-stop.d.ts +4 -1
- package/dist/eval-dataset.d.ts +2 -13
- package/dist/fuzzy-matcher.d.ts +4 -1
- package/dist/ghost-editor.d.ts +11 -2
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -289
- package/dist/intent.d.ts +179 -0
- package/dist/metrics.d.ts +4 -1
- package/dist/path-index.d.ts +4 -1
- package/dist/path-matcher.d.ts +4 -1
- package/dist/profile-store.d.ts +4 -1
- package/dist/profile.d.ts +2 -20
- package/dist/providers/cloud-provider.d.ts +4 -1
- package/dist/providers/local-provider.d.ts +4 -1
- package/dist/providers/openai-compat-provider.d.ts +24 -1
- package/dist/providers/race.d.ts +4 -1
- package/dist/providers/types.d.ts +13 -1
- package/dist/recent-paths.d.ts +4 -1
- package/dist/replay-cli.js +1 -166
- package/dist/replay.d.ts +2 -7
- package/package.json +90 -80
- package/dist/bench-cli.d.ts +0 -3
- package/dist/bench-cli.d.ts.map +0 -1
- package/dist/bench-cli.js.map +0 -1
- package/dist/bench.d.ts.map +0 -1
- package/dist/bench.js.map +0 -1
- package/dist/cache.d.ts +0 -124
- package/dist/cache.d.ts.map +0 -1
- package/dist/cache.js +0 -173
- package/dist/cache.js.map +0 -1
- package/dist/candidate-rerank.d.ts +0 -57
- package/dist/candidate-rerank.d.ts.map +0 -1
- package/dist/candidate-rerank.js +0 -78
- package/dist/candidate-rerank.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -317
- package/dist/config.js.map +0 -1
- package/dist/context-aggregator.d.ts.map +0 -1
- package/dist/context-aggregator.js +0 -87
- package/dist/context-aggregator.js.map +0 -1
- package/dist/context-selector.d.ts +0 -128
- package/dist/context-selector.d.ts.map +0 -1
- package/dist/context-selector.js +0 -300
- package/dist/context-selector.js.map +0 -1
- package/dist/cycle-manager.d.ts.map +0 -1
- package/dist/cycle-manager.js +0 -168
- package/dist/cycle-manager.js.map +0 -1
- package/dist/edit-history-ring.d.ts +0 -148
- package/dist/edit-history-ring.d.ts.map +0 -1
- package/dist/edit-history-ring.js +0 -262
- package/dist/edit-history-ring.js.map +0 -1
- package/dist/entropy-stop.d.ts.map +0 -1
- package/dist/entropy-stop.js +0 -141
- package/dist/entropy-stop.js.map +0 -1
- package/dist/eval-dataset.d.ts.map +0 -1
- package/dist/eval-dataset.js +0 -127
- package/dist/eval-dataset.js.map +0 -1
- package/dist/fast-path-engine.d.ts +0 -286
- package/dist/fast-path-engine.d.ts.map +0 -1
- package/dist/fast-path-engine.js +0 -341
- package/dist/fast-path-engine.js.map +0 -1
- package/dist/fuzzy-matcher.d.ts.map +0 -1
- package/dist/fuzzy-matcher.js +0 -162
- package/dist/fuzzy-matcher.js.map +0 -1
- package/dist/ghost-editor.d.ts.map +0 -1
- package/dist/ghost-editor.js +0 -1491
- package/dist/ghost-editor.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/keystroke-timer.d.ts +0 -59
- package/dist/keystroke-timer.d.ts.map +0 -1
- package/dist/keystroke-timer.js +0 -94
- package/dist/keystroke-timer.js.map +0 -1
- package/dist/metrics-builder.d.ts +0 -71
- package/dist/metrics-builder.d.ts.map +0 -1
- package/dist/metrics-builder.js +0 -71
- package/dist/metrics-builder.js.map +0 -1
- package/dist/metrics.d.ts.map +0 -1
- package/dist/metrics.js +0 -212
- package/dist/metrics.js.map +0 -1
- package/dist/path-index.d.ts.map +0 -1
- package/dist/path-index.js +0 -148
- package/dist/path-index.js.map +0 -1
- package/dist/path-matcher.d.ts.map +0 -1
- package/dist/path-matcher.js +0 -88
- package/dist/path-matcher.js.map +0 -1
- package/dist/profile-store.d.ts.map +0 -1
- package/dist/profile-store.js +0 -199
- package/dist/profile-store.js.map +0 -1
- package/dist/profile.d.ts.map +0 -1
- package/dist/profile.js +0 -434
- package/dist/profile.js.map +0 -1
- package/dist/providers/cloud-provider.d.ts.map +0 -1
- package/dist/providers/cloud-provider.js +0 -109
- package/dist/providers/cloud-provider.js.map +0 -1
- package/dist/providers/local-provider.d.ts.map +0 -1
- package/dist/providers/local-provider.js +0 -48
- package/dist/providers/local-provider.js.map +0 -1
- package/dist/providers/openai-compat-provider.d.ts.map +0 -1
- package/dist/providers/openai-compat-provider.js +0 -215
- package/dist/providers/openai-compat-provider.js.map +0 -1
- package/dist/providers/openai-completions-runner.d.ts +0 -52
- package/dist/providers/openai-completions-runner.d.ts.map +0 -1
- package/dist/providers/openai-completions-runner.js +0 -141
- package/dist/providers/openai-completions-runner.js.map +0 -1
- package/dist/providers/race.d.ts.map +0 -1
- package/dist/providers/race.js +0 -441
- package/dist/providers/race.js.map +0 -1
- package/dist/providers/truncate.d.ts +0 -7
- package/dist/providers/truncate.d.ts.map +0 -1
- package/dist/providers/truncate.js +0 -57
- package/dist/providers/truncate.js.map +0 -1
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -60
- package/dist/providers/types.js.map +0 -1
- package/dist/provisional-manager.d.ts +0 -93
- package/dist/provisional-manager.d.ts.map +0 -1
- package/dist/provisional-manager.js +0 -98
- package/dist/provisional-manager.js.map +0 -1
- package/dist/provisional.d.ts +0 -150
- package/dist/provisional.d.ts.map +0 -1
- package/dist/provisional.js +0 -238
- package/dist/provisional.js.map +0 -1
- package/dist/recent-paths.d.ts.map +0 -1
- package/dist/recent-paths.js +0 -114
- package/dist/recent-paths.js.map +0 -1
- package/dist/regret-tracker.d.ts +0 -84
- package/dist/regret-tracker.d.ts.map +0 -1
- package/dist/regret-tracker.js +0 -145
- package/dist/regret-tracker.js.map +0 -1
- package/dist/replay-cli.d.ts +0 -13
- package/dist/replay-cli.d.ts.map +0 -1
- package/dist/replay-cli.js.map +0 -1
- package/dist/replay.d.ts.map +0 -1
- package/dist/replay.js +0 -225
- package/dist/replay.js.map +0 -1
- package/dist/reranker.d.ts +0 -181
- package/dist/reranker.d.ts.map +0 -1
- package/dist/reranker.js +0 -324
- package/dist/reranker.js.map +0 -1
- package/dist/session-trie.d.ts +0 -103
- package/dist/session-trie.d.ts.map +0 -1
- package/dist/session-trie.js +0 -280
- package/dist/session-trie.js.map +0 -1
- package/dist/speculative.d.ts +0 -74
- package/dist/speculative.d.ts.map +0 -1
- package/dist/speculative.js +0 -107
- package/dist/speculative.js.map +0 -1
- package/dist/tool-summarize.d.ts +0 -40
- package/dist/tool-summarize.d.ts.map +0 -1
- package/dist/tool-summarize.js +0 -245
- package/dist/tool-summarize.js.map +0 -1
- package/dist/trie-sanitize.d.ts +0 -22
- package/dist/trie-sanitize.d.ts.map +0 -1
- package/dist/trie-sanitize.js +0 -142
- package/dist/trie-sanitize.js.map +0 -1
- package/dist/versions.d.ts +0 -23
- package/dist/versions.d.ts.map +0 -1
- package/dist/versions.js +0 -31
- package/dist/versions.js.map +0 -1
package/dist/providers/race.js
DELETED
|
@@ -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"}
|
package/dist/providers/types.js
DELETED
|
@@ -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"}
|