@acpus/core 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/LICENSE +21 -0
- package/README.md +7 -0
- package/dist/compiler.d.ts +4 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +526 -0
- package/dist/compiler.js.map +1 -0
- package/dist/diagnostics.d.ts +9 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +16 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/duration.d.ts +14 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +28 -0
- package/dist/duration.js.map +1 -0
- package/dist/expressions.d.ts +12 -0
- package/dist/expressions.d.ts.map +1 -0
- package/dist/expressions.js +108 -0
- package/dist/expressions.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/schedule.d.ts +3 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +21 -0
- package/dist/schedule.js.map +1 -0
- package/dist/schema/dsl.d.ts +34 -0
- package/dist/schema/dsl.d.ts.map +1 -0
- package/dist/schema/dsl.js +231 -0
- package/dist/schema/dsl.js.map +1 -0
- package/dist/schema/helpers.d.ts +24 -0
- package/dist/schema/helpers.d.ts.map +1 -0
- package/dist/schema/helpers.js +61 -0
- package/dist/schema/helpers.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema-validator.d.ts +29 -0
- package/dist/schema-validator.d.ts.map +1 -0
- package/dist/schema-validator.js +568 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-schema.d.ts +10 -0
- package/dist/workflow-schema.d.ts.map +1 -0
- package/dist/workflow-schema.js +380 -0
- package/dist/workflow-schema.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-based structural validation for Acpus workflow specs.
|
|
3
|
+
*
|
|
4
|
+
* Compiles WORKFLOW_SCHEMA with Ajv and maps validation errors to
|
|
5
|
+
* diagnostic codes used by the compiler. This handles:
|
|
6
|
+
* - Unknown fields (additionalProperties: false)
|
|
7
|
+
* - Type / enum / required constraints
|
|
8
|
+
* - if/then cross-field dependencies
|
|
9
|
+
* - oneOf step-kind dispatch
|
|
10
|
+
*
|
|
11
|
+
* Duration format validation and semantic checks (cross-references,
|
|
12
|
+
* DSL compilation) remain in the hand-written compiler code.
|
|
13
|
+
*/
|
|
14
|
+
import type { DiagnosticBag } from "./diagnostics.js";
|
|
15
|
+
/**
|
|
16
|
+
* Map Ajv validation errors to compiler diagnostics.
|
|
17
|
+
*
|
|
18
|
+
* Strategy:
|
|
19
|
+
* - `additionalProperties` → SPEC_SHAPE / AGENT_SHAPE / STEP_SHAPE based on path
|
|
20
|
+
* - `required` → specific code based on missingProperty
|
|
21
|
+
* - `enum` / `const` → specific code based on allowedValues context
|
|
22
|
+
* - Step-level oneOf failures: suppress structural oneOf/const errors that are
|
|
23
|
+
* artifacts of branch-matching; only report STEP_KIND if no specific
|
|
24
|
+
* property-level error can be extracted.
|
|
25
|
+
* - Sub-oneOf errors (timeout, cmd, fanout.over) are classified individually.
|
|
26
|
+
* - Everything else → SPEC_SHAPE as fallback
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateWithSchema(spec: unknown, diagnostics: DiagnosticBag): void;
|
|
29
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAStD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAKlF"}
|
|
@@ -0,0 +1,568 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-based structural validation for Acpus workflow specs.
|
|
3
|
+
*
|
|
4
|
+
* Compiles WORKFLOW_SCHEMA with Ajv and maps validation errors to
|
|
5
|
+
* diagnostic codes used by the compiler. This handles:
|
|
6
|
+
* - Unknown fields (additionalProperties: false)
|
|
7
|
+
* - Type / enum / required constraints
|
|
8
|
+
* - if/then cross-field dependencies
|
|
9
|
+
* - oneOf step-kind dispatch
|
|
10
|
+
*
|
|
11
|
+
* Duration format validation and semantic checks (cross-references,
|
|
12
|
+
* DSL compilation) remain in the hand-written compiler code.
|
|
13
|
+
*/
|
|
14
|
+
import { Ajv } from "ajv";
|
|
15
|
+
import { WORKFLOW_SCHEMA } from "./workflow-schema.js";
|
|
16
|
+
// ── Module-level Ajv singleton ──
|
|
17
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
18
|
+
const validate = ajv.compile(WORKFLOW_SCHEMA);
|
|
19
|
+
// ── Error mapping ──
|
|
20
|
+
/**
|
|
21
|
+
* Map Ajv validation errors to compiler diagnostics.
|
|
22
|
+
*
|
|
23
|
+
* Strategy:
|
|
24
|
+
* - `additionalProperties` → SPEC_SHAPE / AGENT_SHAPE / STEP_SHAPE based on path
|
|
25
|
+
* - `required` → specific code based on missingProperty
|
|
26
|
+
* - `enum` / `const` → specific code based on allowedValues context
|
|
27
|
+
* - Step-level oneOf failures: suppress structural oneOf/const errors that are
|
|
28
|
+
* artifacts of branch-matching; only report STEP_KIND if no specific
|
|
29
|
+
* property-level error can be extracted.
|
|
30
|
+
* - Sub-oneOf errors (timeout, cmd, fanout.over) are classified individually.
|
|
31
|
+
* - Everything else → SPEC_SHAPE as fallback
|
|
32
|
+
*/
|
|
33
|
+
export function validateWithSchema(spec, diagnostics) {
|
|
34
|
+
if (!validate(spec)) {
|
|
35
|
+
const errors = validate.errors ?? [];
|
|
36
|
+
mapErrors(errors, diagnostics);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function mapErrors(errors, diagnostics) {
|
|
40
|
+
// Identify step-level oneOf failures — these produce many noisy sub-errors
|
|
41
|
+
// because Ajv tries each branch and reports all mismatches.
|
|
42
|
+
const stepOneOfPaths = new Set();
|
|
43
|
+
for (const err of errors) {
|
|
44
|
+
if (err.keyword === "oneOf" && isStepPath(err.instancePath)) {
|
|
45
|
+
stepOneOfPaths.add(err.instancePath);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// For each step-level oneOf failure, try to extract specific property errors
|
|
49
|
+
// from the sub-errors. If we can, report those instead of STEP_KIND.
|
|
50
|
+
const reportedStepSubErrors = new Set(); // instancePath of reported sub-errors
|
|
51
|
+
for (const stepPath of stepOneOfPaths) {
|
|
52
|
+
// Include errors at the step level itself AND deeper sub-errors
|
|
53
|
+
const subErrors = errors.filter((err) => (err.instancePath === stepPath || err.instancePath.startsWith(stepPath + "/")) && err.keyword !== "oneOf");
|
|
54
|
+
// Collect all additionalProperties errors at the step level
|
|
55
|
+
const additionalPropErrors = subErrors.filter((err) => err.keyword === "additionalProperties" && err.instancePath === stepPath);
|
|
56
|
+
// If there are additionalProperties errors, find the "intended branch" and
|
|
57
|
+
// report only the truly unknown properties from it.
|
|
58
|
+
if (additionalPropErrors.length > 0) {
|
|
59
|
+
// Group additionalProperties by the property name and count how many
|
|
60
|
+
// branches reject each property.
|
|
61
|
+
const propRejectionCounts = new Map();
|
|
62
|
+
for (const err of additionalPropErrors) {
|
|
63
|
+
const prop = err.params.additionalProperty;
|
|
64
|
+
propRejectionCounts.set(prop, (propRejectionCounts.get(prop) ?? 0) + 1);
|
|
65
|
+
}
|
|
66
|
+
// Properties rejected by ALL branches are truly unknown in every context.
|
|
67
|
+
// Properties rejected by only SOME branches are actually known in the
|
|
68
|
+
// matching branch — the truly unknown ones are those rejected even by
|
|
69
|
+
// the branch that the user clearly intended.
|
|
70
|
+
// Heuristic: properties present in the data that are rejected by all branches
|
|
71
|
+
// are the truly unknown ones. We count how many branches there are from
|
|
72
|
+
// the total additionalProperties errors.
|
|
73
|
+
// Derive branch count from the schema so adding a new step kind
|
|
74
|
+
// doesn't require updating a magic number here.
|
|
75
|
+
const stepDef = WORKFLOW_SCHEMA.$defs.step;
|
|
76
|
+
const branchCount = stepDef.oneOf.length;
|
|
77
|
+
const trulyUnknown = [...propRejectionCounts.entries()]
|
|
78
|
+
.filter(([, count]) => count === branchCount) // rejected by ALL branches
|
|
79
|
+
.map(([prop]) => prop);
|
|
80
|
+
for (const prop of trulyUnknown) {
|
|
81
|
+
const key = `${stepPath}/additionalProperty/${prop}`;
|
|
82
|
+
if (!reportedStepSubErrors.has(key)) {
|
|
83
|
+
reportedStepSubErrors.add(key);
|
|
84
|
+
const path = toPath(stepPath);
|
|
85
|
+
diagnostics.error("STEP_SHAPE", `Unknown step property '${prop}'.`, path);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// If we found truly unknown properties, we're done for this step
|
|
89
|
+
if (trulyUnknown.length > 0) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Try to find classifiable sub-errors that represent real issues
|
|
94
|
+
// (not just structural mismatches from branch selection).
|
|
95
|
+
// Collect all classifiable sub-errors, deduplicated by instancePath,
|
|
96
|
+
// keeping the most specific classification per path.
|
|
97
|
+
const classifiableMap = new Map();
|
|
98
|
+
for (const sub of subErrors) {
|
|
99
|
+
const path = toPath(sub.instancePath);
|
|
100
|
+
const code = classifyError(sub, path);
|
|
101
|
+
// Structural artifacts from oneOf branch matching — skip these
|
|
102
|
+
if (code === "STEP_KIND")
|
|
103
|
+
continue;
|
|
104
|
+
// "if" keyword artifacts — skip
|
|
105
|
+
if (sub.keyword === "if")
|
|
106
|
+
continue;
|
|
107
|
+
// Skip additionalProperties from non-matching branches (handled above)
|
|
108
|
+
if (sub.keyword === "additionalProperties" && sub.instancePath === stepPath)
|
|
109
|
+
continue;
|
|
110
|
+
const message = formatMessage(sub, code, path);
|
|
111
|
+
// Specificity: prefer more specific codes over SPEC_SHAPE
|
|
112
|
+
const specificity = codeSpecificity(code);
|
|
113
|
+
const existing = classifiableMap.get(sub.instancePath);
|
|
114
|
+
if (!existing || specificity > existing.specificity) {
|
|
115
|
+
classifiableMap.set(sub.instancePath, { err: sub, code, path, message, specificity });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (classifiableMap.size > 0) {
|
|
119
|
+
// Report the most specific property errors instead of a vague STEP_KIND
|
|
120
|
+
for (const item of classifiableMap.values()) {
|
|
121
|
+
if (!reportedStepSubErrors.has(item.err.instancePath)) {
|
|
122
|
+
reportedStepSubErrors.add(item.err.instancePath);
|
|
123
|
+
diagnostics.error(item.code, item.message, item.path);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// No classifiable sub-error — step truly has no matching kind
|
|
129
|
+
diagnostics.error("STEP_KIND", "Step must define one of run: agent, run: program, parallel, fanout, switch, loop, guard, approval, subworkflow, or include.", toPath(stepPath));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Now process all remaining errors (non-step-oneOf sub-errors, and errors
|
|
133
|
+
// not under a step-level oneOf)
|
|
134
|
+
for (const err of errors) {
|
|
135
|
+
// Skip errors that are part of a step-level oneOf group (already handled)
|
|
136
|
+
if (stepOneOfPaths.size > 0 && isSubErrorOf(err.instancePath, stepOneOfPaths)) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
// Skip step-level oneOf errors themselves (already handled above)
|
|
140
|
+
if (err.keyword === "oneOf" && isStepPath(err.instancePath)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// Skip "if" keyword errors — these are artifacts of if/then evaluation
|
|
144
|
+
// and the "then" error is what's actually useful (or we handle required
|
|
145
|
+
// errors from the then clause directly).
|
|
146
|
+
if (err.keyword === "if")
|
|
147
|
+
continue;
|
|
148
|
+
const path = toPath(err.instancePath);
|
|
149
|
+
const code = classifyError(err, path);
|
|
150
|
+
const message = formatMessage(err, code, path);
|
|
151
|
+
diagnostics.error(code, message, path);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ── Error classification ──
|
|
155
|
+
function classifyError(err, path) {
|
|
156
|
+
switch (err.keyword) {
|
|
157
|
+
case "additionalProperties":
|
|
158
|
+
return classifyAdditionalProperties(err, path);
|
|
159
|
+
case "required": {
|
|
160
|
+
const missing = err.params.missingProperty;
|
|
161
|
+
return classifyRequired(missing, path);
|
|
162
|
+
}
|
|
163
|
+
case "enum":
|
|
164
|
+
return classifyEnum(err, path);
|
|
165
|
+
case "const":
|
|
166
|
+
return classifyConst(err, path);
|
|
167
|
+
case "type":
|
|
168
|
+
return classifyType(err, path);
|
|
169
|
+
case "minimum":
|
|
170
|
+
case "exclusiveMinimum":
|
|
171
|
+
return classifyMinimum(err, path);
|
|
172
|
+
case "dependencies":
|
|
173
|
+
case "dependentRequired":
|
|
174
|
+
// approval gate: `timeout` present requires `on_timeout`.
|
|
175
|
+
return pathContext(path) === "approval" ? "APPROVAL_ON_TIMEOUT" : "SPEC_SHAPE";
|
|
176
|
+
default:
|
|
177
|
+
return "SPEC_SHAPE";
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function classifyAdditionalProperties(err, path) {
|
|
181
|
+
const ctx = pathContext(path);
|
|
182
|
+
switch (ctx) {
|
|
183
|
+
case "agent":
|
|
184
|
+
return "AGENT_SHAPE";
|
|
185
|
+
case "step":
|
|
186
|
+
return "STEP_SHAPE";
|
|
187
|
+
case "fanout":
|
|
188
|
+
return "STEP_SHAPE";
|
|
189
|
+
case "switch-case":
|
|
190
|
+
return "STEP_SHAPE";
|
|
191
|
+
case "switch-spec":
|
|
192
|
+
return "STEP_SHAPE";
|
|
193
|
+
case "guard":
|
|
194
|
+
return "STEP_SHAPE";
|
|
195
|
+
case "approval":
|
|
196
|
+
return "STEP_SHAPE";
|
|
197
|
+
case "capture":
|
|
198
|
+
return "CAPTURE_SHAPE";
|
|
199
|
+
case "retry":
|
|
200
|
+
return "RETRY_SHAPE";
|
|
201
|
+
case "success-criteria":
|
|
202
|
+
return "FANOUT_SUCCESS_CRITERIA";
|
|
203
|
+
case "loop":
|
|
204
|
+
return "STEP_SHAPE";
|
|
205
|
+
case "workflow":
|
|
206
|
+
return "SPEC_SHAPE";
|
|
207
|
+
default:
|
|
208
|
+
return "SPEC_SHAPE";
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function classifyRequired(missing, path) {
|
|
212
|
+
const ctx = pathContext(path);
|
|
213
|
+
switch (missing) {
|
|
214
|
+
case "id":
|
|
215
|
+
return "STEP_ID";
|
|
216
|
+
case "use":
|
|
217
|
+
return "AGENT_SHAPE";
|
|
218
|
+
case "prompt":
|
|
219
|
+
if (ctx === "approval")
|
|
220
|
+
return "APPROVAL_PROMPT";
|
|
221
|
+
return "AGENT_PROMPT";
|
|
222
|
+
case "over":
|
|
223
|
+
return "FANOUT_OVER";
|
|
224
|
+
case "do":
|
|
225
|
+
return "FANOUT_DO";
|
|
226
|
+
case "quorum":
|
|
227
|
+
return "FANOUT_QUORUM";
|
|
228
|
+
case "cmd":
|
|
229
|
+
return "PROGRAM_CMD";
|
|
230
|
+
case "from":
|
|
231
|
+
return "CAPTURE_FROM";
|
|
232
|
+
case "parse":
|
|
233
|
+
return "CAPTURE_PARSE";
|
|
234
|
+
case "path":
|
|
235
|
+
return "CAPTURE_PATH";
|
|
236
|
+
case "timeout":
|
|
237
|
+
if (ctx === "approval")
|
|
238
|
+
return "APPROVAL_TIMEOUT";
|
|
239
|
+
return "STEP_TIMEOUT";
|
|
240
|
+
case "on_timeout":
|
|
241
|
+
return "APPROVAL_ON_TIMEOUT";
|
|
242
|
+
case "max_iterations":
|
|
243
|
+
return "LOOP_MAX_ITERATIONS";
|
|
244
|
+
case "when":
|
|
245
|
+
return ctx === "guard" ? "GUARD_WHEN" : "SPEC_SHAPE";
|
|
246
|
+
case "then":
|
|
247
|
+
case "else":
|
|
248
|
+
return ctx === "guard" ? "GUARD_ACTION" : "SPEC_SHAPE";
|
|
249
|
+
case "max":
|
|
250
|
+
return "RETRY_SHAPE";
|
|
251
|
+
case "steps":
|
|
252
|
+
return "SPEC_SHAPE";
|
|
253
|
+
case "version":
|
|
254
|
+
case "name":
|
|
255
|
+
case "workflow":
|
|
256
|
+
return "SPEC_SHAPE";
|
|
257
|
+
default:
|
|
258
|
+
return "SPEC_SHAPE";
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
function classifyEnum(err, path) {
|
|
262
|
+
const allowedValues = err.params.allowedValues;
|
|
263
|
+
// version enum
|
|
264
|
+
if (allowedValues.length === 1 && allowedValues[0] === 1) {
|
|
265
|
+
return "SPEC_VERSION";
|
|
266
|
+
}
|
|
267
|
+
// agent type enum
|
|
268
|
+
if (setsEqual(allowedValues, ["builtin", "command"])) {
|
|
269
|
+
return "AGENT_SHAPE";
|
|
270
|
+
}
|
|
271
|
+
// on_error enum
|
|
272
|
+
if (setsEqual(allowedValues, ["fail", "retry", "skip"])) {
|
|
273
|
+
return "STEP_ON_ERROR";
|
|
274
|
+
}
|
|
275
|
+
// on_timeout enum
|
|
276
|
+
if (setsEqual(allowedValues, ["fail", "escalate", "approve", "reject"])) {
|
|
277
|
+
return "APPROVAL_ON_TIMEOUT";
|
|
278
|
+
}
|
|
279
|
+
// join enum (parallel: all, race)
|
|
280
|
+
if (setsEqual(allowedValues, ["all", "race"])) {
|
|
281
|
+
return "JOIN_VALUE";
|
|
282
|
+
}
|
|
283
|
+
// join enum (fanout: all, race, quorum)
|
|
284
|
+
if (setsEqual(allowedValues, ["all", "race", "quorum"])) {
|
|
285
|
+
return "JOIN_VALUE";
|
|
286
|
+
}
|
|
287
|
+
// capture.from enum
|
|
288
|
+
if (setsEqual(allowedValues, ["stdout", "file"])) {
|
|
289
|
+
return "CAPTURE_FROM";
|
|
290
|
+
}
|
|
291
|
+
// capture.parse enum
|
|
292
|
+
if (setsEqual(allowedValues, ["json", "text"])) {
|
|
293
|
+
return "CAPTURE_PARSE";
|
|
294
|
+
}
|
|
295
|
+
// guard action enum
|
|
296
|
+
if (setsEqual(allowedValues, ["continue", "fail", "complete"])) {
|
|
297
|
+
return "GUARD_ACTION";
|
|
298
|
+
}
|
|
299
|
+
return "SPEC_SHAPE";
|
|
300
|
+
}
|
|
301
|
+
function classifyConst(err, _path) {
|
|
302
|
+
// run: "agent" or run: "program" const — these are artifacts of oneOf
|
|
303
|
+
// branch matching and don't represent real user errors by themselves.
|
|
304
|
+
return "STEP_KIND";
|
|
305
|
+
}
|
|
306
|
+
function classifyType(err, path) {
|
|
307
|
+
const ctx = pathContext(path);
|
|
308
|
+
// Step id type error
|
|
309
|
+
if (path.endsWith(".id")) {
|
|
310
|
+
return "STEP_ID";
|
|
311
|
+
}
|
|
312
|
+
// on_error type error (e.g. null instead of string)
|
|
313
|
+
if (/\.on_error$/.test(path)) {
|
|
314
|
+
return "STEP_ON_ERROR";
|
|
315
|
+
}
|
|
316
|
+
// timeout type error in step context
|
|
317
|
+
if (/\.timeout$/.test(path) && ctx === "step") {
|
|
318
|
+
return "STEP_TIMEOUT";
|
|
319
|
+
}
|
|
320
|
+
// capture type error (not an object)
|
|
321
|
+
if (/\.capture$/.test(path)) {
|
|
322
|
+
return "CAPTURE_SHAPE";
|
|
323
|
+
}
|
|
324
|
+
// fanout.over type error (not string, not array)
|
|
325
|
+
if (/\.fanout\.over$/.test(path)) {
|
|
326
|
+
return "FANOUT_OVER_TYPE";
|
|
327
|
+
}
|
|
328
|
+
if (/\.guard\.when$/.test(path)) {
|
|
329
|
+
return "GUARD_WHEN_TYPE";
|
|
330
|
+
}
|
|
331
|
+
if (/\.guard\.message$/.test(path)) {
|
|
332
|
+
return "GUARD_MESSAGE";
|
|
333
|
+
}
|
|
334
|
+
// Agent type errors
|
|
335
|
+
if (ctx === "agent") {
|
|
336
|
+
return "AGENT_SHAPE";
|
|
337
|
+
}
|
|
338
|
+
// Output type error
|
|
339
|
+
if (path.endsWith(".output")) {
|
|
340
|
+
return "OUTPUT_SHAPE";
|
|
341
|
+
}
|
|
342
|
+
return "SPEC_SHAPE";
|
|
343
|
+
}
|
|
344
|
+
function classifyMinimum(err, path) {
|
|
345
|
+
// retry.max minimum violation
|
|
346
|
+
if (/\.retry\.max$/.test(path)) {
|
|
347
|
+
return "RETRY_SHAPE";
|
|
348
|
+
}
|
|
349
|
+
// fanout success_criteria min_success minimum violation
|
|
350
|
+
if (/\.success_criteria\.min_success$/.test(path)) {
|
|
351
|
+
return "FANOUT_SUCCESS_CRITERIA";
|
|
352
|
+
}
|
|
353
|
+
// timeout exclusiveMinimum violation (negative number)
|
|
354
|
+
if (/\.timeout$/.test(path)) {
|
|
355
|
+
return "STEP_TIMEOUT";
|
|
356
|
+
}
|
|
357
|
+
return "SPEC_SHAPE";
|
|
358
|
+
}
|
|
359
|
+
function formatMessage(err, code, path) {
|
|
360
|
+
switch (err.keyword) {
|
|
361
|
+
case "additionalProperties": {
|
|
362
|
+
const additionalProp = err.params.additionalProperty;
|
|
363
|
+
const ctx = pathContext(path);
|
|
364
|
+
if (ctx === "agent") {
|
|
365
|
+
return `Unknown agent property '${additionalProp}'.`;
|
|
366
|
+
}
|
|
367
|
+
if (ctx === "step") {
|
|
368
|
+
return `Unknown step property '${additionalProp}'.`;
|
|
369
|
+
}
|
|
370
|
+
if (ctx === "capture") {
|
|
371
|
+
return `Unknown capture property '${additionalProp}'.`;
|
|
372
|
+
}
|
|
373
|
+
if (ctx === "retry") {
|
|
374
|
+
return `Unknown retry property '${additionalProp}'.`;
|
|
375
|
+
}
|
|
376
|
+
return `Unknown property '${additionalProp}'.`;
|
|
377
|
+
}
|
|
378
|
+
case "required": {
|
|
379
|
+
const missing = err.params.missingProperty;
|
|
380
|
+
return formatRequiredMessage(missing, code, path);
|
|
381
|
+
}
|
|
382
|
+
case "enum": {
|
|
383
|
+
const allowed = err.params.allowedValues;
|
|
384
|
+
return `Must be one of ${allowed.join(", ")}.`;
|
|
385
|
+
}
|
|
386
|
+
case "const": {
|
|
387
|
+
const value = err.params.allowedValue;
|
|
388
|
+
return `Must be ${JSON.stringify(value)}.`;
|
|
389
|
+
}
|
|
390
|
+
case "type": {
|
|
391
|
+
const expected = err.params ? err.params.type : "unknown";
|
|
392
|
+
return formatTypeMessage(code, path, expected);
|
|
393
|
+
}
|
|
394
|
+
case "minimum":
|
|
395
|
+
case "exclusiveMinimum": {
|
|
396
|
+
return formatMinimumMessage(code, path);
|
|
397
|
+
}
|
|
398
|
+
default:
|
|
399
|
+
return err.message ?? "Schema validation error.";
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
function formatRequiredMessage(missing, code, _path) {
|
|
403
|
+
switch (code) {
|
|
404
|
+
case "SPEC_VERSION":
|
|
405
|
+
return "Only DSL version 1 is supported.";
|
|
406
|
+
case "STEP_ID":
|
|
407
|
+
return "Every workflow step must define a non-empty string id.";
|
|
408
|
+
case "AGENT_SHAPE":
|
|
409
|
+
return "Agent definition (type builtin/command) must define a non-empty use.";
|
|
410
|
+
case "AGENT_PROMPT":
|
|
411
|
+
return "run: agent steps must define a prompt string.";
|
|
412
|
+
case "PROGRAM_CMD":
|
|
413
|
+
return "run: program steps must define cmd as a string or array.";
|
|
414
|
+
case "FANOUT_OVER":
|
|
415
|
+
return "fanout.over is required.";
|
|
416
|
+
case "FANOUT_DO":
|
|
417
|
+
return "fanout.do must be an array of steps.";
|
|
418
|
+
case "FANOUT_QUORUM":
|
|
419
|
+
return "fanout.quorum must be a positive integer when join is quorum.";
|
|
420
|
+
case "CAPTURE_FROM":
|
|
421
|
+
return "run: program capture.from must be stdout or file.";
|
|
422
|
+
case "CAPTURE_PARSE":
|
|
423
|
+
return "run: program capture.parse must be json or text.";
|
|
424
|
+
case "CAPTURE_PATH":
|
|
425
|
+
return "run: program capture.path must be a string when capture.from is file.";
|
|
426
|
+
case "APPROVAL_PROMPT":
|
|
427
|
+
return "approval.prompt must be a string.";
|
|
428
|
+
case "APPROVAL_TIMEOUT":
|
|
429
|
+
return "approval.timeout must be a duration string.";
|
|
430
|
+
case "APPROVAL_ON_TIMEOUT":
|
|
431
|
+
return "approval.on_timeout must be fail, escalate, approve, or reject.";
|
|
432
|
+
case "LOOP_MAX_ITERATIONS":
|
|
433
|
+
return "loop.max_iterations must be a number.";
|
|
434
|
+
case "GUARD_WHEN":
|
|
435
|
+
return "guard.when is required.";
|
|
436
|
+
case "GUARD_ACTION":
|
|
437
|
+
return "guard.then and guard.else must be one of continue, fail, or complete.";
|
|
438
|
+
case "RETRY_SHAPE":
|
|
439
|
+
return "retry.max must be a non-negative integer.";
|
|
440
|
+
default:
|
|
441
|
+
return `Missing required property '${missing}'.`;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function formatTypeMessage(code, path, expectedType) {
|
|
445
|
+
switch (code) {
|
|
446
|
+
case "STEP_ON_ERROR":
|
|
447
|
+
return `step.on_error must be a string, one of fail, retry, skip.`;
|
|
448
|
+
case "STEP_TIMEOUT":
|
|
449
|
+
return `step.timeout must be a duration string or number (ms).`;
|
|
450
|
+
case "CAPTURE_SHAPE":
|
|
451
|
+
return `run: program capture must be an object when present.`;
|
|
452
|
+
case "OUTPUT_SHAPE":
|
|
453
|
+
if (path.includes("agent")) {
|
|
454
|
+
return `run: agent output must be an object when present.`;
|
|
455
|
+
}
|
|
456
|
+
return `run: program output must be an object when present.`;
|
|
457
|
+
case "FANOUT_OVER_TYPE":
|
|
458
|
+
return `fanout.over must be an array or CEL expression string.`;
|
|
459
|
+
case "GUARD_WHEN_TYPE":
|
|
460
|
+
return `guard.when must be a boolean or CEL expression string.`;
|
|
461
|
+
case "GUARD_MESSAGE":
|
|
462
|
+
return `guard.message must be a string template.`;
|
|
463
|
+
default:
|
|
464
|
+
return `Must be of type ${expectedType}.`;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
function formatMinimumMessage(code, _path) {
|
|
468
|
+
switch (code) {
|
|
469
|
+
case "RETRY_SHAPE":
|
|
470
|
+
return "retry.max must be a non-negative integer.";
|
|
471
|
+
case "FANOUT_SUCCESS_CRITERIA":
|
|
472
|
+
return "fanout.success_criteria.min_success must be a positive integer.";
|
|
473
|
+
case "STEP_TIMEOUT":
|
|
474
|
+
return "step.timeout number must be positive (milliseconds).";
|
|
475
|
+
default:
|
|
476
|
+
return "Value must be a positive integer.";
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// ── Path utilities ──
|
|
480
|
+
/** Higher specificity = more precise code. SPEC_SHAPE is the most generic. */
|
|
481
|
+
function codeSpecificity(code) {
|
|
482
|
+
if (code === "SPEC_SHAPE")
|
|
483
|
+
return 0;
|
|
484
|
+
if (code === "STEP_SHAPE" || code === "AGENT_SHAPE")
|
|
485
|
+
return 1;
|
|
486
|
+
return 2; // All specific codes (STEP_TIMEOUT, STEP_ON_ERROR, etc.)
|
|
487
|
+
}
|
|
488
|
+
/** Convert Ajv instancePath ("/workflow/steps/0/run") to $-path ("$.workflow.steps[0].run") */
|
|
489
|
+
function toPath(instancePath) {
|
|
490
|
+
if (!instancePath)
|
|
491
|
+
return "$";
|
|
492
|
+
// Split on "/" and convert array indices
|
|
493
|
+
const parts = instancePath.split("/").filter(Boolean);
|
|
494
|
+
let result = "$";
|
|
495
|
+
for (const part of parts) {
|
|
496
|
+
if (/^\d+$/.test(part)) {
|
|
497
|
+
result += `[${part}]`;
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
result += `.${part}`;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return result;
|
|
504
|
+
}
|
|
505
|
+
/** Determine the semantic context of a path for error classification. */
|
|
506
|
+
function pathContext(path) {
|
|
507
|
+
// Match patterns like $.agents.xxx or $.workflow.steps[n].fanout etc.
|
|
508
|
+
if (/\.agents\.[^.]+$/.test(path) || /\.agents\.[^.]+\./.test(path)) {
|
|
509
|
+
return "agent";
|
|
510
|
+
}
|
|
511
|
+
if (/\.fanout\b/.test(path)) {
|
|
512
|
+
if (/\.fanout\.success_criteria/.test(path))
|
|
513
|
+
return "success-criteria";
|
|
514
|
+
return "fanout";
|
|
515
|
+
}
|
|
516
|
+
if (/\.approval\b/.test(path)) {
|
|
517
|
+
return "approval";
|
|
518
|
+
}
|
|
519
|
+
if (/\.capture\b/.test(path)) {
|
|
520
|
+
return "capture";
|
|
521
|
+
}
|
|
522
|
+
if (/\.retry\b/.test(path)) {
|
|
523
|
+
return "retry";
|
|
524
|
+
}
|
|
525
|
+
if (/\.switch\b/.test(path) && /\.cases\[\d+\]$/.test(path)) {
|
|
526
|
+
return "switch-case";
|
|
527
|
+
}
|
|
528
|
+
if (/\.switch\b/.test(path)) {
|
|
529
|
+
return "switch-spec";
|
|
530
|
+
}
|
|
531
|
+
if (/\.guard\b/.test(path)) {
|
|
532
|
+
return "guard";
|
|
533
|
+
}
|
|
534
|
+
if (/\.loop\b/.test(path)) {
|
|
535
|
+
return "loop";
|
|
536
|
+
}
|
|
537
|
+
if (/\.workflow\b/.test(path)) {
|
|
538
|
+
return "workflow";
|
|
539
|
+
}
|
|
540
|
+
if (/\.steps\[\d+\]/.test(path)) {
|
|
541
|
+
return "step";
|
|
542
|
+
}
|
|
543
|
+
return "top";
|
|
544
|
+
}
|
|
545
|
+
/** Check if an instancePath looks like a step (direct child of steps array). */
|
|
546
|
+
function isStepPath(instancePath) {
|
|
547
|
+
// /workflow/steps/N — exactly one index deep under steps
|
|
548
|
+
const match = instancePath.match(/^\/workflow\/steps\/\d+$/);
|
|
549
|
+
return match !== null;
|
|
550
|
+
}
|
|
551
|
+
/** Check if errPath is a sub-path of any of the given parent paths. */
|
|
552
|
+
function isSubErrorOf(errPath, parentPaths) {
|
|
553
|
+
for (const parent of parentPaths) {
|
|
554
|
+
if (errPath === parent || errPath.startsWith(parent + "/")) {
|
|
555
|
+
return true;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
/** Set equality check for enum classification. */
|
|
561
|
+
function setsEqual(a, b) {
|
|
562
|
+
if (a.length !== b.length)
|
|
563
|
+
return false;
|
|
564
|
+
const sortedA = [...a].sort();
|
|
565
|
+
const sortedB = [...b].sort();
|
|
566
|
+
return sortedA.every((v, i) => v === sortedB[i]);
|
|
567
|
+
}
|
|
568
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"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"}
|