@xyne/workflow-sdk 1.0.0

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 (310) hide show
  1. package/README.md +36 -0
  2. package/dist/agents/agent-step.d.ts +152 -0
  3. package/dist/agents/agent-step.d.ts.map +1 -0
  4. package/dist/agents/agent-step.js +403 -0
  5. package/dist/agents/agent-step.js.map +1 -0
  6. package/dist/agents/base-runtime.d.ts +38 -0
  7. package/dist/agents/base-runtime.d.ts.map +1 -0
  8. package/dist/agents/base-runtime.js +21 -0
  9. package/dist/agents/base-runtime.js.map +1 -0
  10. package/dist/agents/index.d.ts +12 -0
  11. package/dist/agents/index.d.ts.map +1 -0
  12. package/dist/agents/index.js +17 -0
  13. package/dist/agents/index.js.map +1 -0
  14. package/dist/agents/interceptor.d.ts +19 -0
  15. package/dist/agents/interceptor.d.ts.map +1 -0
  16. package/dist/agents/interceptor.js +21 -0
  17. package/dist/agents/interceptor.js.map +1 -0
  18. package/dist/agents/interceptors/approval-gate.d.ts +14 -0
  19. package/dist/agents/interceptors/approval-gate.d.ts.map +1 -0
  20. package/dist/agents/interceptors/approval-gate.js +19 -0
  21. package/dist/agents/interceptors/approval-gate.js.map +1 -0
  22. package/dist/agents/interceptors/tool-logger.d.ts +15 -0
  23. package/dist/agents/interceptors/tool-logger.d.ts.map +1 -0
  24. package/dist/agents/interceptors/tool-logger.js +23 -0
  25. package/dist/agents/interceptors/tool-logger.js.map +1 -0
  26. package/dist/agents/pi-mono-runtime.d.ts +88 -0
  27. package/dist/agents/pi-mono-runtime.d.ts.map +1 -0
  28. package/dist/agents/pi-mono-runtime.js +129 -0
  29. package/dist/agents/pi-mono-runtime.js.map +1 -0
  30. package/dist/agents/tool-registry.d.ts +25 -0
  31. package/dist/agents/tool-registry.d.ts.map +1 -0
  32. package/dist/agents/tool-registry.js +47 -0
  33. package/dist/agents/tool-registry.js.map +1 -0
  34. package/dist/agents/tool-types.d.ts +25 -0
  35. package/dist/agents/tool-types.d.ts.map +1 -0
  36. package/dist/agents/tool-types.js +9 -0
  37. package/dist/agents/tool-types.js.map +1 -0
  38. package/dist/agents/types.d.ts +91 -0
  39. package/dist/agents/types.d.ts.map +1 -0
  40. package/dist/agents/types.js +12 -0
  41. package/dist/agents/types.js.map +1 -0
  42. package/dist/builder/index.d.ts +30 -0
  43. package/dist/builder/index.d.ts.map +1 -0
  44. package/dist/builder/index.js +32 -0
  45. package/dist/builder/index.js.map +1 -0
  46. package/dist/client/index.d.ts +19 -0
  47. package/dist/client/index.d.ts.map +1 -0
  48. package/dist/client/index.js +18 -0
  49. package/dist/client/index.js.map +1 -0
  50. package/dist/client/types.d.ts +128 -0
  51. package/dist/client/types.d.ts.map +1 -0
  52. package/dist/client/types.js +10 -0
  53. package/dist/client/types.js.map +1 -0
  54. package/dist/client/workflow-client.d.ts +15 -0
  55. package/dist/client/workflow-client.d.ts.map +1 -0
  56. package/dist/client/workflow-client.js +293 -0
  57. package/dist/client/workflow-client.js.map +1 -0
  58. package/dist/common/attachment.d.ts +31 -0
  59. package/dist/common/attachment.d.ts.map +1 -0
  60. package/dist/common/attachment.js +21 -0
  61. package/dist/common/attachment.js.map +1 -0
  62. package/dist/common/executable-check.d.ts +42 -0
  63. package/dist/common/executable-check.d.ts.map +1 -0
  64. package/dist/common/executable-check.js +115 -0
  65. package/dist/common/executable-check.js.map +1 -0
  66. package/dist/common/index.d.ts +21 -0
  67. package/dist/common/index.d.ts.map +1 -0
  68. package/dist/common/index.js +19 -0
  69. package/dist/common/index.js.map +1 -0
  70. package/dist/common/resume-payload.d.ts +34 -0
  71. package/dist/common/resume-payload.d.ts.map +1 -0
  72. package/dist/common/resume-payload.js +12 -0
  73. package/dist/common/resume-payload.js.map +1 -0
  74. package/dist/engine/available-context.d.ts +29 -0
  75. package/dist/engine/available-context.d.ts.map +1 -0
  76. package/dist/engine/available-context.js +66 -0
  77. package/dist/engine/available-context.js.map +1 -0
  78. package/dist/engine/condition-evaluator.d.ts +13 -0
  79. package/dist/engine/condition-evaluator.d.ts.map +1 -0
  80. package/dist/engine/condition-evaluator.js +92 -0
  81. package/dist/engine/condition-evaluator.js.map +1 -0
  82. package/dist/engine/config-validator.d.ts +25 -0
  83. package/dist/engine/config-validator.d.ts.map +1 -0
  84. package/dist/engine/config-validator.js +316 -0
  85. package/dist/engine/config-validator.js.map +1 -0
  86. package/dist/engine/pause-step.d.ts +20 -0
  87. package/dist/engine/pause-step.d.ts.map +1 -0
  88. package/dist/engine/pause-step.js +24 -0
  89. package/dist/engine/pause-step.js.map +1 -0
  90. package/dist/engine/service-registry.d.ts +49 -0
  91. package/dist/engine/service-registry.d.ts.map +1 -0
  92. package/dist/engine/service-registry.js +76 -0
  93. package/dist/engine/service-registry.js.map +1 -0
  94. package/dist/engine/variable-resolver.d.ts +29 -0
  95. package/dist/engine/variable-resolver.d.ts.map +1 -0
  96. package/dist/engine/variable-resolver.js +130 -0
  97. package/dist/engine/variable-resolver.js.map +1 -0
  98. package/dist/engine/workflow-executor.d.ts +96 -0
  99. package/dist/engine/workflow-executor.d.ts.map +1 -0
  100. package/dist/engine/workflow-executor.js +837 -0
  101. package/dist/engine/workflow-executor.js.map +1 -0
  102. package/dist/index.d.ts +57 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +56 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/persistence/in-memory-adapter.d.ts +138 -0
  107. package/dist/persistence/in-memory-adapter.d.ts.map +1 -0
  108. package/dist/persistence/in-memory-adapter.js +315 -0
  109. package/dist/persistence/in-memory-adapter.js.map +1 -0
  110. package/dist/persistence/types.d.ts +214 -0
  111. package/dist/persistence/types.d.ts.map +1 -0
  112. package/dist/persistence/types.js +8 -0
  113. package/dist/persistence/types.js.map +1 -0
  114. package/dist/router/types.d.ts +57 -0
  115. package/dist/router/types.d.ts.map +1 -0
  116. package/dist/router/types.js +8 -0
  117. package/dist/router/types.js.map +1 -0
  118. package/dist/router/workflow-router.d.ts +26 -0
  119. package/dist/router/workflow-router.d.ts.map +1 -0
  120. package/dist/router/workflow-router.js +611 -0
  121. package/dist/router/workflow-router.js.map +1 -0
  122. package/dist/runtime/execution-event-bus.d.ts +38 -0
  123. package/dist/runtime/execution-event-bus.d.ts.map +1 -0
  124. package/dist/runtime/execution-event-bus.js +87 -0
  125. package/dist/runtime/execution-event-bus.js.map +1 -0
  126. package/dist/runtime/types.d.ts +129 -0
  127. package/dist/runtime/types.d.ts.map +1 -0
  128. package/dist/runtime/types.js +5 -0
  129. package/dist/runtime/types.js.map +1 -0
  130. package/dist/runtime/workflow-runtime.d.ts +256 -0
  131. package/dist/runtime/workflow-runtime.d.ts.map +1 -0
  132. package/dist/runtime/workflow-runtime.js +699 -0
  133. package/dist/runtime/workflow-runtime.js.map +1 -0
  134. package/dist/steps/base-step.d.ts +204 -0
  135. package/dist/steps/base-step.d.ts.map +1 -0
  136. package/dist/steps/base-step.js +69 -0
  137. package/dist/steps/base-step.js.map +1 -0
  138. package/dist/steps/builtin/code.step.d.ts +95 -0
  139. package/dist/steps/builtin/code.step.d.ts.map +1 -0
  140. package/dist/steps/builtin/code.step.js +122 -0
  141. package/dist/steps/builtin/code.step.js.map +1 -0
  142. package/dist/steps/builtin/conditional.step.d.ts +146 -0
  143. package/dist/steps/builtin/conditional.step.d.ts.map +1 -0
  144. package/dist/steps/builtin/conditional.step.js +71 -0
  145. package/dist/steps/builtin/conditional.step.js.map +1 -0
  146. package/dist/steps/builtin/dedup.step.d.ts +65 -0
  147. package/dist/steps/builtin/dedup.step.d.ts.map +1 -0
  148. package/dist/steps/builtin/dedup.step.js +61 -0
  149. package/dist/steps/builtin/dedup.step.js.map +1 -0
  150. package/dist/steps/builtin/http-request.step.d.ts +928 -0
  151. package/dist/steps/builtin/http-request.step.d.ts.map +1 -0
  152. package/dist/steps/builtin/http-request.step.js +570 -0
  153. package/dist/steps/builtin/http-request.step.js.map +1 -0
  154. package/dist/steps/builtin/loop.step.d.ts +100 -0
  155. package/dist/steps/builtin/loop.step.d.ts.map +1 -0
  156. package/dist/steps/builtin/loop.step.js +79 -0
  157. package/dist/steps/builtin/loop.step.js.map +1 -0
  158. package/dist/steps/builtin/parallel.step.d.ts +208 -0
  159. package/dist/steps/builtin/parallel.step.d.ts.map +1 -0
  160. package/dist/steps/builtin/parallel.step.js +249 -0
  161. package/dist/steps/builtin/parallel.step.js.map +1 -0
  162. package/dist/steps/builtin/switch.step.d.ts +200 -0
  163. package/dist/steps/builtin/switch.step.d.ts.map +1 -0
  164. package/dist/steps/builtin/switch.step.js +92 -0
  165. package/dist/steps/builtin/switch.step.js.map +1 -0
  166. package/dist/steps/builtin/transform.step.d.ts +247 -0
  167. package/dist/steps/builtin/transform.step.d.ts.map +1 -0
  168. package/dist/steps/builtin/transform.step.js +135 -0
  169. package/dist/steps/builtin/transform.step.js.map +1 -0
  170. package/dist/steps/builtin/wait.step.d.ts +921 -0
  171. package/dist/steps/builtin/wait.step.d.ts.map +1 -0
  172. package/dist/steps/builtin/wait.step.js +211 -0
  173. package/dist/steps/builtin/wait.step.js.map +1 -0
  174. package/dist/steps/step-registry.d.ts +64 -0
  175. package/dist/steps/step-registry.d.ts.map +1 -0
  176. package/dist/steps/step-registry.js +102 -0
  177. package/dist/steps/step-registry.js.map +1 -0
  178. package/dist/storage/in-memory-adapter.d.ts +25 -0
  179. package/dist/storage/in-memory-adapter.d.ts.map +1 -0
  180. package/dist/storage/in-memory-adapter.js +41 -0
  181. package/dist/storage/in-memory-adapter.js.map +1 -0
  182. package/dist/storage/types.d.ts +53 -0
  183. package/dist/storage/types.d.ts.map +1 -0
  184. package/dist/storage/types.js +13 -0
  185. package/dist/storage/types.js.map +1 -0
  186. package/dist/testing/index.d.ts +10 -0
  187. package/dist/testing/index.d.ts.map +1 -0
  188. package/dist/testing/index.js +10 -0
  189. package/dist/testing/index.js.map +1 -0
  190. package/dist/testing/mock-context.d.ts +13 -0
  191. package/dist/testing/mock-context.d.ts.map +1 -0
  192. package/dist/testing/mock-context.js +21 -0
  193. package/dist/testing/mock-context.js.map +1 -0
  194. package/dist/testing/mock-step-context.d.ts +47 -0
  195. package/dist/testing/mock-step-context.d.ts.map +1 -0
  196. package/dist/testing/mock-step-context.js +59 -0
  197. package/dist/testing/mock-step-context.js.map +1 -0
  198. package/dist/triggers/base-trigger.d.ts +58 -0
  199. package/dist/triggers/base-trigger.d.ts.map +1 -0
  200. package/dist/triggers/base-trigger.js +37 -0
  201. package/dist/triggers/base-trigger.js.map +1 -0
  202. package/dist/triggers/builtin/default-cron-trigger.d.ts +44 -0
  203. package/dist/triggers/builtin/default-cron-trigger.d.ts.map +1 -0
  204. package/dist/triggers/builtin/default-cron-trigger.js +31 -0
  205. package/dist/triggers/builtin/default-cron-trigger.js.map +1 -0
  206. package/dist/triggers/builtin/default-event-trigger.d.ts +32 -0
  207. package/dist/triggers/builtin/default-event-trigger.d.ts.map +1 -0
  208. package/dist/triggers/builtin/default-event-trigger.js +21 -0
  209. package/dist/triggers/builtin/default-event-trigger.js.map +1 -0
  210. package/dist/triggers/builtin/default-manual-trigger.d.ts +119 -0
  211. package/dist/triggers/builtin/default-manual-trigger.d.ts.map +1 -0
  212. package/dist/triggers/builtin/default-manual-trigger.js +64 -0
  213. package/dist/triggers/builtin/default-manual-trigger.js.map +1 -0
  214. package/dist/triggers/builtin/default-webhook-trigger.d.ts +72 -0
  215. package/dist/triggers/builtin/default-webhook-trigger.d.ts.map +1 -0
  216. package/dist/triggers/builtin/default-webhook-trigger.js +91 -0
  217. package/dist/triggers/builtin/default-webhook-trigger.js.map +1 -0
  218. package/dist/triggers/cron-trigger.d.ts +52 -0
  219. package/dist/triggers/cron-trigger.d.ts.map +1 -0
  220. package/dist/triggers/cron-trigger.js +15 -0
  221. package/dist/triggers/cron-trigger.js.map +1 -0
  222. package/dist/triggers/event-trigger.d.ts +14 -0
  223. package/dist/triggers/event-trigger.d.ts.map +1 -0
  224. package/dist/triggers/event-trigger.js +13 -0
  225. package/dist/triggers/event-trigger.js.map +1 -0
  226. package/dist/triggers/manual-trigger.d.ts +11 -0
  227. package/dist/triggers/manual-trigger.d.ts.map +1 -0
  228. package/dist/triggers/manual-trigger.js +10 -0
  229. package/dist/triggers/manual-trigger.js.map +1 -0
  230. package/dist/triggers/trigger-registry.d.ts +48 -0
  231. package/dist/triggers/trigger-registry.d.ts.map +1 -0
  232. package/dist/triggers/trigger-registry.js +81 -0
  233. package/dist/triggers/trigger-registry.js.map +1 -0
  234. package/dist/triggers/webhook-trigger.d.ts +54 -0
  235. package/dist/triggers/webhook-trigger.d.ts.map +1 -0
  236. package/dist/triggers/webhook-trigger.js +13 -0
  237. package/dist/triggers/webhook-trigger.js.map +1 -0
  238. package/dist/types/attachment.d.ts +23 -0
  239. package/dist/types/attachment.d.ts.map +1 -0
  240. package/dist/types/attachment.js +2 -0
  241. package/dist/types/attachment.js.map +1 -0
  242. package/dist/types/categories.d.ts +14 -0
  243. package/dist/types/categories.d.ts.map +1 -0
  244. package/dist/types/categories.js +10 -0
  245. package/dist/types/categories.js.map +1 -0
  246. package/dist/types/context.d.ts +61 -0
  247. package/dist/types/context.d.ts.map +1 -0
  248. package/dist/types/context.js +2 -0
  249. package/dist/types/context.js.map +1 -0
  250. package/dist/types/index.d.ts +18 -0
  251. package/dist/types/index.d.ts.map +1 -0
  252. package/dist/types/index.js +12 -0
  253. package/dist/types/index.js.map +1 -0
  254. package/dist/types/known-types.d.ts +34 -0
  255. package/dist/types/known-types.d.ts.map +1 -0
  256. package/dist/types/known-types.js +49 -0
  257. package/dist/types/known-types.js.map +1 -0
  258. package/dist/types/operators.d.ts +20 -0
  259. package/dist/types/operators.d.ts.map +1 -0
  260. package/dist/types/operators.js +27 -0
  261. package/dist/types/operators.js.map +1 -0
  262. package/dist/types/pause-path.d.ts +23 -0
  263. package/dist/types/pause-path.d.ts.map +1 -0
  264. package/dist/types/pause-path.js +2 -0
  265. package/dist/types/pause-path.js.map +1 -0
  266. package/dist/types/pause-state.d.ts +100 -0
  267. package/dist/types/pause-state.d.ts.map +1 -0
  268. package/dist/types/pause-state.js +15 -0
  269. package/dist/types/pause-state.js.map +1 -0
  270. package/dist/types/resume-payload.d.ts +34 -0
  271. package/dist/types/resume-payload.d.ts.map +1 -0
  272. package/dist/types/resume-payload.js +12 -0
  273. package/dist/types/resume-payload.js.map +1 -0
  274. package/dist/types/status.d.ts +27 -0
  275. package/dist/types/status.d.ts.map +1 -0
  276. package/dist/types/status.js +41 -0
  277. package/dist/types/status.js.map +1 -0
  278. package/dist/types/step-events.d.ts +22 -0
  279. package/dist/types/step-events.d.ts.map +1 -0
  280. package/dist/types/step-events.js +8 -0
  281. package/dist/types/step-events.js.map +1 -0
  282. package/dist/types/step-types.d.ts +12 -0
  283. package/dist/types/step-types.d.ts.map +1 -0
  284. package/dist/types/step-types.js +2 -0
  285. package/dist/types/step-types.js.map +1 -0
  286. package/dist/types/trigger-types.d.ts +12 -0
  287. package/dist/types/trigger-types.d.ts.map +1 -0
  288. package/dist/types/trigger-types.js +2 -0
  289. package/dist/types/trigger-types.js.map +1 -0
  290. package/dist/types/validation.d.ts +19 -0
  291. package/dist/types/validation.d.ts.map +1 -0
  292. package/dist/types/validation.js +11 -0
  293. package/dist/types/validation.js.map +1 -0
  294. package/dist/types/workflow-config.d.ts +122 -0
  295. package/dist/types/workflow-config.d.ts.map +1 -0
  296. package/dist/types/workflow-config.js +71 -0
  297. package/dist/types/workflow-config.js.map +1 -0
  298. package/dist/util/executable-check.d.ts +42 -0
  299. package/dist/util/executable-check.d.ts.map +1 -0
  300. package/dist/util/executable-check.js +115 -0
  301. package/dist/util/executable-check.js.map +1 -0
  302. package/dist/util/schema-convert.d.ts +14 -0
  303. package/dist/util/schema-convert.d.ts.map +1 -0
  304. package/dist/util/schema-convert.js +16 -0
  305. package/dist/util/schema-convert.js.map +1 -0
  306. package/dist/util/variable-ref.d.ts +52 -0
  307. package/dist/util/variable-ref.d.ts.map +1 -0
  308. package/dist/util/variable-ref.js +89 -0
  309. package/dist/util/variable-ref.js.map +1 -0
  310. package/package.json +97 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * LOOP step — iterate over an array and walk a body branch per item.
