pi-ghost-autocomplete 0.3.1 → 0.3.2

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 (155) hide show
  1. package/README.md +101 -6
  2. package/dist/bench-cli.js +81 -5
  3. package/dist/bench-cli.js.map +1 -1
  4. package/dist/bench.d.ts +130 -2
  5. package/dist/bench.d.ts.map +1 -1
  6. package/dist/bench.js +285 -4
  7. package/dist/bench.js.map +1 -1
  8. package/dist/cache.d.ts +124 -0
  9. package/dist/cache.d.ts.map +1 -0
  10. package/dist/cache.js +173 -0
  11. package/dist/cache.js.map +1 -0
  12. package/dist/candidate-rerank.d.ts +57 -0
  13. package/dist/candidate-rerank.d.ts.map +1 -0
  14. package/dist/candidate-rerank.js +78 -0
  15. package/dist/candidate-rerank.js.map +1 -0
  16. package/dist/config.d.ts +43 -0
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +148 -18
  19. package/dist/config.js.map +1 -1
  20. package/dist/context-aggregator.d.ts +14 -5
  21. package/dist/context-aggregator.d.ts.map +1 -1
  22. package/dist/context-aggregator.js +38 -9
  23. package/dist/context-aggregator.js.map +1 -1
  24. package/dist/context-selector.d.ts +128 -0
  25. package/dist/context-selector.d.ts.map +1 -0
  26. package/dist/context-selector.js +300 -0
  27. package/dist/context-selector.js.map +1 -0
  28. package/dist/cycle-manager.d.ts +102 -0
  29. package/dist/cycle-manager.d.ts.map +1 -0
  30. package/dist/cycle-manager.js +168 -0
  31. package/dist/cycle-manager.js.map +1 -0
  32. package/dist/edit-history-ring.d.ts +148 -0
  33. package/dist/edit-history-ring.d.ts.map +1 -0
  34. package/dist/edit-history-ring.js +262 -0
  35. package/dist/edit-history-ring.js.map +1 -0
  36. package/dist/entropy-stop.d.ts +102 -0
  37. package/dist/entropy-stop.d.ts.map +1 -0
  38. package/dist/entropy-stop.js +141 -0
  39. package/dist/entropy-stop.js.map +1 -0
  40. package/dist/eval-dataset.d.ts +66 -0
  41. package/dist/eval-dataset.d.ts.map +1 -0
  42. package/dist/eval-dataset.js +127 -0
  43. package/dist/eval-dataset.js.map +1 -0
  44. package/dist/fast-path-engine.d.ts +286 -0
  45. package/dist/fast-path-engine.d.ts.map +1 -0
  46. package/dist/fast-path-engine.js +341 -0
  47. package/dist/fast-path-engine.js.map +1 -0
  48. package/dist/fuzzy-matcher.d.ts +8 -0
  49. package/dist/fuzzy-matcher.d.ts.map +1 -1
  50. package/dist/fuzzy-matcher.js +5 -3
  51. package/dist/fuzzy-matcher.js.map +1 -1
  52. package/dist/ghost-editor.d.ts +321 -4
  53. package/dist/ghost-editor.d.ts.map +1 -1
  54. package/dist/ghost-editor.js +1190 -144
  55. package/dist/ghost-editor.js.map +1 -1
  56. package/dist/index.d.ts +17 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +81 -2
  59. package/dist/index.js.map +1 -1
  60. package/dist/keystroke-timer.d.ts +59 -0
  61. package/dist/keystroke-timer.d.ts.map +1 -0
  62. package/dist/keystroke-timer.js +94 -0
  63. package/dist/keystroke-timer.js.map +1 -0
  64. package/dist/metrics-builder.d.ts +71 -0
  65. package/dist/metrics-builder.d.ts.map +1 -0
  66. package/dist/metrics-builder.js +71 -0
  67. package/dist/metrics-builder.js.map +1 -0
  68. package/dist/metrics.d.ts +99 -2
  69. package/dist/metrics.d.ts.map +1 -1
  70. package/dist/metrics.js +131 -17
  71. package/dist/metrics.js.map +1 -1
  72. package/dist/path-matcher.d.ts +9 -0
  73. package/dist/path-matcher.d.ts.map +1 -1
  74. package/dist/path-matcher.js +5 -2
  75. package/dist/path-matcher.js.map +1 -1
  76. package/dist/profile-store.d.ts +82 -0
  77. package/dist/profile-store.d.ts.map +1 -0
  78. package/dist/profile-store.js +199 -0
  79. package/dist/profile-store.js.map +1 -0
  80. package/dist/profile.d.ts +185 -0
  81. package/dist/profile.d.ts.map +1 -0
  82. package/dist/profile.js +434 -0
  83. package/dist/profile.js.map +1 -0
  84. package/dist/providers/cloud-provider.d.ts +10 -1
  85. package/dist/providers/cloud-provider.d.ts.map +1 -1
  86. package/dist/providers/cloud-provider.js +71 -14
  87. package/dist/providers/cloud-provider.js.map +1 -1
  88. package/dist/providers/local-provider.d.ts +8 -1
  89. package/dist/providers/local-provider.d.ts.map +1 -1
  90. package/dist/providers/local-provider.js +15 -3
  91. package/dist/providers/local-provider.js.map +1 -1
  92. package/dist/providers/openai-compat-provider.d.ts +11 -1
  93. package/dist/providers/openai-compat-provider.d.ts.map +1 -1
  94. package/dist/providers/openai-compat-provider.js +93 -6
  95. package/dist/providers/openai-compat-provider.js.map +1 -1
  96. package/dist/providers/openai-completions-runner.d.ts +25 -1
  97. package/dist/providers/openai-completions-runner.d.ts.map +1 -1
  98. package/dist/providers/openai-completions-runner.js +109 -14
  99. package/dist/providers/openai-completions-runner.js.map +1 -1
  100. package/dist/providers/race.d.ts +58 -1
  101. package/dist/providers/race.d.ts.map +1 -1
  102. package/dist/providers/race.js +317 -4
  103. package/dist/providers/race.js.map +1 -1
  104. package/dist/providers/truncate.d.ts.map +1 -1
  105. package/dist/providers/truncate.js +20 -2
  106. package/dist/providers/truncate.js.map +1 -1
  107. package/dist/providers/types.d.ts +96 -1
  108. package/dist/providers/types.d.ts.map +1 -1
  109. package/dist/providers/types.js +59 -1
  110. package/dist/providers/types.js.map +1 -1
  111. package/dist/provisional-manager.d.ts +93 -0
  112. package/dist/provisional-manager.d.ts.map +1 -0
  113. package/dist/provisional-manager.js +98 -0
  114. package/dist/provisional-manager.js.map +1 -0
  115. package/dist/provisional.d.ts +150 -0
  116. package/dist/provisional.d.ts.map +1 -0
  117. package/dist/provisional.js +238 -0
  118. package/dist/provisional.js.map +1 -0
  119. package/dist/regret-tracker.d.ts +84 -0
  120. package/dist/regret-tracker.d.ts.map +1 -0
  121. package/dist/regret-tracker.js +145 -0
  122. package/dist/regret-tracker.js.map +1 -0
  123. package/dist/replay-cli.d.ts +13 -0
  124. package/dist/replay-cli.d.ts.map +1 -0
  125. package/dist/replay-cli.js +167 -0
  126. package/dist/replay-cli.js.map +1 -0
  127. package/dist/replay.d.ts +107 -0
  128. package/dist/replay.d.ts.map +1 -0
  129. package/dist/replay.js +225 -0
  130. package/dist/replay.js.map +1 -0
  131. package/dist/reranker.d.ts +181 -0
  132. package/dist/reranker.d.ts.map +1 -0
  133. package/dist/reranker.js +324 -0
  134. package/dist/reranker.js.map +1 -0
  135. package/dist/session-trie.d.ts +103 -0
  136. package/dist/session-trie.d.ts.map +1 -0
  137. package/dist/session-trie.js +280 -0
  138. package/dist/session-trie.js.map +1 -0
  139. package/dist/speculative.d.ts +74 -0
  140. package/dist/speculative.d.ts.map +1 -0
  141. package/dist/speculative.js +107 -0
  142. package/dist/speculative.js.map +1 -0
  143. package/dist/tool-summarize.d.ts +40 -0
  144. package/dist/tool-summarize.d.ts.map +1 -0
  145. package/dist/tool-summarize.js +245 -0
  146. package/dist/tool-summarize.js.map +1 -0
  147. package/dist/trie-sanitize.d.ts +22 -0
  148. package/dist/trie-sanitize.d.ts.map +1 -0
  149. package/dist/trie-sanitize.js +142 -0
  150. package/dist/trie-sanitize.js.map +1 -0
  151. package/dist/versions.d.ts +23 -0
  152. package/dist/versions.d.ts.map +1 -0
  153. package/dist/versions.js +31 -0
  154. package/dist/versions.js.map +1 -0
  155. package/package.json +3 -2
