tubeless 0.3.1 → 0.3.2

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 (61) hide show
  1. package/dist/agent/node-environment.d.ts +10 -2
  2. package/dist/agent/node-environment.js +9 -4
  3. package/dist/agent/node-environment.js.map +1 -1
  4. package/dist/core/child-execution.js +10 -6
  5. package/dist/core/child-execution.js.map +1 -1
  6. package/dist/core/pipeline-steps.js +6 -1
  7. package/dist/core/pipeline-steps.js.map +1 -1
  8. package/dist/project/project-registry.js +4 -0
  9. package/dist/project/project-registry.js.map +1 -1
  10. package/dist/run-store/run-history.d.ts +11 -0
  11. package/dist/run-store/run-history.js +62 -5
  12. package/dist/run-store/run-history.js.map +1 -1
  13. package/dist/run-store/run-projection.js +9 -0
  14. package/dist/run-store/run-projection.js.map +1 -1
  15. package/dist/run-store/run-store-schema.js +11 -1
  16. package/dist/run-store/run-store-schema.js.map +1 -1
  17. package/dist/run-store/run-store.d.ts +11 -1
  18. package/dist/run-store/run-store.js.map +1 -1
  19. package/dist/studio/run-store-ui-client-browser.js +4 -2
  20. package/dist/studio/run-store-ui-client.d.ts +4 -5
  21. package/dist/studio/run-store-ui-client.js +6 -59
  22. package/dist/studio/run-store-ui-client.js.map +1 -1
  23. package/dist/studio/run-store-ui-data-controller.d.ts +1 -0
  24. package/dist/studio/run-store-ui-data-controller.js +1 -1
  25. package/dist/studio/run-store-ui-data-controller.js.map +1 -1
  26. package/dist/studio/run-store-ui-graph-layout.d.ts +32 -0
  27. package/dist/studio/run-store-ui-graph-layout.js +77 -0
  28. package/dist/studio/run-store-ui-graph-layout.js.map +1 -0
  29. package/dist/studio/run-store-ui-graph.d.ts +10 -0
  30. package/dist/studio/run-store-ui-graph.js +546 -0
  31. package/dist/studio/run-store-ui-graph.js.map +1 -0
  32. package/dist/studio/run-store-ui-page.js +117 -0
  33. package/dist/studio/run-store-ui-page.js.map +1 -1
  34. package/dist/studio/run-store-ui-steps.d.ts +19 -0
  35. package/dist/studio/run-store-ui-steps.js +58 -0
  36. package/dist/studio/run-store-ui-steps.js.map +1 -0
  37. package/dist/tracing/tracing-contracts.d.ts +8 -0
  38. package/dist/tracing/tracing-contracts.js.map +1 -1
  39. package/dist/tracing/tracing-internal.js +3 -0
  40. package/dist/tracing/tracing-internal.js.map +1 -1
  41. package/dist/tracing/tracing-schema.d.ts +3 -0
  42. package/dist/tracing/tracing-schema.js +7 -1
  43. package/dist/tracing/tracing-schema.js.map +1 -1
  44. package/dist/utilities/abort.d.ts +6 -0
  45. package/dist/utilities/abort.js +9 -2
  46. package/dist/utilities/abort.js.map +1 -1
  47. package/dist/utilities/retry.d.ts +5 -0
  48. package/dist/utilities/retry.js +6 -3
  49. package/dist/utilities/retry.js.map +1 -1
  50. package/docs/agent-guide.md +8 -2
  51. package/docs/agents.md +7 -4
  52. package/docs/api-reference.md +19 -19
  53. package/docs/api-report.json +10 -10
  54. package/docs/child-pipeline-composition.md +5 -2
  55. package/docs/concepts.md +3 -1
  56. package/docs/declarative-pipelines.md +3 -1
  57. package/docs/recipes.md +2 -1
  58. package/docs/studio.md +27 -1
  59. package/package.json +7 -6
  60. package/skills/tubeless/SKILL.md +6 -2
  61. package/dist/studio/run-store-ui-client-browser.d.ts +0 -1
@@ -1,3 +1,11 @@
1
1
  import type { AgentEnvironment } from "./environment.js";
2
- /** Local workspace capabilities with bounded reads, atomic writes and cancellable bash. */
3
- export declare function createNodeAgentEnvironment(): AgentEnvironment;
2
+ /**
3
+ * Local workspace capabilities with bounded reads, atomic writes and cancellable bash.
4
+ *
5
+ * The default `id` names this process's local filesystem authority rather than its
6
+ * host, so durable checkpoints still resume in a recreated container or pod. Pass
7
+ * `id` to name a distinct authority, for example one store shared by several hosts.
8
+ */
9
+ export declare function createNodeAgentEnvironment(options?: {
10
+ readonly id?: string;
11
+ }): AgentEnvironment;
@@ -1,5 +1,4 @@
1
1
  import { lstat, realpath } from "node:fs/promises";
2
- import { hostname } from "node:os";
3
2
  import { dirname, join } from "node:path";
4
3
  import { throwIfAborted } from "../utilities/abort.js";
5
4
  import { bashTool } from "./default-tool-bash.js";
@@ -44,10 +43,16 @@ async function projectInstructions(context) {
44
43
  }
45
44
  return instructions;
46
45
  }
