tubeless 0.2.11 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/core/child-execution.d.ts +1 -24
  2. package/dist/core/child-execution.js +11 -13
  3. package/dist/core/child-execution.js.map +1 -1
  4. package/dist/core/child-progress.js +7 -2
  5. package/dist/core/child-progress.js.map +1 -1
  6. package/dist/core/iteration.d.ts +27 -0
  7. package/dist/core/iteration.js +111 -0
  8. package/dist/core/iteration.js.map +1 -0
  9. package/dist/core/lifecycle.d.ts +7 -5
  10. package/dist/core/lifecycle.js +36 -4
  11. package/dist/core/lifecycle.js.map +1 -1
  12. package/dist/core/pipeline-artifacts.d.ts +11 -0
  13. package/dist/core/pipeline-artifacts.js +2 -0
  14. package/dist/core/pipeline-artifacts.js.map +1 -0
  15. package/dist/core/pipeline-compiler.d.ts +1 -0
  16. package/dist/core/pipeline-compiler.js +1 -0
  17. package/dist/core/pipeline-compiler.js.map +1 -1
  18. package/dist/core/pipeline-definition-identity.d.ts +2 -2
  19. package/dist/core/pipeline-definition-identity.js +28 -5
  20. package/dist/core/pipeline-definition-identity.js.map +1 -1
  21. package/dist/core/pipeline-execute.d.ts +1 -6
  22. package/dist/core/pipeline-execute.js +28 -215
  23. package/dist/core/pipeline-execute.js.map +1 -1
  24. package/dist/core/pipeline-execution-error.d.ts +35 -0
  25. package/dist/core/pipeline-execution-error.js +195 -0
  26. package/dist/core/pipeline-execution-error.js.map +1 -0
  27. package/dist/core/pipeline-identity.d.ts +1 -0
  28. package/dist/core/pipeline-identity.js +1 -0
  29. package/dist/core/pipeline-identity.js.map +1 -1
  30. package/dist/core/pipeline-mermaid.js +4 -1
  31. package/dist/core/pipeline-mermaid.js.map +1 -1
  32. package/dist/core/pipeline-run-state.d.ts +4 -4
  33. package/dist/core/pipeline-run-state.js +10 -16
  34. package/dist/core/pipeline-run-state.js.map +1 -1
  35. package/dist/core/pipeline-step-executor.d.ts +2 -0
  36. package/dist/core/pipeline-step-executor.js +11 -3
  37. package/dist/core/pipeline-step-executor.js.map +1 -1
  38. package/dist/core/pipeline-steps.d.ts +24 -1
  39. package/dist/core/pipeline-steps.js +62 -0
  40. package/dist/core/pipeline-steps.js.map +1 -1
  41. package/dist/core/pipeline-types.d.ts +28 -3
  42. package/dist/core/pipeline-types.js.map +1 -1
  43. package/dist/core/pipeline.d.ts +4 -1
  44. package/dist/core/pipeline.js +22 -4
  45. package/dist/core/pipeline.js.map +1 -1
  46. package/dist/project/project-compiler.d.ts +3 -31
  47. package/dist/project/project-compiler.js +11 -180
  48. package/dist/project/project-compiler.js.map +1 -1
  49. package/dist/project/project-registry.d.ts +44 -0
  50. package/dist/project/project-registry.js +107 -0
  51. package/dist/project/project-registry.js.map +1 -0
  52. package/dist/project/project-step-graph.d.ts +9 -0
  53. package/dist/project/project-step-graph.js +99 -0
  54. package/dist/project/project-step-graph.js.map +1 -0
  55. package/dist/render/render.js +1 -1
  56. package/dist/render/render.js.map +1 -1
  57. package/dist/reporter/interactive-reporter.js +6 -3
  58. package/dist/reporter/interactive-reporter.js.map +1 -1
  59. package/dist/reporter/live-ticker-frame.d.ts +21 -0
  60. package/dist/reporter/live-ticker-frame.js +196 -0
  61. package/dist/reporter/live-ticker-frame.js.map +1 -0
  62. package/dist/reporter/live-ticker-protocol.d.ts +41 -0
  63. package/dist/reporter/live-ticker-protocol.js +59 -0
  64. package/dist/reporter/live-ticker-protocol.js.map +1 -0
  65. package/dist/reporter/live-ticker-worker.js +11 -25
  66. package/dist/reporter/live-ticker-worker.js.map +1 -1
  67. package/dist/reporter/live-ticker.d.ts +0 -15
  68. package/dist/reporter/live-ticker.js +11 -216
  69. package/dist/reporter/live-ticker.js.map +1 -1
  70. package/dist/reporter/reporter.js +7 -6
  71. package/dist/reporter/reporter.js.map +1 -1
  72. package/dist/run-store/definition-projection.d.ts +8 -0
  73. package/dist/run-store/definition-projection.js +89 -0
  74. package/dist/run-store/definition-projection.js.map +1 -0
  75. package/dist/run-store/run-projection.d.ts +15 -0
  76. package/dist/run-store/run-projection.js +203 -0
  77. package/dist/run-store/run-projection.js.map +1 -0
  78. package/dist/run-store/run-store-codec.d.ts +2 -0
  79. package/dist/run-store/run-store-codec.js +11 -0
  80. package/dist/run-store/run-store-codec.js.map +1 -1
  81. package/dist/run-store/run-store-event-decoder.js +3 -0
  82. package/dist/run-store/run-store-event-decoder.js.map +1 -1
  83. package/dist/run-store/run-store-reader.d.ts +7 -0
  84. package/dist/run-store/run-store-reader.js +31 -0
  85. package/dist/run-store/run-store-reader.js.map +1 -0
  86. package/dist/run-store/run-store-sqlite.js +23 -7
  87. package/dist/run-store/run-store-sqlite.js.map +1 -1
  88. package/dist/run-store/run-store.d.ts +16 -4
  89. package/dist/run-store/run-store.js +14 -263
  90. package/dist/run-store/run-store.js.map +1 -1
  91. package/dist/studio/run-store-ui-api.d.ts +13 -0
  92. package/dist/studio/run-store-ui-api.js +163 -0
  93. package/dist/studio/run-store-ui-api.js.map +1 -0
  94. package/dist/studio/run-store-ui-client-browser.js +2 -2
  95. package/dist/studio/run-store-ui-client-transport.js +28 -3
  96. package/dist/studio/run-store-ui-client-transport.js.map +1 -1
  97. package/dist/studio/run-store-ui-client.d.ts +2 -1
  98. package/dist/studio/run-store-ui-client.js +15 -9
  99. package/dist/studio/run-store-ui-client.js.map +1 -1
  100. package/dist/studio/run-store-ui-http.d.ts +11 -0
  101. package/dist/studio/run-store-ui-http.js +52 -0
  102. package/dist/studio/run-store-ui-http.js.map +1 -1
  103. package/dist/studio/run-store-ui-state.d.ts +1 -1
  104. package/dist/studio/run-store-ui-state.js +10 -28
  105. package/dist/studio/run-store-ui-state.js.map +1 -1
  106. package/dist/studio/run-store-ui.d.ts +5 -11
  107. package/dist/studio/run-store-ui.js +5 -203
  108. package/dist/studio/run-store-ui.js.map +1 -1
  109. package/dist/testing/testing.d.ts +18 -2
  110. package/dist/testing/testing.js +35 -2
  111. package/dist/testing/testing.js.map +1 -1
  112. package/dist/tracing/artifact-metadata.d.ts +28 -0
  113. package/dist/tracing/artifact-metadata.js +105 -0
  114. package/dist/tracing/artifact-metadata.js.map +1 -0
  115. package/dist/tracing/tracing-codec.d.ts +1 -1
  116. package/dist/tracing/tracing-codec.js +1 -1
  117. package/dist/tracing/tracing-codec.js.map +1 -1
  118. package/dist/tracing/tracing-constants.d.ts +1 -1
  119. package/dist/tracing/tracing-constants.js +1 -1
  120. package/dist/tracing/tracing-constants.js.map +1 -1
  121. package/dist/tracing/tracing-contracts.d.ts +3 -1
  122. package/dist/tracing/tracing-contracts.js.map +1 -1
  123. package/dist/tracing/tracing-internal.d.ts +2 -0
  124. package/dist/tracing/tracing-internal.js +36 -13
  125. package/dist/tracing/tracing-internal.js.map +1 -1
  126. package/dist/tracing/tracing-schema.d.ts +330 -49
  127. package/dist/tracing/tracing-schema.js +102 -10
  128. package/dist/tracing/tracing-schema.js.map +1 -1
  129. package/dist/workbench/workbench-command-execution.d.ts +6 -0
  130. package/dist/workbench/workbench-command-execution.js +48 -0
  131. package/dist/workbench/workbench-command-execution.js.map +1 -0
  132. package/dist/workbench/workbench-history.js +11 -18
  133. package/dist/workbench/workbench-history.js.map +1 -1
  134. package/dist/workbench/workbench-launch-session.d.ts +2 -2
  135. package/dist/workbench/workbench-launch-session.js.map +1 -1
  136. package/dist/workbench/workbench-run.d.ts +0 -4
  137. package/dist/workbench/workbench-run.js +3 -47
  138. package/dist/workbench/workbench-run.js.map +1 -1
  139. package/dist/workbench/workbench-studio-launcher.d.ts +27 -0
  140. package/dist/workbench/workbench-studio-launcher.js +95 -0
  141. package/dist/workbench/workbench-studio-launcher.js.map +1 -0
  142. package/dist/workbench/workbench-ui.js +10 -83
  143. package/dist/workbench/workbench-ui.js.map +1 -1
  144. package/docs/README.md +13 -7
  145. package/docs/agent-guide.md +75 -6
  146. package/docs/airflow.md +187 -0
  147. package/docs/api-reference.md +87 -76
  148. package/docs/api-report.json +17 -6
  149. package/docs/artifacts.md +173 -0
  150. package/docs/child-pipeline-composition.md +87 -8
  151. package/docs/comparison.md +20 -0
  152. package/docs/concepts.md +79 -2
  153. package/docs/dagster.md +161 -0
  154. package/docs/inngest.md +163 -0
  155. package/docs/llms.txt +30 -1
  156. package/docs/recipes.md +82 -32
  157. package/docs/remote-step-composition.md +6 -0
  158. package/docs/step-functions.md +190 -0
  159. package/docs/studio.md +31 -12
  160. package/docs/temporal.md +183 -0
  161. package/examples/airflow/contract.ts +46 -0
  162. package/examples/airflow/hosted.ts +70 -0
  163. package/examples/airflow/remote.ts +175 -0
  164. package/examples/airflow/tubeless_example.py +49 -0
  165. package/examples/airflow/worker.ts +24 -0
  166. package/examples/artifact-lineage.ts +70 -0
  167. package/examples/dagster/definitions.py +59 -0
  168. package/examples/dagster/hosted.ts +78 -0
  169. package/examples/dagster/pipeline.ts +62 -0
  170. package/examples/dagster/test_definitions.py +47 -0
  171. package/examples/dagster/tsconfig.build.json +10 -0
  172. package/examples/dagster/worker.ts +22 -0
  173. package/examples/inherited-inputs.ts +28 -0
  174. package/examples/inngest/client.ts +4 -0
  175. package/examples/inngest/functions.ts +65 -0
  176. package/examples/inngest/pipeline.ts +41 -0
  177. package/examples/inngest/send.ts +11 -0
  178. package/examples/inngest/server.ts +17 -0
  179. package/examples/inngest/tsconfig.build.json +10 -0
  180. package/examples/iteration.ts +52 -0
  181. package/examples/parameterized-steps.ts +96 -0
  182. package/examples/project/tubeless.project.ts +50 -0
  183. package/examples/step-functions/handler.ts +110 -0
  184. package/examples/step-functions/input.json +1 -0
  185. package/examples/step-functions/pipeline.ts +41 -0
  186. package/examples/step-functions/state-machine.asl.json +41 -0
  187. package/examples/step-functions/template.json +42 -0
  188. package/examples/step-output-overrides.ts +41 -0
  189. package/examples/temporal/activities.ts +94 -0
  190. package/examples/temporal/client.ts +19 -0
  191. package/examples/temporal/pipeline.ts +41 -0
  192. package/examples/temporal/tsconfig.build.json +10 -0
  193. package/examples/temporal/worker.ts +21 -0
  194. package/examples/temporal/workflows.ts +16 -0
  195. package/package.json +13 -4
  196. package/skills/tubeless/SKILL.md +37 -4
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defaultPipelineContext,\n executePlannedRun,\n PipelineExecutionError,\n resolvePipelineRuntime,\n} from \"./pipeline-execute.js\";\nimport { RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport { compilePipeline } from \"./pipeline-compiler.js\";\nimport type {\n DefaultPipelineResult,\n DefaultPipelineTargets,\n PipelineDefinition,\n StepIds,\n StepsInputOptions,\n StepsOptionsSchema,\n TargetIds,\n} from \"./pipeline-definition.js\";\nimport { PipelineDefinitionError } from \"./pipeline-errors.js\";\nimport { requireOutputs } from \"./pipeline-finalizer.js\";\nimport { brandCompiledPipeline, EXECUTE_COMPILED_RUN } from \"./pipeline-identity.js\";\nimport { renderPipelineMermaid } from \"./pipeline-mermaid.js\";\nimport { buildPipelinePlan } from \"./pipeline-plan.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport type {\n InferSchemaOutput,\n Pipeline,\n PipelineContext,\n PipelineDefinitionSnapshot,\n PipelineMermaidOptions,\n PipelinePlan,\n PipelineRun,\n PipelineRunControls,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\n\nexport { PipelineExecutionError, RUN_MODEL_VERSION };\nexport { isPipelineErrorCode, PIPELINE_ERROR_CODES } from \"./pipeline-types.js\";\nexport { createSteps } from \"./pipeline-steps.js\";\nexport { PipelineDefinitionError, requireOutputs };\nexport type {\n PipelineDefinitionIdentity,\n PipelineDefinitionSnapshot,\n PipelineLogger,\n PipelineContext,\n PipelineRunControls,\n PipelineExecutionContext,\n PipelineStepProgressDetailStatus,\n PipelineStepProgressDetail,\n PipelineStepProgress,\n PipelineStepContext,\n RemoteStepAdapter,\n PipelineErrorPhase,\n PipelineErrorKind,\n PipelineErrorCode,\n PipelineValidationIssue,\n PipelineError,\n PipelineFanOutDiagnostics,\n PipelineFanOutFailure,\n StandardSchemaV1,\n PipelineErrorCause,\n PipelineStepCompleteReport,\n PipelineStepSkippedReport,\n PipelineStepCancelledReport,\n PipelineStepFailedReport,\n PipelineStepReport,\n PipelineStepReportStatus,\n PipelineRunStatus,\n PipelineRun,\n PipelineStepSkipReason,\n StepSkipDecision,\n PipelineStepStatus,\n PipelineStepLifecycleStatus,\n PipelineStepPlannedEvent,\n PipelineStepStartEvent,\n PipelineStepProgressEvent,\n PipelineStepCancelledEvent,\n PipelineStepFailedEvent,\n PipelineStepSkippedEvent,\n PipelineStepCompleteEvent,\n PipelineHooks,\n PipelineStepSelectionReason,\n PipelinePlanStep,\n PipelinePlan,\n PipelineMermaidDirection,\n PipelineMermaidOptions,\n Pipeline,\n PipelineInput,\n PipelineResult,\n} from \"./pipeline-types.js\";\n\nexport type { PipelineDefinition } from \"./pipeline-definition.js\";\n\nexport type { Step, MappedChildProgressOptions } from \"./pipeline-steps.js\";\n\ntype DuplicateStepIds<\n TSteps extends readonly AnyStep[],\n TSeen extends string = never,\n> = TSteps extends readonly [infer THead, ...infer TTail]\n ? THead extends AnyStep\n ? TTail extends readonly AnyStep[]\n ? THead[\"id\"] extends TSeen\n ? THead[\"id\"] | DuplicateStepIds<TTail, TSeen>\n : DuplicateStepIds<TTail, TSeen | THead[\"id\"]>\n : never\n : never\n : never;\n\ntype CheckedStepTuple<TSteps extends readonly AnyStep[]> =\n string extends StepIds<TSteps>\n ? unknown\n : DuplicateStepIds<TSteps> extends never\n ? unknown\n : {\n /** Compile-time diagnostic: every literal step ID in a definition must be unique. */\n readonly __duplicateStepIds: DuplicateStepIds<TSteps>;\n };\n\nfunction normalizeRunControls<TStepId extends string, TTargetId extends string>(\n controls: PipelineRunControls<TStepId, TTargetId>\n): PipelineRunControls<TStepId, TTargetId> {\n const { continueOnError, dryRun, maxConcurrency, stepIds, targets } = controls;\n const snapshot: PipelineRunControls<TStepId, TTargetId> = {};\n if (continueOnError !== undefined) snapshot.continueOnError = continueOnError;\n if (dryRun !== undefined) snapshot.dryRun = dryRun;\n if (maxConcurrency !== undefined) snapshot.maxConcurrency = maxConcurrency;\n if (stepIds !== undefined) snapshot.stepIds = [...stepIds];\n if (targets !== undefined) snapshot.targets = [...targets];\n return snapshot;\n}\n\n/**\n * Compile a typed step graph into a validated, executable pipeline.\n * Prefer inferred type arguments to preserve the literal id. For an explicit\n * result contract, annotate the finalizer's return type; partially supplied type\n * arguments use defaults for remaining parameters, including the id's string type.\n */\nexport function definePipeline<\n const TSteps extends readonly AnyStep[],\n TResult = DefaultPipelineResult<TSteps>,\n const TTargets extends readonly TSteps[number][] = DefaultPipelineTargets<TSteps>,\n const TResultSchema extends StandardSchemaV1 | undefined = undefined,\n const TId extends string = string,\n>(\n definition: PipelineDefinition<TSteps, TResult, TTargets, TResultSchema> &\n CheckedStepTuple<TSteps> & { readonly id: TId }\n): Pipeline<\n StepsInputOptions<TSteps>,\n TResultSchema extends StandardSchemaV1 ? InferSchemaOutput<TResultSchema> : TResult,\n StepIds<TSteps>,\n TargetIds<TTargets>,\n TId\n> & {\n readonly definition: PipelineDefinitionSnapshot;\n readonly optionsSchema: StepsOptionsSchema<TSteps>;\n} {\n const compiled = compilePipeline<TSteps, TResult, TTargets, TResultSchema>(definition);\n type TInputOptions = StepsInputOptions<TSteps>;\n type TPipelineResult = TResultSchema extends StandardSchemaV1\n ? InferSchemaOutput<TResultSchema>\n : TResult;\n type TStepId = StepIds<TSteps>;\n type TTargetId = TargetIds<TTargets>;\n // SAFETY: each compiled step id is a string key of `TSteps`.\n const stepIds = compiled.stepIds as readonly TStepId[];\n // SAFETY: each compiled target id is a string key of `TTargets`.\n const targetIds = compiled.targetIds as readonly TTargetId[];\n\n function prepareRun(controls: PipelineRunControls<TStepId, TTargetId>): {\n controls: PipelineRunControls<TStepId, TTargetId>;\n plan: PipelinePlan;\n } {\n const normalizedControls = normalizeRunControls(controls);\n return {\n controls: normalizedControls,\n plan: buildPipelinePlan(compiled, normalizedControls),\n };\n }\n\n function plan(controls: PipelineRunControls<TStepId, TTargetId> = {}): PipelinePlan {\n return prepareRun(controls).plan;\n }\n\n function toMermaid(options: PipelineMermaidOptions = {}): string {\n return renderPipelineMermaid(compiled.orderedSteps, options, compiled.stepGraph);\n }\n\n async function executeCompiled(\n runPlan: PipelinePlan,\n options: TInputOptions,\n controls: PipelineRunControls<TStepId, TTargetId>,\n context: Partial<PipelineContext> = defaultPipelineContext()\n ): Promise<PipelineRun<TPipelineResult>> {\n return executePlannedRun({\n compiled,\n controls,\n domainOptions: options,\n plan: runPlan,\n runtime: resolvePipelineRuntime(context),\n });\n }\n\n async function run(\n options: TInputOptions,\n controls: PipelineRunControls<TStepId, TTargetId> = {},\n context: Partial<PipelineContext> = defaultPipelineContext()\n ): Promise<PipelineRun<TPipelineResult>> {\n const prepared = prepareRun(controls);\n return executeCompiled(prepared.plan, options, prepared.controls, context);\n }\n\n async function runOrThrow(\n options: TInputOptions,\n controls: PipelineRunControls<TStepId, TTargetId> = {},\n context: Partial<PipelineContext> = defaultPipelineContext()\n ): Promise<TPipelineResult> {\n const result = await run(options, controls, context);\n if (result.status !== \"completed\") {\n throw new PipelineExecutionError(result);\n }\n // SAFETY: a completed run always carries its `TPipelineResult` value.\n return result.value as TPipelineResult;\n }\n\n const pipeline = {\n id: definition.id,\n ...(definition.name === undefined ? {} : { name: definition.name }),\n ...(definition.description === undefined ? {} : { description: definition.description }),\n definition: compiled.definition,\n // SAFETY: compilation verifies that every step belongs to the same options schema.\n optionsSchema: compiled.optionsSchema as StepsOptionsSchema<TSteps> &\n (StandardSchemaV1 | undefined),\n stepIds,\n targetIds,\n plan,\n run,\n runOrThrow,\n toMermaid,\n };\n Object.defineProperty(pipeline, EXECUTE_COMPILED_RUN, { value: executeCompiled });\n brandCompiledPipeline(pipeline);\n return pipeline;\n}\n"]}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAUzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAcvD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,CAAC;AA+EnD,SAAS,oBAAoB,CAC3B,QAAiD;IAEjD,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC/E,MAAM,QAAQ,GAA4C,EAAE,CAAC;IAC7D,IAAI,eAAe,KAAK,SAAS;QAAE,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;IAC9E,IAAI,MAAM,KAAK,SAAS;QAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACnD,IAAI,cAAc,KAAK,SAAS;QAAE,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAC;IAC3E,IAAI,OAAO,KAAK,SAAS;QAAE,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,SAAS;QAAE,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAO5B,UACiD;IAWjD,MAAM,QAAQ,GAAG,eAAe,CAA2C,UAAU,CAAC,CAAC;IAOvF,6DAA6D;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAA6B,CAAC;IACvD,iEAAiE;IACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAiC,CAAC;IAE7D,SAAS,UAAU,CAAC,QAAiD;QAInE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC1D,OAAO;YACL,QAAQ,EAAE,kBAAkB;YAC5B,IAAI,EAAE,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,CAAC;SACtD,CAAC;IACJ,CAAC;IAED,SAAS,IAAI,CAAC,QAAQ,GAA4C,EAAE;QAClE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,SAAS,SAAS,CAAC,OAAO,GAA2B,EAAE;QACrD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,UAAU,eAAe,CAC5B,OAAqB,EACrB,OAAsB,EACtB,QAAiD,EACjD,OAAO,GAA6B,sBAAsB,EAAE,EAC5D,SAAyC;QAEzC,OAAO,iBAAiB,CAAC;YACvB,QAAQ;YACR,QAAQ;YACR,aAAa,EAAE,OAAO;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC;YACxC,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,GAAG,CAChB,OAAuB,EACvB,QAAQ,GAA4C,EAAE,EACtD,OAAO,GAA6B,sBAAsB,EAAE;QAE5D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAE,EAAoB,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,UAAU,UAAU,CACvB,OAAuB,EACvB,QAAQ,GAA4C,EAAE,EACtD,OAAO,GAA6B,sBAAsB,EAAE;QAE5D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,sEAAsE;QACtE,OAAO,MAAM,CAAC,KAAwB,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;QACnE,GAAG,CAAC,UAAU,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;QACxF,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,mFAAmF;QACnF,aAAa,EAAE,QAAQ,CAAC,aACQ;QAChC,OAAO;QACP,SAAS;QACT,IAAI;QACJ,GAAG;QACH,UAAU;QACV,SAAS;KACV,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;IAClF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE;QAChD,KAAK,EAAE,CACL,OAAsB,EACtB,QAAiD,EACjD,OAAiC,EACjC,SAAwC,EACxC,EAAE;YACF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;gBACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7D,IAAI,CAAC,YAAY;oBACf,MAAM,IAAI,SAAS,CACjB,iBAAiB,IAAI,CAAC,EAAE,gCAAgC,QAAQ,CAAC,EAAE,EAAE,CACtE,CAAC;gBACJ,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,eAAe,CACpB,QAAQ,CAAC,IAAI,EACb,OAAO,KAAK,SAAS,CAAC,CAAC,CAAE,EAAoB,CAAC,CAAC,CAAC,OAAO,EACvD,QAAQ,CAAC,QAAQ,EACjB,OAAO,EACP,QAAQ,CACT,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IACH,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { PipelineExecutionError } from \"./pipeline-execution-error.js\";\nimport {\n defaultPipelineContext,\n executePlannedRun,\n resolvePipelineRuntime,\n} from \"./pipeline-execute.js\";\nimport { RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport { compilePipeline } from \"./pipeline-compiler.js\";\nimport type {\n DefaultPipelineResult,\n DefaultPipelineTargets,\n PipelineDefinition,\n StepIds,\n StepsInputOptions,\n StepsOptionsSchema,\n TargetIds,\n} from \"./pipeline-definition.js\";\nimport { PipelineDefinitionError } from \"./pipeline-errors.js\";\nimport { requireOutputs } from \"./pipeline-finalizer.js\";\nimport {\n brandCompiledPipeline,\n EXECUTE_COMPILED_RUN,\n EXECUTE_TEST_RUN,\n} from \"./pipeline-identity.js\";\nimport { renderPipelineMermaid } from \"./pipeline-mermaid.js\";\nimport { buildPipelinePlan } from \"./pipeline-plan.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport type {\n InferSchemaOutput,\n Pipeline,\n PipelineContext,\n PipelineDefinitionSnapshot,\n PipelineMermaidOptions,\n PipelinePlan,\n PipelineRun,\n PipelineRunControls,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\n\nexport { PipelineExecutionError, RUN_MODEL_VERSION };\nexport { isPipelineErrorCode, PIPELINE_ERROR_CODES } from \"./pipeline-types.js\";\nexport { createSteps } from \"./pipeline-steps.js\";\nexport type { IterationDecision, IterationState } from \"./iteration.js\";\nexport { PipelineDefinitionError, requireOutputs };\nexport type {\n PipelineDefinitionIdentity,\n PipelineDefinitionSnapshot,\n PipelineLogger,\n PipelineContext,\n PipelineRunControls,\n PipelineExecutionContext,\n PipelineStepProgressDetailStatus,\n PipelineStepProgressDetail,\n PipelineStepProgress,\n PipelineStepContext,\n RemoteStepAdapter,\n PipelineErrorPhase,\n PipelineErrorKind,\n PipelineErrorCode,\n PipelineValidationIssue,\n PipelineError,\n PipelineFanOutDiagnostics,\n PipelineFanOutFailure,\n StandardSchemaV1,\n PipelineErrorCause,\n PipelineStepCompleteReport,\n PipelineStepSkippedReport,\n PipelineStepCancelledReport,\n PipelineStepFailedReport,\n PipelineStepReport,\n PipelineStepReportStatus,\n PipelineRunStatus,\n PipelineRun,\n PipelineStepSkipReason,\n StepSkipDecision,\n PipelineStepStatus,\n PipelineStepLifecycleStatus,\n PipelineStepPlannedEvent,\n PipelineStepStartEvent,\n PipelineStepProgressEvent,\n PipelineStepCancelledEvent,\n PipelineStepFailedEvent,\n PipelineStepSkippedEvent,\n PipelineStepCompleteEvent,\n PipelineHooks,\n PipelineStepSelectionReason,\n PipelinePlanStep,\n PipelinePlan,\n PipelineMermaidDirection,\n PipelineMermaidOptions,\n Pipeline,\n PipelineInput,\n PipelineResult,\n} from \"./pipeline-types.js\";\n\nexport type { PipelineDefinition } from \"./pipeline-definition.js\";\n\nexport type { Step, MappedChildProgressOptions } from \"./pipeline-steps.js\";\n\ntype DuplicateStepIds<\n TSteps extends readonly AnyStep[],\n TSeen extends string = never,\n> = TSteps extends readonly [infer THead, ...infer TTail]\n ? THead extends AnyStep\n ? TTail extends readonly AnyStep[]\n ? THead[\"id\"] extends TSeen\n ? THead[\"id\"] | DuplicateStepIds<TTail, TSeen>\n : DuplicateStepIds<TTail, TSeen | THead[\"id\"]>\n : never\n : never\n : never;\n\ntype CheckedStepTuple<TSteps extends readonly AnyStep[]> =\n string extends StepIds<TSteps>\n ? unknown\n : DuplicateStepIds<TSteps> extends never\n ? unknown\n : {\n /** Compile-time diagnostic: every literal step ID in a definition must be unique. */\n readonly __duplicateStepIds: DuplicateStepIds<TSteps>;\n };\n\nfunction normalizeRunControls<TStepId extends string, TTargetId extends string>(\n controls: PipelineRunControls<TStepId, TTargetId>\n): PipelineRunControls<TStepId, TTargetId> {\n const { continueOnError, dryRun, maxConcurrency, stepIds, targets } = controls;\n const snapshot: PipelineRunControls<TStepId, TTargetId> = {};\n if (continueOnError !== undefined) snapshot.continueOnError = continueOnError;\n if (dryRun !== undefined) snapshot.dryRun = dryRun;\n if (maxConcurrency !== undefined) snapshot.maxConcurrency = maxConcurrency;\n if (stepIds !== undefined) snapshot.stepIds = [...stepIds];\n if (targets !== undefined) snapshot.targets = [...targets];\n return snapshot;\n}\n\n/**\n * Compile a typed step graph into a validated, executable pipeline.\n * Prefer inferred type arguments to preserve the literal id. For an explicit\n * result contract, annotate the finalizer's return type; partially supplied type\n * arguments use defaults for remaining parameters, including the id's string type.\n */\nexport function definePipeline<\n const TSteps extends readonly AnyStep[],\n TResult = DefaultPipelineResult<TSteps>,\n const TTargets extends readonly TSteps[number][] = DefaultPipelineTargets<TSteps>,\n const TResultSchema extends StandardSchemaV1 | undefined = undefined,\n const TId extends string = string,\n>(\n definition: PipelineDefinition<TSteps, TResult, TTargets, TResultSchema> &\n CheckedStepTuple<TSteps> & { readonly id: TId }\n): Pipeline<\n StepsInputOptions<TSteps>,\n TResultSchema extends StandardSchemaV1 ? InferSchemaOutput<TResultSchema> : TResult,\n StepIds<TSteps>,\n TargetIds<TTargets>,\n TId\n> & {\n readonly definition: PipelineDefinitionSnapshot;\n readonly optionsSchema: StepsOptionsSchema<TSteps>;\n} {\n const compiled = compilePipeline<TSteps, TResult, TTargets, TResultSchema>(definition);\n type TInputOptions = StepsInputOptions<TSteps>;\n type TPipelineResult = TResultSchema extends StandardSchemaV1\n ? InferSchemaOutput<TResultSchema>\n : TResult;\n type TStepId = StepIds<TSteps>;\n type TTargetId = TargetIds<TTargets>;\n // SAFETY: each compiled step id is a string key of `TSteps`.\n const stepIds = compiled.stepIds as readonly TStepId[];\n // SAFETY: each compiled target id is a string key of `TTargets`.\n const targetIds = compiled.targetIds as readonly TTargetId[];\n\n function prepareRun(controls: PipelineRunControls<TStepId, TTargetId>): {\n controls: PipelineRunControls<TStepId, TTargetId>;\n plan: PipelinePlan;\n } {\n const normalizedControls = normalizeRunControls(controls);\n return {\n controls: normalizedControls,\n plan: buildPipelinePlan(compiled, normalizedControls),\n };\n }\n\n function plan(controls: PipelineRunControls<TStepId, TTargetId> = {}): PipelinePlan {\n return prepareRun(controls).plan;\n }\n\n function toMermaid(options: PipelineMermaidOptions = {}): string {\n return renderPipelineMermaid(compiled.orderedSteps, options, compiled.stepGraph);\n }\n\n async function executeCompiled(\n runPlan: PipelinePlan,\n options: TInputOptions,\n controls: PipelineRunControls<TStepId, TTargetId>,\n context: Partial<PipelineContext> = defaultPipelineContext(),\n overrides?: ReadonlyMap<AnyStep, unknown>\n ): Promise<PipelineRun<TPipelineResult>> {\n return executePlannedRun({\n compiled,\n controls,\n domainOptions: options,\n plan: runPlan,\n runtime: resolvePipelineRuntime(context),\n overrides,\n });\n }\n\n async function run(\n options?: TInputOptions,\n controls: PipelineRunControls<TStepId, TTargetId> = {},\n context: Partial<PipelineContext> = defaultPipelineContext()\n ): Promise<PipelineRun<TPipelineResult>> {\n const prepared = prepareRun(controls);\n // SAFETY: the public signature permits omission only when {} satisfies the\n // input type. Schemas still validate the default object during execution.\n const input = options === undefined ? ({} as TInputOptions) : options;\n return executeCompiled(prepared.plan, input, prepared.controls, context);\n }\n\n async function runOrThrow(\n options?: TInputOptions,\n controls: PipelineRunControls<TStepId, TTargetId> = {},\n context: Partial<PipelineContext> = defaultPipelineContext()\n ): Promise<TPipelineResult> {\n const result = await run(options, controls, context);\n if (result.status !== \"completed\") {\n throw new PipelineExecutionError(result);\n }\n // SAFETY: a completed run always carries its `TPipelineResult` value.\n return result.value as TPipelineResult;\n }\n\n const pipeline = {\n id: definition.id,\n ...(definition.name === undefined ? {} : { name: definition.name }),\n ...(definition.description === undefined ? {} : { description: definition.description }),\n definition: compiled.definition,\n // SAFETY: compilation verifies that every step belongs to the same options schema.\n optionsSchema: compiled.optionsSchema as StepsOptionsSchema<TSteps> &\n (StandardSchemaV1 | undefined),\n stepIds,\n targetIds,\n plan,\n run,\n runOrThrow,\n toMermaid,\n };\n Object.defineProperty(pipeline, EXECUTE_COMPILED_RUN, { value: executeCompiled });\n Object.defineProperty(pipeline, EXECUTE_TEST_RUN, {\n value: (\n options: TInputOptions,\n controls: PipelineRunControls<TStepId, TTargetId>,\n context: Partial<PipelineContext>,\n overrides: ReadonlyMap<AnyStep, unknown>\n ) => {\n const resolved = new Map<AnyStep, unknown>();\n for (const [step, value] of overrides) {\n const compiledStep = compiled.compiledByAuthorStep.get(step);\n if (!compiledStep)\n throw new TypeError(\n `Override step ${step.id} does not belong to pipeline ${compiled.id}`\n );\n resolved.set(compiledStep, value);\n }\n const prepared = prepareRun(controls);\n return executeCompiled(\n prepared.plan,\n options === undefined ? ({} as TInputOptions) : options,\n prepared.controls,\n context,\n resolved\n );\n },\n });\n brandCompiledPipeline(pipeline);\n return pipeline;\n}\n\nexport type {\n ArtifactJsonValue,\n ArtifactMetadata,\n ArtifactRecord,\n} from \"../tracing/artifact-metadata.js\";\nexport type { ArtifactLoader, ArtifactSaver, ArtifactResult } from \"./pipeline-artifacts.js\";\n"]}
@@ -1,6 +1,8 @@
1
- import { type MappedChildProgressOptions, type Pipeline, type PipelineExecutionContext, type PipelineRun, type PipelineRunControls, type PipelineStepContext, type StandardSchemaV1, type StepSkipDecision } from "../core/pipeline.js";
1
+ import { type Pipeline } from "../core/pipeline.js";
2
+ import { type ProjectRegistry } from "./project-registry.js";
2
3
  import { PipelineDocumentError, type PipelineDocumentMetadata } from "./project-document.js";