@@ -1,3 +1,13 @@
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;
1
11
  /**
2
12
  * Implements {@link GhostProvider} by racing several providers in parallel.
3
13
  * First non-null result wins; losers are aborted via a shared signal.
@@ -12,10 +22,27 @@ export class RaceProvider {
12
22
  name;
13
23
  cooldownUntil = 0;
14
24
  lastTrace = null;
25
+ stats;
15
26
  constructor(members, cfg) {
16
27
  this.members = members;
17
28
  this.cfg = cfg;
18
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
+ });
19
46
  }
20
47
  get debounceMs() {
21
48
  return this.cfg.pauseMs;
@@ -25,6 +52,16 @@ export class RaceProvider {
25
52
  this.lastTrace = null;
26
53
  return t;
27
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
+ }
28
65
  async predict(req) {
29
66
  if (this.members.length === 0)
30
67
  return null;
@@ -34,6 +71,7 @@ export class RaceProvider {
34
71
  return null;
35
72
  }
36
73
  const trace = [];
74
+ const skipped = [];
37
75
  const localCtrl = new AbortController();
38
76
  const start = now;
39
77
  // Propagate caller cancellation; do not propagate our own internal aborts.
@@ -45,12 +83,41 @@ export class RaceProvider {
45
83
  req.signal.addEventListener("abort", onUserAbort, { once: true });
46
84
  }
47
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.
48
106
  try {
49
- const races = this.members.map((p) => this.runMember(p, { ...req, signal: localCtrl.signal }, start, trace));
50
- const winner = await firstNonNull(races);
107
+ const memberRuns = toRun.map((p) => this.runMember(p, { ...req, signal: localCtrl.signal }, start, trace));
108
+ const winner = await firstNonNull(memberRuns);
51
109
  if (winner) {
52
110
  localCtrl.abort();
53
- this.lastTrace = { providers: trace, winner: winner.provider };
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);
54
121
  return winner.completion;
55
122
  }
56
123
  // Skip cooldown when the caller cancelled — that's a normal stutter,
@@ -59,7 +126,11 @@ export class RaceProvider {
59
126
  if (!req.signal.aborted) {
60
127
  this.cooldownUntil = Date.now() + this.cfg.cooldownMs;
61
128
  }
62
- this.lastTrace = { providers: trace };
129
+ this.lastTrace = {
130
+ providers: trace,
131
+ ...(skipped.length > 0 ? { skipped } : {}),
132
+ };
133
+ this.recordRaceOutcome(trace, null, req.signal.aborted);
63
134
  return null;
64
135
  }
65
136
  finally {
@@ -67,6 +138,215 @@ export class RaceProvider {
67
138
  req.signal.removeEventListener("abort", onUserAbort);
68
139
  }
69
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
+ }
70
350
  async runMember(provider, req, start, trace) {
71
351
  try {
72
352
  const result = await provider.predict(req);
@@ -94,6 +374,39 @@ export class RaceProvider {
94
374
  }
95
375
  }
96
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
+ }
97
410
  /**
98
411
  * Resolve to the first non-null value among `promises`. Resolves null when
99
412
  * all promises produce null (or throw). Never rejects.
@@ -1 +1 @@
1
- {"version":3,"file":"race.js","sourceRoot":"","sources":["../../src/providers/race.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"race.js","sourceRoot":"","sources":["../../src/providers/race.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/providers/truncate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ/C,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,GACf;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKxC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB5F"}
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,9 +1,27 @@
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.
1
6
  const SYSTEM_PROMPT = "You are a terminal autocomplete engine. The user is typing a prompt for an AI coding agent. " +
2
- "Predict the most likely continuation of the current line — at most one short phrase, no more than 12 words. " +
7
+ "Suggest a continuation of any length: a word, a phrase, or a full line — whichever best completes the current draft. " +
3
8
  "Output ONLY the continuation text, with no quotes, no markdown, no leading whitespace, no explanation. " +
4
9
  "If you cannot confidently continue, output an empty string.";
5
10
  export function buildPromptMessages(req, maxRecent) {
6
- const recent = req.recentMessages.slice(-maxRecent).map((m) => `${m.role}: ${truncate(m.text, 280)}`).join("\n");
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");
7
25
  const ctx = recent ? `Recent conversation:\n${recent}\n\n` : "";
8
26
  const user = `${ctx}Current draft (cursor at end):\n${req.editorTextBeforeCursor}`;
9
27
  return { systemPrompt: SYSTEM_PROMPT, user };
@@ -1 +1 @@
1
- {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../src/providers/truncate.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAClB,8FAA8F;IAC9F,8GAA8G;IAC9G,yGAAyG;IACzG,6DAA6D,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAClC,GAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjH,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,yBAAyB,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,GAAG,GAAG,mCAAmC,GAAG,CAAC,sBAAsB,EAAE,CAAC;IACnF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc;IAC5E,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,UAAU,IAAI,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACpD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC7D,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACrC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../src/providers/truncate.ts"],"names":[],"mappings":"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"}
@@ -2,17 +2,112 @@ import type { PreflightResult } from "./openai-compat-provider.js";
2
2
  export interface GhostRequest {
3
3
  editorText: string;
4
4
  editorTextBeforeCursor: string;
5
+ /**
6
+ * Recent conversation messages, oldest-first. `role: "tool"` entries
7
+ * may carry a `toolName` for richer prompt formatting (PRD §M6a). The
8
+ * editor only surfaces tool entries when `includeTools` is enabled in
9
+ * `context-aggregator.getRecentMessages`.
10
+ */
5
11
  recentMessages: Array<{
6
- role: "user" | "assistant";
12
+ role: "user" | "assistant" | "tool";
7
13
  text: string;
14
+ toolName?: string;
8
15
  }>;