47
- /** Local workspace capabilities with bounded reads, atomic writes and cancellable bash. */
48
- export function createNodeAgentEnvironment() {
46
+ /**
47
+ * Local workspace capabilities with bounded reads, atomic writes and cancellable bash.
48
+ *
49
+ * The default `id` names this process's local filesystem authority rather than its
50
+ * host, so durable checkpoints still resume in a recreated container or pod. Pass
51
+ * `id` to name a distinct authority, for example one store shared by several hosts.
52
+ */
53
+ export function createNodeAgentEnvironment(options = {}) {
49
54
  return Object.freeze({
50
- id: `node:${hostname()}`,
55
+ id: options.id ?? "node:local",
51
56
  resolveCwd: async ({ cwd, signal }) => {
52
57
  throwIfAborted(signal, "Resolve agent workspace");
53
58
  const directory = await realpath(cwd);
@@ -1 +1 @@
1
- {"version":3,"file":"node-environment.js","sourceRoot":"","sources":["../../src/agent/node-environment.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, realpath } from \"node:fs/promises\";\nimport { hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { bashTool } from \"./default-tool-bash.js\";\nimport { readTool, writeTool, editTool, listTool, searchTool } from \"./default-tool-files.js\";\nimport type {\n AgentEnvironment,\n AgentEnvironmentContext,\n AgentProjectInstruction,\n} from \"./environment.js\";\n\nfunction missing(error: unknown) {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nasync function projectInstructions(\n context: AgentEnvironmentContext\n): Promise<readonly AgentProjectInstruction[]> {\n const { cwd, signal } = context;\n const workspace = await realpath(cwd);\n const ancestors: string[] = [];\n let directory = workspace;\n while (true) {\n throwIfAborted(signal, \"Load project instructions\");\n ancestors.push(directory);\n const git = await lstat(join(directory, \".git\")).catch((error: unknown) => {\n if (!missing(error)) throw error;\n return undefined;\n });\n if (git) break;\n const parent = dirname(directory);\n if (parent === directory) {\n ancestors.splice(1);\n break;\n }\n directory = parent;\n }\n const instructions: AgentProjectInstruction[] = [];\n for (const path of ancestors.reverse().map((ancestor) => join(ancestor, \"AGENTS.md\"))) {\n try {\n const file = await readTool({ path, maxLines: 2000 }, { cwd: workspace, signal });\n if (file.truncated) throw new Error(`Project instructions exceed read limits: ${path}`);\n instructions.push({ path, content: file.content });\n } catch (error) {\n if (!missing(error)) throw error;\n }\n }\n return instructions;\n}\n\n/** Local workspace capabilities with bounded reads, atomic writes and cancellable bash. */\nexport function createNodeAgentEnvironment(): AgentEnvironment {\n return Object.freeze({\n id: `node:${hostname()}`,\n resolveCwd: async ({ cwd, signal }: AgentEnvironmentContext) => {\n throwIfAborted(signal, \"Resolve agent workspace\");\n const directory = await realpath(cwd);\n throwIfAborted(signal, \"Resolve agent workspace\");\n return directory;\n },\n projectInstructions,\n read: readTool,\n write: writeTool,\n edit: editTool,\n bash: bashTool,\n list: listTool,\n search: searchTool,\n });\n}\n"]}
1
+ {"version":3,"file":"node-environment.js","sourceRoot":"","sources":["../../src/agent/node-environment.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, realpath } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { bashTool } from \"./default-tool-bash.js\";\nimport { readTool, writeTool, editTool, listTool, searchTool } from \"./default-tool-files.js\";\nimport type {\n AgentEnvironment,\n AgentEnvironmentContext,\n AgentProjectInstruction,\n} from \"./environment.js\";\n\nfunction missing(error: unknown) {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nasync function projectInstructions(\n context: AgentEnvironmentContext\n): Promise<readonly AgentProjectInstruction[]> {\n const { cwd, signal } = context;\n const workspace = await realpath(cwd);\n const ancestors: string[] = [];\n let directory = workspace;\n while (true) {\n throwIfAborted(signal, \"Load project instructions\");\n ancestors.push(directory);\n const git = await lstat(join(directory, \".git\")).catch((error: unknown) => {\n if (!missing(error)) throw error;\n return undefined;\n });\n if (git) break;\n const parent = dirname(directory);\n if (parent === directory) {\n ancestors.splice(1);\n break;\n }\n directory = parent;\n }\n const instructions: AgentProjectInstruction[] = [];\n for (const path of ancestors.reverse().map((ancestor) => join(ancestor, \"AGENTS.md\"))) {\n try {\n const file = await readTool({ path, maxLines: 2000 }, { cwd: workspace, signal });\n if (file.truncated) throw new Error(`Project instructions exceed read limits: ${path}`);\n instructions.push({ path, content: file.content });\n } catch (error) {\n if (!missing(error)) throw error;\n }\n }\n return instructions;\n}\n\n/**\n * Local workspace capabilities with bounded reads, atomic writes and cancellable bash.\n *\n * The default `id` names this process's local filesystem authority rather than its\n * host, so durable checkpoints still resume in a recreated container or pod. Pass\n * `id` to name a distinct authority, for example one store shared by several hosts.\n */\nexport function createNodeAgentEnvironment(\n options: { readonly id?: string } = {}\n): AgentEnvironment {\n return Object.freeze({\n id: options.id ?? \"node:local\",\n resolveCwd: async ({ cwd, signal }: AgentEnvironmentContext) => {\n throwIfAborted(signal, \"Resolve agent workspace\");\n const directory = await realpath(cwd);\n throwIfAborted(signal, \"Resolve agent workspace\");\n return directory;\n },\n projectInstructions,\n read: readTool,\n write: writeTool,\n edit: editTool,\n bash: bashTool,\n list: listTool,\n search: searchTool,\n });\n}\n"]}
@@ -71,7 +71,7 @@ async function rejectedChildPlanResult(pipeline, plan, domainOptions, controls,
71
71
  }
72
72
  return execute(plan, domainOptions, controls, context);
73
73
  }
74
- function childTracingOptions(context, itemKey = context.trace?.itemKey) {
74
+ function childTracingOptions(context, stepId, itemKey = context.trace?.itemKey) {
75
75
  const tracing = context.tracing;
76
76
  if (!tracing)
77
77
  return undefined;
@@ -80,6 +80,7 @@ function childTracingOptions(context, itemKey = context.trace?.itemKey) {
80
80
  itemKey,
81
81
  // A relation injected by this wrapper belongs to its next child, not descendants.
82
82
  iteration: tracing.iteration?.runId === context.runId ? tracing.iteration : undefined,
83
+ parentStep: { runId: context.runId, stepId },
83
84
  };
84
85
  }
85
86
  /** Internal full-report boundary for dispatchers that classify failed child runs. */
@@ -93,7 +94,7 @@ export function invokeChildPipeline(pipeline, options, context, invocation) {
93
94
  parentRunId: context.runId,
94
95
  signal: context.signal,
95
96
  sleep: context.sleep,
96
- tracing: childTracingOptions(context, invocation.itemKey),
97
+ tracing: childTracingOptions(context, invocation.stepId, invocation.itemKey),
97
98
  hooks: invocation.hooks,
98
99
  };
99
100
  return executeCompiledChild(pipeline, invocation.plan, options, controls, childExecutionScope(context, runtime, {
@@ -171,7 +172,7 @@ export function createSingleChildRunner(config) {
171
172
  parentRunId: context.runId,
172
173
  signal: context.signal,
173
174
  sleep: context.sleep,
174
- tracing: childTracingOptions(context),
175
+ tracing: childTracingOptions(context, config.stepId),
175
176
  };
176
177
  // Plan once for progress totals and execution. Invalid plans fail before child.run.
177
178
  const childPlan = config.pipeline.plan(controls);
@@ -196,9 +197,12 @@ export function createMappedChildRunner(config) {
196
197
  if (duplicateKeys.length > 0) {
197
198
  throw new PipelineChildError(`Mapped child pipeline ${config.pipeline.id} received duplicate item keys: ${duplicateKeys.join(", ")}`);
198
199
  }
199
- const concurrency = Math.max(1, isConcurrencyFunction(config.concurrency)
200
+ const concurrency = isConcurrencyFunction(config.concurrency)
200
201
  ? config.concurrency(inputs, context)
201
- : (config.concurrency ?? 1));
202
+ : (config.concurrency ?? 1);
203
+ if (!Number.isInteger(concurrency) || concurrency < 1) {
204
+ throw new PipelineChildError(`Mapped child pipeline ${config.pipeline.id} concurrency must be a positive finite integer, got ${concurrency}`);
205
+ }
202
206
  const progress = hasProgressObserver(context)
203
207
  ? createMappedChildProgress(keys, concurrency, config.progress, context.reportProgress)
204
208
  : undefined;
@@ -226,7 +230,7 @@ export function createMappedChildRunner(config) {
226
230
  parentRunId: context.runId,
227
231
  signal: context.signal,
228
232
  sleep: context.sleep,
229
- tracing: childTracingOptions(context, key),
233
+ tracing: childTracingOptions(context, config.stepId, key),
230
234
  }, {
231
235
  pipelineId: config.pipeline.id,
232
236
  stepId: config.stepId,
@@ -1 +1 @@
1
- {"version":3,"file":"child-execution.js","sourceRoot":"","sources":["../../src/core/child-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { childExecutionScope } from \"./execution-scope.js\";\nimport type { PreparedOptions } from \"./prepared-options.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { emitRejectedPlanLifecycle } from \"./lifecycle.js\";\nimport { runConcurrentPartial } from \"../utilities/batch.js\";\nimport {\n isPipelineCancellation,\n PipelineChildError,\n PipelineExecutionError,\n} from \"./pipeline-execution-error.js\";\nimport type { ToMappedChildStepProgressOptions } from \"./mapped-child-progress.js\";\nimport { createRunId, RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport { duplicateValues } from \"../utilities/collections.js\";\nimport { EXECUTE_COMPILED_RUN, isCompiledPipeline } from \"./pipeline-identity.js\";\nimport { createMappedChildProgress, createSingleChildProgress } from \"./child-progress.js\";\nimport type {\n Pipeline,\n PipelineContext,\n PipelineExecutionContext,\n PipelineHooks,\n PipelinePlan,\n PipelineRun,\n PipelineRunControls,\n PipelineRuntime,\n PipelineStepContext,\n} from \"./pipeline-types.js\";\nimport type { PipelineTracingOptions } from \"../tracing/tracing-contracts.js\";\n\ntype ChildPipeline = Pipeline<object, unknown, string, string>;\n\ntype CompiledChildExecute = (\n plan: PipelinePlan,\n options: object,\n controls: PipelineRunControls,\n context?: Partial<PipelineContext>,\n overrides?: undefined,\n preparedOptions?: PreparedOptions\n) => Promise<PipelineRun<unknown>>;\n\ntype ExecutableChild = ChildPipeline & {\n [EXECUTE_COMPILED_RUN]?: CompiledChildExecute;\n};\n\nfunction compiledChildExecute(pipeline: ChildPipeline): CompiledChildExecute | undefined {\n if (!isCompiledPipeline(pipeline)) return undefined;\n // SAFETY: branded pipelines are the `definePipeline` object, which always\n // stamps `EXECUTE_COMPILED_RUN`. Wrappers that inherit the symbol are rejected\n // by the identity check above.\n return (pipeline as ExecutableChild)[EXECUTE_COMPILED_RUN];\n}\n\nfunction executeCompiledChild(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n preparedOptions?: PreparedOptions\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return pipeline.run(domainOptions, controls, context);\n }\n return execute(plan, domainOptions, controls, context, undefined, preparedOptions);\n}\n\nfunction publicChildRuntime(context: PipelineContext): PipelineRuntime {\n const runtime: PipelineRuntime = {\n cwd: context.cwd,\n log: context.log,\n now: context.now ?? Date.now,\n sleep: context.sleep ?? (async () => undefined),\n };\n if (context.correlationId !== undefined) runtime.correlationId = context.correlationId;\n if (context.hooks) runtime.hooks = context.hooks;\n if (context.parentRunId) runtime.parentRunId = context.parentRunId;\n if (context.signal) runtime.signal = context.signal;\n if (context.tracing) runtime.tracing = context.tracing;\n return runtime;\n}\n\nasync function failedPublicChildPlanRun(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const runtime = publicChildRuntime(context);\n const startedAtMs = runtime.now();\n const result: PipelineRun<unknown> = {\n pipelineId: pipeline.id,\n dryRun: controls.dryRun === true,\n errors: [...plan.errors],\n finalized: false,\n finishedAtMs: runtime.now(),\n runId: createRunId(pipeline.id),\n startedAtMs,\n status: \"failed\",\n steps: [],\n version: RUN_MODEL_VERSION,\n };\n const correlationId = context.correlationId;\n if (correlationId !== undefined) result.correlationId = correlationId;\n if (context.parentRunId) result.parentRunId = context.parentRunId;\n await emitRejectedPlanLifecycle(pipeline.id, pipeline.targetIds, plan, runtime, result);\n return result;\n}\n\nasync function rejectedChildPlanResult(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return failedPublicChildPlanRun(pipeline, plan, controls, context);\n }\n return execute(plan, domainOptions, controls, context);\n}\n\ntype ChildInputs = Record<string, unknown>;\n\nexport interface SingleChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n itemKey?: string;\n pipeline: ChildPipeline;\n controls?:\n | PipelineRunControls\n | ((\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions?(inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nexport interface MappedChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n pipeline: ChildPipeline;\n items(\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): readonly unknown[] | Promise<readonly unknown[]>;\n key(item: unknown, index: number): string;\n concurrency?:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>) => number);\n progress?: ToMappedChildStepProgressOptions;\n controls?:\n | PipelineRunControls\n | ((\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions(\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nfunction childTracingOptions(\n context: PipelineExecutionContext<object>,\n itemKey = context.trace?.itemKey\n): PipelineTracingOptions | undefined {\n const tracing = context.tracing;\n if (!tracing) return undefined;\n return {\n ...tracing,\n itemKey,\n // A relation injected by this wrapper belongs to its next child, not descendants.\n iteration: tracing.iteration?.runId === context.runId ? tracing.iteration : undefined,\n };\n}\n\n/** Internal full-report boundary for dispatchers that classify failed child runs. */\nexport function invokeChildPipeline(\n pipeline: ChildPipeline,\n options: object,\n context: PipelineStepContext<object>,\n invocation: {\n stepId: string;\n plan: PipelinePlan;\n hooks: PipelineHooks;\n itemKey: string;\n preparedOptions?: PreparedOptions;\n }\n): Promise<PipelineRun<unknown>> {\n const controls = childRunControls(undefined, context.dryRun, context.cachePolicy);\n const runtime: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, invocation.itemKey),\n hooks: invocation.hooks,\n };\n return executeCompiledChild(\n pipeline,\n invocation.plan,\n options,\n controls,\n childExecutionScope(context, runtime, {\n pipelineId: pipeline.id,\n stepId: invocation.stepId,\n itemKey: invocation.itemKey,\n }),\n invocation.preparedOptions\n );\n}\n\nfunction childRunControls(\n controls: PipelineRunControls | undefined,\n parentDryRun: boolean,\n cachePolicy: PipelineRunControls[\"cache\"]\n): PipelineRunControls {\n const resolved: PipelineRunControls = {};\n if (cachePolicy !== undefined || controls?.cache !== undefined)\n resolved.cache = cachePolicy ?? controls?.cache;\n if (controls?.continueOnError !== undefined) {\n resolved.continueOnError = controls.continueOnError;\n }\n if (controls?.maxConcurrency !== undefined) {\n resolved.maxConcurrency = controls.maxConcurrency;\n }\n if (controls?.stepIds !== undefined) resolved.stepIds = [...controls.stepIds];\n if (controls?.targets !== undefined) resolved.targets = [...controls.targets];\n if (parentDryRun || controls?.dryRun === true) {\n resolved.dryRun = true;\n } else if (controls?.dryRun !== undefined) {\n resolved.dryRun = false;\n }\n return resolved;\n}\n\nfunction isConcurrencyFunction<TOptions extends object>(\n concurrency:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number)\n | undefined\n): concurrency is (inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number {\n return typeof concurrency === \"function\";\n}\n\nfunction firstChildFailure(result: PipelineRun<unknown>) {\n const firstFailedStep = result.steps.find(\n ({ status }) => status === \"failed\" || status === \"cancelled\"\n );\n const firstError =\n firstFailedStep && \"error\" in firstFailedStep ? firstFailedStep.error : result.errors[0];\n return {\n failureLocation: firstFailedStep?.id ?? firstError?.stepId ?? \"unknown step\",\n message: firstError?.message ?? \"unknown error\",\n };\n}\n\nasync function runChildPipeline(\n pipeline: ChildPipeline,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n hooks: PipelineHooks,\n messagePrefix = \"\",\n plan: PipelinePlan\n): Promise<PipelineRun<unknown>> {\n if (!plan.ok) {\n const firstError = plan.errors[0];\n const result = await rejectedChildPlanResult(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}could not start: ${firstError?.message ?? \"invalid plan\"}`\n );\n }\n\n const result = await executeCompiledChild(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n if (result.status !== \"completed\") {\n const { failureLocation, message } = firstChildFailure(result);\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}failed at ${failureLocation}: ${message}`\n );\n }\n return result;\n}\n\nfunction hasProgressObserver(context: PipelineContext): boolean {\n const hooks = Array.isArray(context.hooks) ? context.hooks : [context.hooks];\n return (\n Boolean(context.tracing) || hooks.some((hook) => hook?.onStepProgress || hook?.onStepStatus)\n );\n}\n\nexport function createSingleChildRunner<TParentOptions extends object>(\n config: SingleChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown> {\n return async (inputs, context) => {\n const domainOptions = config.mapOptions ? config.mapOptions(inputs, context) : context.options;\n const configuredControls =\n typeof config.controls === \"function\" ? config.controls(inputs, context) : config.controls;\n const controls = childRunControls(configuredControls, context.dryRun, context.cachePolicy);\n const baseChildContext: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context),\n };\n // Plan once for progress totals and execution. Invalid plans fail before child.run.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = hasProgressObserver(context)\n ? createSingleChildProgress(childPlan, context.reportProgress)\n : {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(context, baseChildContext, {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: config.itemKey,\n }),\n childHooks,\n `Child pipeline ${config.pipeline.id} `,\n childPlan\n );\n\n return config.mapResult\n ? config.mapResult(childResult.value, childResult, context)\n : childResult.value;\n };\n}\n\nexport function createMappedChildRunner<TParentOptions extends object>(\n config: MappedChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown[]> {\n return async (inputs, context) => {\n const items = [...(await config.items(inputs, context))];\n const keys = items.map((item, index) => config.key(item, index));\n const duplicateKeys = duplicateValues(keys);\n if (duplicateKeys.length > 0) {\n throw new PipelineChildError(\n `Mapped child pipeline ${config.pipeline.id} received duplicate item keys: ${duplicateKeys.join(\", \")}`\n );\n }\n const concurrency = Math.max(\n 1,\n isConcurrencyFunction(config.concurrency)\n ? config.concurrency(inputs, context)\n : (config.concurrency ?? 1)\n );\n type Outcome =\n | { key: string; ok: true; value: unknown }\n | { error: Error; key: string; index: number; ok: false };\n\n const progress = hasProgressObserver(context)\n ? createMappedChildProgress(keys, concurrency, config.progress, context.reportProgress)\n : undefined;\n progress?.publish();\n if (items.length === 0) return [];\n\n const partial = await runConcurrentPartial(\n items,\n { concurrency, signal: context.signal },\n async (item, itemIndex): Promise<Outcome> => {\n const key = keys[itemIndex]!;\n progress?.start(key);\n try {\n throwIfAborted(context.signal, `Mapped child pipeline ${config.pipeline.id}`);\n const domainOptions = config.mapOptions(item, itemIndex, inputs, context);\n const configuredControls =\n typeof config.controls === \"function\"\n ? config.controls(item, itemIndex, inputs, context)\n : config.controls;\n const controls = childRunControls(\n configuredControls,\n context.dryRun,\n context.cachePolicy\n );\n // Plan once per mapped-options bag for progress and execution.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = progress?.plan(key, childPlan) ?? {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(\n context,\n {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, key),\n },\n {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: key,\n }\n ),\n childHooks,\n \"\",\n childPlan\n );\n\n progress?.childCompleted(key);\n\n const value = config.mapResult\n ? config.mapResult(childResult.value, childResult, item, itemIndex, context)\n : childResult.value;\n progress?.complete(key);\n return { key, ok: true, value };\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n progress?.fail(key, cause, isPipelineCancellation(cause, context));\n return { error: cause, key, index: itemIndex, ok: false };\n }\n }\n );\n\n progress?.finish();\n const outcomes = partial.ok\n ? partial.results\n : partial.results.filter((outcome): outcome is Outcome => outcome !== undefined);\n const schedulerFailure = partial.ok\n ? undefined\n : partial.failure instanceof Error\n ? partial.failure\n : new Error(String(partial.failure));\n\n const failures = outcomes.filter(\n (outcome): outcome is Extract<Outcome, { ok: false }> => !outcome.ok\n );\n if (failures.length > 0 || schedulerFailure !== undefined) {\n const details = failures.map(({ error, key }) => `${key}: ${error.message}`).join(\"; \");\n const cancelled =\n failures.every(({ error }) => isPipelineCancellation(error, context)) &&\n (schedulerFailure === undefined || isPipelineCancellation(schedulerFailure, context));\n const primaryError = cancelled\n ? (failures[0]?.error ?? schedulerFailure)\n : (failures.find(({ error }) => !isPipelineCancellation(error, context))?.error ??\n failures[0]?.error ??\n schedulerFailure);\n const message =\n failures.length > 0\n ? `Mapped child pipeline ${config.pipeline.id} failed for ${failures.length} item(s): ${details}`\n : `Mapped child pipeline ${config.pipeline.id} failed: ${primaryError?.message ?? \"aborted\"}`;\n throw new PipelineChildError(message, cancelled, primaryError, {\n failures: failures.map(({ error, key, index }) => ({\n error,\n key,\n index,\n cancelled: isPipelineCancellation(error, context),\n })),\n failureCount: failures.length,\n schedulerError: schedulerFailure,\n });\n }\n // SAFETY: when failures.length === 0 every outcome was produced by the\n // success branch (return { key, ok: true, value }), so each outcome is\n // necessarily `{ ok: true }`; the assertion narrows the union accordingly.\n return outcomes.map((outcome) => (outcome as Extract<Outcome, { ok: true }>).value);\n };\n}\n"]}
1
+ {"version":3,"file":"child-execution.js","sourceRoot":"","sources":["../../src/core/child-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { childExecutionScope } from \"./execution-scope.js\";\nimport type { PreparedOptions } from \"./prepared-options.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { emitRejectedPlanLifecycle } from \"./lifecycle.js\";\nimport { runConcurrentPartial } from \"../utilities/batch.js\";\nimport {\n isPipelineCancellation,\n PipelineChildError,\n PipelineExecutionError,\n} from \"./pipeline-execution-error.js\";\nimport type { ToMappedChildStepProgressOptions } from \"./mapped-child-progress.js\";\nimport { createRunId, RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport { duplicateValues } from \"../utilities/collections.js\";\nimport { EXECUTE_COMPILED_RUN, isCompiledPipeline } from \"./pipeline-identity.js\";\nimport { createMappedChildProgress, createSingleChildProgress } from \"./child-progress.js\";\nimport type {\n Pipeline,\n PipelineContext,\n PipelineExecutionContext,\n PipelineHooks,\n PipelinePlan,\n PipelineRun,\n PipelineRunControls,\n PipelineRuntime,\n PipelineStepContext,\n} from \"./pipeline-types.js\";\nimport type { PipelineTracingOptions } from \"../tracing/tracing-contracts.js\";\n\ntype ChildPipeline = Pipeline<object, unknown, string, string>;\n\ntype CompiledChildExecute = (\n plan: PipelinePlan,\n options: object,\n controls: PipelineRunControls,\n context?: Partial<PipelineContext>,\n overrides?: undefined,\n preparedOptions?: PreparedOptions\n) => Promise<PipelineRun<unknown>>;\n\ntype ExecutableChild = ChildPipeline & {\n [EXECUTE_COMPILED_RUN]?: CompiledChildExecute;\n};\n\nfunction compiledChildExecute(pipeline: ChildPipeline): CompiledChildExecute | undefined {\n if (!isCompiledPipeline(pipeline)) return undefined;\n // SAFETY: branded pipelines are the `definePipeline` object, which always\n // stamps `EXECUTE_COMPILED_RUN`. Wrappers that inherit the symbol are rejected\n // by the identity check above.\n return (pipeline as ExecutableChild)[EXECUTE_COMPILED_RUN];\n}\n\nfunction executeCompiledChild(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n preparedOptions?: PreparedOptions\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return pipeline.run(domainOptions, controls, context);\n }\n return execute(plan, domainOptions, controls, context, undefined, preparedOptions);\n}\n\nfunction publicChildRuntime(context: PipelineContext): PipelineRuntime {\n const runtime: PipelineRuntime = {\n cwd: context.cwd,\n log: context.log,\n now: context.now ?? Date.now,\n sleep: context.sleep ?? (async () => undefined),\n };\n if (context.correlationId !== undefined) runtime.correlationId = context.correlationId;\n if (context.hooks) runtime.hooks = context.hooks;\n if (context.parentRunId) runtime.parentRunId = context.parentRunId;\n if (context.signal) runtime.signal = context.signal;\n if (context.tracing) runtime.tracing = context.tracing;\n return runtime;\n}\n\nasync function failedPublicChildPlanRun(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const runtime = publicChildRuntime(context);\n const startedAtMs = runtime.now();\n const result: PipelineRun<unknown> = {\n pipelineId: pipeline.id,\n dryRun: controls.dryRun === true,\n errors: [...plan.errors],\n finalized: false,\n finishedAtMs: runtime.now(),\n runId: createRunId(pipeline.id),\n startedAtMs,\n status: \"failed\",\n steps: [],\n version: RUN_MODEL_VERSION,\n };\n const correlationId = context.correlationId;\n if (correlationId !== undefined) result.correlationId = correlationId;\n if (context.parentRunId) result.parentRunId = context.parentRunId;\n await emitRejectedPlanLifecycle(pipeline.id, pipeline.targetIds, plan, runtime, result);\n return result;\n}\n\nasync function rejectedChildPlanResult(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return failedPublicChildPlanRun(pipeline, plan, controls, context);\n }\n return execute(plan, domainOptions, controls, context);\n}\n\ntype ChildInputs = Record<string, unknown>;\n\nexport interface SingleChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n itemKey?: string;\n pipeline: ChildPipeline;\n controls?:\n | PipelineRunControls\n | ((\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions?(inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nexport interface MappedChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n pipeline: ChildPipeline;\n items(\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): readonly unknown[] | Promise<readonly unknown[]>;\n key(item: unknown, index: number): string;\n concurrency?:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>) => number);\n progress?: ToMappedChildStepProgressOptions;\n controls?:\n | PipelineRunControls\n | ((\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions(\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nfunction childTracingOptions(\n context: PipelineExecutionContext<object>,\n stepId: string,\n itemKey = context.trace?.itemKey\n): PipelineTracingOptions | undefined {\n const tracing = context.tracing;\n if (!tracing) return undefined;\n return {\n ...tracing,\n itemKey,\n // A relation injected by this wrapper belongs to its next child, not descendants.\n iteration: tracing.iteration?.runId === context.runId ? tracing.iteration : undefined,\n parentStep: { runId: context.runId, stepId },\n };\n}\n\n/** Internal full-report boundary for dispatchers that classify failed child runs. */\nexport function invokeChildPipeline(\n pipeline: ChildPipeline,\n options: object,\n context: PipelineStepContext<object>,\n invocation: {\n stepId: string;\n plan: PipelinePlan;\n hooks: PipelineHooks;\n itemKey: string;\n preparedOptions?: PreparedOptions;\n }\n): Promise<PipelineRun<unknown>> {\n const controls = childRunControls(undefined, context.dryRun, context.cachePolicy);\n const runtime: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, invocation.stepId, invocation.itemKey),\n hooks: invocation.hooks,\n };\n return executeCompiledChild(\n pipeline,\n invocation.plan,\n options,\n controls,\n childExecutionScope(context, runtime, {\n pipelineId: pipeline.id,\n stepId: invocation.stepId,\n itemKey: invocation.itemKey,\n }),\n invocation.preparedOptions\n );\n}\n\nfunction childRunControls(\n controls: PipelineRunControls | undefined,\n parentDryRun: boolean,\n cachePolicy: PipelineRunControls[\"cache\"]\n): PipelineRunControls {\n const resolved: PipelineRunControls = {};\n if (cachePolicy !== undefined || controls?.cache !== undefined)\n resolved.cache = cachePolicy ?? controls?.cache;\n if (controls?.continueOnError !== undefined) {\n resolved.continueOnError = controls.continueOnError;\n }\n if (controls?.maxConcurrency !== undefined) {\n resolved.maxConcurrency = controls.maxConcurrency;\n }\n if (controls?.stepIds !== undefined) resolved.stepIds = [...controls.stepIds];\n if (controls?.targets !== undefined) resolved.targets = [...controls.targets];\n if (parentDryRun || controls?.dryRun === true) {\n resolved.dryRun = true;\n } else if (controls?.dryRun !== undefined) {\n resolved.dryRun = false;\n }\n return resolved;\n}\n\nfunction isConcurrencyFunction<TOptions extends object>(\n concurrency:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number)\n | undefined\n): concurrency is (inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number {\n return typeof concurrency === \"function\";\n}\n\nfunction firstChildFailure(result: PipelineRun<unknown>) {\n const firstFailedStep = result.steps.find(\n ({ status }) => status === \"failed\" || status === \"cancelled\"\n );\n const firstError =\n firstFailedStep && \"error\" in firstFailedStep ? firstFailedStep.error : result.errors[0];\n return {\n failureLocation: firstFailedStep?.id ?? firstError?.stepId ?? \"unknown step\",\n message: firstError?.message ?? \"unknown error\",\n };\n}\n\nasync function runChildPipeline(\n pipeline: ChildPipeline,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n hooks: PipelineHooks,\n messagePrefix = \"\",\n plan: PipelinePlan\n): Promise<PipelineRun<unknown>> {\n if (!plan.ok) {\n const firstError = plan.errors[0];\n const result = await rejectedChildPlanResult(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}could not start: ${firstError?.message ?? \"invalid plan\"}`\n );\n }\n\n const result = await executeCompiledChild(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n if (result.status !== \"completed\") {\n const { failureLocation, message } = firstChildFailure(result);\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}failed at ${failureLocation}: ${message}`\n );\n }\n return result;\n}\n\nfunction hasProgressObserver(context: PipelineContext): boolean {\n const hooks = Array.isArray(context.hooks) ? context.hooks : [context.hooks];\n return (\n Boolean(context.tracing) || hooks.some((hook) => hook?.onStepProgress || hook?.onStepStatus)\n );\n}\n\nexport function createSingleChildRunner<TParentOptions extends object>(\n config: SingleChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown> {\n return async (inputs, context) => {\n const domainOptions = config.mapOptions ? config.mapOptions(inputs, context) : context.options;\n const configuredControls =\n typeof config.controls === \"function\" ? config.controls(inputs, context) : config.controls;\n const controls = childRunControls(configuredControls, context.dryRun, context.cachePolicy);\n const baseChildContext: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, config.stepId),\n };\n // Plan once for progress totals and execution. Invalid plans fail before child.run.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = hasProgressObserver(context)\n ? createSingleChildProgress(childPlan, context.reportProgress)\n : {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(context, baseChildContext, {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: config.itemKey,\n }),\n childHooks,\n `Child pipeline ${config.pipeline.id} `,\n childPlan\n );\n\n return config.mapResult\n ? config.mapResult(childResult.value, childResult, context)\n : childResult.value;\n };\n}\n\nexport function createMappedChildRunner<TParentOptions extends object>(\n config: MappedChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown[]> {\n return async (inputs, context) => {\n const items = [...(await config.items(inputs, context))];\n const keys = items.map((item, index) => config.key(item, index));\n const duplicateKeys = duplicateValues(keys);\n if (duplicateKeys.length > 0) {\n throw new PipelineChildError(\n `Mapped child pipeline ${config.pipeline.id} received duplicate item keys: ${duplicateKeys.join(\", \")}`\n );\n }\n const concurrency = isConcurrencyFunction(config.concurrency)\n ? config.concurrency(inputs, context)\n : (config.concurrency ?? 1);\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new PipelineChildError(\n `Mapped child pipeline ${config.pipeline.id} concurrency must be a positive finite integer, got ${concurrency}`\n );\n }\n type Outcome =\n | { key: string; ok: true; value: unknown }\n | { error: Error; key: string; index: number; ok: false };\n\n const progress = hasProgressObserver(context)\n ? createMappedChildProgress(keys, concurrency, config.progress, context.reportProgress)\n : undefined;\n progress?.publish();\n if (items.length === 0) return [];\n\n const partial = await runConcurrentPartial(\n items,\n { concurrency, signal: context.signal },\n async (item, itemIndex): Promise<Outcome> => {\n const key = keys[itemIndex]!;\n progress?.start(key);\n try {\n throwIfAborted(context.signal, `Mapped child pipeline ${config.pipeline.id}`);\n const domainOptions = config.mapOptions(item, itemIndex, inputs, context);\n const configuredControls =\n typeof config.controls === \"function\"\n ? config.controls(item, itemIndex, inputs, context)\n : config.controls;\n const controls = childRunControls(\n configuredControls,\n context.dryRun,\n context.cachePolicy\n );\n // Plan once per mapped-options bag for progress and execution.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = progress?.plan(key, childPlan) ?? {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(\n context,\n {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, config.stepId, key),\n },\n {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: key,\n }\n ),\n childHooks,\n \"\",\n childPlan\n );\n\n progress?.childCompleted(key);\n\n const value = config.mapResult\n ? config.mapResult(childResult.value, childResult, item, itemIndex, context)\n : childResult.value;\n progress?.complete(key);\n return { key, ok: true, value };\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n progress?.fail(key, cause, isPipelineCancellation(cause, context));\n return { error: cause, key, index: itemIndex, ok: false };\n }\n }\n );\n\n progress?.finish();\n const outcomes = partial.ok\n ? partial.results\n : partial.results.filter((outcome): outcome is Outcome => outcome !== undefined);\n const schedulerFailure = partial.ok\n ? undefined\n : partial.failure instanceof Error\n ? partial.failure\n : new Error(String(partial.failure));\n\n const failures = outcomes.filter(\n (outcome): outcome is Extract<Outcome, { ok: false }> => !outcome.ok\n );\n if (failures.length > 0 || schedulerFailure !== undefined) {\n const details = failures.map(({ error, key }) => `${key}: ${error.message}`).join(\"; \");\n const cancelled =\n failures.every(({ error }) => isPipelineCancellation(error, context)) &&\n (schedulerFailure === undefined || isPipelineCancellation(schedulerFailure, context));\n const primaryError = cancelled\n ? (failures[0]?.error ?? schedulerFailure)\n : (failures.find(({ error }) => !isPipelineCancellation(error, context))?.error ??\n failures[0]?.error ??\n schedulerFailure);\n const message =\n failures.length > 0\n ? `Mapped child pipeline ${config.pipeline.id} failed for ${failures.length} item(s): ${details}`\n : `Mapped child pipeline ${config.pipeline.id} failed: ${primaryError?.message ?? \"aborted\"}`;\n throw new PipelineChildError(message, cancelled, primaryError, {\n failures: failures.map(({ error, key, index }) => ({\n error,\n key,\n index,\n cancelled: isPipelineCancellation(error, context),\n })),\n failureCount: failures.length,\n schedulerError: schedulerFailure,\n });\n }\n // SAFETY: when failures.length === 0 every outcome was produced by the\n // success branch (return { key, ok: true, value }), so each outcome is\n // necessarily `{ ok: true }`; the assertion narrows the union accordingly.\n return outcomes.map((outcome) => (outcome as Extract<Outcome, { ok: true }>).value);\n };\n}\n"]}
@@ -100,10 +100,15 @@ function createStepFactory(optionsSchema) {
100
100
  return buildRemoteStep(id, definition);
101
101
  }
102
102
  const buildMappedPipelineStep = (id, config) => {
103
+ const configuredConcurrency = config.concurrency;
104
+ if (typeof configuredConcurrency === "number" &&
105
+ (!Number.isInteger(configuredConcurrency) || configuredConcurrency < 1)) {
106
+ throw new RangeError(`forEachPipeline concurrency must be a positive finite integer, got ${configuredConcurrency}`);
107
+ }
103
108
  const definition = {
104
109
  [STEP_NESTED_PIPELINE]: {
105
110
  mode: "for-each",
106
- concurrency: typeof config.concurrency === "function" ? "dynamic" : (config.concurrency ?? 1),
111
+ concurrency: typeof configuredConcurrency === "function" ? "dynamic" : (configuredConcurrency ?? 1),
107
112
  pipelineId: config.pipeline.id,
108
113
  identity: config.pipeline.definition?.identity,
109
114
  stepIds: config.pipeline.stepIds,
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-steps.js","sourceRoot":"","sources":["../../src/core/pipeline-steps.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PipelineMetadata } from \"../tracing/graph-metadata.js\";\nimport type { CompiledStepCache, StepCache } from \"./pipeline-cache.js\";\nimport {\n type ArtifactLoader,\n type ArtifactSaver,\n type ArtifactResult,\n} from \"./pipeline-artifacts.js\";\nimport { createMappedChildRunner, createSingleChildRunner } from \"./child-execution.js\";\nimport { createIterationRunner, type IterationDecision, type IterationState } from \"./iteration.js\";\nimport type { ToMappedChildStepProgressOptions } from \"./mapped-child-progress.js\";\nimport {\n STEP_CACHE,\n STEP_NESTED_PIPELINE,\n STEP_OPTIONS_SCHEMA,\n STEP_REMOTE,\n STEP_AGENT,\n STEP_ORCHESTRATION,\n} from \"./pipeline-step-metadata.js\";\nimport type {\n InferSchemaInput,\n InferSchemaOutput,\n Pipeline,\n PipelineExecutionContext,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunControls,\n PipelineStepContext,\n RemoteStepAdapter,\n StandardSchemaV1,\n StepSkipDecision,\n} from \"./pipeline-types.js\";\n\n/**\n * A step's dependencies are references to the dependency's own step object, not string ids\n * into a hand-maintained output-type map. This buys two things no amount of extra generics\n * on a string-keyed design could:\n * - a step used before its dependency exists is a compile error (JS temporal dead zone on\n * `const`), so out-of-order and self/cyclic dependencies are caught by the language, not\n * a bespoke runtime check\n * - each step only ever states its own id/deps; the output-type map is derived, never\n * restated, and callers of `definePipeline`/`createSteps` never write out its generics\n */\ntype AnyStepDryRunHandler<TOptions extends object> = {\n bivarianceHack(\n inputs: Record<string, unknown>,\n context: PipelineStepContext<TOptions>\n ): unknown | Promise<unknown>;\n}[\"bivarianceHack\"];\n\n/** Runtime shape shared by every declared pipeline step. */\nexport interface AnyStep<TOptions extends object = object> {\n readonly [STEP_ORCHESTRATION]?: true;\n readonly [STEP_AGENT]?: NonNullable<PipelinePlanStep[\"agent\"]>;\n readonly [STEP_NESTED_PIPELINE]?: NonNullable<PipelinePlanStep[\"nestedPipeline\"]>;\n readonly [STEP_REMOTE]?: NonNullable<PipelinePlanStep[\"remote\"]>;\n readonly [STEP_OPTIONS_SCHEMA]?: StandardSchemaV1;\n readonly id: string;\n readonly dependsOn?: readonly AnyStep<TOptions>[];\n readonly optionalDependsOn?: readonly AnyStep<TOptions>[];\n readonly skipAfterFailureOf?: readonly AnyStep<TOptions>[];\n /** Optional human-facing display name. Stable machine identity remains `id`. */\n readonly name?: string;\n readonly description?: string;\n readonly metadata?: PipelineMetadata;\n /**\n * Dry-run policy. Omitted runs the normal handler, `\"skip\"` structurally\n * skips it, and a handler substitutes for `run` while preserving its output.\n */\n readonly dryRun?: \"skip\" | AnyStepDryRunHandler<TOptions>;\n /** Optional Standard Schema for values published by this step. */\n readonly outputSchema?: StandardSchemaV1;\n /** Explicit output caching for ordinary deterministic steps only. */\n readonly cache?: boolean | StepCache<Record<string, unknown>, TOptions>;\n readonly [STEP_CACHE]?: CompiledStepCache<TOptions>;\n /**\n * Optional runtime skip. Return a non-empty reason (or `{ reason, value }`) to\n * skip without calling `run`. Policy skips unlock dependents; structural skips\n * (dry-run, filtered, …) do not use this hook.\n */\n skip?(\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<TOptions>\n ): StepSkipDecision | Promise<StepSkipDecision>;\n run(inputs: Record<string, unknown>, context: PipelineStepContext<TOptions>): unknown;\n}\n\n/** The step fields that `buildStep` merges onto the id-bearing shell. */\ntype StepDefinitionBody<TOptions extends object> = Omit<AnyStep<TOptions>, \"id\">;\n\n/** Typed pipeline step carrying its stable ID, output, and option types. */\nexport interface Step<\n TId extends string,\n TOut,\n TOptions extends object,\n TInputOptions extends object = TOptions,\n TRunOut = TOut,\n TOptionsSchema extends StandardSchemaV1 | undefined = StandardSchemaV1 | undefined,\n> extends AnyStep<TOptions> {\n readonly [STEP_OPTIONS_SCHEMA]?: TOptionsSchema;\n readonly id: TId;\n run(\n inputs: Record<string, unknown>,\n context: PipelineStepContext<TOptions>\n ): TRunOut | Promise<TRunOut>;\n /** Type-only: carries this step's output type for sibling inference. Never set at runtime. */\n readonly __outputType?: TOut;\n /** Type-only: carries pre-validation run options for pipeline call-site inference. */\n readonly __inputOptionsType?: TInputOptions;\n}\n\n/**\n * Extract a step's output type for dependency typing.\n * Prefer matching `Step<…, TOut, …>` over `{ __outputType?: infer T }`: optional-property\n * inference collapses `TOut | undefined` to `TOut`, which hides policy-skip widening.\n */\nexport type StepOutput<S> =\n S extends Step<string, infer TOut, infer _TOptions, infer _TInputOptions, infer _TRunOut>\n ? TOut\n : never;\n\ninterface StepToken {\n readonly id: string;\n readonly __outputType?: unknown;\n}\n\ntype RequiredInputs<TDeps extends readonly StepToken[]> = {\n [S in TDeps[number] as S[\"id\"]]: StepOutput<S>;\n};\n\ntype OptionalInputs<TDeps extends readonly StepToken[]> = {\n [S in TDeps[number] as S[\"id\"]]?: StepOutput<S>;\n};\n\ntype PipelineResultOf<TPipeline> =\n TPipeline extends Pipeline<object, infer TResult, infer _TStepId, infer _TTargetId>\n ? TResult\n : never;\n\ntype PipelineOptionsOf<TPipeline> =\n TPipeline extends Pipeline<infer TOptions, unknown, infer _TStepId, infer _TTargetId>\n ? TOptions\n : never;\n\ntype PipelineRunControlsOf<TPipeline> =\n TPipeline extends Pipeline<infer _TOptions, unknown, infer TStepId, infer TTargetId>\n ? PipelineRunControls<TStepId, TTargetId>\n : never;\n\ntype ChildPipelineStepDefinitionBase<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TChildPipeline extends Pipeline<object, unknown>,\n> = {\n pipeline: TChildPipeline;\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: \"skip\";\n controls?:\n | PipelineRunControlsOf<TChildPipeline>\n | ((\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControlsOf<TChildPipeline>);\n} & ([TParentOptions] extends [PipelineOptionsOf<NoInfer<TChildPipeline>>]\n ? {\n mapOptions?(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): PipelineOptionsOf<TChildPipeline>;\n }\n : {\n mapOptions(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): PipelineOptionsOf<TChildPipeline>;\n });\n\n/** Child step without policy skip (dependents see the full child result type). */\ntype ChildPipelineStepDefinition<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TChildPipeline extends Pipeline<object, unknown>,\n> = ChildPipelineStepDefinitionBase<TParentOptions, TDeps, TOptionalDeps, TChildPipeline>;\n\n/**\n * Presentation options for opaque `forEachPipeline` progress.\n * Defaults are domain-neutral (`N/M items · K running · key/step`).\n * Override `formatMessage` when a domain wants its own noun (images, shards, …).\n */\nexport type MappedChildProgressOptions = ToMappedChildStepProgressOptions;\n\ntype MappedChildPipelineStepDefinition<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n> = {\n pipeline: TChildPipeline;\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: \"skip\";\n items(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): readonly TItem[] | Promise<readonly TItem[]>;\n key(item: TItem, index: number): string;\n concurrency?:\n | number\n | ((\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ) => number);\n /**\n * How the opaque parent step reports live fan-out progress.\n * Purely presentational — does not change scheduling or results.\n */\n progress?: MappedChildProgressOptions;\n controls?:\n | PipelineRunControlsOf<TChildPipeline>\n | ((\n item: TItem,\n index: number,\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControlsOf<TChildPipeline>);\n mapOptions(\n item: TItem,\n index: number,\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): PipelineOptionsOf<TChildPipeline>;\n};\n\ntype StepSkipPredicate<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TOut,\n TDecision extends StepSkipDecision<TOut> = StepSkipDecision<TOut>,\n> = (\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TOptions>\n) => TDecision | Promise<TDecision>;\n\ntype PolicySkippedOutput<TOut, TDecision> = [\n Exclude<Awaited<TDecision>, false | null | undefined>,\n] extends [{ reason: string; value: unknown }]\n ? TOut\n : TOut | undefined;\n\ntype StepDryRunPolicy<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TOut,\n> =\n | \"skip\"\n | ((\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ) => TOut | Promise<TOut>);\n\ntype PlainStepFields<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TOut,\n> = {\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: StepDryRunPolicy<TOptions, TDeps, TOptionalDeps, TOut>;\n outputSchema?: never;\n cache?: boolean | StepCache<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TOptions>;\n run(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ): TOut | Promise<TOut>;\n};\n\ntype SchemaStepFields<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TSchema extends StandardSchemaV1,\n> = Omit<\n PlainStepFields<TOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>>,\n \"outputSchema\"\n> & {\n outputSchema: TSchema;\n};\n\ntype RemoteStepDefinitionBase<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TPayload,\n TSchema extends StandardSchemaV1,\n> = {\n adapter: RemoteStepAdapter<TParentOptions, TPayload, InferSchemaInput<TSchema>>;\n mapInput(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TParentOptions>\n ): TPayload;\n outputSchema: TSchema;\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: StepDryRunPolicy<TParentOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>>;\n};\n\n/** Step constructors scoped to one pipeline's domain option types. */\ntype StepFactory<\n TOptions extends object,\n TInputOptions extends object = TOptions,\n TOptionsSchema extends StandardSchemaV1 | undefined = undefined,\n> = ReturnType<typeof createStepFactory<TOptions, TInputOptions, TOptionsSchema>>;\n\n/**\n * Create typed step constructors for one pipeline definition.\n * Returns a step factory scoped to one pipeline's domain options. Pass built-in\n * run controls as the second argument to `run` / `runOrThrow`, or through a\n * child step's separate `controls` field.\n */\nexport function createSteps<TOptions extends object = {}>(): StepFactory<TOptions>;\nexport function createSteps<const TSchema extends StandardSchemaV1<object, object> | undefined>(\n optionsSchema: TSchema\n): StepFactory<\n TSchema extends StandardSchemaV1 ? InferSchemaOutput<TSchema> : object,\n TSchema extends StandardSchemaV1 ? InferSchemaInput<TSchema> : object,\n TSchema\n>;\nexport function createSteps(\n optionsSchema?: StandardSchemaV1<object, object>\n): StepFactory<object, object, StandardSchemaV1 | undefined> {\n return createStepFactory<object, object, StandardSchemaV1 | undefined>(optionsSchema);\n}\n\nfunction createStepFactory<\n TOptions extends object,\n TInputOptions extends object = TOptions,\n TOptionsSchema extends StandardSchemaV1 | undefined = undefined,\n>(optionsSchema?: TOptionsSchema) {\n // Preserve the runtime schema in the step type so adapters cannot infer flags\n // from erased TypeScript-only options.\n type BuiltStep<\n TId extends string,\n TOut,\n TStepOptions extends object,\n TInput extends object,\n TRunOut = TOut,\n > = TOptionsSchema extends StandardSchemaV1\n ? Step<TId, TOut, TStepOptions, TInput, TRunOut, TOptionsSchema>\n : Step<TId, TOut, TStepOptions, TInput, TRunOut>;\n const buildStep = (id: string, definition: StepDefinitionBody<TOptions>): AnyStep<TOptions> => {\n const built: AnyStep<TOptions> = { id, ...definition };\n if (optionsSchema) {\n Object.defineProperty(built, STEP_OPTIONS_SCHEMA, { value: optionsSchema });\n }\n return built;\n };\n\n function step<\n TId extends string,\n TSchema extends StandardSchemaV1,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<InferSchemaInput<TSchema>> = StepSkipDecision<\n InferSchemaInput<TSchema>\n >,\n >(\n id: TId,\n definition: SchemaStepFields<TOptions, TDeps, TOptionalDeps, TSchema> & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>, TDecision>\n | undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<InferSchemaOutput<TSchema>, TDecision>,\n TOptions,\n TInputOptions,\n InferSchemaInput<TSchema>\n >;\n function step<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TOut = unknown,\n TDecision extends StepSkipDecision<NoInfer<TOut>> = StepSkipDecision<NoInfer<TOut>>,\n >(\n id: TId,\n definition: PlainStepFields<TOptions, TDeps, TOptionalDeps, TOut> & {\n skip: StepSkipPredicate<TOptions, TDeps, TOptionalDeps, NoInfer<TOut>, TDecision> | undefined;\n }\n ): BuiltStep<TId, PolicySkippedOutput<TOut, TDecision>, TOptions, TInputOptions>;\n function step<\n TId extends string,\n TSchema extends StandardSchemaV1,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: SchemaStepFields<TOptions, TDeps, TOptionalDeps, TSchema> & { skip?: never }\n ): BuiltStep<TId, InferSchemaOutput<TSchema>, TOptions, TInputOptions, InferSchemaInput<TSchema>>;\n function step<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TOut = unknown,\n >(\n id: TId,\n definition: PlainStepFields<TOptions, TDeps, TOptionalDeps, TOut> & { skip?: never }\n ): BuiltStep<TId, TOut, TOptions, TInputOptions>;\n function step(id: string, definition: StepDefinitionBody<TOptions>): AnyStep<TOptions> {\n return buildStep(id, definition);\n }\n\n /** Read an artifact as an ordinary step, publishing only its typed value. */\n function loadArtifact<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TValue = unknown,\n >(\n id: TId,\n definition: Omit<\n PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>,\n \"run\" | \"cache\"\n > & {\n cache?: never;\n load: ArtifactLoader<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TValue, TOptions>;\n }\n ): BuiltStep<TId, TValue, TOptions, TInputOptions> {\n const { cache, load, dryRun, ...fields } = definition;\n if (cache !== undefined) throw new Error(\"Artifact helpers cannot configure caching\");\n const wrap =\n (handler: typeof load) =>\n async (\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ) => {\n const loaded = await handler(inputs, context);\n context.recordArtifact({ operation: \"read\", artifact: loaded.artifact });\n return loaded.value;\n };\n return step(id, {\n ...fields,\n run: wrap(load),\n dryRun: typeof dryRun === \"function\" ? wrap(dryRun) : dryRun,\n });\n }\n\n /** Write an artifact as an ordinary step. Dry runs skip unless a preview is supplied. */\n function saveArtifact<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TValue = unknown,\n >(\n id: TId,\n definition: Omit<\n PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>,\n \"run\" | \"cache\"\n > & {\n cache?: never;\n save: ArtifactSaver<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TValue, TOptions>;\n }\n ): BuiltStep<TId, TValue, TOptions, TInputOptions> {\n const { cache, save, dryRun, ...fields } = definition;\n if (cache !== undefined) throw new Error(\"Artifact helpers cannot configure caching\");\n const wrap =\n (handler: typeof save) =>\n async (\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ) => {\n const saved = await handler(inputs, context);\n context.recordArtifact({ operation: \"write\", artifact: saved.artifact });\n return saved.value;\n };\n return step(id, {\n ...fields,\n run: wrap(save),\n dryRun: typeof dryRun === \"function\" ? wrap(dryRun) : \"skip\",\n });\n }\n\n const buildPipelineStep = (\n id: string,\n config: ChildPipelineStepDefinitionBase<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n Pipeline<object, unknown>\n > & {\n skip?: StepSkipPredicate<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n unknown\n >;\n mapResult?: (\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<TOptions>\n ) => unknown;\n }\n ) => {\n const definition: StepDefinitionBody<TOptions> = {\n [STEP_NESTED_PIPELINE]: {\n mode: \"single\" as const,\n pipelineId: config.pipeline.id,\n identity: config.pipeline.definition?.identity,\n stepIds: config.pipeline.stepIds,\n },\n dependsOn: config.dependsOn,\n optionalDependsOn: config.optionalDependsOn,\n skipAfterFailureOf: config.skipAfterFailureOf,\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dryRun: config.dryRun,\n run: createSingleChildRunner({ ...config, stepId: id }),\n };\n\n const skip = config.skip;\n if (skip !== undefined) {\n definition.skip = skip;\n }\n return buildStep(id, definition);\n };\n\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: ChildPipelineStepDefinition<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip?: never;\n mapResult?: undefined;\n }\n ): BuiltStep<TId, PipelineResultOf<TChildPipeline>, TOptions, TInputOptions>;\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: ChildPipelineStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip?: never;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, Awaited<TOut>, TOptions, TInputOptions>;\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<PipelineResultOf<TChildPipeline>> = StepSkipDecision<\n PipelineResultOf<TChildPipeline>\n >,\n >(\n id: TId,\n definition: ChildPipelineStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip:\n | StepSkipPredicate<\n TOptions,\n TDeps,\n TOptionalDeps,\n PipelineResultOf<TChildPipeline>,\n TDecision\n >\n | undefined;\n mapResult?: undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<PipelineResultOf<TChildPipeline>, TDecision>,\n TOptions,\n TInputOptions\n >;\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<NoInfer<Awaited<TOut>>> = StepSkipDecision<\n NoInfer<Awaited<TOut>>\n >,\n >(\n id: TId,\n definition: ChildPipelineStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, NoInfer<Awaited<TOut>>, TDecision>\n | undefined;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, PolicySkippedOutput<Awaited<TOut>, TDecision>, TOptions, TInputOptions>;\n function fromPipeline(\n id: string,\n definition: Parameters<typeof buildPipelineStep>[1]\n ): AnyStep<TOptions> {\n return buildPipelineStep(id, definition);\n }\n\n const buildRemoteStep = (\n id: string,\n config: {\n adapter: RemoteStepAdapter<object, unknown, unknown>;\n mapInput(inputs: Record<string, unknown>, context: PipelineStepContext<TOptions>): unknown;\n outputSchema: StandardSchemaV1;\n dependsOn?: readonly AnyStep<TOptions>[];\n optionalDependsOn?: readonly AnyStep<TOptions>[];\n skipAfterFailureOf?: readonly AnyStep<TOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: \"skip\" | AnyStepDryRunHandler<TOptions>;\n skip?: StepSkipPredicate<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n unknown\n >;\n }\n ) => {\n const remote: NonNullable<PipelinePlanStep[\"remote\"]> = { engine: config.adapter.engine };\n if (config.adapter.target !== undefined) remote.target = config.adapter.target;\n const definition: StepDefinitionBody<TOptions> = {\n [STEP_REMOTE]: remote,\n dependsOn: config.dependsOn,\n optionalDependsOn: config.optionalDependsOn,\n skipAfterFailureOf: config.skipAfterFailureOf,\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dryRun: config.dryRun,\n outputSchema: config.outputSchema,\n run: (inputs: Record<string, unknown>, context: PipelineStepContext<TOptions>) =>\n config.adapter.invoke(config.mapInput(inputs, context), context),\n };\n const skip = config.skip;\n if (skip !== undefined) {\n definition.skip = skip;\n }\n return buildStep(id, definition);\n };\n\n function fromRemote<\n TId extends string,\n TSchema extends StandardSchemaV1,\n TPayload,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: RemoteStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TPayload, TSchema> & {\n skip?: never;\n }\n ): BuiltStep<TId, InferSchemaOutput<TSchema>, TOptions, TInputOptions, InferSchemaInput<TSchema>>;\n function fromRemote<\n TId extends string,\n TSchema extends StandardSchemaV1,\n TPayload,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<InferSchemaInput<TSchema>> = StepSkipDecision<\n InferSchemaInput<TSchema>\n >,\n >(\n id: TId,\n definition: RemoteStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TPayload, TSchema> & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>, TDecision>\n | undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<InferSchemaOutput<TSchema>, TDecision>,\n TOptions,\n TInputOptions,\n InferSchemaInput<TSchema>\n >;\n function fromRemote(\n id: string,\n definition: Parameters<typeof buildRemoteStep>[1]\n ): AnyStep<TOptions> {\n return buildRemoteStep(id, definition);\n }\n\n const buildMappedPipelineStep = (\n id: string,\n config: MappedChildPipelineStepDefinition<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n Pipeline<object, unknown>,\n unknown\n > & {\n mapResult?: (\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<TOptions>\n ) => unknown;\n skip?: StepSkipPredicate<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n unknown\n >;\n }\n ) => {\n const definition: StepDefinitionBody<TOptions> = {\n [STEP_NESTED_PIPELINE]: {\n mode: \"for-each\" as const,\n concurrency:\n typeof config.concurrency === \"function\" ? \"dynamic\" : (config.concurrency ?? 1),\n pipelineId: config.pipeline.id,\n identity: config.pipeline.definition?.identity,\n stepIds: config.pipeline.stepIds,\n },\n dependsOn: config.dependsOn,\n optionalDependsOn: config.optionalDependsOn,\n skipAfterFailureOf: config.skipAfterFailureOf,\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dryRun: config.dryRun,\n run: createMappedChildRunner({ ...config, stepId: id }),\n };\n\n const skip = config.skip;\n if (skip !== undefined) {\n definition.skip = skip;\n }\n return buildStep(id, definition);\n };\n\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip?: never;\n mapResult?: undefined;\n }\n ): BuiltStep<TId, readonly PipelineResultOf<TChildPipeline>[], TOptions, TInputOptions>;\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip?: never;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n item: TItem,\n index: number,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, readonly TOut[], TOptions, TInputOptions>;\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<readonly PipelineResultOf<TChildPipeline>[]> =\n StepSkipDecision<readonly PipelineResultOf<TChildPipeline>[]>,\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip:\n | StepSkipPredicate<\n TOptions,\n TDeps,\n TOptionalDeps,\n readonly PipelineResultOf<TChildPipeline>[],\n TDecision\n >\n | undefined;\n mapResult?: undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<readonly PipelineResultOf<TChildPipeline>[], TDecision>,\n TOptions,\n TInputOptions\n >;\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<NoInfer<readonly TOut[]>> = StepSkipDecision<\n NoInfer<readonly TOut[]>\n >,\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, NoInfer<readonly TOut[]>, TDecision>\n | undefined;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n item: TItem,\n index: number,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, PolicySkippedOutput<readonly TOut[], TDecision>, TOptions, TInputOptions>;\n function forEachPipeline(\n id: string,\n definition: Parameters<typeof buildMappedPipelineStep>[1]\n ): AnyStep<TOptions> {\n return buildMappedPipelineStep(id, definition);\n }\n\n function iteratePipeline<\n const TId extends string,\n TChild extends Pipeline<object, unknown>,\n TState,\n TResult,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: {\n pipeline: TChild;\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dependsOn?: TDeps;\n maxIterations: number;\n dryRun?: \"skip\";\n controls?: PipelineRunControlsOf<TChild>;\n initialState(\n inputs: RequiredInputs<TDeps>,\n context: PipelineExecutionContext<TOptions>\n ): TState;\n mapOptions(\n state: IterationState<NoInfer<TState>>,\n inputs: RequiredInputs<TDeps>,\n context: PipelineExecutionContext<TOptions>\n ): PipelineOptionsOf<TChild>;\n transition(\n result: PipelineResultOf<TChild>,\n state: IterationState<NoInfer<TState>>,\n context: PipelineExecutionContext<TOptions>\n ):\n | IterationDecision<NoInfer<TState>, TResult>\n | Promise<IterationDecision<NoInfer<TState>, TResult>>;\n }\n ): BuiltStep<TId, Awaited<TResult>, TOptions, TInputOptions>;\n function iteratePipeline(\n id: string,\n definition: Omit<Parameters<typeof createIterationRunner<TOptions>>[0], \"stepId\"> & {\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dependsOn?: readonly AnyStep<TOptions>[];\n dryRun?: \"skip\";\n }\n ): AnyStep<TOptions> {\n if (!Number.isSafeInteger(definition.maxIterations) || definition.maxIterations < 1) {\n throw new RangeError(\"iteratePipeline maxIterations must be a positive safe integer\");\n }\n const controls = definition.controls ? structuredClone(definition.controls) : undefined;\n if (controls) {\n if (controls.targets) Object.freeze(controls.targets);\n if (controls.stepIds) Object.freeze(controls.stepIds);\n Object.freeze(controls);\n }\n const config = { ...definition, stepId: id, controls };\n return buildStep(id, {\n [STEP_NESTED_PIPELINE]: {\n mode: \"iterate\",\n maxIterations: config.maxIterations,\n controls: config.controls,\n pipelineId: config.pipeline.id,\n identity: config.pipeline.definition?.identity,\n stepIds: config.pipeline.stepIds,\n },\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dependsOn: config.dependsOn,\n dryRun: config.dryRun,\n run: createIterationRunner(config),\n });\n }\n\n const factory = {\n step,\n loadArtifact,\n saveArtifact,\n fromPipeline,\n fromRemote,\n forEachPipeline,\n iteratePipeline,\n };\n\n return factory;\n}\n"]}
1
+ {"version":3,"file":"pipeline-steps.js","sourceRoot":"","sources":["../../src/core/pipeline-steps.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PipelineMetadata } from \"../tracing/graph-metadata.js\";\nimport type { CompiledStepCache, StepCache } from \"./pipeline-cache.js\";\nimport {\n type ArtifactLoader,\n type ArtifactSaver,\n type ArtifactResult,\n} from \"./pipeline-artifacts.js\";\nimport { createMappedChildRunner, createSingleChildRunner } from \"./child-execution.js\";\nimport { createIterationRunner, type IterationDecision, type IterationState } from \"./iteration.js\";\nimport type { ToMappedChildStepProgressOptions } from \"./mapped-child-progress.js\";\nimport {\n STEP_CACHE,\n STEP_NESTED_PIPELINE,\n STEP_OPTIONS_SCHEMA,\n STEP_REMOTE,\n STEP_AGENT,\n STEP_ORCHESTRATION,\n} from \"./pipeline-step-metadata.js\";\nimport type {\n InferSchemaInput,\n InferSchemaOutput,\n Pipeline,\n PipelineExecutionContext,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunControls,\n PipelineStepContext,\n RemoteStepAdapter,\n StandardSchemaV1,\n StepSkipDecision,\n} from \"./pipeline-types.js\";\n\n/**\n * A step's dependencies are references to the dependency's own step object, not string ids\n * into a hand-maintained output-type map. This buys two things no amount of extra generics\n * on a string-keyed design could:\n * - a step used before its dependency exists is a compile error (JS temporal dead zone on\n * `const`), so out-of-order and self/cyclic dependencies are caught by the language, not\n * a bespoke runtime check\n * - each step only ever states its own id/deps; the output-type map is derived, never\n * restated, and callers of `definePipeline`/`createSteps` never write out its generics\n */\ntype AnyStepDryRunHandler<TOptions extends object> = {\n bivarianceHack(\n inputs: Record<string, unknown>,\n context: PipelineStepContext<TOptions>\n ): unknown | Promise<unknown>;\n}[\"bivarianceHack\"];\n\n/** Runtime shape shared by every declared pipeline step. */\nexport interface AnyStep<TOptions extends object = object> {\n readonly [STEP_ORCHESTRATION]?: true;\n readonly [STEP_AGENT]?: NonNullable<PipelinePlanStep[\"agent\"]>;\n readonly [STEP_NESTED_PIPELINE]?: NonNullable<PipelinePlanStep[\"nestedPipeline\"]>;\n readonly [STEP_REMOTE]?: NonNullable<PipelinePlanStep[\"remote\"]>;\n readonly [STEP_OPTIONS_SCHEMA]?: StandardSchemaV1;\n readonly id: string;\n readonly dependsOn?: readonly AnyStep<TOptions>[];\n readonly optionalDependsOn?: readonly AnyStep<TOptions>[];\n readonly skipAfterFailureOf?: readonly AnyStep<TOptions>[];\n /** Optional human-facing display name. Stable machine identity remains `id`. */\n readonly name?: string;\n readonly description?: string;\n readonly metadata?: PipelineMetadata;\n /**\n * Dry-run policy. Omitted runs the normal handler, `\"skip\"` structurally\n * skips it, and a handler substitutes for `run` while preserving its output.\n */\n readonly dryRun?: \"skip\" | AnyStepDryRunHandler<TOptions>;\n /** Optional Standard Schema for values published by this step. */\n readonly outputSchema?: StandardSchemaV1;\n /** Explicit output caching for ordinary deterministic steps only. */\n readonly cache?: boolean | StepCache<Record<string, unknown>, TOptions>;\n readonly [STEP_CACHE]?: CompiledStepCache<TOptions>;\n /**\n * Optional runtime skip. Return a non-empty reason (or `{ reason, value }`) to\n * skip without calling `run`. Policy skips unlock dependents; structural skips\n * (dry-run, filtered, …) do not use this hook.\n */\n skip?(\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<TOptions>\n ): StepSkipDecision | Promise<StepSkipDecision>;\n run(inputs: Record<string, unknown>, context: PipelineStepContext<TOptions>): unknown;\n}\n\n/** The step fields that `buildStep` merges onto the id-bearing shell. */\ntype StepDefinitionBody<TOptions extends object> = Omit<AnyStep<TOptions>, \"id\">;\n\n/** Typed pipeline step carrying its stable ID, output, and option types. */\nexport interface Step<\n TId extends string,\n TOut,\n TOptions extends object,\n TInputOptions extends object = TOptions,\n TRunOut = TOut,\n TOptionsSchema extends StandardSchemaV1 | undefined = StandardSchemaV1 | undefined,\n> extends AnyStep<TOptions> {\n readonly [STEP_OPTIONS_SCHEMA]?: TOptionsSchema;\n readonly id: TId;\n run(\n inputs: Record<string, unknown>,\n context: PipelineStepContext<TOptions>\n ): TRunOut | Promise<TRunOut>;\n /** Type-only: carries this step's output type for sibling inference. Never set at runtime. */\n readonly __outputType?: TOut;\n /** Type-only: carries pre-validation run options for pipeline call-site inference. */\n readonly __inputOptionsType?: TInputOptions;\n}\n\n/**\n * Extract a step's output type for dependency typing.\n * Prefer matching `Step<…, TOut, …>` over `{ __outputType?: infer T }`: optional-property\n * inference collapses `TOut | undefined` to `TOut`, which hides policy-skip widening.\n */\nexport type StepOutput<S> =\n S extends Step<string, infer TOut, infer _TOptions, infer _TInputOptions, infer _TRunOut>\n ? TOut\n : never;\n\ninterface StepToken {\n readonly id: string;\n readonly __outputType?: unknown;\n}\n\ntype RequiredInputs<TDeps extends readonly StepToken[]> = {\n [S in TDeps[number] as S[\"id\"]]: StepOutput<S>;\n};\n\ntype OptionalInputs<TDeps extends readonly StepToken[]> = {\n [S in TDeps[number] as S[\"id\"]]?: StepOutput<S>;\n};\n\ntype PipelineResultOf<TPipeline> =\n TPipeline extends Pipeline<object, infer TResult, infer _TStepId, infer _TTargetId>\n ? TResult\n : never;\n\ntype PipelineOptionsOf<TPipeline> =\n TPipeline extends Pipeline<infer TOptions, unknown, infer _TStepId, infer _TTargetId>\n ? TOptions\n : never;\n\ntype PipelineRunControlsOf<TPipeline> =\n TPipeline extends Pipeline<infer _TOptions, unknown, infer TStepId, infer TTargetId>\n ? PipelineRunControls<TStepId, TTargetId>\n : never;\n\ntype ChildPipelineStepDefinitionBase<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TChildPipeline extends Pipeline<object, unknown>,\n> = {\n pipeline: TChildPipeline;\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: \"skip\";\n controls?:\n | PipelineRunControlsOf<TChildPipeline>\n | ((\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControlsOf<TChildPipeline>);\n} & ([TParentOptions] extends [PipelineOptionsOf<NoInfer<TChildPipeline>>]\n ? {\n mapOptions?(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): PipelineOptionsOf<TChildPipeline>;\n }\n : {\n mapOptions(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): PipelineOptionsOf<TChildPipeline>;\n });\n\n/** Child step without policy skip (dependents see the full child result type). */\ntype ChildPipelineStepDefinition<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TChildPipeline extends Pipeline<object, unknown>,\n> = ChildPipelineStepDefinitionBase<TParentOptions, TDeps, TOptionalDeps, TChildPipeline>;\n\n/**\n * Presentation options for opaque `forEachPipeline` progress.\n * Defaults are domain-neutral (`N/M items · K running · key/step`).\n * Override `formatMessage` when a domain wants its own noun (images, shards, …).\n */\nexport type MappedChildProgressOptions = ToMappedChildStepProgressOptions;\n\ntype MappedChildPipelineStepDefinition<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n> = {\n pipeline: TChildPipeline;\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: \"skip\";\n items(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): readonly TItem[] | Promise<readonly TItem[]>;\n key(item: TItem, index: number): string;\n concurrency?:\n | number\n | ((\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ) => number);\n /**\n * How the opaque parent step reports live fan-out progress.\n * Purely presentational — does not change scheduling or results.\n */\n progress?: MappedChildProgressOptions;\n controls?:\n | PipelineRunControlsOf<TChildPipeline>\n | ((\n item: TItem,\n index: number,\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControlsOf<TChildPipeline>);\n mapOptions(\n item: TItem,\n index: number,\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TParentOptions>\n ): PipelineOptionsOf<TChildPipeline>;\n};\n\ntype StepSkipPredicate<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TOut,\n TDecision extends StepSkipDecision<TOut> = StepSkipDecision<TOut>,\n> = (\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineExecutionContext<TOptions>\n) => TDecision | Promise<TDecision>;\n\ntype PolicySkippedOutput<TOut, TDecision> = [\n Exclude<Awaited<TDecision>, false | null | undefined>,\n] extends [{ reason: string; value: unknown }]\n ? TOut\n : TOut | undefined;\n\ntype StepDryRunPolicy<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TOut,\n> =\n | \"skip\"\n | ((\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ) => TOut | Promise<TOut>);\n\ntype PlainStepFields<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TOut,\n> = {\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: StepDryRunPolicy<TOptions, TDeps, TOptionalDeps, TOut>;\n outputSchema?: never;\n cache?: boolean | StepCache<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TOptions>;\n run(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ): TOut | Promise<TOut>;\n};\n\ntype SchemaStepFields<\n TOptions extends object,\n TDeps extends readonly AnyStep<TOptions>[],\n TOptionalDeps extends readonly AnyStep<TOptions>[],\n TSchema extends StandardSchemaV1,\n> = Omit<\n PlainStepFields<TOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>>,\n \"outputSchema\"\n> & {\n outputSchema: TSchema;\n};\n\ntype RemoteStepDefinitionBase<\n TParentOptions extends object,\n TDeps extends readonly AnyStep<TParentOptions>[],\n TOptionalDeps extends readonly AnyStep<TParentOptions>[],\n TPayload,\n TSchema extends StandardSchemaV1,\n> = {\n adapter: RemoteStepAdapter<TParentOptions, TPayload, InferSchemaInput<TSchema>>;\n mapInput(\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TParentOptions>\n ): TPayload;\n outputSchema: TSchema;\n dependsOn?: TDeps;\n optionalDependsOn?: TOptionalDeps;\n skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: StepDryRunPolicy<TParentOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>>;\n};\n\n/** Step constructors scoped to one pipeline's domain option types. */\ntype StepFactory<\n TOptions extends object,\n TInputOptions extends object = TOptions,\n TOptionsSchema extends StandardSchemaV1 | undefined = undefined,\n> = ReturnType<typeof createStepFactory<TOptions, TInputOptions, TOptionsSchema>>;\n\n/**\n * Create typed step constructors for one pipeline definition.\n * Returns a step factory scoped to one pipeline's domain options. Pass built-in\n * run controls as the second argument to `run` / `runOrThrow`, or through a\n * child step's separate `controls` field.\n */\nexport function createSteps<TOptions extends object = {}>(): StepFactory<TOptions>;\nexport function createSteps<const TSchema extends StandardSchemaV1<object, object> | undefined>(\n optionsSchema: TSchema\n): StepFactory<\n TSchema extends StandardSchemaV1 ? InferSchemaOutput<TSchema> : object,\n TSchema extends StandardSchemaV1 ? InferSchemaInput<TSchema> : object,\n TSchema\n>;\nexport function createSteps(\n optionsSchema?: StandardSchemaV1<object, object>\n): StepFactory<object, object, StandardSchemaV1 | undefined> {\n return createStepFactory<object, object, StandardSchemaV1 | undefined>(optionsSchema);\n}\n\nfunction createStepFactory<\n TOptions extends object,\n TInputOptions extends object = TOptions,\n TOptionsSchema extends StandardSchemaV1 | undefined = undefined,\n>(optionsSchema?: TOptionsSchema) {\n // Preserve the runtime schema in the step type so adapters cannot infer flags\n // from erased TypeScript-only options.\n type BuiltStep<\n TId extends string,\n TOut,\n TStepOptions extends object,\n TInput extends object,\n TRunOut = TOut,\n > = TOptionsSchema extends StandardSchemaV1\n ? Step<TId, TOut, TStepOptions, TInput, TRunOut, TOptionsSchema>\n : Step<TId, TOut, TStepOptions, TInput, TRunOut>;\n const buildStep = (id: string, definition: StepDefinitionBody<TOptions>): AnyStep<TOptions> => {\n const built: AnyStep<TOptions> = { id, ...definition };\n if (optionsSchema) {\n Object.defineProperty(built, STEP_OPTIONS_SCHEMA, { value: optionsSchema });\n }\n return built;\n };\n\n function step<\n TId extends string,\n TSchema extends StandardSchemaV1,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<InferSchemaInput<TSchema>> = StepSkipDecision<\n InferSchemaInput<TSchema>\n >,\n >(\n id: TId,\n definition: SchemaStepFields<TOptions, TDeps, TOptionalDeps, TSchema> & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>, TDecision>\n | undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<InferSchemaOutput<TSchema>, TDecision>,\n TOptions,\n TInputOptions,\n InferSchemaInput<TSchema>\n >;\n function step<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TOut = unknown,\n TDecision extends StepSkipDecision<NoInfer<TOut>> = StepSkipDecision<NoInfer<TOut>>,\n >(\n id: TId,\n definition: PlainStepFields<TOptions, TDeps, TOptionalDeps, TOut> & {\n skip: StepSkipPredicate<TOptions, TDeps, TOptionalDeps, NoInfer<TOut>, TDecision> | undefined;\n }\n ): BuiltStep<TId, PolicySkippedOutput<TOut, TDecision>, TOptions, TInputOptions>;\n function step<\n TId extends string,\n TSchema extends StandardSchemaV1,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: SchemaStepFields<TOptions, TDeps, TOptionalDeps, TSchema> & { skip?: never }\n ): BuiltStep<TId, InferSchemaOutput<TSchema>, TOptions, TInputOptions, InferSchemaInput<TSchema>>;\n function step<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TOut = unknown,\n >(\n id: TId,\n definition: PlainStepFields<TOptions, TDeps, TOptionalDeps, TOut> & { skip?: never }\n ): BuiltStep<TId, TOut, TOptions, TInputOptions>;\n function step(id: string, definition: StepDefinitionBody<TOptions>): AnyStep<TOptions> {\n return buildStep(id, definition);\n }\n\n /** Read an artifact as an ordinary step, publishing only its typed value. */\n function loadArtifact<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TValue = unknown,\n >(\n id: TId,\n definition: Omit<\n PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>,\n \"run\" | \"cache\"\n > & {\n cache?: never;\n load: ArtifactLoader<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TValue, TOptions>;\n }\n ): BuiltStep<TId, TValue, TOptions, TInputOptions> {\n const { cache, load, dryRun, ...fields } = definition;\n if (cache !== undefined) throw new Error(\"Artifact helpers cannot configure caching\");\n const wrap =\n (handler: typeof load) =>\n async (\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ) => {\n const loaded = await handler(inputs, context);\n context.recordArtifact({ operation: \"read\", artifact: loaded.artifact });\n return loaded.value;\n };\n return step(id, {\n ...fields,\n run: wrap(load),\n dryRun: typeof dryRun === \"function\" ? wrap(dryRun) : dryRun,\n });\n }\n\n /** Write an artifact as an ordinary step. Dry runs skip unless a preview is supplied. */\n function saveArtifact<\n TId extends string,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TValue = unknown,\n >(\n id: TId,\n definition: Omit<\n PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>,\n \"run\" | \"cache\"\n > & {\n cache?: never;\n save: ArtifactSaver<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TValue, TOptions>;\n }\n ): BuiltStep<TId, TValue, TOptions, TInputOptions> {\n const { cache, save, dryRun, ...fields } = definition;\n if (cache !== undefined) throw new Error(\"Artifact helpers cannot configure caching\");\n const wrap =\n (handler: typeof save) =>\n async (\n inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>,\n context: PipelineStepContext<TOptions>\n ) => {\n const saved = await handler(inputs, context);\n context.recordArtifact({ operation: \"write\", artifact: saved.artifact });\n return saved.value;\n };\n return step(id, {\n ...fields,\n run: wrap(save),\n dryRun: typeof dryRun === \"function\" ? wrap(dryRun) : \"skip\",\n });\n }\n\n const buildPipelineStep = (\n id: string,\n config: ChildPipelineStepDefinitionBase<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n Pipeline<object, unknown>\n > & {\n skip?: StepSkipPredicate<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n unknown\n >;\n mapResult?: (\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<TOptions>\n ) => unknown;\n }\n ) => {\n const definition: StepDefinitionBody<TOptions> = {\n [STEP_NESTED_PIPELINE]: {\n mode: \"single\" as const,\n pipelineId: config.pipeline.id,\n identity: config.pipeline.definition?.identity,\n stepIds: config.pipeline.stepIds,\n },\n dependsOn: config.dependsOn,\n optionalDependsOn: config.optionalDependsOn,\n skipAfterFailureOf: config.skipAfterFailureOf,\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dryRun: config.dryRun,\n run: createSingleChildRunner({ ...config, stepId: id }),\n };\n\n const skip = config.skip;\n if (skip !== undefined) {\n definition.skip = skip;\n }\n return buildStep(id, definition);\n };\n\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: ChildPipelineStepDefinition<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip?: never;\n mapResult?: undefined;\n }\n ): BuiltStep<TId, PipelineResultOf<TChildPipeline>, TOptions, TInputOptions>;\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: ChildPipelineStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip?: never;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, Awaited<TOut>, TOptions, TInputOptions>;\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<PipelineResultOf<TChildPipeline>> = StepSkipDecision<\n PipelineResultOf<TChildPipeline>\n >,\n >(\n id: TId,\n definition: ChildPipelineStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip:\n | StepSkipPredicate<\n TOptions,\n TDeps,\n TOptionalDeps,\n PipelineResultOf<TChildPipeline>,\n TDecision\n >\n | undefined;\n mapResult?: undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<PipelineResultOf<TChildPipeline>, TDecision>,\n TOptions,\n TInputOptions\n >;\n function fromPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<NoInfer<Awaited<TOut>>> = StepSkipDecision<\n NoInfer<Awaited<TOut>>\n >,\n >(\n id: TId,\n definition: ChildPipelineStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TChildPipeline> & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, NoInfer<Awaited<TOut>>, TDecision>\n | undefined;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, PolicySkippedOutput<Awaited<TOut>, TDecision>, TOptions, TInputOptions>;\n function fromPipeline(\n id: string,\n definition: Parameters<typeof buildPipelineStep>[1]\n ): AnyStep<TOptions> {\n return buildPipelineStep(id, definition);\n }\n\n const buildRemoteStep = (\n id: string,\n config: {\n adapter: RemoteStepAdapter<object, unknown, unknown>;\n mapInput(inputs: Record<string, unknown>, context: PipelineStepContext<TOptions>): unknown;\n outputSchema: StandardSchemaV1;\n dependsOn?: readonly AnyStep<TOptions>[];\n optionalDependsOn?: readonly AnyStep<TOptions>[];\n skipAfterFailureOf?: readonly AnyStep<TOptions>[];\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dryRun?: \"skip\" | AnyStepDryRunHandler<TOptions>;\n skip?: StepSkipPredicate<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n unknown\n >;\n }\n ) => {\n const remote: NonNullable<PipelinePlanStep[\"remote\"]> = { engine: config.adapter.engine };\n if (config.adapter.target !== undefined) remote.target = config.adapter.target;\n const definition: StepDefinitionBody<TOptions> = {\n [STEP_REMOTE]: remote,\n dependsOn: config.dependsOn,\n optionalDependsOn: config.optionalDependsOn,\n skipAfterFailureOf: config.skipAfterFailureOf,\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dryRun: config.dryRun,\n outputSchema: config.outputSchema,\n run: (inputs: Record<string, unknown>, context: PipelineStepContext<TOptions>) =>\n config.adapter.invoke(config.mapInput(inputs, context), context),\n };\n const skip = config.skip;\n if (skip !== undefined) {\n definition.skip = skip;\n }\n return buildStep(id, definition);\n };\n\n function fromRemote<\n TId extends string,\n TSchema extends StandardSchemaV1,\n TPayload,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: RemoteStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TPayload, TSchema> & {\n skip?: never;\n }\n ): BuiltStep<TId, InferSchemaOutput<TSchema>, TOptions, TInputOptions, InferSchemaInput<TSchema>>;\n function fromRemote<\n TId extends string,\n TSchema extends StandardSchemaV1,\n TPayload,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<InferSchemaInput<TSchema>> = StepSkipDecision<\n InferSchemaInput<TSchema>\n >,\n >(\n id: TId,\n definition: RemoteStepDefinitionBase<TOptions, TDeps, TOptionalDeps, TPayload, TSchema> & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>, TDecision>\n | undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<InferSchemaOutput<TSchema>, TDecision>,\n TOptions,\n TInputOptions,\n InferSchemaInput<TSchema>\n >;\n function fromRemote(\n id: string,\n definition: Parameters<typeof buildRemoteStep>[1]\n ): AnyStep<TOptions> {\n return buildRemoteStep(id, definition);\n }\n\n const buildMappedPipelineStep = (\n id: string,\n config: MappedChildPipelineStepDefinition<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n Pipeline<object, unknown>,\n unknown\n > & {\n mapResult?: (\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<TOptions>\n ) => unknown;\n skip?: StepSkipPredicate<\n TOptions,\n readonly AnyStep<TOptions>[],\n readonly AnyStep<TOptions>[],\n unknown\n >;\n }\n ) => {\n const configuredConcurrency = config.concurrency;\n if (\n typeof configuredConcurrency === \"number\" &&\n (!Number.isInteger(configuredConcurrency) || configuredConcurrency < 1)\n ) {\n throw new RangeError(\n `forEachPipeline concurrency must be a positive finite integer, got ${configuredConcurrency}`\n );\n }\n const definition: StepDefinitionBody<TOptions> = {\n [STEP_NESTED_PIPELINE]: {\n mode: \"for-each\" as const,\n concurrency:\n typeof configuredConcurrency === \"function\" ? \"dynamic\" : (configuredConcurrency ?? 1),\n pipelineId: config.pipeline.id,\n identity: config.pipeline.definition?.identity,\n stepIds: config.pipeline.stepIds,\n },\n dependsOn: config.dependsOn,\n optionalDependsOn: config.optionalDependsOn,\n skipAfterFailureOf: config.skipAfterFailureOf,\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dryRun: config.dryRun,\n run: createMappedChildRunner({ ...config, stepId: id }),\n };\n\n const skip = config.skip;\n if (skip !== undefined) {\n definition.skip = skip;\n }\n return buildStep(id, definition);\n };\n\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip?: never;\n mapResult?: undefined;\n }\n ): BuiltStep<TId, readonly PipelineResultOf<TChildPipeline>[], TOptions, TInputOptions>;\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip?: never;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n item: TItem,\n index: number,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, readonly TOut[], TOptions, TInputOptions>;\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<readonly PipelineResultOf<TChildPipeline>[]> =\n StepSkipDecision<readonly PipelineResultOf<TChildPipeline>[]>,\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip:\n | StepSkipPredicate<\n TOptions,\n TDeps,\n TOptionalDeps,\n readonly PipelineResultOf<TChildPipeline>[],\n TDecision\n >\n | undefined;\n mapResult?: undefined;\n }\n ): BuiltStep<\n TId,\n PolicySkippedOutput<readonly PipelineResultOf<TChildPipeline>[], TDecision>,\n TOptions,\n TInputOptions\n >;\n function forEachPipeline<\n TId extends string,\n TChildPipeline extends Pipeline<object, unknown>,\n TItem,\n TOut,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n const TOptionalDeps extends readonly AnyStep<TOptions>[] = [],\n TDecision extends StepSkipDecision<NoInfer<readonly TOut[]>> = StepSkipDecision<\n NoInfer<readonly TOut[]>\n >,\n >(\n id: TId,\n definition: MappedChildPipelineStepDefinition<\n TOptions,\n TDeps,\n TOptionalDeps,\n TChildPipeline,\n TItem\n > & {\n skip:\n | StepSkipPredicate<TOptions, TDeps, TOptionalDeps, NoInfer<readonly TOut[]>, TDecision>\n | undefined;\n mapResult(\n value: PipelineResultOf<TChildPipeline>,\n result: PipelineRun<PipelineResultOf<TChildPipeline>>,\n item: TItem,\n index: number,\n context: PipelineStepContext<TOptions>\n ): TOut;\n }\n ): BuiltStep<TId, PolicySkippedOutput<readonly TOut[], TDecision>, TOptions, TInputOptions>;\n function forEachPipeline(\n id: string,\n definition: Parameters<typeof buildMappedPipelineStep>[1]\n ): AnyStep<TOptions> {\n return buildMappedPipelineStep(id, definition);\n }\n\n function iteratePipeline<\n const TId extends string,\n TChild extends Pipeline<object, unknown>,\n TState,\n TResult,\n const TDeps extends readonly AnyStep<TOptions>[] = [],\n >(\n id: TId,\n definition: {\n pipeline: TChild;\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dependsOn?: TDeps;\n maxIterations: number;\n dryRun?: \"skip\";\n controls?: PipelineRunControlsOf<TChild>;\n initialState(\n inputs: RequiredInputs<TDeps>,\n context: PipelineExecutionContext<TOptions>\n ): TState;\n mapOptions(\n state: IterationState<NoInfer<TState>>,\n inputs: RequiredInputs<TDeps>,\n context: PipelineExecutionContext<TOptions>\n ): PipelineOptionsOf<TChild>;\n transition(\n result: PipelineResultOf<TChild>,\n state: IterationState<NoInfer<TState>>,\n context: PipelineExecutionContext<TOptions>\n ):\n | IterationDecision<NoInfer<TState>, TResult>\n | Promise<IterationDecision<NoInfer<TState>, TResult>>;\n }\n ): BuiltStep<TId, Awaited<TResult>, TOptions, TInputOptions>;\n function iteratePipeline(\n id: string,\n definition: Omit<Parameters<typeof createIterationRunner<TOptions>>[0], \"stepId\"> & {\n name?: string;\n description?: string;\n metadata?: PipelineMetadata;\n dependsOn?: readonly AnyStep<TOptions>[];\n dryRun?: \"skip\";\n }\n ): AnyStep<TOptions> {\n if (!Number.isSafeInteger(definition.maxIterations) || definition.maxIterations < 1) {\n throw new RangeError(\"iteratePipeline maxIterations must be a positive safe integer\");\n }\n const controls = definition.controls ? structuredClone(definition.controls) : undefined;\n if (controls) {\n if (controls.targets) Object.freeze(controls.targets);\n if (controls.stepIds) Object.freeze(controls.stepIds);\n Object.freeze(controls);\n }\n const config = { ...definition, stepId: id, controls };\n return buildStep(id, {\n [STEP_NESTED_PIPELINE]: {\n mode: \"iterate\",\n maxIterations: config.maxIterations,\n controls: config.controls,\n pipelineId: config.pipeline.id,\n identity: config.pipeline.definition?.identity,\n stepIds: config.pipeline.stepIds,\n },\n name: config.name,\n description: config.description,\n metadata: config.metadata,\n dependsOn: config.dependsOn,\n dryRun: config.dryRun,\n run: createIterationRunner(config),\n });\n }\n\n const factory = {\n step,\n loadArtifact,\n saveArtifact,\n fromPipeline,\n fromRemote,\n forEachPipeline,\n iteratePipeline,\n };\n\n return factory;\n}\n"]}
@@ -63,6 +63,10 @@ function forEachPipelineAdapter(registry, name, path) {
63
63
  typeof adapter.concurrency !== "function") {
64
64
  throw new PipelineDocumentError(path, "Expected adapter concurrency to be a number or function");
65
65
  }
66
+ if (typeof adapter.concurrency === "number" &&
67
+ (!Number.isInteger(adapter.concurrency) || adapter.concurrency < 1)) {
68
+ throw new PipelineDocumentError(path, "Expected adapter concurrency to be a positive finite integer when it is a number");
69
+ }
66
70
  validateAdapterMapping(adapter, path);
67
71
  return {
68
72
  items: adapter.items,
@@ -1 +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"]}
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 if (\n typeof adapter.concurrency === \"number\" &&\n (!Number.isInteger(adapter.concurrency) || adapter.concurrency < 1)\n ) {\n throw new PipelineDocumentError(\n path,\n \"Expected adapter concurrency to be a positive finite integer when it is a number\"\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"]}