@michaelrwalker/stagehand 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +277 -0
- package/dist/context.d.ts +11 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +123 -0
- package/dist/context.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +50 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/script.d.ts +75 -0
- package/dist/script.d.ts.map +1 -0
- package/dist/script.js +410 -0
- package/dist/script.js.map +1 -0
- package/dist/state.d.ts +51 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +58 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +176 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/ansi.d.ts +43 -0
- package/dist/ui/ansi.d.ts.map +1 -0
- package/dist/ui/ansi.js +166 -0
- package/dist/ui/ansi.js.map +1 -0
- package/dist/ui/frame.d.ts +27 -0
- package/dist/ui/frame.d.ts.map +1 -0
- package/dist/ui/frame.js +291 -0
- package/dist/ui/frame.js.map +1 -0
- package/dist/ui/renderer.d.ts +84 -0
- package/dist/ui/renderer.d.ts.map +1 -0
- package/dist/ui/renderer.js +178 -0
- package/dist/ui/renderer.js.map +1 -0
- package/dist/ui/theme.d.ts +33 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +68 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +47 -0
package/dist/ui/frame.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { padEnd, stringWidth, truncate, wrapText } from "./ansi.js";
|
|
2
|
+
import { frameWidth, palette, spinnerFrame, symbols } from "./theme.js";
|
|
3
|
+
import { elapsed, errorMessage, formatDuration, phaseElapsed, phaseStatus, } from "../state.js";
|
|
4
|
+
const GUTTER = " ";
|
|
5
|
+
const PHASE_INDENT = GUTTER;
|
|
6
|
+
const STEP_INDENT = GUTTER + " ";
|
|
7
|
+
const DETAIL_INDENT = GUTTER + " ";
|
|
8
|
+
/** left text, right text, padded to the frame width and clipped safely. */
|
|
9
|
+
function row(left, right = "") {
|
|
10
|
+
const width = frameWidth();
|
|
11
|
+
if (right === "")
|
|
12
|
+
return truncate(left, width);
|
|
13
|
+
const gap = width - stringWidth(left) - stringWidth(right);
|
|
14
|
+
if (gap < 1)
|
|
15
|
+
return truncate(left, Math.max(1, width - stringWidth(right) - 1)) + " " + right;
|
|
16
|
+
return left + " ".repeat(gap) + right;
|
|
17
|
+
}
|
|
18
|
+
function stepIcon(step, tick) {
|
|
19
|
+
switch (step.status) {
|
|
20
|
+
case "pending":
|
|
21
|
+
return palette.faint(symbols.pending);
|
|
22
|
+
case "running":
|
|
23
|
+
return palette.accent(spinnerFrame(tick));
|
|
24
|
+
case "success":
|
|
25
|
+
return palette.success(symbols.success);
|
|
26
|
+
case "failed":
|
|
27
|
+
return palette.error(symbols.failure);
|
|
28
|
+
case "skipped":
|
|
29
|
+
return palette.faint(symbols.skipped);
|
|
30
|
+
case "rolling-back":
|
|
31
|
+
return palette.warning(spinnerFrame(tick));
|
|
32
|
+
case "rolled-back":
|
|
33
|
+
return palette.warning(symbols.rolledBack);
|
|
34
|
+
case "rollback-failed":
|
|
35
|
+
return palette.error(symbols.rolledBack);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function phaseIcon(phase, tick) {
|
|
39
|
+
switch (phaseStatus(phase)) {
|
|
40
|
+
case "pending":
|
|
41
|
+
return palette.faint(symbols.pending);
|
|
42
|
+
case "running":
|
|
43
|
+
return palette.accent(spinnerFrame(tick));
|
|
44
|
+
case "success":
|
|
45
|
+
return palette.success(symbols.success);
|
|
46
|
+
case "failed":
|
|
47
|
+
return palette.error(symbols.failure);
|
|
48
|
+
case "skipped":
|
|
49
|
+
return palette.faint(symbols.skipped);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function taskIcon(task, tick) {
|
|
53
|
+
switch (task.status) {
|
|
54
|
+
case "pending":
|
|
55
|
+
return palette.faint(symbols.pending);
|
|
56
|
+
case "running":
|
|
57
|
+
return palette.accent(spinnerFrame(tick));
|
|
58
|
+
case "done":
|
|
59
|
+
return palette.success(symbols.success);
|
|
60
|
+
case "failed":
|
|
61
|
+
return palette.error(symbols.failure);
|
|
62
|
+
case "skipped":
|
|
63
|
+
return palette.faint(symbols.skipped);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function renderBar(progress, width = 24) {
|
|
67
|
+
const total = Math.max(progress.total, 1);
|
|
68
|
+
const ratio = Math.max(0, Math.min(1, progress.value / total));
|
|
69
|
+
const filled = Math.round(ratio * width);
|
|
70
|
+
const bar = palette.accent(symbols.barFull.repeat(filled)) +
|
|
71
|
+
palette.faint(symbols.barEmpty.repeat(width - filled));
|
|
72
|
+
const percent = padEnd(`${Math.round(ratio * 100)}%`, 4);
|
|
73
|
+
const count = palette.faint(`${progress.value}/${progress.total}`);
|
|
74
|
+
const label = progress.label ? " " + palette.faint(progress.label) : "";
|
|
75
|
+
return (palette.faint(symbols.barLeft) +
|
|
76
|
+
bar +
|
|
77
|
+
palette.faint(symbols.barRight) +
|
|
78
|
+
" " +
|
|
79
|
+
palette.muted(percent) +
|
|
80
|
+
" " +
|
|
81
|
+
count +
|
|
82
|
+
label);
|
|
83
|
+
}
|
|
84
|
+
function stepLines(step, tick, now, compact = false) {
|
|
85
|
+
const lines = [];
|
|
86
|
+
const active = step.status === "running" || step.status === "rolling-back" || step.status === "failed";
|
|
87
|
+
let label = step.status === "pending" ? palette.faint(step.name) : step.name;
|
|
88
|
+
if (step.status === "skipped")
|
|
89
|
+
label = palette.faint(step.name);
|
|
90
|
+
if (step.attempts > 1 && active) {
|
|
91
|
+
label += palette.warning(` (retry ${step.attempts - 1})`);
|
|
92
|
+
}
|
|
93
|
+
if (step.statusText && active) {
|
|
94
|
+
label += " " + palette.faint(`${symbols.arrow} ${step.statusText}`);
|
|
95
|
+
}
|
|
96
|
+
const duration = elapsed(step, now);
|
|
97
|
+
const right = step.status === "pending"
|
|
98
|
+
? ""
|
|
99
|
+
: step.status === "skipped"
|
|
100
|
+
? palette.faint("skipped")
|
|
101
|
+
: duration !== undefined
|
|
102
|
+
? palette.faint(formatDuration(duration))
|
|
103
|
+
: "";
|
|
104
|
+
lines.push(row(`${STEP_INDENT}${stepIcon(step, tick)} ${label}`, right));
|
|
105
|
+
// Kept on failure — how far the bar got is diagnostic. Dropped on success
|
|
106
|
+
// even when the handler forgot to call done(), so green rows stay clean.
|
|
107
|
+
if (step.progress && active) {
|
|
108
|
+
lines.push(row(DETAIL_INDENT + renderBar(step.progress)));
|
|
109
|
+
}
|
|
110
|
+
// Compact mode trades detail for height when the frame must fit a viewport.
|
|
111
|
+
if (compact)
|
|
112
|
+
return lines;
|
|
113
|
+
if (step.tasks.length > 0 && active) {
|
|
114
|
+
for (const task of step.tasks) {
|
|
115
|
+
const text = task.status === "pending" ? palette.faint(task.label) : palette.muted(task.label);
|
|
116
|
+
lines.push(row(`${DETAIL_INDENT}${taskIcon(task, tick)} ${text}`));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (step.error !== undefined && step.status === "failed") {
|
|
120
|
+
const width = frameWidth() - stringWidth(DETAIL_INDENT);
|
|
121
|
+
// Capped here only because the live frame has a height budget; the closing
|
|
122
|
+
// frame and the summary both print the message in full.
|
|
123
|
+
for (const line of wrapText(errorMessage(step.error), width).slice(0, 4)) {
|
|
124
|
+
lines.push(row(DETAIL_INDENT + palette.error(line)));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return lines;
|
|
128
|
+
}
|
|
129
|
+
function collapsedPhaseLine(phase, tick, now) {
|
|
130
|
+
const done = phase.steps.filter((s) => s.status === "success").length;
|
|
131
|
+
const summary = palette.faint(`${done}/${phase.steps.length} steps`);
|
|
132
|
+
const duration = phaseElapsed(phase, now);
|
|
133
|
+
const right = duration !== undefined ? palette.faint(formatDuration(duration)) : "";
|
|
134
|
+
return row(`${PHASE_INDENT}${phaseIcon(phase, tick)} ${palette.muted(phase.name)} ${summary}`, right);
|
|
135
|
+
}
|
|
136
|
+
function elision(count) {
|
|
137
|
+
return row(`${STEP_INDENT}${palette.faint(`… ${count} more`)}`);
|
|
138
|
+
}
|
|
139
|
+
const isActiveStep = (step) => step.status === "running" || step.status === "rolling-back" || step.status === "failed";
|
|
140
|
+
/**
|
|
141
|
+
* Pick a window of steps around the active one. Used only when a phase cannot
|
|
142
|
+
* fit whole — the running step must always stay visible.
|
|
143
|
+
*/
|
|
144
|
+
function stepWindow(steps, budget) {
|
|
145
|
+
if (steps.length <= budget)
|
|
146
|
+
return { start: 0, end: steps.length };
|
|
147
|
+
const active = steps.findIndex(isActiveStep);
|
|
148
|
+
const anchor = active === -1 ? steps.length - 1 : active;
|
|
149
|
+
let start = Math.max(0, anchor - Math.floor(budget / 2));
|
|
150
|
+
start = Math.min(start, steps.length - budget);
|
|
151
|
+
return { start, end: start + budget };
|
|
152
|
+
}
|
|
153
|
+
function phaseLines(phase, tick, now, mode, stepBudget = Number.POSITIVE_INFINITY) {
|
|
154
|
+
if (mode === "collapsed")
|
|
155
|
+
return [collapsedPhaseLine(phase, tick, now)];
|
|
156
|
+
const status = phaseStatus(phase);
|
|
157
|
+
const name = status === "pending" ? palette.faint(phase.name) : palette.bold(phase.name);
|
|
158
|
+
const duration = phaseElapsed(phase, now);
|
|
159
|
+
const right = status === "pending" || duration === undefined ? "" : palette.faint(formatDuration(duration));
|
|
160
|
+
const lines = [row(`${PHASE_INDENT}${phaseIcon(phase, tick)} ${name}`, right)];
|
|
161
|
+
if (mode === "full" && phase.description && status !== "pending") {
|
|
162
|
+
lines.push(row(`${STEP_INDENT}${palette.faint(phase.description)}`));
|
|
163
|
+
}
|
|
164
|
+
const compact = mode === "compact";
|
|
165
|
+
const { start, end } = stepWindow(phase.steps, Math.max(1, stepBudget));
|
|
166
|
+
if (start > 0)
|
|
167
|
+
lines.push(elision(start));
|
|
168
|
+
for (const step of phase.steps.slice(start, end)) {
|
|
169
|
+
lines.push(...stepLines(step, tick, now, compact));
|
|
170
|
+
}
|
|
171
|
+
if (end < phase.steps.length)
|
|
172
|
+
lines.push(elision(phase.steps.length - end));
|
|
173
|
+
return lines;
|
|
174
|
+
}
|
|
175
|
+
export function renderHeader(state) {
|
|
176
|
+
const lines = ["", row(`${GUTTER}${palette.accent(symbols.brand)} ${palette.bold(state.name)}`)];
|
|
177
|
+
if (state.description) {
|
|
178
|
+
lines.push(row(`${GUTTER}${palette.accent(symbols.brand)} ${palette.faint(state.description)}`));
|
|
179
|
+
}
|
|
180
|
+
lines.push("");
|
|
181
|
+
return lines;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Lines the live region may occupy without the terminal scrolling under it.
|
|
185
|
+
*
|
|
186
|
+
* The hard limit is the viewport height; the margin covers the one extra line
|
|
187
|
+
* a permanent log write costs when the region is already at full height.
|
|
188
|
+
*/
|
|
189
|
+
export function bodyBudget() {
|
|
190
|
+
return Math.max(6, (process.stdout.rows ?? 40) - 3);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The live body, guaranteed to fit `bodyBudget()`.
|
|
194
|
+
*
|
|
195
|
+
* This guarantee is load-bearing, not cosmetic: the renderer repaints by moving
|
|
196
|
+
* the cursor up N lines, so a frame taller than the viewport scrolls its own
|
|
197
|
+
* top off screen and every repaint appends a copy instead of overwriting. Four
|
|
198
|
+
* progressively stronger reductions are tried, and the result is clamped.
|
|
199
|
+
*/
|
|
200
|
+
export function renderBody(state, tick, now, fit = true) {
|
|
201
|
+
const budget = bodyBudget();
|
|
202
|
+
const build = (mode, stepBudget) => {
|
|
203
|
+
const out = [];
|
|
204
|
+
state.phases.forEach((phase, index) => {
|
|
205
|
+
out.push(...phaseLines(phase, tick, now, mode(phase), stepBudget));
|
|
206
|
+
if (index < state.phases.length - 1)
|
|
207
|
+
out.push("");
|
|
208
|
+
});
|
|
209
|
+
return out;
|
|
210
|
+
};
|
|
211
|
+
// The closing frame is written permanently and never repainted, so it may
|
|
212
|
+
// scroll freely — keep every step visible there.
|
|
213
|
+
if (!fit)
|
|
214
|
+
return build(() => "full");
|
|
215
|
+
const done = (phase) => {
|
|
216
|
+
const status = phaseStatus(phase);
|
|
217
|
+
return status === "success" || status === "skipped";
|
|
218
|
+
};
|
|
219
|
+
const active = (phase) => phaseStatus(phase) === "running";
|
|
220
|
+
// 1. Everything, in full.
|
|
221
|
+
let out = build(() => "full");
|
|
222
|
+
if (out.length <= budget)
|
|
223
|
+
return out;
|
|
224
|
+
// 2. Finished phases become one line each.
|
|
225
|
+
out = build((phase) => (done(phase) ? "collapsed" : "full"));
|
|
226
|
+
if (out.length <= budget)
|
|
227
|
+
return out;
|
|
228
|
+
// 3. Only the running phase keeps its steps, and drops its detail lines.
|
|
229
|
+
out = build((phase) => (active(phase) ? "compact" : "collapsed"));
|
|
230
|
+
if (out.length <= budget)
|
|
231
|
+
return out;
|
|
232
|
+
// 4. Window the running phase's steps around the one actually executing.
|
|
233
|
+
const overhead = state.phases.filter((phase) => !active(phase)).length * 2;
|
|
234
|
+
out = build((phase) => (active(phase) ? "compact" : "collapsed"), Math.max(1, budget - overhead - 2));
|
|
235
|
+
// Last resort: a phase with a huge task list, or a viewport of a few rows.
|
|
236
|
+
return out.length <= budget ? out : out.slice(0, budget);
|
|
237
|
+
}
|
|
238
|
+
export function renderSummary(state, now) {
|
|
239
|
+
const width = frameWidth();
|
|
240
|
+
const lines = ["", row(GUTTER + palette.faint(symbols.rule.repeat(width - GUTTER.length)))];
|
|
241
|
+
const allSteps = state.phases.flatMap((p) => p.steps);
|
|
242
|
+
const succeeded = allSteps.filter((s) => s.status === "success").length;
|
|
243
|
+
const skipped = allSteps.filter((s) => s.status === "skipped").length;
|
|
244
|
+
const total = (state.endedAt ?? now) - state.startedAt;
|
|
245
|
+
if (state.status === "success") {
|
|
246
|
+
lines.push(row(`${GUTTER}${palette.success(symbols.success)} ${palette.bold(state.name)} ${palette.muted("completed in")} ${palette.bold(formatDuration(total))}`));
|
|
247
|
+
const parts = [`${succeeded} steps`, `${state.phases.length} phases`];
|
|
248
|
+
if (skipped > 0)
|
|
249
|
+
parts.push(`${skipped} skipped`);
|
|
250
|
+
lines.push(row(`${GUTTER} ${palette.faint(parts.join(` ${symbols.info} `))}`));
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
const where = state.failure
|
|
254
|
+
? `${state.failure.phase} ${symbols.arrow} ${state.failure.step}`
|
|
255
|
+
: "unknown step";
|
|
256
|
+
lines.push(row(`${GUTTER}${palette.error(symbols.failure)} ${palette.bold("Failed")} ${palette.muted("at")} ${palette.error(where)} ${palette.faint(`after ${formatDuration(total)}`)}`));
|
|
257
|
+
if (state.failure) {
|
|
258
|
+
const width = frameWidth() - GUTTER.length - 2;
|
|
259
|
+
for (const line of wrapText(errorMessage(state.failure.error), width)) {
|
|
260
|
+
lines.push(row(`${GUTTER} ${palette.error(line)}`));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (state.rollbackCount > 0) {
|
|
264
|
+
const text = `Rolled back ${state.rollbackCount} step${state.rollbackCount === 1 ? "" : "s"}`;
|
|
265
|
+
lines.push(row(`${GUTTER}${palette.warning(symbols.rolledBack)} ${palette.muted(text)}`));
|
|
266
|
+
}
|
|
267
|
+
if (state.rollbackFailures > 0) {
|
|
268
|
+
lines.push(row(`${GUTTER}${palette.error(symbols.warning)} ${palette.error(`${state.rollbackFailures} rollback(s) failed — manual cleanup required`)}`));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
lines.push("");
|
|
272
|
+
return lines;
|
|
273
|
+
}
|
|
274
|
+
export function renderLogEntry(entry) {
|
|
275
|
+
const icon = {
|
|
276
|
+
log: palette.faint(symbols.info),
|
|
277
|
+
info: palette.info(symbols.info),
|
|
278
|
+
warn: palette.warning(symbols.warning),
|
|
279
|
+
error: palette.error(symbols.failure),
|
|
280
|
+
success: palette.success(symbols.success),
|
|
281
|
+
}[entry.level];
|
|
282
|
+
const paint = {
|
|
283
|
+
log: palette.muted,
|
|
284
|
+
info: palette.info,
|
|
285
|
+
warn: palette.warning,
|
|
286
|
+
error: palette.error,
|
|
287
|
+
success: palette.muted,
|
|
288
|
+
}[entry.level];
|
|
289
|
+
return row(`${DETAIL_INDENT}${icon} ${paint(entry.message)}`);
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/ui/frame.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type LogEntry } from "./frame.js";
|
|
2
|
+
import { type PhaseState, type RunState, type StepState } from "../state.js";
|
|
3
|
+
export interface Renderer {
|
|
4
|
+
start(state: RunState): void;
|
|
5
|
+
/** State mutated; repaint when the renderer is live. */
|
|
6
|
+
refresh(): void;
|
|
7
|
+
log(entry: LogEntry): void;
|
|
8
|
+
onPhaseStart(phase: PhaseState): void;
|
|
9
|
+
onStepStart(step: StepState): void;
|
|
10
|
+
onStepEnd(step: StepState): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
}
|
|
13
|
+
/** Repaints an in-place region below permanently-written output. */
|
|
14
|
+
export declare class LiveRenderer implements Renderer {
|
|
15
|
+
private state;
|
|
16
|
+
private stream;
|
|
17
|
+
private liveLines;
|
|
18
|
+
private tick;
|
|
19
|
+
private timer;
|
|
20
|
+
private stopped;
|
|
21
|
+
private lastPaintAt;
|
|
22
|
+
start(state: RunState): void;
|
|
23
|
+
/**
|
|
24
|
+
* A resize reflows whatever is already on screen, so the line count we
|
|
25
|
+
* recorded no longer describes it. Abandon the old region and redraw below
|
|
26
|
+
* it — a stale frame left in scrollback beats a corrupted cursor.
|
|
27
|
+
*/
|
|
28
|
+
private readonly onResize;
|
|
29
|
+
/**
|
|
30
|
+
* Handlers may call this thousands of times (a progress bar in a tight
|
|
31
|
+
* loop), so coalesce; the frame timer guarantees the last state lands.
|
|
32
|
+
*/
|
|
33
|
+
refresh(): void;
|
|
34
|
+
log(entry: LogEntry): void;
|
|
35
|
+
onPhaseStart(): void;
|
|
36
|
+
onStepStart(): void;
|
|
37
|
+
onStepEnd(): void;
|
|
38
|
+
stop(): void;
|
|
39
|
+
private paint;
|
|
40
|
+
private clear;
|
|
41
|
+
private write;
|
|
42
|
+
}
|
|
43
|
+
/** Line-per-event output for CI, pipes, and dumb terminals. */
|
|
44
|
+
export declare class PlainRenderer implements Renderer {
|
|
45
|
+
private stream;
|
|
46
|
+
start(state: RunState): void;
|
|
47
|
+
refresh(): void;
|
|
48
|
+
log(entry: LogEntry): void;
|
|
49
|
+
onPhaseStart(phase: PhaseState): void;
|
|
50
|
+
onStepStart(step: StepState): void;
|
|
51
|
+
onStepEnd(step: StepState): void;
|
|
52
|
+
stop(): void;
|
|
53
|
+
}
|
|
54
|
+
/** Plain renderer that still prints the closing summary block. */
|
|
55
|
+
export declare class PlainSummaryRenderer extends PlainRenderer {
|
|
56
|
+
private captured;
|
|
57
|
+
start(state: RunState): void;
|
|
58
|
+
stop(): void;
|
|
59
|
+
}
|
|
60
|
+
export declare class SilentRenderer implements Renderer {
|
|
61
|
+
start(): void;
|
|
62
|
+
refresh(): void;
|
|
63
|
+
log(): void;
|
|
64
|
+
onPhaseStart(): void;
|
|
65
|
+
onStepStart(): void;
|
|
66
|
+
onStepEnd(): void;
|
|
67
|
+
stop(): void;
|
|
68
|
+
}
|
|
69
|
+
export declare function createRenderer(options: {
|
|
70
|
+
plain?: boolean;
|
|
71
|
+
silent?: boolean;
|
|
72
|
+
}): Renderer;
|
|
73
|
+
export declare const uiPalette: {
|
|
74
|
+
accent: import("./ansi.js").Styler;
|
|
75
|
+
success: import("./ansi.js").Styler;
|
|
76
|
+
warning: import("./ansi.js").Styler;
|
|
77
|
+
error: import("./ansi.js").Styler;
|
|
78
|
+
info: import("./ansi.js").Styler;
|
|
79
|
+
muted: import("./ansi.js").Styler;
|
|
80
|
+
faint: import("./ansi.js").Styler;
|
|
81
|
+
bold: import("./ansi.js").Styler;
|
|
82
|
+
dim: import("./ansi.js").Styler;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ui/renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,wDAAwD;IACxD,OAAO,IAAI,IAAI,CAAC;IAChB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,IAAI,IAAI,IAAI,CAAC;CACd;AAKD,oEAAoE;AACpE,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAK;IAExB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAc5B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAGvB;IAEF;;;OAGG;IACH,OAAO,IAAI,IAAI;IAMf,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAO1B,YAAY,IAAI,IAAI;IAIpB,WAAW,IAAI,IAAI;IAInB,SAAS,IAAI,IAAI;IAIjB,IAAI,IAAI,IAAI;IAkBZ,OAAO,CAAC,KAAK;IAgBb,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,KAAK;CAGd;AAED,+DAA+D;AAC/D,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,MAAM,CAAkB;IAEhC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAM5B,OAAO,IAAI,IAAI;IAIf,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI1B,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIrC,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAIlC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAiBhC,IAAI,IAAI,IAAI;CAGb;AAED,kEAAkE;AAClE,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAyB;IAEhC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAK5B,IAAI,IAAI,IAAI;CAItB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAC7C,KAAK,IAAI,IAAI;IACb,OAAO,IAAI,IAAI;IACf,GAAG,IAAI,IAAI;IACX,YAAY,IAAI,IAAI;IACpB,WAAW,IAAI,IAAI;IACnB,SAAS,IAAI,IAAI;IACjB,IAAI,IAAI,IAAI;CACb;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,CAKvF;AAED,eAAO,MAAM,SAAS;;;;;;;;;;CAAU,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { cursor } from "./ansi.js";
|
|
2
|
+
import { palette, supportsAnimation, symbols } from "./theme.js";
|
|
3
|
+
import { renderBody, renderHeader, renderLogEntry, renderSummary, } from "./frame.js";
|
|
4
|
+
import { elapsed, errorMessage, formatDuration, } from "../state.js";
|
|
5
|
+
const FRAME_INTERVAL_MS = 80;
|
|
6
|
+
const MIN_REPAINT_MS = 32;
|
|
7
|
+
/** Repaints an in-place region below permanently-written output. */
|
|
8
|
+
export class LiveRenderer {
|
|
9
|
+
state = null;
|
|
10
|
+
stream = process.stdout;
|
|
11
|
+
liveLines = 0;
|
|
12
|
+
tick = 0;
|
|
13
|
+
timer = null;
|
|
14
|
+
stopped = false;
|
|
15
|
+
lastPaintAt = 0;
|
|
16
|
+
start(state) {
|
|
17
|
+
this.state = state;
|
|
18
|
+
this.stopped = false;
|
|
19
|
+
this.write(renderHeader(state).join("\n") + "\n");
|
|
20
|
+
this.stream.write(cursor.hide);
|
|
21
|
+
this.stream.on("resize", this.onResize);
|
|
22
|
+
this.timer = setInterval(() => {
|
|
23
|
+
this.tick += 1;
|
|
24
|
+
this.paint();
|
|
25
|
+
}, FRAME_INTERVAL_MS);
|
|
26
|
+
this.timer.unref?.();
|
|
27
|
+
this.paint();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A resize reflows whatever is already on screen, so the line count we
|
|
31
|
+
* recorded no longer describes it. Abandon the old region and redraw below
|
|
32
|
+
* it — a stale frame left in scrollback beats a corrupted cursor.
|
|
33
|
+
*/
|
|
34
|
+
onResize = () => {
|
|
35
|
+
this.liveLines = 0;
|
|
36
|
+
this.paint();
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Handlers may call this thousands of times (a progress bar in a tight
|
|
40
|
+
* loop), so coalesce; the frame timer guarantees the last state lands.
|
|
41
|
+
*/
|
|
42
|
+
refresh() {
|
|
43
|
+
const now = performance.now();
|
|
44
|
+
if (now - this.lastPaintAt < MIN_REPAINT_MS)
|
|
45
|
+
return;
|
|
46
|
+
this.paint();
|
|
47
|
+
}
|
|
48
|
+
log(entry) {
|
|
49
|
+
if (this.stopped)
|
|
50
|
+
return;
|
|
51
|
+
this.clear();
|
|
52
|
+
this.write(renderLogEntry(entry) + "\n");
|
|
53
|
+
this.paint();
|
|
54
|
+
}
|
|
55
|
+
onPhaseStart() {
|
|
56
|
+
/* covered by repaint */
|
|
57
|
+
}
|
|
58
|
+
onStepStart() {
|
|
59
|
+
/* covered by repaint */
|
|
60
|
+
}
|
|
61
|
+
onStepEnd() {
|
|
62
|
+
/* covered by repaint */
|
|
63
|
+
}
|
|
64
|
+
stop() {
|
|
65
|
+
if (this.stopped || !this.state)
|
|
66
|
+
return;
|
|
67
|
+
this.stopped = true;
|
|
68
|
+
if (this.timer)
|
|
69
|
+
clearInterval(this.timer);
|
|
70
|
+
this.timer = null;
|
|
71
|
+
this.stream.off("resize", this.onResize);
|
|
72
|
+
const now = performance.now();
|
|
73
|
+
this.clear();
|
|
74
|
+
const final = [
|
|
75
|
+
...renderBody(this.state, this.tick, now, false),
|
|
76
|
+
...renderSummary(this.state, now),
|
|
77
|
+
];
|
|
78
|
+
this.write(final.join("\n") + "\n");
|
|
79
|
+
this.liveLines = 0;
|
|
80
|
+
this.stream.write(cursor.show);
|
|
81
|
+
}
|
|
82
|
+
paint() {
|
|
83
|
+
if (this.stopped || !this.state)
|
|
84
|
+
return;
|
|
85
|
+
const now = performance.now();
|
|
86
|
+
// renderBody already fits itself to the viewport; this clamp is the
|
|
87
|
+
// backstop that keeps the up-N-lines invariant true no matter what, since
|
|
88
|
+
// a frame taller than the terminal scrolls its own anchor off screen.
|
|
89
|
+
const maxLines = Math.max(1, (process.stdout.rows ?? 40) - 1);
|
|
90
|
+
const body = renderBody(this.state, this.tick, now).slice(0, maxLines);
|
|
91
|
+
this.clear();
|
|
92
|
+
this.write(body.join("\n") + "\n");
|
|
93
|
+
this.liveLines = body.length;
|
|
94
|
+
this.lastPaintAt = now;
|
|
95
|
+
}
|
|
96
|
+
clear() {
|
|
97
|
+
if (this.liveLines === 0)
|
|
98
|
+
return;
|
|
99
|
+
this.stream.write(cursor.up(this.liveLines) + cursor.toStart + cursor.eraseDown);
|
|
100
|
+
this.liveLines = 0;
|
|
101
|
+
}
|
|
102
|
+
write(text) {
|
|
103
|
+
this.stream.write(text);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Line-per-event output for CI, pipes, and dumb terminals. */
|
|
107
|
+
export class PlainRenderer {
|
|
108
|
+
stream = process.stdout;
|
|
109
|
+
start(state) {
|
|
110
|
+
this.stream.write(`\n${symbols.brand} ${state.name}\n`);
|
|
111
|
+
if (state.description)
|
|
112
|
+
this.stream.write(`${symbols.brand} ${state.description}\n`);
|
|
113
|
+
this.stream.write("\n");
|
|
114
|
+
}
|
|
115
|
+
refresh() {
|
|
116
|
+
/* no live region */
|
|
117
|
+
}
|
|
118
|
+
log(entry) {
|
|
119
|
+
this.stream.write(` ${renderLogEntry(entry).trimStart()}\n`);
|
|
120
|
+
}
|
|
121
|
+
onPhaseStart(phase) {
|
|
122
|
+
this.stream.write(`${symbols.arrow} ${phase.name}\n`);
|
|
123
|
+
}
|
|
124
|
+
onStepStart(step) {
|
|
125
|
+
this.stream.write(` ${symbols.pending} ${step.name}\n`);
|
|
126
|
+
}
|
|
127
|
+
onStepEnd(step) {
|
|
128
|
+
const duration = elapsed(step, performance.now());
|
|
129
|
+
const time = duration === undefined ? "" : ` ${formatDuration(duration)}`;
|
|
130
|
+
const icon = step.status === "success"
|
|
131
|
+
? symbols.success
|
|
132
|
+
: step.status === "skipped"
|
|
133
|
+
? symbols.skipped
|
|
134
|
+
: step.status === "rolled-back"
|
|
135
|
+
? symbols.rolledBack
|
|
136
|
+
: step.status === "failed" || step.status === "rollback-failed"
|
|
137
|
+
? symbols.failure
|
|
138
|
+
: symbols.info;
|
|
139
|
+
const suffix = step.error === undefined ? "" : ` ${errorMessage(step.error)}`;
|
|
140
|
+
this.stream.write(` ${icon} ${step.name}${time}${suffix}\n`);
|
|
141
|
+
}
|
|
142
|
+
stop() {
|
|
143
|
+
/* summary printed by the caller via printSummary */
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Plain renderer that still prints the closing summary block. */
|
|
147
|
+
export class PlainSummaryRenderer extends PlainRenderer {
|
|
148
|
+
captured = null;
|
|
149
|
+
start(state) {
|
|
150
|
+
this.captured = state;
|
|
151
|
+
super.start(state);
|
|
152
|
+
}
|
|
153
|
+
stop() {
|
|
154
|
+
if (!this.captured)
|
|
155
|
+
return;
|
|
156
|
+
process.stdout.write(renderSummary(this.captured, performance.now()).join("\n") + "\n");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export class SilentRenderer {
|
|
160
|
+
start() { }
|
|
161
|
+
refresh() { }
|
|
162
|
+
log() { }
|
|
163
|
+
onPhaseStart() { }
|
|
164
|
+
onStepStart() { }
|
|
165
|
+
onStepEnd() { }
|
|
166
|
+
stop() { }
|
|
167
|
+
}
|
|
168
|
+
export function createRenderer(options) {
|
|
169
|
+
if (options.silent)
|
|
170
|
+
return new SilentRenderer();
|
|
171
|
+
if (options.plain === true)
|
|
172
|
+
return new PlainSummaryRenderer();
|
|
173
|
+
if (options.plain === false)
|
|
174
|
+
return new LiveRenderer();
|
|
175
|
+
return supportsAnimation() ? new LiveRenderer() : new PlainSummaryRenderer();
|
|
176
|
+
}
|
|
177
|
+
export const uiPalette = palette;
|
|
178
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/ui/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const symbols: {
|
|
2
|
+
success: string;
|
|
3
|
+
failure: string;
|
|
4
|
+
pending: string;
|
|
5
|
+
skipped: string;
|
|
6
|
+
rolledBack: string;
|
|
7
|
+
warning: string;
|
|
8
|
+
info: string;
|
|
9
|
+
arrow: string;
|
|
10
|
+
brand: string;
|
|
11
|
+
rule: string;
|
|
12
|
+
barFull: string;
|
|
13
|
+
barEmpty: string;
|
|
14
|
+
barLeft: string;
|
|
15
|
+
barRight: string;
|
|
16
|
+
spinner: string[];
|
|
17
|
+
};
|
|
18
|
+
export declare const palette: {
|
|
19
|
+
accent: import("./ansi.js").Styler;
|
|
20
|
+
success: import("./ansi.js").Styler;
|
|
21
|
+
warning: import("./ansi.js").Styler;
|
|
22
|
+
error: import("./ansi.js").Styler;
|
|
23
|
+
info: import("./ansi.js").Styler;
|
|
24
|
+
muted: import("./ansi.js").Styler;
|
|
25
|
+
faint: import("./ansi.js").Styler;
|
|
26
|
+
bold: import("./ansi.js").Styler;
|
|
27
|
+
dim: import("./ansi.js").Styler;
|
|
28
|
+
};
|
|
29
|
+
export declare function spinnerFrame(tick: number): string;
|
|
30
|
+
/** Total render width, clamped so wide terminals stay readable. */
|
|
31
|
+
export declare function frameWidth(): number;
|
|
32
|
+
export declare function supportsAnimation(): boolean;
|
|
33
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;CAkCf,CAAC;AAEN,eAAO,MAAM,OAAO;;;;;;;;;;CAUnB,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
|