@xyne/workflow-sdk 3.2.37 → 3.2.38

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 (210) hide show
  1. package/dist/agents/agent-step.d.ts +2 -2
  2. package/dist/agents/host-agent-step.d.ts +1 -1
  3. package/dist/builder/index.d.ts +2 -2
  4. package/dist/builder/index.d.ts.map +1 -1
  5. package/dist/builder/index.js +1 -1
  6. package/dist/builder/index.js.map +1 -1
  7. package/dist/client/types.d.ts +7 -5
  8. package/dist/client/types.d.ts.map +1 -1
  9. package/dist/client/workflow-client.d.ts.map +1 -1
  10. package/dist/client/workflow-client.js +7 -0
  11. package/dist/client/workflow-client.js.map +1 -1
  12. package/dist/common/citation-ref.d.ts +4 -4
  13. package/dist/common/credentials.d.ts +107 -0
  14. package/dist/common/credentials.d.ts.map +1 -1
  15. package/dist/common/credentials.js +67 -0
  16. package/dist/common/credentials.js.map +1 -1
  17. package/dist/common/index.d.ts +2 -2
  18. package/dist/common/index.d.ts.map +1 -1
  19. package/dist/common/index.js +2 -2
  20. package/dist/common/index.js.map +1 -1
  21. package/dist/connectors/builtin/builtin-connector.d.ts +32 -0
  22. package/dist/connectors/builtin/builtin-connector.d.ts.map +1 -0
  23. package/dist/connectors/builtin/builtin-connector.js +62 -0
  24. package/dist/connectors/builtin/builtin-connector.js.map +1 -0
  25. package/dist/connectors/builtin/credentials.d.ts +18 -0
  26. package/dist/connectors/builtin/credentials.d.ts.map +1 -0
  27. package/dist/connectors/builtin/credentials.js +50 -0
  28. package/dist/connectors/builtin/credentials.js.map +1 -0
  29. package/dist/connectors/builtin/steps/code.step.d.ts +99 -0
  30. package/dist/connectors/builtin/steps/code.step.d.ts.map +1 -0
  31. package/dist/connectors/builtin/steps/code.step.js +152 -0
  32. package/dist/connectors/builtin/steps/code.step.js.map +1 -0
  33. package/dist/connectors/builtin/steps/conditional.step.d.ts +182 -0
  34. package/dist/connectors/builtin/steps/conditional.step.d.ts.map +1 -0
  35. package/dist/connectors/builtin/steps/conditional.step.js +82 -0
  36. package/dist/connectors/builtin/steps/conditional.step.js.map +1 -0
  37. package/dist/connectors/builtin/steps/dedup.step.d.ts +65 -0
  38. package/dist/connectors/builtin/steps/dedup.step.d.ts.map +1 -0
  39. package/dist/connectors/builtin/steps/dedup.step.js +61 -0
  40. package/dist/connectors/builtin/steps/dedup.step.js.map +1 -0
  41. package/dist/connectors/builtin/steps/http-request.step.d.ts +1027 -0
  42. package/dist/connectors/builtin/steps/http-request.step.d.ts.map +1 -0
  43. package/dist/connectors/builtin/steps/http-request.step.js +497 -0
  44. package/dist/connectors/builtin/steps/http-request.step.js.map +1 -0
  45. package/dist/connectors/builtin/steps/loop.step.d.ts +100 -0
  46. package/dist/connectors/builtin/steps/loop.step.d.ts.map +1 -0
  47. package/dist/connectors/builtin/steps/loop.step.js +73 -0
  48. package/dist/connectors/builtin/steps/loop.step.js.map +1 -0
  49. package/dist/connectors/builtin/steps/map.step.d.ts +148 -0
  50. package/dist/connectors/builtin/steps/map.step.d.ts.map +1 -0
  51. package/dist/connectors/builtin/steps/map.step.js +111 -0
  52. package/dist/connectors/builtin/steps/map.step.js.map +1 -0
  53. package/dist/connectors/builtin/steps/parallel.step.d.ts +246 -0
  54. package/dist/connectors/builtin/steps/parallel.step.d.ts.map +1 -0
  55. package/dist/connectors/builtin/steps/parallel.step.js +175 -0
  56. package/dist/connectors/builtin/steps/parallel.step.js.map +1 -0
  57. package/dist/connectors/builtin/steps/ssrf-guard.d.ts +9 -0
  58. package/dist/connectors/builtin/steps/ssrf-guard.d.ts.map +1 -0
  59. package/dist/connectors/builtin/steps/ssrf-guard.js +115 -0
  60. package/dist/connectors/builtin/steps/ssrf-guard.js.map +1 -0
  61. package/dist/connectors/builtin/steps/switch.step.d.ts +235 -0
  62. package/dist/connectors/builtin/steps/switch.step.d.ts.map +1 -0
  63. package/dist/connectors/builtin/steps/switch.step.js +101 -0
  64. package/dist/connectors/builtin/steps/switch.step.js.map +1 -0
  65. package/dist/connectors/builtin/steps/wait.step.d.ts +1072 -0
  66. package/dist/connectors/builtin/steps/wait.step.d.ts.map +1 -0
  67. package/dist/connectors/builtin/steps/wait.step.js +254 -0
  68. package/dist/connectors/builtin/steps/wait.step.js.map +1 -0
  69. package/dist/connectors/builtin/triggers/default-cron-trigger.d.ts +44 -0
  70. package/dist/connectors/builtin/triggers/default-cron-trigger.d.ts.map +1 -0
  71. package/dist/connectors/builtin/triggers/default-cron-trigger.js +31 -0
  72. package/dist/connectors/builtin/triggers/default-cron-trigger.js.map +1 -0
  73. package/dist/connectors/builtin/triggers/default-event-trigger.d.ts +32 -0
  74. package/dist/connectors/builtin/triggers/default-event-trigger.d.ts.map +1 -0
  75. package/dist/connectors/builtin/triggers/default-event-trigger.js +21 -0
  76. package/dist/connectors/builtin/triggers/default-event-trigger.js.map +1 -0
  77. package/dist/connectors/builtin/triggers/default-manual-trigger.d.ts +45 -0
  78. package/dist/connectors/builtin/triggers/default-manual-trigger.d.ts.map +1 -0
  79. package/dist/connectors/builtin/triggers/default-manual-trigger.js +51 -0
  80. package/dist/connectors/builtin/triggers/default-manual-trigger.js.map +1 -0
  81. package/dist/connectors/builtin/triggers/default-webhook-v2-trigger.d.ts +31 -0
  82. package/dist/connectors/builtin/triggers/default-webhook-v2-trigger.d.ts.map +1 -0
  83. package/dist/connectors/builtin/triggers/default-webhook-v2-trigger.js +40 -0
  84. package/dist/connectors/builtin/triggers/default-webhook-v2-trigger.js.map +1 -0
  85. package/dist/connectors/core/base-connector.d.ts +45 -0
  86. package/dist/connectors/core/base-connector.d.ts.map +1 -0
  87. package/dist/connectors/core/base-connector.js +3 -0
  88. package/dist/connectors/core/base-connector.js.map +1 -0
  89. package/dist/connectors/core/connector-registry.d.ts +130 -0
  90. package/dist/connectors/core/connector-registry.d.ts.map +1 -0
  91. package/dist/connectors/core/connector-registry.js +357 -0
  92. package/dist/connectors/core/connector-registry.js.map +1 -0
  93. package/dist/connectors/core/credentials.d.ts +104 -0
  94. package/dist/connectors/core/credentials.d.ts.map +1 -0
  95. package/dist/connectors/core/credentials.js +67 -0
  96. package/dist/connectors/core/credentials.js.map +1 -0
  97. package/dist/connectors/core/index.d.ts +7 -0
  98. package/dist/connectors/core/index.d.ts.map +1 -0
  99. package/dist/connectors/core/index.js +5 -0
  100. package/dist/connectors/core/index.js.map +1 -0
  101. package/dist/engine/available-context.d.ts +3 -4
  102. package/dist/engine/available-context.d.ts.map +1 -1
  103. package/dist/engine/available-context.js +17 -13
  104. package/dist/engine/available-context.js.map +1 -1
  105. package/dist/engine/config-validator.d.ts +13 -5
  106. package/dist/engine/config-validator.d.ts.map +1 -1
  107. package/dist/engine/config-validator.js +89 -11
  108. package/dist/engine/config-validator.js.map +1 -1
  109. package/dist/engine/credential-resolver.d.ts +42 -0
  110. package/dist/engine/credential-resolver.d.ts.map +1 -0
  111. package/dist/engine/credential-resolver.js +63 -0
  112. package/dist/engine/credential-resolver.js.map +1 -0
  113. package/dist/engine/workflow-executor.d.ts +4 -5
  114. package/dist/engine/workflow-executor.d.ts.map +1 -1
  115. package/dist/engine/workflow-executor.js +16 -38
  116. package/dist/engine/workflow-executor.js.map +1 -1
  117. package/dist/index.d.ts +43 -28
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +30 -15
  120. package/dist/index.js.map +1 -1
  121. package/dist/ingest/body.d.ts +18 -0
  122. package/dist/ingest/body.d.ts.map +1 -0
  123. package/dist/ingest/body.js +47 -0
  124. package/dist/ingest/body.js.map +1 -0
  125. package/dist/ingest/filter.d.ts +11 -0
  126. package/dist/ingest/filter.d.ts.map +1 -0
  127. package/dist/ingest/filter.js +23 -0
  128. package/dist/ingest/filter.js.map +1 -0
  129. package/dist/ingest/headers.d.ts +3 -0
  130. package/dist/ingest/headers.d.ts.map +1 -0
  131. package/dist/ingest/headers.js +11 -0
  132. package/dist/ingest/headers.js.map +1 -0
  133. package/dist/ingest/types.d.ts +50 -0
  134. package/dist/ingest/types.d.ts.map +1 -0
  135. package/dist/ingest/types.js +9 -0
  136. package/dist/ingest/types.js.map +1 -0
  137. package/dist/persistence/in-memory-adapter.d.ts +4 -8
  138. package/dist/persistence/in-memory-adapter.d.ts.map +1 -1
  139. package/dist/persistence/in-memory-adapter.js +8 -25
  140. package/dist/persistence/in-memory-adapter.js.map +1 -1
  141. package/dist/persistence/types.d.ts +5 -19
  142. package/dist/persistence/types.d.ts.map +1 -1
  143. package/dist/router/types.d.ts +31 -3
  144. package/dist/router/types.d.ts.map +1 -1
  145. package/dist/router/workflow-router.d.ts +4 -3
  146. package/dist/router/workflow-router.d.ts.map +1 -1
  147. package/dist/router/workflow-router.js +66 -40
  148. package/dist/router/workflow-router.js.map +1 -1
  149. package/dist/runtime/types.d.ts +6 -4
  150. package/dist/runtime/types.d.ts.map +1 -1
  151. package/dist/runtime/workflow-runtime.d.ts +43 -37
  152. package/dist/runtime/workflow-runtime.d.ts.map +1 -1
  153. package/dist/runtime/workflow-runtime.js +158 -133
  154. package/dist/runtime/workflow-runtime.js.map +1 -1
  155. package/dist/steps/base-step.d.ts +23 -0
  156. package/dist/steps/base-step.d.ts.map +1 -1
  157. package/dist/steps/base-step.js +22 -0
  158. package/dist/steps/base-step.js.map +1 -1
  159. package/dist/steps/step-descriptor.d.ts +52 -0
  160. package/dist/steps/step-descriptor.d.ts.map +1 -0
  161. package/dist/steps/step-descriptor.js +32 -0
  162. package/dist/steps/step-descriptor.js.map +1 -0
  163. package/dist/testing/authz-conformance.d.ts.map +1 -1
  164. package/dist/testing/authz-conformance.js +6 -7
  165. package/dist/testing/authz-conformance.js.map +1 -1
  166. package/dist/testing/index.d.ts +1 -0
  167. package/dist/testing/index.d.ts.map +1 -1
  168. package/dist/testing/index.js +1 -0
  169. package/dist/testing/index.js.map +1 -1
  170. package/dist/testing/mock-step-context.d.ts +1 -0
  171. package/dist/testing/mock-step-context.d.ts.map +1 -1
  172. package/dist/testing/mock-step-context.js +1 -0
  173. package/dist/testing/mock-step-context.js.map +1 -1
  174. package/dist/testing/test-connector.d.ts +40 -0
  175. package/dist/testing/test-connector.d.ts.map +1 -0
  176. package/dist/testing/test-connector.js +39 -0
  177. package/dist/testing/test-connector.js.map +1 -0
  178. package/dist/triggers/api-trigger.d.ts +15 -0
  179. package/dist/triggers/api-trigger.d.ts.map +1 -0
  180. package/dist/triggers/api-trigger.js +14 -0
  181. package/dist/triggers/api-trigger.js.map +1 -0
  182. package/dist/triggers/base-trigger.d.ts +29 -0
  183. package/dist/triggers/base-trigger.d.ts.map +1 -1
  184. package/dist/triggers/base-trigger.js +16 -0
  185. package/dist/triggers/base-trigger.js.map +1 -1
  186. package/dist/triggers/trigger-descriptor.d.ts +42 -0
  187. package/dist/triggers/trigger-descriptor.d.ts.map +1 -0
  188. package/dist/triggers/trigger-descriptor.js +29 -0
  189. package/dist/triggers/trigger-descriptor.js.map +1 -0
  190. package/dist/triggers/webhook-trigger.d.ts +31 -38
  191. package/dist/triggers/webhook-trigger.d.ts.map +1 -1
  192. package/dist/triggers/webhook-trigger.js +19 -6
  193. package/dist/triggers/webhook-trigger.js.map +1 -1
  194. package/dist/types/known-types.d.ts +0 -1
  195. package/dist/types/known-types.d.ts.map +1 -1
  196. package/dist/types/known-types.js +0 -1
  197. package/dist/types/known-types.js.map +1 -1
  198. package/dist/types/validation.d.ts +3 -1
  199. package/dist/types/validation.d.ts.map +1 -1
  200. package/dist/types/validation.js +2 -0
  201. package/dist/types/validation.js.map +1 -1
  202. package/dist/types/workflow-config.d.ts +23 -0
  203. package/dist/types/workflow-config.d.ts.map +1 -1
  204. package/dist/types/workflow-config.js +8 -0
  205. package/dist/types/workflow-config.js.map +1 -1
  206. package/dist/util/credential-slot-schema.d.ts +20 -0
  207. package/dist/util/credential-slot-schema.d.ts.map +1 -0
  208. package/dist/util/credential-slot-schema.js +30 -0
  209. package/dist/util/credential-slot-schema.js.map +1 -0
  210. package/package.json +1 -1