9
16
  cwd: string;
10
17
  signal: AbortSignal;
11
18
  }
19
+ /**
20
+ * One candidate completion. `avgLogprob` is the average per-token logprob if
21
+ * the provider returned them; undefined when not supported. Reranker treats
22
+ * missing logprobs as the neutral mid-value (0.5 after normalization) per
23
+ * PRD §M3c.
24
+ */
25
+ export interface GhostCandidate {
26
+ text: string;
27
+ avgLogprob?: number;
28
+ }
29
+ /**
30
+ * Result of a multi-candidate prediction. `candidates` is ordered as the
31
+ * provider returned them (no rerank applied yet). Single-candidate providers
32
+ * return a single-element array.
33
+ */
34
+ export interface CandidateSet {
35
+ candidates: GhostCandidate[];
36
+ }
37
+ /**
38
+ * One streaming delta from a provider. PRD §M3.5a — captures both the
39
+ * incremental piece (`delta`) and the running concatenation (`cumulative`)
40
+ * so consumers don't have to track state. `firstChunk` flags the very
41
+ * first non-empty delta, which is what the editor stamps as `ttftMs`.
42
+ */
43
+ export interface StreamDelta {
44
+ delta: string;
45
+ cumulative: string;
46
+ firstChunk: boolean;
47
+ }
12
48
  export interface GhostProvider {
13
49
  readonly name: string;
14
50
  readonly debounceMs: number;
15
51
  predict(req: GhostRequest): Promise<string | null>;
52
+ /**
53
+ * Optional multi-candidate variant. When absent the editor wraps
54
+ * `predict()` via `wrapAsMulti`. See PRD §M3a.
55
+ */
56
+ predictMulti?(req: GhostRequest): Promise<CandidateSet | null>;
57
+ /**
58
+ * Optional streaming variant. When present the editor uses it on
59
+ * single-candidate paths to capture `ttftMs` and (in a follow-up
60
+ * iteration) drive incremental UI rendering. Providers that don't
61
+ * stream (e.g. Mercury Edit FIM) omit this method.
62
+ */
63
+ predictStream?(req: GhostRequest): AsyncIterable<StreamDelta>;
16
64
  preflight?(): Promise<boolean | PreflightResult>;
65
+ /**
66
+ * PRD §M3g / §M7 capability flag — true iff the provider populates
67
+ * per-token logprob values on streamed `StreamDelta` events (M7
68
+ * entropy-stop input). `StreamDelta` will be extended in a future
69
+ * change to include per-token logprob data. No provider currently sets
70
+ * this since `@earendil-works/pi-ai` does not surface logprobs; left in
71
+ * place so M7 wiring can flip on once upstream support lands without
72
+ * changing the diagnostics surface. Wording aligns with
73
+ * `GhostCandidate.avgLogprob`.
74
+ */
75
+ readonly supportsLogprobs?: boolean;
17
76
  }
