tubeless 0.2.12 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/core/child-execution.d.ts +0 -23
  2. package/dist/core/child-execution.js +10 -12
  3. package/dist/core/child-execution.js.map +1 -1
  4. package/dist/core/child-progress.js +7 -2
  5. package/dist/core/child-progress.js.map +1 -1
  6. package/dist/core/iteration.d.ts +27 -0
  7. package/dist/core/iteration.js +111 -0
  8. package/dist/core/iteration.js.map +1 -0
  9. package/dist/core/lifecycle.d.ts +7 -5
  10. package/dist/core/lifecycle.js +36 -4
  11. package/dist/core/lifecycle.js.map +1 -1
  12. package/dist/core/pipeline-artifacts.d.ts +11 -0
  13. package/dist/core/pipeline-artifacts.js +2 -0
  14. package/dist/core/pipeline-artifacts.js.map +1 -0
  15. package/dist/core/pipeline-compiler.d.ts +1 -0
  16. package/dist/core/pipeline-compiler.js +1 -0
  17. package/dist/core/pipeline-compiler.js.map +1 -1
  18. package/dist/core/pipeline-definition-identity.d.ts +2 -2
  19. package/dist/core/pipeline-definition-identity.js +28 -5
  20. package/dist/core/pipeline-definition-identity.js.map +1 -1
  21. package/dist/core/pipeline-execute.d.ts +1 -6
  22. package/dist/core/pipeline-execute.js +28 -215
  23. package/dist/core/pipeline-execute.js.map +1 -1
  24. package/dist/core/pipeline-execution-error.d.ts +35 -0
  25. package/dist/core/pipeline-execution-error.js +195 -0
  26. package/dist/core/pipeline-execution-error.js.map +1 -0
  27. package/dist/core/pipeline-identity.d.ts +1 -0
  28. package/dist/core/pipeline-identity.js +1 -0
  29. package/dist/core/pipeline-identity.js.map +1 -1
  30. package/dist/core/pipeline-mermaid.js +4 -1
  31. package/dist/core/pipeline-mermaid.js.map +1 -1
  32. package/dist/core/pipeline-run-state.d.ts +4 -4
  33. package/dist/core/pipeline-run-state.js +10 -16
  34. package/dist/core/pipeline-run-state.js.map +1 -1
  35. package/dist/core/pipeline-step-executor.d.ts +2 -0
  36. package/dist/core/pipeline-step-executor.js +11 -3
  37. package/dist/core/pipeline-step-executor.js.map +1 -1
  38. package/dist/core/pipeline-steps.d.ts +20 -0
  39. package/dist/core/pipeline-steps.js +62 -0
  40. package/dist/core/pipeline-steps.js.map +1 -1
  41. package/dist/core/pipeline-types.d.ts +15 -2
  42. package/dist/core/pipeline-types.js.map +1 -1
  43. package/dist/core/pipeline.d.ts +4 -1
  44. package/dist/core/pipeline.js +18 -3
  45. package/dist/core/pipeline.js.map +1 -1
  46. package/dist/project/project-compiler.d.ts +3 -31
  47. package/dist/project/project-compiler.js +11 -180
  48. package/dist/project/project-compiler.js.map +1 -1
  49. package/dist/project/project-registry.d.ts +44 -0
  50. package/dist/project/project-registry.js +107 -0
  51. package/dist/project/project-registry.js.map +1 -0
  52. package/dist/project/project-step-graph.d.ts +9 -0
  53. package/dist/project/project-step-graph.js +99 -0
  54. package/dist/project/project-step-graph.js.map +1 -0
  55. package/dist/render/render.js +1 -1
  56. package/dist/render/render.js.map +1 -1
  57. package/dist/reporter/interactive-reporter.js +6 -3
  58. package/dist/reporter/interactive-reporter.js.map +1 -1
  59. package/dist/reporter/live-ticker-frame.d.ts +21 -0
  60. package/dist/reporter/live-ticker-frame.js +196 -0
  61. package/dist/reporter/live-ticker-frame.js.map +1 -0
  62. package/dist/reporter/live-ticker-protocol.d.ts +41 -0
  63. package/dist/reporter/live-ticker-protocol.js +59 -0
  64. package/dist/reporter/live-ticker-protocol.js.map +1 -0
  65. package/dist/reporter/live-ticker-worker.js +11 -25
  66. package/dist/reporter/live-ticker-worker.js.map +1 -1
  67. package/dist/reporter/live-ticker.d.ts +0 -15
  68. package/dist/reporter/live-ticker.js +11 -216
  69. package/dist/reporter/live-ticker.js.map +1 -1
  70. package/dist/reporter/reporter.js +7 -6
  71. package/dist/reporter/reporter.js.map +1 -1
  72. package/dist/run-store/definition-projection.d.ts +8 -0
  73. package/dist/run-store/definition-projection.js +89 -0
  74. package/dist/run-store/definition-projection.js.map +1 -0
  75. package/dist/run-store/run-projection.d.ts +15 -0
  76. package/dist/run-store/run-projection.js +203 -0
  77. package/dist/run-store/run-projection.js.map +1 -0
  78. package/dist/run-store/run-store-codec.d.ts +2 -0
  79. package/dist/run-store/run-store-codec.js +11 -0
  80. package/dist/run-store/run-store-codec.js.map +1 -1
  81. package/dist/run-store/run-store-event-decoder.js +3 -0
  82. package/dist/run-store/run-store-event-decoder.js.map +1 -1
  83. package/dist/run-store/run-store-reader.d.ts +7 -0
  84. package/dist/run-store/run-store-reader.js +31 -0
  85. package/dist/run-store/run-store-reader.js.map +1 -0
  86. package/dist/run-store/run-store-sqlite.js +23 -7
  87. package/dist/run-store/run-store-sqlite.js.map +1 -1
  88. package/dist/run-store/run-store.d.ts +16 -4
  89. package/dist/run-store/run-store.js +14 -263
  90. package/dist/run-store/run-store.js.map +1 -1
  91. package/dist/studio/run-store-ui-api.d.ts +13 -0
  92. package/dist/studio/run-store-ui-api.js +163 -0
  93. package/dist/studio/run-store-ui-api.js.map +1 -0
  94. package/dist/studio/run-store-ui-client-browser.js +2 -2
  95. package/dist/studio/run-store-ui-client-transport.js +28 -3
  96. package/dist/studio/run-store-ui-client-transport.js.map +1 -1
  97. package/dist/studio/run-store-ui-client.d.ts +2 -1
  98. package/dist/studio/run-store-ui-client.js +15 -9
  99. package/dist/studio/run-store-ui-client.js.map +1 -1
  100. package/dist/studio/run-store-ui-http.d.ts +11 -0
  101. package/dist/studio/run-store-ui-http.js +52 -0
  102. package/dist/studio/run-store-ui-http.js.map +1 -1
  103. package/dist/studio/run-store-ui-state.d.ts +1 -1
  104. package/dist/studio/run-store-ui-state.js +10 -28
  105. package/dist/studio/run-store-ui-state.js.map +1 -1
  106. package/dist/studio/run-store-ui.d.ts +5 -11
  107. package/dist/studio/run-store-ui.js +5 -203
  108. package/dist/studio/run-store-ui.js.map +1 -1
  109. package/dist/testing/testing.d.ts +18 -2
  110. package/dist/testing/testing.js +35 -2
  111. package/dist/testing/testing.js.map +1 -1
  112. package/dist/tracing/artifact-metadata.d.ts +28 -0
  113. package/dist/tracing/artifact-metadata.js +105 -0
  114. package/dist/tracing/artifact-metadata.js.map +1 -0
  115. package/dist/tracing/tracing-codec.d.ts +1 -1
  116. package/dist/tracing/tracing-codec.js +1 -1
  117. package/dist/tracing/tracing-codec.js.map +1 -1
  118. package/dist/tracing/tracing-constants.d.ts +1 -1
  119. package/dist/tracing/tracing-constants.js +1 -1
  120. package/dist/tracing/tracing-constants.js.map +1 -1
  121. package/dist/tracing/tracing-contracts.d.ts +3 -1
  122. package/dist/tracing/tracing-contracts.js.map +1 -1
  123. package/dist/tracing/tracing-internal.d.ts +2 -0
  124. package/dist/tracing/tracing-internal.js +36 -13
  125. package/dist/tracing/tracing-internal.js.map +1 -1
  126. package/dist/tracing/tracing-schema.d.ts +330 -49
  127. package/dist/tracing/tracing-schema.js +102 -10
  128. package/dist/tracing/tracing-schema.js.map +1 -1
  129. package/dist/workbench/workbench-command-execution.d.ts +6 -0
  130. package/dist/workbench/workbench-command-execution.js +48 -0
  131. package/dist/workbench/workbench-command-execution.js.map +1 -0
  132. package/dist/workbench/workbench-history.js +11 -18
  133. package/dist/workbench/workbench-history.js.map +1 -1
  134. package/dist/workbench/workbench-launch-session.d.ts +2 -2
  135. package/dist/workbench/workbench-launch-session.js.map +1 -1
  136. package/dist/workbench/workbench-run.d.ts +0 -4
  137. package/dist/workbench/workbench-run.js +3 -47
  138. package/dist/workbench/workbench-run.js.map +1 -1
  139. package/dist/workbench/workbench-studio-launcher.d.ts +27 -0
  140. package/dist/workbench/workbench-studio-launcher.js +95 -0
  141. package/dist/workbench/workbench-studio-launcher.js.map +1 -0
  142. package/dist/workbench/workbench-ui.js +10 -83
  143. package/dist/workbench/workbench-ui.js.map +1 -1
  144. package/docs/README.md +13 -7
  145. package/docs/agent-guide.md +69 -6
  146. package/docs/airflow.md +187 -0
  147. package/docs/api-reference.md +87 -76
  148. package/docs/api-report.json +17 -6
  149. package/docs/artifacts.md +173 -0
  150. package/docs/child-pipeline-composition.md +65 -2
  151. package/docs/comparison.md +20 -0
  152. package/docs/concepts.md +70 -2
  153. package/docs/dagster.md +161 -0
  154. package/docs/inngest.md +163 -0
  155. package/docs/llms.txt +30 -1
  156. package/docs/recipes.md +82 -33
  157. package/docs/remote-step-composition.md +6 -0
  158. package/docs/step-functions.md +190 -0
  159. package/docs/studio.md +31 -12
  160. package/docs/temporal.md +183 -0
  161. package/examples/airflow/contract.ts +46 -0
  162. package/examples/airflow/hosted.ts +70 -0
  163. package/examples/airflow/remote.ts +175 -0
  164. package/examples/airflow/tubeless_example.py +49 -0
  165. package/examples/airflow/worker.ts +24 -0
  166. package/examples/artifact-lineage.ts +70 -0
  167. package/examples/dagster/definitions.py +59 -0
  168. package/examples/dagster/hosted.ts +78 -0
  169. package/examples/dagster/pipeline.ts +62 -0
  170. package/examples/dagster/test_definitions.py +47 -0
  171. package/examples/dagster/tsconfig.build.json +10 -0
  172. package/examples/dagster/worker.ts +22 -0
  173. package/examples/inngest/client.ts +4 -0
  174. package/examples/inngest/functions.ts +65 -0
  175. package/examples/inngest/pipeline.ts +41 -0
  176. package/examples/inngest/send.ts +11 -0
  177. package/examples/inngest/server.ts +17 -0
  178. package/examples/inngest/tsconfig.build.json +10 -0
  179. package/examples/iteration.ts +52 -0
  180. package/examples/parameterized-steps.ts +96 -0
  181. package/examples/project/tubeless.project.ts +46 -0
  182. package/examples/step-functions/handler.ts +110 -0
  183. package/examples/step-functions/input.json +1 -0
  184. package/examples/step-functions/pipeline.ts +41 -0
  185. package/examples/step-functions/state-machine.asl.json +41 -0
  186. package/examples/step-functions/template.json +42 -0
  187. package/examples/step-output-overrides.ts +41 -0
  188. package/examples/temporal/activities.ts +94 -0
  189. package/examples/temporal/client.ts +19 -0
  190. package/examples/temporal/pipeline.ts +41 -0
  191. package/examples/temporal/tsconfig.build.json +10 -0
  192. package/examples/temporal/worker.ts +21 -0
  193. package/examples/temporal/workflows.ts +16 -0
  194. package/package.json +13 -4
  195. package/skills/tubeless/SKILL.md +30 -3
