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.
Files changed (199) hide show
  1. package/README.md +52 -52
  2. package/dist/cli/cli-types.d.ts +1 -1
  3. package/dist/cli/cli-types.js.map +1 -1
  4. package/dist/cli/cli.d.ts +2 -4
  5. package/dist/cli/cli.js +1 -3
  6. package/dist/cli/cli.js.map +1 -1
  7. package/dist/core/child-execution.js +9 -4
  8. package/dist/core/child-execution.js.map +1 -1
  9. package/dist/core/lifecycle.d.ts +1 -1
  10. package/dist/core/lifecycle.js +2 -0
  11. package/dist/core/lifecycle.js.map +1 -1
  12. package/dist/core/pipeline-compiler.d.ts +17 -0
  13. package/dist/core/pipeline-compiler.js +44 -0
  14. package/dist/core/pipeline-compiler.js.map +1 -0
  15. package/dist/core/pipeline-definition-validation.d.ts +4 -0
  16. package/dist/core/pipeline-definition-validation.js +101 -0
  17. package/dist/core/pipeline-definition-validation.js.map +1 -0
  18. package/dist/core/pipeline-definition.d.ts +28 -0
  19. package/dist/core/pipeline-definition.js +2 -0
  20. package/dist/core/pipeline-definition.js.map +1 -0
  21. package/dist/core/pipeline-disposition.d.ts +26 -0
  22. package/dist/core/pipeline-disposition.js +44 -0
  23. package/dist/core/pipeline-disposition.js.map +1 -0
  24. package/dist/core/pipeline-errors.d.ts +8 -0
  25. package/dist/core/pipeline-errors.js +20 -0
  26. package/dist/core/pipeline-errors.js.map +1 -0
  27. package/dist/core/pipeline-execute.d.ts +3 -1
  28. package/dist/core/pipeline-execute.js +136 -396
  29. package/dist/core/pipeline-execute.js.map +1 -1
  30. package/dist/core/pipeline-finalizer.d.ts +18 -0
  31. package/dist/core/pipeline-finalizer.js +37 -0
  32. package/dist/core/pipeline-finalizer.js.map +1 -0
  33. package/dist/core/pipeline-graph.d.ts +23 -0
  34. package/dist/core/pipeline-graph.js +135 -0
  35. package/dist/core/pipeline-graph.js.map +1 -0
  36. package/dist/core/pipeline-identity.d.ts +5 -0
  37. package/dist/core/pipeline-identity.js +11 -0
  38. package/dist/core/pipeline-identity.js.map +1 -0
  39. package/dist/core/pipeline-mermaid.d.ts +4 -0
  40. package/dist/core/pipeline-mermaid.js +56 -0
  41. package/dist/core/pipeline-mermaid.js.map +1 -0
  42. package/dist/core/pipeline-plan.d.ts +5 -94
  43. package/dist/core/pipeline-plan.js +5 -392
  44. package/dist/core/pipeline-plan.js.map +1 -1
  45. package/dist/core/pipeline-run-state.d.ts +49 -0
  46. package/dist/core/pipeline-run-state.js +284 -0
  47. package/dist/core/pipeline-run-state.js.map +1 -0
  48. package/dist/core/pipeline-step-executor.d.ts +20 -0
  49. package/dist/core/pipeline-step-executor.js +52 -0
  50. package/dist/core/pipeline-step-executor.js.map +1 -0
  51. package/dist/core/pipeline-step-metadata.d.ts +4 -0
  52. package/dist/core/pipeline-step-metadata.js +5 -0
  53. package/dist/core/pipeline-step-metadata.js.map +1 -0
  54. package/dist/core/pipeline-steps.d.ts +1 -1
  55. package/dist/core/pipeline-steps.js +1 -1
  56. package/dist/core/pipeline-steps.js.map +1 -1
  57. package/dist/core/pipeline-types.d.ts +17 -8
  58. package/dist/core/pipeline-types.js +8 -0
  59. package/dist/core/pipeline-types.js.map +1 -1
  60. package/dist/core/pipeline-validation.d.ts +6 -0
  61. package/dist/core/pipeline-validation.js +41 -0
  62. package/dist/core/pipeline-validation.js.map +1 -0
  63. package/dist/core/pipeline.d.ts +8 -9
  64. package/dist/core/pipeline.js +9 -6
  65. package/dist/core/pipeline.js.map +1 -1
  66. package/dist/node/node.d.ts +0 -3
  67. package/dist/node/node.js +0 -3
  68. package/dist/node/node.js.map +1 -1
  69. package/dist/reporter/reporter-entry.d.ts +1 -2
  70. package/dist/reporter/reporter-entry.js +1 -2
  71. package/dist/reporter/reporter-entry.js.map +1 -1
  72. package/dist/run-store/run-store-codec.d.ts +4 -0
  73. package/dist/run-store/run-store-codec.js +31 -0
  74. package/dist/run-store/run-store-codec.js.map +1 -0
  75. package/dist/run-store/run-store-ndjson.js +2 -295
  76. package/dist/run-store/run-store-ndjson.js.map +1 -1
  77. package/dist/run-store/run-store-sqlite.js +41 -38
  78. package/dist/run-store/run-store-sqlite.js.map +1 -1
  79. package/dist/run-store/run-store.d.ts +4 -3
  80. package/dist/run-store/run-store.js +38 -195
  81. package/dist/run-store/run-store.js.map +1 -1
  82. package/dist/studio/run-store-ui-client-app.d.ts +12 -0
  83. package/dist/studio/run-store-ui-client-app.js +224 -0
  84. package/dist/studio/run-store-ui-client-app.js.map +1 -0
  85. package/dist/studio/run-store-ui-client-browser.d.ts +1 -0
  86. package/dist/studio/run-store-ui-client-browser.js +2 -0
  87. package/dist/studio/run-store-ui-client-commands.d.ts +18 -0
  88. package/dist/studio/run-store-ui-client-commands.js +98 -0
  89. package/dist/studio/run-store-ui-client-commands.js.map +1 -0
  90. package/dist/studio/run-store-ui-client-form.d.ts +11 -0
  91. package/dist/studio/run-store-ui-client-form.js +54 -0
  92. package/dist/studio/run-store-ui-client-form.js.map +1 -0
  93. package/dist/studio/run-store-ui-client-modals.d.ts +20 -0
  94. package/dist/studio/run-store-ui-client-modals.js +154 -0
  95. package/dist/studio/run-store-ui-client-modals.js.map +1 -0
  96. package/dist/studio/run-store-ui-client-model.d.ts +19 -0
  97. package/dist/studio/run-store-ui-client-model.js +189 -0
  98. package/dist/studio/run-store-ui-client-model.js.map +1 -0
  99. package/dist/studio/run-store-ui-client-runs.d.ts +24 -0
  100. package/dist/studio/run-store-ui-client-runs.js +78 -0
  101. package/dist/studio/run-store-ui-client-runs.js.map +1 -0
  102. package/dist/studio/run-store-ui-client-shared.d.ts +22 -0
  103. package/dist/studio/run-store-ui-client-shared.js +63 -0
  104. package/dist/studio/run-store-ui-client-shared.js.map +1 -0
  105. package/dist/studio/run-store-ui-client-transport.d.ts +25 -0
  106. package/dist/studio/run-store-ui-client-transport.js +317 -0
  107. package/dist/studio/run-store-ui-client-transport.js.map +1 -0
  108. package/dist/studio/run-store-ui-client.d.ts +2 -14
  109. package/dist/studio/run-store-ui-client.js +9 -1360
  110. package/dist/studio/run-store-ui-client.js.map +1 -1
  111. package/dist/studio/run-store-ui-page.d.ts +2 -2
  112. package/dist/studio/run-store-ui-page.js +7 -71
  113. package/dist/studio/run-store-ui-page.js.map +1 -1
  114. package/dist/studio/run-store-ui.d.ts +1 -1
  115. package/dist/studio/run-store-ui.js +43 -25
  116. package/dist/studio/run-store-ui.js.map +1 -1
  117. package/dist/tracing/tracing-codec.d.ts +5 -0
  118. package/dist/tracing/tracing-codec.js +13 -0
  119. package/dist/tracing/tracing-codec.js.map +1 -0
  120. package/dist/tracing/tracing-constants.d.ts +4 -0
  121. package/dist/tracing/tracing-constants.js +5 -0
  122. package/dist/tracing/tracing-constants.js.map +1 -0
  123. package/dist/tracing/tracing-contracts.d.ts +31 -0
  124. package/dist/tracing/tracing-contracts.js +2 -0
  125. package/dist/tracing/tracing-contracts.js.map +1 -0
  126. package/dist/tracing/tracing-internal.d.ts +1 -1
  127. package/dist/tracing/tracing-internal.js +116 -81
  128. package/dist/tracing/tracing-internal.js.map +1 -1
  129. package/dist/tracing/tracing-schema.d.ts +809 -0
  130. package/dist/tracing/tracing-schema.js +429 -0
  131. package/dist/tracing/tracing-schema.js.map +1 -0
  132. package/dist/tracing/tracing.d.ts +2 -54
  133. package/dist/tracing/tracing.js.map +1 -1
  134. package/dist/tracing/wire-schema.d.ts +50 -0
  135. package/dist/tracing/wire-schema.js +193 -0
  136. package/dist/tracing/wire-schema.js.map +1 -0
  137. package/dist/workbench/pipeline-module.js +4 -4
  138. package/dist/workbench/pipeline-module.js.map +1 -1
  139. package/dist/workbench/workbench-entry.d.ts +2 -0
  140. package/dist/workbench/workbench-entry.js +3 -0
  141. package/dist/workbench/workbench-entry.js.map +1 -0
  142. package/dist/workbench/workbench-history.js +8 -1
  143. package/dist/workbench/workbench-history.js.map +1 -1
  144. package/dist/workbench/workbench-ui.js +39 -43
  145. package/dist/workbench/workbench-ui.js.map +1 -1
  146. package/docs/README.md +22 -15
  147. package/docs/agent-guide.md +62 -68
  148. package/docs/agent-skills.md +59 -0
  149. package/docs/api-reference.md +14 -178
  150. package/docs/api-report.json +13 -215
  151. package/docs/child-pipeline-composition.md +139 -193
  152. package/docs/cli.md +86 -64
  153. package/docs/comparison.md +64 -62
  154. package/docs/concepts.md +210 -281
  155. package/docs/getting-started.md +61 -49
  156. package/docs/llms.txt +8 -8
  157. package/docs/recipes.md +42 -45
  158. package/docs/remote-step-composition.md +69 -74
  159. package/docs/studio.md +110 -73
  160. package/examples/catalog/pipelines/enrich.ts +2 -2
  161. package/examples/catalog/scripts/enrich.ts +1 -1
  162. package/examples/catalog/scripts/import.ts +1 -1
  163. package/examples/catalog/scripts/publish.ts +1 -1
  164. package/examples/catalog/tubeless.project.ts +6 -3
  165. package/examples/cli-job.ts +1 -1
  166. package/examples/host-embedding.ts +4 -5
  167. package/examples/live-tui.ts +1 -1
  168. package/examples/peloton.ts +1 -1
  169. package/examples/remote-steps.ts +8 -5
  170. package/examples/tracing.ts +96 -5
  171. package/package.json +17 -64
  172. package/skills/tubeless/SKILL.md +85 -0
  173. package/skills/tubeless-make-pipeline/SKILL.md +126 -0
  174. package/dist/node/env.d.ts +0 -1
  175. package/dist/node/env.js +0 -8
  176. package/dist/node/env.js.map +0 -1
  177. package/dist/node/file-utils.d.ts +0 -3
  178. package/dist/node/file-utils.js +0 -17
  179. package/dist/node/file-utils.js.map +0 -1
  180. package/dist/node/paths.d.ts +0 -8
  181. package/dist/node/paths.js +0 -19
  182. package/dist/node/paths.js.map +0 -1
  183. package/dist/reporter/prompt-select.d.ts +0 -80
  184. package/dist/reporter/prompt-select.js +0 -197
  185. package/dist/reporter/prompt-select.js.map +0 -1
  186. package/dist/studio/run-store-ui-client-source.d.ts +0 -1
  187. package/dist/studio/run-store-ui-client-source.js +0 -1
  188. package/dist/tracing/tracing-json.d.ts +0 -11
  189. package/dist/tracing/tracing-json.js +0 -8
  190. package/dist/tracing/tracing-json.js.map +0 -1
  191. package/dist/tracing/tracing-otel.d.ts +0 -35
  192. package/dist/tracing/tracing-otel.js +0 -60
  193. package/dist/tracing/tracing-otel.js.map +0 -1
  194. package/dist/workbench/workbench-studio.d.ts +0 -29
  195. package/dist/workbench/workbench-studio.js +0 -61
  196. package/dist/workbench/workbench-studio.js.map +0 -1
  197. package/examples/catalog/tubeless.studio.ts +0 -20
  198. package/examples/local-observability.ts +0 -105
  199. package/examples/rendering.ts +0 -34
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-execute.js","sourceRoot":"","sources":["../../src/core/pipeline-execute.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abortableSleep,\n isAbortError,\n throwIfAborted as throwIfSignalAborted,\n} from \"../utilities/abort.js\";\nimport { PipelineChildError } from \"./child-execution.js\";\nimport { brandTubelessError } from \"../utilities/tubeless-error.js\";\nimport { createPipelineLifecycleObserver } from \"./lifecycle.js\";\nimport { formatPipelineError } from \"./pipeline-diagnostics.js\";\nimport { createRunId, RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport {\n PIPELINE_FINALIZE_STEP_ID,\n compiledStepGraph,\n decideStepDisposition,\n planStepById,\n stepToPlanStep,\n type CompiledPipeline,\n} from \"./pipeline-plan.js\";\nimport type { StepsOptions } from \"./pipeline-plan.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport type {\n InferSchemaOutput,\n PipelineContext,\n PipelineError,\n PipelineErrorCause,\n PipelineExecutionContext,\n PipelineLogger,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunControls,\n PipelineRunStatus,\n PipelineRuntime,\n PipelineStepCancelledReport,\n PipelineStepCompleteReport,\n PipelineStepContext,\n PipelineStepFailedReport,\n PipelineStepProgress,\n PipelineStepReport,\n PipelineStepSkipReason,\n PipelineStepSkippedReport,\n PipelineStepStatus,\n PipelineValidationIssue,\n StandardSchemaV1,\n StandardSchemaV1Issue,\n StandardSchemaV1Result,\n StepSkipDecision,\n} from \"./pipeline-types.js\";\nimport { createPipelineTraceEmitter } from \"../tracing/tracing-internal.js\";\n\nfunction 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\nconst PIPELINE_LOGGER_BASE = Symbol(\"pipelineLoggerBase\");\n\ntype TracedPipelineLogger = PipelineLogger & { [PIPELINE_LOGGER_BASE]?: PipelineLogger };\n\nfunction basePipelineLogger(log: PipelineLogger): PipelineLogger {\n // SAFETY: `TracedPipelineLogger` only adds the optional symbol-keyed base\n // property; reading it off any `PipelineLogger` is safe because the property\n // is absent unless a tracing wrapper installed it.\n return (log as TracedPipelineLogger)[PIPELINE_LOGGER_BASE] ?? log;\n}\n\nconst originalPipelineErrors = new WeakMap<PipelineError, unknown>();\n\nfunction defaultExecutionErrorMessage(result: PipelineRun<unknown>): string {\n const firstError = result.errors[0];\n const disposition = isCancellationOnly(result.errors) ? \"cancelled\" : \"failed\";\n return firstError\n ? `Pipeline ${result.pipelineId} ${disposition}: ${formatPipelineError(firstError)}`\n : `Pipeline ${result.pipelineId} ${disposition}`;\n}\n\nfunction firstOriginalPipelineError(errors: readonly PipelineError[]): unknown {\n for (const error of errors) {\n if (originalPipelineErrors.has(error)) return originalPipelineErrors.get(error);\n }\n return undefined;\n}\n\nexport class PipelineExecutionError extends Error {\n constructor(\n readonly result: PipelineRun<unknown>,\n message = defaultExecutionErrorMessage(result)\n ) {\n const cause = firstOriginalPipelineError(result.errors);\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"PipelineExecutionError\";\n brandTubelessError(this, \"pipeline-execution\");\n }\n}\n\nclass PipelineBoundaryValidationError extends Error {\n constructor(\n message: string,\n readonly issues: readonly PipelineValidationIssue[],\n cause?: unknown\n ) {\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"PipelineBoundaryValidationError\";\n }\n}\n\nfunction normalizeValidationPath(\n path: StandardSchemaV1Issue[\"path\"]\n): readonly (number | string)[] | undefined {\n if (!path || path.length === 0) return undefined;\n return path.map((segment) => {\n const key = typeof segment === \"object\" && segment !== null ? segment.key : segment;\n return typeof key === \"number\" || typeof key === \"string\" ? key : String(key);\n });\n}\n\nfunction renderValidationIssue(issue: PipelineValidationIssue): string {\n const location = issue.path?.map(String).join(\".\");\n return location ? `${location}: ${issue.message}` : issue.message;\n}\n\nasync function validateStandardSchema<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n value: unknown,\n boundary: string\n): Promise<InferSchemaOutput<TSchema>> {\n let result: StandardSchemaV1Result<InferSchemaOutput<TSchema>>;\n try {\n result = await schema[\"~standard\"].validate(value);\n } catch (error) {\n throw new PipelineBoundaryValidationError(\n `${boundary} schema (${schema[\"~standard\"].vendor}) threw while validating`,\n [],\n error\n );\n }\n if (result.issues) {\n const issues = result.issues.map((issue) => {\n const path = normalizeValidationPath(issue.path);\n const normalized: PipelineValidationIssue = { message: issue.message };\n if (path) normalized.path = path;\n return normalized;\n });\n throw new PipelineBoundaryValidationError(\n `${boundary} validation failed: ${issues.map(renderValidationIssue).join(\"; \")}`,\n issues\n );\n }\n return result.value;\n}\n\nconst MAX_PIPELINE_CAUSE_DEPTH = 8;\n\nfunction readErrorField(value: object, field: \"cause\" | \"code\" | \"message\" | \"name\"): unknown {\n try {\n // SAFETY: any object may be probed for an optional string-keyed field; a\n // getter that throws is caught below, so the cast only enables the lookup.\n return (value as Record<string, unknown>)[field];\n } catch {\n return undefined;\n }\n}\n\nfunction safeErrorMessage(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"Unknown thrown value\";\n }\n}\n\nfunction normalizePipelineCause(\n value: unknown,\n seen: WeakSet<object>,\n depth = 0\n): PipelineErrorCause {\n if (depth >= MAX_PIPELINE_CAUSE_DEPTH) {\n return { message: \"Cause chain truncated\" };\n }\n if (typeof value !== \"object\" || value === null) {\n return { message: safeErrorMessage(value) };\n }\n if (seen.has(value)) {\n return { message: \"Circular cause\" };\n }\n seen.add(value);\n\n const message = readErrorField(value, \"message\");\n const name = readErrorField(value, \"name\");\n const sourceCode = readErrorField(value, \"code\");\n const nested = readErrorField(value, \"cause\");\n const cause: PipelineErrorCause = {\n message: typeof message === \"string\" ? message : safeErrorMessage(value),\n };\n if (typeof name === \"string\") cause.name = name;\n if (typeof sourceCode === \"string\") cause.sourceCode = sourceCode;\n if (nested !== undefined) cause.cause = normalizePipelineCause(nested, seen, depth + 1);\n return cause;\n}\n\n// Fan-out snapshots bound every string as well as cause depth and item count.\nfunction fanOutCause(error: unknown): PipelineErrorCause {\n const cause = normalizePipelineCause(error, new WeakSet<object>());\n let current: PipelineErrorCause | undefined = cause;\n while (current) {\n current.message = current.message.slice(0, 1024);\n if (current.name) current.name = current.name.slice(0, 1024);\n if (current.sourceCode) current.sourceCode = current.sourceCode.slice(0, 1024);\n current = current.cause;\n }\n return cause;\n}\n\nfunction normalizedNestedCause(error: unknown): PipelineErrorCause | undefined {\n if (typeof error !== \"object\" || error === null) return undefined;\n const cause = readErrorField(error, \"cause\");\n if (cause === undefined) return undefined;\n const seen = new WeakSet<object>();\n seen.add(error);\n return normalizePipelineCause(cause, seen);\n}\n\nfunction toPipelineError(\n error: unknown,\n classification: Omit<PipelineError, \"cause\" | \"message\" | \"sourceCode\" | \"stack\">\n): PipelineError {\n const sourceCode =\n typeof error === \"object\" && error !== null ? readErrorField(error, \"code\") : undefined;\n const cause = normalizedNestedCause(error);\n const pipelineError: PipelineError = {\n ...classification,\n message: error instanceof Error ? error.message : safeErrorMessage(error),\n };\n if (error instanceof Error && error.stack) pipelineError.stack = error.stack;\n if (typeof sourceCode === \"string\") pipelineError.sourceCode = sourceCode;\n if (cause) pipelineError.cause = cause;\n if (error instanceof PipelineBoundaryValidationError) pipelineError.issues = error.issues;\n if (error instanceof PipelineChildError && error.fanOut) {\n const { failures, failureCount, schedulerError } = error.fanOut;\n pipelineError.fanOut = {\n failures: failures.map(({ error: itemError, key, index, cancelled }) => ({\n index,\n key: key.slice(0, 1024),\n keyTruncated: key.length > 1024,\n cancelled,\n error: fanOutCause(itemError),\n })),\n failureCount,\n omittedFailureCount: failureCount - failures.length,\n };\n if (schedulerError !== undefined)\n pipelineError.fanOut.schedulerError = fanOutCause(schedulerError);\n }\n originalPipelineErrors.set(pipelineError, error);\n return pipelineError;\n}\n\nexport function isPipelineCancellation(error: unknown, runtime: PipelineRuntime): boolean {\n if (isAbortError(error)) return true;\n if (runtime.signal?.aborted === true && error === runtime.signal.reason) return true;\n if (error instanceof PipelineChildError) return error.cancelled;\n return error instanceof PipelineExecutionError && isCancelledResult(error.result);\n}\n\nfunction isCancelledResult(result: PipelineRun<unknown>): boolean {\n return result.status === \"cancelled\";\n}\n\ntype PipelineRunIdentity = { parentRunId?: string; runId: string };\n\nfunction errorRunResult<TResult>(\n runtime: PipelineRuntime,\n pipelineId: string,\n dryRun: boolean,\n startedAt: number,\n errors: PipelineError[],\n identity: PipelineRunIdentity\n): PipelineRun<TResult> {\n const finishedAtMs = runtime.now();\n const result: PipelineRun<TResult> = {\n pipelineId,\n dryRun,\n errors,\n finalized: false,\n finishedAtMs,\n runId: identity.runId,\n startedAtMs: startedAt,\n status: terminalRunStatus(errors),\n steps: [],\n version: RUN_MODEL_VERSION,\n };\n if (identity.parentRunId) result.parentRunId = identity.parentRunId;\n return result;\n}\n\nfunction throwIfAborted(runtime: PipelineRuntime): void {\n throwIfSignalAborted(runtime.signal, \"Pipeline run\");\n}\n\nfunction recordSkip(\n step: { id: PropertyKey; name?: string; description?: string },\n stepId: string,\n reports: PipelineStepReport[],\n reportsByStepId: Map<string, PipelineStepReport>,\n reason: PipelineStepSkipReason,\n message: string | undefined,\n dependencyId: string | undefined,\n attemptId: string | undefined,\n startedAtMs: number | undefined,\n finishedAtMs: number\n): PipelineStepSkippedReport {\n const report: PipelineStepSkippedReport = {\n id: stepId,\n name: step.name,\n description: step.description,\n finishedAtMs,\n reason,\n status: \"skipped\",\n };\n if (attemptId) report.attemptId = attemptId;\n if (startedAtMs !== undefined) report.startedAtMs = startedAtMs;\n if (dependencyId) report.dependencyId = dependencyId;\n if (message) report.message = message;\n reports.push(report);\n reportsByStepId.set(stepId, report);\n return report;\n}\n\nfunction normalizeStepSkipDecision(\n decision: StepSkipDecision\n): { reason: string; value?: unknown } | null {\n if (decision == null || decision === false) return null;\n if (typeof decision === \"string\") {\n const reason = decision.trim();\n return reason.length > 0 ? { reason } : null;\n }\n if (typeof decision === \"object\" && typeof decision.reason === \"string\") {\n const reason = decision.reason.trim();\n if (reason.length === 0) return null;\n return { reason, value: decision.value };\n }\n return null;\n}\n\nexport async function executePlannedRun<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(input: {\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>;\n controls: PipelineRunControls;\n domainOptions: object;\n plan: PipelinePlan;\n runtime: PipelineRuntime;\n}): Promise<\n PipelineRun<TResultSchema extends StandardSchemaV1 ? InferSchemaOutput<TResultSchema> : TResult>\n> {\n type TPipelineResult = TResultSchema extends StandardSchemaV1\n ? InferSchemaOutput<TResultSchema>\n : TResult;\n const { compiled, controls, runtime } = input;\n const optionsSchema = compiled.optionsSchema;\n const targetIds = compiled.targetIds;\n type TOptions = StepsOptions<TSteps>;\n // SAFETY: `domainOptions` is the user-supplied options object; if a schema\n // is present it is re-validated below before assignment to `pipelineOptions`.\n let pipelineOptions = input.domainOptions as TOptions;\n const startedAt = runtime.now();\n const runId = runtime.runId ?? createRunId(compiled.id);\n const parentRunId = runtime.parentRunId;\n const identity: PipelineRunIdentity = { runId };\n if (parentRunId) identity.parentRunId = parentRunId;\n const dryRun = controls.dryRun === true;\n const trace = createPipelineTraceEmitter(\n compiled.id,\n runtime.tracing,\n basePipelineLogger(runtime.log),\n {\n ...identity,\n itemKey: runtime.tracing?.itemKey,\n },\n runtime.now\n );\n const lifecycle = createPipelineLifecycleObserver(compiled.id, runtime, trace);\n const tracedLogger = (stepId?: string, attemptId?: string): PipelineLogger => {\n if (!trace) return runtime.log;\n const base = basePipelineLogger(runtime.log);\n const log: TracedPipelineLogger = {\n error: (message, ...params) => {\n lifecycle.log(\"error\", message, params, stepId, attemptId);\n base.error(message, ...params);\n },\n log: (message, ...params) => {\n lifecycle.log(\"log\", message, params, stepId, attemptId);\n base.log(message, ...params);\n },\n warn: (message, ...params) => {\n lifecycle.log(\"warn\", message, params, stepId, attemptId);\n base.warn(message, ...params);\n },\n };\n log[PIPELINE_LOGGER_BASE] = base;\n return log;\n };\n let nextAttemptSequence = 0;\n const beginAttempt = (stepId: string, startedAtMs = runtime.now()) => ({\n attemptId: `${runId}:attempt:${(nextAttemptSequence += 1).toString(36)}`,\n startedAtMs,\n stepId,\n });\n const currentStepStatuses = new Map<string, PipelineStepStatus[\"status\"]>();\n const publishStepStatus = (event: PipelineStepStatus, traceStatus = true): void => {\n const previous = 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 currentStepStatuses.set(event.step.id, event.status);\n lifecycle.stepStatus(event, traceStatus);\n };\n const publishStepReport = (step: PipelinePlanStep, report: PipelineStepReport): void => {\n switch (report.status) {\n case \"cancelled\":\n case \"failed\":\n case \"skipped\":\n case \"completed\":\n publishStepStatus({ ...report, pipelineId: compiled.id, step });\n }\n };\n const runPlan = input.plan;\n const plannedSteps = planStepById(runPlan);\n lifecycle.pipelineStart(runPlan, targetIds);\n if (!runPlan.ok) {\n const result = errorRunResult<TPipelineResult>(\n runtime,\n compiled.id,\n dryRun,\n startedAt,\n runPlan.errors,\n identity\n );\n lifecycle.pipelineComplete(result);\n await lifecycle.flush();\n return result;\n }\n if (optionsSchema) {\n try {\n const validated = await validateStandardSchema(\n optionsSchema,\n input.domainOptions,\n `Pipeline ${compiled.id} options`\n );\n if (typeof validated !== \"object\" || validated === null || Array.isArray(validated)) {\n throw new PipelineBoundaryValidationError(\n `Pipeline ${compiled.id} options schema returned a non-object value`,\n [{ message: \"Expected the validated options value to be an object\" }]\n );\n }\n // SAFETY: the schema validated the value against `TOptions` and the\n // object-shape check above passed, so the value is a `TOptions`.\n pipelineOptions = validated as TOptions;\n } catch (error) {\n const pipelineError = toPipelineError(error, {\n code: \"TUBELESS_OPTIONS_VALIDATION_FAILED\",\n kind: \"validation\",\n phase: \"execution\",\n });\n const result = errorRunResult<TPipelineResult>(\n runtime,\n compiled.id,\n dryRun,\n startedAt,\n [pipelineError],\n identity\n );\n lifecycle.pipelineComplete(result);\n await lifecycle.flush();\n return result;\n }\n }\n for (const step of runPlan.steps) {\n publishStepStatus({ pipelineId: compiled.id, status: \"planned\", step });\n }\n\n const outputs = new Map<string, unknown>();\n const reports: PipelineStepReport[] = [];\n const errors: PipelineError[] = [];\n const reportsByStepId = new Map<string, PipelineStepReport>();\n let completed = true;\n\n const executionContext: PipelineExecutionContext<TOptions> = {\n ...runtime,\n dryRun,\n log: tracedLogger(),\n options: pipelineOptions,\n runId,\n trace: trace?.context,\n };\n if (parentRunId) executionContext.parentRunId = parentRunId;\n\n const stepsById = new Map(compiled.orderedSteps.map((step) => [step.id, step]));\n // `runPlan.steps` is already topologically ordered. Rehydrate from the original step\n // objects so callers still get the typed `run` functions rather than plan metadata.\n // SAFETY: every planned step id originates from `compiled.orderedSteps`, so the\n // map lookup always finds the matching `AnyStep<TOptions>`.\n const orderedSteps = runPlan.steps.map((step) => stepsById.get(step.id) as AnyStep<TOptions>);\n\n const recordRemainingStates = (\n fromIndex: number,\n failedStepId?: string,\n cancellationError?: PipelineError\n ): void => {\n for (let index = fromIndex; index < orderedSteps.length; index++) {\n const step = orderedSteps[index]!;\n const plannedStep =\n plannedSteps.get(step.id) ??\n stepToPlanStep(step, true, undefined, undefined, compiledStepGraph(compiled, step));\n if (plannedStep.skipReason) {\n const dependencyId =\n plannedStep.skipReason === \"unmet-dependency\"\n ? plannedStep.dependencies.find((id) => plannedSteps.get(id)?.skipReason !== undefined)\n : undefined;\n const report = recordSkip(\n step,\n step.id,\n reports,\n reportsByStepId,\n plannedStep.skipReason,\n undefined,\n dependencyId,\n undefined,\n undefined,\n runtime.now()\n );\n publishStepReport(plannedStep, report);\n continue;\n }\n if (cancellationError) {\n const report: PipelineStepCancelledReport = {\n id: step.id,\n name: step.name,\n description: step.description,\n error: { ...cancellationError, stepId: step.id },\n finishedAtMs: runtime.now(),\n status: \"cancelled\",\n };\n reports.push(report);\n reportsByStepId.set(step.id, report);\n publishStepReport(plannedStep, report);\n continue;\n }\n const report = recordSkip(\n step,\n step.id,\n reports,\n reportsByStepId,\n \"fail-fast\",\n failedStepId\n ? `Not run because fail-fast stopped after ${failedStepId} failed.`\n : \"Not run because the pipeline was aborted before this step started.\",\n failedStepId,\n undefined,\n undefined,\n runtime.now()\n );\n publishStepReport(plannedStep, report);\n }\n };\n\n const cancelBeforeStepStart = (stepId: string, stepIndex: number): boolean => {\n try {\n throwIfAborted(runtime);\n } catch (error) {\n const pipelineError = toPipelineError(error, {\n code: \"TUBELESS_RUN_CANCELLED\",\n kind: \"cancellation\",\n phase: \"execution\",\n stepId,\n });\n errors.push(pipelineError);\n completed = false;\n recordRemainingStates(stepIndex, undefined, pipelineError);\n return true;\n }\n return false;\n };\n\n const recordStepExecutionFailure = (\n error: unknown,\n plannedStep: PipelinePlanStep,\n step: AnyStep<TOptions>,\n stepId: string,\n stepIndex: number,\n attempt: { attemptId: string; startedAtMs: number }\n ): boolean => {\n const cancelled = isPipelineCancellation(error, runtime);\n const childFailure =\n error instanceof PipelineExecutionError || error instanceof PipelineChildError;\n const validationFailure = error instanceof PipelineBoundaryValidationError;\n const pipelineError = toPipelineError(error, {\n code: cancelled\n ? \"TUBELESS_RUN_CANCELLED\"\n : validationFailure\n ? \"TUBELESS_STEP_OUTPUT_VALIDATION_FAILED\"\n : childFailure\n ? \"TUBELESS_CHILD_FAILED\"\n : \"TUBELESS_STEP_FAILED\",\n kind: cancelled\n ? \"cancellation\"\n : validationFailure\n ? \"validation\"\n : childFailure\n ? \"child\"\n : \"step\",\n phase: \"execution\",\n stepId,\n });\n errors.push(pipelineError);\n const finishedAtMs = runtime.now();\n const report: PipelineStepCancelledReport | PipelineStepFailedReport = cancelled\n ? {\n attemptId: attempt.attemptId,\n id: stepId,\n name: step.name,\n description: step.description,\n error: pipelineError,\n finishedAtMs,\n startedAtMs: attempt.startedAtMs,\n status: \"cancelled\",\n }\n : {\n attemptId: attempt.attemptId,\n id: stepId,\n name: step.name,\n description: step.description,\n error: pipelineError,\n finishedAtMs,\n startedAtMs: attempt.startedAtMs,\n status: \"failed\",\n };\n reports.push(report);\n reportsByStepId.set(stepId, report);\n publishStepReport(plannedStep, report);\n completed = false;\n if (!controls.continueOnError) {\n recordRemainingStates(\n stepIndex + 1,\n stepId,\n report.status === \"cancelled\" ? pipelineError : undefined\n );\n return true;\n }\n return false;\n };\n\n const recordPublishedStepValue = async (args: {\n attempt?: { attemptId: string; startedAtMs: number };\n kind: \"complete\" | \"policy-skip\";\n plannedStep: PipelinePlanStep;\n skipMessage?: string;\n step: AnyStep<TOptions>;\n stepId: string;\n stepIndex: number;\n value: unknown;\n }): Promise<boolean> => {\n let published = args.value;\n let attempt = args.attempt;\n if (args.step.outputSchema) {\n if (!attempt) {\n attempt = beginAttempt(args.stepId, runtime.now());\n publishStepStatus({\n attemptId: attempt.attemptId,\n pipelineId: compiled.id,\n status: \"running\",\n step: args.plannedStep,\n });\n }\n try {\n published = await validateStandardSchema(\n args.step.outputSchema,\n published,\n `Pipeline ${compiled.id} step ${args.stepId} output`\n );\n } catch (error) {\n return recordStepExecutionFailure(\n error,\n args.plannedStep,\n args.step,\n args.stepId,\n args.stepIndex,\n attempt\n );\n }\n }\n outputs.set(args.stepId, published);\n if (args.kind === \"complete\") {\n const completeAttempt = attempt!;\n const report: PipelineStepCompleteReport = {\n attemptId: completeAttempt.attemptId,\n id: args.stepId,\n name: args.step.name,\n description: args.step.description,\n finishedAtMs: runtime.now(),\n startedAtMs: completeAttempt.startedAtMs,\n status: \"completed\",\n };\n reports.push(report);\n reportsByStepId.set(args.stepId, report);\n publishStepReport(args.plannedStep, report);\n return false;\n }\n const report = recordSkip(\n args.step,\n args.stepId,\n reports,\n reportsByStepId,\n \"policy\",\n args.skipMessage,\n undefined,\n attempt?.attemptId,\n attempt?.startedAtMs,\n runtime.now()\n );\n publishStepReport(args.plannedStep, report);\n return false;\n };\n\n for (const [stepIndex, step] of orderedSteps.entries()) {\n const stepId = step.id;\n const graph = compiledStepGraph(compiled, step);\n const plannedStep =\n plannedSteps.get(stepId) ?? stepToPlanStep(step, true, undefined, undefined, graph);\n\n if (cancelBeforeStepStart(stepId, stepIndex)) {\n break;\n }\n\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned: plannedStep,\n reportsByStepId,\n step,\n });\n if (disposition.kind === \"skip\") {\n const report = recordSkip(\n step,\n stepId,\n reports,\n reportsByStepId,\n disposition.reason,\n disposition.message,\n disposition.dependencyId,\n undefined,\n undefined,\n runtime.now()\n );\n publishStepReport(plannedStep, report);\n continue;\n }\n\n const inputEntries: Array<[string, unknown]> = [];\n for (const dep of graph.dependsOn) {\n inputEntries.push([dep.id, outputs.get(dep.id)]);\n }\n for (const dep of graph.optionalDependsOn) {\n if (outputs.has(dep.id)) {\n inputEntries.push([dep.id, outputs.get(dep.id)]);\n }\n }\n const inputs = Object.fromEntries(inputEntries);\n\n if (typeof step.skip === \"function\") {\n let skipDecision: ReturnType<typeof normalizeStepSkipDecision>;\n try {\n skipDecision = normalizeStepSkipDecision(\n await step.skip(inputs, { ...executionContext, log: tracedLogger(stepId) })\n );\n } catch (error) {\n const skipAttempt = beginAttempt(stepId, runtime.now());\n publishStepStatus({\n attemptId: skipAttempt.attemptId,\n pipelineId: compiled.id,\n status: \"running\",\n step: plannedStep,\n });\n if (recordStepExecutionFailure(error, plannedStep, step, stepId, stepIndex, skipAttempt)) {\n break;\n }\n continue;\n }\n if (cancelBeforeStepStart(stepId, stepIndex)) {\n break;\n }\n if (skipDecision) {\n if (\n await recordPublishedStepValue({\n kind: \"policy-skip\",\n plannedStep,\n skipMessage: skipDecision.reason,\n step,\n stepId,\n stepIndex,\n value: skipDecision.value,\n })\n ) {\n break;\n }\n continue;\n }\n }\n\n const stepStartedAt = runtime.now();\n const attempt = beginAttempt(stepId, stepStartedAt);\n publishStepStatus({\n attemptId: attempt.attemptId,\n pipelineId: compiled.id,\n status: \"running\",\n step: plannedStep,\n });\n try {\n let acceptsProgress = true;\n const publishProgress = (progress: PipelineStepProgress): void => {\n if (!acceptsProgress) return;\n publishStepStatus({\n attemptId: attempt.attemptId,\n pipelineId: compiled.id,\n progress,\n status: \"running\",\n step: plannedStep,\n });\n };\n const stepContext: PipelineStepContext<TOptions> = {\n ...executionContext,\n attemptId: attempt.attemptId,\n log: tracedLogger(stepId, attempt.attemptId),\n reportAttempt: (attempt, attributes) => {\n lifecycle.reportAttempt(stepId, attempt, attributes, stepContext.attemptId);\n },\n reportProgress: (progress) => {\n publishProgress(progress);\n },\n };\n let output: unknown;\n try {\n output =\n dryRun && typeof step.dryRun === \"function\"\n ? await step.dryRun(inputs, stepContext)\n : await step.run(inputs, stepContext);\n } finally {\n acceptsProgress = false;\n }\n if (\n await recordPublishedStepValue({\n attempt,\n kind: \"complete\",\n plannedStep,\n step,\n stepId,\n stepIndex,\n value: output,\n })\n ) {\n break;\n }\n } catch (error) {\n if (recordStepExecutionFailure(error, plannedStep, step, stepId, stepIndex, attempt)) {\n break;\n }\n }\n }\n\n let value: TPipelineResult | undefined;\n let finalized = false;\n if (completed || controls.continueOnError) {\n const finalizeStartedAt = runtime.now();\n lifecycle.finalizeStart();\n try {\n throwIfAborted(runtime);\n // SAFETY: `outputs` maps step ids to their produced values, which is\n // exactly the shape the finalizer's outputs parameter describes.\n const finalOutputs = Object.fromEntries(outputs) as Parameters<\n CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>[\"finalize\"]\n >[0];\n const finalizedValue = await compiled.finalize(finalOutputs, {\n ...executionContext,\n log: tracedLogger(PIPELINE_FINALIZE_STEP_ID),\n });\n // SAFETY: with a result schema the value is validated against\n // `TPipelineResult`; without one the finalizer's declared return type\n // is `TPipelineResult`, so the cast only restores that type.\n value = compiled.resultSchema\n ? ((await validateStandardSchema(\n compiled.resultSchema,\n finalizedValue,\n `Pipeline ${compiled.id} final result`\n )) as TPipelineResult)\n : (finalizedValue as TPipelineResult);\n finalized = true;\n lifecycle.finalizeComplete(runtime.now() - finalizeStartedAt, value);\n } catch (error) {\n const cancelled = isPipelineCancellation(error, runtime);\n const validationFailure = error instanceof PipelineBoundaryValidationError;\n const pipelineError = toPipelineError(error, {\n code: cancelled\n ? \"TUBELESS_FINALIZATION_CANCELLED\"\n : validationFailure\n ? \"TUBELESS_FINAL_RESULT_VALIDATION_FAILED\"\n : \"TUBELESS_FINALIZATION_FAILED\",\n kind: cancelled ? \"cancellation\" : validationFailure ? \"validation\" : \"finalization\",\n phase: \"finalization\",\n stepId: PIPELINE_FINALIZE_STEP_ID,\n });\n errors.push(pipelineError);\n lifecycle.finalizeError(pipelineError, runtime.now() - finalizeStartedAt);\n completed = false;\n }\n }\n\n const finishedAtMs = runtime.now();\n const result: PipelineRun<TPipelineResult> = {\n pipelineId: compiled.id,\n dryRun,\n errors,\n finalized,\n finishedAtMs,\n runId,\n startedAtMs: startedAt,\n status: terminalRunStatus(errors),\n steps: reports,\n value,\n version: RUN_MODEL_VERSION,\n };\n if (parentRunId) result.parentRunId = parentRunId;\n lifecycle.pipelineComplete(result);\n await lifecycle.flush();\n return result;\n}\n\nconst fallbackNow = (): number => Date.now();\n\nconst fallbackSleep = (durationMs: number, signal?: AbortSignal): Promise<void> =>\n abortableSleep(durationMs, signal, \"Pipeline sleep\");\n\nexport function defaultPipelineContext(): PipelineContext {\n return { cwd: process.cwd(), log: console, now: fallbackNow, sleep: fallbackSleep };\n}\n\nexport function resolvePipelineRuntime(context: Partial<PipelineContext> = {}): PipelineRuntime {\n const defaults = defaultPipelineContext();\n return {\n ...defaults,\n ...context,\n cwd: context.cwd ?? defaults.cwd,\n log: context.log ?? defaults.log,\n now: context.now ?? defaults.now ?? fallbackNow,\n sleep: context.sleep ?? defaults.sleep ?? fallbackSleep,\n };\n}\n"]}
1
+ {"version":3,"file":"pipeline-execute.js","sourceRoot":"","sources":["../../src/core/pipeline-execute.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abortableSleep,\n isAbortError,\n throwIfAborted as throwIfSignalAborted,\n} from \"../utilities/abort.js\";\nimport { PipelineChildError } from \"./child-execution.js\";\nimport { brandTubelessError } from \"../utilities/tubeless-error.js\";\nimport { createPipelineLifecycleObserver } from \"./lifecycle.js\";\nimport { formatPipelineError } from \"./pipeline-diagnostics.js\";\nimport { createRunId } from \"./pipeline-ids.js\";\nimport type { CompiledPipeline } from \"./pipeline-compiler.js\";\nimport type { StepsOptions } from \"./pipeline-definition.js\";\nimport { decideStepDisposition } from \"./pipeline-disposition.js\";\nimport { compiledStepGraph } from \"./pipeline-graph.js\";\nimport { planStepById, stepToPlanStep } from \"./pipeline-plan.js\";\nimport {\n PipelineRunState,\n isCancellationOnly,\n type PipelineStepAttempt,\n} from \"./pipeline-run-state.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { PIPELINE_FINALIZE_STEP_ID } from \"./pipeline-step-metadata.js\";\nimport {\n evaluateStepSkip,\n executeStepAttempt,\n validateStepOutput,\n} from \"./pipeline-step-executor.js\";\nimport type {\n InferSchemaOutput,\n PipelineContext,\n PipelineError,\n PipelineErrorCause,\n PipelineExecutionContext,\n PipelineLogger,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunControls,\n PipelineRuntime,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\nimport { PipelineBoundaryValidationError, validateStandardSchema } from \"./pipeline-validation.js\";\nimport { createPipelineTraceEmitter } from \"../tracing/tracing-internal.js\";\n\nconst PIPELINE_RUN_ID_OBSERVER = Symbol.for(\"tubeless.pipeline.runIdObserver\");\n\ninterface ObservedPipelineRuntime {\n [PIPELINE_RUN_ID_OBSERVER]?: (runId: string) => void;\n}\n\n/** Observe an execution ID from an internal host without allowing it to be overridden. */\nexport function observePipelineRunId<TContext extends object>(\n context: TContext,\n observer: (runId: string) => void\n): TContext {\n // SAFETY: the internal observer is intentionally hidden from the returned\n // public type and can observe, but never choose, the generated run ID.\n return { ...context, [PIPELINE_RUN_ID_OBSERVER]: observer };\n}\n\nconst PIPELINE_LOGGER_BASE = Symbol(\"pipelineLoggerBase\");\n\ntype TracedPipelineLogger = PipelineLogger & { [PIPELINE_LOGGER_BASE]?: PipelineLogger };\n\nfunction basePipelineLogger(log: PipelineLogger): PipelineLogger {\n // SAFETY: `TracedPipelineLogger` only adds the optional symbol-keyed base\n // property; reading it off any `PipelineLogger` is safe because the property\n // is absent unless a tracing wrapper installed it.\n return (log as TracedPipelineLogger)[PIPELINE_LOGGER_BASE] ?? log;\n}\n\nconst originalPipelineErrors = new WeakMap<PipelineError, unknown>();\n\nfunction defaultExecutionErrorMessage(result: PipelineRun<unknown>): string {\n const firstError = result.errors[0];\n const disposition = isCancellationOnly(result.errors) ? \"cancelled\" : \"failed\";\n return firstError\n ? `Pipeline ${result.pipelineId} ${disposition}: ${formatPipelineError(firstError)}`\n : `Pipeline ${result.pipelineId} ${disposition}`;\n}\n\nfunction firstOriginalPipelineError(errors: readonly PipelineError[]): unknown {\n for (const error of errors) {\n if (originalPipelineErrors.has(error)) return originalPipelineErrors.get(error);\n }\n return undefined;\n}\n\nexport class PipelineExecutionError extends Error {\n constructor(\n readonly result: PipelineRun<unknown>,\n message = defaultExecutionErrorMessage(result)\n ) {\n const cause = firstOriginalPipelineError(result.errors);\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"PipelineExecutionError\";\n brandTubelessError(this, \"pipeline-execution\");\n }\n}\n\nconst MAX_PIPELINE_CAUSE_DEPTH = 8;\n\nfunction readErrorField(value: object, field: \"cause\" | \"code\" | \"message\" | \"name\"): unknown {\n try {\n // SAFETY: any object may be probed for an optional string-keyed field; a\n // getter that throws is caught below, so the cast only enables the lookup.\n return (value as Record<string, unknown>)[field];\n } catch {\n return undefined;\n }\n}\n\nfunction safeErrorMessage(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"Unknown thrown value\";\n }\n}\n\nfunction normalizePipelineCause(\n value: unknown,\n seen: WeakSet<object>,\n depth = 0\n): PipelineErrorCause {\n if (depth >= MAX_PIPELINE_CAUSE_DEPTH) {\n return { message: \"Cause chain truncated\" };\n }\n if (typeof value !== \"object\" || value === null) {\n return { message: safeErrorMessage(value) };\n }\n if (seen.has(value)) {\n return { message: \"Circular cause\" };\n }\n seen.add(value);\n\n const message = readErrorField(value, \"message\");\n const name = readErrorField(value, \"name\");\n const sourceCode = readErrorField(value, \"code\");\n const nested = readErrorField(value, \"cause\");\n const cause: PipelineErrorCause = {\n message: typeof message === \"string\" ? message : safeErrorMessage(value),\n };\n if (typeof name === \"string\") cause.name = name;\n if (typeof sourceCode === \"string\") cause.sourceCode = sourceCode;\n if (nested !== undefined) cause.cause = normalizePipelineCause(nested, seen, depth + 1);\n return cause;\n}\n\n// Fan-out snapshots bound every string as well as cause depth and item count.\nfunction fanOutCause(error: unknown): PipelineErrorCause {\n const cause = normalizePipelineCause(error, new WeakSet<object>());\n let current: PipelineErrorCause | undefined = cause;\n while (current) {\n current.message = current.message.slice(0, 1024);\n if (current.name) current.name = current.name.slice(0, 1024);\n if (current.sourceCode) current.sourceCode = current.sourceCode.slice(0, 1024);\n current = current.cause;\n }\n return cause;\n}\n\nfunction normalizedNestedCause(error: unknown): PipelineErrorCause | undefined {\n if (typeof error !== \"object\" || error === null) return undefined;\n const cause = readErrorField(error, \"cause\");\n if (cause === undefined) return undefined;\n const seen = new WeakSet<object>();\n seen.add(error);\n return normalizePipelineCause(cause, seen);\n}\n\nfunction toPipelineError(\n error: unknown,\n classification: Omit<PipelineError, \"cause\" | \"message\" | \"sourceCode\" | \"stack\">\n): PipelineError {\n const sourceCode =\n typeof error === \"object\" && error !== null ? readErrorField(error, \"code\") : undefined;\n const cause = normalizedNestedCause(error);\n const pipelineError: PipelineError = {\n ...classification,\n message: error instanceof Error ? error.message : safeErrorMessage(error),\n };\n if (error instanceof Error && error.stack) pipelineError.stack = error.stack;\n if (typeof sourceCode === \"string\") pipelineError.sourceCode = sourceCode;\n if (cause) pipelineError.cause = cause;\n if (error instanceof PipelineBoundaryValidationError) pipelineError.issues = error.issues;\n if (error instanceof PipelineChildError && error.fanOut) {\n const { failures, failureCount, schedulerError } = error.fanOut;\n pipelineError.fanOut = {\n failures: failures.map(({ error: itemError, key, index, cancelled }) => ({\n index,\n key: key.slice(0, 1024),\n keyTruncated: key.length > 1024,\n cancelled,\n error: fanOutCause(itemError),\n })),\n failureCount,\n omittedFailureCount: failureCount - failures.length,\n };\n if (schedulerError !== undefined)\n pipelineError.fanOut.schedulerError = fanOutCause(schedulerError);\n }\n originalPipelineErrors.set(pipelineError, error);\n return pipelineError;\n}\n\nexport function isPipelineCancellation(error: unknown, runtime: PipelineRuntime): boolean {\n if (isAbortError(error)) return true;\n if (runtime.signal?.aborted === true && error === runtime.signal.reason) return true;\n if (error instanceof PipelineChildError) return error.cancelled;\n return error instanceof PipelineExecutionError && isCancelledResult(error.result);\n}\n\nfunction isCancelledResult(result: PipelineRun<unknown>): boolean {\n return result.status === \"cancelled\";\n}\n\ntype PipelineRunIdentity = { correlationId?: string; parentRunId?: string; runId: string };\n\nfunction throwIfAborted(runtime: PipelineRuntime): void {\n throwIfSignalAborted(runtime.signal, \"Pipeline run\");\n}\n\nexport async function executePlannedRun<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(input: {\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>;\n controls: PipelineRunControls;\n domainOptions: object;\n plan: PipelinePlan;\n runtime: PipelineRuntime;\n}): Promise<\n PipelineRun<TResultSchema extends StandardSchemaV1 ? InferSchemaOutput<TResultSchema> : TResult>\n> {\n type TPipelineResult = TResultSchema extends StandardSchemaV1\n ? InferSchemaOutput<TResultSchema>\n : TResult;\n type TOptions = StepsOptions<TSteps>;\n const { compiled, controls, runtime } = input;\n const startedAtMs = runtime.now();\n const runId = createRunId(compiled.id);\n try {\n // SAFETY: only internal hosts attach this observation callback. A callback\n // failure must not change whether the pipeline execution itself can start.\n (runtime as PipelineRuntime & ObservedPipelineRuntime)[PIPELINE_RUN_ID_OBSERVER]?.(runId);\n } catch {\n // Ignore observation failures; execution identity remains package-owned.\n }\n const correlationId = runtime.correlationId;\n const identity: PipelineRunIdentity = { runId };\n if (correlationId !== undefined) identity.correlationId = correlationId;\n if (runtime.parentRunId) identity.parentRunId = runtime.parentRunId;\n const dryRun = controls.dryRun === true;\n const trace = createPipelineTraceEmitter(\n compiled.id,\n runtime.tracing,\n basePipelineLogger(runtime.log),\n { ...identity, itemKey: runtime.tracing?.itemKey },\n runtime.now\n );\n const lifecycle = createPipelineLifecycleObserver(compiled.id, runtime, trace);\n const tracedLogger = (stepId?: string, attemptId?: string): PipelineLogger => {\n if (!trace) return runtime.log;\n const base = basePipelineLogger(runtime.log);\n const log: TracedPipelineLogger = {\n error: (message, ...params) => {\n lifecycle.log(\"error\", message, params, stepId, attemptId);\n base.error(message, ...params);\n },\n log: (message, ...params) => {\n lifecycle.log(\"log\", message, params, stepId, attemptId);\n base.log(message, ...params);\n },\n warn: (message, ...params) => {\n lifecycle.log(\"warn\", message, params, stepId, attemptId);\n base.warn(message, ...params);\n },\n };\n log[PIPELINE_LOGGER_BASE] = base;\n return log;\n };\n const state = new PipelineRunState<TPipelineResult>(\n compiled.id,\n dryRun,\n startedAtMs,\n identity,\n runtime.now,\n lifecycle\n );\n state.start(input.plan, compiled.targetIds);\n\n if (!input.plan.ok) {\n state.recordRunErrors(input.plan.errors);\n return state.finish();\n }\n\n // SAFETY: `domainOptions` is the user-supplied options object; if a schema\n // is present it is re-validated below before assignment to `pipelineOptions`.\n let pipelineOptions = input.domainOptions as TOptions;\n if (compiled.optionsSchema) {\n try {\n const validated = await validateStandardSchema(\n compiled.optionsSchema,\n input.domainOptions,\n `Pipeline ${compiled.id} options`\n );\n if (typeof validated !== \"object\" || validated === null || Array.isArray(validated)) {\n throw new PipelineBoundaryValidationError(\n `Pipeline ${compiled.id} options schema returned a non-object value`,\n [{ message: \"Expected the validated options value to be an object\" }]\n );\n }\n // SAFETY: the schema validated the value against `TOptions` and the\n // object-shape check above passed, so the value is a `TOptions`.\n pipelineOptions = validated as TOptions;\n } catch (error) {\n state.recordRunErrors([\n toPipelineError(error, {\n code: \"TUBELESS_OPTIONS_VALIDATION_FAILED\",\n kind: \"validation\",\n phase: \"execution\",\n }),\n ]);\n return state.finish();\n }\n }\n\n for (const step of input.plan.steps) state.planStep(step);\n\n const executionContext: PipelineExecutionContext<TOptions> = {\n ...runtime,\n dryRun,\n log: tracedLogger(),\n options: pipelineOptions,\n runId,\n trace: trace?.context,\n };\n if (correlationId !== undefined) executionContext.correlationId = correlationId;\n if (runtime.parentRunId) executionContext.parentRunId = runtime.parentRunId;\n\n const plannedSteps = planStepById(input.plan);\n const stepsById = new Map(compiled.orderedSteps.map((step) => [step.id, step]));\n // `input.plan.steps` is already topologically ordered. Rehydrate from the original step\n // objects so callers still get the typed handlers rather than plan metadata.\n // SAFETY: every planned step id originates from `compiled.orderedSteps`, so the\n // map lookup always finds the matching `AnyStep<TOptions>`.\n const orderedSteps = input.plan.steps.map((step) => stepsById.get(step.id) as AnyStep<TOptions>);\n const plannedStepFor = (step: AnyStep<TOptions>): PipelinePlanStep =>\n plannedSteps.get(step.id) ??\n stepToPlanStep(step, true, undefined, undefined, compiledStepGraph(compiled, step));\n\n const recordRemainingStates = (\n fromIndex: number,\n failedStepId?: string,\n cancellationError?: PipelineError\n ): void => {\n for (let index = fromIndex; index < orderedSteps.length; index++) {\n const step = orderedSteps[index]!;\n const plannedStep = plannedStepFor(step);\n if (plannedStep.skipReason) {\n const dependencyId =\n plannedStep.skipReason === \"unmet-dependency\"\n ? plannedStep.dependencies.find((id) => plannedSteps.get(id)?.skipReason !== undefined)\n : undefined;\n state.skipStep(plannedStep, {\n reason: plannedStep.skipReason,\n dependencyId,\n });\n } else if (cancellationError) {\n state.cancelStep(plannedStep, { ...cancellationError, stepId: step.id }, false);\n } else {\n state.skipStep(plannedStep, {\n reason: \"fail-fast\",\n message: failedStepId\n ? `Not run because fail-fast stopped after ${failedStepId} failed.`\n : \"Not run because the pipeline was aborted before this step started.\",\n dependencyId: failedStepId,\n });\n }\n }\n };\n\n const cancelBeforeStepStart = (stepId: string, stepIndex: number): boolean => {\n try {\n throwIfAborted(runtime);\n return false;\n } catch (error) {\n const pipelineError = toPipelineError(error, {\n code: \"TUBELESS_RUN_CANCELLED\",\n kind: \"cancellation\",\n phase: \"execution\",\n stepId,\n });\n state.recordRunErrors([pipelineError]);\n recordRemainingStates(stepIndex, undefined, pipelineError);\n return true;\n }\n };\n\n const recordStepExecutionFailure = (\n error: unknown,\n plannedStep: PipelinePlanStep,\n stepIndex: number,\n attempt: PipelineStepAttempt\n ): boolean => {\n const cancelled = isPipelineCancellation(error, runtime);\n const childFailure =\n error instanceof PipelineExecutionError || error instanceof PipelineChildError;\n const validationFailure = error instanceof PipelineBoundaryValidationError;\n const pipelineError = toPipelineError(error, {\n code: cancelled\n ? \"TUBELESS_RUN_CANCELLED\"\n : validationFailure\n ? \"TUBELESS_STEP_OUTPUT_VALIDATION_FAILED\"\n : childFailure\n ? \"TUBELESS_CHILD_FAILED\"\n : \"TUBELESS_STEP_FAILED\",\n kind: cancelled\n ? \"cancellation\"\n : validationFailure\n ? \"validation\"\n : childFailure\n ? \"child\"\n : \"step\",\n phase: \"execution\",\n stepId: plannedStep.id,\n });\n state.failStep(plannedStep, attempt, pipelineError);\n if (controls.continueOnError) return false;\n recordRemainingStates(stepIndex + 1, plannedStep.id, cancelled ? pipelineError : undefined);\n return true;\n };\n\n const recordPolicySkip = async (\n plannedStep: PipelinePlanStep,\n step: AnyStep<TOptions>,\n stepIndex: number,\n reason: string,\n value: unknown\n ): Promise<boolean> => {\n let attempt: PipelineStepAttempt | undefined;\n let published = value;\n if (step.outputSchema) {\n attempt = state.beginAttempt(plannedStep);\n try {\n published = await validateStepOutput(\n step,\n value,\n `Pipeline ${compiled.id} step ${step.id} output`\n );\n } catch (error) {\n return recordStepExecutionFailure(error, plannedStep, stepIndex, attempt);\n }\n }\n state.skipStep(plannedStep, {\n attempt,\n message: reason,\n output: { value: published },\n reason: \"policy\",\n });\n return false;\n };\n\n for (const [stepIndex, step] of orderedSteps.entries()) {\n const plannedStep = plannedStepFor(step);\n if (cancelBeforeStepStart(step.id, stepIndex)) break;\n\n const graph = compiledStepGraph(compiled, step);\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned: plannedStep,\n reportsByStepId: state.reportsByStepId,\n step,\n });\n if (disposition.kind === \"skip\") {\n state.skipStep(plannedStep, disposition);\n continue;\n }\n\n const inputEntries: Array<[string, unknown]> = [];\n for (const dep of graph.dependsOn) inputEntries.push([dep.id, state.outputs.get(dep.id)]);\n for (const dep of graph.optionalDependsOn) {\n if (state.outputs.has(dep.id)) inputEntries.push([dep.id, state.outputs.get(dep.id)]);\n }\n const stepInputs = Object.fromEntries(inputEntries);\n\n if (typeof step.skip === \"function\") {\n let skipDecision;\n try {\n skipDecision = await evaluateStepSkip(step, stepInputs, {\n ...executionContext,\n log: tracedLogger(step.id),\n });\n } catch (error) {\n const attempt = state.beginAttempt(plannedStep);\n if (recordStepExecutionFailure(error, plannedStep, stepIndex, attempt)) break;\n continue;\n }\n if (cancelBeforeStepStart(step.id, stepIndex)) break;\n if (skipDecision) {\n if (\n await recordPolicySkip(\n plannedStep,\n step,\n stepIndex,\n skipDecision.reason,\n skipDecision.value\n )\n ) {\n break;\n }\n continue;\n }\n }\n\n const attempt = state.beginAttempt(plannedStep);\n try {\n const output = await executeStepAttempt({\n attemptId: attempt.attemptId,\n context: executionContext,\n dryRun,\n inputs: stepInputs,\n log: tracedLogger(step.id, attempt.attemptId),\n onProgress: (progress) => state.reportProgress(plannedStep, attempt, progress),\n onReportAttempt: (number, attributes) =>\n lifecycle.reportAttempt(step.id, number, attributes, attempt.attemptId),\n outputBoundary: `Pipeline ${compiled.id} step ${step.id} output`,\n step,\n });\n state.completeStep(plannedStep, attempt, output);\n } catch (error) {\n if (recordStepExecutionFailure(error, plannedStep, stepIndex, attempt)) break;\n }\n }\n\n if (state.errors.length === 0 || controls.continueOnError) {\n const finalizeStartedAt = runtime.now();\n state.beginFinalization();\n try {\n throwIfAborted(runtime);\n // SAFETY: `state.outputs` maps step ids to their produced values, which is\n // exactly the shape the finalizer's outputs parameter describes.\n const finalOutputs = Object.fromEntries(state.outputs) as Parameters<\n CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>[\"finalize\"]\n >[0];\n const finalizedValue = await compiled.finalize(finalOutputs, {\n ...executionContext,\n log: tracedLogger(PIPELINE_FINALIZE_STEP_ID),\n });\n // SAFETY: with a result schema the value is validated against\n // `TPipelineResult`; without one the finalizer's declared return type\n // is `TPipelineResult`, so the cast only restores that type.\n const value = compiled.resultSchema\n ? ((await validateStandardSchema(\n compiled.resultSchema,\n finalizedValue,\n `Pipeline ${compiled.id} final result`\n )) as TPipelineResult)\n : (finalizedValue as TPipelineResult);\n state.completeFinalization(value, runtime.now() - finalizeStartedAt);\n } catch (error) {\n const cancelled = isPipelineCancellation(error, runtime);\n const validationFailure = error instanceof PipelineBoundaryValidationError;\n const pipelineError = toPipelineError(error, {\n code: cancelled\n ? \"TUBELESS_FINALIZATION_CANCELLED\"\n : validationFailure\n ? \"TUBELESS_FINAL_RESULT_VALIDATION_FAILED\"\n : \"TUBELESS_FINALIZATION_FAILED\",\n kind: cancelled ? \"cancellation\" : validationFailure ? \"validation\" : \"finalization\",\n phase: \"finalization\",\n stepId: PIPELINE_FINALIZE_STEP_ID,\n });\n state.failFinalization(pipelineError, runtime.now() - finalizeStartedAt);\n }\n }\n\n return state.finish();\n}\n\nconst fallbackNow = (): number => Date.now();\n\nconst fallbackSleep = (durationMs: number, signal?: AbortSignal): Promise<void> =>\n abortableSleep(durationMs, signal, \"Pipeline sleep\");\n\nexport function defaultPipelineContext(): PipelineContext {\n return { cwd: process.cwd(), log: console, now: fallbackNow, sleep: fallbackSleep };\n}\n\nexport function resolvePipelineRuntime(context: Partial<PipelineContext> = {}): PipelineRuntime {\n const defaults = defaultPipelineContext();\n return {\n ...defaults,\n ...context,\n cwd: context.cwd ?? defaults.cwd,\n log: context.log ?? defaults.log,\n now: context.now ?? defaults.now ?? fallbackNow,\n sleep: context.sleep ?? defaults.sleep ?? fallbackSleep,\n };\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { AnyStep, StepOutput } from "./pipeline-steps.js";
2
+ import type { StepsOptions } from "./pipeline-definition.js";
3
+ import type { PipelineExecutionContext } from "./pipeline-types.js";
4
+ export interface RequiredFinalizerMetadata<TOptions extends object> {
5
+ readonly steps: readonly AnyStep<TOptions>[];
6
+ compile(requiredStepIds: readonly string[]): (...args: never[]) => unknown;
7
+ }
8
+ type RequiredPipelineOutputs<TSteps extends readonly AnyStep[]> = {
9
+ [S in TSteps[number] as S["id"]]-?: StepOutput<S>;
10
+ };
11
+ export declare function requiredFinalizerMetadata<TOptions extends object>(finalize: object): RequiredFinalizerMetadata<TOptions> | undefined;
12
+ /**
13
+ * Build a finalizer that only runs when every listed step published an output.
14
+ * Presence is checked by output slot, so a successfully published `undefined`
15
+ * remains distinct from a structural skip or failure.
16
+ */
17
+ export declare function requireOutputs<const TRequiredSteps extends readonly AnyStep[], TResult>(requiredSteps: TRequiredSteps, finalize: (outputs: RequiredPipelineOutputs<TRequiredSteps>, context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>) => TResult | Promise<TResult>): (outputs: Partial<RequiredPipelineOutputs<TRequiredSteps>>, context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>) => TResult | Promise<TResult>;
18
+ export {};
@@ -0,0 +1,37 @@
1
+ const REQUIRED_FINALIZER_OUTPUTS = Symbol("tubeless.requiredFinalizerOutputs");
2
+ export function requiredFinalizerMetadata(finalize) {
3
+ // SAFETY: `requireOutputs` stamps internal compilation metadata onto the
4
+ // finalizer; the intersection only exposes that optional property.
5
+ return finalize[REQUIRED_FINALIZER_OUTPUTS];
6
+ }
7
+ /**
8
+ * Build a finalizer that only runs when every listed step published an output.
9
+ * Presence is checked by output slot, so a successfully published `undefined`
10
+ * remains distinct from a structural skip or failure.
11
+ */
12
+ export function requireOutputs(requiredSteps, finalize) {
13
+ const uniqueRequiredSteps = [...new Set(requiredSteps)];
14
+ const invoke = (requiredStepIds, outputs, context) => {
15
+ const missingStepIds = requiredStepIds.filter((stepId) => !Object.prototype.hasOwnProperty.call(outputs, stepId));
16
+ if (missingStepIds.length > 0) {
17
+ throw new Error(`Required pipeline outputs missing: ${missingStepIds.join(", ")}`);
18
+ }
19
+ // SAFETY: every required step id was verified present above, so the partial
20
+ // outputs contain all required keys and are a complete required-outputs map.
21
+ // oxlint-disable-next-line anti-slop/no-chained-type-assertions
22
+ return finalize(outputs, context);
23
+ };
24
+ const requiredFinalizer = (outputs, context) => invoke(uniqueRequiredSteps.map((step) => step.id), outputs, context);
25
+ const metadata = Object.freeze({
26
+ compile: (requiredStepIds) => {
27
+ const snapshot = Object.freeze([...requiredStepIds]);
28
+ return (outputs, context) => invoke(snapshot, outputs, context);
29
+ },
30
+ steps: Object.freeze([...uniqueRequiredSteps]),
31
+ });
32
+ Object.defineProperty(requiredFinalizer, REQUIRED_FINALIZER_OUTPUTS, {
33
+ value: metadata,
34
+ });
35
+ return requiredFinalizer;
36
+ }
37
+ //# sourceMappingURL=pipeline-finalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-finalizer.js","sourceRoot":"","sources":["../../src/core/pipeline-finalizer.ts"],"names":[],"mappings":"AAIA,MAAM,0BAA0B,GAAkB,MAAM,CAAC,mCAAmC,CAAC,CAAC;AAW9F,MAAM,UAAU,yBAAyB,CACvC,QAAgB;IAEhB,yEAAyE;IACzE,mEAAmE;IACnE,OAAQ,QAAmF,CACzF,0BAA0B,CAC3B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,aAA6B,EAC7B,QAG+B;IAK/B,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,CACb,eAAkC,EAClC,OAAyD,EACzD,OAA+D,EAC/D,EAAE;QACF,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAC3C,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CACnE,CAAC;QACF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,sCAAsC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,4EAA4E;QAC5E,6EAA6E;QAC7E,gEAAgE;QAChE,OAAO,QAAQ,CAAC,OAA6D,EAAE,OAAO,CAAC,CAAC;IAC1F,CAAC,CAAC;IACF,MAAM,iBAAiB,GAAG,CACxB,OAAyD,EACzD,OAA+D,EAC/D,EAAE,CACF,MAAM,CACJ,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAC1C,OAAO,EACP,OAAO,CACR,CAAC;IACJ,MAAM,QAAQ,GAA4D,MAAM,CAAC,MAAM,CAAC;QACtF,OAAO,EAAE,CAAC,eAAkC,EAAE,EAAE;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;YACrD,OAAO,CACL,OAAyD,EACzD,OAA+D,EAC/D,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,iBAAiB,EAAE,0BAA0B,EAAE;QACnE,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAC;AAC3B,CAAC","sourcesContent":["import type { AnyStep, StepOutput } from \"./pipeline-steps.js\";\nimport type { StepsOptions } from \"./pipeline-definition.js\";\nimport type { PipelineExecutionContext } from \"./pipeline-types.js\";\n\nconst REQUIRED_FINALIZER_OUTPUTS: unique symbol = Symbol(\"tubeless.requiredFinalizerOutputs\");\n\nexport interface RequiredFinalizerMetadata<TOptions extends object> {\n readonly steps: readonly AnyStep<TOptions>[];\n compile(requiredStepIds: readonly string[]): (...args: never[]) => unknown;\n}\n\ntype RequiredPipelineOutputs<TSteps extends readonly AnyStep[]> = {\n [S in TSteps[number] as S[\"id\"]]-?: StepOutput<S>;\n};\n\nexport function requiredFinalizerMetadata<TOptions extends object>(\n finalize: object\n): RequiredFinalizerMetadata<TOptions> | undefined {\n // SAFETY: `requireOutputs` stamps internal compilation metadata onto the\n // finalizer; the intersection only exposes that optional property.\n return (finalize as { [REQUIRED_FINALIZER_OUTPUTS]?: RequiredFinalizerMetadata<TOptions> })[\n REQUIRED_FINALIZER_OUTPUTS\n ];\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 invoke = (\n requiredStepIds: readonly string[],\n outputs: Partial<RequiredPipelineOutputs<TRequiredSteps>>,\n context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>\n ) => {\n const missingStepIds = requiredStepIds.filter(\n (stepId) => !Object.prototype.hasOwnProperty.call(outputs, stepId)\n );\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 // oxlint-disable-next-line anti-slop/no-chained-type-assertions\n return finalize(outputs as unknown as RequiredPipelineOutputs<TRequiredSteps>, context);\n };\n const requiredFinalizer = (\n outputs: Partial<RequiredPipelineOutputs<TRequiredSteps>>,\n context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>\n ) =>\n invoke(\n uniqueRequiredSteps.map((step) => step.id),\n outputs,\n context\n );\n const metadata: RequiredFinalizerMetadata<StepsOptions<TRequiredSteps>> = Object.freeze({\n compile: (requiredStepIds: readonly string[]) => {\n const snapshot = Object.freeze([...requiredStepIds]);\n return (\n outputs: Partial<RequiredPipelineOutputs<TRequiredSteps>>,\n context: PipelineExecutionContext<StepsOptions<TRequiredSteps>>\n ) => invoke(snapshot, outputs, context);\n },\n steps: Object.freeze([...uniqueRequiredSteps]),\n });\n Object.defineProperty(requiredFinalizer, REQUIRED_FINALIZER_OUTPUTS, {\n value: metadata,\n });\n return requiredFinalizer;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import type { AnyStep } from "./pipeline-steps.js";
2
+ export interface CompiledStepGraph<TOptions extends object = object> {
3
+ readonly dependsOn: readonly AnyStep<TOptions>[];
4
+ readonly optionalDependsOn: readonly AnyStep<TOptions>[];
5
+ readonly skipAfterFailureOf: readonly AnyStep<TOptions>[];
6
+ }
7
+ export type CompiledStep<TOptions extends object = object> = Omit<AnyStep<TOptions>, "dependsOn" | "optionalDependsOn" | "skipAfterFailureOf">;
8
+ export declare function liveStepGraph<TOptions extends object>(step: AnyStep<TOptions>): CompiledStepGraph<TOptions>;
9
+ export declare function compiledStepGraph<TOptions extends object>(compiled: Pick<{
10
+ stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;
11
+ }, "stepGraph">, step: AnyStep<TOptions>): CompiledStepGraph<TOptions>;
12
+ /** Returns every distinct edge into a step, regardless of dependency policy. */
13
+ export declare function stepEdges<TOptions extends object>(step: AnyStep<TOptions>, graph?: CompiledStepGraph<TOptions>): readonly AnyStep<TOptions>[];
14
+ /** Required data and failure-gate closure for dependency-aware targets. */
15
+ export declare function targetClosure<TOptions extends object>(targets: readonly AnyStep<TOptions>[]): Set<AnyStep<TOptions>>;
16
+ /** Orders steps so every dependency runs before its dependents. */
17
+ export declare function topologicalSort<TOptions extends object>(steps: readonly AnyStep<TOptions>[]): readonly AnyStep<TOptions>[] | null;
18
+ export interface CompiledPipelineGraph<TOptions extends object> {
19
+ readonly compiledByAuthorStep: ReadonlyMap<AnyStep<TOptions>, CompiledStep<TOptions>>;
20
+ readonly orderedSteps: readonly CompiledStep<TOptions>[];
21
+ readonly stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;
22
+ }
23
+ export declare function compilePipelineGraph<TOptions extends object>(steps: readonly AnyStep<TOptions>[]): CompiledPipelineGraph<TOptions>;
@@ -0,0 +1,135 @@
1
+ import { STEP_NESTED_PIPELINE, STEP_OPTIONS_SCHEMA, STEP_REMOTE, } from "./pipeline-step-metadata.js";
2
+ export function liveStepGraph(step) {
3
+ return {
4
+ dependsOn: step.dependsOn ?? [],
5
+ optionalDependsOn: step.optionalDependsOn ?? [],
6
+ skipAfterFailureOf: step.skipAfterFailureOf ?? [],
7
+ };
8
+ }
9
+ function compileStep(step) {
10
+ const nestedPipeline = step[STEP_NESTED_PIPELINE];
11
+ const remote = step[STEP_REMOTE];
12
+ const optionsSchema = step[STEP_OPTIONS_SCHEMA];
13
+ const name = step.name;
14
+ const description = step.description;
15
+ const dryRun = step.dryRun;
16
+ const outputSchema = step.outputSchema;
17
+ const skip = step.skip;
18
+ const compiled = {
19
+ id: step.id,
20
+ run: step.run.bind(step),
21
+ };
22
+ if (nestedPipeline !== undefined) {
23
+ Object.assign(compiled, {
24
+ [STEP_NESTED_PIPELINE]: Object.freeze({
25
+ ...nestedPipeline,
26
+ stepIds: Object.freeze([...nestedPipeline.stepIds]),
27
+ }),
28
+ });
29
+ }
30
+ if (remote !== undefined)
31
+ Object.assign(compiled, { [STEP_REMOTE]: Object.freeze({ ...remote }) });
32
+ if (optionsSchema !== undefined)
33
+ Object.assign(compiled, { [STEP_OPTIONS_SCHEMA]: optionsSchema });
34
+ if (name !== undefined)
35
+ Object.assign(compiled, { name });
36
+ if (description !== undefined)
37
+ Object.assign(compiled, { description });
38
+ if (dryRun !== undefined) {
39
+ Object.assign(compiled, {
40
+ dryRun: typeof dryRun === "function" ? dryRun.bind(step) : dryRun,
41
+ });
42
+ }
43
+ if (outputSchema !== undefined)
44
+ Object.assign(compiled, { outputSchema });
45
+ if (skip !== undefined)
46
+ Object.assign(compiled, { skip: skip.bind(step) });
47
+ return Object.freeze(compiled);
48
+ }
49
+ function snapshotCompiledStepGraph(step, compiledByAuthorStep) {
50
+ const compileDependencies = (dependencies) => Object.freeze((dependencies ?? []).map((dependency) => {
51
+ const compiled = compiledByAuthorStep.get(dependency);
52
+ if (compiled === undefined) {
53
+ throw new Error(`Compiled pipeline graph is missing dependency ${dependency.id}`);
54
+ }
55
+ return compiled;
56
+ }));
57
+ return Object.freeze({
58
+ dependsOn: compileDependencies(step.dependsOn),
59
+ optionalDependsOn: compileDependencies(step.optionalDependsOn),
60
+ skipAfterFailureOf: compileDependencies(step.skipAfterFailureOf),
61
+ });
62
+ }
63
+ export function compiledStepGraph(compiled, step) {
64
+ const graph = compiled.stepGraph.get(step);
65
+ if (graph === undefined) {
66
+ throw new Error(`Compiled pipeline graph is missing step ${step.id}`);
67
+ }
68
+ // SAFETY: compile stores each descriptor as the map key.
69
+ return graph;
70
+ }
71
+ /** Returns every distinct edge into a step, regardless of dependency policy. */
72
+ export function stepEdges(step, graph = liveStepGraph(step)) {
73
+ return [
74
+ ...new Set([...graph.dependsOn, ...graph.optionalDependsOn, ...graph.skipAfterFailureOf]),
75
+ ];
76
+ }
77
+ /** Required data and failure-gate closure for dependency-aware targets. */
78
+ export function targetClosure(targets) {
79
+ const selected = new Set();
80
+ const include = (step) => {
81
+ if (selected.has(step))
82
+ return;
83
+ selected.add(step);
84
+ for (const prerequisite of [...(step.dependsOn ?? []), ...(step.skipAfterFailureOf ?? [])]) {
85
+ include(prerequisite);
86
+ }
87
+ };
88
+ for (const target of targets)
89
+ include(target);
90
+ return selected;
91
+ }
92
+ /** Orders steps so every dependency runs before its dependents. */
93
+ export function topologicalSort(steps) {
94
+ const indexById = new Map(steps.map((step, index) => [step.id, index]));
95
+ const remainingInDegree = new Map(steps.map((step) => [step.id, stepEdges(step).length]));
96
+ const dependentsOf = new Map();
97
+ for (const step of steps) {
98
+ for (const dep of stepEdges(step)) {
99
+ const dependents = dependentsOf.get(dep.id) ?? [];
100
+ dependents.push(step.id);
101
+ dependentsOf.set(dep.id, dependents);
102
+ }
103
+ }
104
+ const ready = steps.filter((step) => remainingInDegree.get(step.id) === 0).map((step) => step.id);
105
+ const orderedIds = [];
106
+ while (ready.length > 0) {
107
+ ready.sort((left, right) => (indexById.get(left) ?? 0) - (indexById.get(right) ?? 0));
108
+ const nextId = ready.shift();
109
+ if (nextId === undefined)
110
+ break;
111
+ orderedIds.push(nextId);
112
+ for (const dependentId of dependentsOf.get(nextId) ?? []) {
113
+ const remaining = (remainingInDegree.get(dependentId) ?? 0) - 1;
114
+ remainingInDegree.set(dependentId, remaining);
115
+ if (remaining === 0)
116
+ ready.push(dependentId);
117
+ }
118
+ }
119
+ if (orderedIds.length !== steps.length)
120
+ return null;
121
+ const stepsById = new Map(steps.map((step) => [step.id, step]));
122
+ // SAFETY: every id in `orderedIds` came from the same `steps` array.
123
+ return orderedIds.map((id) => stepsById.get(id));
124
+ }
125
+ export function compilePipelineGraph(steps) {
126
+ const orderedAuthorSteps = topologicalSort(steps);
127
+ const compiledByAuthorStep = new Map(orderedAuthorSteps.map((step) => [step, compileStep(step)]));
128
+ const orderedSteps = orderedAuthorSteps.map((step) => compiledByAuthorStep.get(step));
129
+ const stepGraph = new Map(orderedAuthorSteps.map((step) => {
130
+ const compiled = compiledByAuthorStep.get(step);
131
+ return [compiled, snapshotCompiledStepGraph(step, compiledByAuthorStep)];
132
+ }));
133
+ return { compiledByAuthorStep, orderedSteps, stepGraph };
134
+ }
135
+ //# sourceMappingURL=pipeline-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-graph.js","sourceRoot":"","sources":["../../src/core/pipeline-graph.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnyStep } from \"./pipeline-steps.js\";\nimport {\n STEP_NESTED_PIPELINE,\n STEP_OPTIONS_SCHEMA,\n STEP_REMOTE,\n} from \"./pipeline-step-metadata.js\";\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\nexport type CompiledStep<TOptions extends object = object> = Omit<\n AnyStep<TOptions>,\n \"dependsOn\" | \"optionalDependsOn\" | \"skipAfterFailureOf\"\n>;\n\nexport function 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 compileStep<TOptions extends object>(step: AnyStep<TOptions>): CompiledStep<TOptions> {\n const nestedPipeline = step[STEP_NESTED_PIPELINE];\n const remote = step[STEP_REMOTE];\n const optionsSchema = step[STEP_OPTIONS_SCHEMA];\n const name = step.name;\n const description = step.description;\n const dryRun = step.dryRun;\n const outputSchema = step.outputSchema;\n const skip = step.skip;\n const compiled = {\n id: step.id,\n run: step.run.bind(step),\n };\n if (nestedPipeline !== undefined) {\n Object.assign(compiled, {\n [STEP_NESTED_PIPELINE]: Object.freeze({\n ...nestedPipeline,\n stepIds: Object.freeze([...nestedPipeline.stepIds]),\n }),\n });\n }\n if (remote !== undefined)\n Object.assign(compiled, { [STEP_REMOTE]: Object.freeze({ ...remote }) });\n if (optionsSchema !== undefined)\n Object.assign(compiled, { [STEP_OPTIONS_SCHEMA]: optionsSchema });\n if (name !== undefined) Object.assign(compiled, { name });\n if (description !== undefined) Object.assign(compiled, { description });\n if (dryRun !== undefined) {\n Object.assign(compiled, {\n dryRun: typeof dryRun === \"function\" ? dryRun.bind(step) : dryRun,\n });\n }\n if (outputSchema !== undefined) Object.assign(compiled, { outputSchema });\n if (skip !== undefined) Object.assign(compiled, { skip: skip.bind(step) });\n return Object.freeze(compiled);\n}\n\nfunction snapshotCompiledStepGraph<TOptions extends object>(\n step: AnyStep<TOptions>,\n compiledByAuthorStep: ReadonlyMap<AnyStep<TOptions>, CompiledStep<TOptions>>\n): CompiledStepGraph<TOptions> {\n const compileDependencies = (\n dependencies: readonly AnyStep<TOptions>[] | undefined\n ): readonly CompiledStep<TOptions>[] =>\n Object.freeze(\n (dependencies ?? []).map((dependency) => {\n const compiled = compiledByAuthorStep.get(dependency);\n if (compiled === undefined) {\n throw new Error(`Compiled pipeline graph is missing dependency ${dependency.id}`);\n }\n return compiled;\n })\n );\n return Object.freeze({\n dependsOn: compileDependencies(step.dependsOn),\n optionalDependsOn: compileDependencies(step.optionalDependsOn),\n skipAfterFailureOf: compileDependencies(step.skipAfterFailureOf),\n });\n}\n\nexport function compiledStepGraph<TOptions extends object>(\n compiled: Pick<{ stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph> }, \"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 descriptor as the map key.\n return graph as CompiledStepGraph<TOptions>;\n}\n\n/** Returns every distinct edge into a step, regardless of dependency policy. */\nexport function 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. */\nexport function 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/** Orders steps so every dependency runs before its dependents. */\nexport function 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) break;\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) ready.push(dependentId);\n }\n }\n\n if (orderedIds.length !== steps.length) return null;\n const stepsById = new Map(steps.map((step) => [step.id, step]));\n // SAFETY: every id in `orderedIds` came from the same `steps` array.\n return orderedIds.map((id) => stepsById.get(id) as AnyStep<TOptions>);\n}\n\nexport interface CompiledPipelineGraph<TOptions extends object> {\n readonly compiledByAuthorStep: ReadonlyMap<AnyStep<TOptions>, CompiledStep<TOptions>>;\n readonly orderedSteps: readonly CompiledStep<TOptions>[];\n readonly stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>;\n}\n\nexport function compilePipelineGraph<TOptions extends object>(\n steps: readonly AnyStep<TOptions>[]\n): CompiledPipelineGraph<TOptions> {\n const orderedAuthorSteps = topologicalSort(steps)!;\n const compiledByAuthorStep = new Map<AnyStep<TOptions>, CompiledStep<TOptions>>(\n orderedAuthorSteps.map((step) => [step, compileStep(step)])\n );\n const orderedSteps = orderedAuthorSteps.map((step) => compiledByAuthorStep.get(step)!);\n const stepGraph = new Map<AnyStep, CompiledStepGraph>(\n orderedAuthorSteps.map((step) => {\n const compiled = compiledByAuthorStep.get(step)!;\n return [compiled, snapshotCompiledStepGraph(step, compiledByAuthorStep)];\n })\n );\n return { compiledByAuthorStep, orderedSteps, stepGraph };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare const EXECUTE_COMPILED_RUN: unique symbol;
2
+ /** Marks the exact object returned by `definePipeline` as a compiled pipeline. */
3
+ export declare function brandCompiledPipeline(pipeline: object): void;
4
+ /** True only for the object `definePipeline` returned, not `Object.create` wrappers. */
5
+ export declare function isCompiledPipeline(pipeline: object): boolean;
@@ -0,0 +1,11 @@
1
+ export const EXECUTE_COMPILED_RUN = Symbol("tubeless.executeCompiledRun");
2
+ const compiledPipelines = new WeakSet();
3
+ /** Marks the exact object returned by `definePipeline` as a compiled pipeline. */
4
+ export function brandCompiledPipeline(pipeline) {
5
+ compiledPipelines.add(pipeline);
6
+ }
7
+ /** True only for the object `definePipeline` returned, not `Object.create` wrappers. */
8
+ export function isCompiledPipeline(pipeline) {
9
+ return compiledPipelines.has(pipeline);
10
+ }
11
+ //# sourceMappingURL=pipeline-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-identity.js","sourceRoot":"","sources":["../../src/core/pipeline-identity.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAkB,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAEzF,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAU,CAAC;AAEhD,kFAAkF;AAClF,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC","sourcesContent":["export 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"]}
@@ -0,0 +1,4 @@
1
+ import { type CompiledStepGraph } from "./pipeline-graph.js";
2
+ import type { AnyStep } from "./pipeline-steps.js";
3
+ import { type PipelineMermaidOptions } from "./pipeline-types.js";
4
+ export declare function renderPipelineMermaid<TOptions extends object>(steps: readonly AnyStep<TOptions>[], options: PipelineMermaidOptions, stepGraph?: ReadonlyMap<AnyStep, CompiledStepGraph>): string;
@@ -0,0 +1,56 @@
1
+ import { liveStepGraph, stepEdges } from "./pipeline-graph.js";
2
+ import { PIPELINE_MERMAID_DIRECTIONS } from "./pipeline-types.js";
3
+ function escapeMermaidLabel(value) {
4
+ return value
5
+ .replace(/\r\n?|\n/g, " ")
6
+ .replace(/[\u0000-\u001f\u007f-\u009f]/g, " ")
7
+ .replace(/#/g, "#35;")
8
+ .replace(/&/g, "#38;")
9
+ .replace(/"/g, "#quot;")
10
+ .replace(/</g, "#60;")
11
+ .replace(/>/g, "#62;");
12
+ }
13
+ export function renderPipelineMermaid(steps, options, stepGraph) {
14
+ const direction = options.direction ?? "TD";
15
+ if (!PIPELINE_MERMAID_DIRECTIONS.includes(direction)) {
16
+ throw new Error(`Invalid Mermaid flowchart direction: ${direction}`);
17
+ }
18
+ const nodeIdByStep = new Map(steps.map((step, index) => [step, `step${index}`]));
19
+ const lines = [`flowchart ${direction}`];
20
+ for (const step of steps) {
21
+ const nodeId = nodeIdByStep.get(step);
22
+ const displayName = step.name ?? step.id;
23
+ const label = options.includeDescriptions && step.description
24
+ ? `${displayName} — ${step.description}`
25
+ : displayName;
26
+ lines.push(` ${nodeId}["${escapeMermaidLabel(label)}"]`);
27
+ }
28
+ const edgeLines = [];
29
+ for (const step of steps) {
30
+ const graph = stepGraph?.get(step) ?? liveStepGraph(step);
31
+ const targetId = nodeIdByStep.get(step);
32
+ const required = new Set(graph.dependsOn);
33
+ const optional = new Set(graph.optionalDependsOn);
34
+ const failureGates = new Set(graph.skipAfterFailureOf);
35
+ for (const dependency of stepEdges(step, graph)) {
36
+ const sourceId = nodeIdByStep.get(dependency);
37
+ if (required.has(dependency)) {
38
+ edgeLines.push(` ${sourceId} --> ${targetId}`);
39
+ continue;
40
+ }
41
+ if (optional.has(dependency) && failureGates.has(dependency)) {
42
+ edgeLines.push(` ${sourceId} -. optional input + failure gate .-> ${targetId}`);
43
+ continue;
44
+ }
45
+ if (optional.has(dependency)) {
46
+ edgeLines.push(` ${sourceId} -. optional input .-> ${targetId}`);
47
+ continue;
48
+ }
49
+ edgeLines.push(` ${sourceId} -. failure gate .-> ${targetId}`);
50
+ }
51
+ }
52
+ if (edgeLines.length > 0)
53
+ lines.push("", ...edgeLines);
54
+ return `${lines.join("\n")}\n`;
55
+ }
56
+ //# sourceMappingURL=pipeline-mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-mermaid.js","sourceRoot":"","sources":["../../src/core/pipeline-mermaid.ts"],"names":[],"mappings":"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","sourcesContent":["import { liveStepGraph, stepEdges, type CompiledStepGraph } from \"./pipeline-graph.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { PIPELINE_MERMAID_DIRECTIONS, type PipelineMermaidOptions } from \"./pipeline-types.js\";\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) lines.push(\"\", ...edgeLines);\n return `${lines.join(\"\\n\")}\\n`;\n}\n"]}