3
4
  export { PipelineDocumentError };
5
+ export type { ProjectRegistry } from "./project-registry.js";
4
6
  /** Immutable compiled pipelines and descriptive metadata from a parsed document. */
5
7
  export interface CompiledPipelineDocument {
6
8
  readonly pipelines: readonly Pipeline<object, unknown>[];
@@ -8,36 +10,6 @@ export interface CompiledPipelineDocument {
8
10
  /** Return the shared compiled instance, or throw if the document has no such id. */
9
11
  get(id: string): Pipeline<object, unknown>;
10
12
  }
11
- /** Dependency values are checked at runtime rather than inferred from a project document. */
12
- type PipelineDocumentHandler = (inputs: Record<string, unknown>, context: PipelineStepContext<object>) => unknown;
13
- type PipelineDocumentFinalizer = (outputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => unknown;
14
- type PipelineDocumentSkipPredicate = (inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => StepSkipDecision | Promise<StepSkipDecision>;
15
- /** Application-owned wiring for one declarative `fromPipeline` step. */
16
- interface PipelineDocumentFromPipelineAdapter {
17
- controls?: PipelineRunControls | ((inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => PipelineRunControls);
18
- mapOptions(inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): object;
19
- mapResult?(value: unknown, result: PipelineRun<unknown>, context: PipelineStepContext<object>): unknown;
20
- }
21
- /** Application-owned wiring for one declarative `forEachPipeline` step. */
22
- interface PipelineDocumentForEachPipelineAdapter {
23
- controls?: PipelineRunControls | ((item: unknown, index: number, inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => PipelineRunControls);
24
- items(inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): readonly unknown[] | Promise<readonly unknown[]>;
25
- key(item: unknown, index: number): string;
26
- concurrency?: number | ((inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => number);
27
- progress?: MappedChildProgressOptions;
28
- mapOptions(item: unknown, index: number, inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): object;
29
- mapResult?(value: unknown, result: PipelineRun<unknown>, item: unknown, index: number, context: PipelineStepContext<object>): unknown;
30
- }
31
- /** Only explicitly registered functions and schemas can be referenced by a document. */
32
- export interface ProjectRegistry {
33
- steps: Readonly<Record<string, PipelineDocumentHandler>>;
34
- finalizers: Readonly<Record<string, PipelineDocumentFinalizer>>;
35
- skipPredicates?: Readonly<Record<string, PipelineDocumentSkipPredicate>>;
36
- fromPipelineAdapters?: Readonly<Record<string, PipelineDocumentFromPipelineAdapter>>;
37
- forEachPipelineAdapters?: Readonly<Record<string, PipelineDocumentForEachPipelineAdapter>>;
38
- optionsSchemas?: Readonly<Record<string, StandardSchemaV1<object, object>>>;
39
- schemas?: Readonly<Record<string, StandardSchemaV1>>;
40
- }
41
13
  /**
42
14
  * Compile parsed YAML or JSON into ordinary pipelines. Does not load modules,
43
15
  * invoke handlers or schemas, or perform I/O. Graph validation belongs to core.
@@ -1,91 +1,15 @@
1
- import { createSteps, definePipeline, requireOutputs, } from "../core/pipeline.js";
1
+ import { definePipeline, requireOutputs } from "../core/pipeline.js";
2
+ import { ProjectRegistryResolver } from "./project-registry.js";
3
+ import { compileDocumentSteps } from "./project-step-graph.js";
2
4
  import { validatePipelineDocument, PipelineDocumentError, } from "./project-document.js";
3
5
  export { PipelineDocumentError };
4
- function resolve(registry, name, path) {
5
- if (!registry || !Object.hasOwn(registry, name)) {
6
- throw new PipelineDocumentError(path, `Unknown registered name ${JSON.stringify(name)}`);
7
- }
8
- return registry[name];
9
- }
10
- function handler(registry, name, path) {
11
- const value = resolve(registry, name, path);
12
- if (typeof value !== "function")
13
- throw new PipelineDocumentError(path, "Expected a registered function");
14
- return value;
15
- }
16
- function schema(registry, name, path) {
17
- if (name === undefined)
18
- return undefined;
19
- const value = resolve(registry, name, path);
20
- if (!value ||
21
- value["~standard"]?.version !== 1 ||
22
- typeof value["~standard"].validate !== "function") {
23
- throw new PipelineDocumentError(path, "Expected a Standard Schema v1 schema");
24
- }
25
- return value;
26
- }
27
- function registeredObject(registry, name, path) {
28
- const value = resolve(registry, name, path);
29
- if (typeof value !== "object" || value === null || Array.isArray(value)) {
30
- throw new PipelineDocumentError(path, "Expected a registered adapter object");
31
- }
32
- return value;
33
- }
34
- function fromPipelineAdapter(registry, name, path) {
35
- const adapter = registeredObject(registry, name, path);
36
- if (typeof adapter.mapOptions !== "function") {
37
- throw new PipelineDocumentError(path, "Expected an adapter with mapOptions");
38
- }
39
- if (adapter.controls !== undefined &&
40
- typeof adapter.controls !== "function" &&
41
- (typeof adapter.controls !== "object" || adapter.controls === null)) {
42
- throw new PipelineDocumentError(path, "Expected adapter controls to be an object or function");
43
- }
44
- if (adapter.mapResult !== undefined && typeof adapter.mapResult !== "function") {
45
- throw new PipelineDocumentError(path, "Expected adapter mapResult to be a function");
46
- }
47
- return {
48
- controls: adapter.controls,
49
- mapOptions: adapter.mapOptions,
50
- mapResult: adapter.mapResult,
51
- };
52
- }
53
- function forEachPipelineAdapter(registry, name, path) {
54
- const adapter = registeredObject(registry, name, path);
55
- if (typeof adapter.items !== "function" ||
56
- typeof adapter.key !== "function" ||
57
- typeof adapter.mapOptions !== "function") {
58
- throw new PipelineDocumentError(path, "Expected an adapter with items, key, and mapOptions");
59
- }
60
- if (adapter.concurrency !== undefined &&
61
- typeof adapter.concurrency !== "number" &&
62
- typeof adapter.concurrency !== "function") {
63
- throw new PipelineDocumentError(path, "Expected adapter concurrency to be a number or function");
64
- }
65
- if (adapter.controls !== undefined &&
66
- typeof adapter.controls !== "function" &&
67
- (typeof adapter.controls !== "object" || adapter.controls === null)) {
68
- throw new PipelineDocumentError(path, "Expected adapter controls to be an object or function");
69
- }
70
- if (adapter.mapResult !== undefined && typeof adapter.mapResult !== "function") {
71
- throw new PipelineDocumentError(path, "Expected adapter mapResult to be a function");
72
- }
73
- return {
74
- items: adapter.items,
75
- key: adapter.key,
76
- controls: adapter.controls,
77
- concurrency: adapter.concurrency,
78
- progress: adapter.progress,
79
- mapOptions: adapter.mapOptions,
80
- mapResult: adapter.mapResult,
81
- };
82
- }
83
6
  /**
84
7
  * Compile parsed YAML or JSON into ordinary pipelines. Does not load modules,
85
8
  * invoke handlers or schemas, or perform I/O. Graph validation belongs to core.
86
9
  */
87
10
  export function compilePipelineDocument(document, registry) {
88
11
  const parsed = validatePipelineDocument(document);
12
+ const resolvedRegistry = new ProjectRegistryResolver(registry);
89
13
  const compiled = new Map();
90
14
  const compiling = new Set();
91
15
  const resolvePipeline = (id, path) => {
@@ -104,112 +28,19 @@ export function compilePipelineDocument(document, registry) {
104
28
  const definition = parsed.pipelines[id];
105
29
  const path = `$.pipelines[${JSON.stringify(id)}]`;
106
30
  compiling.add(id);
107
- const optionsSchema = schema(registry.optionsSchemas, definition.optionsSchema, `${path}.optionsSchema`);
108
- const factory = createSteps(optionsSchema);
109
- const entries = definition.steps.map((definition, index) => {
110
- const stepPath = `${path}.steps[${index}]`;
111
- // Populate these arrays after all steps exist, allowing forward references
112
- // and leaving cycle detection to the existing definition validator.
113
- const dependsOn = [];
114
- const optionalDependsOn = [];
115
- const skipAfterFailureOf = [];
116
- const dryRun = definition.dryRun === undefined || definition.dryRun === "skip"
117
- ? definition.dryRun
118
- : handler(registry.steps, definition.dryRun.run, `${stepPath}.dryRun.run`);
119
- const outputSchema = schema(registry.schemas, definition.outputSchema, `${stepPath}.outputSchema`);
120
- const common = {
121
- name: definition.name,
122
- description: definition.description,
123
- dependsOn,
124
- optionalDependsOn,
125
- skipAfterFailureOf,
126
- };
127
- const skip = definition.skip === undefined
128
- ? undefined
129
- : handler(registry.skipPredicates ?? {}, definition.skip, `${stepPath}.skip`);
130
- let built;
131
- if (definition.run !== undefined) {
132
- const config = {
133
- ...common,
134
- dryRun,
135
- run: handler(registry.steps, definition.run, `${stepPath}.run`),
136
- skip,
137
- };
138
- built = outputSchema
139
- ? factory.step(definition.id, { ...config, outputSchema })
140
- : factory.step(definition.id, config);
141
- }
142
- else if (definition.fromPipeline !== undefined) {
143
- const reference = definition.fromPipeline;
144
- const adapter = fromPipelineAdapter(registry.fromPipelineAdapters, reference.adapter, `${stepPath}.fromPipeline.adapter`);
145
- const config = {
146
- ...common,
147
- dryRun: definition.dryRun,
148
- pipeline: resolvePipeline(reference.pipeline, `${stepPath}.fromPipeline.pipeline`),
149
- controls: adapter.controls,
150
- mapOptions: adapter.mapOptions,
151
- skip,
152
- };
153
- built =
154
- adapter.mapResult === undefined
155
- ? factory.fromPipeline(definition.id, config)
156
- : factory.fromPipeline(definition.id, { ...config, mapResult: adapter.mapResult });
157
- }
158
- else {
159
- const reference = definition.forEachPipeline;
160
- const adapter = forEachPipelineAdapter(registry.forEachPipelineAdapters, reference.adapter, `${stepPath}.forEachPipeline.adapter`);
161
- // SAFETY: document pipelines publish unknown values. The fan-out builder
162
- // still represents a valued skip as the complete unknown result array.
163
- const fanOutSkip = skip;
164
- const config = {
165
- ...common,
166
- dryRun: definition.dryRun,
167
- pipeline: resolvePipeline(reference.pipeline, `${stepPath}.forEachPipeline.pipeline`),
168
- items: adapter.items,
169
- key: adapter.key,
170
- concurrency: adapter.concurrency,
171
- controls: adapter.controls,
172
- progress: adapter.progress,
173
- mapOptions: adapter.mapOptions,
174
- skip: fanOutSkip,
175
- };
176
- built =
177
- adapter.mapResult === undefined
178
- ? factory.forEachPipeline(definition.id, config)
179
- : factory.forEachPipeline(definition.id, { ...config, mapResult: adapter.mapResult });
180
- }
181
- return {
182
- definition,
183
- path: stepPath,
184
- dependsOn,
185
- optionalDependsOn,
186
- skipAfterFailureOf,
187
- step: built,
188
- };
189
- });
190
- const byId = new Map(entries.map((entry) => [entry.step.id, entry.step]));
191
- const resolveSteps = (ids = [], fieldPath) => ids.map((stepId, index) => {
192
- const found = byId.get(stepId);
193
- if (!found)
194
- throw new PipelineDocumentError(`${fieldPath}[${index}]`, `Unknown step ${JSON.stringify(stepId)}`);
195
- return found;
196
- });
197
- for (const entry of entries) {
198
- for (const field of ["dependsOn", "optionalDependsOn", "skipAfterFailureOf"]) {
199
- entry[field].push(...resolveSteps(entry.definition[field], `${entry.path}.${field}`));
200
- }
201
- }
202
- const finalize = handler(registry.finalizers, definition.finalize.run, `${path}.finalize.run`);
31
+ const optionsSchema = resolvedRegistry.optionsSchema(definition.optionsSchema, `${path}.optionsSchema`);
32
+ const graph = compileDocumentSteps(definition.steps, optionsSchema, resolvedRegistry, resolvePipeline, path);
33
+ const finalize = resolvedRegistry.finalizer(definition.finalize.run, `${path}.finalize.run`);
203
34
  const pipeline = definePipeline({
204
35
  id,
205
36
  name: definition.name,
206
37
  description: definition.description,
207
- steps: entries.map((entry) => entry.step),
208
- targets: resolveSteps(definition.targets, `${path}.targets`),
209
- resultSchema: schema(registry.schemas, definition.resultSchema, `${path}.resultSchema`),
38
+ steps: graph.steps,
39
+ targets: graph.resolve(definition.targets, `${path}.targets`),
40
+ resultSchema: resolvedRegistry.outputSchema(definition.resultSchema, `${path}.resultSchema`),
210
41
  finalize: definition.finalize.requireOutputs === undefined
211
42
  ? finalize
212
- : requireOutputs(resolveSteps(definition.finalize.requireOutputs, `${path}.finalize.requireOutputs`), finalize),
43
+ : requireOutputs(graph.resolve(definition.finalize.requireOutputs, `${path}.finalize.requireOutputs`), finalize),
213
44
  });
214
45
  compiled.set(id, pipeline);
215
46
  compiling.delete(id);
@@ -1 +1 @@
1
- {"version":3,"file":"project-compiler.js","sourceRoot":"","sources":["../../src/project/project-compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createSteps,\n definePipeline,\n requireOutputs,\n type MappedChildProgressOptions,\n type Pipeline,\n type PipelineExecutionContext,\n type PipelineRun,\n type PipelineRunControls,\n type PipelineStepContext,\n type StandardSchemaV1,\n type StepSkipDecision,\n} from \"../core/pipeline.js\";\nimport type { AnyStep } from \"../core/pipeline-steps.js\";\nimport {\n validatePipelineDocument,\n PipelineDocumentError,\n type PipelineDocumentMetadata,\n} from \"./project-document.js\";\n\nexport { PipelineDocumentError };\n\n/** Immutable compiled pipelines and descriptive metadata from a parsed document. */\nexport interface CompiledPipelineDocument {\n readonly pipelines: readonly Pipeline<object, unknown>[];\n readonly metadata?: PipelineDocumentMetadata;\n /** Return the shared compiled instance, or throw if the document has no such id. */\n get(id: string): Pipeline<object, unknown>;\n}\n\n/** Dependency values are checked at runtime rather than inferred from a project document. */\ntype PipelineDocumentHandler = (\n inputs: Record<string, unknown>,\n context: PipelineStepContext<object>\n) => unknown;\n\ntype PipelineDocumentFinalizer = (\n outputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n) => unknown;\n\ntype PipelineDocumentSkipPredicate = (\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n) => StepSkipDecision | Promise<StepSkipDecision>;\n\n/** Application-owned wiring for one declarative `fromPipeline` step. */\ninterface PipelineDocumentFromPipelineAdapter {\n controls?:\n | PipelineRunControls\n | ((\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ) => PipelineRunControls);\n mapOptions(inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<object>\n ): unknown;\n}\n\n/** Application-owned wiring for one declarative `forEachPipeline` step. */\ninterface PipelineDocumentForEachPipelineAdapter {\n controls?:\n | PipelineRunControls\n | ((\n item: unknown,\n index: number,\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ) => PipelineRunControls);\n items(\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ): readonly unknown[] | Promise<readonly unknown[]>;\n key(item: unknown, index: number): string;\n concurrency?:\n | number\n | ((inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => number);\n progress?: MappedChildProgressOptions;\n mapOptions(\n item: unknown,\n index: number,\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<object>\n ): unknown;\n}\n\n/** Only explicitly registered functions and schemas can be referenced by a document. */\nexport interface ProjectRegistry {\n steps: Readonly<Record<string, PipelineDocumentHandler>>;\n finalizers: Readonly<Record<string, PipelineDocumentFinalizer>>;\n skipPredicates?: Readonly<Record<string, PipelineDocumentSkipPredicate>>;\n fromPipelineAdapters?: Readonly<Record<string, PipelineDocumentFromPipelineAdapter>>;\n forEachPipelineAdapters?: Readonly<Record<string, PipelineDocumentForEachPipelineAdapter>>;\n optionsSchemas?: Readonly<Record<string, StandardSchemaV1<object, object>>>;\n schemas?: Readonly<Record<string, StandardSchemaV1>>;\n}\n\nfunction resolve<T>(\n registry: Readonly<Record<string, T>> | undefined,\n name: string,\n path: string\n): T {\n if (!registry || !Object.hasOwn(registry, name)) {\n throw new PipelineDocumentError(path, `Unknown registered name ${JSON.stringify(name)}`);\n }\n return registry[name];\n}\n\nfunction handler<T extends PipelineDocumentHandler | PipelineDocumentFinalizer>(\n registry: Readonly<Record<string, T>>,\n name: string,\n path: string\n): T {\n const value = resolve(registry, name, path);\n if (typeof value !== \"function\")\n throw new PipelineDocumentError(path, \"Expected a registered function\");\n return value;\n}\n\nfunction schema<T extends StandardSchemaV1>(\n registry: Readonly<Record<string, T>> | undefined,\n name: string | undefined,\n path: string\n): T | undefined {\n if (name === undefined) return undefined;\n const value = resolve(registry, name, path);\n if (\n !value ||\n value[\"~standard\"]?.version !== 1 ||\n typeof value[\"~standard\"].validate !== \"function\"\n ) {\n throw new PipelineDocumentError(path, \"Expected a Standard Schema v1 schema\");\n }\n return value;\n}\n\nfunction registeredObject<T extends object>(\n registry: Readonly<Record<string, T>> | undefined,\n name: string,\n path: string\n): T {\n const value = resolve(registry, name, path);\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new PipelineDocumentError(path, \"Expected a registered adapter object\");\n }\n return value;\n}\n\nfunction fromPipelineAdapter(\n registry: ProjectRegistry[\"fromPipelineAdapters\"],\n name: string,\n path: string\n): PipelineDocumentFromPipelineAdapter {\n const adapter = registeredObject(registry, name, path);\n if (typeof adapter.mapOptions !== \"function\") {\n throw new PipelineDocumentError(path, \"Expected an adapter with mapOptions\");\n }\n if (\n adapter.controls !== undefined &&\n typeof adapter.controls !== \"function\" &&\n (typeof adapter.controls !== \"object\" || adapter.controls === null)\n ) {\n throw new PipelineDocumentError(path, \"Expected adapter controls to be an object or function\");\n }\n if (adapter.mapResult !== undefined && typeof adapter.mapResult !== \"function\") {\n throw new PipelineDocumentError(path, \"Expected adapter mapResult to be a function\");\n }\n return {\n controls: adapter.controls,\n mapOptions: adapter.mapOptions,\n mapResult: adapter.mapResult,\n };\n}\n\nfunction forEachPipelineAdapter(\n registry: ProjectRegistry[\"forEachPipelineAdapters\"],\n name: string,\n path: string\n): PipelineDocumentForEachPipelineAdapter {\n const adapter = registeredObject(registry, name, path);\n if (\n typeof adapter.items !== \"function\" ||\n typeof adapter.key !== \"function\" ||\n typeof adapter.mapOptions !== \"function\"\n ) {\n throw new PipelineDocumentError(path, \"Expected an adapter with items, key, and mapOptions\");\n }\n if (\n adapter.concurrency !== undefined &&\n typeof adapter.concurrency !== \"number\" &&\n typeof adapter.concurrency !== \"function\"\n ) {\n throw new PipelineDocumentError(\n path,\n \"Expected adapter concurrency to be a number or function\"\n );\n }\n if (\n adapter.controls !== undefined &&\n typeof adapter.controls !== \"function\" &&\n (typeof adapter.controls !== \"object\" || adapter.controls === null)\n ) {\n throw new PipelineDocumentError(path, \"Expected adapter controls to be an object or function\");\n }\n if (adapter.mapResult !== undefined && typeof adapter.mapResult !== \"function\") {\n throw new PipelineDocumentError(path, \"Expected adapter mapResult to be a function\");\n }\n return {\n items: adapter.items,\n key: adapter.key,\n controls: adapter.controls,\n concurrency: adapter.concurrency,\n progress: adapter.progress,\n mapOptions: adapter.mapOptions,\n mapResult: adapter.mapResult,\n };\n}\n\n/**\n * Compile parsed YAML or JSON into ordinary pipelines. Does not load modules,\n * invoke handlers or schemas, or perform I/O. Graph validation belongs to core.\n */\nexport function compilePipelineDocument(\n document: unknown,\n registry: ProjectRegistry\n): CompiledPipelineDocument {\n const parsed = validatePipelineDocument(document);\n const compiled = new Map<string, Pipeline<object, unknown>>();\n const compiling = new Set<string>();\n\n const resolvePipeline = (id: string, path: string): Pipeline<object, unknown> => {\n if (!Object.hasOwn(parsed.pipelines, id)) {\n throw new PipelineDocumentError(path, `Unknown pipeline ${JSON.stringify(id)}`);\n }\n if (compiling.has(id)) {\n throw new PipelineDocumentError(\n path,\n `Pipeline composition cycle through ${JSON.stringify(id)}`\n );\n }\n return compile(id);\n };\n\n const compile = (id: string): Pipeline<object, unknown> => {\n const existing = compiled.get(id);\n if (existing) return existing;\n const definition = parsed.pipelines[id]!;\n const path = `$.pipelines[${JSON.stringify(id)}]`;\n compiling.add(id);\n const optionsSchema = schema(\n registry.optionsSchemas,\n definition.optionsSchema,\n `${path}.optionsSchema`\n );\n const factory = createSteps(optionsSchema);\n const entries = definition.steps.map((definition, index) => {\n const stepPath = `${path}.steps[${index}]`;\n // Populate these arrays after all steps exist, allowing forward references\n // and leaving cycle detection to the existing definition validator.\n const dependsOn: AnyStep[] = [];\n const optionalDependsOn: AnyStep[] = [];\n const skipAfterFailureOf: AnyStep[] = [];\n const dryRun =\n definition.dryRun === undefined || definition.dryRun === \"skip\"\n ? definition.dryRun\n : handler(registry.steps, definition.dryRun.run, `${stepPath}.dryRun.run`);\n const outputSchema = schema(\n registry.schemas,\n definition.outputSchema,\n `${stepPath}.outputSchema`\n );\n const common = {\n name: definition.name,\n description: definition.description,\n dependsOn,\n optionalDependsOn,\n skipAfterFailureOf,\n };\n const skip =\n definition.skip === undefined\n ? undefined\n : handler(registry.skipPredicates ?? {}, definition.skip, `${stepPath}.skip`);\n let built: AnyStep<object>;\n if (definition.run !== undefined) {\n const config = {\n ...common,\n dryRun,\n run: handler(registry.steps, definition.run, `${stepPath}.run`),\n skip,\n };\n built = outputSchema\n ? factory.step(definition.id, { ...config, outputSchema })\n : factory.step(definition.id, config);\n } else if (definition.fromPipeline !== undefined) {\n const reference = definition.fromPipeline;\n const adapter = fromPipelineAdapter(\n registry.fromPipelineAdapters,\n reference.adapter,\n `${stepPath}.fromPipeline.adapter`\n );\n const config = {\n ...common,\n dryRun: definition.dryRun,\n pipeline: resolvePipeline(reference.pipeline, `${stepPath}.fromPipeline.pipeline`),\n controls: adapter.controls,\n mapOptions: adapter.mapOptions,\n skip,\n };\n built =\n adapter.mapResult === undefined\n ? factory.fromPipeline(definition.id, config)\n : factory.fromPipeline(definition.id, { ...config, mapResult: adapter.mapResult });\n } else {\n const reference = definition.forEachPipeline;\n const adapter = forEachPipelineAdapter(\n registry.forEachPipelineAdapters,\n reference.adapter,\n `${stepPath}.forEachPipeline.adapter`\n );\n // SAFETY: document pipelines publish unknown values. The fan-out builder\n // still represents a valued skip as the complete unknown result array.\n const fanOutSkip = skip as\n | ((\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ) =>\n | StepSkipDecision<readonly unknown[]>\n | Promise<StepSkipDecision<readonly unknown[]>>)\n | undefined;\n const config = {\n ...common,\n dryRun: definition.dryRun,\n pipeline: resolvePipeline(reference.pipeline, `${stepPath}.forEachPipeline.pipeline`),\n items: adapter.items,\n key: adapter.key,\n concurrency: adapter.concurrency,\n controls: adapter.controls,\n progress: adapter.progress,\n mapOptions: adapter.mapOptions,\n skip: fanOutSkip,\n };\n built =\n adapter.mapResult === undefined\n ? factory.forEachPipeline(definition.id, config)\n : factory.forEachPipeline(definition.id, { ...config, mapResult: adapter.mapResult });\n }\n return {\n definition,\n path: stepPath,\n dependsOn,\n optionalDependsOn,\n skipAfterFailureOf,\n step: built,\n };\n });\n const byId = new Map(entries.map((entry) => [entry.step.id, entry.step]));\n const resolveSteps = (ids: readonly string[] = [], fieldPath: string): AnyStep[] =>\n ids.map((stepId, index) => {\n const found = byId.get(stepId);\n if (!found)\n throw new PipelineDocumentError(\n `${fieldPath}[${index}]`,\n `Unknown step ${JSON.stringify(stepId)}`\n );\n return found;\n });\n for (const entry of entries) {\n for (const field of [\"dependsOn\", \"optionalDependsOn\", \"skipAfterFailureOf\"] as const) {\n entry[field].push(...resolveSteps(entry.definition[field], `${entry.path}.${field}`));\n }\n }\n const finalize = handler(registry.finalizers, definition.finalize.run, `${path}.finalize.run`);\n const pipeline = definePipeline({\n id,\n name: definition.name,\n description: definition.description,\n steps: entries.map((entry) => entry.step),\n targets: resolveSteps(definition.targets, `${path}.targets`),\n resultSchema: schema(registry.schemas, definition.resultSchema, `${path}.resultSchema`),\n finalize:\n definition.finalize.requireOutputs === undefined\n ? finalize\n : requireOutputs(\n resolveSteps(definition.finalize.requireOutputs, `${path}.finalize.requireOutputs`),\n finalize\n ),\n });\n compiled.set(id, pipeline);\n compiling.delete(id);\n return pipeline;\n };\n\n const pipelines = Object.freeze(Object.keys(parsed.pipelines).map(compile));\n const metadata =\n parsed.metadata === undefined\n ? undefined\n : Object.freeze({\n ...parsed.metadata,\n authors:\n parsed.metadata.authors === undefined\n ? undefined\n : Object.freeze([...parsed.metadata.authors]),\n });\n return Object.freeze({\n pipelines,\n ...(metadata === undefined ? {} : { metadata }),\n get(id: string): Pipeline<object, unknown> {\n const pipeline = compiled.get(id);\n if (!pipeline) {\n throw new Error(`Compiled document does not define pipeline ${JSON.stringify(id)}.`);\n }\n return pipeline;\n },\n });\n}\n"]}
1
+ {"version":3,"file":"project-compiler.js","sourceRoot":"","sources":["../../src/project/project-compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import { definePipeline, requireOutputs, type Pipeline } from \"../core/pipeline.js\";\nimport { ProjectRegistryResolver, type ProjectRegistry } from \"./project-registry.js\";\nimport { compileDocumentSteps } from \"./project-step-graph.js\";\nimport {\n validatePipelineDocument,\n PipelineDocumentError,\n type PipelineDocumentMetadata,\n} from \"./project-document.js\";\n\nexport { PipelineDocumentError };\nexport type { ProjectRegistry } from \"./project-registry.js\";\n\n/** Immutable compiled pipelines and descriptive metadata from a parsed document. */\nexport interface CompiledPipelineDocument {\n readonly pipelines: readonly Pipeline<object, unknown>[];\n readonly metadata?: PipelineDocumentMetadata;\n /** Return the shared compiled instance, or throw if the document has no such id. */\n get(id: string): Pipeline<object, unknown>;\n}\n\n/**\n * Compile parsed YAML or JSON into ordinary pipelines. Does not load modules,\n * invoke handlers or schemas, or perform I/O. Graph validation belongs to core.\n */\nexport function compilePipelineDocument(\n document: unknown,\n registry: ProjectRegistry\n): CompiledPipelineDocument {\n const parsed = validatePipelineDocument(document);\n const resolvedRegistry = new ProjectRegistryResolver(registry);\n const compiled = new Map<string, Pipeline<object, unknown>>();\n const compiling = new Set<string>();\n\n const resolvePipeline = (id: string, path: string): Pipeline<object, unknown> => {\n if (!Object.hasOwn(parsed.pipelines, id)) {\n throw new PipelineDocumentError(path, `Unknown pipeline ${JSON.stringify(id)}`);\n }\n if (compiling.has(id)) {\n throw new PipelineDocumentError(\n path,\n `Pipeline composition cycle through ${JSON.stringify(id)}`\n );\n }\n return compile(id);\n };\n\n const compile = (id: string): Pipeline<object, unknown> => {\n const existing = compiled.get(id);\n if (existing) return existing;\n const definition = parsed.pipelines[id]!;\n const path = `$.pipelines[${JSON.stringify(id)}]`;\n compiling.add(id);\n const optionsSchema = resolvedRegistry.optionsSchema(\n definition.optionsSchema,\n `${path}.optionsSchema`\n );\n const graph = compileDocumentSteps(\n definition.steps,\n optionsSchema,\n resolvedRegistry,\n resolvePipeline,\n path\n );\n const finalize = resolvedRegistry.finalizer(definition.finalize.run, `${path}.finalize.run`);\n const pipeline = definePipeline({\n id,\n name: definition.name,\n description: definition.description,\n steps: graph.steps,\n targets: graph.resolve(definition.targets, `${path}.targets`),\n resultSchema: resolvedRegistry.outputSchema(definition.resultSchema, `${path}.resultSchema`),\n finalize:\n definition.finalize.requireOutputs === undefined\n ? finalize\n : requireOutputs(\n graph.resolve(definition.finalize.requireOutputs, `${path}.finalize.requireOutputs`),\n finalize\n ),\n });\n compiled.set(id, pipeline);\n compiling.delete(id);\n return pipeline;\n };\n\n const pipelines = Object.freeze(Object.keys(parsed.pipelines).map(compile));\n const metadata =\n parsed.metadata === undefined\n ? undefined\n : Object.freeze({\n ...parsed.metadata,\n authors:\n parsed.metadata.authors === undefined\n ? undefined\n : Object.freeze([...parsed.metadata.authors]),\n });\n return Object.freeze({\n pipelines,\n ...(metadata === undefined ? {} : { metadata }),\n get(id: string): Pipeline<object, unknown> {\n const pipeline = compiled.get(id);\n if (!pipeline) {\n throw new Error(`Compiled document does not define pipeline ${JSON.stringify(id)}.`);\n }\n return pipeline;\n },\n });\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import type { MappedChildProgressOptions, PipelineExecutionContext, PipelineRun, PipelineRunControls, PipelineStepContext, StandardSchemaV1, StepSkipDecision } from "../core/pipeline.js";
2
+ /** Dependency values are checked at runtime rather than inferred from a project document. */
3
+ type PipelineDocumentHandler = (inputs: Record<string, unknown>, context: PipelineStepContext<object>) => unknown;
4
+ type PipelineDocumentFinalizer = (outputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => unknown;
5
+ type PipelineDocumentSkipPredicate = (inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => StepSkipDecision | Promise<StepSkipDecision>;
6
+ /** Application-owned wiring for one declarative `fromPipeline` step. */
7
+ interface PipelineDocumentFromPipelineAdapter {
8
+ controls?: PipelineRunControls | ((inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => PipelineRunControls);
9
+ mapOptions(inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): object;
10
+ mapResult?(value: unknown, result: PipelineRun<unknown>, context: PipelineStepContext<object>): unknown;
11
+ }
12
+ /** Application-owned wiring for one declarative `forEachPipeline` step. */
13
+ interface PipelineDocumentForEachPipelineAdapter {
14
+ controls?: PipelineRunControls | ((item: unknown, index: number, inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => PipelineRunControls);
15
+ items(inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): readonly unknown[] | Promise<readonly unknown[]>;
16
+ key(item: unknown, index: number): string;
17
+ concurrency?: number | ((inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => number);
18
+ progress?: MappedChildProgressOptions;
19
+ mapOptions(item: unknown, index: number, inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): object;
20
+ mapResult?(value: unknown, result: PipelineRun<unknown>, item: unknown, index: number, context: PipelineStepContext<object>): unknown;
21
+ }
22
+ /** Only explicitly registered functions and schemas can be referenced by a document. */
23
+ export interface ProjectRegistry {
24
+ steps: Readonly<Record<string, PipelineDocumentHandler>>;
25
+ finalizers: Readonly<Record<string, PipelineDocumentFinalizer>>;
26
+ skipPredicates?: Readonly<Record<string, PipelineDocumentSkipPredicate>>;
27
+ fromPipelineAdapters?: Readonly<Record<string, PipelineDocumentFromPipelineAdapter>>;
28
+ forEachPipelineAdapters?: Readonly<Record<string, PipelineDocumentForEachPipelineAdapter>>;
29
+ optionsSchemas?: Readonly<Record<string, StandardSchemaV1<object, object>>>;
30
+ schemas?: Readonly<Record<string, StandardSchemaV1>>;
31
+ }
32
+ /** Resolve application wiring without constructing pipelines or invoking application code. */
33
+ export declare class ProjectRegistryResolver {
34
+ #private;
35
+ constructor(registry: ProjectRegistry);
36
+ step(name: string, path: string): PipelineDocumentHandler;
37
+ finalizer(name: string, path: string): PipelineDocumentFinalizer;
38
+ skip(name: string | undefined, path: string): PipelineDocumentSkipPredicate | undefined;
39
+ optionsSchema(name: string | undefined, path: string): StandardSchemaV1<object, object> | undefined;
40
+ outputSchema(name: string | undefined, path: string): StandardSchemaV1 | undefined;
41
+ singleChild(name: string, path: string): PipelineDocumentFromPipelineAdapter;
42
+ mappedChild(name: string, path: string): PipelineDocumentForEachPipelineAdapter;
43
+ }
44
+ export {};
@@ -0,0 +1,107 @@
1
+ import { PipelineDocumentError } from "./project-document.js";
2
+ function resolve(registry, name, path) {
3
+ if (!registry || !Object.hasOwn(registry, name)) {
4
+ throw new PipelineDocumentError(path, `Unknown registered name ${JSON.stringify(name)}`);
5
+ }
6
+ return registry[name];
7
+ }
8
+ function handler(registry, name, path) {
9
+ const value = resolve(registry, name, path);
10
+ if (typeof value !== "function")
11
+ throw new PipelineDocumentError(path, "Expected a registered function");
12
+ return value;
13
+ }
14
+ function schema(registry, name, path) {
15
+ if (name === undefined)
16
+ return undefined;
17
+ const value = resolve(registry, name, path);
18
+ if (!value ||
19
+ value["~standard"]?.version !== 1 ||
20
+ typeof value["~standard"].validate !== "function") {
21
+ throw new PipelineDocumentError(path, "Expected a Standard Schema v1 schema");
22
+ }
23
+ return value;
24
+ }
25
+ function registeredObject(registry, name, path) {
26
+ const value = resolve(registry, name, path);
27
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
28
+ throw new PipelineDocumentError(path, "Expected a registered adapter object");
29
+ }
30
+ return value;
31
+ }
32
+ function validateAdapterMapping(adapter, path) {
33
+ if (adapter.controls !== undefined &&
34
+ typeof adapter.controls !== "function" &&
35
+ (typeof adapter.controls !== "object" || adapter.controls === null)) {
36
+ throw new PipelineDocumentError(path, "Expected adapter controls to be an object or function");
37
+ }
38
+ if (adapter.mapResult !== undefined && typeof adapter.mapResult !== "function") {
39
+ throw new PipelineDocumentError(path, "Expected adapter mapResult to be a function");
40
+ }
41
+ }
42
+ function fromPipelineAdapter(registry, name, path) {
43
+ const adapter = registeredObject(registry, name, path);
44
+ if (typeof adapter.mapOptions !== "function") {
45
+ throw new PipelineDocumentError(path, "Expected an adapter with mapOptions");
46
+ }
47
+ validateAdapterMapping(adapter, path);
48
+ return {
49
+ controls: adapter.controls,
50
+ mapOptions: adapter.mapOptions,
51
+ mapResult: adapter.mapResult,
52
+ };
53
+ }
54
+ function forEachPipelineAdapter(registry, name, path) {
55
+ const adapter = registeredObject(registry, name, path);
56
+ if (typeof adapter.items !== "function" ||
57
+ typeof adapter.key !== "function" ||
58
+ typeof adapter.mapOptions !== "function") {
59
+ throw new PipelineDocumentError(path, "Expected an adapter with items, key, and mapOptions");
60
+ }
61
+ if (adapter.concurrency !== undefined &&
62
+ typeof adapter.concurrency !== "number" &&
63
+ typeof adapter.concurrency !== "function") {
64
+ throw new PipelineDocumentError(path, "Expected adapter concurrency to be a number or function");
65
+ }
66
+ validateAdapterMapping(adapter, path);
67
+ return {
68
+ items: adapter.items,
69
+ key: adapter.key,
70
+ controls: adapter.controls,
71
+ concurrency: adapter.concurrency,
72
+ progress: adapter.progress,
73
+ mapOptions: adapter.mapOptions,
74
+ mapResult: adapter.mapResult,
75
+ };
76
+ }
77
+ /** Resolve application wiring without constructing pipelines or invoking application code. */
78
+ export class ProjectRegistryResolver {
79
+ #registry;
80
+ constructor(registry) {
81
+ this.#registry = registry;
82
+ }
83
+ step(name, path) {
84
+ return handler(this.#registry.steps, name, path);
85
+ }
86
+ finalizer(name, path) {
87
+ return handler(this.#registry.finalizers, name, path);
88
+ }
89
+ skip(name, path) {
90
+ return name === undefined
91
+ ? undefined
92
+ : handler(this.#registry.skipPredicates ?? {}, name, path);
93
+ }
94
+ optionsSchema(name, path) {
95
+ return schema(this.#registry.optionsSchemas, name, path);
96
+ }
97
+ outputSchema(name, path) {
98
+ return schema(this.#registry.schemas, name, path);
99
+ }
100
+ singleChild(name, path) {
101
+ return fromPipelineAdapter(this.#registry.fromPipelineAdapters, name, path);
102
+ }
103
+ mappedChild(name, path) {
104
+ return forEachPipelineAdapter(this.#registry.forEachPipelineAdapters, name, path);
105
+ }
106
+ }
107
+ //# sourceMappingURL=project-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../../src/project/project-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n MappedChildProgressOptions,\n PipelineExecutionContext,\n PipelineRun,\n PipelineRunControls,\n PipelineStepContext,\n StandardSchemaV1,\n StepSkipDecision,\n} from \"../core/pipeline.js\";\nimport { PipelineDocumentError } from \"./project-document.js\";\n\n/** Dependency values are checked at runtime rather than inferred from a project document. */\ntype PipelineDocumentHandler = (\n inputs: Record<string, unknown>,\n context: PipelineStepContext<object>\n) => unknown;\n\ntype PipelineDocumentFinalizer = (\n outputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n) => unknown;\n\ntype PipelineDocumentSkipPredicate = (\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n) => StepSkipDecision | Promise<StepSkipDecision>;\n\n/** Application-owned wiring for one declarative `fromPipeline` step. */\ninterface PipelineDocumentFromPipelineAdapter {\n controls?:\n | PipelineRunControls\n | ((\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ) => PipelineRunControls);\n mapOptions(inputs: Record<string, unknown>, context: PipelineExecutionContext<object>): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<object>\n ): unknown;\n}\n\n/** Application-owned wiring for one declarative `forEachPipeline` step. */\ninterface PipelineDocumentForEachPipelineAdapter {\n controls?:\n | PipelineRunControls\n | ((\n item: unknown,\n index: number,\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ) => PipelineRunControls);\n items(\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ): readonly unknown[] | Promise<readonly unknown[]>;\n key(item: unknown, index: number): string;\n concurrency?:\n | number\n | ((inputs: Record<string, unknown>, context: PipelineExecutionContext<object>) => number);\n progress?: MappedChildProgressOptions;\n mapOptions(\n item: unknown,\n index: number,\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<object>\n ): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<object>\n ): unknown;\n}\n\n/** Only explicitly registered functions and schemas can be referenced by a document. */\nexport interface ProjectRegistry {\n steps: Readonly<Record<string, PipelineDocumentHandler>>;\n finalizers: Readonly<Record<string, PipelineDocumentFinalizer>>;\n skipPredicates?: Readonly<Record<string, PipelineDocumentSkipPredicate>>;\n fromPipelineAdapters?: Readonly<Record<string, PipelineDocumentFromPipelineAdapter>>;\n forEachPipelineAdapters?: Readonly<Record<string, PipelineDocumentForEachPipelineAdapter>>;\n optionsSchemas?: Readonly<Record<string, StandardSchemaV1<object, object>>>;\n schemas?: Readonly<Record<string, StandardSchemaV1>>;\n}\n\nfunction resolve<T>(\n registry: Readonly<Record<string, T>> | undefined,\n name: string,\n path: string\n): T {\n if (!registry || !Object.hasOwn(registry, name)) {\n throw new PipelineDocumentError(path, `Unknown registered name ${JSON.stringify(name)}`);\n }\n return registry[name];\n}\n\nfunction handler<T extends PipelineDocumentHandler | PipelineDocumentFinalizer>(\n registry: Readonly<Record<string, T>>,\n name: string,\n path: string\n): T {\n const value = resolve(registry, name, path);\n if (typeof value !== \"function\")\n throw new PipelineDocumentError(path, \"Expected a registered function\");\n return value;\n}\n\nfunction schema<T extends StandardSchemaV1>(\n registry: Readonly<Record<string, T>> | undefined,\n name: string | undefined,\n path: string\n): T | undefined {\n if (name === undefined) return undefined;\n const value = resolve(registry, name, path);\n if (\n !value ||\n value[\"~standard\"]?.version !== 1 ||\n typeof value[\"~standard\"].validate !== \"function\"\n ) {\n throw new PipelineDocumentError(path, \"Expected a Standard Schema v1 schema\");\n }\n return value;\n}\n\nfunction registeredObject<T extends object>(\n registry: Readonly<Record<string, T>> | undefined,\n name: string,\n path: string\n): T {\n const value = resolve(registry, name, path);\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new PipelineDocumentError(path, \"Expected a registered adapter object\");\n }\n return value;\n}\n\nfunction validateAdapterMapping(\n adapter: { controls?: unknown; mapResult?: unknown },\n path: string\n): void {\n if (\n adapter.controls !== undefined &&\n typeof adapter.controls !== \"function\" &&\n (typeof adapter.controls !== \"object\" || adapter.controls === null)\n ) {\n throw new PipelineDocumentError(path, \"Expected adapter controls to be an object or function\");\n }\n if (adapter.mapResult !== undefined && typeof adapter.mapResult !== \"function\") {\n throw new PipelineDocumentError(path, \"Expected adapter mapResult to be a function\");\n }\n}\n\nfunction fromPipelineAdapter(\n registry: ProjectRegistry[\"fromPipelineAdapters\"],\n name: string,\n path: string\n): PipelineDocumentFromPipelineAdapter {\n const adapter = registeredObject(registry, name, path);\n if (typeof adapter.mapOptions !== \"function\") {\n throw new PipelineDocumentError(path, \"Expected an adapter with mapOptions\");\n }\n validateAdapterMapping(adapter, path);\n return {\n controls: adapter.controls,\n mapOptions: adapter.mapOptions,\n mapResult: adapter.mapResult,\n };\n}\n\nfunction forEachPipelineAdapter(\n registry: ProjectRegistry[\"forEachPipelineAdapters\"],\n name: string,\n path: string\n): PipelineDocumentForEachPipelineAdapter {\n const adapter = registeredObject(registry, name, path);\n if (\n typeof adapter.items !== \"function\" ||\n typeof adapter.key !== \"function\" ||\n typeof adapter.mapOptions !== \"function\"\n ) {\n throw new PipelineDocumentError(path, \"Expected an adapter with items, key, and mapOptions\");\n }\n if (\n adapter.concurrency !== undefined &&\n typeof adapter.concurrency !== \"number\" &&\n typeof adapter.concurrency !== \"function\"\n ) {\n throw new PipelineDocumentError(\n path,\n \"Expected adapter concurrency to be a number or function\"\n );\n }\n validateAdapterMapping(adapter, path);\n return {\n items: adapter.items,\n key: adapter.key,\n controls: adapter.controls,\n concurrency: adapter.concurrency,\n progress: adapter.progress,\n mapOptions: adapter.mapOptions,\n mapResult: adapter.mapResult,\n };\n}\n\n/** Resolve application wiring without constructing pipelines or invoking application code. */\nexport class ProjectRegistryResolver {\n readonly #registry: ProjectRegistry;\n\n constructor(registry: ProjectRegistry) {\n this.#registry = registry;\n }\n\n step(name: string, path: string): PipelineDocumentHandler {\n return handler(this.#registry.steps, name, path);\n }\n\n finalizer(name: string, path: string): PipelineDocumentFinalizer {\n return handler(this.#registry.finalizers, name, path);\n }\n\n skip(name: string | undefined, path: string): PipelineDocumentSkipPredicate | undefined {\n return name === undefined\n ? undefined\n : handler(this.#registry.skipPredicates ?? {}, name, path);\n }\n\n optionsSchema(\n name: string | undefined,\n path: string\n ): StandardSchemaV1<object, object> | undefined {\n return schema(this.#registry.optionsSchemas, name, path);\n }\n\n outputSchema(name: string | undefined, path: string): StandardSchemaV1 | undefined {\n return schema(this.#registry.schemas, name, path);\n }\n\n singleChild(name: string, path: string): PipelineDocumentFromPipelineAdapter {\n return fromPipelineAdapter(this.#registry.fromPipelineAdapters, name, path);\n }\n\n mappedChild(name: string, path: string): PipelineDocumentForEachPipelineAdapter {\n return forEachPipelineAdapter(this.#registry.forEachPipelineAdapters, name, path);\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { type Pipeline, type StandardSchemaV1 } from "../core/pipeline.js";
2
+ import type { AnyStep } from "../core/pipeline-steps.js";
3
+ import { type PipelineDocumentStep } from "./project-document.js";
4
+ import type { ProjectRegistryResolver } from "./project-registry.js";
5
+ /** Build and link one document's step graph; mutable forward-reference arrays stay local. */
6
+ export declare function compileDocumentSteps(definitions: readonly PipelineDocumentStep[], optionsSchema: StandardSchemaV1<object, object> | undefined, registry: ProjectRegistryResolver, resolvePipeline: (id: string, path: string) => Pipeline<object, unknown>, path: string): {
7
+ readonly steps: readonly AnyStep[];
8
+ resolve(ids: readonly string[] | undefined, fieldPath: string): AnyStep[];
9
+ };