tubeless 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -52
- package/dist/cli/cli-types.d.ts +1 -1
- package/dist/cli/cli-types.js.map +1 -1
- package/dist/cli/cli.d.ts +2 -4
- package/dist/cli/cli.js +1 -3
- package/dist/cli/cli.js.map +1 -1
- package/dist/core/child-execution.js +9 -4
- package/dist/core/child-execution.js.map +1 -1
- package/dist/core/lifecycle.d.ts +1 -1
- package/dist/core/lifecycle.js +2 -0
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/pipeline-compiler.d.ts +17 -0
- package/dist/core/pipeline-compiler.js +44 -0
- package/dist/core/pipeline-compiler.js.map +1 -0
- package/dist/core/pipeline-definition-validation.d.ts +4 -0
- package/dist/core/pipeline-definition-validation.js +101 -0
- package/dist/core/pipeline-definition-validation.js.map +1 -0
- package/dist/core/pipeline-definition.d.ts +28 -0
- package/dist/core/pipeline-definition.js +2 -0
- package/dist/core/pipeline-definition.js.map +1 -0
- package/dist/core/pipeline-disposition.d.ts +26 -0
- package/dist/core/pipeline-disposition.js +44 -0
- package/dist/core/pipeline-disposition.js.map +1 -0
- package/dist/core/pipeline-errors.d.ts +8 -0
- package/dist/core/pipeline-errors.js +20 -0
- package/dist/core/pipeline-errors.js.map +1 -0
- package/dist/core/pipeline-execute.d.ts +3 -1
- package/dist/core/pipeline-execute.js +136 -396
- package/dist/core/pipeline-execute.js.map +1 -1
- package/dist/core/pipeline-finalizer.d.ts +18 -0
- package/dist/core/pipeline-finalizer.js +37 -0
- package/dist/core/pipeline-finalizer.js.map +1 -0
- package/dist/core/pipeline-graph.d.ts +23 -0
- package/dist/core/pipeline-graph.js +135 -0
- package/dist/core/pipeline-graph.js.map +1 -0
- package/dist/core/pipeline-identity.d.ts +5 -0
- package/dist/core/pipeline-identity.js +11 -0
- package/dist/core/pipeline-identity.js.map +1 -0
- package/dist/core/pipeline-mermaid.d.ts +4 -0
- package/dist/core/pipeline-mermaid.js +56 -0
- package/dist/core/pipeline-mermaid.js.map +1 -0
- package/dist/core/pipeline-plan.d.ts +5 -94
- package/dist/core/pipeline-plan.js +5 -392
- package/dist/core/pipeline-plan.js.map +1 -1
- package/dist/core/pipeline-run-state.d.ts +49 -0
- package/dist/core/pipeline-run-state.js +284 -0
- package/dist/core/pipeline-run-state.js.map +1 -0
- package/dist/core/pipeline-step-executor.d.ts +20 -0
- package/dist/core/pipeline-step-executor.js +52 -0
- package/dist/core/pipeline-step-executor.js.map +1 -0
- package/dist/core/pipeline-step-metadata.d.ts +4 -0
- package/dist/core/pipeline-step-metadata.js +5 -0
- package/dist/core/pipeline-step-metadata.js.map +1 -0
- package/dist/core/pipeline-steps.d.ts +1 -1
- package/dist/core/pipeline-steps.js +1 -1
- package/dist/core/pipeline-steps.js.map +1 -1
- package/dist/core/pipeline-types.d.ts +17 -8
- package/dist/core/pipeline-types.js +8 -0
- package/dist/core/pipeline-types.js.map +1 -1
- package/dist/core/pipeline-validation.d.ts +6 -0
- package/dist/core/pipeline-validation.js +41 -0
- package/dist/core/pipeline-validation.js.map +1 -0
- package/dist/core/pipeline.d.ts +8 -9
- package/dist/core/pipeline.js +9 -6
- package/dist/core/pipeline.js.map +1 -1
- package/dist/node/node.d.ts +0 -3
- package/dist/node/node.js +0 -3
- package/dist/node/node.js.map +1 -1
- package/dist/reporter/reporter-entry.d.ts +1 -2
- package/dist/reporter/reporter-entry.js +1 -2
- package/dist/reporter/reporter-entry.js.map +1 -1
- package/dist/run-store/run-store-codec.d.ts +4 -0
- package/dist/run-store/run-store-codec.js +31 -0
- package/dist/run-store/run-store-codec.js.map +1 -0
- package/dist/run-store/run-store-ndjson.js +2 -295
- package/dist/run-store/run-store-ndjson.js.map +1 -1
- package/dist/run-store/run-store-sqlite.js +41 -38
- package/dist/run-store/run-store-sqlite.js.map +1 -1
- package/dist/run-store/run-store.d.ts +4 -3
- package/dist/run-store/run-store.js +38 -195
- package/dist/run-store/run-store.js.map +1 -1
- package/dist/studio/run-store-ui-client-app.d.ts +12 -0
- package/dist/studio/run-store-ui-client-app.js +224 -0
- package/dist/studio/run-store-ui-client-app.js.map +1 -0
- package/dist/studio/run-store-ui-client-browser.d.ts +1 -0
- package/dist/studio/run-store-ui-client-browser.js +2 -0
- package/dist/studio/run-store-ui-client-commands.d.ts +18 -0
- package/dist/studio/run-store-ui-client-commands.js +98 -0
- package/dist/studio/run-store-ui-client-commands.js.map +1 -0
- package/dist/studio/run-store-ui-client-form.d.ts +11 -0
- package/dist/studio/run-store-ui-client-form.js +54 -0
- package/dist/studio/run-store-ui-client-form.js.map +1 -0
- package/dist/studio/run-store-ui-client-modals.d.ts +20 -0
- package/dist/studio/run-store-ui-client-modals.js +154 -0
- package/dist/studio/run-store-ui-client-modals.js.map +1 -0
- package/dist/studio/run-store-ui-client-model.d.ts +19 -0
- package/dist/studio/run-store-ui-client-model.js +189 -0
- package/dist/studio/run-store-ui-client-model.js.map +1 -0
- package/dist/studio/run-store-ui-client-runs.d.ts +24 -0
- package/dist/studio/run-store-ui-client-runs.js +78 -0
- package/dist/studio/run-store-ui-client-runs.js.map +1 -0
- package/dist/studio/run-store-ui-client-shared.d.ts +22 -0
- package/dist/studio/run-store-ui-client-shared.js +63 -0
- package/dist/studio/run-store-ui-client-shared.js.map +1 -0
- package/dist/studio/run-store-ui-client-transport.d.ts +25 -0
- package/dist/studio/run-store-ui-client-transport.js +317 -0
- package/dist/studio/run-store-ui-client-transport.js.map +1 -0
- package/dist/studio/run-store-ui-client.d.ts +2 -14
- package/dist/studio/run-store-ui-client.js +9 -1360
- package/dist/studio/run-store-ui-client.js.map +1 -1
- package/dist/studio/run-store-ui-page.d.ts +2 -2
- package/dist/studio/run-store-ui-page.js +7 -71
- package/dist/studio/run-store-ui-page.js.map +1 -1
- package/dist/studio/run-store-ui.d.ts +1 -1
- package/dist/studio/run-store-ui.js +43 -25
- package/dist/studio/run-store-ui.js.map +1 -1
- package/dist/tracing/tracing-codec.d.ts +5 -0
- package/dist/tracing/tracing-codec.js +13 -0
- package/dist/tracing/tracing-codec.js.map +1 -0
- package/dist/tracing/tracing-constants.d.ts +4 -0
- package/dist/tracing/tracing-constants.js +5 -0
- package/dist/tracing/tracing-constants.js.map +1 -0
- package/dist/tracing/tracing-contracts.d.ts +31 -0
- package/dist/tracing/tracing-contracts.js +2 -0
- package/dist/tracing/tracing-contracts.js.map +1 -0
- package/dist/tracing/tracing-internal.d.ts +1 -1
- package/dist/tracing/tracing-internal.js +116 -81
- package/dist/tracing/tracing-internal.js.map +1 -1
- package/dist/tracing/tracing-schema.d.ts +809 -0
- package/dist/tracing/tracing-schema.js +429 -0
- package/dist/tracing/tracing-schema.js.map +1 -0
- package/dist/tracing/tracing.d.ts +2 -54
- package/dist/tracing/tracing.js.map +1 -1
- package/dist/tracing/wire-schema.d.ts +50 -0
- package/dist/tracing/wire-schema.js +193 -0
- package/dist/tracing/wire-schema.js.map +1 -0
- package/dist/workbench/pipeline-module.js +4 -4
- package/dist/workbench/pipeline-module.js.map +1 -1
- package/dist/workbench/workbench-entry.d.ts +2 -0
- package/dist/workbench/workbench-entry.js +3 -0
- package/dist/workbench/workbench-entry.js.map +1 -0
- package/dist/workbench/workbench-history.js +8 -1
- package/dist/workbench/workbench-history.js.map +1 -1
- package/dist/workbench/workbench-ui.js +39 -43
- package/dist/workbench/workbench-ui.js.map +1 -1
- package/docs/README.md +22 -15
- package/docs/agent-guide.md +62 -68
- package/docs/agent-skills.md +59 -0
- package/docs/api-reference.md +14 -178
- package/docs/api-report.json +13 -215
- package/docs/child-pipeline-composition.md +139 -193
- package/docs/cli.md +86 -64
- package/docs/comparison.md +64 -62
- package/docs/concepts.md +210 -281
- package/docs/getting-started.md +61 -49
- package/docs/llms.txt +8 -8
- package/docs/recipes.md +42 -45
- package/docs/remote-step-composition.md +69 -74
- package/docs/studio.md +110 -73
- package/examples/catalog/pipelines/enrich.ts +2 -2
- package/examples/catalog/scripts/enrich.ts +1 -1
- package/examples/catalog/scripts/import.ts +1 -1
- package/examples/catalog/scripts/publish.ts +1 -1
- package/examples/catalog/tubeless.project.ts +6 -3
- package/examples/cli-job.ts +1 -1
- package/examples/host-embedding.ts +4 -5
- package/examples/live-tui.ts +1 -1
- package/examples/peloton.ts +1 -1
- package/examples/remote-steps.ts +8 -5
- package/examples/tracing.ts +96 -5
- package/package.json +17 -64
- package/skills/tubeless/SKILL.md +85 -0
- package/skills/tubeless-make-pipeline/SKILL.md +126 -0
- package/dist/node/env.d.ts +0 -1
- package/dist/node/env.js +0 -8
- package/dist/node/env.js.map +0 -1
- package/dist/node/file-utils.d.ts +0 -3
- package/dist/node/file-utils.js +0 -17
- package/dist/node/file-utils.js.map +0 -1
- package/dist/node/paths.d.ts +0 -8
- package/dist/node/paths.js +0 -19
- package/dist/node/paths.js.map +0 -1
- package/dist/reporter/prompt-select.d.ts +0 -80
- package/dist/reporter/prompt-select.js +0 -197
- package/dist/reporter/prompt-select.js.map +0 -1
- package/dist/studio/run-store-ui-client-source.d.ts +0 -1
- package/dist/studio/run-store-ui-client-source.js +0 -1
- package/dist/tracing/tracing-json.d.ts +0 -11
- package/dist/tracing/tracing-json.js +0 -8
- package/dist/tracing/tracing-json.js.map +0 -1
- package/dist/tracing/tracing-otel.d.ts +0 -35
- package/dist/tracing/tracing-otel.js +0 -60
- package/dist/tracing/tracing-otel.js.map +0 -1
- package/dist/workbench/workbench-studio.d.ts +0 -29
- package/dist/workbench/workbench-studio.js +0 -61
- package/dist/workbench/workbench-studio.js.map +0 -1
- package/examples/catalog/tubeless.studio.ts +0 -20
- package/examples/local-observability.ts +0 -105
- package/examples/rendering.ts +0 -34
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-plan.js","sourceRoot":"","sources":["../../src/core/pipeline-plan.ts"],"names":[],"mappings":"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","sourcesContent":["import { duplicateValues } from \"../utilities/collections.js\";\nimport { formatPipelineError } from \"./pipeline-diagnostics.js\";\nimport { brandTubelessError } from \"../utilities/tubeless-error.js\";\nimport type { AnyStep, Step, StepOutput } from \"./pipeline-steps.js\";\nimport {\n PIPELINE_MERMAID_DIRECTIONS,\n type InferSchemaInput,\n type PipelineError,\n type PipelineErrorCode,\n type PipelineErrorKind,\n type PipelineErrorPhase,\n type PipelineExecutionContext,\n type PipelineMermaidOptions,\n type PipelinePlan,\n type PipelinePlanStep,\n type PipelineRunControls,\n type PipelineStepReport,\n type PipelineStepSelectionReason,\n type PipelineStepSkipReason,\n type PipelineStepSkippedReport,\n type StandardSchemaV1,\n} from \"./pipeline-types.js\";\n\nexport const PIPELINE_FINALIZE_STEP_ID = \"__finalize__\";\n\nexport const STEP_OPTIONS_SCHEMA: unique symbol = Symbol(\"tubeless.stepOptionsSchema\");\nexport const STEP_NESTED_PIPELINE: unique symbol = Symbol(\"tubeless.stepNestedPipeline\");\nexport const STEP_REMOTE: unique symbol = Symbol(\"tubeless.stepRemote\");\nconst REQUIRED_FINALIZER_OUTPUTS: unique symbol = Symbol(\"tubeless.requiredFinalizerOutputs\");\nexport const EXECUTE_COMPILED_RUN: unique symbol = Symbol(\"tubeless.executeCompiledRun\");\n\nconst compiledPipelines = new WeakSet<object>();\n\n/** Marks the exact object returned by `definePipeline` as a compiled pipeline. */\nexport function brandCompiledPipeline(pipeline: object): void {\n compiledPipelines.add(pipeline);\n}\n\n/** True only for the object `definePipeline` returned, not `Object.create` wrappers. */\nexport function isCompiledPipeline(pipeline: object): boolean {\n return compiledPipelines.has(pipeline);\n}\n\nexport interface CompiledStepGraph<TOptions extends object = object> {\n readonly dependsOn: readonly AnyStep<TOptions>[];\n readonly optionalDependsOn: readonly AnyStep<TOptions>[];\n readonly skipAfterFailureOf: readonly AnyStep<TOptions>[];\n}\n\nfunction liveStepGraph<TOptions extends object>(\n step: AnyStep<TOptions>\n): CompiledStepGraph<TOptions> {\n return {\n dependsOn: step.dependsOn ?? [],\n optionalDependsOn: step.optionalDependsOn ?? [],\n skipAfterFailureOf: step.skipAfterFailureOf ?? [],\n };\n}\n\nfunction freezeStepList<TOptions extends object>(\n steps: readonly AnyStep<TOptions>[] | undefined\n): readonly AnyStep<TOptions>[] {\n return Object.freeze([...(steps ?? [])]);\n}\n\nfunction snapshotCompiledStepGraph<TOptions extends object>(\n step: AnyStep<TOptions>\n): CompiledStepGraph<TOptions> {\n return Object.freeze({\n dependsOn: freezeStepList(step.dependsOn),\n optionalDependsOn: freezeStepList(step.optionalDependsOn),\n skipAfterFailureOf: freezeStepList(step.skipAfterFailureOf),\n });\n}\n\nexport function compiledStepGraph<TOptions extends object>(\n compiled: Pick<CompiledPipeline, \"stepGraph\">,\n step: AnyStep<TOptions>\n): CompiledStepGraph<TOptions> {\n const graph = compiled.stepGraph.get(step);\n if (graph === undefined) {\n throw new Error(`Compiled pipeline graph is missing step ${step.id}`);\n }\n // SAFETY: compile stores each original step object as the map key.\n return graph as CompiledStepGraph<TOptions>;\n}\n\n/**\n * Recovers the options type from the steps themselves rather than taking it as its own\n * generic parameter. A `TOptions` parameter constrained by `TSteps extends\n * readonly AnyStep<TOptions>[]` is self-referential — TypeScript can't solve that at a\n * `definePipeline(...)` call site and silently widens `TOptions` to its bare\n * `object` constraint (context.options would lose every pipeline-specific\n * field). Structuring it as \"derive TOptions from TSteps\" instead of \"constrain TSteps by\n * TOptions\" avoids the cycle, so callers never write out any of these type parameters.\n */\nexport type StepsOptions<TSteps extends readonly AnyStep[]> =\n TSteps[number] extends AnyStep<infer TOptions> ? TOptions : object;\n\nexport type StepsInputOptions<TSteps extends readonly AnyStep[]> =\n TSteps[number] extends Step<string, unknown, object, infer TInputOptions, infer _TRunOut>\n ? TInputOptions\n : StepsOptions<TSteps>;\n\nexport type StepIds<TSteps extends readonly AnyStep[]> = TSteps[number][\"id\"];\n\nexport type TargetIds<TTargets extends readonly AnyStep[]> = TTargets[number][\"id\"];\n\nfunction pipelineDiagnostic(\n code: PipelineErrorCode,\n phase: PipelineErrorPhase,\n kind: PipelineErrorKind,\n message: string,\n fields: Pick<PipelineError, \"stepId\"> = {}\n): PipelineError {\n return { code, kind, message, phase, ...fields };\n}\n\n/** Required dependencies are met when completed, or intentionally policy-skipped. */\nfunction isRequiredDependencyMet(report: PipelineStepReport | undefined): boolean {\n if (!report) return false;\n if (report.status === \"completed\") return true;\n return report.status === \"skipped\" && report.reason === \"policy\";\n}\n\ntype StepDispositionInput<TOptions extends object> = {\n dryRun: boolean;\n graph: CompiledStepGraph<TOptions>;\n planned: PipelinePlanStep;\n reportsByStepId: ReadonlyMap<string, PipelineStepReport>;\n step: AnyStep<TOptions>;\n};\n\ntype StepDisposition =\n | { kind: \"run\" }\n | {\n kind: \"skip\";\n reason: PipelineStepSkipReason;\n dependencyId?: string;\n message?: string;\n };\n\n/**\n * Single skip ladder for plan and live execution.\n * Policy skips stay outside: they run only after a step is scheduled.\n * Remainder copies plan `skipReason` for structural skips and marks planned-run\n * steps fail-fast or cancelled, so this ladder has no abort/fail-fast mode.\n */\nexport function decideStepDisposition<TOptions extends object>(\n input: StepDispositionInput<TOptions>\n): StepDisposition {\n const { dryRun, graph, planned, reportsByStepId, step } = input;\n\n if (!planned.selected) {\n return { kind: \"skip\", reason: \"filtered\" };\n }\n\n const unsuccessfulAncestor = graph.skipAfterFailureOf.find((dep) => {\n const status = reportsByStepId.get(dep.id)?.status;\n return status === \"failed\" || status === \"cancelled\";\n });\n if (unsuccessfulAncestor) {\n return {\n kind: \"skip\",\n reason: \"failed-dependency\",\n dependencyId: unsuccessfulAncestor.id,\n };\n }\n\n const unmetDependency = graph.dependsOn.find(\n (dep) => !isRequiredDependencyMet(reportsByStepId.get(dep.id))\n );\n if (unmetDependency) {\n return {\n kind: \"skip\",\n reason: \"unmet-dependency\",\n dependencyId: unmetDependency.id,\n };\n }\n\n if (dryRun && skipsInDryRun(step)) {\n return { kind: \"skip\", reason: \"dry-run\" };\n }\n\n return { kind: \"run\" };\n}\n\n/**\n * Deduplicated by object identity: the same dependency commonly appears in more than one\n * of these arrays (e.g. a step that's both `optionalDependsOn` and `skipAfterFailureOf` the\n * same upstream step). Without dedup, `topologicalSort`'s in-degree count would no longer\n * equal the number of distinct prerequisites — harmless there since the inflated count and\n * the duplicated `dependentsOf` entries cancel out, but confusing to read and a latent trap\n * for future callers of this helper that assume it returns distinct edges.\n */\nfunction stepEdges<TOptions extends object>(\n step: AnyStep<TOptions>,\n graph: CompiledStepGraph<TOptions> = liveStepGraph(step)\n): readonly AnyStep<TOptions>[] {\n return [\n ...new Set([...graph.dependsOn, ...graph.optionalDependsOn, ...graph.skipAfterFailureOf]),\n ];\n}\n\n/** Required data and failure-gate closure for dependency-aware targets. */\nfunction targetClosure<TOptions extends object>(\n targets: readonly AnyStep<TOptions>[]\n): Set<AnyStep<TOptions>> {\n const selected = new Set<AnyStep<TOptions>>();\n const include = (step: AnyStep<TOptions>): void => {\n if (selected.has(step)) return;\n selected.add(step);\n for (const prerequisite of [...(step.dependsOn ?? []), ...(step.skipAfterFailureOf ?? [])]) {\n include(prerequisite);\n }\n };\n for (const target of targets) include(target);\n return selected;\n}\n\n/**\n * Orders `steps` so every dependency runs before its dependents, using each step's\n * original array position to break ties. For an array that's already in valid dependency\n * order (true of every hand-ordered pipeline today) this provably reproduces that same\n * order — each step becomes eligible (in-degree 0) at the same point it would've been\n * reached by a plain declaration-order walk. What it adds is tolerance for a `steps` array\n * that ISN'T already ordered, and a real error instead of silent misbehavior on a cycle.\n * Returns null if the graph has a cycle (shouldn't happen given `const`-reference\n * construction, but the executor should never spin or drop steps if it somehow does).\n */\nfunction topologicalSort<TOptions extends object>(\n steps: readonly AnyStep<TOptions>[]\n): readonly AnyStep<TOptions>[] | null {\n const indexById = new Map(steps.map((step, index) => [step.id, index]));\n const remainingInDegree = new Map(steps.map((step) => [step.id, stepEdges(step).length]));\n const dependentsOf = new Map<string, string[]>();\n for (const step of steps) {\n for (const dep of stepEdges(step)) {\n const dependents = dependentsOf.get(dep.id) ?? [];\n dependents.push(step.id);\n dependentsOf.set(dep.id, dependents);\n }\n }\n\n const ready = steps.filter((step) => remainingInDegree.get(step.id) === 0).map((step) => step.id);\n const orderedIds: string[] = [];\n while (ready.length > 0) {\n ready.sort((left, right) => (indexById.get(left) ?? 0) - (indexById.get(right) ?? 0));\n const nextId = ready.shift();\n if (nextId === undefined) {\n break;\n }\n orderedIds.push(nextId);\n for (const dependentId of dependentsOf.get(nextId) ?? []) {\n const remaining = (remainingInDegree.get(dependentId) ?? 0) - 1;\n remainingInDegree.set(dependentId, remaining);\n if (remaining === 0) {\n ready.push(dependentId);\n }\n }\n }\n\n if (orderedIds.length !== steps.length) {\n return null;\n }\n const stepsById = new Map(steps.map((step) => [step.id, step]));\n // SAFETY: every id in `orderedIds` was produced by walking the same `steps`\n // array, so the map lookup always finds the matching `AnyStep<TOptions>`.\n return orderedIds.map((id) => stepsById.get(id) as AnyStep<TOptions>);\n}\n\nfunction escapeMermaidLabel(value: string): string {\n return value\n .replace(/\\r\\n?|\\n/g, \" \")\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n .replace(/#/g, \"#35;\")\n .replace(/&/g, \"#38;\")\n .replace(/\"/g, \"#quot;\")\n .replace(/</g, \"#60;\")\n .replace(/>/g, \"#62;\");\n}\n\nexport function renderPipelineMermaid<TOptions extends object>(\n steps: readonly AnyStep<TOptions>[],\n options: PipelineMermaidOptions,\n stepGraph?: ReadonlyMap<AnyStep, CompiledStepGraph>\n): string {\n const direction = options.direction ?? \"TD\";\n if (!PIPELINE_MERMAID_DIRECTIONS.includes(direction)) {\n throw new Error(`Invalid Mermaid flowchart direction: ${direction}`);\n }\n const nodeIdByStep = new Map(steps.map((step, index) => [step, `step${index}`]));\n const lines = [`flowchart ${direction}`];\n\n for (const step of steps) {\n const nodeId = nodeIdByStep.get(step)!;\n const displayName = step.name ?? step.id;\n const label =\n options.includeDescriptions && step.description\n ? `${displayName} — ${step.description}`\n : displayName;\n lines.push(` ${nodeId}[\"${escapeMermaidLabel(label)}\"]`);\n }\n\n const edgeLines: string[] = [];\n for (const step of steps) {\n const graph = stepGraph?.get(step) ?? liveStepGraph(step);\n const targetId = nodeIdByStep.get(step)!;\n const required = new Set(graph.dependsOn);\n const optional = new Set(graph.optionalDependsOn);\n const failureGates = new Set(graph.skipAfterFailureOf);\n\n for (const dependency of stepEdges(step, graph)) {\n const sourceId = nodeIdByStep.get(dependency)!;\n if (required.has(dependency)) {\n edgeLines.push(` ${sourceId} --> ${targetId}`);\n continue;\n }\n if (optional.has(dependency) && failureGates.has(dependency)) {\n edgeLines.push(` ${sourceId} -. optional input + failure gate .-> ${targetId}`);\n continue;\n }\n if (optional.has(dependency)) {\n edgeLines.push(` ${sourceId} -. optional input .-> ${targetId}`);\n continue;\n }\n edgeLines.push(` ${sourceId} -. failure gate .-> ${targetId}`);\n }\n }\n\n if (edgeLines.length > 0) {\n lines.push(\"\", ...edgeLines);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function stepToPlanStep<TOptions extends object>(\n step: AnyStep<TOptions>,\n selected: boolean,\n skipReason?: PipelineStepSkipReason,\n selectionReasons?: readonly PipelineStepSelectionReason[],\n graph: CompiledStepGraph<TOptions> = liveStepGraph(step)\n): PipelinePlanStep {\n const reasons = selectionReasons ?? [{ kind: \"all\" }];\n const planStep: PipelinePlanStep = {\n dependencies: graph.dependsOn.map((dep) => dep.id),\n description: step.description,\n dryRun: step.dryRun === \"skip\" ? \"skip\" : step.dryRun !== undefined ? \"custom\" : \"run\",\n id: step.id,\n name: step.name,\n optionalDependencies: graph.optionalDependsOn.map((dep) => dep.id),\n runtimeSkipPossible: step.skip !== undefined,\n selected,\n selectionReasons: reasons,\n skipAfterFailureOf: graph.skipAfterFailureOf.map((dep) => dep.id),\n skipReason,\n };\n if (step[STEP_NESTED_PIPELINE]) {\n planStep.nestedPipeline = {\n ...step[STEP_NESTED_PIPELINE],\n stepIds: [...step[STEP_NESTED_PIPELINE].stepIds],\n };\n }\n if (step[STEP_REMOTE]) {\n planStep.remote = { ...step[STEP_REMOTE] };\n }\n return planStep;\n}\n\nfunction addSelectionReason(\n reasonsByStepId: Map<string, PipelineStepSelectionReason[]>,\n stepId: string,\n reason: PipelineStepSelectionReason\n): void {\n const reasons = reasonsByStepId.get(stepId) ?? [];\n const reasonKey = JSON.stringify(reason);\n if (!reasons.some((candidate) => JSON.stringify(candidate) === reasonKey)) {\n reasons.push(reason);\n reasonsByStepId.set(stepId, reasons);\n }\n}\n\nfunction targetSelectionReasons<TOptions extends object>(\n targets: readonly AnyStep<TOptions>[],\n stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>\n): Map<string, PipelineStepSelectionReason[]> {\n const reasonsByStepId = new Map<string, PipelineStepSelectionReason[]>();\n\n for (const target of targets) {\n addSelectionReason(reasonsByStepId, target.id, { kind: \"target\", targetId: target.id });\n const expanded = new Set<AnyStep<TOptions>>();\n const includePrerequisites = (step: AnyStep<TOptions>): void => {\n if (expanded.has(step)) return;\n expanded.add(step);\n\n const graph = compiledStepGraph({ stepGraph }, step);\n for (const dependency of graph.dependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"required-dependency\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.skipAfterFailureOf) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"failure-gate\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.optionalDependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"optional-only\",\n targetId: target.id,\n });\n }\n };\n includePrerequisites(target);\n }\n\n return reasonsByStepId;\n}\n\nfunction selectsStep(reason: PipelineStepSelectionReason): boolean {\n return ![\"not-selected\", \"optional-only\", \"outside-target-closure\"].includes(reason.kind);\n}\n\nfunction skipsInDryRun<TOptions extends object>(step: AnyStep<TOptions>): boolean {\n return step.dryRun === \"skip\";\n}\n\nfunction validatePipelineDefinition<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(definition: PipelineDefinition<TSteps, TResult, TTargets, TResultSchema>): PipelineError[] {\n type TOptions = StepsOptions<TSteps>;\n const steps = definition.steps;\n const errors: PipelineError[] = [];\n if (definition.id.trim().length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_PIPELINE_ID_BLANK\",\n \"definition\",\n \"definition\",\n \"Pipeline id must not be blank\"\n )\n );\n }\n\n const stepIds = steps.map((step) => step.id);\n const duplicateStepIds = duplicateValues(stepIds);\n if (duplicateStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_STEP_IDS_DUPLICATE\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} has duplicate step ids: ${duplicateStepIds.join(\", \")}`\n )\n );\n }\n const optionsSchemas = new Set(steps.map((step) => step[STEP_OPTIONS_SCHEMA]));\n if (optionsSchemas.size > 1 && [...optionsSchemas].some(Boolean)) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_OPTIONS_SCHEMA_CONFLICT\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} mixes steps from different options-schema scopes`\n )\n );\n }\n for (const step of steps) {\n if (step.id.trim().length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_STEP_ID_BLANK\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} has a step with a blank id`,\n { stepId: step.id }\n )\n );\n }\n if (step.id === PIPELINE_FINALIZE_STEP_ID) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_STEP_ID_RESERVED\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} uses reserved step id ${PIPELINE_FINALIZE_STEP_ID}`,\n { stepId: step.id }\n )\n );\n }\n if (step.name !== undefined && step.name.trim().length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_STEP_NAME_BLANK\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} step ${step.id} has a blank display name`,\n { stepId: step.id }\n )\n );\n }\n const dependencyGroups = [\n [\"dependsOn\", step.dependsOn ?? []],\n [\"optionalDependsOn\", step.optionalDependsOn ?? []],\n [\"skipAfterFailureOf\", step.skipAfterFailureOf ?? []],\n ] as const;\n for (const [field, dependencies] of dependencyGroups) {\n const duplicates = duplicateValues(dependencies.map((dependency) => dependency.id));\n if (duplicates.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_DEPENDENCY_DUPLICATE\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} step ${step.id} repeats ${field}: ${duplicates.join(\", \")}`,\n { stepId: step.id }\n )\n );\n }\n if (dependencies.includes(step)) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_DEPENDENCY_SELF_REFERENCE\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} step ${step.id} cannot reference itself in ${field}`,\n { stepId: step.id }\n )\n );\n }\n }\n\n const required = new Set(step.dependsOn ?? []);\n const contradictory = (step.optionalDependsOn ?? []).filter((dependency) =>\n required.has(dependency)\n );\n if (contradictory.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_DEPENDENCY_CONTRADICTORY\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} step ${step.id} declares dependencies as both required and optional: ${contradictory.map(({ id }) => id).join(\", \")}`,\n { stepId: step.id }\n )\n );\n }\n }\n\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 knownSteps = new Set<AnyStep<TOptions>>(steps as readonly AnyStep<TOptions>[]);\n // SAFETY: targets are a subset of `TSteps[number]`, each an `AnyStep<TOptions>`.\n const declaredTargets = (definition.targets ?? []) as readonly AnyStep<TOptions>[];\n const duplicateTargetIds = duplicateValues(declaredTargets.map((target) => target.id));\n if (duplicateTargetIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_TARGETS_DUPLICATE\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} declares duplicate targets: ${duplicateTargetIds.join(\", \")}`\n )\n );\n }\n const missingTargets = declaredTargets.filter((target) => !knownSteps.has(target));\n if (missingTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_TARGET_NOT_IN_STEPS\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} declares target step(s) not included in its steps list: ${missingTargets.map(({ id }) => id).join(\", \")}`\n )\n );\n }\n const missingReferences: string[] = [];\n // SAFETY: `steps` is `TSteps extends readonly AnyStep[]`; the cast restores the\n // `TOptions` generic that the tuple erased, without changing the values.\n for (const step of steps as readonly AnyStep<TOptions>[]) {\n for (const dependency of stepEdges(step)) {\n if (!knownSteps.has(dependency)) {\n missingReferences.push(`${step.id} -> ${dependency.id}`);\n }\n }\n }\n if (missingReferences.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_DEPENDENCY_NOT_IN_STEPS\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} references step(s) not included in its steps list: ${missingReferences.join(\", \")}`\n )\n );\n }\n\n // SAFETY: `requireOutputs` stamps the required step ids onto the finalizer\n // function under `REQUIRED_FINALIZER_OUTPUTS`; the intersection only widens\n // the function type to expose that optional property.\n const requiredFinalizerSteps = (\n definition.finalize as typeof definition.finalize & {\n [REQUIRED_FINALIZER_OUTPUTS]?: readonly AnyStep<TOptions>[];\n }\n )[REQUIRED_FINALIZER_OUTPUTS];\n const missingFinalizerSteps = (requiredFinalizerSteps ?? []).filter(\n (step) => !knownSteps.has(step)\n );\n if (missingFinalizerSteps.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_FINALIZER_STEP_NOT_IN_STEPS\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} requires finalizer output from step(s) not included in its steps list: ${missingFinalizerSteps.map(({ id }) => id).join(\", \")}`\n )\n );\n }\n\n if (\n requiredFinalizerSteps &&\n missingTargets.length === 0 &&\n missingReferences.length === 0 &&\n missingFinalizerSteps.length === 0\n ) {\n for (const target of declaredTargets) {\n const selected = targetClosure([target]);\n const missingRequiredSteps = requiredFinalizerSteps.filter((step) => !selected.has(step));\n if (missingRequiredSteps.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_TARGET_FINALIZER_MISMATCH\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} target ${target.id} cannot satisfy required finalizer output(s): ${missingRequiredSteps.map(({ id }) => id).join(\", \")}`,\n { stepId: target.id }\n )\n );\n }\n }\n }\n\n // SAFETY: `steps` is `TSteps extends readonly AnyStep[]`; the cast restores the\n // `TOptions` generic that the tuple erased, without changing the values.\n if (errors.length === 0 && !topologicalSort(steps as readonly AnyStep<TOptions>[])) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_DEFINITION_DEPENDENCY_CYCLE\",\n \"definition\",\n \"definition\",\n `Pipeline ${definition.id} has a dependency cycle`\n )\n );\n }\n return errors;\n}\n\nexport function buildPipelinePlan<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>,\n controls: PipelineRunControls<StepIds<TSteps>, TargetIds<TTargets>>\n): PipelinePlan {\n const dryRun = controls.dryRun === true;\n const steps = compiled.orderedSteps;\n const errors: PipelineError[] = [];\n\n const knownStepIds = new Set(compiled.stepIds);\n const declaredTargetIds = new Set(compiled.declaredTargets.map((target) => target.id));\n const requestedStepIds = controls.stepIds ?? [];\n const requestedTargets = controls.targets ?? [];\n if (controls.stepIds !== undefined && controls.targets !== undefined) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_SELECTION_CONFLICT\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} cannot combine exact stepIds filtering with dependency-aware targets`\n )\n );\n }\n if (controls.stepIds !== undefined && controls.stepIds.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty stepIds array; omit stepIds to run every step, or pass at least one step id`\n )\n );\n }\n if (controls.targets !== undefined && controls.targets.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty targets array; omit targets to run every step, or pass at least one target step id`\n )\n );\n }\n const duplicateRequestedStepIds = duplicateValues(requestedStepIds);\n if (duplicateRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate step ids: ${duplicateRequestedStepIds.join(\", \")}`\n )\n );\n }\n const unknownRequestedStepIds = requestedStepIds.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown step ids: ${unknownRequestedStepIds.join(\", \")}`\n )\n );\n }\n const duplicateTargets = duplicateValues(requestedTargets);\n if (duplicateTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate targets: ${duplicateTargets.join(\", \")}`\n )\n );\n }\n const unknownTargets = requestedTargets.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown targets: ${unknownTargets.join(\", \")}`\n )\n );\n }\n const undeclaredTargets = requestedTargets.filter(\n (stepId) => knownStepIds.has(stepId) && !declaredTargetIds.has(stepId)\n );\n if (undeclaredTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNDECLARED\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested undeclared targets: ${undeclaredTargets.join(\", \")}`\n )\n );\n }\n\n const orderedSteps = steps;\n\n if (errors.length > 0) {\n return {\n dryRun,\n errors,\n ok: false,\n pipelineId: compiled.id,\n steps: [],\n };\n }\n\n let selectionReasonsByStepId: Map<string, PipelineStepSelectionReason[]>;\n if (controls.stepIds !== undefined) {\n const selectedIds = new Set(controls.stepIds);\n selectionReasonsByStepId = new Map(\n steps.map((step) => [\n step.id,\n selectedIds.has(step.id)\n ? ([{ kind: \"exact\" }] satisfies PipelineStepSelectionReason[])\n : ([{ kind: \"not-selected\" }] satisfies PipelineStepSelectionReason[]),\n ])\n );\n } else if (controls.targets !== undefined) {\n const stepsById = new Map(steps.map((step) => [step.id, step]));\n const selectedTargets = controls.targets.map((target) => stepsById.get(target)!);\n selectionReasonsByStepId = targetSelectionReasons(selectedTargets, compiled.stepGraph);\n for (const step of steps) {\n const reasons = selectionReasonsByStepId.get(step.id) ?? [];\n const selected = reasons.some(selectsStep);\n selectionReasonsByStepId.set(\n step.id,\n selected\n ? reasons.filter(selectsStep)\n : reasons.length > 0\n ? reasons\n : [{ kind: \"outside-target-closure\" }]\n );\n }\n } else {\n selectionReasonsByStepId = new Map(\n steps.map((step) => [step.id, [{ kind: \"all\" }] satisfies PipelineStepSelectionReason[]])\n );\n }\n const planSteps: PipelinePlanStep[] = [];\n // Accumulated planned skip/complete reports so later steps see the same\n // unmet-dependency chain as today's skipReason walk (not one empty map).\n const plannedReportsByStepId = new Map<string, PipelineStepReport>();\n for (const step of orderedSteps) {\n const selectionReasons = selectionReasonsByStepId.get(step.id)!;\n const selected = selectionReasons.some(selectsStep);\n const graph = compiledStepGraph(compiled, step);\n const planned = stepToPlanStep(step, selected, undefined, selectionReasons, graph);\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned,\n reportsByStepId: plannedReportsByStepId,\n step,\n });\n const skipReason = disposition.kind === \"skip\" ? disposition.reason : undefined;\n const planStep = stepToPlanStep(step, selected, skipReason, selectionReasons, graph);\n planSteps.push(planStep);\n if (disposition.kind === \"skip\") {\n const report: PipelineStepSkippedReport = {\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n reason: disposition.reason,\n status: \"skipped\",\n };\n if (disposition.dependencyId) report.dependencyId = disposition.dependencyId;\n if (disposition.message) report.message = disposition.message;\n plannedReportsByStepId.set(step.id, report);\n } else {\n // Synthetic complete so isRequiredDependencyMet treats will-run deps as met.\n plannedReportsByStepId.set(step.id, {\n attemptId: \"\",\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n startedAtMs: 0,\n status: \"completed\",\n });\n }\n }\n\n return {\n dryRun,\n errors,\n ok: errors.length === 0,\n pipelineId: compiled.id,\n steps: planSteps,\n };\n}\n\nexport function planStepById(plan: PipelinePlan): Map<string, PipelinePlanStep> {\n return new Map(plan.steps.map((step) => [step.id, step]));\n}\n\n/** Programmer error raised immediately when a pipeline graph is invalid. */\nexport class PipelineDefinitionError extends Error {\n constructor(\n readonly pipelineId: string,\n readonly errors: readonly PipelineError[]\n ) {\n super(\n errors.length > 0\n ? `Invalid pipeline ${pipelineId}: ${errors.map((error) => formatPipelineError(error)).join(\"; \")}`\n : `Invalid pipeline ${pipelineId}`\n );\n this.name = \"PipelineDefinitionError\";\n brandTubelessError(this, \"pipeline-definition\");\n }\n}\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 declaredTargets: readonly AnyStep<StepsOptions<TSteps>>[];\n readonly finalize: PipelineDefinition<TSteps, TResult, TTargets, TResultSchema>[\"finalize\"];\n readonly id: string;\n readonly optionsSchema: StandardSchemaV1 | undefined;\n readonly orderedSteps: readonly AnyStep<StepsOptions<TSteps>>[];\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 orderedSteps = topologicalSort(definition.steps as readonly AnyStep<TOptions>[])!;\n // Keep the author's step objects so class private accessors and prototype\n // `run`/`skip` keep working. Graph arrays live in compiled storage so frozen\n // or later-mutated caller-owned steps cannot change planning.\n const stepGraph = new Map<AnyStep, CompiledStepGraph>(\n orderedSteps.map((step) => [step, snapshotCompiledStepGraph(step)])\n );\n // SAFETY: `requireOutputs` stamps the required step ids onto the finalizer\n // function under `REQUIRED_FINALIZER_OUTPUTS`; the intersection only widens\n // the function type to expose that optional property.\n const requiredFinalizerSteps = (\n definition.finalize as typeof definition.finalize & {\n [REQUIRED_FINALIZER_OUTPUTS]?: readonly AnyStep<TOptions>[];\n }\n )[REQUIRED_FINALIZER_OUTPUTS];\n // SAFETY: targets are a subset of `TSteps[number]`, each an `AnyStep<TOptions>`.\n const declaredTargets = (definition.targets ?? []) as readonly AnyStep<TOptions>[];\n return Object.freeze({\n declaredTargets: Object.freeze([...declaredTargets]),\n // Invoke on the author's definition so method-style finalizers keep `this`.\n // SAFETY: the wrapper only forwards to `definition.finalize`.\n finalize: ((outputs, context) =>\n definition.finalize(outputs, context)) as typeof definition.finalize,\n id: definition.id,\n optionsSchema: definition.steps[0]?.[STEP_OPTIONS_SCHEMA],\n orderedSteps: Object.freeze([...orderedSteps]),\n stepGraph,\n requiredFinalizerSteps: requiredFinalizerSteps\n ? Object.freeze([...requiredFinalizerSteps])\n : undefined,\n resultSchema: definition.resultSchema,\n stepIds: Object.freeze(definition.steps.map((step) => step.id)),\n targetIds: Object.freeze((definition.targets ?? []).map((step) => step.id)),\n });\n}\n\ntype PipelineOutputs<TSteps extends readonly AnyStep[]> = {\n [S in TSteps[number] as S[\"id\"]]: StepOutput<S>;\n};\n\ntype RequiredPipelineOutputs<TSteps extends readonly AnyStep[]> = {\n [S in TSteps[number] as S[\"id\"]]-?: StepOutput<S>;\n};\n\n/**\n * Build a finalizer that only runs when every listed step published an output.\n * Presence is checked by output slot, so a successfully published `undefined`\n * remains distinct from a structural skip or failure.\n */\nexport function requireOutputs<const TRequiredSteps extends readonly AnyStep[], TResult>(\n requiredSteps: TRequiredSteps,\n finalize: (\n outputs: RequiredPipelineOutputs<TRequiredSteps>,\n context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>\n ) => TResult | Promise<TResult>\n): (\n outputs: Partial<RequiredPipelineOutputs<TRequiredSteps>>,\n context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>\n) => TResult | Promise<TResult> {\n const uniqueRequiredSteps = [...new Set(requiredSteps)];\n const requiredFinalizer = (\n outputs: Partial<RequiredPipelineOutputs<TRequiredSteps>>,\n context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>\n ) => {\n const missingStepIds = uniqueRequiredSteps\n .filter((step) => !Object.prototype.hasOwnProperty.call(outputs, step.id))\n .map((step) => step.id);\n if (missingStepIds.length > 0) {\n throw new Error(`Required pipeline outputs missing: ${missingStepIds.join(\", \")}`);\n }\n // SAFETY: every required step id was verified present above, so the partial\n // outputs contain all required keys and are a complete required-outputs map.\n return finalize(outputs as unknown as RequiredPipelineOutputs<TRequiredSteps>, context);\n };\n Object.defineProperty(requiredFinalizer, REQUIRED_FINALIZER_OUTPUTS, {\n value: uniqueRequiredSteps,\n });\n return requiredFinalizer;\n}\n\nexport interface PipelineDefinition<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][] = readonly [],\n TResultSchema extends StandardSchemaV1 | undefined = undefined,\n> {\n id: string;\n steps: TSteps;\n /** Public downstream goals that callers may select with `targets`. */\n targets?: TTargets;\n /** Optional Standard Schema for the finalized result. */\n resultSchema?: TResultSchema;\n finalize(\n outputs: Partial<PipelineOutputs<TSteps>>,\n context: PipelineExecutionContext<StepsOptions<TSteps>>\n ):\n | (TResultSchema extends StandardSchemaV1 ? InferSchemaInput<TResultSchema> : TResult)\n | Promise<TResultSchema extends StandardSchemaV1 ? InferSchemaInput<TResultSchema> : TResult>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pipeline-plan.js","sourceRoot":"","sources":["../../src/core/pipeline-plan.ts"],"names":[],"mappings":"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","sourcesContent":["import { duplicateValues } from \"../utilities/collections.js\";\nimport type { CompiledPipeline } from \"./pipeline-compiler.js\";\nimport type { StepIds, TargetIds } from \"./pipeline-definition.js\";\nimport { decideStepDisposition } from \"./pipeline-disposition.js\";\nimport { pipelineDiagnostic } from \"./pipeline-errors.js\";\nimport { compiledStepGraph, liveStepGraph, type CompiledStepGraph } from \"./pipeline-graph.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { STEP_NESTED_PIPELINE, STEP_REMOTE } from \"./pipeline-step-metadata.js\";\nimport type {\n PipelineError,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRunControls,\n PipelineStepReport,\n PipelineStepSelectionReason,\n PipelineStepSkipReason,\n PipelineStepSkippedReport,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\n\nexport function stepToPlanStep<TOptions extends object>(\n step: AnyStep<TOptions>,\n selected: boolean,\n skipReason?: PipelineStepSkipReason,\n selectionReasons?: readonly PipelineStepSelectionReason[],\n graph: CompiledStepGraph<TOptions> = liveStepGraph(step)\n): PipelinePlanStep {\n const reasons = selectionReasons ?? [{ kind: \"all\" }];\n const planStep: PipelinePlanStep = {\n dependencies: graph.dependsOn.map((dep) => dep.id),\n description: step.description,\n dryRun: step.dryRun === \"skip\" ? \"skip\" : step.dryRun !== undefined ? \"custom\" : \"run\",\n id: step.id,\n name: step.name,\n optionalDependencies: graph.optionalDependsOn.map((dep) => dep.id),\n runtimeSkipPossible: step.skip !== undefined,\n selected,\n selectionReasons: reasons,\n skipAfterFailureOf: graph.skipAfterFailureOf.map((dep) => dep.id),\n skipReason,\n };\n if (step[STEP_NESTED_PIPELINE]) {\n planStep.nestedPipeline = {\n ...step[STEP_NESTED_PIPELINE],\n stepIds: [...step[STEP_NESTED_PIPELINE].stepIds],\n };\n }\n if (step[STEP_REMOTE]) {\n planStep.remote = { ...step[STEP_REMOTE] };\n }\n return planStep;\n}\n\nfunction addSelectionReason(\n reasonsByStepId: Map<string, PipelineStepSelectionReason[]>,\n stepId: string,\n reason: PipelineStepSelectionReason\n): void {\n const reasons = reasonsByStepId.get(stepId) ?? [];\n const reasonKey = JSON.stringify(reason);\n if (!reasons.some((candidate) => JSON.stringify(candidate) === reasonKey)) {\n reasons.push(reason);\n reasonsByStepId.set(stepId, reasons);\n }\n}\n\nfunction targetSelectionReasons<TOptions extends object>(\n targets: readonly AnyStep<TOptions>[],\n stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>\n): Map<string, PipelineStepSelectionReason[]> {\n const reasonsByStepId = new Map<string, PipelineStepSelectionReason[]>();\n\n for (const target of targets) {\n addSelectionReason(reasonsByStepId, target.id, { kind: \"target\", targetId: target.id });\n const expanded = new Set<AnyStep<TOptions>>();\n const includePrerequisites = (step: AnyStep<TOptions>): void => {\n if (expanded.has(step)) return;\n expanded.add(step);\n\n const graph = compiledStepGraph({ stepGraph }, step);\n for (const dependency of graph.dependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"required-dependency\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.skipAfterFailureOf) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"failure-gate\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.optionalDependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"optional-only\",\n targetId: target.id,\n });\n }\n };\n includePrerequisites(target);\n }\n\n return reasonsByStepId;\n}\n\nfunction selectsStep(reason: PipelineStepSelectionReason): boolean {\n return ![\"not-selected\", \"optional-only\", \"outside-target-closure\"].includes(reason.kind);\n}\n\nexport function buildPipelinePlan<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>,\n controls: PipelineRunControls<StepIds<TSteps>, TargetIds<TTargets>>\n): PipelinePlan {\n const dryRun = controls.dryRun === true;\n const steps = compiled.orderedSteps;\n const errors: PipelineError[] = [];\n\n const knownStepIds = new Set(compiled.stepIds);\n const declaredTargetIds = new Set(compiled.declaredTargets.map((target) => target.id));\n const requestedStepIds = controls.stepIds ?? [];\n const requestedTargets = controls.targets ?? [];\n if (controls.stepIds !== undefined && controls.targets !== undefined) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_SELECTION_CONFLICT\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} cannot combine exact stepIds filtering with dependency-aware targets`\n )\n );\n }\n if (controls.stepIds !== undefined && controls.stepIds.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty stepIds array; omit stepIds to run every step, or pass at least one step id`\n )\n );\n }\n if (controls.targets !== undefined && controls.targets.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty targets array; omit targets to run every step, or pass at least one target step id`\n )\n );\n }\n const duplicateRequestedStepIds = duplicateValues(requestedStepIds);\n if (duplicateRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate step ids: ${duplicateRequestedStepIds.join(\", \")}`\n )\n );\n }\n const unknownRequestedStepIds = requestedStepIds.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown step ids: ${unknownRequestedStepIds.join(\", \")}`\n )\n );\n }\n const duplicateTargets = duplicateValues(requestedTargets);\n if (duplicateTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate targets: ${duplicateTargets.join(\", \")}`\n )\n );\n }\n const unknownTargets = requestedTargets.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown targets: ${unknownTargets.join(\", \")}`\n )\n );\n }\n const undeclaredTargets = requestedTargets.filter(\n (stepId) => knownStepIds.has(stepId) && !declaredTargetIds.has(stepId)\n );\n if (undeclaredTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNDECLARED\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested undeclared targets: ${undeclaredTargets.join(\", \")}`\n )\n );\n }\n\n if (errors.length > 0) {\n return {\n dryRun,\n errors,\n ok: false,\n pipelineId: compiled.id,\n steps: [],\n };\n }\n\n let selectionReasonsByStepId: Map<string, PipelineStepSelectionReason[]>;\n if (controls.stepIds !== undefined) {\n const selectedIds = new Set(controls.stepIds);\n selectionReasonsByStepId = new Map(\n steps.map((step) => [\n step.id,\n selectedIds.has(step.id)\n ? ([{ kind: \"exact\" }] satisfies PipelineStepSelectionReason[])\n : ([{ kind: \"not-selected\" }] satisfies PipelineStepSelectionReason[]),\n ])\n );\n } else if (controls.targets !== undefined) {\n const stepsById = new Map(steps.map((step) => [step.id, step]));\n const selectedTargets = controls.targets.map((target) => stepsById.get(target)!);\n selectionReasonsByStepId = targetSelectionReasons(selectedTargets, compiled.stepGraph);\n for (const step of steps) {\n const reasons = selectionReasonsByStepId.get(step.id) ?? [];\n const selected = reasons.some(selectsStep);\n selectionReasonsByStepId.set(\n step.id,\n selected\n ? reasons.filter(selectsStep)\n : reasons.length > 0\n ? reasons\n : [{ kind: \"outside-target-closure\" }]\n );\n }\n } else {\n selectionReasonsByStepId = new Map(\n steps.map((step) => [step.id, [{ kind: \"all\" }] satisfies PipelineStepSelectionReason[]])\n );\n }\n const planSteps: PipelinePlanStep[] = [];\n // Accumulated planned skip/complete reports so later steps see the same\n // unmet-dependency chain as today's skipReason walk (not one empty map).\n const plannedReportsByStepId = new Map<string, PipelineStepReport>();\n for (const step of steps) {\n const selectionReasons = selectionReasonsByStepId.get(step.id)!;\n const selected = selectionReasons.some(selectsStep);\n const graph = compiledStepGraph(compiled, step);\n const planned = stepToPlanStep(step, selected, undefined, selectionReasons, graph);\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned,\n reportsByStepId: plannedReportsByStepId,\n step,\n });\n const skipReason = disposition.kind === \"skip\" ? disposition.reason : undefined;\n const planStep = stepToPlanStep(step, selected, skipReason, selectionReasons, graph);\n planSteps.push(planStep);\n if (disposition.kind === \"skip\") {\n const report: PipelineStepSkippedReport = {\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n reason: disposition.reason,\n status: \"skipped\",\n };\n if (disposition.dependencyId) report.dependencyId = disposition.dependencyId;\n if (disposition.message) report.message = disposition.message;\n plannedReportsByStepId.set(step.id, report);\n } else {\n // Synthetic complete so isRequiredDependencyMet treats will-run deps as met.\n plannedReportsByStepId.set(step.id, {\n attemptId: \"\",\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n startedAtMs: 0,\n status: \"completed\",\n });\n }\n }\n\n return {\n dryRun,\n errors,\n ok: errors.length === 0,\n pipelineId: compiled.id,\n steps: planSteps,\n };\n}\n\nexport function planStepById(plan: PipelinePlan): Map<string, PipelinePlanStep> {\n return new Map(plan.steps.map((step) => [step.id, step]));\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { PipelineLifecycleObserver } from "./lifecycle.js";
|
|
2
|
+
import type { PipelineError, PipelinePlan, PipelinePlanStep, PipelineRun, PipelineStepProgress, PipelineStepReport, PipelineStepSkipReason } from "./pipeline-types.js";
|
|
3
|
+
export interface PipelineStepAttempt {
|
|
4
|
+
attemptId: string;
|
|
5
|
+
startedAtMs: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function isCancellationOnly(errors: readonly PipelineError[]): boolean;
|
|
8
|
+
export declare class PipelineRunState<TResult> {
|
|
9
|
+
#private;
|
|
10
|
+
readonly pipelineId: string;
|
|
11
|
+
readonly dryRun: boolean;
|
|
12
|
+
readonly startedAtMs: number;
|
|
13
|
+
readonly identity: {
|
|
14
|
+
correlationId?: string;
|
|
15
|
+
parentRunId?: string;
|
|
16
|
+
runId: string;
|
|
17
|
+
};
|
|
18
|
+
readonly now: () => number;
|
|
19
|
+
readonly lifecycle: PipelineLifecycleObserver;
|
|
20
|
+
constructor(pipelineId: string, dryRun: boolean, startedAtMs: number, identity: {
|
|
21
|
+
correlationId?: string;
|
|
22
|
+
parentRunId?: string;
|
|
23
|
+
runId: string;
|
|
24
|
+
}, now: () => number, lifecycle: PipelineLifecycleObserver);
|
|
25
|
+
get errors(): readonly PipelineError[];
|
|
26
|
+
get outputs(): ReadonlyMap<string, unknown>;
|
|
27
|
+
get reportsByStepId(): ReadonlyMap<string, PipelineStepReport>;
|
|
28
|
+
start(plan: PipelinePlan, targetIds: readonly string[]): void;
|
|
29
|
+
planStep(step: PipelinePlanStep): void;
|
|
30
|
+
beginAttempt(step: PipelinePlanStep, startedAtMs?: number): PipelineStepAttempt;
|
|
31
|
+
reportProgress(step: PipelinePlanStep, attempt: PipelineStepAttempt, progress: PipelineStepProgress): void;
|
|
32
|
+
completeStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, value: unknown): void;
|
|
33
|
+
skipStep(step: PipelinePlanStep, input: {
|
|
34
|
+
attempt?: PipelineStepAttempt;
|
|
35
|
+
dependencyId?: string;
|
|
36
|
+
message?: string;
|
|
37
|
+
output?: {
|
|
38
|
+
value: unknown;
|
|
39
|
+
};
|
|
40
|
+
reason: PipelineStepSkipReason;
|
|
41
|
+
}): void;
|
|
42
|
+
failStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, error: PipelineError): void;
|
|
43
|
+
cancelStep(step: PipelinePlanStep, error: PipelineError, recordError: boolean, attempt?: PipelineStepAttempt): void;
|
|
44
|
+
recordRunErrors(errors: readonly PipelineError[]): void;
|
|
45
|
+
beginFinalization(): void;
|
|
46
|
+
completeFinalization(value: TResult, durationMs: number): void;
|
|
47
|
+
failFinalization(error: PipelineError, durationMs: number): void;
|
|
48
|
+
finish(): Promise<PipelineRun<TResult>>;
|
|
49
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { RUN_MODEL_VERSION } from "./pipeline-ids.js";
|
|
2
|
+
export function isCancellationOnly(errors) {
|
|
3
|
+
return errors.length > 0 && errors.every(({ kind }) => kind === "cancellation");
|
|
4
|
+
}
|
|
5
|
+
function terminalRunStatus(errors) {
|
|
6
|
+
if (errors.length === 0)
|
|
7
|
+
return "completed";
|
|
8
|
+
return isCancellationOnly(errors) ? "cancelled" : "failed";
|
|
9
|
+
}
|
|
10
|
+
function stepReportFromStatus(event) {
|
|
11
|
+
const base = {
|
|
12
|
+
id: event.id,
|
|
13
|
+
name: event.name,
|
|
14
|
+
description: event.description,
|
|
15
|
+
finishedAtMs: event.finishedAtMs,
|
|
16
|
+
};
|
|
17
|
+
switch (event.status) {
|
|
18
|
+
case "completed":
|
|
19
|
+
return {
|
|
20
|
+
...base,
|
|
21
|
+
attemptId: event.attemptId,
|
|
22
|
+
startedAtMs: event.startedAtMs,
|
|
23
|
+
status: "completed",
|
|
24
|
+
};
|
|
25
|
+
case "failed":
|
|
26
|
+
return {
|
|
27
|
+
...base,
|
|
28
|
+
attemptId: event.attemptId,
|
|
29
|
+
error: event.error,
|
|
30
|
+
startedAtMs: event.startedAtMs,
|
|
31
|
+
status: "failed",
|
|
32
|
+
};
|
|
33
|
+
case "cancelled": {
|
|
34
|
+
const report = {
|
|
35
|
+
...base,
|
|
36
|
+
error: event.error,
|
|
37
|
+
status: "cancelled",
|
|
38
|
+
};
|
|
39
|
+
if (event.attemptId)
|
|
40
|
+
report.attemptId = event.attemptId;
|
|
41
|
+
if (event.startedAtMs !== undefined)
|
|
42
|
+
report.startedAtMs = event.startedAtMs;
|
|
43
|
+
return report;
|
|
44
|
+
}
|
|
45
|
+
case "skipped": {
|
|
46
|
+
const report = {
|
|
47
|
+
...base,
|
|
48
|
+
reason: event.reason,
|
|
49
|
+
status: "skipped",
|
|
50
|
+
};
|
|
51
|
+
if (event.attemptId)
|
|
52
|
+
report.attemptId = event.attemptId;
|
|
53
|
+
if (event.startedAtMs !== undefined)
|
|
54
|
+
report.startedAtMs = event.startedAtMs;
|
|
55
|
+
if (event.dependencyId)
|
|
56
|
+
report.dependencyId = event.dependencyId;
|
|
57
|
+
if (event.message)
|
|
58
|
+
report.message = event.message;
|
|
59
|
+
return report;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class PipelineRunState {
|
|
64
|
+
pipelineId;
|
|
65
|
+
dryRun;
|
|
66
|
+
startedAtMs;
|
|
67
|
+
identity;
|
|
68
|
+
now;
|
|
69
|
+
lifecycle;
|
|
70
|
+
#currentStepStatuses = new Map();
|
|
71
|
+
#errors = [];
|
|
72
|
+
#outputs = new Map();
|
|
73
|
+
#reports = [];
|
|
74
|
+
#reportsByStepId = new Map();
|
|
75
|
+
#finalizationAttempted = false;
|
|
76
|
+
#finalized = false;
|
|
77
|
+
#nextAttemptSequence = 0;
|
|
78
|
+
#phase = "created";
|
|
79
|
+
#value;
|
|
80
|
+
constructor(pipelineId, dryRun, startedAtMs, identity, now, lifecycle) {
|
|
81
|
+
this.pipelineId = pipelineId;
|
|
82
|
+
this.dryRun = dryRun;
|
|
83
|
+
this.startedAtMs = startedAtMs;
|
|
84
|
+
this.identity = identity;
|
|
85
|
+
this.now = now;
|
|
86
|
+
this.lifecycle = lifecycle;
|
|
87
|
+
}
|
|
88
|
+
get errors() {
|
|
89
|
+
return this.#errors;
|
|
90
|
+
}
|
|
91
|
+
get outputs() {
|
|
92
|
+
return this.#outputs;
|
|
93
|
+
}
|
|
94
|
+
get reportsByStepId() {
|
|
95
|
+
return this.#reportsByStepId;
|
|
96
|
+
}
|
|
97
|
+
start(plan, targetIds) {
|
|
98
|
+
this.#expectPhase("created");
|
|
99
|
+
this.#phase = "running";
|
|
100
|
+
this.lifecycle.pipelineStart(plan, targetIds);
|
|
101
|
+
}
|
|
102
|
+
planStep(step) {
|
|
103
|
+
this.#applyStepStatus({ pipelineId: this.pipelineId, status: "planned", step });
|
|
104
|
+
}
|
|
105
|
+
beginAttempt(step, startedAtMs = this.now()) {
|
|
106
|
+
const attempt = {
|
|
107
|
+
attemptId: `${this.identity.runId}:attempt:${(this.#nextAttemptSequence += 1).toString(36)}`,
|
|
108
|
+
startedAtMs,
|
|
109
|
+
};
|
|
110
|
+
this.#applyStepStatus({
|
|
111
|
+
attemptId: attempt.attemptId,
|
|
112
|
+
pipelineId: this.pipelineId,
|
|
113
|
+
status: "running",
|
|
114
|
+
step,
|
|
115
|
+
});
|
|
116
|
+
return attempt;
|
|
117
|
+
}
|
|
118
|
+
reportProgress(step, attempt, progress) {
|
|
119
|
+
this.#applyStepStatus({
|
|
120
|
+
attemptId: attempt.attemptId,
|
|
121
|
+
pipelineId: this.pipelineId,
|
|
122
|
+
progress,
|
|
123
|
+
status: "running",
|
|
124
|
+
step,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
completeStep(step, attempt, value) {
|
|
128
|
+
const report = {
|
|
129
|
+
attemptId: attempt.attemptId,
|
|
130
|
+
id: step.id,
|
|
131
|
+
name: step.name,
|
|
132
|
+
description: step.description,
|
|
133
|
+
finishedAtMs: this.now(),
|
|
134
|
+
startedAtMs: attempt.startedAtMs,
|
|
135
|
+
status: "completed",
|
|
136
|
+
};
|
|
137
|
+
this.#applyStepStatus({ ...report, pipelineId: this.pipelineId, step }, { output: { value } });
|
|
138
|
+
}
|
|
139
|
+
skipStep(step, input) {
|
|
140
|
+
const report = {
|
|
141
|
+
id: step.id,
|
|
142
|
+
name: step.name,
|
|
143
|
+
description: step.description,
|
|
144
|
+
finishedAtMs: this.now(),
|
|
145
|
+
reason: input.reason,
|
|
146
|
+
status: "skipped",
|
|
147
|
+
};
|
|
148
|
+
if (input.attempt) {
|
|
149
|
+
report.attemptId = input.attempt.attemptId;
|
|
150
|
+
report.startedAtMs = input.attempt.startedAtMs;
|
|
151
|
+
}
|
|
152
|
+
if (input.dependencyId)
|
|
153
|
+
report.dependencyId = input.dependencyId;
|
|
154
|
+
if (input.message)
|
|
155
|
+
report.message = input.message;
|
|
156
|
+
this.#applyStepStatus({ ...report, pipelineId: this.pipelineId, step }, input.output ? { output: input.output } : undefined);
|
|
157
|
+
}
|
|
158
|
+
failStep(step, attempt, error) {
|
|
159
|
+
if (error.kind === "cancellation") {
|
|
160
|
+
this.cancelStep(step, error, true, attempt);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const report = {
|
|
164
|
+
attemptId: attempt.attemptId,
|
|
165
|
+
id: step.id,
|
|
166
|
+
name: step.name,
|
|
167
|
+
description: step.description,
|
|
168
|
+
error,
|
|
169
|
+
finishedAtMs: this.now(),
|
|
170
|
+
startedAtMs: attempt.startedAtMs,
|
|
171
|
+
status: "failed",
|
|
172
|
+
};
|
|
173
|
+
this.#applyStepStatus({ ...report, pipelineId: this.pipelineId, step }, { error: { record: true, value: error } });
|
|
174
|
+
}
|
|
175
|
+
cancelStep(step, error, recordError, attempt) {
|
|
176
|
+
const report = {
|
|
177
|
+
id: step.id,
|
|
178
|
+
name: step.name,
|
|
179
|
+
description: step.description,
|
|
180
|
+
error,
|
|
181
|
+
finishedAtMs: this.now(),
|
|
182
|
+
status: "cancelled",
|
|
183
|
+
};
|
|
184
|
+
if (attempt) {
|
|
185
|
+
report.attemptId = attempt.attemptId;
|
|
186
|
+
report.startedAtMs = attempt.startedAtMs;
|
|
187
|
+
}
|
|
188
|
+
this.#applyStepStatus({ ...report, pipelineId: this.pipelineId, step }, { error: { record: recordError, value: error } });
|
|
189
|
+
}
|
|
190
|
+
recordRunErrors(errors) {
|
|
191
|
+
this.#expectPhase("running");
|
|
192
|
+
this.#errors.push(...errors);
|
|
193
|
+
}
|
|
194
|
+
beginFinalization() {
|
|
195
|
+
this.#expectPhase("running");
|
|
196
|
+
this.#expectAllStepsTerminal();
|
|
197
|
+
if (this.#finalizationAttempted)
|
|
198
|
+
throw new Error("Pipeline finalization already attempted");
|
|
199
|
+
this.#finalizationAttempted = true;
|
|
200
|
+
this.#phase = "finalizing";
|
|
201
|
+
this.lifecycle.finalizeStart();
|
|
202
|
+
}
|
|
203
|
+
completeFinalization(value, durationMs) {
|
|
204
|
+
this.#expectPhase("finalizing");
|
|
205
|
+
this.#value = value;
|
|
206
|
+
this.#finalized = true;
|
|
207
|
+
this.#phase = "running";
|
|
208
|
+
this.lifecycle.finalizeComplete(durationMs, value);
|
|
209
|
+
}
|
|
210
|
+
failFinalization(error, durationMs) {
|
|
211
|
+
this.#expectPhase("finalizing");
|
|
212
|
+
this.#errors.push(error);
|
|
213
|
+
this.#phase = "running";
|
|
214
|
+
this.lifecycle.finalizeError(error, durationMs);
|
|
215
|
+
}
|
|
216
|
+
async finish() {
|
|
217
|
+
this.#expectPhase("running");
|
|
218
|
+
this.#expectAllStepsTerminal();
|
|
219
|
+
this.#phase = "finished";
|
|
220
|
+
const result = {
|
|
221
|
+
pipelineId: this.pipelineId,
|
|
222
|
+
dryRun: this.dryRun,
|
|
223
|
+
errors: this.#errors,
|
|
224
|
+
finalized: this.#finalized,
|
|
225
|
+
finishedAtMs: this.now(),
|
|
226
|
+
runId: this.identity.runId,
|
|
227
|
+
startedAtMs: this.startedAtMs,
|
|
228
|
+
status: terminalRunStatus(this.#errors),
|
|
229
|
+
steps: this.#reports,
|
|
230
|
+
value: this.#value,
|
|
231
|
+
version: RUN_MODEL_VERSION,
|
|
232
|
+
};
|
|
233
|
+
if (this.identity.correlationId !== undefined) {
|
|
234
|
+
result.correlationId = this.identity.correlationId;
|
|
235
|
+
}
|
|
236
|
+
if (this.identity.parentRunId)
|
|
237
|
+
result.parentRunId = this.identity.parentRunId;
|
|
238
|
+
this.lifecycle.pipelineComplete(result);
|
|
239
|
+
await this.lifecycle.flush();
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
#applyStepStatus(event, effects = {}) {
|
|
243
|
+
this.#expectPhase("running");
|
|
244
|
+
const previous = this.#currentStepStatuses.get(event.step.id);
|
|
245
|
+
const valid = (previous === undefined && event.status === "planned") ||
|
|
246
|
+
(previous === "planned" &&
|
|
247
|
+
(event.status === "running" ||
|
|
248
|
+
event.status === "skipped" ||
|
|
249
|
+
event.status === "cancelled")) ||
|
|
250
|
+
(previous === "running" &&
|
|
251
|
+
(event.status === "running" ||
|
|
252
|
+
event.status === "completed" ||
|
|
253
|
+
event.status === "skipped" ||
|
|
254
|
+
event.status === "cancelled" ||
|
|
255
|
+
event.status === "failed"));
|
|
256
|
+
if (!valid) {
|
|
257
|
+
throw new Error(`Invalid step status transition for ${event.step.id}: ${previous ?? "unobserved"} -> ${event.status}`);
|
|
258
|
+
}
|
|
259
|
+
this.#currentStepStatuses.set(event.step.id, event.status);
|
|
260
|
+
if (event.status !== "planned" && event.status !== "running") {
|
|
261
|
+
const report = stepReportFromStatus(event);
|
|
262
|
+
this.#reports.push(report);
|
|
263
|
+
this.#reportsByStepId.set(event.step.id, report);
|
|
264
|
+
}
|
|
265
|
+
if (effects.output)
|
|
266
|
+
this.#outputs.set(event.step.id, effects.output.value);
|
|
267
|
+
if (effects.error?.record)
|
|
268
|
+
this.#errors.push(effects.error.value);
|
|
269
|
+
this.lifecycle.stepStatus(event);
|
|
270
|
+
}
|
|
271
|
+
#expectPhase(expected) {
|
|
272
|
+
if (this.#phase !== expected) {
|
|
273
|
+
throw new Error(`Invalid pipeline run transition: expected ${expected}, found ${this.#phase}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
#expectAllStepsTerminal() {
|
|
277
|
+
for (const [stepId, status] of this.#currentStepStatuses) {
|
|
278
|
+
if (status === "planned" || status === "running") {
|
|
279
|
+
throw new Error(`Cannot finish pipeline run while step ${stepId} is ${status}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=pipeline-run-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-run-state.js","sourceRoot":"","sources":["../../src/core/pipeline-run-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PipelineLifecycleObserver } from \"./lifecycle.js\";\nimport { RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport type {\n PipelineError,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunStatus,\n PipelineStepCancelledReport,\n PipelineStepCompleteReport,\n PipelineStepFailedReport,\n PipelineStepProgress,\n PipelineStepReport,\n PipelineStepSkipReason,\n PipelineStepSkippedReport,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\n\nexport interface PipelineStepAttempt {\n attemptId: string;\n startedAtMs: number;\n}\n\ntype RunPhase = \"created\" | \"finalizing\" | \"finished\" | \"running\";\n\ntype StepTransitionEffects = {\n error?: { record: boolean; value: PipelineError };\n output?: { value: unknown };\n};\n\nexport function isCancellationOnly(errors: readonly PipelineError[]): boolean {\n return errors.length > 0 && errors.every(({ kind }) => kind === \"cancellation\");\n}\n\nfunction terminalRunStatus(errors: readonly PipelineError[]): PipelineRunStatus {\n if (errors.length === 0) return \"completed\";\n return isCancellationOnly(errors) ? \"cancelled\" : \"failed\";\n}\n\nfunction stepReportFromStatus(\n event: Exclude<PipelineStepStatus, { status: \"planned\" | \"running\" }>\n): PipelineStepReport {\n const base = {\n id: event.id,\n name: event.name,\n description: event.description,\n finishedAtMs: event.finishedAtMs,\n };\n switch (event.status) {\n case \"completed\":\n return {\n ...base,\n attemptId: event.attemptId,\n startedAtMs: event.startedAtMs,\n status: \"completed\",\n };\n case \"failed\":\n return {\n ...base,\n attemptId: event.attemptId,\n error: event.error,\n startedAtMs: event.startedAtMs,\n status: \"failed\",\n };\n case \"cancelled\": {\n const report: PipelineStepCancelledReport = {\n ...base,\n error: event.error,\n status: \"cancelled\",\n };\n if (event.attemptId) report.attemptId = event.attemptId;\n if (event.startedAtMs !== undefined) report.startedAtMs = event.startedAtMs;\n return report;\n }\n case \"skipped\": {\n const report: PipelineStepSkippedReport = {\n ...base,\n reason: event.reason,\n status: \"skipped\",\n };\n if (event.attemptId) report.attemptId = event.attemptId;\n if (event.startedAtMs !== undefined) report.startedAtMs = event.startedAtMs;\n if (event.dependencyId) report.dependencyId = event.dependencyId;\n if (event.message) report.message = event.message;\n return report;\n }\n }\n}\n\nexport class PipelineRunState<TResult> {\n readonly #currentStepStatuses = new Map<string, PipelineStepStatus[\"status\"]>();\n readonly #errors: PipelineError[] = [];\n readonly #outputs = new Map<string, unknown>();\n readonly #reports: PipelineStepReport[] = [];\n readonly #reportsByStepId = new Map<string, PipelineStepReport>();\n #finalizationAttempted = false;\n #finalized = false;\n #nextAttemptSequence = 0;\n #phase: RunPhase = \"created\";\n #value: TResult | undefined;\n\n constructor(\n readonly pipelineId: string,\n readonly dryRun: boolean,\n readonly startedAtMs: number,\n readonly identity: { correlationId?: string; parentRunId?: string; runId: string },\n readonly now: () => number,\n readonly lifecycle: PipelineLifecycleObserver\n ) {}\n\n get errors(): readonly PipelineError[] {\n return this.#errors;\n }\n\n get outputs(): ReadonlyMap<string, unknown> {\n return this.#outputs;\n }\n\n get reportsByStepId(): ReadonlyMap<string, PipelineStepReport> {\n return this.#reportsByStepId;\n }\n\n start(plan: PipelinePlan, targetIds: readonly string[]): void {\n this.#expectPhase(\"created\");\n this.#phase = \"running\";\n this.lifecycle.pipelineStart(plan, targetIds);\n }\n\n planStep(step: PipelinePlanStep): void {\n this.#applyStepStatus({ pipelineId: this.pipelineId, status: \"planned\", step });\n }\n\n beginAttempt(step: PipelinePlanStep, startedAtMs = this.now()): PipelineStepAttempt {\n const attempt = {\n attemptId: `${this.identity.runId}:attempt:${(this.#nextAttemptSequence += 1).toString(36)}`,\n startedAtMs,\n };\n this.#applyStepStatus({\n attemptId: attempt.attemptId,\n pipelineId: this.pipelineId,\n status: \"running\",\n step,\n });\n return attempt;\n }\n\n reportProgress(\n step: PipelinePlanStep,\n attempt: PipelineStepAttempt,\n progress: PipelineStepProgress\n ): void {\n this.#applyStepStatus({\n attemptId: attempt.attemptId,\n pipelineId: this.pipelineId,\n progress,\n status: \"running\",\n step,\n });\n }\n\n completeStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, value: unknown): void {\n const report: PipelineStepCompleteReport = {\n attemptId: attempt.attemptId,\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: this.now(),\n startedAtMs: attempt.startedAtMs,\n status: \"completed\",\n };\n this.#applyStepStatus({ ...report, pipelineId: this.pipelineId, step }, { output: { value } });\n }\n\n skipStep(\n step: PipelinePlanStep,\n input: {\n attempt?: PipelineStepAttempt;\n dependencyId?: string;\n message?: string;\n output?: { value: unknown };\n reason: PipelineStepSkipReason;\n }\n ): void {\n const report: PipelineStepSkippedReport = {\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: this.now(),\n reason: input.reason,\n status: \"skipped\",\n };\n if (input.attempt) {\n report.attemptId = input.attempt.attemptId;\n report.startedAtMs = input.attempt.startedAtMs;\n }\n if (input.dependencyId) report.dependencyId = input.dependencyId;\n if (input.message) report.message = input.message;\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n input.output ? { output: input.output } : undefined\n );\n }\n\n failStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, error: PipelineError): void {\n if (error.kind === \"cancellation\") {\n this.cancelStep(step, error, true, attempt);\n return;\n }\n const report: PipelineStepFailedReport = {\n attemptId: attempt.attemptId,\n id: step.id,\n name: step.name,\n description: step.description,\n error,\n finishedAtMs: this.now(),\n startedAtMs: attempt.startedAtMs,\n status: \"failed\",\n };\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n { error: { record: true, value: error } }\n );\n }\n\n cancelStep(\n step: PipelinePlanStep,\n error: PipelineError,\n recordError: boolean,\n attempt?: PipelineStepAttempt\n ): void {\n const report: PipelineStepCancelledReport = {\n id: step.id,\n name: step.name,\n description: step.description,\n error,\n finishedAtMs: this.now(),\n status: \"cancelled\",\n };\n if (attempt) {\n report.attemptId = attempt.attemptId;\n report.startedAtMs = attempt.startedAtMs;\n }\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n { error: { record: recordError, value: error } }\n );\n }\n\n recordRunErrors(errors: readonly PipelineError[]): void {\n this.#expectPhase(\"running\");\n this.#errors.push(...errors);\n }\n\n beginFinalization(): void {\n this.#expectPhase(\"running\");\n this.#expectAllStepsTerminal();\n if (this.#finalizationAttempted) throw new Error(\"Pipeline finalization already attempted\");\n this.#finalizationAttempted = true;\n this.#phase = \"finalizing\";\n this.lifecycle.finalizeStart();\n }\n\n completeFinalization(value: TResult, durationMs: number): void {\n this.#expectPhase(\"finalizing\");\n this.#value = value;\n this.#finalized = true;\n this.#phase = \"running\";\n this.lifecycle.finalizeComplete(durationMs, value);\n }\n\n failFinalization(error: PipelineError, durationMs: number): void {\n this.#expectPhase(\"finalizing\");\n this.#errors.push(error);\n this.#phase = \"running\";\n this.lifecycle.finalizeError(error, durationMs);\n }\n\n async finish(): Promise<PipelineRun<TResult>> {\n this.#expectPhase(\"running\");\n this.#expectAllStepsTerminal();\n this.#phase = \"finished\";\n const result: PipelineRun<TResult> = {\n pipelineId: this.pipelineId,\n dryRun: this.dryRun,\n errors: this.#errors,\n finalized: this.#finalized,\n finishedAtMs: this.now(),\n runId: this.identity.runId,\n startedAtMs: this.startedAtMs,\n status: terminalRunStatus(this.#errors),\n steps: this.#reports,\n value: this.#value,\n version: RUN_MODEL_VERSION,\n };\n if (this.identity.correlationId !== undefined) {\n result.correlationId = this.identity.correlationId;\n }\n if (this.identity.parentRunId) result.parentRunId = this.identity.parentRunId;\n this.lifecycle.pipelineComplete(result);\n await this.lifecycle.flush();\n return result;\n }\n\n #applyStepStatus(event: PipelineStepStatus, effects: StepTransitionEffects = {}): void {\n this.#expectPhase(\"running\");\n const previous = this.#currentStepStatuses.get(event.step.id);\n const valid =\n (previous === undefined && event.status === \"planned\") ||\n (previous === \"planned\" &&\n (event.status === \"running\" ||\n event.status === \"skipped\" ||\n event.status === \"cancelled\")) ||\n (previous === \"running\" &&\n (event.status === \"running\" ||\n event.status === \"completed\" ||\n event.status === \"skipped\" ||\n event.status === \"cancelled\" ||\n event.status === \"failed\"));\n if (!valid) {\n throw new Error(\n `Invalid step status transition for ${event.step.id}: ${previous ?? \"unobserved\"} -> ${event.status}`\n );\n }\n\n this.#currentStepStatuses.set(event.step.id, event.status);\n if (event.status !== \"planned\" && event.status !== \"running\") {\n const report = stepReportFromStatus(event);\n this.#reports.push(report);\n this.#reportsByStepId.set(event.step.id, report);\n }\n if (effects.output) this.#outputs.set(event.step.id, effects.output.value);\n if (effects.error?.record) this.#errors.push(effects.error.value);\n this.lifecycle.stepStatus(event);\n }\n\n #expectPhase(expected: RunPhase): void {\n if (this.#phase !== expected) {\n throw new Error(\n `Invalid pipeline run transition: expected ${expected}, found ${this.#phase}`\n );\n }\n }\n\n #expectAllStepsTerminal(): void {\n for (const [stepId, status] of this.#currentStepStatuses) {\n if (status === \"planned\" || status === \"running\") {\n throw new Error(`Cannot finish pipeline run while step ${stepId} is ${status}`);\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AnyStep } from "./pipeline-steps.js";
|
|
2
|
+
import type { PipelineExecutionContext, PipelineLogger, PipelineStepProgress } from "./pipeline-types.js";
|
|
3
|
+
import type { PipelineTraceAttributes } from "../tracing/tracing-contracts.js";
|
|
4
|
+
export interface NormalizedStepSkipDecision {
|
|
5
|
+
reason: string;
|
|
6
|
+
value?: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare function evaluateStepSkip<TOptions extends object>(step: AnyStep<TOptions>, inputs: Record<string, unknown>, context: PipelineExecutionContext<TOptions>): Promise<NormalizedStepSkipDecision | null>;
|
|
9
|
+
export declare function validateStepOutput<TOptions extends object>(step: AnyStep<TOptions>, value: unknown, boundary: string): Promise<unknown>;
|
|
10
|
+
export declare function executeStepAttempt<TOptions extends object>(input: {
|
|
11
|
+
attemptId: string;
|
|
12
|
+
context: PipelineExecutionContext<TOptions>;
|
|
13
|
+
dryRun: boolean;
|
|
14
|
+
inputs: Record<string, unknown>;
|
|
15
|
+
log: PipelineLogger;
|
|
16
|
+
onProgress(progress: PipelineStepProgress): void;
|
|
17
|
+
onReportAttempt(attempt: number, attributes?: PipelineTraceAttributes): void;
|
|
18
|
+
outputBoundary: string;
|
|
19
|
+
step: AnyStep<TOptions>;
|
|
20
|
+
}): Promise<unknown>;
|