pi-ghost-autocomplete 0.3.1

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 (74) hide show
  1. package/README.md +236 -0
  2. package/dist/bench-cli.d.ts +3 -0
  3. package/dist/bench-cli.d.ts.map +1 -0
  4. package/dist/bench-cli.js +48 -0
  5. package/dist/bench-cli.js.map +1 -0
  6. package/dist/bench.d.ts +93 -0
  7. package/dist/bench.d.ts.map +1 -0
  8. package/dist/bench.js +241 -0
  9. package/dist/bench.js.map +1 -0
  10. package/dist/config.d.ts +55 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +187 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/context-aggregator.d.ts +14 -0
  15. package/dist/context-aggregator.d.ts.map +1 -0
  16. package/dist/context-aggregator.js +58 -0
  17. package/dist/context-aggregator.js.map +1 -0
  18. package/dist/fuzzy-matcher.d.ts +50 -0
  19. package/dist/fuzzy-matcher.d.ts.map +1 -0
  20. package/dist/fuzzy-matcher.js +160 -0
  21. package/dist/fuzzy-matcher.js.map +1 -0
  22. package/dist/ghost-editor.d.ts +65 -0
  23. package/dist/ghost-editor.d.ts.map +1 -0
  24. package/dist/ghost-editor.js +445 -0
  25. package/dist/ghost-editor.js.map +1 -0
  26. package/dist/index.d.ts +25 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +210 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/metrics.d.ts +56 -0
  31. package/dist/metrics.d.ts.map +1 -0
  32. package/dist/metrics.js +98 -0
  33. package/dist/metrics.js.map +1 -0
  34. package/dist/path-index.d.ts +20 -0
  35. package/dist/path-index.d.ts.map +1 -0
  36. package/dist/path-index.js +148 -0
  37. package/dist/path-index.js.map +1 -0
  38. package/dist/path-matcher.d.ts +32 -0
  39. package/dist/path-matcher.d.ts.map +1 -0
  40. package/dist/path-matcher.js +85 -0
  41. package/dist/path-matcher.js.map +1 -0
  42. package/dist/providers/cloud-provider.d.ts +10 -0
  43. package/dist/providers/cloud-provider.d.ts.map +1 -0
  44. package/dist/providers/cloud-provider.js +52 -0
  45. package/dist/providers/cloud-provider.js.map +1 -0
  46. package/dist/providers/local-provider.d.ts +11 -0
  47. package/dist/providers/local-provider.d.ts.map +1 -0
  48. package/dist/providers/local-provider.js +36 -0
  49. package/dist/providers/local-provider.js.map +1 -0
  50. package/dist/providers/openai-compat-provider.d.ts +29 -0
  51. package/dist/providers/openai-compat-provider.d.ts.map +1 -0
  52. package/dist/providers/openai-compat-provider.js +128 -0
  53. package/dist/providers/openai-compat-provider.js.map +1 -0
  54. package/dist/providers/openai-completions-runner.d.ts +28 -0
  55. package/dist/providers/openai-completions-runner.d.ts.map +1 -0
  56. package/dist/providers/openai-completions-runner.js +46 -0
  57. package/dist/providers/openai-completions-runner.js.map +1 -0
  58. package/dist/providers/race.d.ts +40 -0
  59. package/dist/providers/race.d.ts.map +1 -0
  60. package/dist/providers/race.js +128 -0
  61. package/dist/providers/race.js.map +1 -0
  62. package/dist/providers/truncate.d.ts +7 -0
  63. package/dist/providers/truncate.d.ts.map +1 -0
  64. package/dist/providers/truncate.js +39 -0
  65. package/dist/providers/truncate.js.map +1 -0
  66. package/dist/providers/types.d.ts +18 -0
  67. package/dist/providers/types.d.ts.map +1 -0
  68. package/dist/providers/types.js +2 -0
  69. package/dist/providers/types.js.map +1 -0
  70. package/dist/recent-paths.d.ts +25 -0
  71. package/dist/recent-paths.d.ts.map +1 -0
  72. package/dist/recent-paths.js +114 -0
  73. package/dist/recent-paths.js.map +1 -0
  74. package/package.json +79 -0