3
+ *
4
+ * BaseControlFlowStep with a single `body` branch. For each item in the
5
+ * source array, sets `ctx.workflow.steps[loopStepId].currentItem` and walks
6
+ * the body branch.
7
+ *
8
+ * Output: `{ results: unknown[], count: number }`
9
+ */
10
+ import { z } from 'zod';
11
+ import { BaseControlFlowStep } from '../base-step.js';
12
+ import type { ControlFlowExecutionContext } from '../base-step.js';
13
+ import { BuiltinStepType } from '../../types/known-types.js';
14
+ import type { WorkflowStepConfig } from '../../types/workflow-config.js';
15
+ export declare const LoopStepConfigSchema: z.ZodObject<{
16
+ source: z.ZodString;
17
+ body: z.ZodArray<z.ZodObject<{
18
+ id: z.ZodString;
19
+ type: z.ZodString;
20
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
21
+ id: z.ZodString;
22
+ type: z.ZodString;
23
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
24
+ id: z.ZodString;
25
+ type: z.ZodString;
26
+ }, z.ZodTypeAny, "passthrough">>, "many">;
27
+ maxIterations: z.ZodDefault<z.ZodNumber>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ body: z.objectOutputType<{
30
+ id: z.ZodString;
31
+ type: z.ZodString;
32
+ }, z.ZodTypeAny, "passthrough">[];
33
+ source: string;
34
+ maxIterations: number;
35
+ }, {
36
+ body: z.objectInputType<{
37
+ id: z.ZodString;
38
+ type: z.ZodString;
39
+ }, z.ZodTypeAny, "passthrough">[];
40
+ source: string;
41
+ maxIterations?: number | undefined;
42
+ }>;
43
+ export type LoopStepConfig = z.infer<typeof LoopStepConfigSchema>;
44
+ export interface LoopStepOutput extends Record<string, unknown> {
45
+ results: unknown[];
46
+ count: number;
47
+ }
48
+ export declare class LoopStep extends BaseControlFlowStep<typeof LoopStepConfigSchema, LoopStepOutput> {
49
+ readonly type = BuiltinStepType.LOOP;
50
+ readonly name = "Loop";
51
+ readonly description = "Iterate over an array and execute steps for each item";
52
+ readonly configSchema: z.ZodObject<{
53
+ source: z.ZodString;
54
+ body: z.ZodArray<z.ZodObject<{
55
+ id: z.ZodString;
56
+ type: z.ZodString;
57
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
58
+ id: z.ZodString;
59
+ type: z.ZodString;
60
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
61
+ id: z.ZodString;
62
+ type: z.ZodString;
63
+ }, z.ZodTypeAny, "passthrough">>, "many">;
64
+ maxIterations: z.ZodDefault<z.ZodNumber>;
65
+ }, "strip", z.ZodTypeAny, {
66
+ body: z.objectOutputType<{
67
+ id: z.ZodString;
68
+ type: z.ZodString;
69
+ }, z.ZodTypeAny, "passthrough">[];
70
+ source: string;
71
+ maxIterations: number;
72
+ }, {
73
+ body: z.objectInputType<{
74
+ id: z.ZodString;
75
+ type: z.ZodString;
76
+ }, z.ZodTypeAny, "passthrough">[];
77
+ source: string;
78
+ maxIterations?: number | undefined;
79
+ }>;
80
+ readonly outputSchema: z.ZodObject<{
81
+ results: z.ZodArray<z.ZodUnknown, "many">;
82
+ count: z.ZodNumber;
83
+ }, "strip", z.ZodTypeAny, {
84
+ results: unknown[];
85
+ count: number;
86
+ }, {
87
+ results: unknown[];
88
+ count: number;
89
+ }>;
90
+ readonly category: "control";
91
+ readonly branchModel: "iterate";
92
+ readonly icon = "repeat";
93
+ readonly declaredOutputs: readonly [{
94
+ readonly key: "body";
95
+ readonly label: "For each item";
96
+ }];
97
+ getBranches(config: Record<string, unknown>): Record<string, WorkflowStepConfig[]>;
98
+ execute(config: LoopStepConfig, ctx: ControlFlowExecutionContext): Promise<LoopStepOutput>;
99
+ }
100
+ //# sourceMappingURL=loop.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.step.d.ts","sourceRoot":"","sources":["../../../src/steps/builtin/loop.step.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAKzE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,qBAAa,QAAS,SAAQ,mBAAmB,CAC/C,OAAO,oBAAoB,EAC3B,cAAc,CACf;IACC,SAAkB,IAAI,wBAAwB;IAC9C,SAAkB,IAAI,UAAU;IAChC,SAAkB,WAAW,2DAA2D;IACxF,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAwB;IACtD,SAAkB,YAAY;;;;;;;;;OAAwB;IACtD,SAAkB,QAAQ,EAAG,SAAS,CAAU;IAChD,SAAkB,WAAW,EAAG,SAAS,CAAU;IACnD,SAAkB,IAAI,YAAY;IAClC,SAAkB,eAAe;;;OAEtB;IAEF,WAAW,CAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAMxB,OAAO,CACpB,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,2BAA2B,GAC/B,OAAO,CAAC,cAAc,CAAC;CAkD3B"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * LOOP step — iterate over an array and walk a body branch per item.
3
+ *
4
+ * BaseControlFlowStep with a single `body` branch. For each item in the
5
+ * source array, sets `ctx.workflow.steps[loopStepId].currentItem` and walks
6
+ * the body branch.
7
+ *
8
+ * Output: `{ results: unknown[], count: number }`
9
+ */
10
+ import { z } from 'zod';
11
+ import { BaseControlFlowStep } from '../base-step.js';
12
+ import { BuiltinStepType } from '../../types/known-types.js';
13
+ import { resolvePath } from '../../engine/variable-resolver.js';
14
+ // ─── Config ───
15
+ export const LoopStepConfigSchema = z.object({
16
+ source: z.string().min(1).describe('Path to the array to iterate over (e.g. steps.fetch.output.items). Supports {{variable}} refs'),
17
+ body: z.array(z.object({ id: z.string(), type: z.string() }).passthrough()).describe('Steps to execute for each item in the array'),
18
+ maxIterations: z.number().int().positive().default(1000).describe('Maximum number of iterations as a safety limit'),
19
+ });
20
+ const LoopStepOutputSchema = z.object({
21
+ results: z.array(z.unknown()),
22
+ count: z.number(),
23
+ });
24
+ // ─── Step ───
25
+ export class LoopStep extends BaseControlFlowStep {
26
+ type = BuiltinStepType.LOOP;
27
+ name = 'Loop';
28
+ description = 'Iterate over an array and execute steps for each item';
29
+ configSchema = LoopStepConfigSchema;
30
+ outputSchema = LoopStepOutputSchema;
31
+ category = 'control';
32
+ branchModel = 'iterate';
33
+ icon = 'repeat';
34
+ declaredOutputs = [
35
+ { key: 'body', label: 'For each item' },
36
+ ];
37
+ getBranches(config) {
38
+ return {
39
+ body: (config['body'] ?? []),
40
+ };
41
+ }
42
+ async execute(config, ctx) {
43
+ // Resolve the source array from context
44
+ const sourceValue = resolvePath(ctx.workflow, config.source);
45
+ if (!Array.isArray(sourceValue)) {
46
+ throw new Error(`LOOP source "${config.source}" did not resolve to an array (got ${typeof sourceValue})`);
47
+ }
48
+ const items = sourceValue;
49
+ const limit = Math.min(items.length, config.maxIterations);
50
+ const results = [];
51
+ for (let i = 0; i < limit; i++) {
52
+ const item = items[i];
53
+ // Expose current item + index in the workflow context for body steps
54
+ const loopMeta = {
55
+ currentItem: item,
56
+ currentIndex: i,
57
+ totalItems: items.length,
58
+ };
59
+ // Store loop metadata in a well-known location
60
+ const prevMeta = ctx.workflow.steps['__loop'];
61
+ ctx.workflow.steps['__loop'] = {
62
+ type: 'LOOP',
63
+ output: loopMeta,
64
+ };
65
+ // Walk the body branch for this item
66
+ await ctx.walkBranch(config.body, ctx.workflow, 'body');
67
+ results.push(item);
68
+ // Restore previous loop metadata (for nested loops)
69
+ if (prevMeta !== undefined) {
70
+ ctx.workflow.steps['__loop'] = prevMeta;
71
+ }
72
+ else {
73
+ delete ctx.workflow.steps['__loop'];
74
+ }
75
+ }
76
+ return { results, count: results.length };
77
+ }
78
+ }
79
+ //# sourceMappingURL=loop.step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.step.js","sourceRoot":"","sources":["../../../src/steps/builtin/loop.step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * PARALLEL step — fan-out N named branches concurrently and collect results.
3
+ *
4
+ * BaseControlFlowStep with N dynamic branches. Runs all in parallel via
5
+ * Promise.allSettled or Promise.race depending on `merge` mode.
6
+ *
7
+ * Each branch gets an isolated copy of the workflow context so concurrent
8
+ * writes to `context.steps` don't conflict. After completion, the last
9
+ * step's output from each branch is collected into the parallel step's output.
10
+ *
11
+ * ## Pause handling (allSettled)
12
+ *
13
+ * When branches pause, completed branch results are preserved in the step's
14
+ * `statePatch` so they survive across resume cycles. On resume, only paused
15
+ * branches are re-walked — completed branches are restored from saved state.
16
+ * Multiple branches can be paused simultaneously; each `resume()` call
17
+ * resolves one branch. When the last paused branch completes, PARALLEL
18
+ * merges everything and returns.
19
+ *
20
+ * PausePath stays linear — it just points to the PARALLEL step. The
21
+ * per-branch state is managed internally via `statePatch`, keeping the
22
+ * executor's pause/resume logic completely generic.
23
+ *
24
+ * ## Output
25
+ *
26
+ * Discriminated union on `mode` so consumers (including the UI)
27
+ * can switch on `mode` and get full type safety for each case:
28
+ *
29
+ * allSettled: { mode: 'allSettled', branches: { [name]: { status, value?, reason? } } }
30
+ * race: { mode: 'race', winner: string, result: { output } }
31
+ */
32
+ import { z } from 'zod';
33
+ import { BaseControlFlowStep } from '../base-step.js';
34
+ import type { ControlFlowExecutionContext } from '../base-step.js';
35
+ import { BuiltinStepType } from '../../types/known-types.js';
36
+ import type { WorkflowStepConfig } from '../../types/workflow-config.js';
37
+ export declare const ParallelStepConfigSchema: z.ZodObject<{
38
+ branches: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
39
+ id: z.ZodString;
40
+ type: z.ZodString;
41
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
42
+ id: z.ZodString;
43
+ type: z.ZodString;
44
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
45
+ id: z.ZodString;
46
+ type: z.ZodString;
47
+ }, z.ZodTypeAny, "passthrough">>, "many">>;
48
+ merge: z.ZodDefault<z.ZodEnum<["allSettled", "race"]>>;
49
+ }, "strip", z.ZodTypeAny, {
50
+ branches: Record<string, z.objectOutputType<{
51
+ id: z.ZodString;
52
+ type: z.ZodString;
53
+ }, z.ZodTypeAny, "passthrough">[]>;
54
+ merge: "allSettled" | "race";
55
+ }, {
56
+ branches: Record<string, z.objectInputType<{
57
+ id: z.ZodString;
58
+ type: z.ZodString;
59
+ }, z.ZodTypeAny, "passthrough">[]>;
60
+ merge?: "allSettled" | "race" | undefined;
61
+ }>;
62
+ export type ParallelStepConfig = z.infer<typeof ParallelStepConfigSchema>;
63
+ /** Per-branch result wrapper (used in race output). */
64
+ export interface ParallelBranchResult {
65
+ output: Record<string, unknown>;
66
+ }
67
+ /** Per-branch result in 'allSettled' mode — mirrors PromiseSettledResult. */
68
+ export type ParallelSettledBranchResult = {
69
+ status: 'fulfilled';
70
+ value: Record<string, unknown>;
71
+ } | {
72
+ status: 'rejected';
73
+ reason: string;
74
+ };
75
+ export interface ParallelAllSettledOutput extends Record<string, unknown> {
76
+ mode: 'allSettled';
77
+ branches: Record<string, ParallelSettledBranchResult>;
78
+ }
79
+ export interface ParallelRaceOutput extends Record<string, unknown> {
80
+ mode: 'race';
81
+ winner: string;
82
+ result: ParallelBranchResult;
83
+ }
84
+ export type ParallelStepOutput = ParallelAllSettledOutput | ParallelRaceOutput;
85
+ export declare class ParallelStep extends BaseControlFlowStep<typeof ParallelStepConfigSchema, ParallelStepOutput> {
86
+ readonly type = BuiltinStepType.PARALLEL;
87
+ readonly name = "Parallel";
88
+ readonly description = "Run multiple branches concurrently and collect results";
89
+ readonly configSchema: z.ZodObject<{
90
+ branches: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
91
+ id: z.ZodString;
92
+ type: z.ZodString;
93
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
94
+ id: z.ZodString;
95
+ type: z.ZodString;
96
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
97
+ id: z.ZodString;
98
+ type: z.ZodString;
99
+ }, z.ZodTypeAny, "passthrough">>, "many">>;
100
+ merge: z.ZodDefault<z.ZodEnum<["allSettled", "race"]>>;
101
+ }, "strip", z.ZodTypeAny, {
102
+ branches: Record<string, z.objectOutputType<{
103
+ id: z.ZodString;
104
+ type: z.ZodString;
105
+ }, z.ZodTypeAny, "passthrough">[]>;
106
+ merge: "allSettled" | "race";
107
+ }, {
108
+ branches: Record<string, z.objectInputType<{
109
+ id: z.ZodString;
110
+ type: z.ZodString;
111
+ }, z.ZodTypeAny, "passthrough">[]>;
112
+ merge?: "allSettled" | "race" | undefined;
113
+ }>;
114
+ readonly outputSchema: z.ZodDiscriminatedUnion<"mode", [z.ZodObject<{
115
+ mode: z.ZodLiteral<"allSettled">;
116
+ branches: z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<"status", [z.ZodObject<{
117
+ status: z.ZodLiteral<"fulfilled">;
118
+ value: z.ZodRecord<z.ZodString, z.ZodUnknown>;
119
+ }, "strip", z.ZodTypeAny, {
120
+ value: Record<string, unknown>;
121
+ status: "fulfilled";
122
+ }, {
123
+ value: Record<string, unknown>;
124
+ status: "fulfilled";
125
+ }>, z.ZodObject<{
126
+ status: z.ZodLiteral<"rejected">;
127
+ reason: z.ZodString;
128
+ }, "strip", z.ZodTypeAny, {
129
+ status: "rejected";
130
+ reason: string;
131
+ }, {
132
+ status: "rejected";
133
+ reason: string;
134
+ }>]>>;
135
+ }, "strip", z.ZodTypeAny, {
136
+ mode: "allSettled";
137
+ branches: Record<string, {
138
+ value: Record<string, unknown>;
139
+ status: "fulfilled";
140
+ } | {
141
+ status: "rejected";
142
+ reason: string;
143
+ }>;
144
+ }, {
145
+ mode: "allSettled";
146
+ branches: Record<string, {
147
+ value: Record<string, unknown>;
148
+ status: "fulfilled";
149
+ } | {
150
+ status: "rejected";
151
+ reason: string;
152
+ }>;
153
+ }>, z.ZodObject<{
154
+ mode: z.ZodLiteral<"race">;
155
+ winner: z.ZodString;
156
+ result: z.ZodObject<{
157
+ output: z.ZodRecord<z.ZodString, z.ZodUnknown>;
158
+ }, "strip", z.ZodTypeAny, {
159
+ output: Record<string, unknown>;
160
+ }, {
161
+ output: Record<string, unknown>;
162
+ }>;
163
+ }, "strip", z.ZodTypeAny, {
164
+ result: {
165
+ output: Record<string, unknown>;
166
+ };
167
+ mode: "race";
168
+ winner: string;
169
+ }, {
170
+ result: {
171
+ output: Record<string, unknown>;
172
+ };
173
+ mode: "race";
174
+ winner: string;
175
+ }>]>;
176
+ readonly category: "control";
177
+ readonly icon = "columns";
178
+ /**
179
+ * Declared outputs are dynamic — one per branch key.
180
+ * Since branch keys are user-defined, we return empty here and let
181
+ * `getBranches()` handle discovery for validation.
182
+ */
183
+ readonly declaredOutputs: readonly [];
184
+ getBranches(config: Record<string, unknown>): Record<string, WorkflowStepConfig[]>;
185
+ execute(config: ParallelStepConfig, ctx: ControlFlowExecutionContext): Promise<ParallelStepOutput>;
186
+ private executeAllSettled;
187
+ private executeRace;
188
+ /**
189
+ * Load saved parallel state from a prior pause cycle.
190
+ *
191
+ * On resume, the executor hydrates `context.steps[stepId]` from the
192
+ * persisted step row (which includes our statePatch). We check for
193
+ * `__parallelState` in that entry to restore completed branch results.
194
+ */
195
+ private loadSavedState;
196
+ /**
197
+ * Create an isolated copy of the workflow context for a branch.
198
+ * Shares trigger and workflow identity, but each branch gets its own
199
+ * steps map so concurrent writes don't conflict.
200
+ */
201
+ private cloneContext;
202
+ /**
203
+ * Extract the output of the last step in a branch from its context.
204
+ * Returns the full output record, or an empty object if the branch has no steps.
205
+ */
206
+ private extractLastStepOutput;
207
+ }
208
+ //# sourceMappingURL=parallel.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.step.d.ts","sourceRoot":"","sources":["../../../src/steps/builtin/parallel.step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAMzE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;EAMnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAI1E,uDAAuD;AACvD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,6EAA6E;AAC7E,MAAM,MAAM,2BAA2B,GACnC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,MAAM,kBAAkB,GAC1B,wBAAwB,GACxB,kBAAkB,CAAC;AA8CvB,qBAAa,YAAa,SAAQ,mBAAmB,CACnD,OAAO,wBAAwB,EAC/B,kBAAkB,CACnB;IACC,SAAkB,IAAI,4BAA4B;IAClD,SAAkB,IAAI,cAAc;IACpC,SAAkB,WAAW,4DAC8B;IAC3D,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;OAA4B;IAC1D,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAA4B;IAC1D,SAAkB,QAAQ,EAAG,SAAS,CAAU;IAChD,SAAkB,IAAI,aAAa;IAEnC;;;;OAIG;IACH,SAAkB,eAAe,cAAe;IAEvC,WAAW,CAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAYxB,OAAO,CACpB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,2BAA2B,GAC/B,OAAO,CAAC,kBAAkB,CAAC;YAgBhB,iBAAiB;YAwGjB,WAAW;IA+BzB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAetB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAYpB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAc9B"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * PARALLEL step — fan-out N named branches concurrently and collect results.
3
+ *
4
+ * BaseControlFlowStep with N dynamic branches. Runs all in parallel via
5
+ * Promise.allSettled or Promise.race depending on `merge` mode.
6
+ *
7
+ * Each branch gets an isolated copy of the workflow context so concurrent
8
+ * writes to `context.steps` don't conflict. After completion, the last
9
+ * step's output from each branch is collected into the parallel step's output.
10
+ *
11
+ * ## Pause handling (allSettled)
12
+ *
13
+ * When branches pause, completed branch results are preserved in the step's
14
+ * `statePatch` so they survive across resume cycles. On resume, only paused
15
+ * branches are re-walked — completed branches are restored from saved state.
16
+ * Multiple branches can be paused simultaneously; each `resume()` call
17
+ * resolves one branch. When the last paused branch completes, PARALLEL
18
+ * merges everything and returns.
19
+ *
20
+ * PausePath stays linear — it just points to the PARALLEL step. The
21
+ * per-branch state is managed internally via `statePatch`, keeping the
22
+ * executor's pause/resume logic completely generic.
23
+ *
24
+ * ## Output
25
+ *
26
+ * Discriminated union on `mode` so consumers (including the UI)
27
+ * can switch on `mode` and get full type safety for each case:
28
+ *
29
+ * allSettled: { mode: 'allSettled', branches: { [name]: { status, value?, reason? } } }
30
+ * race: { mode: 'race', winner: string, result: { output } }
31
+ */
32
+ import { z } from 'zod';
33
+ import { BaseControlFlowStep } from '../base-step.js';
34
+ import { BuiltinStepType } from '../../types/known-types.js';
35
+ import { PauseStep } from '../../engine/pause-step.js';
36
+ // ─── Config ───
37
+ export const ParallelStepConfigSchema = z.object({
38
+ branches: z.record(z.string(), z.array(z.object({ id: z.string(), type: z.string() }).passthrough())).describe('Named branches that execute concurrently. Each key is a branch name, value is the steps to run'),
39
+ merge: z.enum(['allSettled', 'race']).default('allSettled').describe('How to combine branch results: allSettled waits for all, race returns first completed'),
40
+ });
41
+ // ─── Output Zod schema (for validation / introspection) ───
42
+ const ParallelBranchResultSchema = z.object({
43
+ output: z.record(z.unknown()),
44
+ });
45
+ const ParallelSettledBranchResultSchema = z.discriminatedUnion('status', [
46
+ z.object({
47
+ status: z.literal('fulfilled'),
48
+ value: z.record(z.unknown()),
49
+ }),
50
+ z.object({
51
+ status: z.literal('rejected'),
52
+ reason: z.string(),
53
+ }),
54
+ ]);
55
+ const ParallelStepOutputSchema = z.discriminatedUnion('mode', [
56
+ z.object({
57
+ mode: z.literal('allSettled'),
58
+ branches: z.record(ParallelSettledBranchResultSchema),
59
+ }),
60
+ z.object({
61
+ mode: z.literal('race'),
62
+ winner: z.string(),
63
+ result: ParallelBranchResultSchema,
64
+ }),
65
+ ]);
66
+ // ─── Step ───
67
+ export class ParallelStep extends BaseControlFlowStep {
68
+ type = BuiltinStepType.PARALLEL;
69
+ name = 'Parallel';
70
+ description = 'Run multiple branches concurrently and collect results';
71
+ configSchema = ParallelStepConfigSchema;
72
+ outputSchema = ParallelStepOutputSchema;
73
+ category = 'control';
74
+ icon = 'columns';
75
+ /**
76
+ * Declared outputs are dynamic — one per branch key.
77
+ * Since branch keys are user-defined, we return empty here and let
78
+ * `getBranches()` handle discovery for validation.
79
+ */
80
+ declaredOutputs = [];
81
+ getBranches(config) {
82
+ const branches = (config['branches'] ?? {});
83
+ const result = {};
84
+ for (const [key, steps] of Object.entries(branches)) {
85
+ result[key] = steps;
86
+ }
87
+ return result;
88
+ }
89
+ async execute(config, ctx) {
90
+ const branchEntries = Object.entries(config.branches);
91
+ if (branchEntries.length === 0) {
92
+ return { mode: config.merge, branches: {} };
93
+ }
94
+ if (config.merge === 'allSettled') {
95
+ return this.executeAllSettled(branchEntries, ctx);
96
+ }
97
+ // race
98
+ return this.executeRace(branchEntries, ctx);
99
+ }
100
+ // ─── Merge: allSettled ───
101
+ async executeAllSettled(branchEntries, ctx) {
102
+ // Check for saved state from a prior pause (resume path)
103
+ const savedState = this.loadSavedState(ctx);
104
+ // Determine which branches still need to run
105
+ const toRun = [];
106
+ const branches = {};
107
+ for (const [name, steps] of branchEntries) {
108
+ if (savedState?.completedBranches[name]) {
109
+ // Already completed in a prior run — restore result
110
+ branches[name] = savedState.completedBranches[name];
111
+ }
112
+ else {
113
+ toRun.push([name, steps]);
114
+ }
115
+ }
116
+ if (toRun.length === 0) {
117
+ return { mode: 'allSettled', branches };
118
+ }
119
+ // Run remaining branches concurrently
120
+ const promises = toRun.map(async ([name, steps]) => {
121
+ const branchCtx = this.cloneContext(ctx.workflow);
122
+ await ctx.walkBranch(steps, branchCtx, name);
123
+ return {
124
+ name,
125
+ output: this.extractLastStepOutput(steps, branchCtx),
126
+ };
127
+ });
128
+ const settled = await Promise.allSettled(promises);
129
+ // Separate results: completed (fulfilled/rejected) vs paused
130
+ const pausedBranches = {};
131
+ for (let i = 0; i < toRun.length; i++) {
132
+ const name = toRun[i][0];
133
+ const entry = settled[i];
134
+ if (entry.status === 'fulfilled') {
135
+ branches[name] = {
136
+ status: 'fulfilled',
137
+ value: entry.value.output,
138
+ };
139
+ }
140
+ else if (PauseStep.is(entry.reason)) {
141
+ const pe = entry.reason;
142
+ pausedBranches[name] = {
143
+ reason: pe.message,
144
+ ...(pe.externalRef !== undefined
145
+ ? { externalRef: pe.externalRef }
146
+ : {}),
147
+ };
148
+ }
149
+ else {
150
+ branches[name] = {
151
+ status: 'rejected',
152
+ reason: entry.reason instanceof Error
153
+ ? entry.reason.message
154
+ : String(entry.reason),
155
+ };
156
+ }
157
+ }
158
+ // If any branches paused, save completed state and re-throw
159
+ if (Object.keys(pausedBranches).length > 0) {
160
+ const state = {
161
+ completedBranches: branches,
162
+ pausedBranches,
163
+ };
164
+ // Pick the first paused branch's details for the PauseStep
165
+ const firstPaused = Object.values(pausedBranches)[0];
166
+ const pauseReason = Object.keys(pausedBranches).length === 1
167
+ ? firstPaused.reason
168
+ : `${String(Object.keys(pausedBranches).length)} branches paused`;
169
+ const opts = {
170
+ statePatch: { __parallelState: state },
171
+ };
172
+ if (firstPaused.externalRef !== undefined) {
173
+ opts.externalRef = firstPaused.externalRef;
174
+ }
175
+ throw new PauseStep(pauseReason, opts);
176
+ }
177
+ return { mode: 'allSettled', branches };
178
+ }
179
+ // ─── Merge: race ───
180
+ async executeRace(branchEntries, ctx) {
181
+ const promises = branchEntries.map(async ([name, steps]) => {
182
+ const branchCtx = this.cloneContext(ctx.workflow);
183
+ await ctx.walkBranch(steps, branchCtx, name);
184
+ return {
185
+ name,
186
+ output: this.extractLastStepOutput(steps, branchCtx),
187
+ };
188
+ });
189
+ const winner = await Promise.race(promises);
190
+ return {
191
+ mode: 'race',
192
+ winner: winner.name,
193
+ result: { output: winner.output },
194
+ };
195
+ }
196
+ // ─── Helpers ───
197
+ /**
198
+ * Load saved parallel state from a prior pause cycle.
199
+ *
200
+ * On resume, the executor hydrates `context.steps[stepId]` from the
201
+ * persisted step row (which includes our statePatch). We check for
202
+ * `__parallelState` in that entry to restore completed branch results.
203
+ */
204
+ loadSavedState(ctx) {
205
+ if (!ctx.runtime.isResuming)
206
+ return null;
207
+ const stepId = ctx.runtime.stepId;
208
+ const entry = ctx.workflow.steps[stepId];
209
+ if (!entry)
210
+ return null;
211
+ const raw = entry['__parallelState'];
212
+ if (!raw || typeof raw !== 'object')
213
+ return null;
214
+ return raw;
215
+ }
216
+ /**
217
+ * Create an isolated copy of the workflow context for a branch.
218
+ * Shares trigger and workflow identity, but each branch gets its own
219
+ * steps map so concurrent writes don't conflict.
220
+ */
221
+ cloneContext(parent) {
222
+ const clone = {
223
+ workflow: parent.workflow,
224
+ trigger: parent.trigger,
225
+ steps: { ...parent.steps },
226
+ };
227
+ if (parent.__meta !== undefined) {
228
+ clone.__meta = parent.__meta;
229
+ }
230
+ return clone;
231
+ }
232
+ /**
233
+ * Extract the output of the last step in a branch from its context.
234
+ * Returns the full output record, or an empty object if the branch has no steps.
235
+ */
236
+ extractLastStepOutput(steps, branchCtx) {
237
+ if (steps.length === 0)
238
+ return {};
239
+ for (let i = steps.length - 1; i >= 0; i--) {
240
+ const stepId = steps[i].id;
241
+ const entry = branchCtx.steps[stepId];
242
+ if (entry?.output) {
243
+ return entry.output;
244
+ }
245
+ }
246
+ return {};
247
+ }
248
+ }
249
+ //# sourceMappingURL=parallel.step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.step.js","sourceRoot":"","sources":["../../../src/steps/builtin/parallel.step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,iBAAiB;AAEjB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAChB,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CACtE,CAAC,QAAQ,CAAC,gGAAgG,CAAC;IAC5G,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,uFAAuF,CAAC;CAC9J,CAAC,CAAC;AA4CH,6DAA6D;AAE7D,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,iCAAiC,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACvE,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KAC7B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC5D,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC;KACtD,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,0BAA0B;KACnC,CAAC;CACH,CAAC,CAAC;AAEH,eAAe;AAEf,MAAM,OAAO,YAAa,SAAQ,mBAGjC;IACmB,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC;IAChC,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAC3B,wDAAwD,CAAC;IACzC,YAAY,GAAG,wBAAwB,CAAC;IACxC,YAAY,GAAG,wBAAwB,CAAC;IACxC,QAAQ,GAAG,SAAkB,CAAC;IAC9B,IAAI,GAAG,SAAS,CAAC;IAEnC;;;;OAIG;IACe,eAAe,GAAG,EAAW,CAAC;IAEvC,WAAW,CAClB,MAA+B;QAE/B,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAGzC,CAAC;QACF,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAwC,CAAC;QACzD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,KAAK,CAAC,OAAO,CACpB,MAA0B,EAC1B,GAAgC;QAEhC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAwB,CAAC;QACpE,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,OAAO;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,4BAA4B;IAEpB,KAAK,CAAC,iBAAiB,CAC7B,aAAoD,EACpD,GAAgC;QAEhC,yDAAyD;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAE5C,6CAA6C;QAC7C,MAAM,KAAK,GAA0C,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAgD,EAAE,CAAC;QAEjE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;YAC1C,IAAI,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,oDAAoD;gBACpD,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QAC1C,CAAC;QAED,sCAAsC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACjD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,GAAG,CAAC,UAAU,CAClB,KAAwC,EACxC,SAAS,EACT,IAAI,CACL,CAAC;YACF,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAChC,KAAwC,EACxC,SAAS,CACV;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnD,6DAA6D;QAC7D,MAAM,cAAc,GAGhB,EAAE,CAAC;QAEP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,GAAG;oBACf,MAAM,EAAE,WAAW;oBACnB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;iBAC1B,CAAC;YACJ,CAAC;iBAAM,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAmB,CAAC;gBACrC,cAAc,CAAC,IAAI,CAAC,GAAG;oBACrB,MAAM,EAAE,EAAE,CAAC,OAAO;oBAClB,GAAG,CAAC,EAAE,CAAC,WAAW,KAAK,SAAS;wBAC9B,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE;wBACjC,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,GAAG;oBACf,MAAM,EAAE,UAAU;oBAClB,MAAM,EACJ,KAAK,CAAC,MAAM,YAAY,KAAK;wBAC3B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;wBACtB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;iBAC3B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAuB;gBAChC,iBAAiB,EAAE,QAAQ;gBAC3B,cAAc;aACf,CAAC;YAEF,2DAA2D;YAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAE,CAAC;YACtD,MAAM,WAAW,GACf,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC;gBACtC,CAAC,CAAC,WAAW,CAAC,MAAM;gBACpB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAEtE,MAAM,IAAI,GAAkE;gBAC1E,UAAU,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;aACvC,CAAC;YACF,IAAI,WAAW,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;YAC7C,CAAC;YACD,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,sBAAsB;IAEd,KAAK,CAAC,WAAW,CACvB,aAAoD,EACpD,GAAgC;QAEhC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,GAAG,CAAC,UAAU,CAClB,KAAwC,EACxC,SAAS,EACT,IAAI,CACL,CAAC;YACF,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAChC,KAAwC,EACxC,SAAS,CACV;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5C,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,kBAAkB;IAElB;;;;;;OAMG;IACK,cAAc,CACpB,GAAgC;QAEhC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,GAAG,GAAI,KAA4C,CAAC,iBAAiB,CAAC,CAAC;QAC7E,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEjD,OAAO,GAAyB,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,MAAuB;QAC1C,MAAM,KAAK,GAAoB;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE;SAC3B,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAC3B,KAA2B,EAC3B,SAA0B;QAE1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAC,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}