@vitest-agent/ui 4.1.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +3 -3
  2. package/dispatcher/cells/single-file-fail.js +1 -5
  3. package/dispatcher/cells/single-file-pass.js +1 -5
  4. package/dispatcher/cells/single-file-threshold.js +1 -5
  5. package/dispatcher/cells/single-project-fail.js +1 -5
  6. package/dispatcher/cells/single-project-pass.js +1 -5
  7. package/dispatcher/cells/single-project-threshold.js +1 -5
  8. package/dispatcher/cells/single-test-fail.js +1 -5
  9. package/dispatcher/cells/single-test-pass.js +1 -5
  10. package/dispatcher/cells/workspace-fail.js +1 -5
  11. package/dispatcher/cells/workspace-pass.js +1 -5
  12. package/dispatcher/cells/workspace-threshold.js +1 -5
  13. package/dispatcher/dispatch.js +20 -25
  14. package/index.d.ts +45 -316
  15. package/index.js +4 -17
  16. package/{render-ink → ink}/CountColumns.js +2 -2
  17. package/{render-ink → ink}/CoverageBlock.js +2 -2
  18. package/{render-ink → ink}/FailureSection.js +2 -2
  19. package/{render-ink → ink}/FailuresSection.js +2 -2
  20. package/{render-ink → ink}/ModuleHeader.js +1 -1
  21. package/{render-ink → ink}/ProjectRow.js +1 -1
  22. package/{render-ink → ink}/StatusIcon.js +2 -2
  23. package/{render-ink → ink}/StreamApp.js +14 -5
  24. package/{render-ink → ink}/SuggestedActions.js +2 -2
  25. package/{render-ink → ink}/TagColumns.js +1 -1
  26. package/{render-ink → ink}/TestRow.js +1 -1
  27. package/{render-ink → ink}/TrendLine.js +2 -2
  28. package/ink/dispatch-ink.js +61 -0
  29. package/{dispatcher → ink}/ink-helpers.js +1 -1
  30. package/ink.d.ts +789 -0
  31. package/ink.js +15 -0
  32. package/package.json +12 -7
  33. package/reducer.js +2 -1
  34. package/render-agent.js +2 -0
  35. package/{render-ink/spinner.js → spinner.js} +1 -1
  36. package/synthesize.js +2 -1
  37. package/render-ink/index.js +0 -15