@@ -1,28 +1,5 @@
1
1
  import type { ToMappedChildStepProgressOptions } from "./mapped-child-progress.js";
2
2
  import type { Pipeline, PipelineExecutionContext, PipelineRun, PipelineRunControls, PipelineStepContext } from "./pipeline-types.js";
3
- export declare class PipelineChildError extends Error {
4
- readonly cancelled: boolean;
5
- readonly fanOut?: {
6
- failures: readonly {
7
- error: Error;
8
- key: string;
9
- index: number;
10
- cancelled: boolean;
11
- }[];
12
- failureCount: number;
13
- schedulerError?: Error;
14
- } | undefined;
15
- constructor(message: string, cancelled?: boolean, cause?: unknown, fanOut?: {
16
- failures: readonly {
17
- error: Error;
18
- key: string;
19
- index: number;
20
- cancelled: boolean;
21
- }[];
22
- failureCount: number;
23
- schedulerError?: Error;
24
- } | undefined);
25
- }
26
3
  type ChildPipeline = Pipeline<object, unknown, string, string>;
27
4
  type ChildInputs = Record<string, unknown>;
28
5
  export interface SingleChildExecutionConfig<TParentOptions extends object> {
@@ -1,21 +1,11 @@
1
1
  import { throwIfAborted } from "../utilities/abort.js";
2
2
  import { emitRejectedPlanLifecycle } from "./lifecycle.js";
3
3
  import { runConcurrentPartial } from "../utilities/batch.js";
4
- import { isPipelineCancellation, PipelineExecutionError } from "./pipeline-execute.js";
4
+ import { isPipelineCancellation, PipelineChildError, PipelineExecutionError, } from "./pipeline-execution-error.js";
5
5
  import { createRunId, RUN_MODEL_VERSION } from "./pipeline-ids.js";
6
6
  import { duplicateValues } from "../utilities/collections.js";
7
7
  import { EXECUTE_COMPILED_RUN, isCompiledPipeline } from "./pipeline-identity.js";
8
8
  import { createMappedChildProgress, createSingleChildProgress } from "./child-progress.js";
9
- export class PipelineChildError extends Error {
10
- cancelled;
11
- fanOut;
12
- constructor(message, cancelled = false, cause, fanOut) {
13
- super(message, cause === undefined ? undefined : { cause });
14
- this.cancelled = cancelled;
15
- this.fanOut = fanOut;
16
- this.name = "PipelineChildError";
17
- }
18
- }
19
9
  function compiledChildExecute(pipeline) {
20
10
  if (!isCompiledPipeline(pipeline))
21
11
  return undefined;
@@ -81,7 +71,15 @@ async function rejectedChildPlanResult(pipeline, plan, domainOptions, controls,
81
71
  return execute(plan, domainOptions, controls, context);
82
72
  }
83
73
  function childTracingOptions(context, itemKey = context.trace?.itemKey) {
84
- return context.tracing ? { ...context.tracing, itemKey } : undefined;
74
+ const tracing = context.tracing;
75
+ if (!tracing)
76
+ return undefined;
77
+ return {
78
+ ...tracing,
79
+ itemKey,
80
+ // A relation injected by this wrapper belongs to its next child, not descendants.
81
+ iteration: tracing.iteration?.runId === context.runId ? tracing.iteration : undefined,
82
+ };
85
83
  }
86
84
  function childRunControls(controls, parentDryRun) {
87
85
  const resolved = {};
@@ -1 +1 @@
1
- {"version":3,"file":"child-execution.js","sourceRoot":"","sources":["../../src/core/child-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { throwIfAborted } from \"../utilities/abort.js\";\nimport { emitRejectedPlanLifecycle } from \"./lifecycle.js\";\nimport { runConcurrentPartial } from \"../utilities/batch.js\";\nimport { isPipelineCancellation, PipelineExecutionError } from \"./pipeline-execute.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\nexport class PipelineChildError extends Error {\n constructor(\n message: string,\n readonly cancelled = false,\n cause?: unknown,\n readonly fanOut?: {\n failures: readonly { error: Error; key: string; index: number; cancelled: boolean }[];\n failureCount: number;\n schedulerError?: Error;\n }\n ) {\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"PipelineChildError\";\n }\n}\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) => 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): 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);\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 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 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 return context.tracing ? { ...context.tracing, itemKey } : undefined;\n}\n\nfunction childRunControls(\n controls: PipelineRunControls | undefined,\n parentDryRun: boolean\n): PipelineRunControls {\n const resolved: PipelineRunControls = {};\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);\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 baseChildContext,\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(configuredControls, context.dryRun);\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 {\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 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.slice(0, 32).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 { 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) => 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): 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);\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 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 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\nfunction childRunControls(\n controls: PipelineRunControls | undefined,\n parentDryRun: boolean\n): PipelineRunControls {\n const resolved: PipelineRunControls = {};\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);\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 baseChildContext,\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(configuredControls, context.dryRun);\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 {\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 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.slice(0, 32).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"]}
@@ -24,7 +24,8 @@ function sameChildProgress(left, right) {
24
24
  Object.is(row.completed, other.completed) &&
25
25
  Object.is(row.total, other.total) &&
26
26
  row.label === other.label &&
27
- row.status === other.status));
27
+ row.status === other.status &&
28
+ row.outputSource === other.outputSource));
28
29
  }));
