@e2edev/e2e 0.4.0 → 0.5.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.
- package/README.md +41 -15
- package/dist/agent/act.d.ts +1 -1
- package/dist/agent/act.js +12 -36
- package/dist/agent/act.js.map +1 -1
- package/dist/agent/actions.d.ts +2 -2
- package/dist/agent/actions.d.ts.map +1 -1
- package/dist/agent/actions.js +1 -1
- package/dist/agent/default-agent.d.ts +3 -29
- package/dist/agent/default-agent.d.ts.map +1 -1
- package/dist/agent/default-agent.js +4 -11
- package/dist/agent/default-agent.js.map +1 -1
- package/dist/agent/error.d.ts +0 -2
- package/dist/agent/error.d.ts.map +1 -1
- package/dist/agent/error.js +1 -3
- package/dist/agent/error.js.map +1 -1
- package/dist/agent/executor.d.ts +15 -49
- package/dist/agent/executor.d.ts.map +1 -1
- package/dist/agent/executor.js +0 -1
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/index.js +2 -2
- package/dist/agent/invocation.d.ts +6 -4
- package/dist/agent/invocation.d.ts.map +1 -1
- package/dist/agent/invocation.js +2 -2
- package/dist/agent/invocation.js.map +1 -1
- package/dist/agent/ledger.d.ts +16 -11
- package/dist/agent/ledger.d.ts.map +1 -1
- package/dist/agent/ledger.js +5 -8
- package/dist/agent/ledger.js.map +1 -1
- package/dist/agent/observation.d.ts +6 -6
- package/dist/agent/observation.d.ts.map +1 -1
- package/dist/agent/observation.js +5 -5
- package/dist/agent/observation.js.map +1 -1
- package/dist/agent/phases.d.ts +3 -3
- package/dist/agent/phases.d.ts.map +1 -1
- package/dist/agent/phases.js +4 -4
- package/dist/agent/phases.js.map +1 -1
- package/dist/agent/primitives.d.ts +4 -25
- package/dist/agent/primitives.d.ts.map +1 -1
- package/dist/agent/primitives.js +3 -36
- package/dist/agent/primitives.js.map +1 -1
- package/dist/agent/protocol.d.ts +1 -1
- package/dist/agent/protocol.js +1 -1
- package/dist/agent/public.d.ts +7 -9
- package/dist/agent/public.d.ts.map +1 -1
- package/dist/agent/public.js +6 -7
- package/dist/agent/public.js.map +1 -1
- package/dist/agent/replay.d.ts +1 -1
- package/dist/agent/replay.d.ts.map +1 -1
- package/dist/agent/secrets.d.ts +2 -2
- package/dist/agent/secrets.d.ts.map +1 -1
- package/dist/agent/secrets.js +3 -3
- package/dist/agent/secrets.js.map +1 -1
- package/dist/agent/tool-loop.d.ts +2 -30
- package/dist/agent/tool-loop.d.ts.map +1 -1
- package/dist/agent/tool-loop.js +9 -33
- package/dist/agent/tool-loop.js.map +1 -1
- package/dist/agent/tool.d.ts +4 -5
- package/dist/agent/tool.d.ts.map +1 -1
- package/dist/agent/tool.js +2 -7
- package/dist/agent/tool.js.map +1 -1
- package/dist/cache/anchors.d.ts +1 -1
- package/dist/cache/anchors.d.ts.map +1 -1
- package/dist/cache/identity.d.ts +8 -8
- package/dist/cache/identity.d.ts.map +1 -1
- package/dist/cache/identity.js +5 -5
- package/dist/cache/identity.js.map +1 -1
- package/dist/cache/relocate.d.ts +1 -1
- package/dist/cache/relocate.d.ts.map +1 -1
- package/dist/cli/index.js +3 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/{backends.d.ts → engines.d.ts} +12 -13
- package/dist/cli/init/engines.d.ts.map +1 -0
- package/dist/cli/init/{backends.js → engines.js} +13 -14
- package/dist/cli/init/engines.js.map +1 -0
- package/dist/cli/init/scaffold.d.ts +3 -3
- package/dist/cli/init/scaffold.d.ts.map +1 -1
- package/dist/cli/init/scaffold.js +9 -9
- package/dist/cli/init/scaffold.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +11 -10
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/signals.d.ts +1 -1
- package/dist/cli/signals.d.ts.map +1 -1
- package/dist/cli/signals.js +1 -1
- package/dist/cli/signals.js.map +1 -1
- package/dist/collect/collect.d.ts +32 -3
- package/dist/collect/collect.d.ts.map +1 -1
- package/dist/collect/collect.js +95 -17
- package/dist/collect/collect.js.map +1 -1
- package/dist/collect/registry.js +1 -1
- package/dist/collect/registry.js.map +1 -1
- package/dist/collect/select.d.ts.map +1 -1
- package/dist/collect/select.js +9 -5
- package/dist/collect/select.js.map +1 -1
- package/dist/config/app.d.ts +76 -19
- package/dist/config/app.d.ts.map +1 -1
- package/dist/config/app.js +157 -102
- package/dist/config/app.js.map +1 -1
- package/dist/config/resolve.d.ts +6 -5
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +35 -32
- package/dist/config/resolve.js.map +1 -1
- package/dist/{backend → engine}/contract.d.ts +26 -18
- package/dist/engine/contract.d.ts.map +1 -0
- package/dist/{backend → engine}/contract.js +18 -18
- package/dist/engine/contract.js.map +1 -0
- package/dist/{backend → engine}/index.d.ts +141 -79
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/{backend → engine}/index.js +60 -35
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/session.d.ts +23 -0
- package/dist/engine/session.d.ts.map +1 -0
- package/dist/{backend → engine}/session.js +55 -51
- package/dist/engine/session.js.map +1 -0
- package/dist/{backend → engine}/surface.d.ts +11 -11
- package/dist/engine/surface.d.ts.map +1 -0
- package/dist/{backend → engine}/surface.js +2 -2
- package/dist/engine/surface.js.map +1 -0
- package/dist/engine/timing.d.ts.map +1 -0
- package/dist/engine/timing.js +8 -0
- package/dist/engine/timing.js.map +1 -0
- package/dist/expect/index.js +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/brands.d.ts +1 -1
- package/dist/internal/brands.d.ts.map +1 -1
- package/dist/internal/brands.js +1 -1
- package/dist/internal/brands.js.map +1 -1
- package/dist/internal/errors.d.ts +16 -16
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +39 -39
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/objects.d.ts +21 -0
- package/dist/internal/objects.d.ts.map +1 -0
- package/dist/internal/objects.js +14 -0
- package/dist/internal/objects.js.map +1 -0
- package/dist/internal/urls.d.ts +1 -1
- package/dist/internal/urls.d.ts.map +1 -1
- package/dist/internal/urls.js +6 -1
- package/dist/internal/urls.js.map +1 -1
- package/dist/locator/engine.d.ts +6 -6
- package/dist/locator/engine.d.ts.map +1 -1
- package/dist/locator/engine.js +13 -13
- package/dist/locator/engine.js.map +1 -1
- package/dist/locator/expression.d.ts +4 -2
- package/dist/locator/expression.d.ts.map +1 -1
- package/dist/locator/expression.js +24 -4
- package/dist/locator/expression.js.map +1 -1
- package/dist/locator/screen.d.ts +1 -1
- package/dist/locator/screen.d.ts.map +1 -1
- package/dist/locator/screen.js +2 -2
- package/dist/locator/screen.js.map +1 -1
- package/dist/report/build.d.ts +9 -8
- package/dist/report/build.d.ts.map +1 -1
- package/dist/report/build.js +21 -18
- package/dist/report/build.js.map +1 -1
- package/dist/report/code-frame.d.ts +8 -4
- package/dist/report/code-frame.d.ts.map +1 -1
- package/dist/report/code-frame.js +23 -18
- package/dist/report/code-frame.js.map +1 -1
- package/dist/report/debug-steps.js +1 -1
- package/dist/report/debug-steps.js.map +1 -1
- package/dist/report/format.d.ts +73 -0
- package/dist/report/format.d.ts.map +1 -0
- package/dist/report/format.js +147 -0
- package/dist/report/format.js.map +1 -0
- package/dist/report/list.d.ts +96 -47
- package/dist/report/list.d.ts.map +1 -1
- package/dist/report/list.js +485 -244
- package/dist/report/list.js.map +1 -1
- package/dist/report/live-window.d.ts +28 -0
- package/dist/report/live-window.d.ts.map +1 -0
- package/dist/report/live-window.js +102 -0
- package/dist/report/live-window.js.map +1 -0
- package/dist/run/declared-processes.d.ts +30 -0
- package/dist/run/declared-processes.d.ts.map +1 -0
- package/dist/run/declared-processes.js +61 -0
- package/dist/run/declared-processes.js.map +1 -0
- package/dist/run/events.d.ts +30 -2
- package/dist/run/events.d.ts.map +1 -1
- package/dist/run/events.js.map +1 -1
- package/dist/run/execute.d.ts +17 -13
- package/dist/run/execute.d.ts.map +1 -1
- package/dist/run/execute.js +61 -62
- package/dist/run/execute.js.map +1 -1
- package/dist/run/fixture-recording.d.ts +10 -4
- package/dist/run/fixture-recording.d.ts.map +1 -1
- package/dist/run/fixture-recording.js +19 -6
- package/dist/run/fixture-recording.js.map +1 -1
- package/dist/run/fixtures.d.ts +1 -1
- package/dist/run/fixtures.d.ts.map +1 -1
- package/dist/run/fixtures.js +33 -41
- package/dist/run/fixtures.js.map +1 -1
- package/dist/run/in-process.d.ts +1 -1
- package/dist/run/in-process.js +1 -1
- package/dist/run/managed-process.d.ts +39 -9
- package/dist/run/managed-process.d.ts.map +1 -1
- package/dist/run/managed-process.js +102 -34
- package/dist/run/managed-process.js.map +1 -1
- package/dist/run/runner.d.ts +1 -1
- package/dist/run/runner.d.ts.map +1 -1
- package/dist/run/runner.js +67 -31
- package/dist/run/runner.js.map +1 -1
- package/dist/run/scheduler.d.ts +4 -3
- package/dist/run/scheduler.d.ts.map +1 -1
- package/dist/run/scheduler.js +5 -4
- package/dist/run/scheduler.js.map +1 -1
- package/dist/run/serial.d.ts +9 -1
- package/dist/run/serial.d.ts.map +1 -1
- package/dist/run/serial.js +2 -0
- package/dist/run/serial.js.map +1 -1
- package/dist/run/sessions.d.ts +9 -9
- package/dist/run/sessions.d.ts.map +1 -1
- package/dist/run/sessions.js +10 -10
- package/dist/run/sessions.js.map +1 -1
- package/dist/run/steps.d.ts +1 -1
- package/dist/run/steps.d.ts.map +1 -1
- package/dist/run/worker/entry.d.ts +1 -1
- package/dist/run/worker/entry.js +2 -2
- package/dist/run/worker/entry.js.map +1 -1
- package/dist/run/worker/protocol.d.ts +18 -6
- package/dist/run/worker/protocol.d.ts.map +1 -1
- package/dist/run/worker/protocol.js +1 -1
- package/dist/run/worker/protocol.js.map +1 -1
- package/dist/run/worker/session.d.ts +2 -2
- package/dist/run/worker/session.d.ts.map +1 -1
- package/dist/run/worker/session.js +5 -3
- package/dist/run/worker/session.js.map +1 -1
- package/dist/types.d.ts +36 -37
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/backend/contract.d.ts.map +0 -1
- package/dist/backend/contract.js.map +0 -1
- package/dist/backend/index.d.ts.map +0 -1
- package/dist/backend/index.js.map +0 -1
- package/dist/backend/session.d.ts +0 -23
- package/dist/backend/session.d.ts.map +0 -1
- package/dist/backend/session.js.map +0 -1
- package/dist/backend/surface.d.ts.map +0 -1
- package/dist/backend/surface.js.map +0 -1
- package/dist/backend/timing.d.ts.map +0 -1
- package/dist/backend/timing.js +0 -8
- package/dist/backend/timing.js.map +0 -1
- package/dist/cli/init/backends.d.ts.map +0 -1
- package/dist/cli/init/backends.js.map +0 -1
- package/dist/report/live-status.d.ts +0 -51
- package/dist/report/live-status.d.ts.map +0 -1
- package/dist/report/live-status.js +0 -163
- package/dist/report/live-status.js.map +0 -1
- package/dist/run/fixture-legacy.d.ts +0 -36
- package/dist/run/fixture-legacy.d.ts.map +0 -1
- package/dist/run/fixture-legacy.js +0 -143
- package/dist/run/fixture-legacy.js.map +0 -1
- /package/dist/{backend → engine}/timing.d.ts +0 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure presentation helpers shared by the terminal reporters: colors, the
|
|
3
|
+
* terminal width, durations, counters, and model-usage tallies. Stateless, so
|
|
4
|
+
* the reporters own every decision about what to print and when.
|
|
5
|
+
*/
|
|
6
|
+
import { stripVTControlCharacters } from 'node:util';
|
|
7
|
+
import picocolors from 'picocolors';
|
|
8
|
+
import { sanitizeText, truncateUtf8 } from '../internal/errors.js';
|
|
9
|
+
/** Every untrusted field is capped here before it reaches the terminal. */
|
|
10
|
+
const MAX_FIELD_BYTES = 8192;
|
|
11
|
+
const LONG_DASH = '⎯';
|
|
12
|
+
/** Width of the summary's right-aligned title column (`Test Files`). */
|
|
13
|
+
const TITLE_WIDTH = 11;
|
|
14
|
+
/**
|
|
15
|
+
* Sanitized and bounded: the one form untrusted text takes on the terminal.
|
|
16
|
+
* Tabs become spaces, since a tab's width depends on the column it lands in
|
|
17
|
+
* and would break the live window's row accounting.
|
|
18
|
+
*/
|
|
19
|
+
export function bounded(text) {
|
|
20
|
+
return truncateUtf8(sanitizeText(text), MAX_FIELD_BYTES).replaceAll('\t', ' ');
|
|
21
|
+
}
|
|
22
|
+
/** Clips to `max` characters with an ellipsis; untouched when it fits. */
|
|
23
|
+
export function ellipsize(text, max) {
|
|
24
|
+
const chars = [...text];
|
|
25
|
+
return chars.length <= max ? text : `${chars.slice(0, Math.max(0, max - 1)).join('')}…`;
|
|
26
|
+
}
|
|
27
|
+
/** The terminal width; a pty without a size reports 0, which counts as unknown. */
|
|
28
|
+
export function terminalColumns() {
|
|
29
|
+
return process.stdout.columns || 80;
|
|
30
|
+
}
|
|
31
|
+
/** The terminal height; a pty without a size reports 0, which counts as unknown. */
|
|
32
|
+
export function terminalRows() {
|
|
33
|
+
return process.stdout.rows || 40;
|
|
34
|
+
}
|
|
35
|
+
/** vitest's duration format: whole milliseconds under a second, two decimals above. */
|
|
36
|
+
export function formatTime(ms) {
|
|
37
|
+
return ms > 1_000 ? `${(ms / 1_000).toFixed(2)}s` : `${Math.round(ms)}ms`;
|
|
38
|
+
}
|
|
39
|
+
/** Wall-clock `HH:MM:SS` for the summary's `Start at` row. */
|
|
40
|
+
export function formatClock(date) {
|
|
41
|
+
return date.toTimeString().split(' ')[0] ?? '';
|
|
42
|
+
}
|
|
43
|
+
/** Compact token count: plain under a thousand, `12.4k`, then `4.2M`. */
|
|
44
|
+
export function formatTokens(count) {
|
|
45
|
+
if (count < 1_000)
|
|
46
|
+
return `${count}`;
|
|
47
|
+
if (count < 1_000_000)
|
|
48
|
+
return `${(count / 1_000).toFixed(1)}k`;
|
|
49
|
+
return `${(count / 1_000_000).toFixed(1)}M`;
|
|
50
|
+
}
|
|
51
|
+
/** USD with enough precision for sub-cent model calls. */
|
|
52
|
+
function formatCost(costUsd) {
|
|
53
|
+
return `$${costUsd.toFixed(costUsd < 0.1 ? 4 : 2)}`;
|
|
54
|
+
}
|
|
55
|
+
/** One padded summary title, right-aligned like vitest's `Test Files` column. */
|
|
56
|
+
export function padTitle(pc, title) {
|
|
57
|
+
return pc.dim(`${title.padStart(TITLE_WIDTH)} `);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The dashes of a full-width rule around `text`: centered, or with the text
|
|
61
|
+
* pushed to the right edge as vitest draws `[1/3]` markers. Uncolored, so the
|
|
62
|
+
* caller colors the dashes and the text independently.
|
|
63
|
+
*/
|
|
64
|
+
export function rule(text, align) {
|
|
65
|
+
const columns = terminalColumns();
|
|
66
|
+
const width = stripVTControlCharacters(text).length;
|
|
67
|
+
const after = align === 'center' ? Math.max(0, Math.ceil((columns - width) / 2)) : 1;
|
|
68
|
+
const before = Math.max(0, columns - width - after);
|
|
69
|
+
return { before: LONG_DASH.repeat(before), after: LONG_DASH.repeat(after) };
|
|
70
|
+
}
|
|
71
|
+
export function emptyCounters() {
|
|
72
|
+
return { passed: 0, failed: 0, flaky: 0, skipped: 0, total: 0 };
|
|
73
|
+
}
|
|
74
|
+
/** The counter a result status lands in: every non-success status is a failure. */
|
|
75
|
+
export function statusBucket(status) {
|
|
76
|
+
return status === 'passed' || status === 'flaky' || status === 'skipped' ? status : 'failed';
|
|
77
|
+
}
|
|
78
|
+
/** Counts results by bucket; `total` is the number of items. */
|
|
79
|
+
export function tally(items) {
|
|
80
|
+
const counters = emptyCounters();
|
|
81
|
+
for (const item of items) {
|
|
82
|
+
counters[statusBucket(item.status)] += 1;
|
|
83
|
+
counters.total += 1;
|
|
84
|
+
}
|
|
85
|
+
return counters;
|
|
86
|
+
}
|
|
87
|
+
/** A file's outcome from its tests: failed if any did, skipped if all did, else passed. */
|
|
88
|
+
export function fileOutcome(counters) {
|
|
89
|
+
if (counters.failed > 0)
|
|
90
|
+
return 'failed';
|
|
91
|
+
if (counters.total > 0 && counters.skipped === counters.total)
|
|
92
|
+
return 'skipped';
|
|
93
|
+
return 'passed';
|
|
94
|
+
}
|
|
95
|
+
/** `2 failed | 10 passed | 1 flaky (13)` in vitest's colors and order. */
|
|
96
|
+
export function stateString(pc, counters) {
|
|
97
|
+
const parts = [
|
|
98
|
+
counters.failed > 0 ? pc.bold(pc.red(`${counters.failed} failed`)) : undefined,
|
|
99
|
+
pc.bold(pc.green(`${counters.passed} passed`)),
|
|
100
|
+
counters.flaky > 0 ? pc.yellow(`${counters.flaky} flaky`) : undefined,
|
|
101
|
+
counters.skipped > 0 ? pc.gray(`${counters.skipped} skipped`) : undefined,
|
|
102
|
+
].filter((part) => part !== undefined);
|
|
103
|
+
return `${parts.join(pc.dim(' | '))}${pc.gray(` (${counters.total})`)}`;
|
|
104
|
+
}
|
|
105
|
+
export function emptyUsage() {
|
|
106
|
+
return { calls: 0, tokens: 0, costUsd: undefined };
|
|
107
|
+
}
|
|
108
|
+
export function addUsage(into, usage) {
|
|
109
|
+
into.calls += usage.calls;
|
|
110
|
+
into.tokens += usage.tokens;
|
|
111
|
+
if (usage.costUsd !== undefined)
|
|
112
|
+
into.costUsd = (into.costUsd ?? 0) + usage.costUsd;
|
|
113
|
+
}
|
|
114
|
+
/** Accumulates the model usage of one step list into a running total. */
|
|
115
|
+
function addStepsUsage(usage, steps) {
|
|
116
|
+
for (const step of steps) {
|
|
117
|
+
if (step.model === undefined)
|
|
118
|
+
continue;
|
|
119
|
+
usage.calls += step.model.calls;
|
|
120
|
+
usage.tokens += step.model.inputTokens + step.model.outputTokens;
|
|
121
|
+
if (step.model.estimatedCostUsd !== undefined) {
|
|
122
|
+
usage.costUsd = (usage.costUsd ?? 0) + step.model.estimatedCostUsd;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** The model usage of several step lists summed. */
|
|
127
|
+
export function stepsUsage(stepLists) {
|
|
128
|
+
const usage = emptyUsage();
|
|
129
|
+
for (const steps of stepLists)
|
|
130
|
+
addStepsUsage(usage, steps);
|
|
131
|
+
return usage;
|
|
132
|
+
}
|
|
133
|
+
/** The model usage of several items summed. */
|
|
134
|
+
export function sumUsage(items) {
|
|
135
|
+
const total = emptyUsage();
|
|
136
|
+
for (const item of items)
|
|
137
|
+
addUsage(total, item.usage);
|
|
138
|
+
return total;
|
|
139
|
+
}
|
|
140
|
+
/** One dim `ai …` segment, or undefined when no model was used. */
|
|
141
|
+
export function aiSegment(usage) {
|
|
142
|
+
if (usage.calls === 0)
|
|
143
|
+
return undefined;
|
|
144
|
+
const cost = usage.costUsd === undefined ? '' : ` · ${formatCost(usage.costUsd)}`;
|
|
145
|
+
return `ai ${formatTokens(usage.tokens)} tokens${cost}`;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/report/format.ts"],"names":[],"mappings":"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"}
|
package/dist/report/list.d.ts
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Human-readable list reporter (spec 06-cli.md), styled after vitest's
|
|
3
|
+
* default reporter: one block per test file and target, a `Failed Tests`
|
|
4
|
+
* section with code frames, and a padded summary. On a TTY a live window
|
|
5
|
+
* below the log shows the running files, their tests, and the counters.
|
|
6
|
+
*/
|
|
2
7
|
import type { RunEventFact } from '../run/events.ts';
|
|
3
8
|
export interface ListReporterOutput {
|
|
4
9
|
write(line: string): void;
|
|
5
|
-
/** Raw control write for live
|
|
10
|
+
/** Raw control write for live window rendering; omit to disable it. */
|
|
6
11
|
raw?(text: string): void;
|
|
7
12
|
}
|
|
13
|
+
export interface ListReporterOptions {
|
|
14
|
+
/** Paint the live window; defaults to whether stdout is a TTY. */
|
|
15
|
+
live?: boolean;
|
|
16
|
+
/** Emit ANSI colors; defaults to picocolors' detection (TTY, CI, FORCE_COLOR). */
|
|
17
|
+
colors?: boolean;
|
|
18
|
+
}
|
|
8
19
|
/**
|
|
9
20
|
* Renders the run's event stream as the CLI's human-readable output. The
|
|
10
21
|
* reporter is one sink on the run's single event spine, beside a host's
|
|
@@ -12,71 +23,109 @@ export interface ListReporterOutput {
|
|
|
12
23
|
*/
|
|
13
24
|
export declare class ListReporter {
|
|
14
25
|
private readonly output;
|
|
15
|
-
private passed;
|
|
16
|
-
private failed;
|
|
17
|
-
private flaky;
|
|
18
|
-
private skipped;
|
|
19
|
-
private projectRoot;
|
|
20
|
-
private readonly status;
|
|
21
|
-
/** Base live-status text of each running pair, keyed `${testId}@${target}`. */
|
|
22
|
-
private readonly liveBase;
|
|
23
|
-
/** Current step line of each running pair, rendered under its header. */
|
|
24
|
-
private readonly liveStep;
|
|
25
|
-
/** Rolling window of the running step's latest model and backend calls. */
|
|
26
|
-
private readonly liveEvents;
|
|
27
|
-
/** Pairs whose permanent header line has been written. */
|
|
28
|
-
private readonly headerPrinted;
|
|
29
|
-
/** Run-wide model usage, summed from every reported result. */
|
|
30
|
-
private readonly runAi;
|
|
31
|
-
/** Colors follow live rendering: non-interactive sinks get plain text. */
|
|
32
26
|
private readonly pc;
|
|
27
|
+
private readonly window;
|
|
28
|
+
private readonly separator;
|
|
29
|
+
private projectRoot;
|
|
30
|
+
/** Selected targets in declaration order; decides each badge's color. */
|
|
31
|
+
private targets;
|
|
32
|
+
/** When the run began: the summary's `Start at` and the origin of `Duration`. */
|
|
33
|
+
private startedAt;
|
|
34
|
+
/** File groups keyed `${target}\u0000${file}`, in first-seen order. */
|
|
35
|
+
private readonly groups;
|
|
36
|
+
/** Pairs executing right now, keyed by `pairKey`, in start order. */
|
|
37
|
+
private readonly running;
|
|
38
|
+
private readonly failures;
|
|
39
|
+
/**
|
|
40
|
+
* Serial groups whose members' results are still to come, by group id. The
|
|
41
|
+
* runner emits a group before its member results, and a member's details
|
|
42
|
+
* live only in the group.
|
|
43
|
+
*/
|
|
44
|
+
private readonly pendingSerial;
|
|
33
45
|
/** Run-level errors, printed once at the end; the stream carries them as they happen. */
|
|
34
46
|
private readonly errors;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
47
|
+
/** Run-wide model usage, summed from every reported result and serial group. */
|
|
48
|
+
private readonly runUsage;
|
|
49
|
+
constructor(output?: ListReporterOutput, options?: ListReporterOptions);
|
|
38
50
|
/**
|
|
39
51
|
* The reporter as an event sink: one dispatch per fact. Bound, so it can be
|
|
40
52
|
* handed to the run's emitter directly.
|
|
41
53
|
*/
|
|
42
54
|
readonly handle: (event: RunEventFact) => void;
|
|
55
|
+
/** Writes one permanent line without disturbing the live window. */
|
|
56
|
+
private print;
|
|
57
|
+
/** A target's colored badge, `|web|` when colors are off (vitest's convention). */
|
|
58
|
+
private badge;
|
|
59
|
+
/** A path relative to the project root when inside it, else as given. */
|
|
60
|
+
private displayPath;
|
|
61
|
+
private group;
|
|
62
|
+
private runStarted;
|
|
63
|
+
private plan;
|
|
43
64
|
/** Acknowledged immediately, so a bounded teardown is not mistaken for a hang. */
|
|
44
65
|
private runInterrupted;
|
|
45
|
-
|
|
46
|
-
|
|
66
|
+
/**
|
|
67
|
+
* A worker began one test-target pair: show it in the live window. A serial
|
|
68
|
+
* member replaces the previous member of its group, which has finished
|
|
69
|
+
* executing even though its result only arrives with the whole group.
|
|
70
|
+
*/
|
|
47
71
|
private testStarted;
|
|
48
72
|
/**
|
|
49
|
-
* Streams step progress of a running pair. With a single test running,
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* latest calls transiently in
|
|
73
|
+
* Streams step progress of a running pair. With a single test running, its
|
|
74
|
+
* agent steps print permanently and chronologically under a header naming
|
|
75
|
+
* the file and test - the scrollback of a long agentic run reads without
|
|
76
|
+
* `--debug`. Deterministic steps are fast and many, so they only ever show
|
|
77
|
+
* in the live window. With parallel tests the stream would interleave, so
|
|
78
|
+
* each pair instead shows its current step and latest calls transiently in
|
|
79
|
+
* the live window, and finished agent steps print with the test they
|
|
80
|
+
* belong to.
|
|
55
81
|
*/
|
|
56
82
|
private step;
|
|
83
|
+
/** Holds a serial group until each of its members' results has read its details. */
|
|
84
|
+
private serialGroup;
|
|
57
85
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
86
|
+
* The details behind one result. A serial member's come from its group; a
|
|
87
|
+
* group that never arrived (a stream out of contract) leaves them empty
|
|
88
|
+
* rather than failing the run.
|
|
61
89
|
*/
|
|
62
|
-
private
|
|
63
|
-
|
|
64
|
-
|
|
90
|
+
private detailsOf;
|
|
91
|
+
private testFinished;
|
|
92
|
+
/** Counters over every reported result; the total is the plan's once it has arrived. */
|
|
93
|
+
private testCounters;
|
|
94
|
+
/** Counters over test files; a file lands in an outcome once its block has printed. */
|
|
95
|
+
private fileCounters;
|
|
65
96
|
/**
|
|
66
|
-
* Prints
|
|
67
|
-
*
|
|
97
|
+
* Prints one file's block: the file line with its counts, then - when the
|
|
98
|
+
* file failed, had a flaky pass, streamed its steps, or is the run's only
|
|
99
|
+
* file - one line per test, as vitest lists tests for a failed module.
|
|
68
100
|
*/
|
|
69
|
-
private
|
|
101
|
+
private printGroup;
|
|
102
|
+
/** One test row under its file line, plus the first error line for a failure. */
|
|
103
|
+
private testLine;
|
|
70
104
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* counter (its header is already permanent) or, before any step ran, the
|
|
74
|
-
* test title. With parallel pairs the title stays as block context.
|
|
105
|
+
* vitest's padded summary, shared by the live window and the final report:
|
|
106
|
+
* files, tests, model usage, run errors, start time, and elapsed time.
|
|
75
107
|
*/
|
|
76
|
-
private
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
108
|
+
private summaryRows;
|
|
109
|
+
/**
|
|
110
|
+
* The live window: running files and tests, then the summary. The block
|
|
111
|
+
* must fit the screen, because repainting more rows than the terminal has
|
|
112
|
+
* breaks the cursor-up erase: rows left after the summary go to the running
|
|
113
|
+
* tests, each test's calls share what remains once every test has its own
|
|
114
|
+
* line, and tests that still do not fit fold into one `more running` marker.
|
|
115
|
+
*/
|
|
116
|
+
private renderWindow;
|
|
117
|
+
/** vitest's `Failed Tests` section: a banner, then each failure with its code frame. */
|
|
118
|
+
private printFailures;
|
|
119
|
+
/** A full-width red rule with a centered `FAIL`-style label. */
|
|
120
|
+
private errorBanner;
|
|
121
|
+
/** Names the user's failing line and renders a code frame around it. */
|
|
122
|
+
private printFailureLocation;
|
|
123
|
+
/**
|
|
124
|
+
* Run-level errors never arrive as results: they abort before, between, or
|
|
125
|
+
* after test execution. Without this the console shows only a bare exit
|
|
126
|
+
* code and the reason lives solely in report.json.
|
|
127
|
+
*/
|
|
128
|
+
private printErrors;
|
|
80
129
|
private runFinished;
|
|
81
130
|
}
|
|
82
131
|
//# sourceMappingURL=list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/report/list.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/report/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,kBAAkB,CAAC;AA0DjF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,uEAAuE;IACvE,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA+HD;;;;GAIG;AACH,qBAAa,YAAY;IA0BrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAzBzB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,WAAW,CAAqB;IACxC,yEAAyE;IACzE,OAAO,CAAC,OAAO,CAAyB;IACxC,iFAAiF;IACjF,OAAO,CAAC,SAAS,CAAc;IAC/B,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsE;IACpG,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC,YACmB,MAAM,GAAE,kBAAmC,EAC5D,OAAO,GAAE,mBAAwB,EAMlC;IAED;;;OAGG;IACH,QAAQ,CAAC,MAAM,UAAW,YAAY,KAAG,IAAI,CAiC3C;IAEF,oEAAoE;IACpE,OAAO,CAAC,KAAK;IAMb,mFAAmF;IACnF,OAAO,CAAC,KAAK;IAQb,yEAAyE;IACzE,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,IAAI;IAOZ,kFAAkF;IAClF,OAAO,CAAC,cAAc;IAUtB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAoBnB;;;;;;;;;OASG;IACH,OAAO,CAAC,IAAI;IAkDZ,oFAAoF;IACpF,OAAO,CAAC,WAAW;IAInB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,YAAY;IAyBpB,wFAAwF;IACxF,OAAO,CAAC,YAAY;IAOpB,uFAAuF;IACvF,OAAO,CAAC,YAAY;IASpB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA0ClB,iFAAiF;IACjF,OAAO,CAAC,QAAQ;IA+BhB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAmBnB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAsDpB,wFAAwF;IACxF,OAAO,CAAC,aAAa;IA0BrB,gEAAgE;IAChE,OAAO,CAAC,WAAW;IAOnB,wEAAwE;IACxE,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,WAAW;CAyBpB"}
|