@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,29 @@
1
+ /**
2
+ * getAvailableContext — computes the variable context available at a given step.
3
+ *
4
+ * Pure function: takes the workflow config + registries, returns a map of
5
+ * JSON Schema objects keyed by dotted path (e.g. "trigger", "steps.fetch_data.output").
6
+ * The frontend's variable picker uses this to show what refs are available at each step.
7
+ */
8
+ import type { WorkflowConfig } from '../types/workflow-config.js';
9
+ import type { StepRegistry } from '../steps/step-registry.js';
10
+ import type { TriggerRegistry } from '../triggers/trigger-registry.js';
11
+ export interface AvailableContext {
12
+ /**
13
+ * Map of context path → JSON Schema.
14
+ *
15
+ * Keys use the same dotted-path convention as variable refs:
16
+ * - `"trigger"` — the trigger's output schema
17
+ * - `"steps.<stepId>.output"` — a preceding step's output schema
18
+ */
19
+ [path: string]: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Compute the available variable context at a given step in the workflow.
23
+ *
24
+ * Returns a map of path → JSON Schema for the trigger output and all
25
+ * preceding step outputs. Returns `null` if `atStepId` is not found
26
+ * anywhere in the step tree.
27
+ */
28
+ export declare function getAvailableContext(config: WorkflowConfig, atStepId: string, steps: StepRegistry, triggers: TriggerRegistry): AvailableContext | null;
29
+ //# sourceMappingURL=available-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"available-context.d.ts","sourceRoot":"","sources":["../../src/engine/available-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,GAAG,IAAI,CAkBzB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * getAvailableContext — computes the variable context available at a given step.
3
+ *
4
+ * Pure function: takes the workflow config + registries, returns a map of
5
+ * JSON Schema objects keyed by dotted path (e.g. "trigger", "steps.fetch_data.output").
6
+ * The frontend's variable picker uses this to show what refs are available at each step.
7
+ */
8
+ import { BaseControlFlowStep } from '../steps/base-step.js';
9
+ import { zodToJsonSchemaRecord } from '../util/schema-convert.js';
10
+ /**
11
+ * Compute the available variable context at a given step in the workflow.
12
+ *
13
+ * Returns a map of path → JSON Schema for the trigger output and all
14
+ * preceding step outputs. Returns `null` if `atStepId` is not found
15
+ * anywhere in the step tree.
16
+ */
17
+ export function getAvailableContext(config, atStepId, steps, triggers) {
18
+ const ctx = {};
19
+ // Add trigger output if registered. Use the trigger's per-instance
20
+ // `resolveOutputJsonSchema(config)` when available (lets webhook /
21
+ // manual triggers type headers/body/query from author-supplied schemas);
22
+ // otherwise fall back to the static outputSchema.
23
+ if (config.trigger && triggers.has(config.trigger.type)) {
24
+ const triggerImpl = triggers.get(config.trigger.type);
25
+ ctx['trigger'] = triggerImpl.resolveOutputJsonSchema
26
+ ? triggerImpl.resolveOutputJsonSchema((config.trigger.config ?? {}))
27
+ : zodToJsonSchemaRecord(triggerImpl.outputSchema);
28
+ }
29
+ const found = walkForContext(config.steps, atStepId, ctx, steps);
30
+ return found ? ctx : null;
31
+ }
32
+ /**
33
+ * Walk steps in order. Returns true if `targetId` was found (meaning ctx is populated).
34
+ * Stops as soon as the target is found — no further steps are added.
35
+ */
36
+ function walkForContext(stepList, targetId, ctx, steps) {
37
+ for (const step of stepList) {
38
+ // If this is the target step, stop — don't include its own output
39
+ if (step.id === targetId) {
40
+ return true;
41
+ }
42
+ // Register this step's output schema if registered
43
+ if (steps.has(step.type)) {
44
+ const impl = steps.get(step.type);
45
+ ctx[`steps.${step.id}.output`] = impl.resolveOutputJsonSchema
46
+ ? impl.resolveOutputJsonSchema(step.config)
47
+ : zodToJsonSchemaRecord(impl.outputSchema);
48
+ // Recurse into control-flow branches
49
+ if (impl instanceof BaseControlFlowStep && impl.getBranches) {
50
+ const branches = impl.getBranches(step.config);
51
+ for (const branchSteps of Object.values(branches)) {
52
+ // Branch gets a snapshot of current context — steps inside a branch
53
+ // shouldn't leak to sibling branches
54
+ const branchCtx = { ...ctx };
55
+ if (walkForContext(branchSteps, targetId, branchCtx, steps)) {
56
+ // Found inside this branch — copy back accumulated context
57
+ Object.assign(ctx, branchCtx);
58
+ return true;
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ //# sourceMappingURL=available-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"available-context.js","sourceRoot":"","sources":["../../src/engine/available-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAalE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,QAAgB,EAChB,KAAmB,EACnB,QAAyB;IAEzB,MAAM,GAAG,GAAqB,EAAE,CAAC;IAEjC,mEAAmE;IACnE,mEAAmE;IACnE,yEAAyE;IACzE,kDAAkD;IAClD,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,GAAG,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC,uBAAuB;YAClD,CAAC,CAAC,WAAW,CAAC,uBAAuB,CACjC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAA4B,CACzD;YACH,CAAC,CAAC,qBAAqB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,QAA8B,EAC9B,QAAgB,EAChB,GAAqB,EACrB,KAAmB;IAEnB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,kEAAkE;QAClE,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mDAAmD;QACnD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,GAAG,CAAC,SAAS,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,uBAAuB;gBAC3D,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAiC,CAAC;gBACtE,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE7C,qCAAqC;YACrC,IAAI,IAAI,YAAY,mBAAmB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAC/B,IAAI,CAAC,MAAiC,CACvC,CAAC;gBACF,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAClD,oEAAoE;oBACpE,qCAAqC;oBACrC,MAAM,SAAS,GAAqB,EAAE,GAAG,GAAG,EAAE,CAAC;oBAC/C,IAAI,cAAc,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;wBAC5D,2DAA2D;wBAC3D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;wBAC9B,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Condition } from '../types/workflow-config.js';
2
+ import type { WorkflowContext } from '../types/context.js';
3
+ /**
4
+ * Evaluates a recursive Condition tree against a WorkflowContext.
5
+ *
6
+ * - Leaf: resolves the variable, applies the operator
7
+ * - `all`: short-circuit AND (all children must be true)
8
+ * - `any`: short-circuit OR (any child must be true)
9
+ */
10
+ export declare class ConditionEvaluator {
11
+ evaluate(condition: Condition, context: WorkflowContext): boolean;
12
+ }
13
+ //# sourceMappingURL=condition-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/engine/condition-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAwF3D;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO;CAoBlE"}
@@ -0,0 +1,92 @@
1
+ import { ConditionOperator } from '../types/operators.js';
2
+ import { extractRefPath } from '../util/variable-ref.js';
3
+ import { resolvePath } from './variable-resolver.js';
4
+ function looseEquals(a, b) {
5
+ if (a === b)
6
+ return true;
7
+ if (a === null || a === undefined)
8
+ return b === null || b === undefined;
9
+ if (b === null || b === undefined)
10
+ return false;
11
+ if (typeof a === 'number' && typeof b === 'string')
12
+ return a === Number(b);
13
+ if (typeof a === 'string' && typeof b === 'number')
14
+ return Number(a) === b;
15
+ if (typeof a === 'boolean' || typeof b === 'boolean')
16
+ return Number(a) === Number(b);
17
+ return false;
18
+ }
19
+ function applyOperator(operator, resolved, refValue) {
20
+ switch (operator) {
21
+ case ConditionOperator.EXISTS:
22
+ return resolved !== undefined && resolved !== null;
23
+ case ConditionOperator.EQ:
24
+ return looseEquals(resolved, refValue);
25
+ case ConditionOperator.NEQ:
26
+ return !looseEquals(resolved, refValue);
27
+ case ConditionOperator.CONTAINS:
28
+ if (typeof resolved === 'string' && typeof refValue === 'string') {
29
+ return resolved.includes(refValue);
30
+ }
31
+ if (Array.isArray(resolved))
32
+ return resolved.includes(refValue);
33
+ return false;
34
+ case ConditionOperator.GT:
35
+ return (resolved !== undefined &&
36
+ resolved !== null &&
37
+ resolved > refValue);
38
+ case ConditionOperator.GTE:
39
+ return (resolved !== undefined &&
40
+ resolved !== null &&
41
+ resolved >= refValue);
42
+ case ConditionOperator.LT:
43
+ return (resolved !== undefined &&
44
+ resolved !== null &&
45
+ resolved < refValue);
46
+ case ConditionOperator.LTE:
47
+ return (resolved !== undefined &&
48
+ resolved !== null &&
49
+ resolved <= refValue);
50
+ default:
51
+ throw new Error(`Unhandled ConditionOperator: ${String(operator)}`);
52
+ }
53
+ }
54
+ function resolveVariable(variable, context) {
55
+ const path = extractRefPath(variable);
56
+ if (!path)
57
+ return undefined;
58
+ return resolvePath(context, path);
59
+ }
60
+ function evaluateLeaf(leaf, context) {
61
+ return applyOperator(leaf.operator, resolveVariable(leaf.variable, context), leaf.value);
62
+ }
63
+ /**
64
+ * Evaluates a recursive Condition tree against a WorkflowContext.
65
+ *
66
+ * - Leaf: resolves the variable, applies the operator
67
+ * - `all`: short-circuit AND (all children must be true)
68
+ * - `any`: short-circuit OR (any child must be true)
69
+ */
70
+ export class ConditionEvaluator {
71
+ evaluate(condition, context) {
72
+ if ('variable' in condition && 'operator' in condition) {
73
+ return evaluateLeaf(condition, context);
74
+ }
75
+ if ('all' in condition) {
76
+ for (const child of condition.all) {
77
+ if (!this.evaluate(child, context))
78
+ return false;
79
+ }
80
+ return true;
81
+ }
82
+ if ('any' in condition) {
83
+ for (const child of condition.any) {
84
+ if (this.evaluate(child, context))
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+ throw new Error(`Unrecognised condition shape: ${JSON.stringify(condition)}`);
90
+ }
91
+ }
92
+ //# sourceMappingURL=condition-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-evaluator.js","sourceRoot":"","sources":["../../src/engine/condition-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { WorkflowConfig } from '../types/workflow-config.js';
2
+ import type { ValidationResult } from '../types/validation.js';
3
+ import type { TriggerRegistry } from '../triggers/trigger-registry.js';
4
+ import type { StepRegistry } from '../steps/step-registry.js';
5
+ /**
6
+ * Validates a complete WorkflowConfig against registered triggers and steps.
7
+ *
8
+ * Checks:
9
+ * 1. Trigger type is registered + config validates against trigger schema
10
+ * 2. Step types are registered + configs validate against step schemas
11
+ * 3. Variable references (`{{...}}`) are resolvable (not forward refs, path exists)
12
+ * 4. Type compatibility between ref source and consumer schema
13
+ * 5. Control-flow branches are recursively validated via `getBranches()`
14
+ */
15
+ export declare class ConfigValidator {
16
+ private readonly triggerRegistry;
17
+ private readonly stepRegistry;
18
+ constructor(triggerRegistry: TriggerRegistry, stepRegistry: StepRegistry);
19
+ validate(config: WorkflowConfig): ValidationResult;
20
+ private walkSteps;
21
+ private validateRefs;
22
+ private checkRef;
23
+ private getConsumerInnerSchema;
24
+ }
25
+ //# sourceMappingURL=config-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../src/engine/config-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAyI9D;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY;IAG7C,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB;IAqClD,OAAO,CAAC,SAAS;IA8EjB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,QAAQ;IAgFhB,OAAO,CAAC,sBAAsB;CAmB/B"}
@@ -0,0 +1,316 @@
1
+ import { z } from 'zod';
2
+ import { getVariableRefInnerSchema } from '../types/workflow-config.js';
3
+ import { ValidationIssueCode } from '../types/validation.js';
4
+ import { BaseControlFlowStep } from '../steps/base-step.js';
5
+ import { collectRefs } from '../util/variable-ref.js';
6
+ const FORBIDDEN_KEYS = new Set([
7
+ '__proto__',
8
+ 'constructor',
9
+ 'prototype',
10
+ ]);
11
+ // ─── Schema walking utilities ───
12
+ function walkSchemaPath(schema, segments) {
13
+ if (segments.some((s) => FORBIDDEN_KEYS.has(s)))
14
+ return null;
15
+ let current = schema;
16
+ for (const segment of segments) {
17
+ current = unwrapOptional(current);
18
+ if (current instanceof z.ZodObject) {
19
+ const next = current.shape[segment];
20
+ if (next) {
21
+ current = next;
22
+ }
23
+ else {
24
+ const def = current._def;
25
+ if (def.unknownKeys === 'passthrough') {
26
+ current = z.unknown();
27
+ }
28
+ else if (def.catchall && !(def.catchall instanceof z.ZodNever)) {
29
+ current = def.catchall;
30
+ }
31
+ else {
32
+ return null;
33
+ }
34
+ }
35
+ }
36
+ else if (current instanceof z.ZodArray) {
37
+ if (/^\d+$/.test(segment) || segment === '*') {
38
+ current = current._def.type;
39
+ }
40
+ else {
41
+ return null;
42
+ }
43
+ }
44
+ else if (current instanceof z.ZodRecord) {
45
+ current = current._def
46
+ .valueType;
47
+ }
48
+ else if (current instanceof z.ZodUnion) {
49
+ const options = current._def.options;
50
+ const walked = walkSchemaPath(options[0], [segment]);
51
+ if (!walked)
52
+ return null;
53
+ current = walked;
54
+ }
55
+ else if (current instanceof z.ZodLazy) {
56
+ const inner = current._def.getter();
57
+ const walked = walkSchemaPath(inner, [segment]);
58
+ if (!walked)
59
+ return null;
60
+ current = walked;
61
+ }
62
+ else {
63
+ return null;
64
+ }
65
+ }
66
+ return unwrapOptional(current);
67
+ }
68
+ function unwrapOptional(schema) {
69
+ let current = schema;
70
+ while (current instanceof z.ZodOptional ||
71
+ current instanceof z.ZodNullable ||
72
+ current instanceof z.ZodDefault) {
73
+ current = current._def.innerType;
74
+ }
75
+ return current;
76
+ }
77
+ // ─── Type compatibility ───
78
+ const SCALAR_LIKE_ZOD_TYPES = new Set([
79
+ 'ZodString',
80
+ 'ZodNumber',
81
+ 'ZodBigInt',
82
+ 'ZodBoolean',
83
+ 'ZodDate',
84
+ 'ZodEnum',
85
+ 'ZodNativeEnum',
86
+ 'ZodLiteral',
87
+ ]);
88
+ function isZodCompatible(upstream, consumer) {
89
+ if (consumer instanceof z.ZodUnknown || consumer instanceof z.ZodAny)
90
+ return true;
91
+ if (upstream instanceof z.ZodUnknown || upstream instanceof z.ZodAny)
92
+ return true;
93
+ const upType = upstream._def.typeName;
94
+ const conType = consumer._def.typeName;
95
+ if (upType === conType)
96
+ return true;
97
+ if (SCALAR_LIKE_ZOD_TYPES.has(upType) && SCALAR_LIKE_ZOD_TYPES.has(conType))
98
+ return true;
99
+ // Anything can be coerced to string in a template
100
+ if (conType === 'ZodString')
101
+ return true;
102
+ return false;
103
+ }
104
+ const ZOD_HUMAN_TYPE = {
105
+ ZodString: 'text',
106
+ ZodNumber: 'number',
107
+ ZodBigInt: 'number',
108
+ ZodBoolean: 'true/false',
109
+ ZodDate: 'date',
110
+ ZodArray: 'list',
111
+ ZodObject: 'object',
112
+ ZodEnum: 'option',
113
+ ZodNativeEnum: 'option',
114
+ ZodLiteral: 'fixed value',
115
+ ZodUnion: 'value',
116
+ ZodRecord: 'object',
117
+ };
118
+ function humanZodType(schema) {
119
+ const name = schema._def.typeName;
120
+ return ZOD_HUMAN_TYPE[name] ?? 'value';
121
+ }
122
+ // ─── ConfigValidator ───
123
+ /**
124
+ * Validates a complete WorkflowConfig against registered triggers and steps.
125
+ *
126
+ * Checks:
127
+ * 1. Trigger type is registered + config validates against trigger schema
128
+ * 2. Step types are registered + configs validate against step schemas
129
+ * 3. Variable references (`{{...}}`) are resolvable (not forward refs, path exists)
130
+ * 4. Type compatibility between ref source and consumer schema
131
+ * 5. Control-flow branches are recursively validated via `getBranches()`
132
+ */
133
+ export class ConfigValidator {
134
+ triggerRegistry;
135
+ stepRegistry;
136
+ constructor(triggerRegistry, stepRegistry) {
137
+ this.triggerRegistry = triggerRegistry;
138
+ this.stepRegistry = stepRegistry;
139
+ }
140
+ validate(config) {
141
+ const issues = [];
142
+ const outputSchemas = new Map();
143
+ // --- Trigger validation ---
144
+ if (config.trigger) {
145
+ if (!this.triggerRegistry.has(config.trigger.type)) {
146
+ issues.push({
147
+ path: 'trigger.type',
148
+ code: ValidationIssueCode.SHAPE,
149
+ message: `Unknown trigger type "${config.trigger.type}". Is it registered?`,
150
+ });
151
+ }
152
+ else {
153
+ const triggerImpl = this.triggerRegistry.get(config.trigger.type);
154
+ const result = triggerImpl.configSchema.safeParse(config.trigger.config);
155
+ if (!result.success) {
156
+ for (const issue of result.error.issues) {
157
+ issues.push({
158
+ path: `trigger.config.${issue.path.join('.')}`,
159
+ code: ValidationIssueCode.SHAPE,
160
+ message: issue.message,
161
+ });
162
+ }
163
+ }
164
+ outputSchemas.set('trigger', triggerImpl.outputSchema);
165
+ }
166
+ }
167
+ // --- Steps validation ---
168
+ const seenIds = new Set();
169
+ this.walkSteps(config.steps, 'steps', outputSchemas, issues, seenIds);
170
+ return { valid: issues.length === 0, issues };
171
+ }
172
+ walkSteps(steps, prefix, outputSchemas, issues, seenIds) {
173
+ for (let i = 0; i < steps.length; i++) {
174
+ const step = steps[i];
175
+ const stepPath = `${prefix}[${i}]`;
176
+ // Check for duplicate step IDs across the entire config tree
177
+ if (seenIds.has(step.id)) {
178
+ issues.push({
179
+ path: `${stepPath}.id`,
180
+ code: ValidationIssueCode.DUPLICATE_STEP_ID,
181
+ message: `Duplicate step ID "${step.id}". Step IDs must be unique across the entire workflow, including nested branches.`,
182
+ });
183
+ }
184
+ seenIds.add(step.id);
185
+ if (!this.stepRegistry.has(step.type)) {
186
+ issues.push({
187
+ path: `${stepPath}.type`,
188
+ code: ValidationIssueCode.SHAPE,
189
+ message: `Unknown step type "${step.type}". Is it registered?`,
190
+ });
191
+ continue;
192
+ }
193
+ const stepImpl = this.stepRegistry.get(step.type);
194
+ // Shape validation
195
+ const shapeResult = stepImpl.configSchema.safeParse(step.config);
196
+ if (!shapeResult.success) {
197
+ for (const issue of shapeResult.error.issues) {
198
+ issues.push({
199
+ path: `${stepPath}.config.${issue.path.join('.')}`,
200
+ code: ValidationIssueCode.SHAPE,
201
+ message: issue.message,
202
+ });
203
+ }
204
+ }
205
+ // Ref validation for action steps
206
+ this.validateRefs(step.config, `${stepPath}.config`, stepImpl.configSchema, outputSchemas, issues);
207
+ // Register this step's output schema
208
+ outputSchemas.set(`${step.id}.input`, stepImpl.configSchema);
209
+ outputSchemas.set(`${step.id}.output`, stepImpl.outputSchema);
210
+ // Control-flow branch discovery via getBranches()
211
+ if (stepImpl instanceof BaseControlFlowStep &&
212
+ stepImpl.getBranches) {
213
+ const branches = stepImpl.getBranches(step.config);
214
+ for (const [branchKey, branchSteps] of Object.entries(branches)) {
215
+ this.walkSteps(branchSteps, `${stepPath}.config.${branchKey}`, new Map(outputSchemas), issues, seenIds);
216
+ }
217
+ }
218
+ }
219
+ }
220
+ validateRefs(config, prefix, configSchema, outputSchemas, issues) {
221
+ for (const { refPath, location } of collectRefs(config, prefix)) {
222
+ const consumerInner = this.getConsumerInnerSchema(configSchema, location, prefix);
223
+ this.checkRef(`{{context.${refPath}}}`, location, outputSchemas, issues, consumerInner);
224
+ }
225
+ }
226
+ checkRef(refString, location, outputSchemas, issues, consumerInnerSchema) {
227
+ const inner = refString.match(/^\{\{(?:context\.)?([^}]+)\}\}$/);
228
+ if (!inner?.[1])
229
+ return;
230
+ const refPath = inner[1];
231
+ const segments = refPath.split('.');
232
+ const sourceKey = segments[0];
233
+ if (!sourceKey)
234
+ return;
235
+ let resolverKey;
236
+ let pathSegments;
237
+ if (sourceKey === 'trigger') {
238
+ resolverKey = 'trigger';
239
+ pathSegments = segments.slice(1);
240
+ }
241
+ else if (sourceKey === 'workflow') {
242
+ // workflow.id, workflow.metadata.x — not validatable against output schemas
243
+ return;
244
+ }
245
+ else if (sourceKey === 'steps') {
246
+ // Explicit: steps.stepId.output.field
247
+ const stepId = segments[1];
248
+ const role = segments[2];
249
+ if (!stepId)
250
+ return;
251
+ if (role === 'input' || role === 'output') {
252
+ resolverKey = `${stepId}.${role}`;
253
+ pathSegments = segments.slice(3);
254
+ }
255
+ else {
256
+ resolverKey = `${stepId}.output`;
257
+ pathSegments = segments.slice(2);
258
+ }
259
+ }
260
+ else {
261
+ // Shorthand: stepId.output.field or stepId.field
262
+ const role = segments[1];
263
+ if (role === 'input' || role === 'output') {
264
+ resolverKey = `${sourceKey}.${role}`;
265
+ pathSegments = segments.slice(2);
266
+ }
267
+ else {
268
+ resolverKey = `${sourceKey}.output`;
269
+ pathSegments = segments.slice(1);
270
+ }
271
+ }
272
+ if (!outputSchemas.has(resolverKey)) {
273
+ issues.push({
274
+ path: location,
275
+ code: ValidationIssueCode.FORWARD_REFERENCE,
276
+ message: `"${refString}" references "${sourceKey}" which is not yet available at this point in the workflow (forward reference, or unknown step / trigger ID).`,
277
+ });
278
+ return;
279
+ }
280
+ const sourceSchema = outputSchemas.get(resolverKey);
281
+ const leafSchema = walkSchemaPath(sourceSchema, pathSegments);
282
+ if (leafSchema === null) {
283
+ issues.push({
284
+ path: location,
285
+ code: ValidationIssueCode.UNKNOWN_REFERENCE,
286
+ message: `"${refString}" — path "${pathSegments.join('.')}" does not exist in the schema of "${resolverKey}".`,
287
+ });
288
+ return;
289
+ }
290
+ if (consumerInnerSchema !== null) {
291
+ if (!isZodCompatible(leafSchema, consumerInnerSchema)) {
292
+ issues.push({
293
+ path: location,
294
+ code: ValidationIssueCode.TYPE_MISMATCH,
295
+ message: `"${refString}" is a ${humanZodType(leafSchema)} but this field expects a ${humanZodType(consumerInnerSchema)}.`,
296
+ });
297
+ }
298
+ }
299
+ }
300
+ getConsumerInnerSchema(configSchema, location, prefix) {
301
+ const relative = location.startsWith(prefix + '.')
302
+ ? location.slice(prefix.length + 1)
303
+ : location.slice(prefix.length);
304
+ if (!relative)
305
+ return null;
306
+ const segments = relative
307
+ .replace(/\[(\d+)\]/g, '.$1')
308
+ .split('.')
309
+ .filter(Boolean);
310
+ const leafSchema = walkSchemaPath(configSchema, segments);
311
+ if (!leafSchema)
312
+ return null;
313
+ return getVariableRefInnerSchema(leafSchema);
314
+ }
315
+ }
316
+ //# sourceMappingURL=config-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../../src/engine/config-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { PausePathSegment } from '../types/pause-path.js';
2
+ /**
3
+ * Thrown by `ctx.pause()` to suspend workflow execution.
4
+ *
5
+ * The executor catches this, persists the context + state, and sets the
6
+ * execution status to EXTERNAL_WAIT. When the external event arrives, the
7
+ * executor resumes from the paused step by calling `onResume()`.
8
+ */
9
+ export declare class PauseStep extends Error {
10
+ readonly externalRef: string | undefined;
11
+ readonly statePatch: Record<string, unknown> | undefined;
12
+ /** @internal Used by executor to track nested pause position in branches. */
13
+ _pausePath: PausePathSegment[];
14
+ constructor(reason: string, options?: {
15
+ externalRef?: string;
16
+ statePatch?: Record<string, unknown>;
17
+ });
18
+ static is(err: unknown): err is PauseStep;
19
+ }
20
+ //# sourceMappingURL=pause-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause-step.d.ts","sourceRoot":"","sources":["../../src/engine/pause-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;;;GAMG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAEzD,6EAA6E;IAC7E,UAAU,EAAE,gBAAgB,EAAE,CAAM;gBAGlC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE;IAQ1E,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS;CAM1C"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Thrown by `ctx.pause()` to suspend workflow execution.
3
+ *
4
+ * The executor catches this, persists the context + state, and sets the
5
+ * execution status to EXTERNAL_WAIT. When the external event arrives, the
6
+ * executor resumes from the paused step by calling `onResume()`.
7
+ */
8
+ export class PauseStep extends Error {
9
+ externalRef;
10
+ statePatch;
11
+ /** @internal Used by executor to track nested pause position in branches. */
12
+ _pausePath = [];
13
+ constructor(reason, options) {
14
+ super(`Step paused: ${reason}`);
15
+ this.name = 'PauseStep';
16
+ this.externalRef = options?.externalRef;
17
+ this.statePatch = options?.statePatch;
18
+ }
19
+ static is(err) {
20
+ return (err instanceof PauseStep ||
21
+ (err instanceof Error && err.name === 'PauseStep'));
22
+ }
23
+ }
24
+ //# sourceMappingURL=pause-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause-step.js","sourceRoot":"","sources":["../../src/engine/pause-step.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,WAAW,CAAqB;IAChC,UAAU,CAAsC;IAEzD,6EAA6E;IAC7E,UAAU,GAAuB,EAAE,CAAC;IAEpC,YACE,MAAc,EACd,OAAwE;QAExE,KAAK,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,GAAY;QACpB,OAAO,CACL,GAAG,YAAY,SAAS;YACxB,CAAC,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CACnD,CAAC;IACJ,CAAC;CACF"}