@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.
- package/README.md +36 -0
- package/dist/agents/agent-step.d.ts +152 -0
- package/dist/agents/agent-step.d.ts.map +1 -0
- package/dist/agents/agent-step.js +403 -0
- package/dist/agents/agent-step.js.map +1 -0
- package/dist/agents/base-runtime.d.ts +38 -0
- package/dist/agents/base-runtime.d.ts.map +1 -0
- package/dist/agents/base-runtime.js +21 -0
- package/dist/agents/base-runtime.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +17 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/interceptor.d.ts +19 -0
- package/dist/agents/interceptor.d.ts.map +1 -0
- package/dist/agents/interceptor.js +21 -0
- package/dist/agents/interceptor.js.map +1 -0
- package/dist/agents/interceptors/approval-gate.d.ts +14 -0
- package/dist/agents/interceptors/approval-gate.d.ts.map +1 -0
- package/dist/agents/interceptors/approval-gate.js +19 -0
- package/dist/agents/interceptors/approval-gate.js.map +1 -0
- package/dist/agents/interceptors/tool-logger.d.ts +15 -0
- package/dist/agents/interceptors/tool-logger.d.ts.map +1 -0
- package/dist/agents/interceptors/tool-logger.js +23 -0
- package/dist/agents/interceptors/tool-logger.js.map +1 -0
- package/dist/agents/pi-mono-runtime.d.ts +88 -0
- package/dist/agents/pi-mono-runtime.d.ts.map +1 -0
- package/dist/agents/pi-mono-runtime.js +129 -0
- package/dist/agents/pi-mono-runtime.js.map +1 -0
- package/dist/agents/tool-registry.d.ts +25 -0
- package/dist/agents/tool-registry.d.ts.map +1 -0
- package/dist/agents/tool-registry.js +47 -0
- package/dist/agents/tool-registry.js.map +1 -0
- package/dist/agents/tool-types.d.ts +25 -0
- package/dist/agents/tool-types.d.ts.map +1 -0
- package/dist/agents/tool-types.js +9 -0
- package/dist/agents/tool-types.js.map +1 -0
- package/dist/agents/types.d.ts +91 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +12 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/builder/index.d.ts +30 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +32 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/client/index.d.ts +19 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +18 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +128 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +10 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/workflow-client.d.ts +15 -0
- package/dist/client/workflow-client.d.ts.map +1 -0
- package/dist/client/workflow-client.js +293 -0
- package/dist/client/workflow-client.js.map +1 -0
- package/dist/common/attachment.d.ts +31 -0
- package/dist/common/attachment.d.ts.map +1 -0
- package/dist/common/attachment.js +21 -0
- package/dist/common/attachment.js.map +1 -0
- package/dist/common/executable-check.d.ts +42 -0
- package/dist/common/executable-check.d.ts.map +1 -0
- package/dist/common/executable-check.js +115 -0
- package/dist/common/executable-check.js.map +1 -0
- package/dist/common/index.d.ts +21 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +19 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/resume-payload.d.ts +34 -0
- package/dist/common/resume-payload.d.ts.map +1 -0
- package/dist/common/resume-payload.js +12 -0
- package/dist/common/resume-payload.js.map +1 -0
- package/dist/engine/available-context.d.ts +29 -0
- package/dist/engine/available-context.d.ts.map +1 -0
- package/dist/engine/available-context.js +66 -0
- package/dist/engine/available-context.js.map +1 -0
- package/dist/engine/condition-evaluator.d.ts +13 -0
- package/dist/engine/condition-evaluator.d.ts.map +1 -0
- package/dist/engine/condition-evaluator.js +92 -0
- package/dist/engine/condition-evaluator.js.map +1 -0
- package/dist/engine/config-validator.d.ts +25 -0
- package/dist/engine/config-validator.d.ts.map +1 -0
- package/dist/engine/config-validator.js +316 -0
- package/dist/engine/config-validator.js.map +1 -0
- package/dist/engine/pause-step.d.ts +20 -0
- package/dist/engine/pause-step.d.ts.map +1 -0
- package/dist/engine/pause-step.js +24 -0
- package/dist/engine/pause-step.js.map +1 -0
- package/dist/engine/service-registry.d.ts +49 -0
- package/dist/engine/service-registry.d.ts.map +1 -0
- package/dist/engine/service-registry.js +76 -0
- package/dist/engine/service-registry.js.map +1 -0
- package/dist/engine/variable-resolver.d.ts +29 -0
- package/dist/engine/variable-resolver.d.ts.map +1 -0
- package/dist/engine/variable-resolver.js +130 -0
- package/dist/engine/variable-resolver.js.map +1 -0
- package/dist/engine/workflow-executor.d.ts +96 -0
- package/dist/engine/workflow-executor.d.ts.map +1 -0
- package/dist/engine/workflow-executor.js +837 -0
- package/dist/engine/workflow-executor.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/persistence/in-memory-adapter.d.ts +138 -0
- package/dist/persistence/in-memory-adapter.d.ts.map +1 -0
- package/dist/persistence/in-memory-adapter.js +315 -0
- package/dist/persistence/in-memory-adapter.js.map +1 -0
- package/dist/persistence/types.d.ts +214 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +8 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/router/types.d.ts +57 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +8 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router/workflow-router.d.ts +26 -0
- package/dist/router/workflow-router.d.ts.map +1 -0
- package/dist/router/workflow-router.js +611 -0
- package/dist/router/workflow-router.js.map +1 -0
- package/dist/runtime/execution-event-bus.d.ts +38 -0
- package/dist/runtime/execution-event-bus.d.ts.map +1 -0
- package/dist/runtime/execution-event-bus.js +87 -0
- package/dist/runtime/execution-event-bus.js.map +1 -0
- package/dist/runtime/types.d.ts +129 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +5 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/workflow-runtime.d.ts +256 -0
- package/dist/runtime/workflow-runtime.d.ts.map +1 -0
- package/dist/runtime/workflow-runtime.js +699 -0
- package/dist/runtime/workflow-runtime.js.map +1 -0
- package/dist/steps/base-step.d.ts +204 -0
- package/dist/steps/base-step.d.ts.map +1 -0
- package/dist/steps/base-step.js +69 -0
- package/dist/steps/base-step.js.map +1 -0
- package/dist/steps/builtin/code.step.d.ts +95 -0
- package/dist/steps/builtin/code.step.d.ts.map +1 -0
- package/dist/steps/builtin/code.step.js +122 -0
- package/dist/steps/builtin/code.step.js.map +1 -0
- package/dist/steps/builtin/conditional.step.d.ts +146 -0
- package/dist/steps/builtin/conditional.step.d.ts.map +1 -0
- package/dist/steps/builtin/conditional.step.js +71 -0
- package/dist/steps/builtin/conditional.step.js.map +1 -0
- package/dist/steps/builtin/dedup.step.d.ts +65 -0
- package/dist/steps/builtin/dedup.step.d.ts.map +1 -0
- package/dist/steps/builtin/dedup.step.js +61 -0
- package/dist/steps/builtin/dedup.step.js.map +1 -0
- package/dist/steps/builtin/http-request.step.d.ts +928 -0
- package/dist/steps/builtin/http-request.step.d.ts.map +1 -0
- package/dist/steps/builtin/http-request.step.js +570 -0
- package/dist/steps/builtin/http-request.step.js.map +1 -0
- package/dist/steps/builtin/loop.step.d.ts +100 -0
- package/dist/steps/builtin/loop.step.d.ts.map +1 -0
- package/dist/steps/builtin/loop.step.js +79 -0
- package/dist/steps/builtin/loop.step.js.map +1 -0
- package/dist/steps/builtin/parallel.step.d.ts +208 -0
- package/dist/steps/builtin/parallel.step.d.ts.map +1 -0
- package/dist/steps/builtin/parallel.step.js +249 -0
- package/dist/steps/builtin/parallel.step.js.map +1 -0
- package/dist/steps/builtin/switch.step.d.ts +200 -0
- package/dist/steps/builtin/switch.step.d.ts.map +1 -0
- package/dist/steps/builtin/switch.step.js +92 -0
- package/dist/steps/builtin/switch.step.js.map +1 -0
- package/dist/steps/builtin/transform.step.d.ts +247 -0
- package/dist/steps/builtin/transform.step.d.ts.map +1 -0
- package/dist/steps/builtin/transform.step.js +135 -0
- package/dist/steps/builtin/transform.step.js.map +1 -0
- package/dist/steps/builtin/wait.step.d.ts +921 -0
- package/dist/steps/builtin/wait.step.d.ts.map +1 -0
- package/dist/steps/builtin/wait.step.js +211 -0
- package/dist/steps/builtin/wait.step.js.map +1 -0
- package/dist/steps/step-registry.d.ts +64 -0
- package/dist/steps/step-registry.d.ts.map +1 -0
- package/dist/steps/step-registry.js +102 -0
- package/dist/steps/step-registry.js.map +1 -0
- package/dist/storage/in-memory-adapter.d.ts +25 -0
- package/dist/storage/in-memory-adapter.d.ts.map +1 -0
- package/dist/storage/in-memory-adapter.js +41 -0
- package/dist/storage/in-memory-adapter.js.map +1 -0
- package/dist/storage/types.d.ts +53 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +13 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-context.d.ts +13 -0
- package/dist/testing/mock-context.d.ts.map +1 -0
- package/dist/testing/mock-context.js +21 -0
- package/dist/testing/mock-context.js.map +1 -0
- package/dist/testing/mock-step-context.d.ts +47 -0
- package/dist/testing/mock-step-context.d.ts.map +1 -0
- package/dist/testing/mock-step-context.js +59 -0
- package/dist/testing/mock-step-context.js.map +1 -0
- package/dist/triggers/base-trigger.d.ts +58 -0
- package/dist/triggers/base-trigger.d.ts.map +1 -0
- package/dist/triggers/base-trigger.js +37 -0
- package/dist/triggers/base-trigger.js.map +1 -0
- package/dist/triggers/builtin/default-cron-trigger.d.ts +44 -0
- package/dist/triggers/builtin/default-cron-trigger.d.ts.map +1 -0
- package/dist/triggers/builtin/default-cron-trigger.js +31 -0
- package/dist/triggers/builtin/default-cron-trigger.js.map +1 -0
- package/dist/triggers/builtin/default-event-trigger.d.ts +32 -0
- package/dist/triggers/builtin/default-event-trigger.d.ts.map +1 -0
- package/dist/triggers/builtin/default-event-trigger.js +21 -0
- package/dist/triggers/builtin/default-event-trigger.js.map +1 -0
- package/dist/triggers/builtin/default-manual-trigger.d.ts +119 -0
- package/dist/triggers/builtin/default-manual-trigger.d.ts.map +1 -0
- package/dist/triggers/builtin/default-manual-trigger.js +64 -0
- package/dist/triggers/builtin/default-manual-trigger.js.map +1 -0
- package/dist/triggers/builtin/default-webhook-trigger.d.ts +72 -0
- package/dist/triggers/builtin/default-webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/builtin/default-webhook-trigger.js +91 -0
- package/dist/triggers/builtin/default-webhook-trigger.js.map +1 -0
- package/dist/triggers/cron-trigger.d.ts +52 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/triggers/cron-trigger.js +15 -0
- package/dist/triggers/cron-trigger.js.map +1 -0
- package/dist/triggers/event-trigger.d.ts +14 -0
- package/dist/triggers/event-trigger.d.ts.map +1 -0
- package/dist/triggers/event-trigger.js +13 -0
- package/dist/triggers/event-trigger.js.map +1 -0
- package/dist/triggers/manual-trigger.d.ts +11 -0
- package/dist/triggers/manual-trigger.d.ts.map +1 -0
- package/dist/triggers/manual-trigger.js +10 -0
- package/dist/triggers/manual-trigger.js.map +1 -0
- package/dist/triggers/trigger-registry.d.ts +48 -0
- package/dist/triggers/trigger-registry.d.ts.map +1 -0
- package/dist/triggers/trigger-registry.js +81 -0
- package/dist/triggers/trigger-registry.js.map +1 -0
- package/dist/triggers/webhook-trigger.d.ts +54 -0
- package/dist/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/webhook-trigger.js +13 -0
- package/dist/triggers/webhook-trigger.js.map +1 -0
- package/dist/types/attachment.d.ts +23 -0
- package/dist/types/attachment.d.ts.map +1 -0
- package/dist/types/attachment.js +2 -0
- package/dist/types/attachment.js.map +1 -0
- package/dist/types/categories.d.ts +14 -0
- package/dist/types/categories.d.ts.map +1 -0
- package/dist/types/categories.js +10 -0
- package/dist/types/categories.js.map +1 -0
- package/dist/types/context.d.ts +61 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +2 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/known-types.d.ts +34 -0
- package/dist/types/known-types.d.ts.map +1 -0
- package/dist/types/known-types.js +49 -0
- package/dist/types/known-types.js.map +1 -0
- package/dist/types/operators.d.ts +20 -0
- package/dist/types/operators.d.ts.map +1 -0
- package/dist/types/operators.js +27 -0
- package/dist/types/operators.js.map +1 -0
- package/dist/types/pause-path.d.ts +23 -0
- package/dist/types/pause-path.d.ts.map +1 -0
- package/dist/types/pause-path.js +2 -0
- package/dist/types/pause-path.js.map +1 -0
- package/dist/types/pause-state.d.ts +100 -0
- package/dist/types/pause-state.d.ts.map +1 -0
- package/dist/types/pause-state.js +15 -0
- package/dist/types/pause-state.js.map +1 -0
- package/dist/types/resume-payload.d.ts +34 -0
- package/dist/types/resume-payload.d.ts.map +1 -0
- package/dist/types/resume-payload.js +12 -0
- package/dist/types/resume-payload.js.map +1 -0
- package/dist/types/status.d.ts +27 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +41 -0
- package/dist/types/status.js.map +1 -0
- package/dist/types/step-events.d.ts +22 -0
- package/dist/types/step-events.d.ts.map +1 -0
- package/dist/types/step-events.js +8 -0
- package/dist/types/step-events.js.map +1 -0
- package/dist/types/step-types.d.ts +12 -0
- package/dist/types/step-types.d.ts.map +1 -0
- package/dist/types/step-types.js +2 -0
- package/dist/types/step-types.js.map +1 -0
- package/dist/types/trigger-types.d.ts +12 -0
- package/dist/types/trigger-types.d.ts.map +1 -0
- package/dist/types/trigger-types.js +2 -0
- package/dist/types/trigger-types.js.map +1 -0
- package/dist/types/validation.d.ts +19 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +11 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/types/workflow-config.d.ts +122 -0
- package/dist/types/workflow-config.d.ts.map +1 -0
- package/dist/types/workflow-config.js +71 -0
- package/dist/types/workflow-config.js.map +1 -0
- package/dist/util/executable-check.d.ts +42 -0
- package/dist/util/executable-check.d.ts.map +1 -0
- package/dist/util/executable-check.js +115 -0
- package/dist/util/executable-check.js.map +1 -0
- package/dist/util/schema-convert.d.ts +14 -0
- package/dist/util/schema-convert.d.ts.map +1 -0
- package/dist/util/schema-convert.js +16 -0
- package/dist/util/schema-convert.js.map +1 -0
- package/dist/util/variable-ref.d.ts +52 -0
- package/dist/util/variable-ref.d.ts.map +1 -0
- package/dist/util/variable-ref.js +89 -0
- package/dist/util/variable-ref.js.map +1 -0
- 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"}
|