@@ -0,0 +1,73 @@
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, cloneScope } from '../../../steps/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
+ // Each iteration runs in its own scope, keyed by node-path frame
54
+ // `loop_y:body#<i>`. The iteration index isolates body-step records and
55
+ // is the identity that lets a WAIT in iteration N resume the right
56
+ // iteration. `__loop` exposes the current item to body steps within the
57
+ // iteration scope (nested loops nest their own `__loop` in child scopes).
58
+ const iterScope = cloneScope(ctx.workflow);
59
+ iterScope.steps['__loop'] = {
60
+ type: 'LOOP',
61
+ output: {
62
+ currentItem: item,
63
+ currentIndex: i,
64
+ totalItems: items.length,
65
+ },
66
+ };
67
+ await ctx.walkBranch(config.body, iterScope, 'body', i);
68
+ results.push(item);
69
+ }
70
+ return { results, count: results.length };
71
+ }
72
+ }
73
+ //# sourceMappingURL=loop.step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.step.js","sourceRoot":"","sources":["../../../../src/connectors/builtin/steps/loop.step.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,iBAAiB;AAEjB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+FAA+F,CAAC;IACnI,IAAI,EAAE,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,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IACnI,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;CACpH,CAAC,CAAC;AAWH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAEH,eAAe;AAEf,MAAM,OAAO,QAAS,SAAQ,mBAG7B;IACmB,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;IAC5B,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,uDAAuD,CAAC;IACtE,YAAY,GAAG,oBAAoB,CAAC;IACpC,YAAY,GAAG,oBAAoB,CAAC;IACpC,QAAQ,GAAG,SAAkB,CAAC;IAC9B,WAAW,GAAG,SAAkB,CAAC;IACjC,IAAI,GAAG,QAAQ,CAAC;IAChB,eAAe,GAAG;QAClC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE;KAC/B,CAAC;IAEF,WAAW,CAClB,MAA+B;QAE/B,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAyB;SACrD,CAAC;IACJ,CAAC;IAEQ,KAAK,CAAC,OAAO,CACpB,MAAsB,EACtB,GAAgC;QAEhC,wCAAwC;QACxC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,gBAAgB,MAAM,CAAC,MAAM,sCAAsC,OAAO,WAAW,GAAG,CACzF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,WAAwB,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAc,EAAE,CAAC;QAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,iEAAiE;YACjE,wEAAwE;YACxE,mEAAmE;YACnE,wEAAwE;YACxE,0EAA0E;YAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,SAAS,CAAC,KAAiC,CAAC,QAAQ,CAAC,GAAG;gBACvD,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE;oBACN,WAAW,EAAE,IAAI;oBACjB,YAAY,EAAE,CAAC;oBACf,UAAU,EAAE,KAAK,CAAC,MAAM;iBACzB;aACF,CAAC;YAEF,MAAM,GAAG,CAAC,UAAU,CAClB,MAAM,CAAC,IAAuC,EAC9C,SAAS,EACT,MAAM,EACN,CAAC,CACF,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * MAP step — iterate an array and run one `body` per item CONCURRENTLY.
3
+ *
4
+ * Like LOOP (resolves a source array, single `body`) but every item runs in
5
+ * parallel rather than sequentially — for cases where N dynamically-discovered
6
+ * items each need the same processing (e.g. validate the PAN of each of N
7
+ * owners). Each iteration runs in its own scope keyed by the node-path frame
8
+ * `map_x:item#<i>`, so a WAIT inside an iteration parks that iteration's own
9
+ * gate; multiple iterations can pause at once and resume independently — the
10
+ * same durable model PARALLEL uses (the executor's node-path records ARE the
11
+ * state; no saved state lives here).
12
+ *
13
+ * Output: `{ count, items: [{ index, item, steps }] }` — per-iteration step
14
+ * outputs, index-aligned with the source array (mirrors PARALLEL's
15
+ * `branches.<key>.steps`). Reference downstream as
16
+ * `…output.items.<i>.steps.<stepId>.output.<field>`.
17
+ */
18
+ import { z } from 'zod';
19
+ import { BaseControlFlowStep } from '../../../steps/base-step.js';
20
+ import type { BranchStepOutputs, ControlFlowExecutionContext } from '../../../steps/base-step.js';
21
+ import { BuiltinStepType } from '../../../types/known-types.js';
22
+ import type { WorkflowStepConfig } from '../../../types/workflow-config.js';
23
+ export declare const MapStepConfigSchema: z.ZodObject<{
24
+ source: z.ZodString;
25
+ body: z.ZodArray<z.ZodObject<{
26
+ id: z.ZodString;
27
+ type: z.ZodString;
28
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
29
+ id: z.ZodString;
30
+ type: z.ZodString;
31
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
32
+ id: z.ZodString;
33
+ type: z.ZodString;
34
+ }, z.ZodTypeAny, "passthrough">>, "many">;
35
+ }, "strip", z.ZodTypeAny, {
36
+ body: z.objectOutputType<{
37
+ id: z.ZodString;
38
+ type: z.ZodString;
39
+ }, z.ZodTypeAny, "passthrough">[];
40
+ source: string;
41
+ }, {
42
+ body: z.objectInputType<{
43
+ id: z.ZodString;
44
+ type: z.ZodString;
45
+ }, z.ZodTypeAny, "passthrough">[];
46
+ source: string;
47
+ }>;
48
+ export type MapStepConfig = z.infer<typeof MapStepConfigSchema>;
49
+ /** One iteration's result — its top-level step outputs (or an error). */
50
+ export interface MapItemResult {
51
+ index: number;
52
+ item: unknown;
53
+ steps?: BranchStepOutputs;
54
+ error?: string;
55
+ }
56
+ export interface MapStepOutput extends Record<string, unknown> {
57
+ count: number;
58
+ items: MapItemResult[];
59
+ }
60
+ export declare class MapStep extends BaseControlFlowStep<typeof MapStepConfigSchema, MapStepOutput> {
61
+ readonly type = BuiltinStepType.MAP;
62
+ readonly name = "Map";
63
+ readonly description = "Map over an array, running steps for each item concurrently";
64
+ readonly configSchema: z.ZodObject<{
65
+ source: z.ZodString;
66
+ body: z.ZodArray<z.ZodObject<{
67
+ id: z.ZodString;
68
+ type: z.ZodString;
69
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
70
+ id: z.ZodString;
71
+ type: z.ZodString;
72
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
73
+ id: z.ZodString;
74
+ type: z.ZodString;
75
+ }, z.ZodTypeAny, "passthrough">>, "many">;
76
+ }, "strip", z.ZodTypeAny, {
77
+ body: z.objectOutputType<{
78
+ id: z.ZodString;
79
+ type: z.ZodString;
80
+ }, z.ZodTypeAny, "passthrough">[];
81
+ source: string;
82
+ }, {
83
+ body: z.objectInputType<{
84
+ id: z.ZodString;
85
+ type: z.ZodString;
86
+ }, z.ZodTypeAny, "passthrough">[];
87
+ source: string;
88
+ }>;
89
+ readonly outputSchema: z.ZodObject<{
90
+ count: z.ZodNumber;
91
+ items: z.ZodArray<z.ZodObject<{
92
+ index: z.ZodNumber;
93
+ item: z.ZodUnknown;
94
+ steps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
95
+ output: z.ZodRecord<z.ZodString, z.ZodUnknown>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ output: Record<string, unknown>;
98
+ }, {
99
+ output: Record<string, unknown>;
100
+ }>>>;
101
+ error: z.ZodOptional<z.ZodString>;
102
+ }, "strip", z.ZodTypeAny, {
103
+ index: number;
104
+ steps?: Record<string, {
105
+ output: Record<string, unknown>;
106
+ }> | undefined;
107
+ error?: string | undefined;
108
+ item?: unknown;
109
+ }, {
110
+ index: number;
111
+ steps?: Record<string, {
112
+ output: Record<string, unknown>;
113
+ }> | undefined;
114
+ error?: string | undefined;
115
+ item?: unknown;
116
+ }>, "many">;
117
+ }, "strip", z.ZodTypeAny, {
118
+ items: {
119
+ index: number;
120
+ steps?: Record<string, {
121
+ output: Record<string, unknown>;
122
+ }> | undefined;
123
+ error?: string | undefined;
124
+ item?: unknown;
125
+ }[];
126
+ count: number;
127
+ }, {
128
+ items: {
129
+ index: number;
130
+ steps?: Record<string, {
131
+ output: Record<string, unknown>;
132
+ }> | undefined;
133
+ error?: string | undefined;
134
+ item?: unknown;
135
+ }[];
136
+ count: number;
137
+ }>;
138
+ readonly category: "control";
139
+ readonly branchModel: "map";
140
+ readonly icon = "layers";
141
+ readonly declaredOutputs: readonly [{
142
+ readonly key: "body";
143
+ readonly label: "For each item";
144
+ }];
145
+ getBranches(config: Record<string, unknown>): Record<string, WorkflowStepConfig[]>;
146
+ execute(config: MapStepConfig, ctx: ControlFlowExecutionContext): Promise<MapStepOutput>;
147
+ }
148
+ //# sourceMappingURL=map.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.step.d.ts","sourceRoot":"","sources":["../../../../src/connectors/builtin/steps/map.step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAkC,MAAM,6BAA6B,CAAC;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAM5E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAgBD,qBAAa,OAAQ,SAAQ,mBAAmB,CAC9C,OAAO,mBAAmB,EAC1B,aAAa,CACd;IACC,SAAkB,IAAI,uBAAuB;IAC7C,SAAkB,IAAI,SAAS;IAC/B,SAAkB,WAAW,iEAAiE;IAC9F,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;OAAuB;IACrD,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAuB;IACrD,SAAkB,QAAQ,EAAG,SAAS,CAAU;IAChD,SAAkB,WAAW,EAAG,KAAK,CAAU;IAC/C,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,aAAa,EACrB,GAAG,EAAE,2BAA2B,GAC/B,OAAO,CAAC,aAAa,CAAC;CAoE1B"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * MAP step — iterate an array and run one `body` per item CONCURRENTLY.
3
+ *
4
+ * Like LOOP (resolves a source array, single `body`) but every item runs in
5
+ * parallel rather than sequentially — for cases where N dynamically-discovered
6
+ * items each need the same processing (e.g. validate the PAN of each of N
7
+ * owners). Each iteration runs in its own scope keyed by the node-path frame
8
+ * `map_x:item#<i>`, so a WAIT inside an iteration parks that iteration's own
9
+ * gate; multiple iterations can pause at once and resume independently — the
10
+ * same durable model PARALLEL uses (the executor's node-path records ARE the
11
+ * state; no saved state lives here).
12
+ *
13
+ * Output: `{ count, items: [{ index, item, steps }] }` — per-iteration step
14
+ * outputs, index-aligned with the source array (mirrors PARALLEL's
15
+ * `branches.<key>.steps`). Reference downstream as
16
+ * `…output.items.<i>.steps.<stepId>.output.<field>`.
17
+ */
18
+ import { z } from 'zod';
19
+ import { BaseControlFlowStep, cloneScope, collectBranchSteps } from '../../../steps/base-step.js';
20
+ import { BuiltinStepType } from '../../../types/known-types.js';
21
+ import { resolvePath } from '../../../engine/variable-resolver.js';
22
+ import { PauseStep } from '../../../engine/pause-step.js';
23
+ // ─── Config ───
24
+ export const MapStepConfigSchema = z.object({
25
+ source: z.string().min(1).describe('Path to the array to map over (e.g. steps.extract.output.owners). Supports {{variable}} refs'),
26
+ body: z.array(z.object({ id: z.string(), type: z.string() }).passthrough()).describe('Steps to execute for each item — all items run concurrently'),
27
+ });
28
+ const MapStepOutputSchema = z.object({
29
+ count: z.number(),
30
+ items: z.array(z.object({
31
+ index: z.number(),
32
+ item: z.unknown(),
33
+ steps: z.record(z.object({ output: z.record(z.unknown()) })).optional(),
34
+ error: z.string().optional(),
35
+ })),
36
+ });
37
+ // ─── Step ───
38
+ export class MapStep extends BaseControlFlowStep {
39
+ type = BuiltinStepType.MAP;
40
+ name = 'Map';
41
+ description = 'Map over an array, running steps for each item concurrently';
42
+ configSchema = MapStepConfigSchema;
43
+ outputSchema = MapStepOutputSchema;
44
+ category = 'control';
45
+ branchModel = 'map';
46
+ icon = 'layers';
47
+ declaredOutputs = [
48
+ { key: 'body', label: 'For each item' },
49
+ ];
50
+ getBranches(config) {
51
+ return {
52
+ body: (config['body'] ?? []),
53
+ };
54
+ }
55
+ async execute(config, ctx) {
56
+ const sourceValue = resolvePath(ctx.workflow, config.source);
57
+ if (!Array.isArray(sourceValue)) {
58
+ throw new Error(`MAP source "${config.source}" did not resolve to an array (got ${typeof sourceValue})`);
59
+ }
60
+ const items = sourceValue;
61
+ const body = config.body;
62
+ // Run every iteration concurrently, each in its own scope keyed by node-path
63
+ // `map_x:item#<i>`. A paused iteration throws PauseStep; on resume the MAP
64
+ // re-enters and re-walks all iterations — completed ones memo-skip from
65
+ // their records, the parked one(s) resume. No saved state lives here.
66
+ const settled = await Promise.allSettled(items.map(async (item, i) => {
67
+ const iterScope = cloneScope(ctx.workflow);
68
+ iterScope.steps['__map'] = {
69
+ type: 'MAP',
70
+ output: { currentItem: item, currentIndex: i, totalItems: items.length },
71
+ };
72
+ await ctx.walkBranch(body, iterScope, 'item', i);
73
+ return { index: i, item, steps: collectBranchSteps(body, iterScope) };
74
+ }));
75
+ const results = [];
76
+ let pausedCount = 0;
77
+ let firstExternalRef;
78
+ for (let i = 0; i < settled.length; i++) {
79
+ const entry = settled[i];
80
+ if (entry.status === 'fulfilled') {
81
+ results.push(entry.value);
82
+ }
83
+ else if (PauseStep.is(entry.reason)) {
84
+ pausedCount++;
85
+ const pe = entry.reason;
86
+ if (firstExternalRef === undefined && pe.externalRef !== undefined) {
87
+ firstExternalRef = pe.externalRef;
88
+ }
89
+ }
90
+ else {
91
+ results.push({
92
+ index: i,
93
+ item: items[i],
94
+ error: entry.reason instanceof Error
95
+ ? entry.reason.message
96
+ : String(entry.reason),
97
+ });
98
+ }
99
+ }
100
+ // Any paused iteration parks the whole MAP; the executor records it as
101
+ // EXTERNAL_WAIT and re-enters on resume. Completed/failed iterations are
102
+ // durable in their per-item records — this throw discards the partial list.
103
+ if (pausedCount > 0) {
104
+ const reason = pausedCount === 1 ? 'item awaiting resume' : `${String(pausedCount)} items awaiting resume`;
105
+ throw new PauseStep(reason, firstExternalRef !== undefined ? { externalRef: firstExternalRef } : undefined);
106
+ }
107
+ results.sort((a, b) => a.index - b.index);
108
+ return { count: items.length, items: results };
109
+ }
110
+ }
111
+ //# sourceMappingURL=map.step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.step.js","sourceRoot":"","sources":["../../../../src/connectors/builtin/steps/map.step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
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
+ * Each branch runs in its own scope and persists its steps under node-path keys
14
+ * (`parallel_x:<branch>#0/<stepId>`). When a branch parks, its `walkBranch`
15
+ * throws `PauseStep`; PARALLEL collects which branches paused and, if any did,
16
+ * throws a single `PauseStep` so the whole step parks. There is no internal
17
+ * saved state — the per-branch step records ARE the durable state. On resume
18
+ * the executor re-enters PARALLEL, re-runs every branch via `walkBranch`:
19
+ * completed branch steps memo-skip from their records, the parked one(s) resume
20
+ * from theirs. Multiple branches can be paused simultaneously; each `resume()`
21
+ * targets one branch's gate by node-path. When the last paused branch
22
+ * completes, PARALLEL merges everything and returns.
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 '../../../steps/base-step.js';
34
+ import type { ControlFlowExecutionContext, BranchStepOutputs } from '../../../steps/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
+ /**
64
+ * Per-branch result — the branch's TOP-LEVEL steps map (keyed by step id, each
65
+ * `{ output }`, mirroring the main context's `steps.<id>.output`), or a failure.
66
+ * Referenced as `…output.branches.<key>.steps.<id>.output.<field>`.
67
+ */
68
+ export type ParallelSettledBranchResult = {
69
+ status: 'fulfilled';
70
+ steps: BranchStepOutputs;
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
+ /** Which branch won. */
82
+ branch: string;
83
+ /** Only the winner is populated; uniform `branches` shape with all control flow. */
84
+ branches: Record<string, ParallelSettledBranchResult>;
85
+ }
86
+ export type ParallelStepOutput = ParallelAllSettledOutput | ParallelRaceOutput;
87
+ export declare class ParallelStep extends BaseControlFlowStep<typeof ParallelStepConfigSchema, ParallelStepOutput> {
88
+ readonly type = BuiltinStepType.PARALLEL;
89
+ readonly name = "Parallel";
90
+ readonly description = "Run multiple branches concurrently and collect results";
91
+ readonly configSchema: z.ZodObject<{
92
+ branches: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
93
+ id: z.ZodString;
94
+ type: z.ZodString;
95
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
96
+ id: z.ZodString;
97
+ type: z.ZodString;
98
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
99
+ id: z.ZodString;
100
+ type: z.ZodString;
101
+ }, z.ZodTypeAny, "passthrough">>, "many">>;
102
+ merge: z.ZodDefault<z.ZodEnum<["allSettled", "race"]>>;
103
+ }, "strip", z.ZodTypeAny, {
104
+ branches: Record<string, z.objectOutputType<{
105
+ id: z.ZodString;
106
+ type: z.ZodString;
107
+ }, z.ZodTypeAny, "passthrough">[]>;
108
+ merge: "allSettled" | "race";
109
+ }, {
110
+ branches: Record<string, z.objectInputType<{
111
+ id: z.ZodString;
112
+ type: z.ZodString;
113
+ }, z.ZodTypeAny, "passthrough">[]>;
114
+ merge?: "allSettled" | "race" | undefined;
115
+ }>;
116
+ readonly outputSchema: z.ZodDiscriminatedUnion<"mode", [z.ZodObject<{
117
+ mode: z.ZodLiteral<"allSettled">;
118
+ branches: z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<"status", [z.ZodObject<{
119
+ status: z.ZodLiteral<"fulfilled">;
120
+ steps: z.ZodRecord<z.ZodString, z.ZodObject<{
121
+ output: z.ZodRecord<z.ZodString, z.ZodUnknown>;
122
+ }, "strip", z.ZodTypeAny, {
123
+ output: Record<string, unknown>;
124
+ }, {
125
+ output: Record<string, unknown>;
126
+ }>>;
127
+ }, "strip", z.ZodTypeAny, {
128
+ status: "fulfilled";
129
+ steps: Record<string, {
130
+ output: Record<string, unknown>;
131
+ }>;
132
+ }, {
133
+ status: "fulfilled";
134
+ steps: Record<string, {
135
+ output: Record<string, unknown>;
136
+ }>;
137
+ }>, z.ZodObject<{
138
+ status: z.ZodLiteral<"rejected">;
139
+ reason: z.ZodString;
140
+ }, "strip", z.ZodTypeAny, {
141
+ status: "rejected";
142
+ reason: string;
143
+ }, {
144
+ status: "rejected";
145
+ reason: string;
146
+ }>]>>;
147
+ }, "strip", z.ZodTypeAny, {
148
+ branches: Record<string, {
149
+ status: "fulfilled";
150
+ steps: Record<string, {
151
+ output: Record<string, unknown>;
152
+ }>;
153
+ } | {
154
+ status: "rejected";
155
+ reason: string;
156
+ }>;
157
+ mode: "allSettled";
158
+ }, {
159
+ branches: Record<string, {
160
+ status: "fulfilled";
161
+ steps: Record<string, {
162
+ output: Record<string, unknown>;
163
+ }>;
164
+ } | {
165
+ status: "rejected";
166
+ reason: string;
167
+ }>;
168
+ mode: "allSettled";
169
+ }>, z.ZodObject<{
170
+ mode: z.ZodLiteral<"race">;
171
+ branch: z.ZodString;
172
+ branches: z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<"status", [z.ZodObject<{
173
+ status: z.ZodLiteral<"fulfilled">;
174
+ steps: z.ZodRecord<z.ZodString, z.ZodObject<{
175
+ output: z.ZodRecord<z.ZodString, z.ZodUnknown>;
176
+ }, "strip", z.ZodTypeAny, {
177
+ output: Record<string, unknown>;
178
+ }, {
179
+ output: Record<string, unknown>;
180
+ }>>;
181
+ }, "strip", z.ZodTypeAny, {
182
+ status: "fulfilled";
183
+ steps: Record<string, {
184
+ output: Record<string, unknown>;
185
+ }>;
186
+ }, {
187
+ status: "fulfilled";
188
+ steps: Record<string, {
189
+ output: Record<string, unknown>;
190
+ }>;
191
+ }>, z.ZodObject<{
192
+ status: z.ZodLiteral<"rejected">;
193
+ reason: z.ZodString;
194
+ }, "strip", z.ZodTypeAny, {
195
+ status: "rejected";
196
+ reason: string;
197
+ }, {
198
+ status: "rejected";
199
+ reason: string;
200
+ }>]>>;
201
+ }, "strip", z.ZodTypeAny, {
202
+ branch: string;
203
+ branches: Record<string, {
204
+ status: "fulfilled";
205
+ steps: Record<string, {
206
+ output: Record<string, unknown>;
207
+ }>;
208
+ } | {
209
+ status: "rejected";
210
+ reason: string;
211
+ }>;
212
+ mode: "race";
213
+ }, {
214
+ branch: string;
215
+ branches: Record<string, {
216
+ status: "fulfilled";
217
+ steps: Record<string, {
218
+ output: Record<string, unknown>;
219
+ }>;
220
+ } | {
221
+ status: "rejected";
222
+ reason: string;
223
+ }>;
224
+ mode: "race";
225
+ }>]>;
226
+ readonly category: "control";
227
+ readonly icon = "columns";
228
+ /**
229
+ * Declared outputs are dynamic — one per branch key.
230
+ * Since branch keys are user-defined, we return empty here and let
231
+ * `getBranches()` handle discovery for validation.
232
+ */
233
+ readonly declaredOutputs: readonly [];
234
+ getBranches(config: Record<string, unknown>): Record<string, WorkflowStepConfig[]>;
235
+ /**
236
+ * Collapse the static `mode` discriminated union to the *configured* mode, so
237
+ * the variable picker sees a concrete object (not an `anyOf`) it can drill.
238
+ * Only the mode-dependent meta is declared here; the harness
239
+ * (`resolveOutputJsonSchemaOf`) splices the typed `branches` from `getBranches`.
240
+ */
241
+ resolveOutputJsonSchema(config: Record<string, unknown>): Record<string, unknown>;
242
+ execute(config: ParallelStepConfig, ctx: ControlFlowExecutionContext): Promise<ParallelStepOutput>;
243
+ private executeAllSettled;
244
+ private executeRace;
245
+ }
246
+ //# sourceMappingURL=parallel.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.step.d.ts","sourceRoot":"","sources":["../../../../src/connectors/builtin/steps/parallel.step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAkC,MAAM,6BAA6B,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAK5E,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;EAMnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAI1E;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GACnC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GACjD;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,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CACvD;AAED,MAAM,MAAM,kBAAkB,GAC1B,wBAAwB,GACxB,kBAAkB,CAAC;AA+BvB,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;IAYvC;;;;;OAKG;IACM,uBAAuB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOX,OAAO,CACpB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,2BAA2B,GAC/B,OAAO,CAAC,kBAAkB,CAAC;YAgBhB,iBAAiB;YAgEjB,WAAW;CAyB1B"}