29
30
  }
30
31
  function sameChildStatus(left, right) {
@@ -32,7 +33,7 @@ function sameChildStatus(left, right) {
32
33
  return false;
33
34
  if (left.status === "planned" || right.status === "planned")
34
35
  return true;
35
- if (left.attemptId !== right.attemptId)
36
+ if (left.attemptId !== right.attemptId || left.outputSource !== right.outputSource)
36
37
  return false;
37
38
  if (left.status === "running" || right.status === "running") {
38
39
  return (left.status === "running" &&
@@ -127,6 +128,9 @@ function createChildProgress(plan) {
127
128
  errorLabel = event.error.message;
128
129
  break;
129
130
  }
131
+ if (event.outputSource === "override") {
132
+ message += " (overridden)";
133
+ }
130
134
  const previous = terminalSteps.size;
131
135
  if (event.status !== "running")
132
136
  terminalSteps.add(event.step.id);
@@ -135,6 +139,7 @@ function createChildProgress(plan) {
135
139
  id: event.step.id,
136
140
  name: event.step.name,
137
141
  status: event.status,
142
+ ...(event.outputSource ? { outputSource: event.outputSource } : {}),
138
143
  };
139
144
  if (latest) {
140
145
  row.completed = latest.completed;
@@ -1 +1 @@
1
- {"version":3,"file":"child-progress.js","sourceRoot":"","sources":["../../src/core/child-progress.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,0BAA0B,GAG3B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAIpC,SAAS,iBAAiB,CACxB,IAAsC,EACtC,KAAuC;IAEvC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IACE,CAAC,IAAI;QACL,CAAC,KAAK;QACN,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;QAC3C,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAE9B,OAAO,KAAK,CAAC;IACf,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IACzC,OAAO,CACL,WAAW,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;QAC1C,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAE,CAAC;YACnC,OAAO,CACL,GAAG,KAAK,KAAK;gBACb,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;oBAClB,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;oBACvB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;oBACjC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;oBACzC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;oBACjC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;oBACzB,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAC/B,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAwB,EAAE,KAAyB;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,KAAK,CAAC,MAAM,KAAK,SAAS;YAC1B,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CACjD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;AAClD,CAAC;AAED,iFAAiF;AACjF,SAAS,kBAAkB,CAAC,MAA2C;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2D,CAAC;IACnF,MAAM,OAAO,GAAG,CAAC,KAAyB,EAAE,OAAgB,EAAQ,EAAE;QACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,CAAC,KAAyB,EAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClF,OAAO;QACL,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;QAC9C,WAAW,EAAE,eAAe;QAC5B,cAAc,EAAE,eAAe;QAC/B,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,eAAe;QAC3B,YAAY,EAAE,eAAe;QAC7B,UAAU,EAAE,eAAe;KAC5B,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,SAAS,mBAAmB,CAAC,IAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;IACzD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,SAAS;YACX,OAAO,aAAa,CAAC,IAAI,CAAC;QAC5B,CAAC;QACD,QAAQ;YACN,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC;YACpC,IAAI,IAAI,CAAC,EAAE;gBAAE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjE,OAAO,aAAa,CAAC,IAAI,GAAG,QAAQ,CAAC;QACvC,CAAC;QACD,MAAM,CAAC,KAAyB;YAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,wEAAwE;YACxE,2DAA2D;YAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC9D,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;YACvF,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO;YACnE,IAAI,OAAe,CAAC;YACpB,IAAI,KAAa,CAAC;YAClB,IAAI,UAA8B,CAAC;YACnC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrB,KAAK,SAAS;oBACZ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACnB,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC;4BAAE,OAAO;wBACpD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;wBAC5C,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,YAAY,CAAC;wBAC5E,KAAK,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;oBAC9K,CAAC;yBAAM,CAAC;wBACN,OAAO,GAAG,SAAS,CAAC;wBACpB,KAAK,GAAG,IAAI,CAAC;oBACf,CAAC;oBACD,MAAM;gBACR,KAAK,WAAW;oBACd,OAAO,GAAG,UAAU,CAAC;oBACrB,KAAK,GAAG,GAAG,IAAI,WAAW,CAAC;oBAC3B,MAAM;gBACR,KAAK,SAAS;oBACZ,OAAO,GAAG,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC;oBACrC,KAAK,GAAG,GAAG,IAAI,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC1C,UAAU,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;oBAC3C,MAAM;gBACR,KAAK,WAAW,CAAC;gBACjB,KAAK,QAAQ;oBACX,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACpD,KAAK,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;oBACjC,MAAM;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,GAAG,GAA+B;gBACtC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;gBACjB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;gBACrB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBACjC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBACzB,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;YAC7B,CAAC;YACD,IAAI,UAAU,KAAK,SAAS;gBAAE,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,GAAG,IAAI,KAAK,OAAO,EAAE;gBAC9B,KAAK;gBACL,aAAa,EAAE,aAAa,CAAC,IAAI,GAAG,QAAQ;aAC7C,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzC,EAAE,GAAG,GAAG,EAAE;gBACV,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACxD,GAAG,MAAM;oBACT,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;oBAC9B,MAAM,EACJ,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;wBACpE,CAAC,CAAC,GAAG,CAAC,MAAM;wBACZ,CAAC,CAAC,MAAM,CAAC,MAAM;iBACpB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,yBAAyB,CACvC,IAAkB,EAClB,MAAsB;IAEtB,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;YAC/B,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE;YAC/C,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CACvC,IAAuB,EACvB,WAAmB,EACnB,OAAqD,EACrD,MAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAClD,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkD,CAAC;IAC3E,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,CAAC,SAAkB,EAAE,KAAK,GAAG,KAAK,EAAQ,EAAE;QAC1D,MAAM,QAAQ,GAAgC;YAC5C,MAAM;YACN,WAAW;YACX,WAAW;YACX,aAAa;YACb,SAAS,EAAE,IAAI,CAAC,MAAM;YACtB,iBAAiB;YACjB,YAAY;YACZ,YAAY;YACZ,kBAAkB;YAClB,SAAS;SACV,CAAC;QACF,sEAAsE;QACtE,kEAAkE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,IAAI,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7F,IAAI,WAA8B,CAAC;QACnC,IAAI,KAAK,IAAI,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;YAChD,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,KAAK,MAAM,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC3E,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK;wBAAE,MAAM;oBACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAC7B,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAE,CAClE,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;YAC3C,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,EAAE;YACzB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACvD,GAAG,MAAM;gBACT,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;aAC/B,CAAC,CAAC;SACJ,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,CAAC,EAAE,GAAG,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,KAAK,CAAC,GAAW;YACf,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC5B,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,GAAW,EAAE,IAAkB;YAClC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC;gBACjC,YAAY,IAAI,CAAC,CAAC;gBAClB,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;gBAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;oBAAE,OAAO;gBAClD,kBAAkB,IAAI,MAAM,CAAC,aAAa,CAAC;gBAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC9B,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,cAAc,CAAC,GAAW;YACxB,uEAAuE;YACvE,sEAAsE;YACtE,kBAAkB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC;QACD,QAAQ,CAAC,GAAW;YAClB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACpD,aAAa,IAAI,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,GAAW,EAAE,KAAY,EAAE,SAAkB;YAChD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;gBAChB,EAAE,EAAE,GAAG;gBACP,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;gBAC1C,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,WAAW,IAAI,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM;YACJ,IAAI,OAAO,EAAE,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;gBACjF,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type {\n PipelineHooks,\n PipelinePlan,\n PipelineStepProgress,\n PipelineStepProgressDetail,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\nimport { hasVisibleStepProgress } from \"./progress.js\";\nimport {\n mappedChildProgressSummary,\n type MappedChildProgressSnapshot,\n type ToMappedChildStepProgressOptions,\n} from \"./mapped-child-progress.js\";\n\nconst LIVE_FAN_OUT_GROUP_LIMIT = 32;\n\ntype ReportProgress = (progress: PipelineStepProgress) => void;\n\nfunction sameChildProgress(\n left: PipelineStepProgress | undefined,\n right: PipelineStepProgress | undefined\n): boolean {\n if (left === right) return true;\n if (\n !left ||\n !right ||\n !Object.is(left.completed, right.completed) ||\n !Object.is(left.total, right.total) ||\n left.message !== right.message\n )\n return false;\n if (left.details === right.details) return true;\n const leftDetails = left.details ?? [];\n const rightDetails = right.details ?? [];\n return (\n leftDetails.length === rightDetails.length &&\n leftDetails.every((row, index) => {\n const other = rightDetails[index]!;\n return (\n row === other ||\n (row.id === other.id &&\n row.name === other.name &&\n Object.is(row.depth, other.depth) &&\n Object.is(row.completed, other.completed) &&\n Object.is(row.total, other.total) &&\n row.label === other.label &&\n row.status === other.status)\n );\n })\n );\n}\n\nfunction sameChildStatus(left: PipelineStepStatus, right: PipelineStepStatus): boolean {\n if (left.status !== right.status) return false;\n if (left.status === \"planned\" || right.status === \"planned\") return true;\n if (left.attemptId !== right.attemptId) return false;\n if (left.status === \"running\" || right.status === \"running\") {\n return (\n left.status === \"running\" &&\n right.status === \"running\" &&\n sameChildProgress(left.progress, right.progress)\n );\n }\n return left.finishedAtMs === right.finishedAtMs;\n}\n\n/** External children may emit either hook family, or both for the same event. */\nfunction childProgressHooks(update: (event: PipelineStepStatus) => void): PipelineHooks {\n const pending = new Map<string, { event: PipelineStepStatus; focused: boolean }>();\n const consume = (event: PipelineStepStatus, focused: boolean): void => {\n const previous = pending.get(event.step.id);\n if (previous && previous.focused !== focused && sameChildStatus(previous.event, event)) {\n pending.delete(event.step.id);\n return;\n }\n pending.set(event.step.id, { event, focused });\n update(event);\n };\n const onFocusedStatus = (event: PipelineStepStatus): void => consume(event, true);\n return {\n onStepStatus: (event) => consume(event, false),\n onStepStart: onFocusedStatus,\n onStepProgress: onFocusedStatus,\n onStepComplete: onFocusedStatus,\n onStepSkip: onFocusedStatus,\n onStepCancel: onFocusedStatus,\n onStepFail: onFocusedStatus,\n };\n}\n\n/** Retain one child's step states without forwarding its lifecycle to parent hooks. */\nfunction createChildProgress(plan: PipelinePlan) {\n const rows = new Map<string, PipelineStepProgressDetail>();\n const progress = new Map<string, PipelineStepProgress>();\n const terminalSteps = new Set<string>();\n for (const step of plan.steps) {\n if (step.selected) rows.set(step.id, { id: step.id, name: step.name, status: \"pending\" });\n }\n return {\n total: plan.ok ? rows.size : 0,\n get completed() {\n return terminalSteps.size;\n },\n complete(): number {\n const previous = terminalSteps.size;\n if (plan.ok) for (const id of rows.keys()) terminalSteps.add(id);\n return terminalSteps.size - previous;\n },\n update(event: PipelineStepStatus) {\n const name = event.step.name ?? event.step.id;\n // Filtered steps are announced by single children, but never counted or\n // included in the retained tree or mapped activity labels.\n if (event.status === \"skipped\" && event.reason === \"filtered\") {\n return { message: `${name}: skipped: filtered`, label: undefined, terminalDelta: 0 };\n }\n if (!rows.has(event.step.id) || event.status === \"planned\") return;\n let message: string;\n let label: string;\n let errorLabel: string | undefined;\n switch (event.status) {\n case \"running\":\n if (event.progress) {\n if (!hasVisibleStepProgress(event.progress)) return;\n progress.set(event.step.id, event.progress);\n message = event.progress.message ?? `${event.progress.completed} completed`;\n label = `${name}:${event.progress.message ?? (event.progress.total !== undefined ? `${event.progress.completed}/${event.progress.total}` : `${event.progress.completed}`)}`;\n } else {\n message = \"started\";\n label = name;\n }\n break;\n case \"completed\":\n message = \"complete\";\n label = `${name}:complete`;\n break;\n case \"skipped\":\n message = `skipped: ${event.reason}`;\n label = `${name}:skipped:${event.reason}`;\n errorLabel = event.message ?? event.reason;\n break;\n case \"cancelled\":\n case \"failed\":\n message = `${event.status}: ${event.error.message}`;\n label = `${name}:${event.status}`;\n errorLabel = event.error.message;\n break;\n }\n const previous = terminalSteps.size;\n if (event.status !== \"running\") terminalSteps.add(event.step.id);\n const latest = progress.get(event.step.id);\n const row: PipelineStepProgressDetail = {\n id: event.step.id,\n name: event.step.name,\n status: event.status,\n };\n if (latest) {\n row.completed = latest.completed;\n row.total = latest.total;\n row.label = latest.message;\n }\n if (errorLabel !== undefined) row.label = errorLabel;\n rows.set(event.step.id, row);\n return {\n message: `${name}: ${message}`,\n label,\n terminalDelta: terminalSteps.size - previous,\n };\n },\n details(): PipelineStepProgressDetail[] {\n return [...rows.values()].flatMap((row) => [\n { ...row },\n ...(progress.get(row.id)?.details ?? []).map((detail) => ({\n ...detail,\n depth: (detail.depth ?? 0) + 1,\n status:\n (detail.status ?? \"running\") === \"running\" && row.status !== \"running\"\n ? row.status\n : detail.status,\n })),\n ]);\n },\n };\n}\n\n/** Project canonical child statuses into the opaque parent's progress. */\nexport function createSingleChildProgress(\n plan: PipelinePlan,\n report: ReportProgress\n): PipelineHooks {\n const child = createChildProgress(plan);\n return childProgressHooks((event) => {\n const update = child.update(event);\n if (!update) return;\n report({\n completed: child.completed,\n total: Math.max(1, child.total),\n message: `${plan.pipelineId}/${update.message}`,\n details: child.details(),\n });\n });\n}\n\n/** Own fan-out counts, activity labels and bounded detail rendering. */\nexport function createMappedChildProgress(\n keys: readonly string[],\n concurrency: number,\n options: ToMappedChildStepProgressOptions | undefined,\n report: ReportProgress\n) {\n const active = new Map<string, string>();\n const failedKeys = new Set<string>();\n const itemIndexes = new Map(keys.map((key, index) => [key, index]));\n const itemRows = new Map<string, PipelineStepProgressDetail>(\n keys.map((id) => [id, { id, status: \"pending\" }])\n );\n const children = new Map<string, ReturnType<typeof createChildProgress>>();\n let finishedItems = 0;\n let failedItems = 0;\n let stepsPerItem = 0;\n let plannedChildSteps = 0;\n let plannedItems = 0;\n let terminalChildSteps = 0;\n\n const publish = (spotlight?: string, final = false): void => {\n const snapshot: MappedChildProgressSnapshot = {\n active,\n concurrency,\n failedItems,\n finishedItems,\n itemCount: keys.length,\n plannedChildSteps,\n plannedItems,\n stepsPerItem,\n terminalChildSteps,\n spotlight,\n };\n // Materialize only the visible window. Active and failed sets avoid a\n // scan or sort of the entire fan-out on every child status event.\n const limit = Math.max(0, Math.floor(options?.detailLimit ?? LIVE_FAN_OUT_GROUP_LIMIT)) || 0;\n let visibleKeys: readonly string[];\n if (final && options?.detailLimit === undefined) {\n visibleKeys = keys;\n } else {\n const visible = new Set<string>();\n for (const candidates of [active.keys(), failedKeys.keys(), keys.values()]) {\n for (const key of candidates) {\n if (visible.size >= limit) break;\n visible.add(key);\n }\n }\n visibleKeys = [...visible].sort(\n (left, right) => itemIndexes.get(left)! - itemIndexes.get(right)!\n );\n }\n const details = visibleKeys.flatMap((key) => [\n { ...itemRows.get(key)! },\n ...(children.get(key)?.details() ?? []).map((detail) => ({\n ...detail,\n depth: (detail.depth ?? 0) + 1,\n })),\n ]);\n if (visibleKeys.length < keys.length) {\n details.push({ id: `+${keys.length - visibleKeys.length} more`, status: \"pending\" });\n }\n report({ ...mappedChildProgressSummary(snapshot, options), details });\n };\n\n return {\n publish,\n start(key: string): void {\n active.set(key, \"starting\");\n itemRows.set(key, { id: key, status: \"running\" });\n publish();\n },\n plan(key: string, plan: PipelinePlan): PipelineHooks {\n const child = createChildProgress(plan);\n children.set(key, child);\n if (plan.ok) {\n plannedChildSteps += child.total;\n plannedItems += 1;\n stepsPerItem = Math.max(stepsPerItem, child.total);\n }\n return childProgressHooks((event) => {\n const update = child.update(event);\n if (!update || update.label === undefined) return;\n terminalChildSteps += update.terminalDelta;\n active.set(key, update.label);\n publish();\n });\n },\n childCompleted(key: string): void {\n // Public child implementations may return success without emitting all\n // statuses. Reconcile their selected steps before mapping the result.\n terminalChildSteps += children.get(key)?.complete() ?? 0;\n },\n complete(key: string): void {\n active.delete(key);\n itemRows.set(key, { id: key, status: \"completed\" });\n finishedItems += 1;\n publish(`${key}: completed`);\n },\n fail(key: string, error: Error, cancelled: boolean): void {\n active.delete(key);\n itemRows.set(key, {\n id: key,\n status: cancelled ? \"cancelled\" : \"failed\",\n label: error.message,\n });\n failedKeys.add(key);\n failedItems += 1;\n publish(`${key}: failed`);\n },\n finish(): void {\n if (options?.detailLimit === undefined && keys.length > LIVE_FAN_OUT_GROUP_LIMIT) {\n publish(undefined, true);\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"child-progress.js","sourceRoot":"","sources":["../../src/core/child-progress.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PipelineHooks,\n PipelinePlan,\n PipelineStepProgress,\n PipelineStepProgressDetail,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\nimport { hasVisibleStepProgress } from \"./progress.js\";\nimport {\n mappedChildProgressSummary,\n type MappedChildProgressSnapshot,\n type ToMappedChildStepProgressOptions,\n} from \"./mapped-child-progress.js\";\n\nconst LIVE_FAN_OUT_GROUP_LIMIT = 32;\n\ntype ReportProgress = (progress: PipelineStepProgress) => void;\n\nfunction sameChildProgress(\n left: PipelineStepProgress | undefined,\n right: PipelineStepProgress | undefined\n): boolean {\n if (left === right) return true;\n if (\n !left ||\n !right ||\n !Object.is(left.completed, right.completed) ||\n !Object.is(left.total, right.total) ||\n left.message !== right.message\n )\n return false;\n if (left.details === right.details) return true;\n const leftDetails = left.details ?? [];\n const rightDetails = right.details ?? [];\n return (\n leftDetails.length === rightDetails.length &&\n leftDetails.every((row, index) => {\n const other = rightDetails[index]!;\n return (\n row === other ||\n (row.id === other.id &&\n row.name === other.name &&\n Object.is(row.depth, other.depth) &&\n Object.is(row.completed, other.completed) &&\n Object.is(row.total, other.total) &&\n row.label === other.label &&\n row.status === other.status &&\n row.outputSource === other.outputSource)\n );\n })\n );\n}\n\nfunction sameChildStatus(left: PipelineStepStatus, right: PipelineStepStatus): boolean {\n if (left.status !== right.status) return false;\n if (left.status === \"planned\" || right.status === \"planned\") return true;\n if (left.attemptId !== right.attemptId || left.outputSource !== right.outputSource) return false;\n if (left.status === \"running\" || right.status === \"running\") {\n return (\n left.status === \"running\" &&\n right.status === \"running\" &&\n sameChildProgress(left.progress, right.progress)\n );\n }\n return left.finishedAtMs === right.finishedAtMs;\n}\n\n/** External children may emit either hook family, or both for the same event. */\nfunction childProgressHooks(update: (event: PipelineStepStatus) => void): PipelineHooks {\n const pending = new Map<string, { event: PipelineStepStatus; focused: boolean }>();\n const consume = (event: PipelineStepStatus, focused: boolean): void => {\n const previous = pending.get(event.step.id);\n if (previous && previous.focused !== focused && sameChildStatus(previous.event, event)) {\n pending.delete(event.step.id);\n return;\n }\n pending.set(event.step.id, { event, focused });\n update(event);\n };\n const onFocusedStatus = (event: PipelineStepStatus): void => consume(event, true);\n return {\n onStepStatus: (event) => consume(event, false),\n onStepStart: onFocusedStatus,\n onStepProgress: onFocusedStatus,\n onStepComplete: onFocusedStatus,\n onStepSkip: onFocusedStatus,\n onStepCancel: onFocusedStatus,\n onStepFail: onFocusedStatus,\n };\n}\n\n/** Retain one child's step states without forwarding its lifecycle to parent hooks. */\nfunction createChildProgress(plan: PipelinePlan) {\n const rows = new Map<string, PipelineStepProgressDetail>();\n const progress = new Map<string, PipelineStepProgress>();\n const terminalSteps = new Set<string>();\n for (const step of plan.steps) {\n if (step.selected) rows.set(step.id, { id: step.id, name: step.name, status: \"pending\" });\n }\n return {\n total: plan.ok ? rows.size : 0,\n get completed() {\n return terminalSteps.size;\n },\n complete(): number {\n const previous = terminalSteps.size;\n if (plan.ok) for (const id of rows.keys()) terminalSteps.add(id);\n return terminalSteps.size - previous;\n },\n update(event: PipelineStepStatus) {\n const name = event.step.name ?? event.step.id;\n // Filtered steps are announced by single children, but never counted or\n // included in the retained tree or mapped activity labels.\n if (event.status === \"skipped\" && event.reason === \"filtered\") {\n return { message: `${name}: skipped: filtered`, label: undefined, terminalDelta: 0 };\n }\n if (!rows.has(event.step.id) || event.status === \"planned\") return;\n let message: string;\n let label: string;\n let errorLabel: string | undefined;\n switch (event.status) {\n case \"running\":\n if (event.progress) {\n if (!hasVisibleStepProgress(event.progress)) return;\n progress.set(event.step.id, event.progress);\n message = event.progress.message ?? `${event.progress.completed} completed`;\n label = `${name}:${event.progress.message ?? (event.progress.total !== undefined ? `${event.progress.completed}/${event.progress.total}` : `${event.progress.completed}`)}`;\n } else {\n message = \"started\";\n label = name;\n }\n break;\n case \"completed\":\n message = \"complete\";\n label = `${name}:complete`;\n break;\n case \"skipped\":\n message = `skipped: ${event.reason}`;\n label = `${name}:skipped:${event.reason}`;\n errorLabel = event.message ?? event.reason;\n break;\n case \"cancelled\":\n case \"failed\":\n message = `${event.status}: ${event.error.message}`;\n label = `${name}:${event.status}`;\n errorLabel = event.error.message;\n break;\n }\n if (event.outputSource === \"override\") {\n message += \" (overridden)\";\n }\n const previous = terminalSteps.size;\n if (event.status !== \"running\") terminalSteps.add(event.step.id);\n const latest = progress.get(event.step.id);\n const row: PipelineStepProgressDetail = {\n id: event.step.id,\n name: event.step.name,\n status: event.status,\n ...(event.outputSource ? { outputSource: event.outputSource } : {}),\n };\n if (latest) {\n row.completed = latest.completed;\n row.total = latest.total;\n row.label = latest.message;\n }\n if (errorLabel !== undefined) row.label = errorLabel;\n rows.set(event.step.id, row);\n return {\n message: `${name}: ${message}`,\n label,\n terminalDelta: terminalSteps.size - previous,\n };\n },\n details(): PipelineStepProgressDetail[] {\n return [...rows.values()].flatMap((row) => [\n { ...row },\n ...(progress.get(row.id)?.details ?? []).map((detail) => ({\n ...detail,\n depth: (detail.depth ?? 0) + 1,\n status:\n (detail.status ?? \"running\") === \"running\" && row.status !== \"running\"\n ? row.status\n : detail.status,\n })),\n ]);\n },\n };\n}\n\n/** Project canonical child statuses into the opaque parent's progress. */\nexport function createSingleChildProgress(\n plan: PipelinePlan,\n report: ReportProgress\n): PipelineHooks {\n const child = createChildProgress(plan);\n return childProgressHooks((event) => {\n const update = child.update(event);\n if (!update) return;\n report({\n completed: child.completed,\n total: Math.max(1, child.total),\n message: `${plan.pipelineId}/${update.message}`,\n details: child.details(),\n });\n });\n}\n\n/** Own fan-out counts, activity labels and bounded detail rendering. */\nexport function createMappedChildProgress(\n keys: readonly string[],\n concurrency: number,\n options: ToMappedChildStepProgressOptions | undefined,\n report: ReportProgress\n) {\n const active = new Map<string, string>();\n const failedKeys = new Set<string>();\n const itemIndexes = new Map(keys.map((key, index) => [key, index]));\n const itemRows = new Map<string, PipelineStepProgressDetail>(\n keys.map((id) => [id, { id, status: \"pending\" }])\n );\n const children = new Map<string, ReturnType<typeof createChildProgress>>();\n let finishedItems = 0;\n let failedItems = 0;\n let stepsPerItem = 0;\n let plannedChildSteps = 0;\n let plannedItems = 0;\n let terminalChildSteps = 0;\n\n const publish = (spotlight?: string, final = false): void => {\n const snapshot: MappedChildProgressSnapshot = {\n active,\n concurrency,\n failedItems,\n finishedItems,\n itemCount: keys.length,\n plannedChildSteps,\n plannedItems,\n stepsPerItem,\n terminalChildSteps,\n spotlight,\n };\n // Materialize only the visible window. Active and failed sets avoid a\n // scan or sort of the entire fan-out on every child status event.\n const limit = Math.max(0, Math.floor(options?.detailLimit ?? LIVE_FAN_OUT_GROUP_LIMIT)) || 0;\n let visibleKeys: readonly string[];\n if (final && options?.detailLimit === undefined) {\n visibleKeys = keys;\n } else {\n const visible = new Set<string>();\n for (const candidates of [active.keys(), failedKeys.keys(), keys.values()]) {\n for (const key of candidates) {\n if (visible.size >= limit) break;\n visible.add(key);\n }\n }\n visibleKeys = [...visible].sort(\n (left, right) => itemIndexes.get(left)! - itemIndexes.get(right)!\n );\n }\n const details = visibleKeys.flatMap((key) => [\n { ...itemRows.get(key)! },\n ...(children.get(key)?.details() ?? []).map((detail) => ({\n ...detail,\n depth: (detail.depth ?? 0) + 1,\n })),\n ]);\n if (visibleKeys.length < keys.length) {\n details.push({ id: `+${keys.length - visibleKeys.length} more`, status: \"pending\" });\n }\n report({ ...mappedChildProgressSummary(snapshot, options), details });\n };\n\n return {\n publish,\n start(key: string): void {\n active.set(key, \"starting\");\n itemRows.set(key, { id: key, status: \"running\" });\n publish();\n },\n plan(key: string, plan: PipelinePlan): PipelineHooks {\n const child = createChildProgress(plan);\n children.set(key, child);\n if (plan.ok) {\n plannedChildSteps += child.total;\n plannedItems += 1;\n stepsPerItem = Math.max(stepsPerItem, child.total);\n }\n return childProgressHooks((event) => {\n const update = child.update(event);\n if (!update || update.label === undefined) return;\n terminalChildSteps += update.terminalDelta;\n active.set(key, update.label);\n publish();\n });\n },\n childCompleted(key: string): void {\n // Public child implementations may return success without emitting all\n // statuses. Reconcile their selected steps before mapping the result.\n terminalChildSteps += children.get(key)?.complete() ?? 0;\n },\n complete(key: string): void {\n active.delete(key);\n itemRows.set(key, { id: key, status: \"completed\" });\n finishedItems += 1;\n publish(`${key}: completed`);\n },\n fail(key: string, error: Error, cancelled: boolean): void {\n active.delete(key);\n itemRows.set(key, {\n id: key,\n status: cancelled ? \"cancelled\" : \"failed\",\n label: error.message,\n });\n failedKeys.add(key);\n failedItems += 1;\n publish(`${key}: failed`);\n },\n finish(): void {\n if (options?.detailLimit === undefined && keys.length > LIVE_FAN_OUT_GROUP_LIMIT) {\n publish(undefined, true);\n }\n },\n };\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import type { Pipeline, PipelineExecutionContext, PipelineRunControls, PipelineStepContext } from "./pipeline-types.js";
2
+ /** Read-only state supplied to an iteration's mapping and transition callbacks. */
3
+ export type IterationState<T> = {
4
+ readonly [K in keyof T]: IterationState<T[K]>;
5
+ };
6
+ /** Continue with a new state or publish the iteration step's final output. */
7
+ export type IterationDecision<TState, TResult> = {
8
+ readonly kind: "next";
9
+ readonly state: TState;
10
+ readonly result?: never;
11
+ } | {
12
+ readonly kind: "finish";
13
+ readonly result: TResult;
14
+ readonly state?: never;
15
+ };
16
+ interface IterationConfig<TOptions extends object> {
17
+ stepId: string;
18
+ pipeline: Pipeline<object, unknown>;
19
+ maxIterations: number;
20
+ controls?: PipelineRunControls;
21
+ initialState(inputs: Record<string, unknown>, context: PipelineExecutionContext<TOptions>): unknown;
22
+ mapOptions(state: unknown, inputs: Record<string, unknown>, context: PipelineExecutionContext<TOptions>): object;
23
+ transition(result: unknown, state: unknown, context: PipelineExecutionContext<TOptions>): unknown;
24
+ }
25
+ /** Repeat ordinary child execution; state and retained progress belong to this invocation. */
26
+ export declare function createIterationRunner<TOptions extends object>(config: IterationConfig<TOptions>): (inputs: Record<string, unknown>, context: PipelineStepContext<TOptions>) => Promise<unknown>;
27
+ export {};
@@ -0,0 +1,111 @@
1
+ import { throwIfAborted } from "../utilities/abort.js";
2
+ import { createSingleChildRunner } from "./child-execution.js";
3
+ import { isPipelineCancellation } from "./pipeline-execution-error.js";
4
+ function decision(value) {
5
+ if (value !== null &&
6
+ typeof value === "object" &&
7
+ !Array.isArray(value) &&
8
+ Object.keys(value).length === 2 &&
9
+ Object.hasOwn(value, "kind")) {
10
+ if ("kind" in value &&
11
+ value.kind === "finish" &&
12
+ Object.hasOwn(value, "result") &&
13
+ !("state" in value)) {
14
+ return { kind: "finish", result: Reflect.get(value, "result") };
15
+ }
16
+ if ("kind" in value &&
17
+ value.kind === "next" &&
18
+ Object.hasOwn(value, "state") &&
19
+ !("result" in value)) {
20
+ return { kind: "next", state: Reflect.get(value, "state") };
21
+ }
22
+ }
23
+ throw Object.assign(new Error("Iteration transition must return next(state) or finish(result)"), {
24
+ code: "TUBELESS_ITERATION_INVALID_DECISION",
25
+ });
26
+ }
27
+ /** Repeat ordinary child execution; state and retained progress belong to this invocation. */
28
+ export function createIterationRunner(config) {
29
+ return async (inputs, context) => {
30
+ throwIfAborted(context.signal, "Pipeline iteration");
31
+ let state = config.initialState(inputs, context);
32
+ const retained = [];
33
+ for (let index = 1; index <= config.maxIterations; index++) {
34
+ throwIfAborted(context.signal, "Pipeline iteration");
35
+ const key = `iteration-${index}`;
36
+ let latest;
37
+ const rows = (status) => [
38
+ { id: key, status, completed: latest?.completed, total: latest?.total },
39
+ ...(latest?.details ?? []).map((row) => ({
40
+ ...row,
41
+ id: `${key}/${row.id}`,
42
+ depth: (row.depth ?? 0) + 1,
43
+ })),
44
+ ];
45
+ const publish = (status) => {
46
+ const omitted = index - 1 - retained.length;
47
+ context.reportProgress({
48
+ completed: status === "completed" ? index : index - 1,
49
+ message: `Iteration ${index} of at most ${config.maxIterations}${latest?.message ? `: ${latest.message}` : ""}`,
50
+ details: [
51
+ // Traces retain a prefix: keep the current group and newest history first.
52
+ ...rows(status),
53
+ ...retained.flat(),
54
+ ...(omitted > 0
55
+ ? [{ id: `${omitted} earlier iterations`, status: "completed" }]
56
+ : []),
57
+ ],
58
+ });
59
+ };
60
+ publish("running");
61
+ try {
62
+ const runChild = createSingleChildRunner({
63
+ pipeline: config.pipeline,
64
+ controls: config.controls,
65
+ mapOptions: () => config.mapOptions(state, inputs, context),
66
+ });
67
+ const value = await runChild(inputs, {
68
+ ...context,
69
+ tracing: context.tracing
70
+ ? {
71
+ ...context.tracing,
72
+ iteration: {
73
+ runId: context.runId,
74
+ stepId: config.stepId,
75
+ attemptId: context.attemptId,
76
+ index,
77
+ },
78
+ }
79
+ : undefined,
80
+ reportProgress: (progress) => {
81
+ latest = progress;
82
+ publish("running");
83
+ },
84
+ });
85
+ throwIfAborted(context.signal, "Pipeline iteration");
86
+ const next = decision(await config.transition(value, state, context));
87
+ throwIfAborted(context.signal, "Pipeline iteration");
88
+ if (next.kind === "finish") {
89
+ const result = await next.result;
90
+ throwIfAborted(context.signal, "Pipeline iteration");
91
+ publish("completed");
92
+ return result;
93
+ }
94
+ if (index === config.maxIterations) {
95
+ throw Object.assign(new Error(`Pipeline iteration reached maxIterations=${config.maxIterations} after ${config.maxIterations} child runs`), { code: "TUBELESS_ITERATION_LIMIT_REACHED" });
96
+ }
97
+ publish("completed");
98
+ state = next.state;
99
+ retained.unshift(rows("completed"));
100
+ // Keep at most 32 iteration groups in progress; child traces retain full history.
101
+ if (retained.length >= 32)
102
+ retained.pop();
103
+ }
104
+ catch (error) {
105
+ publish(isPipelineCancellation(error, context) ? "cancelled" : "failed");
106
+ throw error;
107
+ }
108
+ }
109
+ };
110
+ }
111
+ //# sourceMappingURL=iteration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iteration.js","sourceRoot":"","sources":["../../src/core/iteration.ts"],"names":[],"mappings":"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","sourcesContent":["import { throwIfAborted } from \"../utilities/abort.js\";\nimport { createSingleChildRunner } from \"./child-execution.js\";\nimport { isPipelineCancellation } from \"./pipeline-execution-error.js\";\nimport type {\n Pipeline,\n PipelineExecutionContext,\n PipelineRunControls,\n PipelineStepContext,\n PipelineStepProgress,\n PipelineStepProgressDetail,\n} from \"./pipeline-types.js\";\n\n/** Read-only state supplied to an iteration's mapping and transition callbacks. */\nexport type IterationState<T> = { readonly [K in keyof T]: IterationState<T[K]> };\n\n/** Continue with a new state or publish the iteration step's final output. */\nexport type IterationDecision<TState, TResult> =\n | { readonly kind: \"next\"; readonly state: TState; readonly result?: never }\n | { readonly kind: \"finish\"; readonly result: TResult; readonly state?: never };\n\ninterface IterationConfig<TOptions extends object> {\n stepId: string;\n pipeline: Pipeline<object, unknown>;\n maxIterations: number;\n controls?: PipelineRunControls;\n initialState(\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<TOptions>\n ): unknown;\n mapOptions(\n state: unknown,\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<TOptions>\n ): object;\n transition(result: unknown, state: unknown, context: PipelineExecutionContext<TOptions>): unknown;\n}\n\nfunction decision(value: unknown): IterationDecision<unknown, unknown> {\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length === 2 &&\n Object.hasOwn(value, \"kind\")\n ) {\n if (\n \"kind\" in value &&\n value.kind === \"finish\" &&\n Object.hasOwn(value, \"result\") &&\n !(\"state\" in value)\n ) {\n return { kind: \"finish\", result: Reflect.get(value, \"result\") };\n }\n if (\n \"kind\" in value &&\n value.kind === \"next\" &&\n Object.hasOwn(value, \"state\") &&\n !(\"result\" in value)\n ) {\n return { kind: \"next\", state: Reflect.get(value, \"state\") };\n }\n }\n throw Object.assign(new Error(\"Iteration transition must return next(state) or finish(result)\"), {\n code: \"TUBELESS_ITERATION_INVALID_DECISION\",\n });\n}\n\n/** Repeat ordinary child execution; state and retained progress belong to this invocation. */\nexport function createIterationRunner<TOptions extends object>(config: IterationConfig<TOptions>) {\n return async (\n inputs: Record<string, unknown>,\n context: PipelineStepContext<TOptions>\n ): Promise<unknown> => {\n throwIfAborted(context.signal, \"Pipeline iteration\");\n let state = config.initialState(inputs, context);\n const retained: PipelineStepProgressDetail[][] = [];\n for (let index = 1; index <= config.maxIterations; index++) {\n throwIfAborted(context.signal, \"Pipeline iteration\");\n const key = `iteration-${index}`;\n let latest: PipelineStepProgress | undefined;\n const rows = (status: PipelineStepProgressDetail[\"status\"]): PipelineStepProgressDetail[] => [\n { id: key, status, completed: latest?.completed, total: latest?.total },\n ...(latest?.details ?? []).map((row) => ({\n ...row,\n id: `${key}/${row.id}`,\n depth: (row.depth ?? 0) + 1,\n })),\n ];\n const publish = (status: PipelineStepProgressDetail[\"status\"]): void => {\n const omitted = index - 1 - retained.length;\n context.reportProgress({\n completed: status === \"completed\" ? index : index - 1,\n message: `Iteration ${index} of at most ${config.maxIterations}${latest?.message ? `: ${latest.message}` : \"\"}`,\n details: [\n // Traces retain a prefix: keep the current group and newest history first.\n ...rows(status),\n ...retained.flat(),\n ...(omitted > 0\n ? [{ id: `${omitted} earlier iterations`, status: \"completed\" as const }]\n : []),\n ],\n });\n };\n publish(\"running\");\n try {\n const runChild = createSingleChildRunner<TOptions>({\n pipeline: config.pipeline,\n controls: config.controls,\n mapOptions: () => config.mapOptions(state, inputs, context),\n });\n const value = await runChild(inputs, {\n ...context,\n tracing: context.tracing\n ? {\n ...context.tracing,\n iteration: {\n runId: context.runId,\n stepId: config.stepId,\n attemptId: context.attemptId,\n index,\n },\n }\n : undefined,\n reportProgress: (progress) => {\n latest = progress;\n publish(\"running\");\n },\n });\n throwIfAborted(context.signal, \"Pipeline iteration\");\n const next = decision(await config.transition(value, state, context));\n throwIfAborted(context.signal, \"Pipeline iteration\");\n if (next.kind === \"finish\") {\n const result = await next.result;\n throwIfAborted(context.signal, \"Pipeline iteration\");\n publish(\"completed\");\n return result;\n }\n if (index === config.maxIterations) {\n throw Object.assign(\n new Error(\n `Pipeline iteration reached maxIterations=${config.maxIterations} after ${config.maxIterations} child runs`\n ),\n { code: \"TUBELESS_ITERATION_LIMIT_REACHED\" }\n );\n }\n publish(\"completed\");\n state = next.state;\n retained.unshift(rows(\"completed\"));\n // Keep at most 32 iteration groups in progress; child traces retain full history.\n if (retained.length >= 32) retained.pop();\n } catch (error) {\n publish(isPipelineCancellation(error, context) ? \"cancelled\" : \"failed\");\n throw error;\n }\n }\n };\n}\n"]}
@@ -1,18 +1,20 @@
1
- import type { PipelineError, PipelinePlan, PipelineRun, PipelineRuntime, PipelineStepStatus } from "./pipeline-types.js";
2
- import { type PipelineTraceEmitter } from "../tracing/tracing-internal.js";
3
- import type { PipelineTraceAttributes } from "../tracing/tracing-contracts.js";
1
+ import type { ArtifactRecord } from "../tracing/artifact-metadata.js";
2
+ import type { PipelineError, PipelineLogger, PipelinePlan, PipelineRun, PipelineRuntime, PipelineStepStatus } from "./pipeline-types.js";
3
+ import type { PipelineTraceAttributes, PipelineTraceContext } from "../tracing/tracing-contracts.js";
4
4
  /** Internal canonical lifecycle stream. Hooks and tracing are projections of it. */
5
5
  export interface PipelineLifecycleObserver {
6
+ readonly traceContext: PipelineTraceContext | undefined;
6
7
  finalizeComplete(durationMs: number, value: unknown): void;
7
8
  finalizeError(error: PipelineError, durationMs: number): void;
8
9
  finalizeStart(): void;
9
10
  flush(): Promise<void>;
10
- log(level: "error" | "log" | "warn", message: unknown, params?: readonly unknown[], stepId?: string, attemptId?: string): void;
11
+ logger(stepId?: string, attemptId?: string): PipelineLogger;
11
12
  pipelineComplete(result: PipelineRun<unknown>): void;
12
13
  pipelineStart(plan: PipelinePlan, targetIds: readonly string[]): void;
14
+ recordArtifact(stepId: string, attemptId: string, record: ArtifactRecord, preview: boolean): void;
13
15
  reportAttempt(stepId: string, attempt: number, attributes?: PipelineTraceAttributes, attemptId?: string): void;
14
16
  stepStatus(event: PipelineStepStatus, trace?: boolean): void;
15
17
  }
16
- export declare function createPipelineLifecycleObserver(pipelineId: string, runtime: PipelineRuntime, trace: PipelineTraceEmitter | undefined): PipelineLifecycleObserver;
18
+ export declare function createPipelineLifecycleObserver(pipelineId: string, runtime: PipelineRuntime, identity: PipelineTraceContext): PipelineLifecycleObserver;
17
19
  /** Same start/complete projection executePlannedRun uses for an invalid plan. */
18
20
  export declare function emitRejectedPlanLifecycle(pipelineId: string, targetIds: readonly string[], plan: PipelinePlan, runtime: PipelineRuntime, result: PipelineRun<unknown>): Promise<void>;
@@ -1,4 +1,9 @@
1
- import { createPipelineTraceEmitter, } from "../tracing/tracing-internal.js";
1
+ import { createPipelineTraceEmitter } from "../tracing/tracing-internal.js";
2
+ const PIPELINE_LOGGER_BASE = Symbol("pipelineLoggerBase");
3
+ function basePipelineLogger(log) {
4
+ // SAFETY: the optional symbol exists only on loggers created by this module.
5
+ return log[PIPELINE_LOGGER_BASE] ?? log;
6
+ }
2
7
  function emitHook(runtime, emit) {
3
8
  if (!runtime.hooks)
4
9
  return;
@@ -20,8 +25,32 @@ function snapshotRun(result) {
20
25
  const { value, ...metadata } = result;
21
26
  return { ...structuredClone(metadata), value };
22
27
  }
23
- export function createPipelineLifecycleObserver(pipelineId, runtime, trace) {
28
+ export function createPipelineLifecycleObserver(pipelineId, runtime, identity) {
29
+ const base = basePipelineLogger(runtime.log);
30
+ const trace = createPipelineTraceEmitter(pipelineId, runtime.tracing, base, identity, runtime.now);
24
31
  return {
32
+ traceContext: trace?.context,
33
+ logger(stepId, attemptId) {
34
+ if (!trace)
35
+ return runtime.log;
36
+ // A child run inherits its parent's logger, but owns its own trace events.
37
+ const log = {
38
+ error: (message, ...params) => {
39
+ trace.log("error", message, params, stepId, attemptId);
40
+ base.error(message, ...params);
41
+ },
42
+ log: (message, ...params) => {
43
+ trace.log("log", message, params, stepId, attemptId);
44
+ base.log(message, ...params);
45
+ },
46
+ warn: (message, ...params) => {
47
+ trace.log("warn", message, params, stepId, attemptId);
48
+ base.warn(message, ...params);
49
+ },
50
+ };
51
+ log[PIPELINE_LOGGER_BASE] = base;
52
+ return log;
53
+ },
25
54
  pipelineStart(plan, targetIds) {
26
55
  emitHook(runtime, (hooks) => hooks.onPipelineStart?.(structuredClone(plan)));
27
56
  trace?.pipelineStart(plan, targetIds);
@@ -40,6 +69,7 @@ export function createPipelineLifecycleObserver(pipelineId, runtime, trace) {
40
69
  else {
41
70
  emitHook(runtime, (hooks) => hooks.onStepStart?.({
42
71
  attemptId: event.attemptId,
72
+ ...(event.outputSource ? { outputSource: event.outputSource } : {}),
43
73
  pipelineId: event.pipelineId,
44
74
  status: "running",
45
75
  step: structuredClone(event.step),
@@ -62,8 +92,8 @@ export function createPipelineLifecycleObserver(pipelineId, runtime, trace) {
62
92
  if (traceStatus)
63
93
  trace?.stepStatus(event);
64
94
  },
95
+ recordArtifact: (stepId, attemptId, record, preview) => trace?.artifact(stepId, attemptId, record, preview),
65
96
  reportAttempt: (stepId, attempt, attributes, attemptId) => trace?.reportAttempt(stepId, attempt, attributes, attemptId),
66
- log: (level, message, params, stepId, attemptId) => trace?.log(level, message, params, stepId, attemptId),
67
97
  finalizeStart() {
68
98
  emitHook(runtime, (hooks) => hooks.onFinalizeStart?.({ pipelineId }));
69
99
  trace?.finalizeStart();
@@ -92,7 +122,9 @@ export async function emitRejectedPlanLifecycle(pipelineId, targetIds, plan, run
92
122
  identity.parentRunId = result.parentRunId;
93
123
  if (runtime.tracing?.itemKey)
94
124
  identity.itemKey = runtime.tracing.itemKey;
95
- const lifecycle = createPipelineLifecycleObserver(pipelineId, runtime, createPipelineTraceEmitter(pipelineId, runtime.tracing, runtime.log, identity, runtime.now));
125
+ if (runtime.tracing?.iteration)
126
+ identity.iteration = runtime.tracing.iteration;
127
+ const lifecycle = createPipelineLifecycleObserver(pipelineId, runtime, identity);
96
128
  lifecycle.pipelineStart(plan, targetIds);
97
129
  lifecycle.pipelineComplete(result);
98
130
  await lifecycle.flush();