@sensigo/realm 0.1.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 +150 -0
- package/dist/adapters/adapter-utils.d.ts +14 -0
- package/dist/adapters/adapter-utils.d.ts.map +1 -0
- package/dist/adapters/adapter-utils.js +18 -0
- package/dist/adapters/adapter-utils.js.map +1 -0
- package/dist/adapters/airtable-adapter.d.ts +51 -0
- package/dist/adapters/airtable-adapter.d.ts.map +1 -0
- package/dist/adapters/airtable-adapter.js +425 -0
- package/dist/adapters/airtable-adapter.js.map +1 -0
- package/dist/adapters/file-adapter.d.ts +14 -0
- package/dist/adapters/file-adapter.d.ts.map +1 -0
- package/dist/adapters/file-adapter.js +89 -0
- package/dist/adapters/file-adapter.js.map +1 -0
- package/dist/adapters/github-adapter.d.ts +40 -0
- package/dist/adapters/github-adapter.d.ts.map +1 -0
- package/dist/adapters/github-adapter.js +286 -0
- package/dist/adapters/github-adapter.js.map +1 -0
- package/dist/adapters/gorgias-adapter.d.ts +40 -0
- package/dist/adapters/gorgias-adapter.d.ts.map +1 -0
- package/dist/adapters/gorgias-adapter.js +300 -0
- package/dist/adapters/gorgias-adapter.js.map +1 -0
- package/dist/adapters/http-adapter.d.ts +28 -0
- package/dist/adapters/http-adapter.d.ts.map +1 -0
- package/dist/adapters/http-adapter.js +97 -0
- package/dist/adapters/http-adapter.js.map +1 -0
- package/dist/adapters/mock-adapter.d.ts +16 -0
- package/dist/adapters/mock-adapter.d.ts.map +1 -0
- package/dist/adapters/mock-adapter.js +61 -0
- package/dist/adapters/mock-adapter.js.map +1 -0
- package/dist/adapters/notion-adapter.d.ts +54 -0
- package/dist/adapters/notion-adapter.d.ts.map +1 -0
- package/dist/adapters/notion-adapter.js +751 -0
- package/dist/adapters/notion-adapter.js.map +1 -0
- package/dist/adapters/parcelpanel-adapter.d.ts +60 -0
- package/dist/adapters/parcelpanel-adapter.d.ts.map +1 -0
- package/dist/adapters/parcelpanel-adapter.js +251 -0
- package/dist/adapters/parcelpanel-adapter.js.map +1 -0
- package/dist/adapters/rate-limiter.d.ts +26 -0
- package/dist/adapters/rate-limiter.d.ts.map +1 -0
- package/dist/adapters/rate-limiter.js +3 -0
- package/dist/adapters/rate-limiter.js.map +1 -0
- package/dist/adapters/shopify-adapter.d.ts +92 -0
- package/dist/adapters/shopify-adapter.d.ts.map +1 -0
- package/dist/adapters/shopify-adapter.js +415 -0
- package/dist/adapters/shopify-adapter.js.map +1 -0
- package/dist/adapters/slack-adapter.d.ts +18 -0
- package/dist/adapters/slack-adapter.d.ts.map +1 -0
- package/dist/adapters/slack-adapter.js +81 -0
- package/dist/adapters/slack-adapter.js.map +1 -0
- package/dist/adapters/token-bucket.d.ts +27 -0
- package/dist/adapters/token-bucket.d.ts.map +1 -0
- package/dist/adapters/token-bucket.js +109 -0
- package/dist/adapters/token-bucket.js.map +1 -0
- package/dist/config/secrets.d.ts +15 -0
- package/dist/config/secrets.d.ts.map +1 -0
- package/dist/config/secrets.js +33 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/engine/eligibility.d.ts +50 -0
- package/dist/engine/eligibility.d.ts.map +1 -0
- package/dist/engine/eligibility.js +267 -0
- package/dist/engine/eligibility.js.map +1 -0
- package/dist/engine/error-resolution.d.ts +20 -0
- package/dist/engine/error-resolution.d.ts.map +1 -0
- package/dist/engine/error-resolution.js +32 -0
- package/dist/engine/error-resolution.js.map +1 -0
- package/dist/engine/execution-loop.d.ts +101 -0
- package/dist/engine/execution-loop.d.ts.map +1 -0
- package/dist/engine/execution-loop.js +1156 -0
- package/dist/engine/execution-loop.js.map +1 -0
- package/dist/engine/lifecycle.d.ts +14 -0
- package/dist/engine/lifecycle.d.ts.map +1 -0
- package/dist/engine/lifecycle.js +17 -0
- package/dist/engine/lifecycle.js.map +1 -0
- package/dist/engine/precondition.d.ts +30 -0
- package/dist/engine/precondition.d.ts.map +1 -0
- package/dist/engine/precondition.js +125 -0
- package/dist/engine/precondition.js.map +1 -0
- package/dist/engine/prompt-template.d.ts +25 -0
- package/dist/engine/prompt-template.d.ts.map +1 -0
- package/dist/engine/prompt-template.js +66 -0
- package/dist/engine/prompt-template.js.map +1 -0
- package/dist/engine/render-template.d.ts +52 -0
- package/dist/engine/render-template.d.ts.map +1 -0
- package/dist/engine/render-template.js +548 -0
- package/dist/engine/render-template.js.map +1 -0
- package/dist/engine/state-guard.d.ts +15 -0
- package/dist/engine/state-guard.d.ts.map +1 -0
- package/dist/engine/state-guard.js +40 -0
- package/dist/engine/state-guard.js.map +1 -0
- package/dist/engine/trace-normalizer.d.ts +36 -0
- package/dist/engine/trace-normalizer.d.ts.map +1 -0
- package/dist/engine/trace-normalizer.js +146 -0
- package/dist/engine/trace-normalizer.js.map +1 -0
- package/dist/engine/trace-policy.d.ts +53 -0
- package/dist/engine/trace-policy.d.ts.map +1 -0
- package/dist/engine/trace-policy.js +35 -0
- package/dist/engine/trace-policy.js.map +1 -0
- package/dist/engine/workflow-context-loader.d.ts +9 -0
- package/dist/engine/workflow-context-loader.d.ts.map +1 -0
- package/dist/engine/workflow-context-loader.js +41 -0
- package/dist/engine/workflow-context-loader.js.map +1 -0
- package/dist/evidence/snapshot.d.ts +38 -0
- package/dist/evidence/snapshot.d.ts.map +1 -0
- package/dist/evidence/snapshot.js +53 -0
- package/dist/evidence/snapshot.js.map +1 -0
- package/dist/extensions/default-registry.d.ts +19 -0
- package/dist/extensions/default-registry.d.ts.map +1 -0
- package/dist/extensions/default-registry.js +31 -0
- package/dist/extensions/default-registry.js.map +1 -0
- package/dist/extensions/processor.d.ts +13 -0
- package/dist/extensions/processor.d.ts.map +1 -0
- package/dist/extensions/processor.js +3 -0
- package/dist/extensions/processor.js.map +1 -0
- package/dist/extensions/registry.d.ts +25 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +43 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/service-adapter.d.ts +35 -0
- package/dist/extensions/service-adapter.d.ts.map +1 -0
- package/dist/extensions/service-adapter.js +3 -0
- package/dist/extensions/service-adapter.js.map +1 -0
- package/dist/extensions/step-handler.d.ts +28 -0
- package/dist/extensions/step-handler.d.ts.map +1 -0
- package/dist/extensions/step-handler.js +3 -0
- package/dist/extensions/step-handler.js.map +1 -0
- package/dist/handlers/primitives/compare-strings.d.ts +13 -0
- package/dist/handlers/primitives/compare-strings.d.ts.map +1 -0
- package/dist/handlers/primitives/compare-strings.js +28 -0
- package/dist/handlers/primitives/compare-strings.js.map +1 -0
- package/dist/handlers/primitives/count-results.d.ts +21 -0
- package/dist/handlers/primitives/count-results.d.ts.map +1 -0
- package/dist/handlers/primitives/count-results.js +23 -0
- package/dist/handlers/primitives/count-results.js.map +1 -0
- package/dist/handlers/primitives/partition-by-substring.d.ts +18 -0
- package/dist/handlers/primitives/partition-by-substring.d.ts.map +1 -0
- package/dist/handlers/primitives/partition-by-substring.js +28 -0
- package/dist/handlers/primitives/partition-by-substring.js.map +1 -0
- package/dist/handlers/primitives/resolve-resource.d.ts +13 -0
- package/dist/handlers/primitives/resolve-resource.d.ts.map +1 -0
- package/dist/handlers/primitives/resolve-resource.js +21 -0
- package/dist/handlers/primitives/resolve-resource.js.map +1 -0
- package/dist/handlers/primitives/walk-field.d.ts +11 -0
- package/dist/handlers/primitives/walk-field.d.ts.map +1 -0
- package/dist/handlers/primitives/walk-field.js +31 -0
- package/dist/handlers/primitives/walk-field.js.map +1 -0
- package/dist/handlers/validate-field-match.d.ts +11 -0
- package/dist/handlers/validate-field-match.d.ts.map +1 -0
- package/dist/handlers/validate-field-match.js +39 -0
- package/dist/handlers/validate-field-match.js.map +1 -0
- package/dist/handlers/validate-verbatim-quotes.d.ts +11 -0
- package/dist/handlers/validate-verbatim-quotes.d.ts.map +1 -0
- package/dist/handlers/validate-verbatim-quotes.js +37 -0
- package/dist/handlers/validate-verbatim-quotes.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline/processing-pipeline.d.ts +24 -0
- package/dist/pipeline/processing-pipeline.d.ts.map +1 -0
- package/dist/pipeline/processing-pipeline.js +53 -0
- package/dist/pipeline/processing-pipeline.js.map +1 -0
- package/dist/processors/compute-hash.d.ts +4 -0
- package/dist/processors/compute-hash.d.ts.map +1 -0
- package/dist/processors/compute-hash.js +14 -0
- package/dist/processors/compute-hash.js.map +1 -0
- package/dist/processors/normalize-text.d.ts +8 -0
- package/dist/processors/normalize-text.d.ts.map +1 -0
- package/dist/processors/normalize-text.js +47 -0
- package/dist/processors/normalize-text.js.map +1 -0
- package/dist/store/json-file-store.d.ts +24 -0
- package/dist/store/json-file-store.d.ts.map +1 -0
- package/dist/store/json-file-store.js +210 -0
- package/dist/store/json-file-store.js.map +1 -0
- package/dist/store/store-interface.d.ts +33 -0
- package/dist/store/store-interface.d.ts.map +1 -0
- package/dist/store/store-interface.js +2 -0
- package/dist/store/store-interface.js.map +1 -0
- package/dist/store/trace-buffer-store.d.ts +55 -0
- package/dist/store/trace-buffer-store.d.ts.map +1 -0
- package/dist/store/trace-buffer-store.js +113 -0
- package/dist/store/trace-buffer-store.js.map +1 -0
- package/dist/types/mcp-types.d.ts +17 -0
- package/dist/types/mcp-types.d.ts.map +1 -0
- package/dist/types/mcp-types.js +5 -0
- package/dist/types/mcp-types.js.map +1 -0
- package/dist/types/response-envelope.d.ts +96 -0
- package/dist/types/response-envelope.d.ts.map +1 -0
- package/dist/types/response-envelope.js +2 -0
- package/dist/types/response-envelope.js.map +1 -0
- package/dist/types/run-record.d.ts +169 -0
- package/dist/types/run-record.d.ts.map +1 -0
- package/dist/types/run-record.js +2 -0
- package/dist/types/run-record.js.map +1 -0
- package/dist/types/workflow-definition.d.ts +292 -0
- package/dist/types/workflow-definition.d.ts.map +1 -0
- package/dist/types/workflow-definition.js +2 -0
- package/dist/types/workflow-definition.js.map +1 -0
- package/dist/types/workflow-error.d.ts +26 -0
- package/dist/types/workflow-error.d.ts.map +1 -0
- package/dist/types/workflow-error.js +28 -0
- package/dist/types/workflow-error.js.map +1 -0
- package/dist/utils/schema-skeleton.d.ts +11 -0
- package/dist/utils/schema-skeleton.d.ts.map +1 -0
- package/dist/utils/schema-skeleton.js +40 -0
- package/dist/utils/schema-skeleton.js.map +1 -0
- package/dist/validation/input-schema.d.ts +26 -0
- package/dist/validation/input-schema.d.ts.map +1 -0
- package/dist/validation/input-schema.js +67 -0
- package/dist/validation/input-schema.js.map +1 -0
- package/dist/workflow/registrar.d.ts +20 -0
- package/dist/workflow/registrar.d.ts.map +1 -0
- package/dist/workflow/registrar.js +61 -0
- package/dist/workflow/registrar.js.map +1 -0
- package/dist/workflow/template-resolver.d.ts +25 -0
- package/dist/workflow/template-resolver.d.ts.map +1 -0
- package/dist/workflow/template-resolver.js +112 -0
- package/dist/workflow/template-resolver.js.map +1 -0
- package/dist/workflow/yaml-loader.d.ts +15 -0
- package/dist/workflow/yaml-loader.d.ts.map +1 -0
- package/dist/workflow/yaml-loader.js +408 -0
- package/dist/workflow/yaml-loader.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TemplateDefinition, StepDefinition } from '../types/workflow-definition.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves {{ key }} placeholders in a string value.
|
|
4
|
+
* Unknown placeholders are left as-is (forward compat for nested templates in future).
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolvePlaceholders(value: string, vars: Record<string, string>): string;
|
|
7
|
+
/**
|
|
8
|
+
* Recursively walks an object and applies resolvePlaceholders to all string leaf values.
|
|
9
|
+
* Does not modify keys — only values.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveObject(obj: unknown, vars: Record<string, string>): unknown;
|
|
12
|
+
/**
|
|
13
|
+
* Expands a single use_template instantiation into concrete named steps.
|
|
14
|
+
* Returns an array of [stepId, stepDef] pairs in template declaration order.
|
|
15
|
+
*/
|
|
16
|
+
export declare function expandTemplateInstantiation(callSiteKey: string, instantiation: Record<string, unknown>, templates: Record<string, TemplateDefinition>): Array<[string, StepDefinition]>;
|
|
17
|
+
/**
|
|
18
|
+
* Walks the raw steps object and replaces any use_template entries with their
|
|
19
|
+
* expanded concrete steps. Returns a new steps Record in the same order, with
|
|
20
|
+
* template instantiations expanded inline at the position of the call site key.
|
|
21
|
+
*
|
|
22
|
+
* Called by loadWorkflowFromString before per-step validation.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveTemplates(rawSteps: Record<string, unknown>, templates: Record<string, TemplateDefinition>): Record<string, unknown>;
|
|
25
|
+
//# sourceMappingURL=template-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-resolver.d.ts","sourceRoot":"","sources":["../../src/workflow/template-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAG1F;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIvF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CASjF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC5C,KAAK,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CA0DjC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Template resolver — expands use_template steps into concrete steps before validation.
|
|
2
|
+
import { WorkflowError } from '../types/workflow-error.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves {{ key }} placeholders in a string value.
|
|
5
|
+
* Unknown placeholders are left as-is (forward compat for nested templates in future).
|
|
6
|
+
*/
|
|
7
|
+
export function resolvePlaceholders(value, vars) {
|
|
8
|
+
return value.replace(/\{\{\s*([\w]+)\s*\}\}/g, (match, key) => {
|
|
9
|
+
return key in vars ? vars[key] : match;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Recursively walks an object and applies resolvePlaceholders to all string leaf values.
|
|
14
|
+
* Does not modify keys — only values.
|
|
15
|
+
*/
|
|
16
|
+
export function resolveObject(obj, vars) {
|
|
17
|
+
if (typeof obj === 'string')
|
|
18
|
+
return resolvePlaceholders(obj, vars);
|
|
19
|
+
if (Array.isArray(obj))
|
|
20
|
+
return obj.map((item) => resolveObject(item, vars));
|
|
21
|
+
if (typeof obj === 'object' && obj !== null) {
|
|
22
|
+
return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, resolveObject(v, vars)]));
|
|
23
|
+
}
|
|
24
|
+
return obj;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Expands a single use_template instantiation into concrete named steps.
|
|
28
|
+
* Returns an array of [stepId, stepDef] pairs in template declaration order.
|
|
29
|
+
*/
|
|
30
|
+
export function expandTemplateInstantiation(callSiteKey, instantiation, templates) {
|
|
31
|
+
const templateName = instantiation['use_template'];
|
|
32
|
+
const template = templates[templateName];
|
|
33
|
+
if (template === undefined) {
|
|
34
|
+
throw new WorkflowError(`Step '${callSiteKey}': use_template references unknown template '${templateName}'`, {
|
|
35
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
36
|
+
category: 'VALIDATION',
|
|
37
|
+
agentAction: 'report_to_user',
|
|
38
|
+
retryable: false,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const prefix = instantiation['prefix'];
|
|
42
|
+
if (typeof prefix !== 'string' || prefix === '') {
|
|
43
|
+
throw new WorkflowError(`Step '${callSiteKey}': use_template requires a non-empty 'prefix'`, {
|
|
44
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
45
|
+
category: 'VALIDATION',
|
|
46
|
+
agentAction: 'report_to_user',
|
|
47
|
+
retryable: false,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Resolve params: merge caller-supplied values with template defaults.
|
|
51
|
+
const callerParams = (instantiation['params'] ?? {});
|
|
52
|
+
const vars = { prefix };
|
|
53
|
+
const paramErrors = [];
|
|
54
|
+
for (const [paramName, paramDef] of Object.entries(template.params ?? {})) {
|
|
55
|
+
const supplied = callerParams[paramName];
|
|
56
|
+
if (supplied !== undefined) {
|
|
57
|
+
vars[paramName] = String(supplied);
|
|
58
|
+
}
|
|
59
|
+
else if (paramDef.default !== undefined) {
|
|
60
|
+
vars[paramName] = paramDef.default;
|
|
61
|
+
}
|
|
62
|
+
else if (paramDef.required === true) {
|
|
63
|
+
paramErrors.push(`Step '${callSiteKey}': template '${templateName}' requires param '${paramName}'`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (paramErrors.length > 0) {
|
|
67
|
+
throw new WorkflowError(`Invalid workflow: ${paramErrors.join('; ')}`, {
|
|
68
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
69
|
+
category: 'VALIDATION',
|
|
70
|
+
agentAction: 'report_to_user',
|
|
71
|
+
retryable: false,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Expand template steps: prefix_templateStepName → resolved StepDefinition.
|
|
75
|
+
return Object.entries(template.steps).map(([templateStepName, templateStep]) => {
|
|
76
|
+
const stepId = `${prefix}_${templateStepName}`;
|
|
77
|
+
const resolved = resolveObject(templateStep, vars);
|
|
78
|
+
return [stepId, resolved];
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Walks the raw steps object and replaces any use_template entries with their
|
|
83
|
+
* expanded concrete steps. Returns a new steps Record in the same order, with
|
|
84
|
+
* template instantiations expanded inline at the position of the call site key.
|
|
85
|
+
*
|
|
86
|
+
* Called by loadWorkflowFromString before per-step validation.
|
|
87
|
+
*/
|
|
88
|
+
export function resolveTemplates(rawSteps, templates) {
|
|
89
|
+
const resolved = {};
|
|
90
|
+
for (const [key, value] of Object.entries(rawSteps)) {
|
|
91
|
+
const stepRaw = value;
|
|
92
|
+
if ('use_template' in stepRaw) {
|
|
93
|
+
const expanded = expandTemplateInstantiation(key, stepRaw, templates);
|
|
94
|
+
for (const [expandedId, expandedStep] of expanded) {
|
|
95
|
+
if (expandedId in resolved) {
|
|
96
|
+
throw new WorkflowError(`Template expansion produced duplicate step ID '${expandedId}'`, {
|
|
97
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
98
|
+
category: 'VALIDATION',
|
|
99
|
+
agentAction: 'report_to_user',
|
|
100
|
+
retryable: false,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
resolved[expandedId] = expandedStep;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
resolved[key] = value;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return resolved;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=template-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-resolver.js","sourceRoot":"","sources":["../../src/workflow/template-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WorkflowDefinition } from '../types/workflow-definition.js';
|
|
2
|
+
/** Bumped on every breaking change to WorkflowDefinition's serialized format. */
|
|
3
|
+
export declare const CURRENT_WORKFLOW_SCHEMA_VERSION = 1;
|
|
4
|
+
/**
|
|
5
|
+
* Loads a WorkflowDefinition from a YAML file on disk.
|
|
6
|
+
* @throws WorkflowError on read failure or structural validation errors.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadWorkflowFromFile(filePath: string): WorkflowDefinition;
|
|
9
|
+
/**
|
|
10
|
+
* Loads a WorkflowDefinition from a YAML string.
|
|
11
|
+
* Validates structure and DAG dependency references.
|
|
12
|
+
* @throws WorkflowError on parse failure or structural validation errors.
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadWorkflowFromString(content: string): WorkflowDefinition;
|
|
15
|
+
//# sourceMappingURL=yaml-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-loader.d.ts","sourceRoot":"","sources":["../../src/workflow/yaml-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,iCAAiC,CAAC;AAIzC,iFAAiF;AACjF,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAajD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA+HzE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAqW1E"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
// Workflow YAML loader — parses workflow.yaml files into typed WorkflowDefinition objects.
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve, join } from 'node:path';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { load } from 'js-yaml';
|
|
6
|
+
import { WorkflowError } from '../types/workflow-error.js';
|
|
7
|
+
import { resolveTemplates } from './template-resolver.js';
|
|
8
|
+
/** Bumped on every breaking change to WorkflowDefinition's serialized format. */
|
|
9
|
+
export const CURRENT_WORKFLOW_SCHEMA_VERSION = 1;
|
|
10
|
+
const VALID_EXECUTIONS = new Set(['auto', 'agent']);
|
|
11
|
+
const VALID_SERVICE_METHODS = new Set(['fetch', 'create', 'update', 'delete']);
|
|
12
|
+
const VALID_TRIGGER_RULES = new Set([
|
|
13
|
+
'all_success',
|
|
14
|
+
'all_failed',
|
|
15
|
+
'all_done',
|
|
16
|
+
'one_failed',
|
|
17
|
+
'one_success',
|
|
18
|
+
'none_failed',
|
|
19
|
+
]);
|
|
20
|
+
/**
|
|
21
|
+
* Loads a WorkflowDefinition from a YAML file on disk.
|
|
22
|
+
* @throws WorkflowError on read failure or structural validation errors.
|
|
23
|
+
*/
|
|
24
|
+
export function loadWorkflowFromFile(filePath) {
|
|
25
|
+
let content;
|
|
26
|
+
try {
|
|
27
|
+
content = readFileSync(filePath, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
31
|
+
throw new WorkflowError(`Failed to read workflow file: ${message}`, {
|
|
32
|
+
code: 'RESOURCE_FETCH_FAILED',
|
|
33
|
+
category: 'RESOURCE',
|
|
34
|
+
agentAction: 'report_to_user',
|
|
35
|
+
retryable: false,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const definition = loadWorkflowFromString(content);
|
|
39
|
+
// Resolve agent profiles — only possible when we have a file path.
|
|
40
|
+
const workflowDir = dirname(resolve(filePath));
|
|
41
|
+
const profilesDir = definition.profiles_dir !== undefined
|
|
42
|
+
? resolve(workflowDir, definition.profiles_dir)
|
|
43
|
+
: join(workflowDir, 'profiles');
|
|
44
|
+
const resolvedProfiles = {};
|
|
45
|
+
const profileErrors = [];
|
|
46
|
+
for (const [stepName, step] of Object.entries(definition.steps)) {
|
|
47
|
+
if (step.agent_profile === undefined)
|
|
48
|
+
continue;
|
|
49
|
+
const profileName = step.agent_profile;
|
|
50
|
+
if (profileName in resolvedProfiles)
|
|
51
|
+
continue;
|
|
52
|
+
const profilePath = join(profilesDir, `${profileName}.md`);
|
|
53
|
+
let profileContent;
|
|
54
|
+
try {
|
|
55
|
+
profileContent = readFileSync(profilePath, 'utf8');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
profileErrors.push(`Step '${stepName}': agent_profile '${profileName}' not found. Searched: ${profilePath}`);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const contentHash = createHash('sha256').update(profileContent).digest('hex');
|
|
62
|
+
resolvedProfiles[profileName] = { content: profileContent, content_hash: contentHash };
|
|
63
|
+
}
|
|
64
|
+
if (profileErrors.length > 0) {
|
|
65
|
+
throw new WorkflowError(`Invalid workflow: ${profileErrors.join('; ')}`, {
|
|
66
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
67
|
+
category: 'VALIDATION',
|
|
68
|
+
agentAction: 'report_to_user',
|
|
69
|
+
retryable: false,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (Object.keys(resolvedProfiles).length > 0) {
|
|
73
|
+
definition.resolved_profiles = resolvedProfiles;
|
|
74
|
+
}
|
|
75
|
+
// Validate context_wrapper if present.
|
|
76
|
+
if (definition.context_wrapper !== undefined) {
|
|
77
|
+
const VALID_WRAPPER_FORMATS = new Set(['xml', 'brackets', 'none']);
|
|
78
|
+
if (!VALID_WRAPPER_FORMATS.has(definition.context_wrapper)) {
|
|
79
|
+
throw new WorkflowError(`Invalid context_wrapper '${String(definition.context_wrapper)}'; must be 'xml', 'brackets', or 'none'`, {
|
|
80
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
81
|
+
category: 'VALIDATION',
|
|
82
|
+
agentAction: 'report_to_user',
|
|
83
|
+
retryable: false,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Validate and resolve workflow_context entry paths.
|
|
88
|
+
if (definition.workflow_context !== undefined) {
|
|
89
|
+
for (const [name, entry] of Object.entries(definition.workflow_context)) {
|
|
90
|
+
if (name.endsWith('.raw')) {
|
|
91
|
+
throw new WorkflowError(`workflow_context entry names must not end with '.raw' (found: '${name}')`, {
|
|
92
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
93
|
+
category: 'VALIDATION',
|
|
94
|
+
agentAction: 'report_to_user',
|
|
95
|
+
retryable: false,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (!/^[\w.]+$/.test(name)) {
|
|
99
|
+
throw new WorkflowError(`workflow_context entry name '${name}' is invalid; names must match [\\w.]+ (underscores and dots only — no hyphens)`, {
|
|
100
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
101
|
+
category: 'VALIDATION',
|
|
102
|
+
agentAction: 'report_to_user',
|
|
103
|
+
retryable: false,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const rawEntry = entry;
|
|
107
|
+
const rawSource = rawEntry['source'];
|
|
108
|
+
if (rawSource === undefined || typeof rawSource['path'] !== 'string') {
|
|
109
|
+
throw new WorkflowError(`workflow_context.${name}.source.path is required`, {
|
|
110
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
111
|
+
category: 'VALIDATION',
|
|
112
|
+
agentAction: 'report_to_user',
|
|
113
|
+
retryable: false,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// Resolve relative path to absolute.
|
|
117
|
+
entry.source.path = resolve(workflowDir, rawSource['path']);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Auto-register schema.json if present and not explicitly declared.
|
|
121
|
+
const schemaPath = join(workflowDir, 'schema.json');
|
|
122
|
+
if (existsSync(schemaPath) && definition.workflow_context?.['schema'] === undefined) {
|
|
123
|
+
definition.workflow_context ??= {};
|
|
124
|
+
definition.workflow_context['schema'] = {
|
|
125
|
+
source: { path: schemaPath },
|
|
126
|
+
description: 'Auto-registered schema.json from workflow directory',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
definition.origin = 'human';
|
|
130
|
+
return definition;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Loads a WorkflowDefinition from a YAML string.
|
|
134
|
+
* Validates structure and DAG dependency references.
|
|
135
|
+
* @throws WorkflowError on parse failure or structural validation errors.
|
|
136
|
+
*/
|
|
137
|
+
export function loadWorkflowFromString(content) {
|
|
138
|
+
// Step 1: Parse YAML
|
|
139
|
+
let raw;
|
|
140
|
+
try {
|
|
141
|
+
raw = load(content);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
throw new WorkflowError(`YAML parse error: ${err instanceof Error ? err.message : String(err)}`, {
|
|
145
|
+
code: 'RESOURCE_FORMAT_INVALID',
|
|
146
|
+
category: 'RESOURCE',
|
|
147
|
+
agentAction: 'report_to_user',
|
|
148
|
+
retryable: false,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const errors = [];
|
|
152
|
+
// Step 2: Top-level validation
|
|
153
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
154
|
+
throw new WorkflowError('Invalid workflow: Workflow must be a non-null object', {
|
|
155
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
156
|
+
category: 'VALIDATION',
|
|
157
|
+
agentAction: 'report_to_user',
|
|
158
|
+
retryable: false,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const doc = raw;
|
|
162
|
+
const REQUIRED_TOP_LEVEL = ['id', 'name', 'version', 'steps'];
|
|
163
|
+
for (const field of REQUIRED_TOP_LEVEL) {
|
|
164
|
+
if (!(field in doc)) {
|
|
165
|
+
errors.push(`Missing required field: '${field}'`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if ('version' in doc && typeof doc['version'] !== 'number') {
|
|
169
|
+
errors.push(`'version' must be a number`);
|
|
170
|
+
}
|
|
171
|
+
if ('steps' in doc &&
|
|
172
|
+
(typeof doc['steps'] !== 'object' || doc['steps'] === null || Array.isArray(doc['steps']))) {
|
|
173
|
+
errors.push(`'steps' must be a non-null object`);
|
|
174
|
+
}
|
|
175
|
+
if (errors.length > 0) {
|
|
176
|
+
throw new WorkflowError(`Invalid workflow: ${errors.join('; ')}`, {
|
|
177
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
178
|
+
category: 'VALIDATION',
|
|
179
|
+
agentAction: 'report_to_user',
|
|
180
|
+
retryable: false,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
// Step 1b: Resolve template instantiations before validation.
|
|
184
|
+
const rawTemplates = (doc['templates'] ?? {});
|
|
185
|
+
if (Object.keys(rawTemplates).length > 0 || hasUseTemplateInSteps(doc['steps'])) {
|
|
186
|
+
doc['steps'] = resolveTemplates(doc['steps'], rawTemplates);
|
|
187
|
+
}
|
|
188
|
+
const stepsRaw = doc['steps'];
|
|
189
|
+
// Step 3: Per-step validation
|
|
190
|
+
for (const [stepName, stepRaw] of Object.entries(stepsRaw)) {
|
|
191
|
+
if (typeof stepRaw !== 'object' || stepRaw === null || Array.isArray(stepRaw)) {
|
|
192
|
+
errors.push(`Step '${stepName}' must be an object`);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const step = stepRaw;
|
|
196
|
+
const REQUIRED_STEP = ['description', 'execution'];
|
|
197
|
+
for (const field of REQUIRED_STEP) {
|
|
198
|
+
if (!(field in step)) {
|
|
199
|
+
errors.push(`Step '${stepName}': missing required field '${field}'`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if ('execution' in step && !VALID_EXECUTIONS.has(step['execution'])) {
|
|
203
|
+
errors.push(`Step '${stepName}': invalid execution value '${String(step['execution'])}'; must be 'auto' or 'agent'`);
|
|
204
|
+
}
|
|
205
|
+
// agent_profile is only valid on agent steps.
|
|
206
|
+
if ('agent_profile' in step && step['execution'] !== 'agent') {
|
|
207
|
+
errors.push(`Step '${stepName}': 'agent_profile' is only valid on execution: agent steps`);
|
|
208
|
+
}
|
|
209
|
+
// output_schema is only valid on execution: agent steps.
|
|
210
|
+
if (step['output_schema'] !== undefined && step['execution'] !== 'agent') {
|
|
211
|
+
errors.push(`Step '${stepName}': 'output_schema' is only valid on execution: agent steps`);
|
|
212
|
+
}
|
|
213
|
+
// trace_schema is only valid on execution: agent steps.
|
|
214
|
+
if (step['trace_schema'] !== undefined && step['execution'] !== 'agent') {
|
|
215
|
+
errors.push(`Step '${stepName}': 'trace_schema' is only valid on execution: agent steps`);
|
|
216
|
+
}
|
|
217
|
+
// trace_validation_mode is only valid on execution: agent steps.
|
|
218
|
+
if (step['trace_validation_mode'] !== undefined && step['execution'] !== 'agent') {
|
|
219
|
+
errors.push(`Step '${stepName}': 'trace_validation_mode' is only valid on execution: agent steps`);
|
|
220
|
+
}
|
|
221
|
+
// trace_validation_mode must be 'warn' or 'enforce' when provided.
|
|
222
|
+
if (step['trace_validation_mode'] !== undefined &&
|
|
223
|
+
step['trace_validation_mode'] !== 'warn' &&
|
|
224
|
+
step['trace_validation_mode'] !== 'enforce') {
|
|
225
|
+
errors.push(`Step '${stepName}': invalid trace_validation_mode '${String(step['trace_validation_mode'])}'; must be 'warn' or 'enforce'`);
|
|
226
|
+
}
|
|
227
|
+
if ('uses_service' in step && typeof step['uses_service'] === 'string') {
|
|
228
|
+
const services = doc['services'];
|
|
229
|
+
if (typeof services !== 'object' ||
|
|
230
|
+
services === null ||
|
|
231
|
+
!(step['uses_service'] in services)) {
|
|
232
|
+
errors.push(`Step '${stepName}': uses_service '${step['uses_service']}' is not defined in 'services'`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Validate retry: backoff must be a recognised value when present.
|
|
236
|
+
if (step['retry'] !== undefined) {
|
|
237
|
+
if (typeof step['retry'] !== 'object' || step['retry'] === null) {
|
|
238
|
+
errors.push(`Step '${stepName}': 'retry' must be an object`);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
const retry = step['retry'];
|
|
242
|
+
if ('backoff' in retry &&
|
|
243
|
+
retry['backoff'] !== 'fixed' &&
|
|
244
|
+
retry['backoff'] !== 'linear' &&
|
|
245
|
+
retry['backoff'] !== 'exponential') {
|
|
246
|
+
errors.push(`Step '${stepName}': 'retry.backoff' must be 'fixed', 'linear', or 'exponential'`);
|
|
247
|
+
}
|
|
248
|
+
if ('max_attempts' in retry &&
|
|
249
|
+
(!Number.isInteger(retry['max_attempts']) || retry['max_attempts'] < 1)) {
|
|
250
|
+
errors.push(`Step '${stepName}': 'retry.max_attempts' must be a positive integer`);
|
|
251
|
+
}
|
|
252
|
+
if ('base_delay_ms' in retry &&
|
|
253
|
+
(typeof retry['base_delay_ms'] !== 'number' || retry['base_delay_ms'] < 0)) {
|
|
254
|
+
errors.push(`Step '${stepName}': 'retry.base_delay_ms' must be a non-negative number`);
|
|
255
|
+
}
|
|
256
|
+
if ('max_delay_ms' in retry &&
|
|
257
|
+
(typeof retry['max_delay_ms'] !== 'number' || retry['max_delay_ms'] < 0)) {
|
|
258
|
+
errors.push(`Step '${stepName}': 'retry.max_delay_ms' must be a non-negative number`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if ('service_method' in step && !VALID_SERVICE_METHODS.has(step['service_method'])) {
|
|
263
|
+
errors.push(`Step '${stepName}': invalid service_method '${String(step['service_method'])}'; must be 'fetch', 'create', 'update', or 'delete'`);
|
|
264
|
+
}
|
|
265
|
+
// Validate input_map: only valid on execution: auto steps with uses_service.
|
|
266
|
+
if (step['input_map'] !== undefined) {
|
|
267
|
+
if (step['execution'] !== 'auto' || step['uses_service'] === undefined) {
|
|
268
|
+
errors.push(`Step '${stepName}': 'input_map' is only valid on execution: auto steps with uses_service`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Validate trigger_rule.
|
|
272
|
+
if ('trigger_rule' in step) {
|
|
273
|
+
if (!VALID_TRIGGER_RULES.has(step['trigger_rule'])) {
|
|
274
|
+
errors.push(`Step '${stepName}': invalid trigger_rule '${String(step['trigger_rule'])}'; must be one of ${[...VALID_TRIGGER_RULES].join(', ')}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Validate depends_on: must be an array of existing step names.
|
|
278
|
+
if ('depends_on' in step && step['depends_on'] !== undefined) {
|
|
279
|
+
if (!Array.isArray(step['depends_on'])) {
|
|
280
|
+
errors.push(`Step '${stepName}': 'depends_on' must be an array`);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
for (const dep of step['depends_on']) {
|
|
284
|
+
if (typeof dep !== 'string') {
|
|
285
|
+
errors.push(`Step '${stepName}': depends_on entries must be strings`);
|
|
286
|
+
}
|
|
287
|
+
else if (dep === stepName) {
|
|
288
|
+
errors.push(`Step '${stepName}': a step cannot depend on itself`);
|
|
289
|
+
}
|
|
290
|
+
else if (!(dep in stepsRaw)) {
|
|
291
|
+
errors.push(`Step '${stepName}': depends_on references unknown step '${dep}'`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Validate when: must be a non-empty string.
|
|
297
|
+
if ('when' in step && step['when'] !== undefined) {
|
|
298
|
+
if (typeof step['when'] !== 'string' || step['when'].trim() === '') {
|
|
299
|
+
errors.push(`Step '${stepName}': 'when' must be a non-empty string`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// Validate tools: only valid on execution: agent steps without handler.
|
|
303
|
+
if (step['tools'] !== undefined &&
|
|
304
|
+
(step['execution'] !== 'agent' || step['handler'] !== undefined)) {
|
|
305
|
+
errors.push(`Step '${stepName}': 'tools' is only valid on execution: agent steps without 'handler' defined`);
|
|
306
|
+
}
|
|
307
|
+
// Validate tools: requires input_schema.
|
|
308
|
+
if (step['tools'] !== undefined && step['input_schema'] === undefined) {
|
|
309
|
+
errors.push(`Step '${stepName}': 'tools' requires 'input_schema' to be defined — the agentic loop needs a schema for final output extraction`);
|
|
310
|
+
}
|
|
311
|
+
// Validate tools: entries must be in server_id:tool_name format.
|
|
312
|
+
if (step['tools'] !== undefined && Array.isArray(step['tools'])) {
|
|
313
|
+
for (const entry of step['tools']) {
|
|
314
|
+
if (!/^[^:]+:[^:]+$/.test(entry)) {
|
|
315
|
+
errors.push(`Step '${stepName}': tools entry '${entry}' must be in 'server_id:tool_name' format`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Validate tools: server_id must reference a defined mcp_server.
|
|
320
|
+
if (step['tools'] !== undefined &&
|
|
321
|
+
Array.isArray(step['tools']) &&
|
|
322
|
+
Array.isArray(doc['mcp_servers'])) {
|
|
323
|
+
const serverIds = new Set(doc['mcp_servers'].map((s) => s.id));
|
|
324
|
+
for (const entry of step['tools']) {
|
|
325
|
+
const serverId = entry.split(':')[0] ?? '';
|
|
326
|
+
if (!serverIds.has(serverId)) {
|
|
327
|
+
errors.push(`Step '${stepName}': tools entry '${entry}' references unknown MCP server '${serverId}'`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Validate max_tool_calls: must be a positive integer.
|
|
332
|
+
if (step['max_tool_calls'] !== undefined &&
|
|
333
|
+
(!Number.isInteger(step['max_tool_calls']) || step['max_tool_calls'] <= 0)) {
|
|
334
|
+
errors.push(`Step '${stepName}': 'max_tool_calls' must be a positive integer`);
|
|
335
|
+
}
|
|
336
|
+
// Validate tool_timeout: must be a positive integer.
|
|
337
|
+
if (step['tool_timeout'] !== undefined &&
|
|
338
|
+
(!Number.isInteger(step['tool_timeout']) || step['tool_timeout'] <= 0)) {
|
|
339
|
+
errors.push(`Step '${stepName}': 'tool_timeout' must be a positive integer`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Validate mcp_servers: ids must be unique (workflow-level check).
|
|
343
|
+
if (Array.isArray(doc['mcp_servers'])) {
|
|
344
|
+
const seen = new Set();
|
|
345
|
+
for (const server of doc['mcp_servers']) {
|
|
346
|
+
if (seen.has(server.id)) {
|
|
347
|
+
errors.push(`mcp_servers: duplicate server id '${server.id}'`);
|
|
348
|
+
}
|
|
349
|
+
seen.add(server.id);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// Validate services: rate_limit fields.
|
|
353
|
+
if (typeof doc['services'] === 'object' && doc['services'] !== null) {
|
|
354
|
+
for (const [serviceName, serviceRaw] of Object.entries(doc['services'])) {
|
|
355
|
+
if (typeof serviceRaw !== 'object' || serviceRaw === null)
|
|
356
|
+
continue;
|
|
357
|
+
const service = serviceRaw;
|
|
358
|
+
const rateLimit = service['rate_limit'];
|
|
359
|
+
if (rateLimit === undefined)
|
|
360
|
+
continue;
|
|
361
|
+
if (typeof rateLimit !== 'object' || rateLimit === null) {
|
|
362
|
+
errors.push(`Service '${serviceName}': 'rate_limit' must be an object`);
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
const rl = rateLimit;
|
|
366
|
+
if ('requests_per_second' in rl &&
|
|
367
|
+
(!Number.isInteger(rl['requests_per_second']) || rl['requests_per_second'] < 1)) {
|
|
368
|
+
errors.push(`Service '${serviceName}': 'rate_limit.requests_per_second' must be a positive integer (≥ 1)`);
|
|
369
|
+
}
|
|
370
|
+
if ('burst' in rl) {
|
|
371
|
+
if (!Number.isInteger(rl['burst']) || rl['burst'] < 1) {
|
|
372
|
+
errors.push(`Service '${serviceName}': 'rate_limit.burst' must be a positive integer (≥ 1)`);
|
|
373
|
+
}
|
|
374
|
+
if (!('requests_per_second' in rl)) {
|
|
375
|
+
errors.push(`Service '${serviceName}': 'rate_limit.burst' requires 'rate_limit.requests_per_second' to be set`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
if ('fallback_retry_seconds' in rl &&
|
|
379
|
+
(typeof rl['fallback_retry_seconds'] !== 'number' ||
|
|
380
|
+
rl['fallback_retry_seconds'] <= 0)) {
|
|
381
|
+
errors.push(`Service '${serviceName}': 'rate_limit.fallback_retry_seconds' must be a positive number (> 0)`);
|
|
382
|
+
}
|
|
383
|
+
if ('max_retry_seconds' in rl &&
|
|
384
|
+
(!Number.isInteger(rl['max_retry_seconds']) || rl['max_retry_seconds'] < 1)) {
|
|
385
|
+
errors.push(`Service '${serviceName}': 'rate_limit.max_retry_seconds' must be a positive integer (≥ 1)`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (errors.length > 0) {
|
|
390
|
+
throw new WorkflowError(`Invalid workflow: ${errors.join('; ')}`, {
|
|
391
|
+
code: 'VALIDATION_WORKFLOW_SCHEMA',
|
|
392
|
+
category: 'VALIDATION',
|
|
393
|
+
agentAction: 'report_to_user',
|
|
394
|
+
retryable: false,
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
// Step 4: Stamp schema version and return typed result
|
|
398
|
+
const definition = doc;
|
|
399
|
+
definition.schema_version = CURRENT_WORKFLOW_SCHEMA_VERSION;
|
|
400
|
+
return definition;
|
|
401
|
+
}
|
|
402
|
+
/** Returns true if any step in the raw steps map declares use_template. */
|
|
403
|
+
function hasUseTemplateInSteps(steps) {
|
|
404
|
+
if (typeof steps !== 'object' || steps === null)
|
|
405
|
+
return false;
|
|
406
|
+
return Object.values(steps).some((s) => typeof s === 'object' && s !== null && 'use_template' in s);
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=yaml-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-loader.js","sourceRoot":"","sources":["../../src/workflow/yaml-loader.ts"],"names":[],"mappings":"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"}
|