package/ink.d.ts ADDED
@@ -0,0 +1,789 @@
1
+ import { Schema } from "effect";
2
+ import { FC, ReactElement } from "react";
3
+ //#region ../sdk/dist/dev/pkg/index.d.ts
4
+ /**
5
+ * Per-file coverage data including uncovered line ranges.
6
+ * @public
7
+ */
8
+ declare const FileCoverageReport: Schema.Struct<{
9
+ readonly file: Schema.String;
10
+ readonly summary: Schema.Struct<{
11
+ readonly statements: Schema.Number;
12
+ readonly branches: Schema.Number;
13
+ readonly functions: Schema.Number;
14
+ readonly lines: Schema.Number;
15
+ }>;
16
+ readonly uncoveredLines: Schema.String;
17
+ }>;
18
+ /** @public */
19
+ type FileCoverageReport = typeof FileCoverageReport.Type;
20
+ //#endregion
21
+ //#region src/schemas/RenderState.d.ts
22
+ /**
23
+ * Per-test record accumulated as `TestStarted` / `TestFinished` events arrive.
24
+ * @public
25
+ */
26
+ declare const TestRecord: Schema.Struct<{
27
+ readonly testName: Schema.String;
28
+ readonly suitePath: Schema.$Array<Schema.String>;
29
+ readonly status: Schema.Union<readonly [Schema.Literals<readonly ["passed", "failed", "skipped", "pending"]>, Schema.Literals<readonly ["running", "timed-out"]>]>;
30
+ readonly durationMs: Schema.NullOr<Schema.Number>;
31
+ readonly error: Schema.optional<Schema.Struct<{
32
+ readonly message: Schema.String;
33
+ readonly stack: Schema.optional<Schema.String>;
34
+ readonly diff: Schema.optional<Schema.String>;
35
+ readonly expected: Schema.optional<Schema.String>;
36
+ readonly received: Schema.optional<Schema.String>;
37
+ }>>;
38
+ }>;
39
+ /** @public */
40
+ type TestRecord = typeof TestRecord.Type;
41
+ /**
42
+ * Per-module aggregation. The reducer keeps modules keyed on
43
+ * `modulePath` so out-of-order events can update the right slot.
44
+ * @public
45
+ */
46
+ declare const ModuleRecord: Schema.Struct<{
47
+ readonly modulePath: Schema.String;
48
+ readonly status: Schema.Literals<readonly ["queued", "running", "finished"]>;
49
+ readonly passCount: Schema.Number;
50
+ readonly failCount: Schema.Number;
51
+ readonly skipCount: Schema.Number;
52
+ readonly timeoutCount: Schema.Number;
53
+ readonly durationMs: Schema.Number;
54
+ readonly tests: Schema.$Array<Schema.Struct<{
55
+ readonly testName: Schema.String;
56
+ readonly suitePath: Schema.$Array<Schema.String>;
57
+ readonly status: Schema.Union<readonly [Schema.Literals<readonly ["passed", "failed", "skipped", "pending"]>, Schema.Literals<readonly ["running", "timed-out"]>]>;
58
+ readonly durationMs: Schema.NullOr<Schema.Number>;
59
+ readonly error: Schema.optional<Schema.Struct<{
60
+ readonly message: Schema.String;
61
+ readonly stack: Schema.optional<Schema.String>;
62
+ readonly diff: Schema.optional<Schema.String>;
63
+ readonly expected: Schema.optional<Schema.String>;
64
+ readonly received: Schema.optional<Schema.String>;
65
+ }>>;
66
+ }>>;
67
+ /**
68
+ * Owning Vitest project name. Optional — events from project-less
69
+ * configs or older replays leave it `undefined`, which the renderer
70
+ * treats as a single anonymous project.
71
+ */
72
+ readonly projectName: Schema.optional<Schema.String>;
73
+ /**
74
+ * ISO wall-clock stamp captured at `onTestModuleStart`. The live
75
+ * renderer derives a ticking elapsed column from it while the module
76
+ * runs; once finished it shows `durationMs` instead. Optional — a
77
+ * module seeded by `ModuleQueued` (or replayed) has no start stamp.
78
+ */
79
+ readonly startedAt: Schema.optional<Schema.String>;
80
+ readonly tagCounts: Schema.optional<Schema.$Record<Schema.String, Schema.Number>>;
81
+ }>;
82
+ /** @public */
83
+ type ModuleRecord = typeof ModuleRecord.Type;
84
+ /**
85
+ * One row in the failure list. A failure can exist before its
86
+ * classification arrives (`FailureClassified` is emitted from a
87
+ * separate pipeline), so `classification` is nullable.
88
+ * @public
89
+ */
90
+ declare const FailureRecord: Schema.Struct<{
91
+ readonly modulePath: Schema.String;
92
+ readonly testName: Schema.String;
93
+ readonly suitePath: Schema.$Array<Schema.String>;
94
+ readonly error: Schema.optional<Schema.Struct<{
95
+ readonly message: Schema.String;
96
+ readonly stack: Schema.optional<Schema.String>;
97
+ readonly diff: Schema.optional<Schema.String>;
98
+ readonly expected: Schema.optional<Schema.String>;
99
+ readonly received: Schema.optional<Schema.String>;
100
+ }>>;
101
+ readonly timedOut: Schema.optional<Schema.Boolean>;
102
+ readonly classification: Schema.NullOr<Schema.Literals<readonly ["stable", "new-failure", "persistent", "flaky", "recovered"]>>;
103
+ }>;
104
+ /** @public */
105
+ type FailureRecord = typeof FailureRecord.Type;
106
+ /**
107
+ * Coverage block, populated only after `CoverageReady`. Threshold
108
+ * violations are accumulated separately as they arrive.
109
+ * @public
110
+ */
111
+ declare const CoverageRenderState: Schema.Struct<{
112
+ readonly metrics: Schema.Struct<{
113
+ readonly statements: Schema.Number;
114
+ readonly branches: Schema.Number;
115
+ readonly functions: Schema.Number;
116
+ readonly lines: Schema.Number;
117
+ }>;
118
+ readonly thresholds: Schema.Struct<{
119
+ readonly lines: Schema.optional<Schema.Number>;
120
+ readonly functions: Schema.optional<Schema.Number>;
121
+ readonly branches: Schema.optional<Schema.Number>;
122
+ readonly statements: Schema.optional<Schema.Number>;
123
+ }>;
124
+ readonly gaps: Schema.$Array<Schema.Struct<{
125
+ readonly file: Schema.String;
126
+ readonly missing: Schema.Struct<{
127
+ readonly statements: Schema.Number;
128
+ readonly branches: Schema.Number;
129
+ readonly functions: Schema.Number;
130
+ readonly lines: Schema.Number;
131
+ }>;
132
+ readonly uncoveredLines: Schema.optional<Schema.String>;
133
+ }>>;
134
+ readonly violations: Schema.$Array<Schema.Struct<{
135
+ readonly metric: Schema.Literals<readonly ["lines", "branches", "functions", "statements"]>;
136
+ readonly expected: Schema.Number;
137
+ readonly actual: Schema.Number;
138
+ }>>;
139
+ readonly scoped: Schema.optional<Schema.Boolean>;
140
+ readonly scopedFiles: Schema.optional<Schema.Number>;
141
+ readonly totalFiles: Schema.optional<Schema.Number>;
142
+ readonly globShortfalls: Schema.optional<Schema.$Array<Schema.Struct<{
143
+ readonly pattern: Schema.String;
144
+ readonly summary: Schema.Struct<{
145
+ readonly statements: Schema.Number;
146
+ readonly branches: Schema.Number;
147
+ readonly functions: Schema.Number;
148
+ readonly lines: Schema.Number;
149
+ }>;
150
+ readonly thresholds: Schema.Struct<{
151
+ readonly lines: Schema.optional<Schema.Number>;
152
+ readonly functions: Schema.optional<Schema.Number>;
153
+ readonly branches: Schema.optional<Schema.Number>;
154
+ readonly statements: Schema.optional<Schema.Number>;
155
+ }>;
156
+ }>>>;
157
+ }>;
158
+ /** @public */
159
+ type CoverageRenderState = typeof CoverageRenderState.Type;
160
+ /**
161
+ * A `SuggestedAction` event, denormalized into the queue the renderer reads.
162
+ * @public
163
+ */
164
+ declare const SuggestedActionRecord: Schema.Struct<{
165
+ readonly severity: Schema.Literals<readonly ["info", "warn", "blocker"]>;
166
+ readonly title: Schema.String;
167
+ readonly detail: Schema.String;
168
+ readonly targetTool: Schema.optional<Schema.String>;
169
+ }>;
170
+ /** @public */
171
+ type SuggestedActionRecord = typeof SuggestedActionRecord.Type;
172
+ /**
173
+ * The renderer state. Both the human (Ink) and agent (string)
174
+ * renderers read this shape; the reducer is the only producer.
175
+ *
176
+ * `phase` is the layout discriminator — agent mode emits one final
177
+ * frame when `phase === "finished"`; human mode redraws at every
178
+ * state change. `"timed-out"` is a terminal phase like `"finished"`
179
+ * — the run is over, but it ended because `onProcessTimeout` fired
180
+ * rather than the suite completing.
181
+ * @public
182
+ */
183
+ declare const RenderState: Schema.Struct<{
184
+ readonly phase: Schema.Literals<readonly ["idle", "running", "finished", "timed-out"]>;
185
+ readonly runId: Schema.NullOr<Schema.String>;
186
+ readonly configHash: Schema.NullOr<Schema.String>;
187
+ readonly startedAt: Schema.NullOr<Schema.String>;
188
+ readonly finishedAt: Schema.NullOr<Schema.String>;
189
+ readonly modules: Schema.$Record<Schema.String, Schema.Struct<{
190
+ readonly modulePath: Schema.String;
191
+ readonly status: Schema.Literals<readonly ["queued", "running", "finished"]>;
192
+ readonly passCount: Schema.Number;
193
+ readonly failCount: Schema.Number;
194
+ readonly skipCount: Schema.Number;
195
+ readonly timeoutCount: Schema.Number;
196
+ readonly durationMs: Schema.Number;
197
+ readonly tests: Schema.$Array<Schema.Struct<{
198
+ readonly testName: Schema.String;
199
+ readonly suitePath: Schema.$Array<Schema.String>;
200
+ readonly status: Schema.Union<readonly [Schema.Literals<readonly ["passed", "failed", "skipped", "pending"]>, Schema.Literals<readonly ["running", "timed-out"]>]>;
201
+ readonly durationMs: Schema.NullOr<Schema.Number>;
202
+ readonly error: Schema.optional<Schema.Struct<{
203
+ readonly message: Schema.String;
204
+ readonly stack: Schema.optional<Schema.String>;
205
+ readonly diff: Schema.optional<Schema.String>;
206
+ readonly expected: Schema.optional<Schema.String>;
207
+ readonly received: Schema.optional<Schema.String>;
208
+ }>>;
209
+ }>>;
210
+ /**
211
+ * Owning Vitest project name. Optional — events from project-less
212
+ * configs or older replays leave it `undefined`, which the renderer
213
+ * treats as a single anonymous project.
214
+ */
215
+ readonly projectName: Schema.optional<Schema.String>;
216
+ /**
217
+ * ISO wall-clock stamp captured at `onTestModuleStart`. The live
218
+ * renderer derives a ticking elapsed column from it while the module
219
+ * runs; once finished it shows `durationMs` instead. Optional — a
220
+ * module seeded by `ModuleQueued` (or replayed) has no start stamp.
221
+ */
222
+ readonly startedAt: Schema.optional<Schema.String>;
223
+ readonly tagCounts: Schema.optional<Schema.$Record<Schema.String, Schema.Number>>;
224
+ }>>;
225
+ readonly moduleOrder: Schema.$Array<Schema.String>;
226
+ readonly totals: Schema.Struct<{
227
+ readonly passCount: Schema.Number;
228
+ readonly failCount: Schema.Number;
229
+ readonly skipCount: Schema.Number;
230
+ readonly timeoutCount: Schema.Number;
231
+ readonly durationMs: Schema.Number;
232
+ }>;
233
+ readonly coverage: Schema.NullOr<Schema.Struct<{
234
+ readonly metrics: Schema.Struct<{
235
+ readonly statements: Schema.Number;
236
+ readonly branches: Schema.Number;
237
+ readonly functions: Schema.Number;
238
+ readonly lines: Schema.Number;
239
+ }>;
240
+ readonly thresholds: Schema.Struct<{
241
+ readonly lines: Schema.optional<Schema.Number>;
242
+ readonly functions: Schema.optional<Schema.Number>;
243
+ readonly branches: Schema.optional<Schema.Number>;
244
+ readonly statements: Schema.optional<Schema.Number>;
245
+ }>;
246
+ readonly gaps: Schema.$Array<Schema.Struct<{
247
+ readonly file: Schema.String;
248
+ readonly missing: Schema.Struct<{
249
+ readonly statements: Schema.Number;
250
+ readonly branches: Schema.Number;
251
+ readonly functions: Schema.Number;
252
+ readonly lines: Schema.Number;
253
+ }>;
254
+ readonly uncoveredLines: Schema.optional<Schema.String>;
255
+ }>>;
256
+ readonly violations: Schema.$Array<Schema.Struct<{
257
+ readonly metric: Schema.Literals<readonly ["lines", "branches", "functions", "statements"]>;
258
+ readonly expected: Schema.Number;
259
+ readonly actual: Schema.Number;
260
+ }>>;
261
+ readonly scoped: Schema.optional<Schema.Boolean>;
262
+ readonly scopedFiles: Schema.optional<Schema.Number>;
263
+ readonly totalFiles: Schema.optional<Schema.Number>;
264
+ readonly globShortfalls: Schema.optional<Schema.$Array<Schema.Struct<{
265
+ readonly pattern: Schema.String;
266
+ readonly summary: Schema.Struct<{
267
+ readonly statements: Schema.Number;
268
+ readonly branches: Schema.Number;
269
+ readonly functions: Schema.Number;
270
+ readonly lines: Schema.Number;
271
+ }>;
272
+ readonly thresholds: Schema.Struct<{
273
+ readonly lines: Schema.optional<Schema.Number>;
274
+ readonly functions: Schema.optional<Schema.Number>;
275
+ readonly branches: Schema.optional<Schema.Number>;
276
+ readonly statements: Schema.optional<Schema.Number>;
277
+ }>;
278
+ }>>>;
279
+ }>>;
280
+ readonly trend: Schema.NullOr<Schema.Struct<{
281
+ readonly direction: Schema.Literals<readonly ["improving", "regressing", "stable"]>;
282
+ readonly runCount: Schema.Number;
283
+ }>>;
284
+ readonly failures: Schema.$Array<Schema.Struct<{
285
+ readonly modulePath: Schema.String;
286
+ readonly testName: Schema.String;
287
+ readonly suitePath: Schema.$Array<Schema.String>;
288
+ readonly error: Schema.optional<Schema.Struct<{
289
+ readonly message: Schema.String;
290
+ readonly stack: Schema.optional<Schema.String>;
291
+ readonly diff: Schema.optional<Schema.String>;
292
+ readonly expected: Schema.optional<Schema.String>;
293
+ readonly received: Schema.optional<Schema.String>;
294
+ }>>;
295
+ readonly timedOut: Schema.optional<Schema.Boolean>;
296
+ readonly classification: Schema.NullOr<Schema.Literals<readonly ["stable", "new-failure", "persistent", "flaky", "recovered"]>>;
297
+ }>>;
298
+ readonly suggestedActions: Schema.$Array<Schema.Struct<{
299
+ readonly severity: Schema.Literals<readonly ["info", "warn", "blocker"]>;
300
+ readonly title: Schema.String;
301
+ readonly detail: Schema.String;
302
+ readonly targetTool: Schema.optional<Schema.String>;
303
+ }>>;
304
+ /**
305
+ * Count of every collected module, passing modules included. Folded
306
+ * from `RunFinished.collectedModules`. Renderers prefer this over
307
+ * `moduleOrder.length` for "N modules all-passed" copy — a report
308
+ * replay only queues failing modules, so `moduleOrder` alone
309
+ * undercounts a green run to zero (issue #204). Optional — a run
310
+ * that never carried the field (older replay data, hand-built
311
+ * fixtures) falls back to `moduleOrder.length`.
312
+ */
313
+ readonly collectedModules: Schema.optional<Schema.Number>;
314
+ /**
315
+ * Process-level errors with no owning module, folded from
316
+ * `RunFinished.unhandledErrors`. A run that never carried the field
317
+ * (older replay data, hand-built fixtures) defaults to `[]`. See
318
+ * issue #240.
319
+ */
320
+ readonly unhandledErrors: Schema.$Array<Schema.Struct<{
321
+ readonly message: Schema.String;
322
+ readonly stack: Schema.optional<Schema.String>;
323
+ readonly diff: Schema.optional<Schema.String>;
324
+ readonly expected: Schema.optional<Schema.String>;
325
+ readonly received: Schema.optional<Schema.String>;
326
+ }>>;
327
+ /**
328
+ * What the run wrote straight to the terminal, past Vitest's console
329
+ * capture, folded from `RunFinished.strayOutput`. Absent when the run
330
+ * wrote nothing stray.
331
+ */
332
+ readonly strayOutput: Schema.optional<Schema.Struct<{
333
+ readonly total: Schema.Number;
334
+ readonly stdout: Schema.Number;
335
+ readonly stderr: Schema.Number;
336
+ readonly bytes: Schema.Number;
337
+ readonly samples: Schema.$Array<Schema.Struct<{
338
+ readonly stream: Schema.Literals<readonly ["stdout", "stderr"]>;
339
+ readonly text: Schema.String;
340
+ }>>;
341
+ }>>;
342
+ }>;
343
+ /** @public */
344
+ type RenderState = typeof RenderState.Type;
345
+ //#endregion
346
+ //#region src/contracts/dispatcher.d.ts
347
+ /**
348
+ * The four run shapes the dispatcher distinguishes.
349
+ *
350
+ * Computed once per run from the reduced state's module count, the
351
+ * distinct-project count (carried via {@link DispatchInputs.projects}),
352
+ * and the test count inside each module.
353
+ *
354
+ * - `single-test` — exactly one test by name across the run.
355
+ * - `single-file` — exactly one module, more than one test.
356
+ * - `single-project` — one project, more than one module.
357
+ * - `workspace` — more than one project.
358
+ * @public
359
+ */
360
+ type RunShape = "single-test" | "single-file" | "single-project" | "workspace";
361
+ /**
362
+ * The three outcome classes the dispatcher distinguishes.
363
+ *
364
+ * - `all-pass` — `totals.failed === 0` and no coverage threshold violations.
365
+ * - `some-fail` — `totals.failed > 0`.
366
+ * - `threshold-violation` — `totals.failed === 0` and at least one coverage violation.
367
+ * @public
368
+ */
369
+ type RunOutcome = "all-pass" | "some-fail" | "threshold-violation";
370
+ /**
371
+ * Compact per-project aggregate carried into workspace cells.
372
+ *
373
+ * Populated by the plugin from `ReporterRenderInput.reports`. Empty for
374
+ * non-workspace shapes. `tagCounts`, `belowTarget`, and `violations` are
375
+ * optional — workspace cells render the columns only when present.
376
+ * @public
377
+ */
378
+ interface ProjectSummary {
379
+ readonly name: string;
380
+ readonly passCount: number;
381
+ readonly failCount: number;
382
+ readonly skipCount: number;
383
+ readonly durationMs: number;
384
+ readonly timeoutCount?: number;
385
+ readonly tagCounts?: Record<string, number>;
386
+ readonly belowTarget?: number;
387
+ readonly violations?: number;
388
+ }
389
+ /**
390
+ * Per-run trend direction handed to cells that surface a `Trend: …` line.
391
+ *
392
+ * Mirrors the inline `ReporterRenderInput.trendSummary` shape — promoted
393
+ * to a named type here so the dispatcher and its cells can pass it around
394
+ * without re-declaring it. The plugin populates this from
395
+ * `ReporterRenderInput.trendSummary` before invoking `dispatch`.
396
+ * @public
397
+ */
398
+ interface TrendSummary {
399
+ readonly direction: "improving" | "regressing" | "stable";
400
+ readonly runCount: number;
401
+ readonly firstMetric?: {
402
+ readonly name: string;
403
+ readonly from: number;
404
+ readonly to: number;
405
+ readonly target?: number;
406
+ };
407
+ }
408
+ /**
409
+ * Inputs each cell renderer reads to produce its output.
410
+ *
411
+ * `state` carries the post-reduce projection of the `RunEvent`
412
+ * stream. `shape` and `outcome` are the classified axes the dispatcher
413
+ * keyed on to reach this cell. The remaining fields are non-state
414
+ * helpers the plugin computes once before dispatch so cells stay pure.
415
+ * @public
416
+ */
417
+ interface DispatchInputs {
418
+ readonly state: RenderState;
419
+ readonly shape: RunShape;
420
+ readonly outcome: RunOutcome;
421
+ /**
422
+ * Per-project aggregates carried into workspace cells. Populated by
423
+ * the plugin from `ReporterRenderInput.reports`; empty for non-workspace
424
+ * shapes.
425
+ */
426
+ readonly projects: ReadonlyArray<ProjectSummary>;
427
+ /**
428
+ * Trend direction for cells that surface a `Trend: …` line. `null`
429
+ * for scoped runs and any run where trend history is unavailable.
430
+ */
431
+ readonly trend: TrendSummary | null;
432
+ /**
433
+ * Files below the aspirational `coverageTargets` tier. Workspace and
434
+ * project cells surface a truncated listing of these; single-file and
435
+ * single-test cells ignore them.
436
+ */
437
+ readonly belowTarget: ReadonlyArray<FileCoverageReport>;
438
+ /**
439
+ * Configured run command (e.g. `pnpm test`). Cell footers reference
440
+ * this so copy-pasted commands stay accurate. `null` when no command
441
+ * was configured.
442
+ */
443
+ readonly runCommand: string | null;
444
+ }
445
+ /**
446
+ * Render-time options threaded into each cell from the resolved
447
+ * `ReporterKit`. These are concerns the cell needs to format its
448
+ * output but that do not belong on the state-derived
449
+ * {@link DispatchInputs} struct.
450
+ *
451
+ * The plugin builds this once per run from the kit and passes it into
452
+ * `dispatch(inputs, opts)`. Cells destructure only what they consume.
453
+ * @public
454
+ */
455
+ interface CellOptions {
456
+ /**
457
+ * Resolved value of the `NO_COLOR` env var. Cells gate ANSI escape
458
+ * sequences and OSC-8 hyperlinks on this.
459
+ */
460
+ readonly noColor: boolean;
461
+ /**
462
+ * Pre-bound OSC-8 hyperlink helper. The plugin has already decided
463
+ * whether OSC-8 should be enabled (`target=stdout`, `!noColor`) so
464
+ * cells can call this directly without re-consulting the environment.
465
+ */
466
+ readonly osc8: (url: string, label: string) => string;
467
+ }
468
+ //#endregion
469
+ //#region src/ink/CountColumns.d.ts
470
+ /**
471
+ * Props for the `CountColumns` component.
472
+ *
473
+ * @public
474
+ */
475
+ interface CountColumnsProps {
476
+ /** Number of passing tests. */
477
+ readonly passCount: number;
478
+ /** Number of failing tests. */
479
+ readonly failCount: number;
480
+ /** Number of skipped tests. */
481
+ readonly skipCount: number;
482
+ /** Number of timed-out tests. */
483
+ readonly timeoutCount: number;
484
+ }
485
+ /**
486
+ * Fixed width of the duration cell that follows the count columns on an
487
+ * aggregate row — sized for the formatter's widest common output
488
+ * (`59m 59s`). Longer values overflow their row rather than truncate.
489
+ *
490
+ * @public
491
+ */
492
+ export declare const DURATION_CELL_WIDTH = 7;
493
+ /**
494
+ * Renders four colored count columns (pass ✓, fail ✗, skip ↷, timeout ⧖)
495
+ * for an aggregate row. Counts render right-aligned in fixed 4-digit cells so
496
+ * columns align across rows; counts of 10,000+ overflow their row without
497
+ * truncation. Zeros are greyed; all four columns always appear. Glyphs and
498
+ * colours come from `VitestAgentStatus` (skip is `muted`).
499
+ *
500
+ * @public
501
+ */
502
+ export declare const CountColumns: FC<CountColumnsProps>;
503
+ //#endregion
504
+ //#region src/ink/CoverageBlock.d.ts
505
+ /**
506
+ * Props for the `CoverageBlock` component.
507
+ *
508
+ * @public
509
+ */
510
+ interface CoverageBlockProps {
511
+ /** The coverage render state to display. */
512
+ readonly coverage: CoverageRenderState;
513
+ /** Maximum number of gap entries to list; defaults to 3. */
514
+ readonly maxGaps?: number;
515
+ }
516
+ /**
517
+ * Renders the coverage section: per-metric percentages, threshold
518
+ * violations, and top-N gap entries sorted by missing line count.
519
+ *
520
+ * @public
521
+ */
522
+ export declare const CoverageBlock: FC<CoverageBlockProps>;
523
+ //#endregion
524
+ //#region src/ink/dispatch-ink.d.ts
525
+ /**
526
+ * A cell's Ink half: pure function from dispatch inputs to a React
527
+ * element rendered to the terminal.
528
+ *
529
+ * @public
530
+ */
531
+ type InkCellFn = (inputs: DispatchInputs, opts: CellOptions) => ReactElement;
532
+ /**
533
+ * The 4×3 Ink cell table, keyed by the same `(RunShape, RunOutcome)`
534
+ * matrix as the root entry's `dispatcherTable`. An `undefined` entry is a
535
+ * cell with no Ink half (`single-test × threshold-violation`).
536
+ *
537
+ * @public
538
+ */
539
+ export declare const inkDispatcherTable: Readonly<Record<RunShape, Readonly<Record<RunOutcome, InkCellFn | undefined>>>>;
540
+ /**
541
+ * Dispatch to the cell that matches `(inputs.shape, inputs.outcome)`
542
+ * and return its Ink-half React tree, followed by the scoped-coverage
543
+ * note on a partial run. Returns `null` when the matched cell has no Ink
544
+ * half — callers fall back to the root entry's `dispatch` string then.
545
+ *
546
+ * @param inputs - the classified dispatch inputs
547
+ * @param opts - cell rendering options
548
+ * @returns the Ink React element, or `null` when the cell has no Ink half
549
+ * @public
550
+ */
551
+ export declare const dispatchInk: (inputs: DispatchInputs, opts: CellOptions) => ReactElement | null;
552
+ //#endregion
553
+ //#region src/ink/FailureSection.d.ts
554
+ /**
555
+ * Props for the `FailureSection` component.
556
+ *
557
+ * @public
558
+ */
559
+ interface FailureSectionProps {
560
+ /** The list of failure records to display. */
561
+ readonly failures: ReadonlyArray<FailureRecord>;
562
+ /** When `true`, renders the full stack trace under each failure. */
563
+ readonly includeStack?: boolean;
564
+ }
565
+ /**
566
+ * Renders one block per failed test: glyph, path, classification tag,
567
+ * error message, diff lines, and optionally the stack trace.
568
+ *
569
+ * @public
570
+ */
571
+ export declare const FailureSection: FC<FailureSectionProps>;
572
+ //#endregion
573
+ //#region src/ink/FailuresSection.d.ts
574
+ /**
575
+ * Props for the `FailuresSection` component.
576
+ *
577
+ * @public
578
+ */
579
+ interface FailuresSectionProps {
580
+ /** The list of failure records to display. */
581
+ readonly failures: ReadonlyArray<FailureRecord>;
582
+ /** Maximum entries to list before collapsing the rest into an overflow line. */
583
+ readonly limit: number;
584
+ }
585
+ /**
586
+ * Renders the capped failures block for aggregate-row shapes.
587
+ * Entries beyond `limit` collapse into an overflow line.
588
+ *
589
+ * @public
590
+ */
591
+ export declare const FailuresSection: FC<FailuresSectionProps>;
592
+ //#endregion
593
+ //#region src/ink/ModuleHeader.d.ts
594
+ /**
595
+ * Props for the `ModuleHeader` component.
596
+ *
597
+ * @public
598
+ */
599
+ interface ModuleHeaderProps {
600
+ /** The module record to display. */
601
+ readonly module: ModuleRecord;
602
+ }
603
+ /**
604
+ * Renders the per-module title line: a status glyph, the module path,
605
+ * and a dimmed inline summary of pass/fail/skip counts and duration.
606
+ *
607
+ * @public
608
+ */
609
+ export declare const ModuleHeader: FC<ModuleHeaderProps>;
610
+ //#endregion
611
+ //#region src/ink/ProjectRow.d.ts
612
+ /**
613
+ * Props for the `ProjectRow` component.
614
+ *
615
+ * @public
616
+ */
617
+ interface ProjectRowProps {
618
+ /** The per-project rollup. */
619
+ readonly project: ProjectSummary;
620
+ /** Pass/fail/skip/timeout counts for the project. */
621
+ readonly counts: {
622
+ passCount: number;
623
+ failCount: number;
624
+ skipCount: number;
625
+ timeoutCount: number;
626
+ };
627
+ /** True while the project still has a running or queued module. */
628
+ readonly running: boolean;
629
+ /**
630
+ * True when the run has been timed out — running rows resolve to the
631
+ * `⧖` glyph instead of continuing to animate the spinner.
632
+ */
633
+ readonly timedOut?: boolean;
634
+ /** Elapsed milliseconds — wall-clock while running, summed duration once finished. */
635
+ readonly elapsedMs: number;
636
+ /** Current spinner glyph; rendered in place of the status icon while running. */
637
+ readonly frame: string;
638
+ /** Name-column width so the count columns align across rows. */
639
+ readonly nameWidth: number;
640
+ /** Per-tag test counts for the project, merged across its modules; feeds the TagColumns cells. */
641
+ readonly tagCounts?: Record<string, number> | undefined;
642
+ /**
643
+ * The view-level tag union. Every row renders every tag in it so the
644
+ * tag columns align; empty (the default) renders no tag cells.
645
+ */
646
+ readonly tagUnion?: ReadonlyArray<string>;
647
+ }
648
+ /**
649
+ * Renders one per-project row in the `workspace`-shape live view: status
650
+ * glyph (animated spinner while running), project name, count columns,
651
+ * elapsed duration, and optional tag counts.
652
+ *
653
+ * @public
654
+ */
655
+ export declare const ProjectRow: FC<ProjectRowProps>;
656
+ //#endregion
657
+ //#region src/ink/StatusIcon.d.ts
658
+ /**
659
+ * The set of named statuses a `StatusIcon` can render.
660
+ *
661
+ * @public
662
+ */
663
+ type StatusIconKind = "passed" | "failed" | "skipped" | "pending" | "running" | "queued" | "finished" | "threshold" | "timed-out";
664
+ /**
665
+ * Props for the `StatusIcon` component.
666
+ *
667
+ * @public
668
+ */
669
+ interface StatusIconProps {
670
+ /** The status to render as a colored glyph. */
671
+ readonly status: StatusIconKind;
672
+ }
673
+ /**
674
+ * Renders a single colored status glyph for a test, module, or run.
675
+ *
676
+ * @public
677
+ */
678
+ export declare const StatusIcon: FC<StatusIconProps>;
679
+ //#endregion
680
+ //#region src/ink/StreamApp.d.ts
681
+ /**
682
+ * Props for the `StreamApp` component.
683
+ *
684
+ * @public
685
+ */
686
+ interface StreamAppProps {
687
+ /** The current reduced render state to display. */
688
+ readonly state: RenderState;
689
+ /** Current spinner frame index (the live view's `frame`: wall-clock ticks of `SPINNER_FRAME_MS`). */
690
+ readonly frameIndex: number;
691
+ /** Current wall-clock time in milliseconds; defaults to `Date.now()`. */
692
+ readonly nowMs?: number;
693
+ }
694
+ /**
695
+ * Root Ink component for the `stream` live renderer. Classifies the run
696
+ * shape and renders the appropriate per-shape live region.
697
+ *
698
+ * @public
699
+ */
700
+ export declare const StreamApp: FC<StreamAppProps>;
701
+ //#endregion
702
+ //#region src/ink/SuggestedActions.d.ts
703
+ /**
704
+ * Props for the `SuggestedActions` component.
705
+ *
706
+ * @public
707
+ */
708
+ interface SuggestedActionsProps {
709
+ /** The list of suggested actions to display. */
710
+ readonly actions: ReadonlyArray<SuggestedActionRecord>;
711
+ }
712
+ /**
713
+ * Renders the suggested-actions queue as severity-prefixed rows with
714
+ * optional tool hints. Returns `null` when the actions list is empty.
715
+ *
716
+ * @public
717
+ */
718
+ export declare const SuggestedActions: FC<SuggestedActionsProps>;
719
+ //#endregion
720
+ //#region src/ink/TagColumns.d.ts
721
+ /**
722
+ * Compute the view-level tag union: the alphabetically sorted set of tag
723
+ * names across every row's tag counts. A union of a single tag carries no
724
+ * signal (the whole view is one kind), so it collapses to empty and the
725
+ * view renders no tag columns at all.
726
+ *
727
+ * @public
728
+ */
729
+ export declare const tagUnion: (rows: ReadonlyArray<Record<string, number> | undefined>) => ReadonlyArray<string>;
730
+ /**
731
+ * Props for the `TagColumns` component.
732
+ *
733
+ * @public
734
+ */
735
+ interface TagColumnsProps {
736
+ /** The view-level tag union — every row renders every tag in it. */
737
+ readonly tags: ReadonlyArray<string>;
738
+ /** This row's per-tag test counts; tags absent here render a dimmed 0. */
739
+ readonly counts?: Record<string, number> | undefined;
740
+ }
741
+ /**
742
+ * Renders one row's fixed-width tag cells for the given tag union.
743
+ * Renders nothing when the union is empty.
744
+ *
745
+ * @public
746
+ */
747
+ export declare const TagColumns: FC<TagColumnsProps>;
748
+ //#endregion
749
+ //#region src/ink/TestRow.d.ts
750
+ /**
751
+ * Props for the `TestRow` component.
752
+ *
753
+ * @public
754
+ */
755
+ interface TestRowProps {
756
+ /** The test record to display. */
757
+ readonly test: TestRecord;
758
+ /** Leading indentation in spaces; defaults to 2. */
759
+ readonly indent?: number;
760
+ }
761
+ /**
762
+ * Renders one test row: status glyph, optional suite prefix, test name, and duration.
763
+ *
764
+ * @public
765
+ */
766
+ export declare const TestRow: FC<TestRowProps>;
767
+ //#endregion
768
+ //#region src/ink/TrendLine.d.ts
769
+ /**
770
+ * Props for the `TrendLine` component.
771
+ *
772
+ * @public
773
+ */
774
+ interface TrendLineProps {
775
+ /** The trend summary to display. */
776
+ readonly trend: {
777
+ readonly direction: "improving" | "regressing" | "stable";
778
+ readonly runCount: number;
779
+ };
780
+ }
781
+ /**
782
+ * Renders the one-line trend signal: direction (colored) and run count.
783
+ *
784
+ * @public
785
+ */
786
+ export declare const TrendLine: FC<TrendLineProps>;
787
+ //#endregion
788
+ export type { CellOptions, CountColumnsProps, CoverageBlockProps, CoverageRenderState, DispatchInputs, FailureRecord, FailureSectionProps, FailuresSectionProps, FileCoverageReport, InkCellFn, ModuleHeaderProps, ModuleRecord, ProjectRowProps, ProjectSummary, RenderState, RunOutcome, RunShape, StatusIconKind, StatusIconProps, StreamAppProps, SuggestedActionRecord, SuggestedActionsProps, TagColumnsProps, TestRecord, TestRowProps, TrendLineProps, TrendSummary };
789
+ //# sourceMappingURL=ink.d.ts.map