77
+ /**
78
+ * Adapt a `predict()`-only provider into the `CandidateSet | null` shape.
79
+ * Used by the editor to give every provider a uniform multi-candidate
80
+ * surface without forcing third-party implementations to upgrade.
81
+ *
82
+ * Wrapped candidates intentionally have `avgLogprob: undefined` — the
83
+ * `predict()` signature returns only text, so logprobs aren't recoverable.
84
+ * The reranker normalizes missing logprobs to the neutral mid-value (0.5)
85
+ * per PRD §M3c, so single-candidate wrappers aren't penalized against
86
+ * providers that do return logprobs.
87
+ */
88
+ export declare function wrapAsMulti(provider: GhostProvider, req: GhostRequest): Promise<CandidateSet | null>;
89
+ /**
90
+ * Adapt any provider to the streaming surface. Providers with
91
+ * `predictStream` pass through unchanged; non-streaming providers get a
92
+ * single-delta stream emitted after `predict()` resolves. `firstChunk`
93
+ * is true on the only emission in the non-streaming case.
94
+ *
95
+ * Yields nothing when the provider returns null/empty. Consumer code
96
+ * pattern:
97
+ *
98
+ * ```ts
99
+ * let full = "";
100
+ * for await (const { cumulative } of wrapAsStream(p, req)) full = cumulative;
101
+ * ```
102
+ */
103
+ export declare function wrapAsStream(provider: GhostProvider, req: GhostRequest): AsyncIterable<StreamDelta>;
104
+ /**
105
+ * Drain a stream into its final cumulative text. Records the timestamp
106
+ * of the first non-empty chunk on `out.ttftMs` (relative to `startedAt`)
107
+ * for the caller. The result is the full assembled text, or null if the
108
+ * stream produced no content.
109
+ */
110
+ export declare function streamToText(stream: AsyncIterable<StreamDelta>, startedAt: number, out?: {
111
+ ttftMs?: number;
112
+ }): Promise<string | null>;
18
113
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
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,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,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,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC;CACjD"}
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,2 +1,60 @@
1
- export {};
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
+ }
2
60
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
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"}