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
package/dist/core/lifecycle.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import { createPipelineTraceEmitter
|
|
1
|
+
import { createPipelineTraceEmitter } from "../tracing/tracing-internal.js";
|
|
2
|
+
const PIPELINE_LOGGER_BASE = Symbol("pipelineLoggerBase");
|
|
3
|
+
function basePipelineLogger(log) {
|
|
4
|
+
// SAFETY: the optional symbol exists only on loggers created by this module.
|
|
5
|
+
return log[PIPELINE_LOGGER_BASE] ?? log;
|
|
6
|
+
}
|
|
2
7
|
function emitHook(runtime, emit) {
|
|
3
8
|
if (!runtime.hooks)
|
|
4
9
|
return;
|
|
@@ -20,8 +25,32 @@ function snapshotRun(result) {
|
|
|
20
25
|
const { value, ...metadata } = result;
|
|
21
26
|
return { ...structuredClone(metadata), value };
|
|
22
27
|
}
|
|
23
|
-
export function createPipelineLifecycleObserver(pipelineId, runtime,
|
|
28
|
+
export function createPipelineLifecycleObserver(pipelineId, runtime, identity) {
|
|
29
|
+
const base = basePipelineLogger(runtime.log);
|
|
30
|
+
const trace = createPipelineTraceEmitter(pipelineId, runtime.tracing, base, identity, runtime.now);
|
|
24
31
|
return {
|
|
32
|
+
traceContext: trace?.context,
|
|
33
|
+
logger(stepId, attemptId) {
|
|
34
|
+
if (!trace)
|
|
35
|
+
return runtime.log;
|
|
36
|
+
// A child run inherits its parent's logger, but owns its own trace events.
|
|
37
|
+
const log = {
|
|
38
|
+
error: (message, ...params) => {
|
|
39
|
+
trace.log("error", message, params, stepId, attemptId);
|
|
40
|
+
base.error(message, ...params);
|
|
41
|
+
},
|
|
42
|
+
log: (message, ...params) => {
|
|
43
|
+
trace.log("log", message, params, stepId, attemptId);
|
|
44
|
+
base.log(message, ...params);
|
|
45
|
+
},
|
|
46
|
+
warn: (message, ...params) => {
|
|
47
|
+
trace.log("warn", message, params, stepId, attemptId);
|
|
48
|
+
base.warn(message, ...params);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
log[PIPELINE_LOGGER_BASE] = base;
|
|
52
|
+
return log;
|
|
53
|
+
},
|
|
25
54
|
pipelineStart(plan, targetIds) {
|
|
26
55
|
emitHook(runtime, (hooks) => hooks.onPipelineStart?.(structuredClone(plan)));
|
|
27
56
|
trace?.pipelineStart(plan, targetIds);
|
|
@@ -40,6 +69,7 @@ export function createPipelineLifecycleObserver(pipelineId, runtime, trace) {
|
|
|
40
69
|
else {
|
|
41
70
|
emitHook(runtime, (hooks) => hooks.onStepStart?.({
|
|
42
71
|
attemptId: event.attemptId,
|
|
72
|
+
...(event.outputSource ? { outputSource: event.outputSource } : {}),
|
|
43
73
|
pipelineId: event.pipelineId,
|
|
44
74
|
status: "running",
|
|
45
75
|
step: structuredClone(event.step),
|
|
@@ -62,8 +92,8 @@ export function createPipelineLifecycleObserver(pipelineId, runtime, trace) {
|
|
|
62
92
|
if (traceStatus)
|
|
63
93
|
trace?.stepStatus(event);
|
|
64
94
|
},
|
|
95
|
+
recordArtifact: (stepId, attemptId, record, preview) => trace?.artifact(stepId, attemptId, record, preview),
|
|
65
96
|
reportAttempt: (stepId, attempt, attributes, attemptId) => trace?.reportAttempt(stepId, attempt, attributes, attemptId),
|
|
66
|
-
log: (level, message, params, stepId, attemptId) => trace?.log(level, message, params, stepId, attemptId),
|
|
67
97
|
finalizeStart() {
|
|
68
98
|
emitHook(runtime, (hooks) => hooks.onFinalizeStart?.({ pipelineId }));
|
|
69
99
|
trace?.finalizeStart();
|
|
@@ -92,7 +122,9 @@ export async function emitRejectedPlanLifecycle(pipelineId, targetIds, plan, run
|
|
|
92
122
|
identity.parentRunId = result.parentRunId;
|
|
93
123
|
if (runtime.tracing?.itemKey)
|
|
94
124
|
identity.itemKey = runtime.tracing.itemKey;
|
|
95
|
-
|
|
125
|
+
if (runtime.tracing?.iteration)
|
|
126
|
+
identity.iteration = runtime.tracing.iteration;
|
|
127
|
+
const lifecycle = createPipelineLifecycleObserver(pipelineId, runtime, identity);
|
|
96
128
|
lifecycle.pipelineStart(plan, targetIds);
|
|
97
129
|
lifecycle.pipelineComplete(result);
|
|
98
130
|
await lifecycle.flush();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PipelineError,\n PipelineHooks,\n PipelinePlan,\n PipelineRun,\n PipelineRuntime,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\nimport {\n createPipelineTraceEmitter,\n type PipelineTraceEmitter,\n} from \"../tracing/tracing-internal.js\";\nimport type {\n PipelineTraceAttributes,\n PipelineTraceContext,\n} from \"../tracing/tracing-contracts.js\";\n\n/** Internal canonical lifecycle stream. Hooks and tracing are projections of it. */\nexport interface PipelineLifecycleObserver {\n finalizeComplete(durationMs: number, value: unknown): void;\n finalizeError(error: PipelineError, durationMs: number): void;\n finalizeStart(): void;\n flush(): Promise<void>;\n log(\n level: \"error\" | \"log\" | \"warn\",\n message: unknown,\n params?: readonly unknown[],\n stepId?: string,\n attemptId?: string\n ): void;\n pipelineComplete(result: PipelineRun<unknown>): void;\n pipelineStart(plan: PipelinePlan, targetIds: readonly string[]): void;\n reportAttempt(\n stepId: string,\n attempt: number,\n attributes?: PipelineTraceAttributes,\n attemptId?: string\n ): void;\n stepStatus(event: PipelineStepStatus, trace?: boolean): void;\n}\n\nfunction emitHook(runtime: PipelineRuntime, emit: (hooks: PipelineHooks) => void): void {\n if (!runtime.hooks) return;\n const hookSets = Array.isArray(runtime.hooks) ? runtime.hooks : [runtime.hooks];\n for (const hooks of hookSets) {\n try {\n emit(hooks);\n } catch (error) {\n runtime.log.warn(\n `Pipeline hook failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\n\nfunction snapshotRun(result: PipelineRun<unknown>): PipelineRun<unknown> {\n if (!result.finalized) return structuredClone(result);\n // Domain results may contain functions or class instances. Only lifecycle\n // metadata belongs to Tubeless; preserve the domain value's identity.\n const { value, ...metadata } = result;\n return { ...structuredClone(metadata), value };\n}\n\nexport function createPipelineLifecycleObserver(\n pipelineId: string,\n runtime: PipelineRuntime,\n trace: PipelineTraceEmitter | undefined\n): PipelineLifecycleObserver {\n return {\n pipelineStart(plan, targetIds) {\n emitHook(runtime, (hooks) => hooks.onPipelineStart?.(structuredClone(plan)));\n trace?.pipelineStart(plan, targetIds);\n },\n stepStatus(event, traceStatus = true) {\n emitHook(runtime, (hooks) => hooks.onStepStatus?.(structuredClone(event)));\n switch (event.status) {\n case \"planned\":\n emitHook(runtime, (hooks) => hooks.onStepPlan?.(structuredClone(event)));\n break;\n case \"running\":\n if (event.progress) {\n const progress = event.progress;\n emitHook(runtime, (hooks) =>\n hooks.onStepProgress?.(structuredClone({ ...event, progress }))\n );\n } else {\n emitHook(runtime, (hooks) =>\n hooks.onStepStart?.({\n attemptId: event.attemptId,\n pipelineId: event.pipelineId,\n status: \"running\",\n step: structuredClone(event.step),\n })\n );\n }\n break;\n case \"cancelled\":\n emitHook(runtime, (hooks) => hooks.onStepCancel?.(structuredClone(event)));\n break;\n case \"failed\":\n emitHook(runtime, (hooks) => hooks.onStepFail?.(structuredClone(event)));\n break;\n case \"skipped\":\n emitHook(runtime, (hooks) => hooks.onStepSkip?.(structuredClone(event)));\n break;\n case \"completed\":\n emitHook(runtime, (hooks) => hooks.onStepComplete?.(structuredClone(event)));\n break;\n }\n if (traceStatus) trace?.stepStatus(event);\n },\n reportAttempt: (stepId, attempt, attributes, attemptId) =>\n trace?.reportAttempt(stepId, attempt, attributes, attemptId),\n log: (level, message, params, stepId, attemptId) =>\n trace?.log(level, message, params, stepId, attemptId),\n finalizeStart() {\n emitHook(runtime, (hooks) => hooks.onFinalizeStart?.({ pipelineId }));\n trace?.finalizeStart();\n },\n finalizeComplete(durationMs, value) {\n emitHook(runtime, (hooks) => hooks.onFinalizeComplete?.({ durationMs, pipelineId, value }));\n trace?.finalizeComplete(durationMs);\n },\n finalizeError(error, durationMs) {\n emitHook(runtime, (hooks) =>\n hooks.onFinalizeError?.({ durationMs, error: structuredClone(error), pipelineId })\n );\n trace?.finalizeError(error, durationMs);\n },\n pipelineComplete(result) {\n emitHook(runtime, (hooks) => hooks.onPipelineComplete?.(snapshotRun(result)));\n trace?.pipelineComplete(result);\n },\n flush: () => trace?.flush() ?? Promise.resolve(),\n };\n}\n\n/** Same start/complete projection executePlannedRun uses for an invalid plan. */\nexport async function emitRejectedPlanLifecycle(\n pipelineId: string,\n targetIds: readonly string[],\n plan: PipelinePlan,\n runtime: PipelineRuntime,\n result: PipelineRun<unknown>\n): Promise<void> {\n const identity: PipelineTraceContext = { runId: result.runId };\n if (result.correlationId !== undefined) identity.correlationId = result.correlationId;\n if (result.parentRunId) identity.parentRunId = result.parentRunId;\n if (runtime.tracing?.itemKey) identity.itemKey = runtime.tracing.itemKey;\n const lifecycle = createPipelineLifecycleObserver(\n pipelineId,\n runtime,\n createPipelineTraceEmitter(pipelineId, runtime.tracing, runtime.log, identity, runtime.now)\n );\n lifecycle.pipelineStart(plan, targetIds);\n lifecycle.pipelineComplete(result);\n await lifecycle.flush();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ArtifactRecord } from \"../tracing/artifact-metadata.js\";\nimport type {\n PipelineError,\n PipelineHooks,\n PipelineLogger,\n PipelinePlan,\n PipelineRun,\n PipelineRuntime,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\nimport { createPipelineTraceEmitter } from \"../tracing/tracing-internal.js\";\nimport type {\n PipelineTraceAttributes,\n PipelineTraceContext,\n} from \"../tracing/tracing-contracts.js\";\n\n/** Internal canonical lifecycle stream. Hooks and tracing are projections of it. */\nexport interface PipelineLifecycleObserver {\n readonly traceContext: PipelineTraceContext | undefined;\n finalizeComplete(durationMs: number, value: unknown): void;\n finalizeError(error: PipelineError, durationMs: number): void;\n finalizeStart(): void;\n flush(): Promise<void>;\n logger(stepId?: string, attemptId?: string): PipelineLogger;\n pipelineComplete(result: PipelineRun<unknown>): void;\n pipelineStart(plan: PipelinePlan, targetIds: readonly string[]): void;\n recordArtifact(stepId: string, attemptId: string, record: ArtifactRecord, preview: boolean): void;\n reportAttempt(\n stepId: string,\n attempt: number,\n attributes?: PipelineTraceAttributes,\n attemptId?: string\n ): void;\n stepStatus(event: PipelineStepStatus, trace?: boolean): void;\n}\n\nconst PIPELINE_LOGGER_BASE = Symbol(\"pipelineLoggerBase\");\n\ntype TracedPipelineLogger = PipelineLogger & { [PIPELINE_LOGGER_BASE]?: PipelineLogger };\n\nfunction basePipelineLogger(log: PipelineLogger): PipelineLogger {\n // SAFETY: the optional symbol exists only on loggers created by this module.\n return (log as TracedPipelineLogger)[PIPELINE_LOGGER_BASE] ?? log;\n}\n\nfunction emitHook(runtime: PipelineRuntime, emit: (hooks: PipelineHooks) => void): void {\n if (!runtime.hooks) return;\n const hookSets = Array.isArray(runtime.hooks) ? runtime.hooks : [runtime.hooks];\n for (const hooks of hookSets) {\n try {\n emit(hooks);\n } catch (error) {\n runtime.log.warn(\n `Pipeline hook failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\n\nfunction snapshotRun(result: PipelineRun<unknown>): PipelineRun<unknown> {\n if (!result.finalized) return structuredClone(result);\n // Domain results may contain functions or class instances. Only lifecycle\n // metadata belongs to Tubeless; preserve the domain value's identity.\n const { value, ...metadata } = result;\n return { ...structuredClone(metadata), value };\n}\n\nexport function createPipelineLifecycleObserver(\n pipelineId: string,\n runtime: PipelineRuntime,\n identity: PipelineTraceContext\n): PipelineLifecycleObserver {\n const base = basePipelineLogger(runtime.log);\n const trace = createPipelineTraceEmitter(\n pipelineId,\n runtime.tracing,\n base,\n identity,\n runtime.now\n );\n return {\n traceContext: trace?.context,\n logger(stepId, attemptId) {\n if (!trace) return runtime.log;\n // A child run inherits its parent's logger, but owns its own trace events.\n const log: TracedPipelineLogger = {\n error: (message, ...params) => {\n trace.log(\"error\", message, params, stepId, attemptId);\n base.error(message, ...params);\n },\n log: (message, ...params) => {\n trace.log(\"log\", message, params, stepId, attemptId);\n base.log(message, ...params);\n },\n warn: (message, ...params) => {\n trace.log(\"warn\", message, params, stepId, attemptId);\n base.warn(message, ...params);\n },\n };\n log[PIPELINE_LOGGER_BASE] = base;\n return log;\n },\n pipelineStart(plan, targetIds) {\n emitHook(runtime, (hooks) => hooks.onPipelineStart?.(structuredClone(plan)));\n trace?.pipelineStart(plan, targetIds);\n },\n stepStatus(event, traceStatus = true) {\n emitHook(runtime, (hooks) => hooks.onStepStatus?.(structuredClone(event)));\n switch (event.status) {\n case \"planned\":\n emitHook(runtime, (hooks) => hooks.onStepPlan?.(structuredClone(event)));\n break;\n case \"running\":\n if (event.progress) {\n const progress = event.progress;\n emitHook(runtime, (hooks) =>\n hooks.onStepProgress?.(structuredClone({ ...event, progress }))\n );\n } else {\n emitHook(runtime, (hooks) =>\n hooks.onStepStart?.({\n attemptId: event.attemptId,\n ...(event.outputSource ? { outputSource: event.outputSource } : {}),\n pipelineId: event.pipelineId,\n status: \"running\",\n step: structuredClone(event.step),\n })\n );\n }\n break;\n case \"cancelled\":\n emitHook(runtime, (hooks) => hooks.onStepCancel?.(structuredClone(event)));\n break;\n case \"failed\":\n emitHook(runtime, (hooks) => hooks.onStepFail?.(structuredClone(event)));\n break;\n case \"skipped\":\n emitHook(runtime, (hooks) => hooks.onStepSkip?.(structuredClone(event)));\n break;\n case \"completed\":\n emitHook(runtime, (hooks) => hooks.onStepComplete?.(structuredClone(event)));\n break;\n }\n if (traceStatus) trace?.stepStatus(event);\n },\n recordArtifact: (stepId, attemptId, record, preview) =>\n trace?.artifact(stepId, attemptId, record, preview),\n reportAttempt: (stepId, attempt, attributes, attemptId) =>\n trace?.reportAttempt(stepId, attempt, attributes, attemptId),\n finalizeStart() {\n emitHook(runtime, (hooks) => hooks.onFinalizeStart?.({ pipelineId }));\n trace?.finalizeStart();\n },\n finalizeComplete(durationMs, value) {\n emitHook(runtime, (hooks) => hooks.onFinalizeComplete?.({ durationMs, pipelineId, value }));\n trace?.finalizeComplete(durationMs);\n },\n finalizeError(error, durationMs) {\n emitHook(runtime, (hooks) =>\n hooks.onFinalizeError?.({ durationMs, error: structuredClone(error), pipelineId })\n );\n trace?.finalizeError(error, durationMs);\n },\n pipelineComplete(result) {\n emitHook(runtime, (hooks) => hooks.onPipelineComplete?.(snapshotRun(result)));\n trace?.pipelineComplete(result);\n },\n flush: () => trace?.flush() ?? Promise.resolve(),\n };\n}\n\n/** Same start/complete projection executePlannedRun uses for an invalid plan. */\nexport async function emitRejectedPlanLifecycle(\n pipelineId: string,\n targetIds: readonly string[],\n plan: PipelinePlan,\n runtime: PipelineRuntime,\n result: PipelineRun<unknown>\n): Promise<void> {\n const identity: PipelineTraceContext = { runId: result.runId };\n if (result.correlationId !== undefined) identity.correlationId = result.correlationId;\n if (result.parentRunId) identity.parentRunId = result.parentRunId;\n if (runtime.tracing?.itemKey) identity.itemKey = runtime.tracing.itemKey;\n if (runtime.tracing?.iteration) identity.iteration = runtime.tracing.iteration;\n const lifecycle = createPipelineLifecycleObserver(pipelineId, runtime, identity);\n lifecycle.pipelineStart(plan, targetIds);\n lifecycle.pipelineComplete(result);\n await lifecycle.flush();\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ArtifactMetadata } from "../tracing/artifact-metadata.js";
|
|
2
|
+
import type { PipelineStepContext } from "./pipeline-types.js";
|
|
3
|
+
/** Adapter result: the value flows to dependents; only artifact metadata is recorded. */
|
|
4
|
+
export interface ArtifactResult<TValue> {
|
|
5
|
+
readonly value: TValue;
|
|
6
|
+
readonly artifact: ArtifactMetadata;
|
|
7
|
+
}
|
|
8
|
+
/** Application-owned read boundary. Forward context.signal to cancellable I/O. */
|
|
9
|
+
export type ArtifactLoader<TInput, TValue, TOptions extends object = {}> = (input: TInput, context: PipelineStepContext<TOptions>) => ArtifactResult<TValue> | Promise<ArtifactResult<TValue>>;
|
|
10
|
+
/** Application-owned write boundary returning a typed receipt and separate trace metadata. */
|
|
11
|
+
export type ArtifactSaver<TInput, TValue, TOptions extends object = {}> = (input: TInput, context: PipelineStepContext<TOptions>) => ArtifactResult<TValue> | Promise<ArtifactResult<TValue>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-artifacts.js","sourceRoot":"","sources":["../../src/core/pipeline-artifacts.ts"],"names":[],"mappings":"","sourcesContent":["import type { ArtifactMetadata } from \"../tracing/artifact-metadata.js\";\nimport type { PipelineStepContext } from \"./pipeline-types.js\";\n\n/** Adapter result: the value flows to dependents; only artifact metadata is recorded. */\nexport interface ArtifactResult<TValue> {\n readonly value: TValue;\n readonly artifact: ArtifactMetadata;\n}\n\n/** Application-owned read boundary. Forward context.signal to cancellable I/O. */\nexport type ArtifactLoader<TInput, TValue, TOptions extends object = {}> = (\n input: TInput,\n context: PipelineStepContext<TOptions>\n) => ArtifactResult<TValue> | Promise<ArtifactResult<TValue>>;\n\n/** Application-owned write boundary returning a typed receipt and separate trace metadata. */\nexport type ArtifactSaver<TInput, TValue, TOptions extends object = {}> = (\n input: TInput,\n context: PipelineStepContext<TOptions>\n) => ArtifactResult<TValue> | Promise<ArtifactResult<TValue>>;\n"]}
|
|
@@ -9,6 +9,7 @@ export interface CompiledPipeline<TSteps extends readonly AnyStep[] = readonly A
|
|
|
9
9
|
readonly id: string;
|
|
10
10
|
readonly optionsSchema: StandardSchemaV1 | undefined;
|
|
11
11
|
readonly orderedSteps: readonly AnyStep<StepsOptions<TSteps>>[];
|
|
12
|
+
readonly compiledByAuthorStep: ReadonlyMap<AnyStep, AnyStep>;
|
|
12
13
|
readonly requiredFinalizerSteps: readonly AnyStep<StepsOptions<TSteps>>[] | undefined;
|
|
13
14
|
readonly stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;
|
|
14
15
|
readonly resultSchema: TResultSchema | undefined;
|
|
@@ -49,6 +49,7 @@ export function compilePipeline(definition) {
|
|
|
49
49
|
? undefined
|
|
50
50
|
: compiledByAuthorStep.get(definition.steps[0])?.[STEP_OPTIONS_SCHEMA],
|
|
51
51
|
orderedSteps: Object.freeze([...orderedSteps]),
|
|
52
|
+
compiledByAuthorStep,
|
|
52
53
|
stepGraph,
|
|
53
54
|
requiredFinalizerSteps: compiledRequiredFinalizerSteps
|
|
54
55
|
? Object.freeze(compiledRequiredFinalizerSteps)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-compiler.js","sourceRoot":"","sources":["../../src/core/pipeline-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAA0B,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline-compiler.js","sourceRoot":"","sources":["../../src/core/pipeline-compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import { compileDefinitionSnapshot } from \"./pipeline-definition-identity.js\";\nimport type { PipelineDefinition, StepsOptions } from \"./pipeline-definition.js\";\nimport { validatePipelineDefinition } from \"./pipeline-definition-validation.js\";\nimport { PipelineDefinitionError } from \"./pipeline-errors.js\";\nimport { requiredFinalizerMetadata } from \"./pipeline-finalizer.js\";\nimport { compilePipelineGraph, type CompiledStepGraph } from \"./pipeline-graph.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { STEP_OPTIONS_SCHEMA } from \"./pipeline-step-metadata.js\";\nimport type { PipelineDefinitionSnapshot, StandardSchemaV1 } from \"./pipeline-types.js\";\n\nexport interface CompiledPipeline<\n TSteps extends readonly AnyStep[] = readonly AnyStep[],\n TResult = unknown,\n TTargets extends readonly TSteps[number][] = readonly [],\n TResultSchema extends StandardSchemaV1 | undefined = undefined,\n> {\n readonly definition: PipelineDefinitionSnapshot;\n readonly declaredTargets: readonly AnyStep<StepsOptions<TSteps>>[];\n readonly finalize: Extract<\n NonNullable<PipelineDefinition<TSteps, TResult, TTargets, TResultSchema>[\"finalize\"]>,\n (...args: never[]) => unknown\n >;\n readonly id: string;\n readonly optionsSchema: StandardSchemaV1 | undefined;\n readonly orderedSteps: readonly AnyStep<StepsOptions<TSteps>>[];\n readonly compiledByAuthorStep: ReadonlyMap<AnyStep, AnyStep>;\n readonly requiredFinalizerSteps: readonly AnyStep<StepsOptions<TSteps>>[] | undefined;\n readonly stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;\n readonly resultSchema: TResultSchema | undefined;\n readonly stepIds: readonly string[];\n readonly targetIds: readonly string[];\n}\n\nexport function compilePipeline<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(\n definition: PipelineDefinition<TSteps, TResult, TTargets, TResultSchema>\n): CompiledPipeline<TSteps, TResult, TTargets, TResultSchema> {\n const errors = validatePipelineDefinition(definition);\n if (errors.length > 0) {\n throw new PipelineDefinitionError(definition.id, errors);\n }\n type TOptions = StepsOptions<TSteps>;\n // SAFETY: `steps` is `TSteps extends readonly AnyStep[]`; the cast restores\n // the `TOptions` generic that the tuple erased, without changing the values.\n const { compiledByAuthorStep, orderedSteps, stepGraph } = compilePipelineGraph(\n definition.steps as readonly AnyStep<TOptions>[]\n );\n const finalizerMetadata = requiredFinalizerMetadata<TOptions>(definition.finalize);\n const requiredFinalizerSteps = finalizerMetadata?.steps;\n const compiledTargets = definition.targets\n ? definition.targets.map((target) => compiledByAuthorStep.get(target)!)\n : orderedSteps.slice(-1);\n const compiledRequiredFinalizerSteps = requiredFinalizerSteps?.map((step) =>\n compiledByAuthorStep.get(step)!\n );\n const lastStepId = orderedSteps.at(-1)?.id;\n const authoredFinalize = definition.finalize;\n type Finalizer = CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>[\"finalize\"];\n const compiledFinalize = finalizerMetadata\n ? finalizerMetadata.compile(compiledRequiredFinalizerSteps!.map((step) => step.id))\n : typeof authoredFinalize === \"function\"\n ? (outputs: Parameters<Finalizer>[0], context: Parameters<Finalizer>[1]) =>\n authoredFinalize.call(definition, outputs, context)\n : (outputs: Record<string, unknown>) =>\n lastStepId !== undefined && Object.hasOwn(outputs, lastStepId)\n ? outputs[lastStepId]\n : undefined;\n const snapshot = compileDefinitionSnapshot({\n orderedSteps,\n stepGraph,\n targetIds: compiledTargets.map((step) => step.id),\n requiredFinalizerSteps: compiledRequiredFinalizerSteps,\n resultValidated: definition.resultSchema !== undefined,\n implementationVersion: definition.implementationVersion,\n });\n return Object.freeze({\n definition: snapshot,\n declaredTargets: Object.freeze(compiledTargets),\n // Invoke ordinary finalizers on the author's definition so method-style\n // implementations keep `this`. Required finalizers compile the same input\n // and context contract with stable required ids.\n // SAFETY: supplied finalizers preserve their signature; definePipeline checks\n // that an omitted finalizer can use the last step's output as its result.\n finalize: compiledFinalize as Finalizer,\n id: definition.id,\n optionsSchema:\n definition.steps.length === 0\n ? undefined\n : compiledByAuthorStep.get(definition.steps[0]!)?.[STEP_OPTIONS_SCHEMA],\n orderedSteps: Object.freeze([...orderedSteps]),\n compiledByAuthorStep,\n stepGraph,\n requiredFinalizerSteps: compiledRequiredFinalizerSteps\n ? Object.freeze(compiledRequiredFinalizerSteps)\n : undefined,\n resultSchema: definition.resultSchema,\n stepIds: Object.freeze(definition.steps.map((step) => compiledByAuthorStep.get(step)!.id)),\n targetIds: Object.freeze(compiledTargets.map((step) => step.id)),\n });\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CompiledStepGraph } from "./pipeline-graph.js";
|
|
2
2
|
import type { AnyStep } from "./pipeline-steps.js";
|
|
3
3
|
import type { PipelineDefinitionIdentity, PipelineDefinitionSnapshot } from "./pipeline-types.js";
|
|
4
|
-
/** Canonical
|
|
4
|
+
/** Canonical snapshot. Execution order matters; dependency and target sets do not. */
|
|
5
5
|
export declare function compileDefinitionSnapshot(input: {
|
|
6
6
|
orderedSteps: readonly AnyStep[];
|
|
7
7
|
stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;
|
|
@@ -10,5 +10,5 @@ export declare function compileDefinitionSnapshot(input: {
|
|
|
10
10
|
resultValidated: boolean;
|
|
11
11
|
implementationVersion: string | undefined;
|
|
12
12
|
}): PipelineDefinitionSnapshot;
|
|
13
|
-
/**
|
|
13
|
+
/** Preserve v1 hashes; extended child semantics use v2, including their ancestors. */
|
|
14
14
|
export declare function createDefinitionIdentity(input: Omit<PipelineDefinitionSnapshot, "identity">, implementationVersion: string | undefined): PipelineDefinitionIdentity;
|
|
@@ -11,7 +11,25 @@ function freezeSnapshot(value) {
|
|
|
11
11
|
}
|
|
12
12
|
return value;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
function iterationFields(nested) {
|
|
15
|
+
if (nested.mode !== "iterate")
|
|
16
|
+
return {};
|
|
17
|
+
const controls = nested.controls;
|
|
18
|
+
const normalizedControls = {
|
|
19
|
+
...(controls?.dryRun !== undefined ? { dryRun: controls.dryRun } : {}),
|
|
20
|
+
...(controls?.continueOnError !== undefined
|
|
21
|
+
? { continueOnError: controls.continueOnError }
|
|
22
|
+
: {}),
|
|
23
|
+
...(controls?.maxConcurrency !== undefined ? { maxConcurrency: controls.maxConcurrency } : {}),
|
|
24
|
+
...(controls?.targets !== undefined ? { targets: [...controls.targets].sort() } : {}),
|
|
25
|
+
...(controls?.stepIds !== undefined ? { stepIds: [...controls.stepIds].sort() } : {}),
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
maxIterations: nested.maxIterations,
|
|
29
|
+
...(Object.keys(normalizedControls).length > 0 ? { controls: normalizedControls } : {}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Canonical snapshot. Execution order matters; dependency and target sets do not. */
|
|
15
33
|
export function compileDefinitionSnapshot(input) {
|
|
16
34
|
const steps = input.orderedSteps.map((step) => {
|
|
17
35
|
const graph = input.stepGraph.get(step);
|
|
@@ -34,6 +52,7 @@ export function compileDefinitionSnapshot(input) {
|
|
|
34
52
|
nestedPipeline: {
|
|
35
53
|
pipelineId: nested.pipelineId,
|
|
36
54
|
mode: nested.mode,
|
|
55
|
+
...iterationFields(nested),
|
|
37
56
|
stepIds: [...nested.stepIds],
|
|
38
57
|
...(nested.identity ? { identity: { ...nested.identity } } : {}),
|
|
39
58
|
...(nested.concurrency !== undefined ? { concurrency: nested.concurrency } : {}),
|
|
@@ -64,11 +83,14 @@ export function compileDefinitionSnapshot(input) {
|
|
|
64
83
|
...semantics,
|
|
65
84
|
});
|
|
66
85
|
}
|
|
67
|
-
/**
|
|
86
|
+
/** Preserve v1 hashes; extended child semantics use v2, including their ancestors. */
|
|
68
87
|
export function createDefinitionIdentity(input, implementationVersion) {
|
|
88
|
+
const version = input.steps.some((step) => step.nestedPipeline?.mode === "iterate" || step.nestedPipeline?.identity?.version === 2)
|
|
89
|
+
? 2
|
|
90
|
+
: 1;
|
|
69
91
|
// Child handler versions participate in the combined identity, never the graph fingerprint.
|
|
70
92
|
const structuralFingerprint = fingerprint({
|
|
71
|
-
version
|
|
93
|
+
version,
|
|
72
94
|
steps: input.steps.map((step) => ({
|
|
73
95
|
id: step.id,
|
|
74
96
|
dependencies: [...step.dependencies].sort(),
|
|
@@ -82,6 +104,7 @@ export function createDefinitionIdentity(input, implementationVersion) {
|
|
|
82
104
|
nestedPipeline: {
|
|
83
105
|
pipelineId: step.nestedPipeline.pipelineId,
|
|
84
106
|
mode: step.nestedPipeline.mode,
|
|
107
|
+
...iterationFields(step.nestedPipeline),
|
|
85
108
|
stepIds: [...step.nestedPipeline.stepIds],
|
|
86
109
|
...(step.nestedPipeline.identity
|
|
87
110
|
? {
|
|
@@ -114,11 +137,11 @@ export function createDefinitionIdentity(input, implementationVersion) {
|
|
|
114
137
|
resultValidated: input.resultValidated,
|
|
115
138
|
});
|
|
116
139
|
return {
|
|
117
|
-
version
|
|
140
|
+
version,
|
|
118
141
|
structuralFingerprint,
|
|
119
142
|
...(implementationVersion !== undefined ? { implementationVersion } : {}),
|
|
120
143
|
definitionId: fingerprint({
|
|
121
|
-
version
|
|
144
|
+
version,
|
|
122
145
|
structuralFingerprint,
|
|
123
146
|
implementationVersion,
|
|
124
147
|
children: input.steps.map((step) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-definition-identity.js","sourceRoot":"","sources":["../../src/core/pipeline-definition-identity.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { CompiledStepGraph } from \"./pipeline-graph.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport {\n STEP_NESTED_PIPELINE,\n STEP_OPTIONS_SCHEMA,\n STEP_REMOTE,\n} from \"./pipeline-step-metadata.js\";\nimport type { PipelineDefinitionIdentity, PipelineDefinitionSnapshot } from \"./pipeline-types.js\";\n\nfunction fingerprint(value: unknown): string {\n return `sha256:${createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\")}`;\n}\n\nfunction freezeSnapshot<T>(value: T): T {\n if (value !== null && typeof value === \"object\") {\n for (const child of Object.values(value)) freezeSnapshot(child);\n Object.freeze(value);\n }\n return value;\n}\n\n/** Canonical v1 semantics. Execution order matters; dependency and target sets do not. */\nexport function compileDefinitionSnapshot(input: {\n orderedSteps: readonly AnyStep[];\n stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;\n targetIds: readonly string[];\n requiredFinalizerSteps: readonly AnyStep[] | undefined;\n resultValidated: boolean;\n implementationVersion: string | undefined;\n}): PipelineDefinitionSnapshot {\n const steps = input.orderedSteps.map((step) => {\n const graph = input.stepGraph.get(step)!;\n const nested = step[STEP_NESTED_PIPELINE];\n const remote = step[STEP_REMOTE];\n return {\n id: step.id,\n dependencies: graph.dependsOn.map(({ id }) => id).sort(),\n optionalDependencies: graph.optionalDependsOn.map(({ id }) => id).sort(),\n skipAfterFailureOf: graph.skipAfterFailureOf.map(({ id }) => id).sort(),\n dryRun:\n step.dryRun === \"skip\"\n ? (\"skip\" as const)\n : step.dryRun\n ? (\"custom\" as const)\n : (\"run\" as const),\n runtimeSkipPossible: step.skip !== undefined,\n outputValidated: step.outputSchema !== undefined,\n ...(nested\n ? {\n nestedPipeline: {\n pipelineId: nested.pipelineId,\n mode: nested.mode,\n stepIds: [...nested.stepIds],\n ...(nested.identity ? { identity: { ...nested.identity } } : {}),\n ...(nested.concurrency !== undefined ? { concurrency: nested.concurrency } : {}),\n },\n }\n : {}),\n ...(remote\n ? {\n remote: {\n engine: remote.engine,\n ...(remote.target !== undefined ? { target: remote.target } : {}),\n },\n }\n : {}),\n };\n });\n const semantics = {\n steps,\n targetIds: [...input.targetIds].sort(),\n ...(input.requiredFinalizerSteps\n ? { requiredFinalizerStepIds: input.requiredFinalizerSteps.map(({ id }) => id).sort() }\n : {}),\n optionsValidated: input.orderedSteps[0]?.[STEP_OPTIONS_SCHEMA] !== undefined,\n resultValidated: input.resultValidated,\n };\n return freezeSnapshot({\n identity: createDefinitionIdentity(semantics, input.implementationVersion),\n ...semantics,\n });\n}\n\n/** Rebuild v1 hashes from explicit fields, independent of JSON object property order. */\nexport function createDefinitionIdentity(\n input: Omit<PipelineDefinitionSnapshot, \"identity\">,\n implementationVersion: string | undefined\n): PipelineDefinitionIdentity {\n // Child handler versions participate in the combined identity, never the graph fingerprint.\n const structuralFingerprint = fingerprint({\n version: 1,\n steps: input.steps.map((step) => ({\n id: step.id,\n dependencies: [...step.dependencies].sort(),\n optionalDependencies: [...step.optionalDependencies].sort(),\n skipAfterFailureOf: [...step.skipAfterFailureOf].sort(),\n dryRun: step.dryRun,\n runtimeSkipPossible: step.runtimeSkipPossible,\n outputValidated: step.outputValidated,\n ...(step.nestedPipeline\n ? {\n nestedPipeline: {\n pipelineId: step.nestedPipeline.pipelineId,\n mode: step.nestedPipeline.mode,\n stepIds: [...step.nestedPipeline.stepIds],\n ...(step.nestedPipeline.identity\n ? {\n identity: {\n version: step.nestedPipeline.identity.version,\n structuralFingerprint: step.nestedPipeline.identity.structuralFingerprint,\n },\n }\n : {}),\n ...(step.nestedPipeline.concurrency !== undefined\n ? { concurrency: step.nestedPipeline.concurrency }\n : {}),\n },\n }\n : {}),\n ...(step.remote\n ? {\n remote: {\n engine: step.remote.engine,\n ...(step.remote.target !== undefined ? { target: step.remote.target } : {}),\n },\n }\n : {}),\n })),\n targetIds: [...input.targetIds].sort(),\n ...(input.requiredFinalizerStepIds\n ? { requiredFinalizerStepIds: [...input.requiredFinalizerStepIds].sort() }\n : {}),\n optionsValidated: input.optionsValidated,\n resultValidated: input.resultValidated,\n });\n return {\n version: 1,\n structuralFingerprint,\n ...(implementationVersion !== undefined ? { implementationVersion } : {}),\n definitionId: fingerprint({\n version: 1,\n structuralFingerprint,\n implementationVersion,\n children: input.steps.map((step) => {\n const child = step.nestedPipeline?.identity;\n if (!child) return null;\n // Bind every recorded child identity field, not just its opaque definition ID.\n return {\n version: child.version,\n structuralFingerprint: child.structuralFingerprint,\n ...(child.implementationVersion !== undefined\n ? { implementationVersion: child.implementationVersion }\n : {}),\n definitionId: child.definitionId,\n };\n }),\n }),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pipeline-definition-identity.js","sourceRoot":"","sources":["../../src/core/pipeline-definition-identity.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { CompiledStepGraph } from \"./pipeline-graph.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport {\n STEP_NESTED_PIPELINE,\n STEP_OPTIONS_SCHEMA,\n STEP_REMOTE,\n} from \"./pipeline-step-metadata.js\";\nimport type { PipelineDefinitionIdentity, PipelineDefinitionSnapshot } from \"./pipeline-types.js\";\n\nfunction fingerprint(value: unknown): string {\n return `sha256:${createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\")}`;\n}\n\nfunction freezeSnapshot<T>(value: T): T {\n if (value !== null && typeof value === \"object\") {\n for (const child of Object.values(value)) freezeSnapshot(child);\n Object.freeze(value);\n }\n return value;\n}\n\nfunction iterationFields(\n nested: NonNullable<PipelineDefinitionSnapshot[\"steps\"][number][\"nestedPipeline\"]>\n) {\n if (nested.mode !== \"iterate\") return {};\n const controls = nested.controls;\n const normalizedControls = {\n ...(controls?.dryRun !== undefined ? { dryRun: controls.dryRun } : {}),\n ...(controls?.continueOnError !== undefined\n ? { continueOnError: controls.continueOnError }\n : {}),\n ...(controls?.maxConcurrency !== undefined ? { maxConcurrency: controls.maxConcurrency } : {}),\n ...(controls?.targets !== undefined ? { targets: [...controls.targets].sort() } : {}),\n ...(controls?.stepIds !== undefined ? { stepIds: [...controls.stepIds].sort() } : {}),\n };\n return {\n maxIterations: nested.maxIterations,\n ...(Object.keys(normalizedControls).length > 0 ? { controls: normalizedControls } : {}),\n };\n}\n\n/** Canonical snapshot. Execution order matters; dependency and target sets do not. */\nexport function compileDefinitionSnapshot(input: {\n orderedSteps: readonly AnyStep[];\n stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;\n targetIds: readonly string[];\n requiredFinalizerSteps: readonly AnyStep[] | undefined;\n resultValidated: boolean;\n implementationVersion: string | undefined;\n}): PipelineDefinitionSnapshot {\n const steps = input.orderedSteps.map((step) => {\n const graph = input.stepGraph.get(step)!;\n const nested = step[STEP_NESTED_PIPELINE];\n const remote = step[STEP_REMOTE];\n return {\n id: step.id,\n dependencies: graph.dependsOn.map(({ id }) => id).sort(),\n optionalDependencies: graph.optionalDependsOn.map(({ id }) => id).sort(),\n skipAfterFailureOf: graph.skipAfterFailureOf.map(({ id }) => id).sort(),\n dryRun:\n step.dryRun === \"skip\"\n ? (\"skip\" as const)\n : step.dryRun\n ? (\"custom\" as const)\n : (\"run\" as const),\n runtimeSkipPossible: step.skip !== undefined,\n outputValidated: step.outputSchema !== undefined,\n ...(nested\n ? {\n nestedPipeline: {\n pipelineId: nested.pipelineId,\n mode: nested.mode,\n ...iterationFields(nested),\n stepIds: [...nested.stepIds],\n ...(nested.identity ? { identity: { ...nested.identity } } : {}),\n ...(nested.concurrency !== undefined ? { concurrency: nested.concurrency } : {}),\n },\n }\n : {}),\n ...(remote\n ? {\n remote: {\n engine: remote.engine,\n ...(remote.target !== undefined ? { target: remote.target } : {}),\n },\n }\n : {}),\n };\n });\n const semantics = {\n steps,\n targetIds: [...input.targetIds].sort(),\n ...(input.requiredFinalizerSteps\n ? { requiredFinalizerStepIds: input.requiredFinalizerSteps.map(({ id }) => id).sort() }\n : {}),\n optionsValidated: input.orderedSteps[0]?.[STEP_OPTIONS_SCHEMA] !== undefined,\n resultValidated: input.resultValidated,\n };\n return freezeSnapshot({\n identity: createDefinitionIdentity(semantics, input.implementationVersion),\n ...semantics,\n });\n}\n\n/** Preserve v1 hashes; extended child semantics use v2, including their ancestors. */\nexport function createDefinitionIdentity(\n input: Omit<PipelineDefinitionSnapshot, \"identity\">,\n implementationVersion: string | undefined\n): PipelineDefinitionIdentity {\n const version = input.steps.some(\n (step) =>\n step.nestedPipeline?.mode === \"iterate\" || step.nestedPipeline?.identity?.version === 2\n )\n ? 2\n : 1;\n // Child handler versions participate in the combined identity, never the graph fingerprint.\n const structuralFingerprint = fingerprint({\n version,\n steps: input.steps.map((step) => ({\n id: step.id,\n dependencies: [...step.dependencies].sort(),\n optionalDependencies: [...step.optionalDependencies].sort(),\n skipAfterFailureOf: [...step.skipAfterFailureOf].sort(),\n dryRun: step.dryRun,\n runtimeSkipPossible: step.runtimeSkipPossible,\n outputValidated: step.outputValidated,\n ...(step.nestedPipeline\n ? {\n nestedPipeline: {\n pipelineId: step.nestedPipeline.pipelineId,\n mode: step.nestedPipeline.mode,\n ...iterationFields(step.nestedPipeline),\n stepIds: [...step.nestedPipeline.stepIds],\n ...(step.nestedPipeline.identity\n ? {\n identity: {\n version: step.nestedPipeline.identity.version,\n structuralFingerprint: step.nestedPipeline.identity.structuralFingerprint,\n },\n }\n : {}),\n ...(step.nestedPipeline.concurrency !== undefined\n ? { concurrency: step.nestedPipeline.concurrency }\n : {}),\n },\n }\n : {}),\n ...(step.remote\n ? {\n remote: {\n engine: step.remote.engine,\n ...(step.remote.target !== undefined ? { target: step.remote.target } : {}),\n },\n }\n : {}),\n })),\n targetIds: [...input.targetIds].sort(),\n ...(input.requiredFinalizerStepIds\n ? { requiredFinalizerStepIds: [...input.requiredFinalizerStepIds].sort() }\n : {}),\n optionsValidated: input.optionsValidated,\n resultValidated: input.resultValidated,\n });\n return {\n version,\n structuralFingerprint,\n ...(implementationVersion !== undefined ? { implementationVersion } : {}),\n definitionId: fingerprint({\n version,\n structuralFingerprint,\n implementationVersion,\n children: input.steps.map((step) => {\n const child = step.nestedPipeline?.identity;\n if (!child) return null;\n // Bind every recorded child identity field, not just its opaque definition ID.\n return {\n version: child.version,\n structuralFingerprint: child.structuralFingerprint,\n ...(child.implementationVersion !== undefined\n ? { implementationVersion: child.implementationVersion }\n : {}),\n definitionId: child.definitionId,\n };\n }),\n }),\n };\n}\n"]}
|
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
import type { CompiledPipeline } from "./pipeline-compiler.js";
|
|
2
2
|
import type { AnyStep } from "./pipeline-steps.js";
|
|
3
3
|
import type { InferSchemaOutput, PipelineContext, PipelinePlan, PipelineRun, PipelineRunControls, PipelineRuntime, StandardSchemaV1 } from "./pipeline-types.js";
|
|
4
|
-
/** Error thrown by `runOrThrow` when a pipeline run does not complete successfully. */
|
|
5
|
-
export declare class PipelineExecutionError extends Error {
|
|
6
|
-
readonly result: PipelineRun<unknown>;
|
|
7
|
-
constructor(result: PipelineRun<unknown>, message?: string);
|
|
8
|
-
}
|
|
9
|
-
export declare function isPipelineCancellation(error: unknown, runtime: PipelineRuntime): boolean;
|
|
10
4
|
export declare function executePlannedRun<TSteps extends readonly AnyStep[], TResult, TTargets extends readonly TSteps[number][], TResultSchema extends StandardSchemaV1 | undefined>(input: {
|
|
11
5
|
compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>;
|
|
12
6
|
controls: PipelineRunControls;
|
|
13
7
|
domainOptions: object;
|
|
14
8
|
plan: PipelinePlan;
|
|
15
9
|
runtime: PipelineRuntime;
|
|
10
|
+
overrides?: ReadonlyMap<AnyStep, unknown>;
|
|
16
11
|
}): Promise<PipelineRun<TResultSchema extends StandardSchemaV1 ? InferSchemaOutput<TResultSchema> : TResult>>;
|
|
17
12
|
export declare function defaultPipelineContext(): PipelineContext;
|
|
18
13
|
export declare function resolvePipelineRuntime(context?: Partial<PipelineContext>): PipelineRuntime;
|