@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/dist/script.js ADDED
@@ -0,0 +1,410 @@
1
+ import { createRollbackContext, createStepContext } from "./context.js";
2
+ import { ScriptAbortedError, StepTimeoutError, isAbort } from "./errors.js";
3
+ import { createRenderer } from "./ui/renderer.js";
4
+ /* -------------------------------------------------------------------------- */
5
+ /* Builder */
6
+ /* -------------------------------------------------------------------------- */
7
+ /**
8
+ * A saga-style script: phases of steps, each step optionally compensating when
9
+ * a later step fails.
10
+ *
11
+ * The second type parameter is inferred, never written by hand — every
12
+ * `addStep` whose handler returns an object widens it, so later handlers see
13
+ * everything earlier ones produced.
14
+ *
15
+ * ```ts
16
+ * const result = await new Script<{ userId: string }>("provision")
17
+ * .addPhase("Validation")
18
+ * .addStep({
19
+ * name: "load user",
20
+ * handler: async ({ input }) => ({ user: await db.user(input.userId) }),
21
+ * })
22
+ * .addPhase("Provision")
23
+ * .addStep({
24
+ * name: "create tenant",
25
+ * handler: async ({ ctx }) => ({ tenantId: await api.create(ctx.user.org) }),
26
+ * rollback: async ({ output }) => api.destroy(output.tenantId),
27
+ * })
28
+ * .run({ userId: "u_1" });
29
+ * ```
30
+ */
31
+ export class Script {
32
+ options;
33
+ definition = [];
34
+ constructor(options = {}) {
35
+ this.options = typeof options === "string" ? { name: options } : options;
36
+ }
37
+ addPhase(name, optionsOrBuild, maybeBuild) {
38
+ const build = typeof optionsOrBuild === "function" ? optionsOrBuild : maybeBuild;
39
+ const options = typeof optionsOrBuild === "function" ? {} : (optionsOrBuild ?? {});
40
+ this.definition.push({
41
+ name,
42
+ options: options,
43
+ steps: [],
44
+ });
45
+ if (build)
46
+ return build(this);
47
+ return this;
48
+ }
49
+ /**
50
+ * Append a step to the current phase. Whatever the handler resolves to is
51
+ * merged into the context and becomes visible to every later step.
52
+ */
53
+ addStep(def) {
54
+ this.currentPhase().steps.push(def);
55
+ return this;
56
+ }
57
+ /** Every step name, in execution order — handy for tests and docs. */
58
+ outline() {
59
+ return this.definition.map((phase) => ({
60
+ phase: phase.name,
61
+ steps: phase.steps.map((step) => step.name),
62
+ }));
63
+ }
64
+ currentPhase() {
65
+ const last = this.definition.at(-1);
66
+ if (last)
67
+ return last;
68
+ const implicit = { name: "Main", options: {}, steps: [] };
69
+ this.definition.push(implicit);
70
+ return implicit;
71
+ }
72
+ /* ------------------------------------------------------------------------ */
73
+ /* Runner */
74
+ /* ------------------------------------------------------------------------ */
75
+ async run(input, runOptions = {}) {
76
+ const runtime = [];
77
+ const phases = this.definition.map((phase, phaseIndex) => {
78
+ const steps = phase.steps.map((def) => {
79
+ const state = {
80
+ name: def.name,
81
+ phaseIndex,
82
+ status: "pending",
83
+ attempts: 0,
84
+ tasks: [],
85
+ hasRollback: typeof def.rollback === "function",
86
+ };
87
+ if (def.description !== undefined)
88
+ state.description = def.description;
89
+ runtime.push({ def, state, phaseName: phase.name });
90
+ return state;
91
+ });
92
+ const phaseState = { name: phase.name, steps };
93
+ if (phase.options.description !== undefined) {
94
+ phaseState.description = phase.options.description;
95
+ }
96
+ return phaseState;
97
+ });
98
+ const state = {
99
+ name: this.options.name ?? "script",
100
+ phases,
101
+ status: "running",
102
+ startedAt: performance.now(),
103
+ rollbackCount: 0,
104
+ rollbackFailures: 0,
105
+ };
106
+ if (this.options.description !== undefined)
107
+ state.description = this.options.description;
108
+ const renderer = createRenderer({
109
+ ...(this.options.plain !== undefined ? { plain: this.options.plain } : {}),
110
+ ...(this.options.silent !== undefined ? { silent: this.options.silent } : {}),
111
+ });
112
+ const runController = new AbortController();
113
+ const rollbackController = new AbortController();
114
+ const detach = this.attachCancellation(runController, rollbackController, runOptions.signal);
115
+ const ctx = {};
116
+ const completed = [];
117
+ const rollbacks = [];
118
+ let failure = null;
119
+ renderer.start(state);
120
+ try {
121
+ let cursor = 0;
122
+ phaseLoop: for (const [phaseIndex, phase] of this.definition.entries()) {
123
+ const phaseState = phases[phaseIndex];
124
+ const phaseSteps = runtime.slice(cursor, cursor + phase.steps.length);
125
+ cursor += phase.steps.length;
126
+ if (!phaseState)
127
+ continue;
128
+ renderer.onPhaseStart(phaseState);
129
+ if (phase.options.when && !(await phase.options.when({ input, ctx }))) {
130
+ for (const item of phaseSteps) {
131
+ item.state.status = "skipped";
132
+ renderer.onStepEnd(item.state);
133
+ }
134
+ renderer.refresh();
135
+ continue;
136
+ }
137
+ for (const item of phaseSteps) {
138
+ if (runController.signal.aborted) {
139
+ failure = {
140
+ phase: phase.name,
141
+ step: item.state.name,
142
+ error: runController.signal.reason ?? new ScriptAbortedError("cancelled"),
143
+ };
144
+ break phaseLoop;
145
+ }
146
+ if (item.def.when && !(await item.def.when({ input, ctx }))) {
147
+ item.state.status = "skipped";
148
+ renderer.onStepEnd(item.state);
149
+ renderer.refresh();
150
+ continue;
151
+ }
152
+ item.state.status = "running";
153
+ item.state.startedAt = performance.now();
154
+ renderer.onStepStart(item.state);
155
+ renderer.refresh();
156
+ try {
157
+ const output = await this.executeStep(item, input, ctx, runController.signal, renderer);
158
+ item.state.status = "success";
159
+ item.state.endedAt = performance.now();
160
+ delete item.state.statusText;
161
+ if (output !== null && typeof output === "object") {
162
+ Object.assign(ctx, output);
163
+ }
164
+ completed.push({ runtime: item, output });
165
+ renderer.onStepEnd(item.state);
166
+ renderer.refresh();
167
+ }
168
+ catch (error) {
169
+ item.state.status = "failed";
170
+ item.state.endedAt = performance.now();
171
+ item.state.error = error;
172
+ delete item.state.statusText;
173
+ failure = { phase: phase.name, step: item.state.name, error };
174
+ renderer.onStepEnd(item.state);
175
+ renderer.refresh();
176
+ break phaseLoop;
177
+ }
178
+ }
179
+ }
180
+ if (failure) {
181
+ state.status = isAbort(failure.error) ? "aborted" : "failed";
182
+ state.failure = failure;
183
+ await this.unwind(completed, failure, input, ctx, state, rollbacks, rollbackController.signal, renderer);
184
+ }
185
+ else {
186
+ state.status = "success";
187
+ }
188
+ }
189
+ finally {
190
+ state.endedAt = performance.now();
191
+ renderer.stop();
192
+ detach();
193
+ }
194
+ const steps = runtime.map((item) => {
195
+ const report = {
196
+ phase: item.phaseName,
197
+ name: item.state.name,
198
+ status: item.state.status,
199
+ durationMs: item.state.startedAt === undefined
200
+ ? 0
201
+ : (item.state.endedAt ?? performance.now()) - item.state.startedAt,
202
+ attempts: item.state.attempts,
203
+ };
204
+ if (item.state.error !== undefined)
205
+ report.error = item.state.error;
206
+ return report;
207
+ });
208
+ const durationMs = (state.endedAt ?? performance.now()) - state.startedAt;
209
+ if (failure) {
210
+ if (this.options.throwOnError)
211
+ throw failure.error;
212
+ return {
213
+ ok: false,
214
+ status: state.status === "aborted" ? "aborted" : "failed",
215
+ error: failure.error,
216
+ failedAt: { phase: failure.phase, step: failure.step },
217
+ ctx: ctx,
218
+ durationMs,
219
+ steps,
220
+ rollbacks,
221
+ };
222
+ }
223
+ return {
224
+ ok: true,
225
+ status: "success",
226
+ ctx: ctx,
227
+ durationMs,
228
+ steps,
229
+ };
230
+ }
231
+ /** Retry + timeout wrapper around a single handler invocation. */
232
+ async executeStep(item, input, ctx, runSignal, renderer) {
233
+ const retry = item.def.retry;
234
+ const maxAttempts = Math.max(1, retry?.attempts ?? 1);
235
+ let lastError;
236
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
237
+ item.state.attempts = attempt;
238
+ item.state.status = "running";
239
+ renderer.refresh();
240
+ const controller = new AbortController();
241
+ const forward = () => controller.abort(runSignal.reason);
242
+ if (runSignal.aborted)
243
+ controller.abort(runSignal.reason);
244
+ else
245
+ runSignal.addEventListener("abort", forward, { once: true });
246
+ const timeoutMs = item.def.timeoutMs;
247
+ const timer = timeoutMs === undefined
248
+ ? undefined
249
+ : setTimeout(() => controller.abort(new StepTimeoutError(item.def.name, timeoutMs)), timeoutMs);
250
+ const bail = abortRejection(controller.signal);
251
+ try {
252
+ const context = createStepContext({ renderer, step: item.state, phaseName: item.phaseName }, input, ctx, controller.signal, attempt);
253
+ return await Promise.race([
254
+ Promise.resolve(item.def.handler(context)),
255
+ bail.promise,
256
+ ]);
257
+ }
258
+ catch (error) {
259
+ lastError = error;
260
+ if (isAbort(error))
261
+ throw error;
262
+ const allowed = retry?.retryIf?.(error, attempt) ?? true;
263
+ if (attempt >= maxAttempts || !allowed)
264
+ throw error;
265
+ const delayMs = resolveDelay(retry, attempt);
266
+ item.state.statusText = `attempt ${attempt} failed, retrying in ${delayMs}ms`;
267
+ renderer.refresh();
268
+ await sleep(delayMs, runSignal);
269
+ }
270
+ finally {
271
+ if (timer)
272
+ clearTimeout(timer);
273
+ runSignal.removeEventListener("abort", forward);
274
+ bail.dispose();
275
+ }
276
+ }
277
+ throw lastError;
278
+ }
279
+ /** Compensate completed steps in reverse order. */
280
+ async unwind(completed, failure, input, ctx, state, rollbacks, signal, renderer) {
281
+ const mode = this.options.rollback ?? "all";
282
+ if (mode === "none")
283
+ return;
284
+ const targets = completed
285
+ .filter((entry) => mode === "all" || entry.runtime.phaseName === failure.phase)
286
+ .reverse();
287
+ for (const entry of targets) {
288
+ const rollback = entry.runtime.def.rollback;
289
+ if (!rollback)
290
+ continue;
291
+ if (signal.aborted)
292
+ break;
293
+ entry.runtime.state.status = "rolling-back";
294
+ renderer.refresh();
295
+ try {
296
+ const context = createRollbackContext({ renderer, step: entry.runtime.state, phaseName: entry.runtime.phaseName }, input, ctx, entry.output, failure.error, signal);
297
+ await rollback(context);
298
+ entry.runtime.state.status = "rolled-back";
299
+ delete entry.runtime.state.statusText;
300
+ state.rollbackCount += 1;
301
+ rollbacks.push({ phase: entry.runtime.phaseName, step: entry.runtime.state.name, ok: true });
302
+ }
303
+ catch (error) {
304
+ entry.runtime.state.status = "rollback-failed";
305
+ entry.runtime.state.error = error;
306
+ state.rollbackFailures += 1;
307
+ rollbacks.push({
308
+ phase: entry.runtime.phaseName,
309
+ step: entry.runtime.state.name,
310
+ ok: false,
311
+ error,
312
+ });
313
+ }
314
+ renderer.refresh();
315
+ }
316
+ }
317
+ /**
318
+ * Wire up cancellation. The first interrupt stops the run and lets
319
+ * compensation proceed; a second one abandons compensation too.
320
+ */
321
+ attachCancellation(run, rollback, external) {
322
+ const disposers = [];
323
+ if (external) {
324
+ const forward = () => run.abort(external.reason);
325
+ if (external.aborted)
326
+ run.abort(external.reason);
327
+ else
328
+ external.addEventListener("abort", forward, { once: true });
329
+ disposers.push(() => external.removeEventListener("abort", forward));
330
+ }
331
+ if (this.options.handleSignals !== false) {
332
+ for (const signalName of ["SIGINT", "SIGTERM"]) {
333
+ const handler = () => {
334
+ if (run.signal.aborted)
335
+ rollback.abort(new ScriptAbortedError(`${signalName} (forced)`));
336
+ else
337
+ run.abort(new ScriptAbortedError(signalName));
338
+ };
339
+ process.on(signalName, handler);
340
+ disposers.push(() => {
341
+ process.off(signalName, handler);
342
+ });
343
+ }
344
+ }
345
+ return () => {
346
+ for (const dispose of disposers)
347
+ dispose();
348
+ };
349
+ }
350
+ }
351
+ /* -------------------------------------------------------------------------- */
352
+ /* Helpers */
353
+ /* -------------------------------------------------------------------------- */
354
+ function resolveDelay(retry, attempt) {
355
+ const delay = retry?.delayMs;
356
+ if (typeof delay === "function")
357
+ return Math.max(0, delay(attempt));
358
+ return Math.max(0, delay ?? 0);
359
+ }
360
+ function sleep(ms, signal) {
361
+ if (ms <= 0)
362
+ return Promise.resolve();
363
+ return new Promise((resolve) => {
364
+ const timer = setTimeout(finish, ms);
365
+ function finish() {
366
+ clearTimeout(timer);
367
+ signal.removeEventListener("abort", finish);
368
+ resolve();
369
+ }
370
+ signal.addEventListener("abort", finish, { once: true });
371
+ });
372
+ }
373
+ function abortRejection(signal) {
374
+ let listener;
375
+ const promise = new Promise((_resolve, reject) => {
376
+ const fail = () => reject(signal.reason ?? new ScriptAbortedError("aborted"));
377
+ if (signal.aborted) {
378
+ fail();
379
+ return;
380
+ }
381
+ listener = fail;
382
+ signal.addEventListener("abort", fail, { once: true });
383
+ });
384
+ return {
385
+ promise,
386
+ dispose: () => {
387
+ if (listener)
388
+ signal.removeEventListener("abort", listener);
389
+ },
390
+ };
391
+ }
392
+ /**
393
+ * Define a step in its own module while keeping full inference. Bind the input
394
+ * and the context the step expects, then pass the definition to `addStep`.
395
+ *
396
+ * ```ts
397
+ * export const verifyId = stepFor<Input, { user: User }>()({
398
+ * name: "verify id",
399
+ * handler: async ({ ctx }) => ({ verified: ctx.user.id }),
400
+ * });
401
+ * ```
402
+ */
403
+ export function stepFor() {
404
+ return (def) => def;
405
+ }
406
+ /** Convenience factory so callers can skip `new`. */
407
+ export function script(options) {
408
+ return new Script(options);
409
+ }
410
+ //# sourceMappingURL=script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../src/script.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { PhaseStatus, RunStatus, StepStatus } from "./types.js";
2
+ export interface ProgressState {
3
+ total: number;
4
+ value: number;
5
+ label?: string;
6
+ complete: boolean;
7
+ }
8
+ export interface TaskState {
9
+ label: string;
10
+ status: "pending" | "running" | "done" | "failed" | "skipped";
11
+ }
12
+ export interface StepState {
13
+ name: string;
14
+ description?: string;
15
+ phaseIndex: number;
16
+ status: StepStatus;
17
+ statusText?: string;
18
+ startedAt?: number;
19
+ endedAt?: number;
20
+ attempts: number;
21
+ error?: unknown;
22
+ progress?: ProgressState;
23
+ tasks: TaskState[];
24
+ hasRollback: boolean;
25
+ }
26
+ export interface PhaseState {
27
+ name: string;
28
+ description?: string;
29
+ steps: StepState[];
30
+ }
31
+ export interface RunState {
32
+ name: string;
33
+ description?: string;
34
+ phases: PhaseState[];
35
+ status: RunStatus;
36
+ startedAt: number;
37
+ endedAt?: number;
38
+ failure?: {
39
+ phase: string;
40
+ step: string;
41
+ error: unknown;
42
+ };
43
+ rollbackCount: number;
44
+ rollbackFailures: number;
45
+ }
46
+ export declare function phaseStatus(phase: PhaseState): PhaseStatus;
47
+ export declare function elapsed(step: StepState, now: number): number | undefined;
48
+ export declare function phaseElapsed(phase: PhaseState, now: number): number | undefined;
49
+ export declare function formatDuration(ms: number): string;
50
+ export declare function errorMessage(error: unknown): string;
51
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC/D;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAe1D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY/E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQnD"}
package/dist/state.js ADDED
@@ -0,0 +1,58 @@
1
+ export function phaseStatus(phase) {
2
+ const steps = phase.steps;
3
+ if (steps.length === 0)
4
+ return "success";
5
+ if (steps.some((s) => s.status === "failed" || s.status === "rollback-failed"))
6
+ return "failed";
7
+ if (steps.some((s) => s.status === "running" || s.status === "rolling-back" || s.status === "rolled-back")) {
8
+ return "running";
9
+ }
10
+ if (steps.every((s) => s.status === "skipped"))
11
+ return "skipped";
12
+ if (steps.every((s) => s.status === "success" || s.status === "skipped"))
13
+ return "success";
14
+ if (steps.every((s) => s.status === "pending"))
15
+ return "pending";
16
+ return "running";
17
+ }
18
+ export function elapsed(step, now) {
19
+ if (step.startedAt === undefined)
20
+ return undefined;
21
+ return (step.endedAt ?? now) - step.startedAt;
22
+ }
23
+ export function phaseElapsed(phase, now) {
24
+ const started = phase.steps
25
+ .map((s) => s.startedAt)
26
+ .filter((v) => v !== undefined);
27
+ if (started.length === 0)
28
+ return undefined;
29
+ const min = Math.min(...started);
30
+ const allDone = phase.steps.every((s) => s.startedAt === undefined || s.endedAt !== undefined);
31
+ const ends = phase.steps
32
+ .map((s) => s.endedAt)
33
+ .filter((v) => v !== undefined);
34
+ const max = allDone && ends.length > 0 ? Math.max(...ends) : now;
35
+ return max - min;
36
+ }
37
+ export function formatDuration(ms) {
38
+ if (ms < 1000)
39
+ return `${Math.round(ms)}ms`;
40
+ if (ms < 60_000)
41
+ return `${(ms / 1000).toFixed(1)}s`;
42
+ const minutes = Math.floor(ms / 60_000);
43
+ const seconds = Math.round((ms % 60_000) / 1000);
44
+ return `${minutes}m ${seconds}s`;
45
+ }
46
+ export function errorMessage(error) {
47
+ if (error instanceof Error)
48
+ return error.message || error.name;
49
+ if (typeof error === "string")
50
+ return error;
51
+ try {
52
+ return JSON.stringify(error);
53
+ }
54
+ catch {
55
+ return String(error);
56
+ }
57
+ }
58
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}