@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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/compiler.d.ts +4 -0
  4. package/dist/compiler.d.ts.map +1 -0
  5. package/dist/compiler.js +526 -0
  6. package/dist/compiler.js.map +1 -0
  7. package/dist/diagnostics.d.ts +9 -0
  8. package/dist/diagnostics.d.ts.map +1 -0
  9. package/dist/diagnostics.js +16 -0
  10. package/dist/diagnostics.js.map +1 -0
  11. package/dist/duration.d.ts +14 -0
  12. package/dist/duration.d.ts.map +1 -0
  13. package/dist/duration.js +28 -0
  14. package/dist/duration.js.map +1 -0
  15. package/dist/expressions.d.ts +12 -0
  16. package/dist/expressions.d.ts.map +1 -0
  17. package/dist/expressions.js +108 -0
  18. package/dist/expressions.js.map +1 -0
  19. package/dist/index.d.ts +11 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/schedule.d.ts +3 -0
  24. package/dist/schedule.d.ts.map +1 -0
  25. package/dist/schedule.js +21 -0
  26. package/dist/schedule.js.map +1 -0
  27. package/dist/schema/dsl.d.ts +34 -0
  28. package/dist/schema/dsl.d.ts.map +1 -0
  29. package/dist/schema/dsl.js +231 -0
  30. package/dist/schema/dsl.js.map +1 -0
  31. package/dist/schema/helpers.d.ts +24 -0
  32. package/dist/schema/helpers.d.ts.map +1 -0
  33. package/dist/schema/helpers.js +61 -0
  34. package/dist/schema/helpers.js.map +1 -0
  35. package/dist/schema/index.d.ts +3 -0
  36. package/dist/schema/index.d.ts.map +1 -0
  37. package/dist/schema/index.js +3 -0
  38. package/dist/schema/index.js.map +1 -0
  39. package/dist/schema-validator.d.ts +29 -0
  40. package/dist/schema-validator.d.ts.map +1 -0
  41. package/dist/schema-validator.js +568 -0
  42. package/dist/schema-validator.js.map +1 -0
  43. package/dist/types.d.ts +120 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +2 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/workflow-schema.d.ts +10 -0
  48. package/dist/workflow-schema.d.ts.map +1 -0
  49. package/dist/workflow-schema.js +380 -0
  50. package/dist/workflow-schema.js.map +1 -0
  51. package/package.json +59 -0