@@ -0,0 +1,445 @@
1
+ import { CustomEditor } from "@earendil-works/pi-coding-agent";
2
+ import { CURSOR_MARKER, matchesKey, truncateToWidth } from "@earendil-works/pi-tui";
3
+ import stringWidth from "string-width";
4
+ import stripAnsi from "strip-ansi";
5
+ import { getRecentMessages } from "./context-aggregator.js";
6
+ import { extractFuzzyToken, findFuzzyFilename } from "./fuzzy-matcher.js";
7
+ import { extractPathPrefixToken, findPathPrefix } from "./path-matcher.js";
8
+ import { RaceProvider } from "./providers/race.js";
9
+ import { extractRecentPaths, getRoleWeightedRecent } from "./recent-paths.js";
10
+ const RECENT_USER_MAX = 2;
11
+ const RECENT_ASSISTANT_MAX = 1;
12
+ const RECENT_PATHS_TTL_MS = 5_000;
13
+ const DIM_OPEN = "\x1b[2;90m";
14
+ const DIM_CLOSE = "\x1b[0m";
15
+ const GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, { granularity: "grapheme" });
16
+ export class GhostEditor extends CustomEditor {
17
+ provider;
18
+ config;
19
+ extCtx;
20
+ metrics;
21
+ onError;
22
+ pathIndex;
23
+ ghostText = null;
24
+ ghostForText = "";
25
+ ghostReplaceFrom = null;
26
+ debounceTimer = null;
27
+ inflight = null;
28
+ lastTextSeen = "";
29
+ disposed = false;
30
+ shownMetric = null;
31
+ recentPaths = new Set();
32
+ recentPathsAt = 0;
33
+ constructor(tui, theme, keybindings, extCtx, config, provider, metrics = null, pathIndex = null, onError = null) {
34
+ super(tui, theme, keybindings);
35
+ this.provider = provider;
36
+ this.config = config;
37
+ this.extCtx = extCtx;
38
+ this.metrics = metrics;
39
+ this.pathIndex = pathIndex;
40
+ this.onError = onError;
41
+ this.lastTextSeen = this.getText();
42
+ }
43
+ setPathIndex(index) {
44
+ this.pathIndex = index;
45
+ }
46
+ setProvider(provider) {
47
+ this.provider = provider;
48
+ this.clearGhost();
49
+ }
50
+ dispose() {
51
+ this.disposed = true;
52
+ this.finalizeShown("expired");
53
+ this.clearGhost();
54
+ void this.metrics?.flush();
55
+ }
56
+ handleInput(data) {
57
+ // Right Arrow accepts the ghost when conditions hold. Use matchesKey so
58
+ // both legacy CSI/SS3 and Kitty keyboard protocol sequences work.
59
+ if (matchesKey(data, "right") &&
60
+ this.ghostText &&
61
+ !this.isShowingAutocomplete() &&
62
+ this.cursorAtEnd()) {
63
+ const accepted = this.ghostText;
64
+ const replaceFrom = this.ghostReplaceFrom;
65
+ this.finalizeShown("accepted");
66
+ this.clearGhost();
67
+ if (replaceFrom) {
68
+ this.replaceTokenAtCursor(replaceFrom, accepted);
69
+ }
70
+ else {
71
+ this.insertTextAtCursor(accepted);
72
+ }
73
+ this.lastTextSeen = this.getText();
74
+ return;
75
+ }
76
+ if (this.ghostText && !matchesKey(data, "right")) {
77
+ this.finalizeShown("dismissed");
78
+ this.clearGhost();
79
+ }
80
+ super.handleInput(data);
81
+ // Detect text changes here instead of wrapping `onChange`, so a host
82
+ // that assigns its own `onChange` after construction never disables us.
83
+ const text = this.getText();
84
+ if (text !== this.lastTextSeen) {
85
+ this.lastTextSeen = text;
86
+ this.handleTextChange(text);
87
+ }
88
+ }
89
+ render(width) {
90
+ const lines = super.render(width);
91
+ if (!this.shouldShowGhost())
92
+ return lines;
93
+ const ghost = this.ghostText;
94
+ if (!ghost)
95
+ return lines;
96
+ // Replace-mode ghost text doesn't extend the typed token, so prefix with
97
+ // a marker to signal "Right Arrow replaces what you typed with this".
98
+ const display = this.ghostReplaceFrom ? `→ ${ghost}` : ghost;
99
+ for (let i = 0; i < lines.length; i++) {
100
+ const line = lines[i];
101
+ if (!line)
102
+ continue;
103
+ const idx = line.indexOf(CURSOR_MARKER);
104
+ if (idx < 0)
105
+ continue;
106
+ const before = line.slice(0, idx + CURSOR_MARKER.length);
107
+ const after = line.slice(idx + CURSOR_MARKER.length);
108
+ const usedCols = visualWidth(line.slice(0, idx));
109
+ // Reserve 1 column for cursor, 1 for safety margin.
110
+ const remaining = width - usedCols - 2;
111
+ if (remaining <= 0)
112
+ return lines;
113
+ const fitted = clipToWidth(display, remaining);
114
+ if (!fitted)
115
+ return lines;
116
+ // Truncate to terminal width – the `after` portion contains padding that was
117
+ // computed before ghost text insertion, so the combined line can exceed `width`.
118
+ lines[i] = truncateToWidth(`${before}${DIM_OPEN}${fitted}${DIM_CLOSE}${after}`, width, "");
119
+ break;
120
+ }
121
+ return lines;
122
+ }
123
+ cursorAtEnd() {
124
+ const cursor = this.getCursor();
125
+ const lines = this.getText().split("\n");
126
+ if (cursor.line !== lines.length - 1)
127
+ return false;
128
+ const last = lines[lines.length - 1] ?? "";
129
+ return cursor.col >= last.length;
130
+ }
131
+ shouldShowGhost() {
132
+ if (!this.config.enabled)
133
+ return false;
134
+ if (!this.ghostText)
135
+ return false;
136
+ if (this.isShowingAutocomplete())
137
+ return false;
138
+ return this.getText() === this.ghostForText;
139
+ }
140
+ clearGhost() {
141
+ this.cancelInflight();
142
+ if (this.debounceTimer) {
143
+ clearTimeout(this.debounceTimer);
144
+ this.debounceTimer = null;
145
+ }
146
+ if (this.ghostText !== null) {
147
+ this.ghostText = null;
148
+ this.ghostForText = "";
149
+ this.ghostReplaceFrom = null;
150
+ this.invalidate();
151
+ }
152
+ }
153
+ cancelInflight() {
154
+ if (this.inflight) {
155
+ this.inflight.abort();
156
+ this.inflight = null;
157
+ }
158
+ }
159
+ handleTextChange(text) {
160
+ if (this.disposed)
161
+ return;
162
+ this.cancelInflight();
163
+ if (this.ghostText && text !== this.ghostForText) {
164
+ this.finalizeShown("stale");
165
+ this.clearGhost();
166
+ }
167
+ if (!this.config.enabled)
168
+ return;
169
+ if (!this.cursorAtEnd())
170
+ return;
171
+ if (this.tryDeterministic(text))
172
+ return;
173
+ if (!this.provider)
174
+ return;
175
+ const trimmed = text.trimEnd();
176
+ const lastLine = trimmed.split("\n").pop() ?? "";
177
+ if (stringWidth(lastLine) < this.config.minChars)
178
+ return;
179
+ if (stringWidth(lastLine) > this.config.maxLineLength)
180
+ return;
181
+ if (this.debounceTimer)
182
+ clearTimeout(this.debounceTimer);
183
+ const debounce = this.provider.debounceMs;
184
+ this.debounceTimer = setTimeout(() => {
185
+ this.debounceTimer = null;
186
+ void this.requestPrediction(text);
187
+ }, debounce);
188
+ }
189
+ tryDeterministic(text) {
190
+ if (!this.pathIndex)
191
+ return false;
192
+ if (this.isShowingAutocomplete())
193
+ return false;
194
+ const cursor = this.getCursor();
195
+ const lines = text.split("\n");
196
+ const lineText = lines[cursor.line] ?? "";
197
+ const partial = lineText.slice(0, cursor.col);
198
+ const startedAt = Date.now();
199
+ const recentPaths = this.getRecentPaths();
200
+ const pathTok = extractPathPrefixToken(partial);
201
+ if (pathTok) {
202
+ const m = findPathPrefix(this.pathIndex, pathTok.token, { recentPaths });
203
+ if (m) {
204
+ this.applyDeterministic(text, m.suffix, null, "path-prefix", m.match, startedAt);
205
+ return true;
206
+ }
207
+ }
208
+ const fuzTok = extractFuzzyToken(lineText, cursor.col);
209
+ if (!fuzTok)
210
+ return false;
211
+ const fm = findFuzzyFilename(this.pathIndex, fuzTok.token, { recentPaths });
212
+ if (!fm)
213
+ return false;
214
+ if (fm.score < 70)
215
+ return false;
216
+ if (fm.score < 85 && !fuzTok.hasActionTrigger)
217
+ return false;
218
+ const replaceFrom = fm.replace
219
+ ? { line: cursor.line, col: fuzTok.startCol }
220
+ : null;
221
+ this.applyDeterministic(text, fm.ghost, replaceFrom, bandToProvider(fm.band), fm.match, startedAt);
222
+ return true;
223
+ }
224
+ getRecentPaths() {
225
+ const now = Date.now();
226
+ if (now - this.recentPathsAt < RECENT_PATHS_TTL_MS)
227
+ return this.recentPaths;
228
+ const msgs = getRoleWeightedRecent(this.extCtx, RECENT_USER_MAX, RECENT_ASSISTANT_MAX);
229
+ this.recentPaths = extractRecentPaths(msgs);
230
+ this.recentPathsAt = now;
231
+ return this.recentPaths;
232
+ }
233
+ applyDeterministic(text, ghost, replaceFrom, providerName, matchedPath, startedAt) {
234
+ const latencyMs = Date.now() - startedAt;
235
+ this.ghostText = ghost;
236
+ this.ghostForText = text;
237
+ this.ghostReplaceFrom = replaceFrom;
238
+ if (this.metrics) {
239
+ this.shownMetric = {
240
+ requestId: this.metrics.newRequestId(),
241
+ startedAt,
242
+ providerName,
243
+ mode: "deterministic",
244
+ latencyMs,
245
+ completion: ghost,
246
+ matchedPath,
247
+ };
248
+ }
249
+ this.invalidate();
250
+ }
251
+ replaceTokenAtCursor(from, replacement) {
252
+ const cur = this.getCursor();
253
+ // Deterministic trigger required cursorAtEnd; the token sits at the end
254
+ // of the current (last) line, so `from.col..cur.col` is the slice to
255
+ // replace and there is no trailing text to preserve.
256
+ if (cur.line !== from.line) {
257
+ // Should not happen given trigger constraints; fall back to append.
258
+ this.insertTextAtCursor(replacement);
259
+ return;
260
+ }
261
+ this.setText(computeReplacement(this.getText(), from, replacement));
262
+ }
263
+ async requestPrediction(textAtSchedule) {
264
+ if (this.disposed || !this.provider)
265
+ return;
266
+ if (this.getText() !== textAtSchedule)
267
+ return;
268
+ const providerAtSchedule = this.provider;
269
+ const ctrl = new AbortController();
270
+ this.inflight = ctrl;
271
+ const pending = this.metrics
272
+ ? {
273
+ requestId: this.metrics.newRequestId(),
274
+ startedAt: Date.now(),
275
+ providerName: providerAtSchedule.name,
276
+ mode: "llm",
277
+ }
278
+ : null;
279
+ try {
280
+ const recent = getRecentMessages(this.extCtx, this.config.provider.maxRecentMessages);
281
+ const cursor = this.getCursor();
282
+ const lines = textAtSchedule.split("\n");
283
+ const headLines = lines.slice(0, cursor.line);
284
+ const partial = (lines[cursor.line] ?? "").slice(0, cursor.col);
285
+ const before = [...headLines, partial].join("\n");
286
+ const result = await providerAtSchedule.predict({
287
+ editorText: textAtSchedule,
288
+ editorTextBeforeCursor: before,
289
+ recentMessages: recent,
290
+ cwd: this.extCtx.cwd,
291
+ signal: ctrl.signal,
292
+ });
293
+ const latencyMs = pending ? Date.now() - pending.startedAt : 0;
294
+ const trace = providerAtSchedule instanceof RaceProvider ? providerAtSchedule.consumeLastTrace() : null;
295
+ if (this.inflight !== ctrl) {
296
+ this.emitMetric(pending, "aborted", undefined, latencyMs, undefined, trace);
297
+ return;
298
+ }
299
+ this.inflight = null;
300
+ if (this.disposed) {
301
+ this.emitMetric(pending, "aborted", undefined, latencyMs, undefined, trace);
302
+ return;
303
+ }
304
+ if (this.provider !== providerAtSchedule) {
305
+ this.emitMetric(pending, "aborted", undefined, latencyMs, undefined, trace);
306
+ return;
307
+ }
308
+ if (this.getText() !== textAtSchedule) {
309
+ this.emitMetric(pending, "rejected", undefined, latencyMs, "stale-text", trace);
310
+ return;
311
+ }
312
+ if (!result) {
313
+ this.emitMetric(pending, "empty", undefined, latencyMs, undefined, trace);
314
+ return;
315
+ }
316
+ this.ghostText = result;
317
+ this.ghostForText = textAtSchedule;
318
+ if (pending) {
319
+ pending.completion = result;
320
+ pending.latencyMs = latencyMs;
321
+ pending.trace = trace;
322
+ this.shownMetric = pending;
323
+ }
324
+ this.invalidate();
325
+ }
326
+ catch (err) {
327
+ if (this.inflight === ctrl)
328
+ this.inflight = null;
329
+ const latencyMs = pending ? Date.now() - pending.startedAt : 0;
330
+ const aborted = err?.name === "AbortError";
331
+ const trace = providerAtSchedule instanceof RaceProvider ? providerAtSchedule.consumeLastTrace() : null;
332
+ this.emitMetric(pending, aborted ? "aborted" : "error", undefined, latencyMs, undefined, trace);
333
+ if (!aborted && this.onError && err instanceof Error) {
334
+ this.onError(err);
335
+ }
336
+ }
337
+ }
338
+ emitMetric(pending, result, completion, latencyMs, rejectionReason, trace) {
339
+ if (!this.metrics || !pending)
340
+ return;
341
+ // When a race trace exists, trust it verbatim — even an empty
342
+ // `providers: []` (e.g. cooldown skip) is meaningful: no members ran.
343
+ // Synthesizing a synthetic ghost-race entry here would otherwise
344
+ // attribute "empty" results to the race name and skew bench stats.
345
+ const providers = trace
346
+ ? trace.providers
347
+ : [
348
+ {
349
+ provider: pending.providerName,
350
+ latencyMs,
351
+ result,
352
+ rejectionReason,
353
+ },
354
+ ];
355
+ this.metrics.logMetric({
356
+ ts: Date.now(),
357
+ requestId: pending.requestId,
358
+ mode: pending.mode,
359
+ providers,
360
+ winner: trace?.winner ?? (result === "produced" ? pending.providerName : undefined),
361
+ result,
362
+ rejectionReason,
363
+ completionLength: completion?.length,
364
+ shown: false,
365
+ });
366
+ }
367
+ finalizeShown(outcome) {
368
+ const m = this.shownMetric;
369
+ this.shownMetric = null;
370
+ if (!this.metrics || !m)
371
+ return;
372
+ const providers = m.trace
373
+ ? m.trace.providers
374
+ : [
375
+ {
376
+ provider: m.providerName,
377
+ latencyMs: m.latencyMs ?? 0,
378
+ result: "produced",
379
+ },
380
+ ];
381
+ this.metrics.logMetric({
382
+ ts: Date.now(),
383
+ requestId: m.requestId,
384
+ mode: m.mode,
385
+ providers,
386
+ winner: m.trace?.winner ?? m.providerName,
387
+ result: "produced",
388
+ completionLength: m.completion?.length,
389
+ shown: true,
390
+ acceptance: outcome,
391
+ matchedPath: m.matchedPath,
392
+ });
393
+ }
394
+ }
395
+ function bandToProvider(band) {
396
+ switch (band) {
397
+ case "basename-prefix":
398
+ return "basename-prefix";
399
+ case "fuzzy-basename":
400
+ return "fuzzy-basename";
401
+ case "fuzzy-path":
402
+ return "fuzzy-path";
403
+ }
404
+ }
405
+ /**
406
+ * Pure helper: replace the slice `[from.col, end-of-line]` on `from.line` of
407
+ * `text` with `replacement`. Exported for testability.
408
+ *
409
+ * Caller must guarantee the cursor sits at end of `from.line` and that the
410
+ * replacement is intended to land there; this helper does not validate.
411
+ */
412
+ export function computeReplacement(text, from, replacement) {
413
+ const lines = text.split("\n");
414
+ const line = lines[from.line] ?? "";
415
+ lines[from.line] = line.slice(0, from.col) + replacement;
416
+ return lines.join("\n");
417
+ }
418
+ /**
419
+ * Visible column width of a possibly-ANSI-colored string.
420
+ * Uses string-width which handles wide chars, combining marks, and emoji.
421
+ */
422
+ export function visualWidth(s) {
423
+ return stringWidth(stripAnsi(s));
424
+ }
425
+ /**
426
+ * Clip a string to fit in `maxCols` terminal columns, grapheme-aware.
427
+ * Returns the empty string if `maxCols <= 0` or no characters fit.
428
+ */
429
+ export function clipToWidth(s, maxCols) {
430
+ if (maxCols <= 0)
431
+ return "";
432
+ if (stringWidth(s) <= maxCols)
433
+ return s;
434
+ let out = "";
435
+ let used = 0;
436
+ for (const { segment } of GRAPHEME_SEGMENTER.segment(s)) {
437
+ const w = stringWidth(segment);
438
+ if (used + w > maxCols)
439
+ break;
440
+ out += segment;
441
+ used += w;
442
+ }
443
+ return out;
444
+ }
445
+ //# sourceMappingURL=ghost-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghost-editor.js","sourceRoot":"","sources":["../src/ghost-editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
+ declare const ghost: ExtensionFactory;
3
+ export default ghost;
4
+ export { CloudProvider } from "./providers/cloud-provider.js";
5
+ export { LocalProvider } from "./providers/local-provider.js";
6
+ export { OpenAICompatProvider } from "./providers/openai-compat-provider.js";
7
+ export type { PreflightResult } from "./providers/openai-compat-provider.js";
8
+ export { RaceProvider, firstNonNull } from "./providers/race.js";
9
+ export type { RaceConfig, RaceTrace } from "./providers/race.js";
10
+ export { GhostEditor, computeReplacement } from "./ghost-editor.js";
11
+ export type { GhostConfig, ProviderConfig, CloudProviderConfig, LocalProviderConfig, OpenAICompatProviderConfig, RaceProviderConfig } from "./config.js";
12
+ export type { GhostProvider, GhostRequest } from "./providers/types.js";
13
+ export { MetricsLogger, readMetricsConfigFromEnv } from "./metrics.js";
14
+ export type { MetricsRecord, MetricsConfig, RequestResult, AcceptanceOutcome, ProviderLatency, RejectionReason, CompletionMode } from "./metrics.js";
15
+ export { buildPathIndex } from "./path-index.js";
16
+ export type { PathIndex } from "./path-index.js";
17
+ export { extractPathPrefixToken, findPathPrefix } from "./path-matcher.js";
18
+ export type { PathPrefixMatch, PathToken } from "./path-matcher.js";
19
+ export { extractFuzzyToken, findFuzzyFilename, hasActionTrigger } from "./fuzzy-matcher.js";
20
+ export type { FuzzyBand, FuzzyMatch, FuzzyToken, FindFuzzyOptions } from "./fuzzy-matcher.js";
21
+ export type { FindPathPrefixOptions } from "./path-matcher.js";
22
+ export { extractRecentPaths, getRoleWeightedRecent, recentBoost } from "./recent-paths.js";
23
+ export { formatReport, loadMetrics, parseMetricsText, quantile, runBenchmark, summarize, THRESHOLDS, } from "./bench.js";
24
+ export type { BenchmarkReport, ModeStats, ProviderStats } from "./bench.js";
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAWxG,QAAA,MAAM,KAAK,EAAE,gBAgEZ,CAAC;AAyJF,eAAe,KAAK,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzJ,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrJ,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3E,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EACN,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,UAAU,GACV,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}