tubeless 0.2.11 → 0.2.13
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/core/child-execution.d.ts +1 -24
- package/dist/core/child-execution.js +11 -13
- package/dist/core/child-execution.js.map +1 -1
- package/dist/core/child-progress.js +7 -2
- package/dist/core/child-progress.js.map +1 -1
- package/dist/core/iteration.d.ts +27 -0
- package/dist/core/iteration.js +111 -0
- package/dist/core/iteration.js.map +1 -0
- package/dist/core/lifecycle.d.ts +7 -5
- package/dist/core/lifecycle.js +36 -4
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/pipeline-artifacts.d.ts +11 -0
- package/dist/core/pipeline-artifacts.js +2 -0
- package/dist/core/pipeline-artifacts.js.map +1 -0
- package/dist/core/pipeline-compiler.d.ts +1 -0
- package/dist/core/pipeline-compiler.js +1 -0
- package/dist/core/pipeline-compiler.js.map +1 -1
- package/dist/core/pipeline-definition-identity.d.ts +2 -2
- package/dist/core/pipeline-definition-identity.js +28 -5
- package/dist/core/pipeline-definition-identity.js.map +1 -1
- package/dist/core/pipeline-execute.d.ts +1 -6
- package/dist/core/pipeline-execute.js +28 -215
- package/dist/core/pipeline-execute.js.map +1 -1
- package/dist/core/pipeline-execution-error.d.ts +35 -0
- package/dist/core/pipeline-execution-error.js +195 -0
- package/dist/core/pipeline-execution-error.js.map +1 -0
- package/dist/core/pipeline-identity.d.ts +1 -0
- package/dist/core/pipeline-identity.js +1 -0
- package/dist/core/pipeline-identity.js.map +1 -1
- package/dist/core/pipeline-mermaid.js +4 -1
- package/dist/core/pipeline-mermaid.js.map +1 -1
- package/dist/core/pipeline-run-state.d.ts +4 -4
- package/dist/core/pipeline-run-state.js +10 -16
- package/dist/core/pipeline-run-state.js.map +1 -1
- package/dist/core/pipeline-step-executor.d.ts +2 -0
- package/dist/core/pipeline-step-executor.js +11 -3
- package/dist/core/pipeline-step-executor.js.map +1 -1
- package/dist/core/pipeline-steps.d.ts +24 -1
- package/dist/core/pipeline-steps.js +62 -0
- package/dist/core/pipeline-steps.js.map +1 -1
- package/dist/core/pipeline-types.d.ts +28 -3
- package/dist/core/pipeline-types.js.map +1 -1
- package/dist/core/pipeline.d.ts +4 -1
- package/dist/core/pipeline.js +22 -4
- package/dist/core/pipeline.js.map +1 -1
- package/dist/project/project-compiler.d.ts +3 -31
- package/dist/project/project-compiler.js +11 -180
- package/dist/project/project-compiler.js.map +1 -1
- package/dist/project/project-registry.d.ts +44 -0
- package/dist/project/project-registry.js +107 -0
- package/dist/project/project-registry.js.map +1 -0
- package/dist/project/project-step-graph.d.ts +9 -0
- package/dist/project/project-step-graph.js +99 -0
- package/dist/project/project-step-graph.js.map +1 -0
- package/dist/render/render.js +1 -1
- package/dist/render/render.js.map +1 -1
- package/dist/reporter/interactive-reporter.js +6 -3
- package/dist/reporter/interactive-reporter.js.map +1 -1
- package/dist/reporter/live-ticker-frame.d.ts +21 -0
- package/dist/reporter/live-ticker-frame.js +196 -0
- package/dist/reporter/live-ticker-frame.js.map +1 -0
- package/dist/reporter/live-ticker-protocol.d.ts +41 -0
- package/dist/reporter/live-ticker-protocol.js +59 -0
- package/dist/reporter/live-ticker-protocol.js.map +1 -0
- package/dist/reporter/live-ticker-worker.js +11 -25
- package/dist/reporter/live-ticker-worker.js.map +1 -1
- package/dist/reporter/live-ticker.d.ts +0 -15
- package/dist/reporter/live-ticker.js +11 -216
- package/dist/reporter/live-ticker.js.map +1 -1
- package/dist/reporter/reporter.js +7 -6
- package/dist/reporter/reporter.js.map +1 -1
- package/dist/run-store/definition-projection.d.ts +8 -0
- package/dist/run-store/definition-projection.js +89 -0
- package/dist/run-store/definition-projection.js.map +1 -0
- package/dist/run-store/run-projection.d.ts +15 -0
- package/dist/run-store/run-projection.js +203 -0
- package/dist/run-store/run-projection.js.map +1 -0
- package/dist/run-store/run-store-codec.d.ts +2 -0
- package/dist/run-store/run-store-codec.js +11 -0
- package/dist/run-store/run-store-codec.js.map +1 -1
- package/dist/run-store/run-store-event-decoder.js +3 -0
- package/dist/run-store/run-store-event-decoder.js.map +1 -1
- package/dist/run-store/run-store-reader.d.ts +7 -0
- package/dist/run-store/run-store-reader.js +31 -0
- package/dist/run-store/run-store-reader.js.map +1 -0
- package/dist/run-store/run-store-sqlite.js +23 -7
- package/dist/run-store/run-store-sqlite.js.map +1 -1
- package/dist/run-store/run-store.d.ts +16 -4
- package/dist/run-store/run-store.js +14 -263
- package/dist/run-store/run-store.js.map +1 -1
- package/dist/studio/run-store-ui-api.d.ts +13 -0
- package/dist/studio/run-store-ui-api.js +163 -0
- package/dist/studio/run-store-ui-api.js.map +1 -0
- package/dist/studio/run-store-ui-client-browser.js +2 -2
- package/dist/studio/run-store-ui-client-transport.js +28 -3
- package/dist/studio/run-store-ui-client-transport.js.map +1 -1
- package/dist/studio/run-store-ui-client.d.ts +2 -1
- package/dist/studio/run-store-ui-client.js +15 -9
- package/dist/studio/run-store-ui-client.js.map +1 -1
- package/dist/studio/run-store-ui-http.d.ts +11 -0
- package/dist/studio/run-store-ui-http.js +52 -0
- package/dist/studio/run-store-ui-http.js.map +1 -1
- package/dist/studio/run-store-ui-state.d.ts +1 -1
- package/dist/studio/run-store-ui-state.js +10 -28
- package/dist/studio/run-store-ui-state.js.map +1 -1
- package/dist/studio/run-store-ui.d.ts +5 -11
- package/dist/studio/run-store-ui.js +5 -203
- package/dist/studio/run-store-ui.js.map +1 -1
- package/dist/testing/testing.d.ts +18 -2
- package/dist/testing/testing.js +35 -2
- package/dist/testing/testing.js.map +1 -1
- package/dist/tracing/artifact-metadata.d.ts +28 -0
- package/dist/tracing/artifact-metadata.js +105 -0
- package/dist/tracing/artifact-metadata.js.map +1 -0
- package/dist/tracing/tracing-codec.d.ts +1 -1
- package/dist/tracing/tracing-codec.js +1 -1
- package/dist/tracing/tracing-codec.js.map +1 -1
- package/dist/tracing/tracing-constants.d.ts +1 -1
- package/dist/tracing/tracing-constants.js +1 -1
- package/dist/tracing/tracing-constants.js.map +1 -1
- package/dist/tracing/tracing-contracts.d.ts +3 -1
- package/dist/tracing/tracing-contracts.js.map +1 -1
- package/dist/tracing/tracing-internal.d.ts +2 -0
- package/dist/tracing/tracing-internal.js +36 -13
- package/dist/tracing/tracing-internal.js.map +1 -1
- package/dist/tracing/tracing-schema.d.ts +330 -49
- package/dist/tracing/tracing-schema.js +102 -10
- package/dist/tracing/tracing-schema.js.map +1 -1
- package/dist/workbench/workbench-command-execution.d.ts +6 -0
- package/dist/workbench/workbench-command-execution.js +48 -0
- package/dist/workbench/workbench-command-execution.js.map +1 -0
- package/dist/workbench/workbench-history.js +11 -18
- package/dist/workbench/workbench-history.js.map +1 -1
- package/dist/workbench/workbench-launch-session.d.ts +2 -2
- package/dist/workbench/workbench-launch-session.js.map +1 -1
- package/dist/workbench/workbench-run.d.ts +0 -4
- package/dist/workbench/workbench-run.js +3 -47
- package/dist/workbench/workbench-run.js.map +1 -1
- package/dist/workbench/workbench-studio-launcher.d.ts +27 -0
- package/dist/workbench/workbench-studio-launcher.js +95 -0
- package/dist/workbench/workbench-studio-launcher.js.map +1 -0
- package/dist/workbench/workbench-ui.js +10 -83
- package/dist/workbench/workbench-ui.js.map +1 -1
- package/docs/README.md +13 -7
- package/docs/agent-guide.md +75 -6
- package/docs/airflow.md +187 -0
- package/docs/api-reference.md +87 -76
- package/docs/api-report.json +17 -6
- package/docs/artifacts.md +173 -0
- package/docs/child-pipeline-composition.md +87 -8
- package/docs/comparison.md +20 -0
- package/docs/concepts.md +79 -2
- package/docs/dagster.md +161 -0
- package/docs/inngest.md +163 -0
- package/docs/llms.txt +30 -1
- package/docs/recipes.md +82 -32
- package/docs/remote-step-composition.md +6 -0
- package/docs/step-functions.md +190 -0
- package/docs/studio.md +31 -12
- package/docs/temporal.md +183 -0
- package/examples/airflow/contract.ts +46 -0
- package/examples/airflow/hosted.ts +70 -0
- package/examples/airflow/remote.ts +175 -0
- package/examples/airflow/tubeless_example.py +49 -0
- package/examples/airflow/worker.ts +24 -0
- package/examples/artifact-lineage.ts +70 -0
- package/examples/dagster/definitions.py +59 -0
- package/examples/dagster/hosted.ts +78 -0
- package/examples/dagster/pipeline.ts +62 -0
- package/examples/dagster/test_definitions.py +47 -0
- package/examples/dagster/tsconfig.build.json +10 -0
- package/examples/dagster/worker.ts +22 -0
- package/examples/inherited-inputs.ts +28 -0
- package/examples/inngest/client.ts +4 -0
- package/examples/inngest/functions.ts +65 -0
- package/examples/inngest/pipeline.ts +41 -0
- package/examples/inngest/send.ts +11 -0
- package/examples/inngest/server.ts +17 -0
- package/examples/inngest/tsconfig.build.json +10 -0
- package/examples/iteration.ts +52 -0
- package/examples/parameterized-steps.ts +96 -0
- package/examples/project/tubeless.project.ts +50 -0
- package/examples/step-functions/handler.ts +110 -0
- package/examples/step-functions/input.json +1 -0
- package/examples/step-functions/pipeline.ts +41 -0
- package/examples/step-functions/state-machine.asl.json +41 -0
- package/examples/step-functions/template.json +42 -0
- package/examples/step-output-overrides.ts +41 -0
- package/examples/temporal/activities.ts +94 -0
- package/examples/temporal/client.ts +19 -0
- package/examples/temporal/pipeline.ts +41 -0
- package/examples/temporal/tsconfig.build.json +10 -0
- package/examples/temporal/worker.ts +21 -0
- package/examples/temporal/workflows.ts +16 -0
- package/package.json +13 -4
- package/skills/tubeless/SKILL.md +37 -4
|
@@ -1,166 +1,15 @@
|
|
|
1
|
-
import { abortableSleep,
|
|
2
|
-
import { PipelineChildError } from "./child-execution.js";
|
|
3
|
-
import { brandTubelessError } from "../utilities/tubeless-error.js";
|
|
1
|
+
import { abortableSleep, throwIfAborted as throwIfSignalAborted } from "../utilities/abort.js";
|
|
4
2
|
import { createPipelineLifecycleObserver } from "./lifecycle.js";
|
|
5
|
-
import { formatPipelineError } from "./pipeline-diagnostics.js";
|
|
6
3
|
import { createRunId } from "./pipeline-ids.js";
|
|
7
4
|
import { decideStepDisposition } from "./pipeline-disposition.js";
|
|
8
5
|
import { schedulePipelineSteps } from "./pipeline-scheduler.js";
|
|
9
6
|
import { compiledStepGraph } from "./pipeline-graph.js";
|
|
10
7
|
import { planStepById, stepToPlanStep } from "./pipeline-plan.js";
|
|
11
|
-
import { PipelineRunState
|
|
8
|
+
import { PipelineRunState } from "./pipeline-run-state.js";
|
|
12
9
|
import { PIPELINE_FINALIZE_STEP_ID } from "./pipeline-step-metadata.js";
|
|
13
10
|
import { evaluateStepSkip, executeStepAttempt, validateStepOutput, } from "./pipeline-step-executor.js";
|
|
14
11
|
import { PipelineBoundaryValidationError, validateStandardSchema } from "./pipeline-validation.js";
|
|
15
|
-
import {
|
|
16
|
-
const PIPELINE_LOGGER_BASE = Symbol("pipelineLoggerBase");
|
|
17
|
-
function basePipelineLogger(log) {
|
|
18
|
-
// SAFETY: `TracedPipelineLogger` only adds the optional symbol-keyed base
|
|
19
|
-
// property; reading it off any `PipelineLogger` is safe because the property
|
|
20
|
-
// is absent unless a tracing wrapper installed it.
|
|
21
|
-
return log[PIPELINE_LOGGER_BASE] ?? log;
|
|
22
|
-
}
|
|
23
|
-
const originalPipelineErrors = new WeakMap();
|
|
24
|
-
function defaultExecutionErrorMessage(result) {
|
|
25
|
-
const firstError = result.errors[0];
|
|
26
|
-
const disposition = isCancellationOnly(result.errors) ? "cancelled" : "failed";
|
|
27
|
-
return firstError
|
|
28
|
-
? `Pipeline ${result.pipelineId} ${disposition}: ${formatPipelineError(firstError)}`
|
|
29
|
-
: `Pipeline ${result.pipelineId} ${disposition}`;
|
|
30
|
-
}
|
|
31
|
-
function firstOriginalPipelineError(errors) {
|
|
32
|
-
for (const error of errors) {
|
|
33
|
-
if (originalPipelineErrors.has(error))
|
|
34
|
-
return originalPipelineErrors.get(error);
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
/** Error thrown by `runOrThrow` when a pipeline run does not complete successfully. */
|
|
39
|
-
export class PipelineExecutionError extends Error {
|
|
40
|
-
result;
|
|
41
|
-
constructor(result, message = defaultExecutionErrorMessage(result)) {
|
|
42
|
-
const cause = firstOriginalPipelineError(result.errors);
|
|
43
|
-
super(message, cause === undefined ? undefined : { cause });
|
|
44
|
-
this.result = result;
|
|
45
|
-
this.name = "PipelineExecutionError";
|
|
46
|
-
brandTubelessError(this, "pipeline-execution");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
const MAX_PIPELINE_CAUSE_DEPTH = 8;
|
|
50
|
-
function readErrorField(value, field) {
|
|
51
|
-
try {
|
|
52
|
-
// SAFETY: any object may be probed for an optional string-keyed field; a
|
|
53
|
-
// getter that throws is caught below, so the cast only enables the lookup.
|
|
54
|
-
return value[field];
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function safeErrorMessage(value) {
|
|
61
|
-
try {
|
|
62
|
-
return String(value);
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return "Unknown thrown value";
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
function normalizePipelineCause(value, seen, depth = 0) {
|
|
69
|
-
if (depth >= MAX_PIPELINE_CAUSE_DEPTH) {
|
|
70
|
-
return { message: "Cause chain truncated" };
|
|
71
|
-
}
|
|
72
|
-
if (typeof value !== "object" || value === null) {
|
|
73
|
-
return { message: safeErrorMessage(value) };
|
|
74
|
-
}
|
|
75
|
-
if (seen.has(value)) {
|
|
76
|
-
return { message: "Circular cause" };
|
|
77
|
-
}
|
|
78
|
-
seen.add(value);
|
|
79
|
-
const message = readErrorField(value, "message");
|
|
80
|
-
const name = readErrorField(value, "name");
|
|
81
|
-
const sourceCode = readErrorField(value, "code");
|
|
82
|
-
const nested = readErrorField(value, "cause");
|
|
83
|
-
const cause = {
|
|
84
|
-
message: typeof message === "string" ? message : safeErrorMessage(value),
|
|
85
|
-
};
|
|
86
|
-
if (typeof name === "string")
|
|
87
|
-
cause.name = name;
|
|
88
|
-
if (typeof sourceCode === "string")
|
|
89
|
-
cause.sourceCode = sourceCode;
|
|
90
|
-
if (nested !== undefined)
|
|
91
|
-
cause.cause = normalizePipelineCause(nested, seen, depth + 1);
|
|
92
|
-
return cause;
|
|
93
|
-
}
|
|
94
|
-
// Fan-out snapshots bound every string as well as cause depth and item count.
|
|
95
|
-
function fanOutCause(error) {
|
|
96
|
-
const cause = normalizePipelineCause(error, new WeakSet());
|
|
97
|
-
let current = cause;
|
|
98
|
-
while (current) {
|
|
99
|
-
current.message = current.message.slice(0, 1024);
|
|
100
|
-
if (current.name)
|
|
101
|
-
current.name = current.name.slice(0, 1024);
|
|
102
|
-
if (current.sourceCode)
|
|
103
|
-
current.sourceCode = current.sourceCode.slice(0, 1024);
|
|
104
|
-
current = current.cause;
|
|
105
|
-
}
|
|
106
|
-
return cause;
|
|
107
|
-
}
|
|
108
|
-
function normalizedNestedCause(error) {
|
|
109
|
-
if (typeof error !== "object" || error === null)
|
|
110
|
-
return undefined;
|
|
111
|
-
const cause = readErrorField(error, "cause");
|
|
112
|
-
if (cause === undefined)
|
|
113
|
-
return undefined;
|
|
114
|
-
const seen = new WeakSet();
|
|
115
|
-
seen.add(error);
|
|
116
|
-
return normalizePipelineCause(cause, seen);
|
|
117
|
-
}
|
|
118
|
-
function toPipelineError(error, classification) {
|
|
119
|
-
const sourceCode = typeof error === "object" && error !== null ? readErrorField(error, "code") : undefined;
|
|
120
|
-
const cause = normalizedNestedCause(error);
|
|
121
|
-
const pipelineError = {
|
|
122
|
-
...classification,
|
|
123
|
-
message: error instanceof Error ? error.message : safeErrorMessage(error),
|
|
124
|
-
};
|
|
125
|
-
if (error instanceof Error && error.stack)
|
|
126
|
-
pipelineError.stack = error.stack;
|
|
127
|
-
if (typeof sourceCode === "string")
|
|
128
|
-
pipelineError.sourceCode = sourceCode;
|
|
129
|
-
if (cause)
|
|
130
|
-
pipelineError.cause = cause;
|
|
131
|
-
if (error instanceof PipelineBoundaryValidationError)
|
|
132
|
-
pipelineError.issues = error.issues;
|
|
133
|
-
if (error instanceof PipelineChildError && error.fanOut) {
|
|
134
|
-
const { failures, failureCount, schedulerError } = error.fanOut;
|
|
135
|
-
pipelineError.fanOut = {
|
|
136
|
-
failures: failures.map(({ error: itemError, key, index, cancelled }) => ({
|
|
137
|
-
index,
|
|
138
|
-
key: key.slice(0, 1024),
|
|
139
|
-
keyTruncated: key.length > 1024,
|
|
140
|
-
cancelled,
|
|
141
|
-
error: fanOutCause(itemError),
|
|
142
|
-
})),
|
|
143
|
-
failureCount,
|
|
144
|
-
omittedFailureCount: failureCount - failures.length,
|
|
145
|
-
};
|
|
146
|
-
if (schedulerError !== undefined)
|
|
147
|
-
pipelineError.fanOut.schedulerError = fanOutCause(schedulerError);
|
|
148
|
-
}
|
|
149
|
-
originalPipelineErrors.set(pipelineError, error);
|
|
150
|
-
return pipelineError;
|
|
151
|
-
}
|
|
152
|
-
export function isPipelineCancellation(error, runtime) {
|
|
153
|
-
if (isAbortError(error))
|
|
154
|
-
return true;
|
|
155
|
-
if (runtime.signal?.aborted === true && error === runtime.signal.reason)
|
|
156
|
-
return true;
|
|
157
|
-
if (error instanceof PipelineChildError)
|
|
158
|
-
return error.cancelled;
|
|
159
|
-
return error instanceof PipelineExecutionError && isCancelledResult(error.result);
|
|
160
|
-
}
|
|
161
|
-
function isCancelledResult(result) {
|
|
162
|
-
return result.status === "cancelled";
|
|
163
|
-
}
|
|
12
|
+
import { finalizationError, stepExecutionError, toPipelineError, } from "./pipeline-execution-error.js";
|
|
164
13
|
function throwIfAborted(runtime) {
|
|
165
14
|
throwIfSignalAborted(runtime.signal, "Pipeline run");
|
|
166
15
|
}
|
|
@@ -175,29 +24,11 @@ export async function executePlannedRun(input) {
|
|
|
175
24
|
if (runtime.parentRunId)
|
|
176
25
|
identity.parentRunId = runtime.parentRunId;
|
|
177
26
|
const dryRun = controls.dryRun === true;
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const base = basePipelineLogger(runtime.log);
|
|
184
|
-
const log = {
|
|
185
|
-
error: (message, ...params) => {
|
|
186
|
-
lifecycle.log("error", message, params, stepId, attemptId);
|
|
187
|
-
base.error(message, ...params);
|
|
188
|
-
},
|
|
189
|
-
log: (message, ...params) => {
|
|
190
|
-
lifecycle.log("log", message, params, stepId, attemptId);
|
|
191
|
-
base.log(message, ...params);
|
|
192
|
-
},
|
|
193
|
-
warn: (message, ...params) => {
|
|
194
|
-
lifecycle.log("warn", message, params, stepId, attemptId);
|
|
195
|
-
base.warn(message, ...params);
|
|
196
|
-
},
|
|
197
|
-
};
|
|
198
|
-
log[PIPELINE_LOGGER_BASE] = base;
|
|
199
|
-
return log;
|
|
200
|
-
};
|
|
27
|
+
const lifecycle = createPipelineLifecycleObserver(compiled.id, runtime, {
|
|
28
|
+
...identity,
|
|
29
|
+
itemKey: runtime.tracing?.itemKey,
|
|
30
|
+
iteration: runtime.tracing?.iteration,
|
|
31
|
+
});
|
|
201
32
|
const state = new PipelineRunState(compiled.id, dryRun, startedAtMs, identity, runtime.now, lifecycle);
|
|
202
33
|
state.start(input.plan, compiled.targetIds);
|
|
203
34
|
if (!input.plan.ok) {
|
|
@@ -234,10 +65,10 @@ export async function executePlannedRun(input) {
|
|
|
234
65
|
const executionContext = {
|
|
235
66
|
...runtime,
|
|
236
67
|
dryRun,
|
|
237
|
-
log:
|
|
68
|
+
log: lifecycle.logger(),
|
|
238
69
|
options: pipelineOptions,
|
|
239
70
|
runId,
|
|
240
|
-
trace:
|
|
71
|
+
trace: lifecycle.traceContext,
|
|
241
72
|
};
|
|
242
73
|
const plannedSteps = planStepById(input.plan);
|
|
243
74
|
const stepsById = new Map(compiled.orderedSteps.map((step) => [step.id, step]));
|
|
@@ -297,27 +128,7 @@ export async function executePlannedRun(input) {
|
|
|
297
128
|
return true;
|
|
298
129
|
};
|
|
299
130
|
const recordStepExecutionFailure = (error, plannedStep, attempt) => {
|
|
300
|
-
const
|
|
301
|
-
const childFailure = error instanceof PipelineExecutionError || error instanceof PipelineChildError;
|
|
302
|
-
const validationFailure = error instanceof PipelineBoundaryValidationError;
|
|
303
|
-
const pipelineError = toPipelineError(error, {
|
|
304
|
-
code: cancelled
|
|
305
|
-
? "TUBELESS_RUN_CANCELLED"
|
|
306
|
-
: validationFailure
|
|
307
|
-
? "TUBELESS_STEP_OUTPUT_VALIDATION_FAILED"
|
|
308
|
-
: childFailure
|
|
309
|
-
? "TUBELESS_CHILD_FAILED"
|
|
310
|
-
: "TUBELESS_STEP_FAILED",
|
|
311
|
-
kind: cancelled
|
|
312
|
-
? "cancellation"
|
|
313
|
-
: validationFailure
|
|
314
|
-
? "validation"
|
|
315
|
-
: childFailure
|
|
316
|
-
? "child"
|
|
317
|
-
: "step",
|
|
318
|
-
phase: "execution",
|
|
319
|
-
stepId: plannedStep.id,
|
|
320
|
-
});
|
|
131
|
+
const pipelineError = stepExecutionError(error, runtime, plannedStep.id);
|
|
321
132
|
state.failStep(plannedStep, attempt, pipelineError);
|
|
322
133
|
if (!controls.continueOnError)
|
|
323
134
|
stopError ??= pipelineError;
|
|
@@ -345,6 +156,18 @@ export async function executePlannedRun(input) {
|
|
|
345
156
|
const plannedStep = plannedStepFor(step);
|
|
346
157
|
if (cancelBeforeStepStart(step))
|
|
347
158
|
return;
|
|
159
|
+
if (plannedStep.selected && input.overrides?.has(step)) {
|
|
160
|
+
const attempt = state.beginAttempt(plannedStep, runtime.now(), "override");
|
|
161
|
+
try {
|
|
162
|
+
const output = await validateStepOutput(step, input.overrides.get(step), `Pipeline ${compiled.id} step ${step.id} override output`);
|
|
163
|
+
throwIfAborted(runtime);
|
|
164
|
+
state.completeStep(plannedStep, attempt, output);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
recordStepExecutionFailure(error, plannedStep, attempt);
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
348
171
|
const graph = compiledStepGraph(compiled, step);
|
|
349
172
|
const disposition = decideStepDisposition({
|
|
350
173
|
dryRun,
|
|
@@ -370,7 +193,7 @@ export async function executePlannedRun(input) {
|
|
|
370
193
|
try {
|
|
371
194
|
skipDecision = await evaluateStepSkip(step, stepInputs, {
|
|
372
195
|
...executionContext,
|
|
373
|
-
log:
|
|
196
|
+
log: lifecycle.logger(step.id),
|
|
374
197
|
});
|
|
375
198
|
}
|
|
376
199
|
catch (error) {
|
|
@@ -392,7 +215,8 @@ export async function executePlannedRun(input) {
|
|
|
392
215
|
context: executionContext,
|
|
393
216
|
dryRun,
|
|
394
217
|
inputs: stepInputs,
|
|
395
|
-
log:
|
|
218
|
+
log: lifecycle.logger(step.id, attempt.attemptId),
|
|
219
|
+
onArtifact: (record, preview) => lifecycle.recordArtifact(step.id, attempt.attemptId, record, preview),
|
|
396
220
|
onProgress: (progress) => state.reportProgress(plannedStep, attempt, progress),
|
|
397
221
|
onReportAttempt: (number, attributes) => lifecycle.reportAttempt(step.id, number, attributes, attempt.attemptId),
|
|
398
222
|
outputBoundary: `Pipeline ${compiled.id} step ${step.id} output`,
|
|
@@ -429,7 +253,7 @@ export async function executePlannedRun(input) {
|
|
|
429
253
|
const finalOutputs = Object.fromEntries(state.outputs);
|
|
430
254
|
const finalizedValue = await compiled.finalize(finalOutputs, {
|
|
431
255
|
...executionContext,
|
|
432
|
-
log:
|
|
256
|
+
log: lifecycle.logger(PIPELINE_FINALIZE_STEP_ID),
|
|
433
257
|
});
|
|
434
258
|
// SAFETY: with a result schema the value is validated against
|
|
435
259
|
// `TPipelineResult`; without one the finalizer's declared return type
|
|
@@ -440,18 +264,7 @@ export async function executePlannedRun(input) {
|
|
|
440
264
|
state.completeFinalization(value, runtime.now() - finalizeStartedAt);
|
|
441
265
|
}
|
|
442
266
|
catch (error) {
|
|
443
|
-
const
|
|
444
|
-
const validationFailure = error instanceof PipelineBoundaryValidationError;
|
|
445
|
-
const pipelineError = toPipelineError(error, {
|
|
446
|
-
code: cancelled
|
|
447
|
-
? "TUBELESS_FINALIZATION_CANCELLED"
|
|
448
|
-
: validationFailure
|
|
449
|
-
? "TUBELESS_FINAL_RESULT_VALIDATION_FAILED"
|
|
450
|
-
: "TUBELESS_FINALIZATION_FAILED",
|
|
451
|
-
kind: cancelled ? "cancellation" : validationFailure ? "validation" : "finalization",
|
|
452
|
-
phase: "finalization",
|
|
453
|
-
stepId: PIPELINE_FINALIZE_STEP_ID,
|
|
454
|
-
});
|
|
267
|
+
const pipelineError = finalizationError(error, runtime);
|
|
455
268
|
state.failFinalization(pipelineError, runtime.now() - finalizeStartedAt);
|
|
456
269
|
}
|
|
457
270
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-execute.js","sourceRoot":"","sources":["../../src/core/pipeline-execute.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abortableSleep,\n isAbortError,\n throwIfAborted as throwIfSignalAborted,\n} from \"../utilities/abort.js\";\nimport { PipelineChildError } from \"./child-execution.js\";\nimport { brandTubelessError } from \"../utilities/tubeless-error.js\";\nimport { createPipelineLifecycleObserver } from \"./lifecycle.js\";\nimport { formatPipelineError } from \"./pipeline-diagnostics.js\";\nimport { createRunId } from \"./pipeline-ids.js\";\nimport type { CompiledPipeline } from \"./pipeline-compiler.js\";\nimport type { StepsOptions } from \"./pipeline-definition.js\";\nimport { decideStepDisposition } from \"./pipeline-disposition.js\";\nimport { schedulePipelineSteps } from \"./pipeline-scheduler.js\";\nimport { compiledStepGraph } from \"./pipeline-graph.js\";\nimport { planStepById, stepToPlanStep } from \"./pipeline-plan.js\";\nimport {\n PipelineRunState,\n isCancellationOnly,\n type PipelineStepAttempt,\n} from \"./pipeline-run-state.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { PIPELINE_FINALIZE_STEP_ID } from \"./pipeline-step-metadata.js\";\nimport {\n evaluateStepSkip,\n executeStepAttempt,\n validateStepOutput,\n} from \"./pipeline-step-executor.js\";\nimport type {\n InferSchemaOutput,\n PipelineContext,\n PipelineError,\n PipelineErrorCause,\n PipelineExecutionContext,\n PipelineLogger,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunControls,\n PipelineRuntime,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\nimport { PipelineBoundaryValidationError, validateStandardSchema } from \"./pipeline-validation.js\";\nimport { createPipelineTraceEmitter } from \"../tracing/tracing-internal.js\";\n\nconst PIPELINE_LOGGER_BASE = Symbol(\"pipelineLoggerBase\");\n\ntype TracedPipelineLogger = PipelineLogger & { [PIPELINE_LOGGER_BASE]?: PipelineLogger };\n\nfunction basePipelineLogger(log: PipelineLogger): PipelineLogger {\n // SAFETY: `TracedPipelineLogger` only adds the optional symbol-keyed base\n // property; reading it off any `PipelineLogger` is safe because the property\n // is absent unless a tracing wrapper installed it.\n return (log as TracedPipelineLogger)[PIPELINE_LOGGER_BASE] ?? log;\n}\n\nconst originalPipelineErrors = new WeakMap<PipelineError, unknown>();\n\nfunction defaultExecutionErrorMessage(result: PipelineRun<unknown>): string {\n const firstError = result.errors[0];\n const disposition = isCancellationOnly(result.errors) ? \"cancelled\" : \"failed\";\n return firstError\n ? `Pipeline ${result.pipelineId} ${disposition}: ${formatPipelineError(firstError)}`\n : `Pipeline ${result.pipelineId} ${disposition}`;\n}\n\nfunction firstOriginalPipelineError(errors: readonly PipelineError[]): unknown {\n for (const error of errors) {\n if (originalPipelineErrors.has(error)) return originalPipelineErrors.get(error);\n }\n return undefined;\n}\n\n/** Error thrown by `runOrThrow` when a pipeline run does not complete successfully. */\nexport class PipelineExecutionError extends Error {\n constructor(\n readonly result: PipelineRun<unknown>,\n message = defaultExecutionErrorMessage(result)\n ) {\n const cause = firstOriginalPipelineError(result.errors);\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"PipelineExecutionError\";\n brandTubelessError(this, \"pipeline-execution\");\n }\n}\n\nconst MAX_PIPELINE_CAUSE_DEPTH = 8;\n\nfunction readErrorField(value: object, field: \"cause\" | \"code\" | \"message\" | \"name\"): unknown {\n try {\n // SAFETY: any object may be probed for an optional string-keyed field; a\n // getter that throws is caught below, so the cast only enables the lookup.\n return (value as Record<string, unknown>)[field];\n } catch {\n return undefined;\n }\n}\n\nfunction safeErrorMessage(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"Unknown thrown value\";\n }\n}\n\nfunction normalizePipelineCause(\n value: unknown,\n seen: WeakSet<object>,\n depth = 0\n): PipelineErrorCause {\n if (depth >= MAX_PIPELINE_CAUSE_DEPTH) {\n return { message: \"Cause chain truncated\" };\n }\n if (typeof value !== \"object\" || value === null) {\n return { message: safeErrorMessage(value) };\n }\n if (seen.has(value)) {\n return { message: \"Circular cause\" };\n }\n seen.add(value);\n\n const message = readErrorField(value, \"message\");\n const name = readErrorField(value, \"name\");\n const sourceCode = readErrorField(value, \"code\");\n const nested = readErrorField(value, \"cause\");\n const cause: PipelineErrorCause = {\n message: typeof message === \"string\" ? message : safeErrorMessage(value),\n };\n if (typeof name === \"string\") cause.name = name;\n if (typeof sourceCode === \"string\") cause.sourceCode = sourceCode;\n if (nested !== undefined) cause.cause = normalizePipelineCause(nested, seen, depth + 1);\n return cause;\n}\n\n// Fan-out snapshots bound every string as well as cause depth and item count.\nfunction fanOutCause(error: unknown): PipelineErrorCause {\n const cause = normalizePipelineCause(error, new WeakSet<object>());\n let current: PipelineErrorCause | undefined = cause;\n while (current) {\n current.message = current.message.slice(0, 1024);\n if (current.name) current.name = current.name.slice(0, 1024);\n if (current.sourceCode) current.sourceCode = current.sourceCode.slice(0, 1024);\n current = current.cause;\n }\n return cause;\n}\n\nfunction normalizedNestedCause(error: unknown): PipelineErrorCause | undefined {\n if (typeof error !== \"object\" || error === null) return undefined;\n const cause = readErrorField(error, \"cause\");\n if (cause === undefined) return undefined;\n const seen = new WeakSet<object>();\n seen.add(error);\n return normalizePipelineCause(cause, seen);\n}\n\nfunction toPipelineError(\n error: unknown,\n classification: Omit<PipelineError, \"cause\" | \"message\" | \"sourceCode\" | \"stack\">\n): PipelineError {\n const sourceCode =\n typeof error === \"object\" && error !== null ? readErrorField(error, \"code\") : undefined;\n const cause = normalizedNestedCause(error);\n const pipelineError: PipelineError = {\n ...classification,\n message: error instanceof Error ? error.message : safeErrorMessage(error),\n };\n if (error instanceof Error && error.stack) pipelineError.stack = error.stack;\n if (typeof sourceCode === \"string\") pipelineError.sourceCode = sourceCode;\n if (cause) pipelineError.cause = cause;\n if (error instanceof PipelineBoundaryValidationError) pipelineError.issues = error.issues;\n if (error instanceof PipelineChildError && error.fanOut) {\n const { failures, failureCount, schedulerError } = error.fanOut;\n pipelineError.fanOut = {\n failures: failures.map(({ error: itemError, key, index, cancelled }) => ({\n index,\n key: key.slice(0, 1024),\n keyTruncated: key.length > 1024,\n cancelled,\n error: fanOutCause(itemError),\n })),\n failureCount,\n omittedFailureCount: failureCount - failures.length,\n };\n if (schedulerError !== undefined)\n pipelineError.fanOut.schedulerError = fanOutCause(schedulerError);\n }\n originalPipelineErrors.set(pipelineError, error);\n return pipelineError;\n}\n\nexport function isPipelineCancellation(error: unknown, runtime: PipelineRuntime): boolean {\n if (isAbortError(error)) return true;\n if (runtime.signal?.aborted === true && error === runtime.signal.reason) return true;\n if (error instanceof PipelineChildError) return error.cancelled;\n return error instanceof PipelineExecutionError && isCancelledResult(error.result);\n}\n\nfunction isCancelledResult(result: PipelineRun<unknown>): boolean {\n return result.status === \"cancelled\";\n}\n\ntype PipelineRunIdentity = { correlationId?: string; parentRunId?: string; runId: string };\n\nfunction throwIfAborted(runtime: PipelineRuntime): void {\n throwIfSignalAborted(runtime.signal, \"Pipeline run\");\n}\n\nexport async function executePlannedRun<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(input: {\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>;\n controls: PipelineRunControls;\n domainOptions: object;\n plan: PipelinePlan;\n runtime: PipelineRuntime;\n}): Promise<\n PipelineRun<TResultSchema extends StandardSchemaV1 ? InferSchemaOutput<TResultSchema> : TResult>\n> {\n type TPipelineResult = TResultSchema extends StandardSchemaV1\n ? InferSchemaOutput<TResultSchema>\n : TResult;\n type TOptions = StepsOptions<TSteps>;\n const { compiled, controls, runtime } = input;\n const startedAtMs = runtime.now();\n const runId = createRunId(compiled.id);\n const correlationId = runtime.correlationId;\n const identity: PipelineRunIdentity = { runId };\n if (correlationId !== undefined) identity.correlationId = correlationId;\n if (runtime.parentRunId) identity.parentRunId = runtime.parentRunId;\n const dryRun = controls.dryRun === true;\n const trace = createPipelineTraceEmitter(\n compiled.id,\n runtime.tracing,\n basePipelineLogger(runtime.log),\n { ...identity, itemKey: runtime.tracing?.itemKey },\n runtime.now\n );\n const lifecycle = createPipelineLifecycleObserver(compiled.id, runtime, trace);\n const tracedLogger = (stepId?: string, attemptId?: string): PipelineLogger => {\n if (!trace) return runtime.log;\n const base = basePipelineLogger(runtime.log);\n const log: TracedPipelineLogger = {\n error: (message, ...params) => {\n lifecycle.log(\"error\", message, params, stepId, attemptId);\n base.error(message, ...params);\n },\n log: (message, ...params) => {\n lifecycle.log(\"log\", message, params, stepId, attemptId);\n base.log(message, ...params);\n },\n warn: (message, ...params) => {\n lifecycle.log(\"warn\", message, params, stepId, attemptId);\n base.warn(message, ...params);\n },\n };\n log[PIPELINE_LOGGER_BASE] = base;\n return log;\n };\n const state = new PipelineRunState<TPipelineResult>(\n compiled.id,\n dryRun,\n startedAtMs,\n identity,\n runtime.now,\n lifecycle\n );\n state.start(input.plan, compiled.targetIds);\n\n if (!input.plan.ok) {\n state.recordRunErrors(input.plan.errors);\n return state.finish();\n }\n\n const maxConcurrency = controls.maxConcurrency ?? 1;\n\n // SAFETY: `domainOptions` is the user-supplied options object; if a schema\n // is present it is re-validated below before assignment to `pipelineOptions`.\n let pipelineOptions = input.domainOptions as TOptions;\n if (compiled.optionsSchema) {\n try {\n const validated = await validateStandardSchema(\n compiled.optionsSchema,\n input.domainOptions,\n `Pipeline ${compiled.id} options`\n );\n if (typeof validated !== \"object\" || validated === null || Array.isArray(validated)) {\n throw new PipelineBoundaryValidationError(\n `Pipeline ${compiled.id} options schema returned a non-object value`,\n [{ message: \"Expected the validated options value to be an object\" }]\n );\n }\n // SAFETY: the schema validated the value against `TOptions` and the\n // object-shape check above passed, so the value is a `TOptions`.\n pipelineOptions = validated as TOptions;\n } catch (error) {\n state.recordRunErrors([\n toPipelineError(error, {\n code: \"TUBELESS_OPTIONS_VALIDATION_FAILED\",\n kind: \"validation\",\n phase: \"execution\",\n }),\n ]);\n return state.finish();\n }\n }\n\n for (const step of input.plan.steps) state.planStep(step);\n\n const executionContext: PipelineExecutionContext<TOptions> = {\n ...runtime,\n dryRun,\n log: tracedLogger(),\n options: pipelineOptions,\n runId,\n trace: trace?.context,\n };\n\n const plannedSteps = planStepById(input.plan);\n const stepsById = new Map(compiled.orderedSteps.map((step) => [step.id, step]));\n // `input.plan.steps` is already topologically ordered. Rehydrate from the original step\n // objects so callers still get the typed handlers rather than plan metadata.\n // SAFETY: every planned step id originates from `compiled.orderedSteps`, so the\n // map lookup always finds the matching `AnyStep<TOptions>`.\n const orderedSteps = input.plan.steps.map((step) => stepsById.get(step.id) as AnyStep<TOptions>);\n const plannedStepFor = (step: AnyStep<TOptions>): PipelinePlanStep =>\n plannedSteps.get(step.id) ??\n stepToPlanStep(step, true, undefined, undefined, compiledStepGraph(compiled, step));\n\n let stopError: PipelineError | undefined;\n let externalCancellationError: PipelineError | undefined;\n\n const recordUnstartedStep = (step: AnyStep<TOptions>, error: PipelineError): void => {\n const plannedStep = plannedStepFor(step);\n // Only the external signal can override a selected step's planned skip.\n if (plannedStep.skipReason && (!plannedStep.selected || error !== externalCancellationError)) {\n const dependencyId =\n plannedStep.skipReason === \"unmet-dependency\"\n ? plannedStep.dependencies.find((id) => plannedSteps.get(id)?.skipReason !== undefined)\n : undefined;\n state.skipStep(plannedStep, { reason: plannedStep.skipReason, dependencyId });\n } else if (error.kind === \"cancellation\") {\n state.cancelStep(plannedStep, { ...error, stepId: step.id }, false);\n } else {\n state.skipStep(plannedStep, {\n reason: \"fail-fast\",\n message: `Not run because fail-fast stopped after ${error.stepId} failed.`,\n dependencyId: error.stepId,\n });\n }\n };\n\n const recordExternalCancellation = (stepId: string): PipelineError | undefined => {\n if (externalCancellationError) return externalCancellationError;\n try {\n throwIfAborted(runtime);\n return undefined;\n } catch (error) {\n externalCancellationError = toPipelineError(error, {\n code: \"TUBELESS_RUN_CANCELLED\",\n kind: \"cancellation\",\n phase: \"execution\",\n stepId,\n });\n state.recordRunErrors([externalCancellationError]);\n return externalCancellationError;\n }\n };\n\n const cancelBeforeStepStart = (step: AnyStep<TOptions>): boolean => {\n const pipelineError = recordExternalCancellation(step.id);\n if (!pipelineError) return false;\n stopError ??= pipelineError;\n recordUnstartedStep(step, pipelineError);\n return true;\n };\n\n const recordStepExecutionFailure = (\n error: unknown,\n plannedStep: PipelinePlanStep,\n attempt: PipelineStepAttempt\n ): void => {\n const cancelled = isPipelineCancellation(error, runtime);\n const childFailure =\n error instanceof PipelineExecutionError || error instanceof PipelineChildError;\n const validationFailure = error instanceof PipelineBoundaryValidationError;\n const pipelineError = toPipelineError(error, {\n code: cancelled\n ? \"TUBELESS_RUN_CANCELLED\"\n : validationFailure\n ? \"TUBELESS_STEP_OUTPUT_VALIDATION_FAILED\"\n : childFailure\n ? \"TUBELESS_CHILD_FAILED\"\n : \"TUBELESS_STEP_FAILED\",\n kind: cancelled\n ? \"cancellation\"\n : validationFailure\n ? \"validation\"\n : childFailure\n ? \"child\"\n : \"step\",\n phase: \"execution\",\n stepId: plannedStep.id,\n });\n state.failStep(plannedStep, attempt, pipelineError);\n if (!controls.continueOnError) stopError ??= pipelineError;\n };\n\n const recordPolicySkip = async (\n plannedStep: PipelinePlanStep,\n step: AnyStep<TOptions>,\n reason: string,\n value: unknown\n ): Promise<void> => {\n let attempt: PipelineStepAttempt | undefined;\n let published = value;\n if (step.outputSchema) {\n attempt = state.beginAttempt(plannedStep);\n try {\n published = await validateStepOutput(\n step,\n value,\n `Pipeline ${compiled.id} step ${step.id} output`\n );\n } catch (error) {\n return recordStepExecutionFailure(error, plannedStep, attempt);\n }\n }\n state.skipStep(plannedStep, {\n attempt,\n message: reason,\n output: { value: published },\n reason: \"policy\",\n });\n };\n\n const executeOneStep = async (step: AnyStep<TOptions>): Promise<void> => {\n const plannedStep = plannedStepFor(step);\n if (cancelBeforeStepStart(step)) return;\n\n const graph = compiledStepGraph(compiled, step);\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned: plannedStep,\n reportsByStepId: state.reportsByStepId,\n step,\n });\n if (disposition.kind === \"skip\") {\n state.skipStep(plannedStep, disposition);\n return;\n }\n\n const inputEntries: Array<[string, unknown]> = [];\n for (const dep of graph.dependsOn) inputEntries.push([dep.id, state.outputs.get(dep.id)]);\n for (const dep of graph.optionalDependsOn) {\n if (state.outputs.has(dep.id)) inputEntries.push([dep.id, state.outputs.get(dep.id)]);\n }\n const stepInputs = Object.fromEntries(inputEntries);\n\n if (typeof step.skip === \"function\") {\n let skipDecision;\n try {\n skipDecision = await evaluateStepSkip(step, stepInputs, {\n ...executionContext,\n log: tracedLogger(step.id),\n });\n } catch (error) {\n const attempt = state.beginAttempt(plannedStep);\n recordStepExecutionFailure(error, plannedStep, attempt);\n return;\n }\n if (cancelBeforeStepStart(step)) return;\n if (skipDecision) {\n await recordPolicySkip(plannedStep, step, skipDecision.reason, skipDecision.value);\n return;\n }\n }\n\n const attempt = state.beginAttempt(plannedStep);\n try {\n const output = await executeStepAttempt({\n attemptId: attempt.attemptId,\n context: executionContext,\n dryRun,\n inputs: stepInputs,\n log: tracedLogger(step.id, attempt.attemptId),\n onProgress: (progress) => state.reportProgress(plannedStep, attempt, progress),\n onReportAttempt: (number, attributes) =>\n lifecycle.reportAttempt(step.id, number, attributes, attempt.attemptId),\n outputBoundary: `Pipeline ${compiled.id} step ${step.id} output`,\n step,\n });\n state.completeStep(plannedStep, attempt, output);\n } catch (error) {\n recordStepExecutionFailure(error, plannedStep, attempt);\n }\n };\n\n const unstarted = await schedulePipelineSteps({\n orderedSteps,\n stepGraph: compiled.stepGraph,\n maxConcurrency,\n executeOneStep,\n shouldStop: () => stopError !== undefined || runtime.signal?.aborted === true,\n });\n if (unstarted.length > 0 && runtime.signal?.aborted) {\n // An external abort takes precedence for work that never started, even\n // when an earlier failure stopped dispatch. Keep every active step's outcome.\n // Only reuse diagnostics created from this signal, never a step-local AbortError.\n stopError = recordExternalCancellation(unstarted[0]!.id)!;\n }\n for (const step of unstarted) recordUnstartedStep(step, stopError!);\n\n if (state.errors.length === 0 || controls.continueOnError) {\n const finalizeStartedAt = runtime.now();\n state.beginFinalization();\n try {\n throwIfAborted(runtime);\n // SAFETY: `state.outputs` maps step ids to their produced values, which is\n // exactly the shape the finalizer's outputs parameter describes.\n const finalOutputs = Object.fromEntries(state.outputs) as Parameters<\n CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>[\"finalize\"]\n >[0];\n const finalizedValue = await compiled.finalize(finalOutputs, {\n ...executionContext,\n log: tracedLogger(PIPELINE_FINALIZE_STEP_ID),\n });\n // SAFETY: with a result schema the value is validated against\n // `TPipelineResult`; without one the finalizer's declared return type\n // is `TPipelineResult`, so the cast only restores that type.\n const value = compiled.resultSchema\n ? ((await validateStandardSchema(\n compiled.resultSchema,\n finalizedValue,\n `Pipeline ${compiled.id} final result`\n )) as TPipelineResult)\n : (finalizedValue as TPipelineResult);\n state.completeFinalization(value, runtime.now() - finalizeStartedAt);\n } catch (error) {\n const cancelled = isPipelineCancellation(error, runtime);\n const validationFailure = error instanceof PipelineBoundaryValidationError;\n const pipelineError = toPipelineError(error, {\n code: cancelled\n ? \"TUBELESS_FINALIZATION_CANCELLED\"\n : validationFailure\n ? \"TUBELESS_FINAL_RESULT_VALIDATION_FAILED\"\n : \"TUBELESS_FINALIZATION_FAILED\",\n kind: cancelled ? \"cancellation\" : validationFailure ? \"validation\" : \"finalization\",\n phase: \"finalization\",\n stepId: PIPELINE_FINALIZE_STEP_ID,\n });\n state.failFinalization(pipelineError, runtime.now() - finalizeStartedAt);\n }\n }\n\n return state.finish();\n}\n\nconst fallbackNow = (): number => Date.now();\n\nconst fallbackSleep = (durationMs: number, signal?: AbortSignal): Promise<void> =>\n abortableSleep(durationMs, signal, \"Pipeline sleep\");\n\nexport function defaultPipelineContext(): PipelineContext {\n return { cwd: process.cwd(), log: console, now: fallbackNow, sleep: fallbackSleep };\n}\n\nexport function resolvePipelineRuntime(context: Partial<PipelineContext> = {}): PipelineRuntime {\n const defaults = defaultPipelineContext();\n return {\n ...defaults,\n ...context,\n cwd: context.cwd ?? defaults.cwd,\n log: context.log ?? defaults.log,\n now: context.now ?? defaults.now ?? fallbackNow,\n sleep: context.sleep ?? defaults.sleep ?? fallbackSleep,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pipeline-execute.js","sourceRoot":"","sources":["../../src/core/pipeline-execute.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortableSleep, throwIfAborted as throwIfSignalAborted } from \"../utilities/abort.js\";\nimport { createPipelineLifecycleObserver } from \"./lifecycle.js\";\nimport { createRunId } from \"./pipeline-ids.js\";\nimport type { CompiledPipeline } from \"./pipeline-compiler.js\";\nimport type { StepsOptions } from \"./pipeline-definition.js\";\nimport { decideStepDisposition } from \"./pipeline-disposition.js\";\nimport { schedulePipelineSteps } from \"./pipeline-scheduler.js\";\nimport { compiledStepGraph } from \"./pipeline-graph.js\";\nimport { planStepById, stepToPlanStep } from \"./pipeline-plan.js\";\nimport { PipelineRunState, type PipelineStepAttempt } from \"./pipeline-run-state.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { PIPELINE_FINALIZE_STEP_ID } from \"./pipeline-step-metadata.js\";\nimport {\n evaluateStepSkip,\n executeStepAttempt,\n validateStepOutput,\n} from \"./pipeline-step-executor.js\";\nimport type {\n InferSchemaOutput,\n PipelineContext,\n PipelineError,\n PipelineExecutionContext,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunControls,\n PipelineRuntime,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\nimport { PipelineBoundaryValidationError, validateStandardSchema } from \"./pipeline-validation.js\";\nimport {\n finalizationError,\n stepExecutionError,\n toPipelineError,\n} from \"./pipeline-execution-error.js\";\n\ntype PipelineRunIdentity = { correlationId?: string; parentRunId?: string; runId: string };\n\nfunction throwIfAborted(runtime: PipelineRuntime): void {\n throwIfSignalAborted(runtime.signal, \"Pipeline run\");\n}\n\nexport async function executePlannedRun<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(input: {\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>;\n controls: PipelineRunControls;\n domainOptions: object;\n plan: PipelinePlan;\n runtime: PipelineRuntime;\n overrides?: ReadonlyMap<AnyStep, unknown>;\n}): Promise<\n PipelineRun<TResultSchema extends StandardSchemaV1 ? InferSchemaOutput<TResultSchema> : TResult>\n> {\n type TPipelineResult = TResultSchema extends StandardSchemaV1\n ? InferSchemaOutput<TResultSchema>\n : TResult;\n type TOptions = StepsOptions<TSteps>;\n const { compiled, controls, runtime } = input;\n const startedAtMs = runtime.now();\n const runId = createRunId(compiled.id);\n const correlationId = runtime.correlationId;\n const identity: PipelineRunIdentity = { runId };\n if (correlationId !== undefined) identity.correlationId = correlationId;\n if (runtime.parentRunId) identity.parentRunId = runtime.parentRunId;\n const dryRun = controls.dryRun === true;\n const lifecycle = createPipelineLifecycleObserver(compiled.id, runtime, {\n ...identity,\n itemKey: runtime.tracing?.itemKey,\n iteration: runtime.tracing?.iteration,\n });\n const state = new PipelineRunState<TPipelineResult>(\n compiled.id,\n dryRun,\n startedAtMs,\n identity,\n runtime.now,\n lifecycle\n );\n state.start(input.plan, compiled.targetIds);\n\n if (!input.plan.ok) {\n state.recordRunErrors(input.plan.errors);\n return state.finish();\n }\n\n const maxConcurrency = controls.maxConcurrency ?? 1;\n\n // SAFETY: `domainOptions` is the user-supplied options object; if a schema\n // is present it is re-validated below before assignment to `pipelineOptions`.\n let pipelineOptions = input.domainOptions as TOptions;\n if (compiled.optionsSchema) {\n try {\n const validated = await validateStandardSchema(\n compiled.optionsSchema,\n input.domainOptions,\n `Pipeline ${compiled.id} options`\n );\n if (typeof validated !== \"object\" || validated === null || Array.isArray(validated)) {\n throw new PipelineBoundaryValidationError(\n `Pipeline ${compiled.id} options schema returned a non-object value`,\n [{ message: \"Expected the validated options value to be an object\" }]\n );\n }\n // SAFETY: the schema validated the value against `TOptions` and the\n // object-shape check above passed, so the value is a `TOptions`.\n pipelineOptions = validated as TOptions;\n } catch (error) {\n state.recordRunErrors([\n toPipelineError(error, {\n code: \"TUBELESS_OPTIONS_VALIDATION_FAILED\",\n kind: \"validation\",\n phase: \"execution\",\n }),\n ]);\n return state.finish();\n }\n }\n\n for (const step of input.plan.steps) state.planStep(step);\n\n const executionContext: PipelineExecutionContext<TOptions> = {\n ...runtime,\n dryRun,\n log: lifecycle.logger(),\n options: pipelineOptions,\n runId,\n trace: lifecycle.traceContext,\n };\n\n const plannedSteps = planStepById(input.plan);\n const stepsById = new Map(compiled.orderedSteps.map((step) => [step.id, step]));\n // `input.plan.steps` is already topologically ordered. Rehydrate from the original step\n // objects so callers still get the typed handlers rather than plan metadata.\n // SAFETY: every planned step id originates from `compiled.orderedSteps`, so the\n // map lookup always finds the matching `AnyStep<TOptions>`.\n const orderedSteps = input.plan.steps.map((step) => stepsById.get(step.id) as AnyStep<TOptions>);\n const plannedStepFor = (step: AnyStep<TOptions>): PipelinePlanStep =>\n plannedSteps.get(step.id) ??\n stepToPlanStep(step, true, undefined, undefined, compiledStepGraph(compiled, step));\n\n let stopError: PipelineError | undefined;\n let externalCancellationError: PipelineError | undefined;\n\n const recordUnstartedStep = (step: AnyStep<TOptions>, error: PipelineError): void => {\n const plannedStep = plannedStepFor(step);\n // Only the external signal can override a selected step's planned skip.\n if (plannedStep.skipReason && (!plannedStep.selected || error !== externalCancellationError)) {\n const dependencyId =\n plannedStep.skipReason === \"unmet-dependency\"\n ? plannedStep.dependencies.find((id) => plannedSteps.get(id)?.skipReason !== undefined)\n : undefined;\n state.skipStep(plannedStep, { reason: plannedStep.skipReason, dependencyId });\n } else if (error.kind === \"cancellation\") {\n state.cancelStep(plannedStep, { ...error, stepId: step.id }, false);\n } else {\n state.skipStep(plannedStep, {\n reason: \"fail-fast\",\n message: `Not run because fail-fast stopped after ${error.stepId} failed.`,\n dependencyId: error.stepId,\n });\n }\n };\n\n const recordExternalCancellation = (stepId: string): PipelineError | undefined => {\n if (externalCancellationError) return externalCancellationError;\n try {\n throwIfAborted(runtime);\n return undefined;\n } catch (error) {\n externalCancellationError = toPipelineError(error, {\n code: \"TUBELESS_RUN_CANCELLED\",\n kind: \"cancellation\",\n phase: \"execution\",\n stepId,\n });\n state.recordRunErrors([externalCancellationError]);\n return externalCancellationError;\n }\n };\n\n const cancelBeforeStepStart = (step: AnyStep<TOptions>): boolean => {\n const pipelineError = recordExternalCancellation(step.id);\n if (!pipelineError) return false;\n stopError ??= pipelineError;\n recordUnstartedStep(step, pipelineError);\n return true;\n };\n\n const recordStepExecutionFailure = (\n error: unknown,\n plannedStep: PipelinePlanStep,\n attempt: PipelineStepAttempt\n ): void => {\n const pipelineError = stepExecutionError(error, runtime, plannedStep.id);\n state.failStep(plannedStep, attempt, pipelineError);\n if (!controls.continueOnError) stopError ??= pipelineError;\n };\n\n const recordPolicySkip = async (\n plannedStep: PipelinePlanStep,\n step: AnyStep<TOptions>,\n reason: string,\n value: unknown\n ): Promise<void> => {\n let attempt: PipelineStepAttempt | undefined;\n let published = value;\n if (step.outputSchema) {\n attempt = state.beginAttempt(plannedStep);\n try {\n published = await validateStepOutput(\n step,\n value,\n `Pipeline ${compiled.id} step ${step.id} output`\n );\n } catch (error) {\n return recordStepExecutionFailure(error, plannedStep, attempt);\n }\n }\n state.skipStep(plannedStep, {\n attempt,\n message: reason,\n output: { value: published },\n reason: \"policy\",\n });\n };\n\n const executeOneStep = async (step: AnyStep<TOptions>): Promise<void> => {\n const plannedStep = plannedStepFor(step);\n if (cancelBeforeStepStart(step)) return;\n\n if (plannedStep.selected && input.overrides?.has(step)) {\n const attempt = state.beginAttempt(plannedStep, runtime.now(), \"override\");\n try {\n const output = await validateStepOutput(\n step,\n input.overrides.get(step),\n `Pipeline ${compiled.id} step ${step.id} override output`\n );\n throwIfAborted(runtime);\n state.completeStep(plannedStep, attempt, output);\n } catch (error) {\n recordStepExecutionFailure(error, plannedStep, attempt);\n }\n return;\n }\n\n const graph = compiledStepGraph(compiled, step);\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned: plannedStep,\n reportsByStepId: state.reportsByStepId,\n step,\n });\n if (disposition.kind === \"skip\") {\n state.skipStep(plannedStep, disposition);\n return;\n }\n\n const inputEntries: Array<[string, unknown]> = [];\n for (const dep of graph.dependsOn) inputEntries.push([dep.id, state.outputs.get(dep.id)]);\n for (const dep of graph.optionalDependsOn) {\n if (state.outputs.has(dep.id)) inputEntries.push([dep.id, state.outputs.get(dep.id)]);\n }\n const stepInputs = Object.fromEntries(inputEntries);\n\n if (typeof step.skip === \"function\") {\n let skipDecision;\n try {\n skipDecision = await evaluateStepSkip(step, stepInputs, {\n ...executionContext,\n log: lifecycle.logger(step.id),\n });\n } catch (error) {\n const attempt = state.beginAttempt(plannedStep);\n recordStepExecutionFailure(error, plannedStep, attempt);\n return;\n }\n if (cancelBeforeStepStart(step)) return;\n if (skipDecision) {\n await recordPolicySkip(plannedStep, step, skipDecision.reason, skipDecision.value);\n return;\n }\n }\n\n const attempt = state.beginAttempt(plannedStep);\n try {\n const output = await executeStepAttempt({\n attemptId: attempt.attemptId,\n context: executionContext,\n dryRun,\n inputs: stepInputs,\n log: lifecycle.logger(step.id, attempt.attemptId),\n onArtifact: (record, preview) =>\n lifecycle.recordArtifact(step.id, attempt.attemptId, record, preview),\n onProgress: (progress) => state.reportProgress(plannedStep, attempt, progress),\n onReportAttempt: (number, attributes) =>\n lifecycle.reportAttempt(step.id, number, attributes, attempt.attemptId),\n outputBoundary: `Pipeline ${compiled.id} step ${step.id} output`,\n step,\n });\n state.completeStep(plannedStep, attempt, output);\n } catch (error) {\n recordStepExecutionFailure(error, plannedStep, attempt);\n }\n };\n\n const unstarted = await schedulePipelineSteps({\n orderedSteps,\n stepGraph: compiled.stepGraph,\n maxConcurrency,\n executeOneStep,\n shouldStop: () => stopError !== undefined || runtime.signal?.aborted === true,\n });\n if (unstarted.length > 0 && runtime.signal?.aborted) {\n // An external abort takes precedence for work that never started, even\n // when an earlier failure stopped dispatch. Keep every active step's outcome.\n // Only reuse diagnostics created from this signal, never a step-local AbortError.\n stopError = recordExternalCancellation(unstarted[0]!.id)!;\n }\n for (const step of unstarted) recordUnstartedStep(step, stopError!);\n\n if (state.errors.length === 0 || controls.continueOnError) {\n const finalizeStartedAt = runtime.now();\n state.beginFinalization();\n try {\n throwIfAborted(runtime);\n // SAFETY: `state.outputs` maps step ids to their produced values, which is\n // exactly the shape the finalizer's outputs parameter describes.\n const finalOutputs = Object.fromEntries(state.outputs) as Parameters<\n CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>[\"finalize\"]\n >[0];\n const finalizedValue = await compiled.finalize(finalOutputs, {\n ...executionContext,\n log: lifecycle.logger(PIPELINE_FINALIZE_STEP_ID),\n });\n // SAFETY: with a result schema the value is validated against\n // `TPipelineResult`; without one the finalizer's declared return type\n // is `TPipelineResult`, so the cast only restores that type.\n const value = compiled.resultSchema\n ? ((await validateStandardSchema(\n compiled.resultSchema,\n finalizedValue,\n `Pipeline ${compiled.id} final result`\n )) as TPipelineResult)\n : (finalizedValue as TPipelineResult);\n state.completeFinalization(value, runtime.now() - finalizeStartedAt);\n } catch (error) {\n const pipelineError = finalizationError(error, runtime);\n state.failFinalization(pipelineError, runtime.now() - finalizeStartedAt);\n }\n }\n\n return state.finish();\n}\n\nconst fallbackNow = (): number => Date.now();\n\nconst fallbackSleep = (durationMs: number, signal?: AbortSignal): Promise<void> =>\n abortableSleep(durationMs, signal, \"Pipeline sleep\");\n\nexport function defaultPipelineContext(): PipelineContext {\n return { cwd: process.cwd(), log: console, now: fallbackNow, sleep: fallbackSleep };\n}\n\nexport function resolvePipelineRuntime(context: Partial<PipelineContext> = {}): PipelineRuntime {\n const defaults = defaultPipelineContext();\n return {\n ...defaults,\n ...context,\n cwd: context.cwd ?? defaults.cwd,\n log: context.log ?? defaults.log,\n now: context.now ?? defaults.now ?? fallbackNow,\n sleep: context.sleep ?? defaults.sleep ?? fallbackSleep,\n };\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PipelineError, PipelineRun, PipelineRuntime } from "./pipeline-types.js";
|
|
2
|
+
export declare function isCancellationOnly(errors: readonly PipelineError[]): boolean;
|
|
3
|
+
export declare class PipelineChildError extends Error {
|
|
4
|
+
readonly cancelled: boolean;
|
|
5
|
+
readonly fanOut?: {
|
|
6
|
+
failures: readonly {
|
|
7
|
+
error: Error;
|
|
8
|
+
key: string;
|
|
9
|
+
index: number;
|
|
10
|
+
cancelled: boolean;
|
|
11
|
+
}[];
|
|
12
|
+
failureCount: number;
|
|
13
|
+
schedulerError?: Error;
|
|
14
|
+
} | undefined;
|
|
15
|
+
constructor(message: string, cancelled?: boolean, cause?: unknown, fanOut?: {
|
|
16
|
+
failures: readonly {
|
|
17
|
+
error: Error;
|
|
18
|
+
key: string;
|
|
19
|
+
index: number;
|
|
20
|
+
cancelled: boolean;
|
|
21
|
+
}[];
|
|
22
|
+
failureCount: number;
|
|
23
|
+
schedulerError?: Error;
|
|
24
|
+
} | undefined);
|
|
25
|
+
}
|
|
26
|
+
/** Error thrown by `runOrThrow` when a pipeline run does not complete successfully. */
|
|
27
|
+
export declare class PipelineExecutionError extends Error {
|
|
28
|
+
readonly result: PipelineRun<unknown>;
|
|
29
|
+
constructor(result: PipelineRun<unknown>, message?: string);
|
|
30
|
+
}
|
|
31
|
+
export declare function toPipelineError(error: unknown, classification: Omit<PipelineError, "cause" | "message" | "sourceCode" | "stack">): PipelineError;
|
|
32
|
+
export declare function isPipelineCancellation(error: unknown, runtime: Pick<PipelineRuntime, "signal">): boolean;
|
|
33
|
+
/** Classify a failed attempt without exposing error subclasses to execution. */
|
|
34
|
+
export declare function stepExecutionError(error: unknown, runtime: Pick<PipelineRuntime, "signal">, stepId: string): PipelineError;
|
|
35
|
+
export declare function finalizationError(error: unknown, runtime: Pick<PipelineRuntime, "signal">): PipelineError;
|