@@ -0,0 +1,28 @@
1
+ import ms from "ms";
2
+ /**
3
+ * Parse a duration string (e.g. "30s", "5m", "1h", "500ms") into milliseconds.
4
+ * Returns 0 for undefined input. By default returns 0 for invalid input;
5
+ * set `{ strict: true }` to throw instead.
6
+ *
7
+ * Only supports ms/s/m/h units (delegates arithmetic to the `ms` library
8
+ * but rejects formats like "2 days" that `ms` would accept).
9
+ */
10
+ export function parseDurationMs(value, options) {
11
+ if (value === undefined)
12
+ return 0;
13
+ const trimmed = value.trim();
14
+ const match = /^(\d+)(ms|s|m|h)?$/.exec(trimmed);
15
+ if (!match) {
16
+ if (options?.strict)
17
+ throw new Error(`Invalid duration '${value}'. Use ms, s, m, or h.`);
18
+ return 0;
19
+ }
20
+ const result = ms(trimmed);
21
+ if (Number.isNaN(result)) {
22
+ if (options?.strict)
23
+ throw new Error(`Invalid duration '${value}'. Use ms, s, m, or h.`);
24
+ return 0;
25
+ }
26
+ return result;
27
+ }
28
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAOpB;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAyB,EAAE,OAA8B;IACvF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,wBAAwB,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAyB,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,wBAAwB,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DiagnosticBag } from "./diagnostics.js";
2
+ import type { IrExpression } from "./types.js";
3
+ export declare const EXPRESSION_PATTERN: RegExp;
4
+ export declare const ALLOWED_ROOTS: Set<string>;
5
+ export declare const ALLOWED_FUNCTIONS: Set<string>;
6
+ export interface ExpressionCollector {
7
+ expressions: IrExpression[];
8
+ visit(value: unknown, path: string): void;
9
+ }
10
+ export declare function createExpressionCollector(diagnostics: DiagnosticBag, knownStepIds: Set<string>, stepKinds: Map<string, string>): ExpressionCollector;
11
+ export declare function toCelParseSource(source: string): string;
12
+ //# sourceMappingURL=expressions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../src/expressions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,kBAAkB,QAAgC,CAAC;AAahE,eAAO,MAAM,aAAa,aAAiF,CAAC;AAC5G,eAAO,MAAM,iBAAiB,aAA+D,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAoFpJ;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,108 @@
1
+ import { parse as parseCel } from "@marcbachmann/cel-js";
2
+ export const EXPRESSION_PATTERN = /\$\{\{\s*([\s\S]*?)\s*\}\}/g;
3
+ /** Fields that are evaluated as raw CEL (evaluateExpression), not templates.
4
+ * Using ${{ }} in these fields causes a runtime CEL parse error. */
5
+ const RAW_CEL_FIELDS = new Set(["over", "until", "when"]);
6
+ const STEP_REFERENCE_PATTERN = /\bsteps\.([A-Za-z_][A-Za-z0-9_-]*)\b/g;
7
+ const STEP_PATH_PATTERN = /\bsteps\.([A-Za-z_][A-Za-z0-9_-]*)((?:\.[A-Za-z_][A-Za-z0-9_]*|\[\d+\])*)/g;
8
+ const ROOT_REFERENCE_PATTERN = /(?<![\w.])([A-Za-z_][A-Za-z0-9_]*)\s*(?:\.|\()/g;
9
+ /** Step kinds that are composite (no .output envelope on the step itself). */
10
+ const COMPOSITE_KINDS = new Set(["parallel", "fanout", "loop", "switch", "subworkflow"]);
11
+ export const ALLOWED_ROOTS = new Set(["input", "steps", "loop", "item", "item_id", "item_index", "run_id"]);
12
+ export const ALLOWED_FUNCTIONS = new Set(["now", "len", "startsWith", "matches", "coalesce"]);
13
+ export function createExpressionCollector(diagnostics, knownStepIds, stepKinds) {
14
+ const expressions = [];
15
+ function collectFromString(value, path) {
16
+ const fieldName = path.split(".").pop() ?? "";
17
+ // Warn if ${{ }} appears in a raw-CEL field
18
+ if (RAW_CEL_FIELDS.has(fieldName) && EXPRESSION_PATTERN.test(value)) {
19
+ diagnostics.warning("EXPR_TEMPLATE_IN_CEL", `Field '${fieldName}' is evaluated as raw CEL — remove ${{}} wrappers or the expression will fail at runtime.`, path);
20
+ }
21
+ // Reset regex lastIndex after test() calls above (test() with /g advances it)
22
+ EXPRESSION_PATTERN.lastIndex = 0;
23
+ for (const match of value.matchAll(EXPRESSION_PATTERN)) {
24
+ const source = match[1]?.trim() ?? "";
25
+ if (source.length === 0) {
26
+ diagnostics.error("EXPR_EMPTY", "Expression cannot be empty.", path);
27
+ continue;
28
+ }
29
+ try {
30
+ parseCel(toCelParseSource(source));
31
+ }
32
+ catch (error) {
33
+ diagnostics.error("EXPR_PARSE", `Invalid CEL expression: ${errorMessage(error)}`, path);
34
+ }
35
+ const references = [...source.matchAll(STEP_REFERENCE_PATTERN)].map((reference) => reference[1]);
36
+ for (const reference of references) {
37
+ if (!knownStepIds.has(reference)) {
38
+ diagnostics.error("EXPR_UNKNOWN_STEP", `Expression references unknown step '${reference}'.`, path);
39
+ }
40
+ }
41
+ // Check for .output access on composite nodes (parallel, fanout, loop, switch, subworkflow)
42
+ for (const pathMatch of source.matchAll(STEP_PATH_PATTERN)) {
43
+ const stepId = pathMatch[1];
44
+ const pathChain = pathMatch[2] ?? "";
45
+ if (!pathChain.startsWith(".output"))
46
+ continue;
47
+ const kind = stepKinds.get(stepId);
48
+ if (!kind || !COMPOSITE_KINDS.has(kind))
49
+ continue;
50
+ diagnostics.error("EXPR_COMPOSITE_OUTPUT", compositeOutputHint(stepId, kind), path);
51
+ }
52
+ for (const root of source.matchAll(ROOT_REFERENCE_PATTERN)) {
53
+ const name = root[1];
54
+ if (name === "json" || name === "hash") {
55
+ continue;
56
+ }
57
+ if (!ALLOWED_ROOTS.has(name) && !ALLOWED_FUNCTIONS.has(name)) {
58
+ diagnostics.warning("EXPR_UNKNOWN_ROOT", `Expression root '${name}' is not part of the M1 DSL context.`, path);
59
+ }
60
+ }
61
+ expressions.push({
62
+ id: `expr_${expressions.length + 1}`,
63
+ source,
64
+ path,
65
+ references
66
+ });
67
+ }
68
+ }
69
+ function visit(value, path) {
70
+ if (typeof value === "string") {
71
+ collectFromString(value, path);
72
+ return;
73
+ }
74
+ if (Array.isArray(value)) {
75
+ value.forEach((item, index) => visit(item, `${path}[${index}]`));
76
+ return;
77
+ }
78
+ if (isRecord(value)) {
79
+ for (const [key, child] of Object.entries(value)) {
80
+ visit(child, `${path}.${key}`);
81
+ }
82
+ }
83
+ }
84
+ return { expressions, visit };
85
+ }
86
+ function errorMessage(error) {
87
+ return error instanceof Error ? error.message : String(error);
88
+ }
89
+ export function toCelParseSource(source) {
90
+ return source.replace(/\bloop\./g, "loop_ctx.");
91
+ }
92
+ function isRecord(value) {
93
+ return typeof value === "object" && value !== null;
94
+ }
95
+ function compositeOutputHint(stepId, kind) {
96
+ if (kind === "fanout") {
97
+ return `Step '${stepId}' is a fanout node — its output is an array. Use steps.${stepId}[<index>].output.<field> to access a specific lane instead of steps.${stepId}.output.`;
98
+ }
99
+ if (kind === "parallel") {
100
+ return `Step '${stepId}' is a ${kind} node — use steps.${stepId}.<child_id>.output.<field> instead of steps.${stepId}.output.`;
101
+ }
102
+ if (kind === "subworkflow") {
103
+ return `Step '${stepId}' is a ${kind} node — its output does not have an '.output' envelope. Access its fields directly as steps.${stepId}.<field>.`;
104
+ }
105
+ // loop, switch
106
+ return `Step '${stepId}' is a ${kind} node — its output does not have an '.output' envelope.`;
107
+ }
108
+ //# sourceMappingURL=expressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.js","sourceRoot":"","sources":["../src/expressions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { DiagnosticBag } from "./diagnostics.js";
2
+ export { compileWorkflow, lintWorkflow } from "./compiler.js";
3
+ export { createSchedule } from "./schedule.js";
4
+ export { compileSchemaDsl } from "./schema/index.js";
5
+ export type { CompileSchemaDslResult, SchemaDslError, CompileSchemaDslOptions } from "./schema/index.js";
6
+ export { EXPRESSION_PATTERN, ALLOWED_ROOTS, ALLOWED_FUNCTIONS, toCelParseSource, createExpressionCollector } from "./expressions.js";
7
+ export type { ExpressionCollector } from "./expressions.js";
8
+ export { parseDurationMs } from "./duration.js";
9
+ export type { ParseDurationOptions } from "./duration.js";
10
+ export type { AcpusIr, AgentSpec, CompileOptions, CompileResult, Diagnostic, DiagnosticSeverity, IrBranch, IrExpression, IrNode, IrNodeKind, LintResult, NodeKeyTemplate, OutputMerge, ScheduleNode, ScheduleSummary, WorkflowSpec, WorkflowStep } from "./types.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,UAAU,EACV,UAAU,EACV,eAAe,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { DiagnosticBag } from "./diagnostics.js";
2
+ export { compileWorkflow, lintWorkflow } from "./compiler.js";
3
+ export { createSchedule } from "./schedule.js";
4
+ export { compileSchemaDsl } from "./schema/index.js";
5
+ export { EXPRESSION_PATTERN, ALLOWED_ROOTS, ALLOWED_FUNCTIONS, toCelParseSource, createExpressionCollector } from "./expressions.js";
6
+ export { parseDurationMs } from "./duration.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AcpusIr, ScheduleSummary } from "./types.js";
2
+ export declare function createSchedule(ir: AcpusIr): ScheduleSummary;
3
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAwB,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjF,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,eAAe,CAK3D"}
@@ -0,0 +1,21 @@
1
+ export function createSchedule(ir) {
2
+ return {
3
+ workflow: ir.name,
4
+ nodes: ir.root.children?.map(toScheduleNode) ?? []
5
+ };
6
+ }
7
+ function toScheduleNode(node) {
8
+ return {
9
+ id: node.id,
10
+ kind: node.kind,
11
+ nodePath: node.nodePath.join("/"),
12
+ outputMerge: node.outputMerge,
13
+ children: node.children?.map(toScheduleNode),
14
+ branches: node.branches?.map((branch) => ({
15
+ id: branch.id,
16
+ when: branch.when,
17
+ children: branch.children.map(toScheduleNode)
18
+ }))
19
+ };
20
+ }
21
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,EAAW;IACxC,OAAO;QACL,QAAQ,EAAE,EAAE,CAAC,IAAI;QACjB,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC;QAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxC,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;SAC9C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Acpus recursive schema DSL compiler.
3
+ *
4
+ * User-facing YAML examples:
5
+ *
6
+ * ok: boolean
7
+ * summary?: string
8
+ * issues:
9
+ * - description: string
10
+ * severity?: string
11
+ * metadata:
12
+ * title: string
13
+ *
14
+ * The compiler emits JSON Schema for IR/runtime validation. The user-facing
15
+ * DSL is intentionally smaller than JSON Schema and rejects unsupported
16
+ * object-form schema keys rather than silently ignoring them.
17
+ */
18
+ export interface SchemaDslError {
19
+ field: string;
20
+ message: string;
21
+ }
22
+ export interface CompileSchemaDslResult {
23
+ schema: Record<string, unknown>;
24
+ errors: SchemaDslError[];
25
+ }
26
+ export interface CompileSchemaDslOptions {
27
+ /** When true, emitted object schemas include additionalProperties: false. Default: true. */
28
+ strictObjectKeys?: boolean;
29
+ }
30
+ /**
31
+ * Compile an Acpus recursive schema DSL map into JSON Schema.
32
+ */
33
+ export declare function compileSchemaDsl(schemaDsl: Record<string, unknown>, options?: CompileSchemaDslOptions): CompileSchemaDslResult;
34
+ //# sourceMappingURL=dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../src/schema/dsl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,4FAA4F;IAC5F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAWD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAG9H"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Acpus recursive schema DSL compiler.
3
+ *
4
+ * User-facing YAML examples:
5
+ *
6
+ * ok: boolean
7
+ * summary?: string
8
+ * issues:
9
+ * - description: string
10
+ * severity?: string
11
+ * metadata:
12
+ * title: string
13
+ *
14
+ * The compiler emits JSON Schema for IR/runtime validation. The user-facing
15
+ * DSL is intentionally smaller than JSON Schema and rejects unsupported
16
+ * object-form schema keys rather than silently ignoring them.
17
+ */
18
+ import { isRecord, normalizeType, parseDefaultValue, parseKey, VALID_TYPES, } from "./helpers.js";
19
+ const OBJECT_FORM_KEYS = new Set(["type", "required", "default", "description"]);
20
+ const UNSUPPORTED_SCHEMA_KEY_HINTS = new Set(["items", "properties", "elements"]);
21
+ /**
22
+ * Compile an Acpus recursive schema DSL map into JSON Schema.
23
+ */
24
+ export function compileSchemaDsl(schemaDsl, options) {
25
+ const strict = options?.strictObjectKeys ?? true;
26
+ return compileSchemaMap(schemaDsl, "", strict);
27
+ }
28
+ function compileSchemaMap(map, path, strict) {
29
+ const properties = {};
30
+ const required = [];
31
+ const errors = [];
32
+ for (const [rawKey, value] of Object.entries(map)) {
33
+ const { name, optional } = parseKey(rawKey);
34
+ if (name.length === 0) {
35
+ errors.push({ field: path, message: `Schema DSL field name from key '${rawKey}' must be non-empty.` });
36
+ continue;
37
+ }
38
+ const fieldPath = path ? `${path}.${name}` : name;
39
+ const result = parseFieldValue(name, value, optional, fieldPath, strict);
40
+ errors.push(...result.errors);
41
+ // Only include the field in properties when it has no errors.
42
+ // Sibling valid fields are preserved; the caller checks errors to
43
+ // decide whether to use the schema.
44
+ if (result.errors.length === 0) {
45
+ properties[name] = result.property;
46
+ if (result.isRequired) {
47
+ required.push(name);
48
+ }
49
+ }
50
+ }
51
+ const schema = {
52
+ type: "object",
53
+ properties,
54
+ };
55
+ if (strict) {
56
+ schema.additionalProperties = false;
57
+ }
58
+ if (required.length > 0) {
59
+ schema.required = required;
60
+ }
61
+ return { schema, errors };
62
+ }
63
+ function parseFieldValue(name, value, keyOptional, path, strict) {
64
+ if (typeof value === "string") {
65
+ return parseStringShorthand(name, value, keyOptional, path, strict);
66
+ }
67
+ if (Array.isArray(value)) {
68
+ return parseArrayShorthand(name, value, keyOptional, path, strict);
69
+ }
70
+ if (isRecord(value)) {
71
+ if ("type" in value) {
72
+ return parseObjectForm(name, value, keyOptional, path, strict);
73
+ }
74
+ return parseNestedObject(name, value, keyOptional, path, strict);
75
+ }
76
+ return {
77
+ property: {},
78
+ isRequired: false,
79
+ errors: [{ field: path, message: `schema DSL field '${name}' must be a type string, a nested object map, an array schema, or an object form with type.` }],
80
+ };
81
+ }
82
+ function parseStringShorthand(name, value, keyOptional, path, strict) {
83
+ const eqIndex = value.indexOf("=");
84
+ let typePart;
85
+ let defaultValue = undefined;
86
+ let hasDefault = false;
87
+ if (eqIndex !== -1) {
88
+ typePart = value.slice(0, eqIndex).trim();
89
+ const rawDefault = value.slice(eqIndex + 1).trim();
90
+ hasDefault = true;
91
+ defaultValue = parseDefaultValue(rawDefault);
92
+ }
93
+ else {
94
+ typePart = value.trim();
95
+ }
96
+ const normalized = normalizeType(typePart);
97
+ if (!normalized) {
98
+ return invalidType(name, typePart, path);
99
+ }
100
+ const property = { type: normalized };
101
+ if (normalized === "object" && strict) {
102
+ property.additionalProperties = false;
103
+ }
104
+ if (hasDefault) {
105
+ property.default = defaultValue;
106
+ }
107
+ return {
108
+ property,
109
+ isRequired: !keyOptional && !hasDefault,
110
+ errors: [],
111
+ };
112
+ }
113
+ function parseArrayShorthand(name, value, keyOptional, path, strict) {
114
+ if (value.length !== 1) {
115
+ return {
116
+ property: {},
117
+ isRequired: false,
118
+ errors: [{ field: path, message: `Array schema for field '${name}' must contain exactly one item schema.` }],
119
+ };
120
+ }
121
+ const itemSchema = value[0];
122
+ const itemResult = parseArrayItemSchema(`${name}[]`, itemSchema, `${path}[]`, strict);
123
+ if (itemResult.errors.length > 0) {
124
+ return { property: {}, isRequired: false, errors: itemResult.errors };
125
+ }
126
+ return {
127
+ property: {
128
+ type: "array",
129
+ items: itemResult.property,
130
+ },
131
+ isRequired: !keyOptional,
132
+ errors: [],
133
+ };
134
+ }
135
+ function parseArrayItemSchema(name, value, path, strict) {
136
+ if (typeof value === "string") {
137
+ const parsed = parseStringShorthand(name, value, false, path, strict);
138
+ return { property: parsed.property, errors: parsed.errors };
139
+ }
140
+ if (Array.isArray(value)) {
141
+ const parsed = parseArrayShorthand(name, value, false, path, strict);
142
+ return { property: parsed.property, errors: parsed.errors };
143
+ }
144
+ if (isRecord(value)) {
145
+ if ("type" in value) {
146
+ const parsed = parseObjectForm(name, value, false, path, strict);
147
+ return { property: parsed.property, errors: parsed.errors };
148
+ }
149
+ const nested = compileSchemaMap(value, path, strict);
150
+ return { property: nested.schema, errors: nested.errors };
151
+ }
152
+ return {
153
+ property: {},
154
+ errors: [{ field: path, message: `Array item schema for field '${name}' must be a type string, a nested object map, an array schema, or an object form with type.` }],
155
+ };
156
+ }
157
+ function parseNestedObject(_name, value, keyOptional, path, strict) {
158
+ const nested = compileSchemaMap(value, path, strict);
159
+ return {
160
+ property: nested.schema,
161
+ isRequired: !keyOptional,
162
+ errors: nested.errors,
163
+ };
164
+ }
165
+ function parseObjectForm(name, value, keyOptional, path, strict) {
166
+ // Collect ALL errors before returning so the user gets a complete picture.
167
+ const errors = validateObjectFormKeys(name, value, path);
168
+ const rawType = value.type;
169
+ if (typeof rawType !== "string") {
170
+ errors.push({ field: path, message: `Object form for field '${name}' must include a string 'type'.` });
171
+ }
172
+ else {
173
+ // Also validate the type string even if there are unsupported-key errors,
174
+ // so the user sees all problems at once.
175
+ const normalized = normalizeType(rawType);
176
+ if (!normalized) {
177
+ errors.push({ field: path, message: `Invalid type '${rawType}' for field '${name}'. Valid types: ${[...VALID_TYPES].join(", ")}.` });
178
+ }
179
+ }
180
+ if (errors.length > 0) {
181
+ return { property: {}, isRequired: false, errors };
182
+ }
183
+ const normalized = normalizeType(rawType);
184
+ const property = { type: normalized };
185
+ if (normalized === "object" && strict) {
186
+ property.additionalProperties = false;
187
+ }
188
+ if ("description" in value && typeof value.description === "string") {
189
+ property.description = value.description;
190
+ }
191
+ if ("default" in value) {
192
+ property.default = value.default;
193
+ }
194
+ const hasDefault = "default" in value;
195
+ const explicitRequired = value.required;
196
+ let isRequired;
197
+ if (explicitRequired !== undefined) {
198
+ isRequired = !!explicitRequired;
199
+ }
200
+ else if (hasDefault) {
201
+ isRequired = false;
202
+ }
203
+ else {
204
+ isRequired = !keyOptional;
205
+ }
206
+ return { property, isRequired, errors: [] };
207
+ }
208
+ function validateObjectFormKeys(name, value, path) {
209
+ const errors = [];
210
+ for (const key of Object.keys(value)) {
211
+ if (OBJECT_FORM_KEYS.has(key)) {
212
+ continue;
213
+ }
214
+ const suffix = UNSUPPORTED_SCHEMA_KEY_HINTS.has(key)
215
+ ? " Use the Acpus recursive DSL instead of raw schema keys."
216
+ : "";
217
+ errors.push({
218
+ field: `${path}.${key}`,
219
+ message: `Unsupported object-form key '${key}' for field '${name}'. Allowed keys: ${[...OBJECT_FORM_KEYS].join(", ")}.${suffix}`,
220
+ });
221
+ }
222
+ return errors;
223
+ }
224
+ function invalidType(name, rawType, path) {
225
+ return {
226
+ property: {},
227
+ isRequired: false,
228
+ errors: [{ field: path, message: `Invalid type '${rawType}' for field '${name}'. Valid types: ${[...VALID_TYPES].join(", ")}.` }],
229
+ };
230
+ }
231
+ //# sourceMappingURL=dsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.js","sourceRoot":"","sources":["../../src/schema/dsl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared schema helpers used by the recursive schema DSL compiler (dsl.ts).
3
+ */
4
+ /** JSON Schema primitive types allowed in Acpus schema DSL shorthand. */
5
+ export declare const VALID_TYPES: Set<string>;
6
+ /** Alias map: common short forms → canonical JSON Schema type names. */
7
+ export declare const TYPE_ALIASES: Record<string, string>;
8
+ /** Normalize a type string to its canonical JSON Schema form. */
9
+ export declare function normalizeType(raw: string): string | undefined;
10
+ /** Parse `field?` into `{ name: "field", optional: true }`. */
11
+ export declare function parseKey(rawKey: string): {
12
+ name: string;
13
+ optional: boolean;
14
+ };
15
+ /**
16
+ * Parse a default value string into its JS representation.
17
+ *
18
+ * Handles: integers, floats, booleans, null, quoted strings, and
19
+ * falls through to raw string for anything else.
20
+ */
21
+ export declare function parseDefaultValue(raw: string): unknown;
22
+ /** Type guard for plain record objects (not null, not array). */
23
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
24
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/schema/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yEAAyE;AACzE,eAAO,MAAM,WAAW,aAOtB,CAAC;AAEH,wEAAwE;AACxE,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK/C,CAAC;AAEF,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG7D;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAK5E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiBtD;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Shared schema helpers used by the recursive schema DSL compiler (dsl.ts).
3
+ */
4
+ /** JSON Schema primitive types allowed in Acpus schema DSL shorthand. */
5
+ export const VALID_TYPES = new Set([
6
+ "string",
7
+ "integer",
8
+ "number",
9
+ "boolean",
10
+ "array",
11
+ "object",
12
+ ]);
13
+ /** Alias map: common short forms → canonical JSON Schema type names. */
14
+ export const TYPE_ALIASES = {
15
+ int: "integer",
16
+ str: "string",
17
+ bool: "boolean",
18
+ num: "number",
19
+ };
20
+ /** Normalize a type string to its canonical JSON Schema form. */
21
+ export function normalizeType(raw) {
22
+ const lower = raw.toLowerCase();
23
+ return TYPE_ALIASES[lower] ?? (VALID_TYPES.has(lower) ? lower : undefined);
24
+ }
25
+ /** Parse `field?` into `{ name: "field", optional: true }`. */
26
+ export function parseKey(rawKey) {
27
+ if (rawKey.endsWith("?")) {
28
+ return { name: rawKey.slice(0, -1), optional: true };
29
+ }
30
+ return { name: rawKey, optional: false };
31
+ }
32
+ /**
33
+ * Parse a default value string into its JS representation.
34
+ *
35
+ * Handles: integers, floats, booleans, null, quoted strings, and
36
+ * falls through to raw string for anything else.
37
+ */
38
+ export function parseDefaultValue(raw) {
39
+ if (/^-?\d+$/.test(raw)) {
40
+ return parseInt(raw, 10);
41
+ }
42
+ if (/^-?\d+\.\d+$/.test(raw)) {
43
+ return parseFloat(raw);
44
+ }
45
+ if (raw === "true")
46
+ return true;
47
+ if (raw === "false")
48
+ return false;
49
+ if (raw === "null")
50
+ return null;
51
+ if ((raw.startsWith('"') && raw.endsWith('"')) ||
52
+ (raw.startsWith("'") && raw.endsWith("'"))) {
53
+ return raw.slice(1, -1);
54
+ }
55
+ return raw;
56
+ }
57
+ /** Type guard for plain record objects (not null, not array). */
58
+ export function isRecord(value) {
59
+ return typeof value === "object" && value !== null && !Array.isArray(value);
60
+ }
61
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/schema/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;CACT,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IACE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { compileSchemaDsl } from "./dsl.js";
2
+ export type { CompileSchemaDslResult, SchemaDslError, CompileSchemaDslOptions } from "./dsl.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Public API — recursive schema DSL compiler
2
+ export { compileSchemaDsl } from "./dsl.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}