@manifesto-ai/core 0.3.0 → 1.3.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 +148 -498
- package/dist/__tests__/apply.test.d.ts +2 -0
- package/dist/__tests__/apply.test.d.ts.map +1 -0
- package/dist/__tests__/apply.test.js +144 -0
- package/dist/__tests__/apply.test.js.map +1 -0
- package/dist/__tests__/jcs.test.d.ts +2 -0
- package/dist/__tests__/jcs.test.d.ts.map +1 -0
- package/dist/__tests__/jcs.test.js +45 -0
- package/dist/__tests__/jcs.test.js.map +1 -0
- package/dist/core/apply.d.ts +17 -0
- package/dist/core/apply.d.ts.map +1 -0
- package/dist/core/apply.js +130 -0
- package/dist/core/apply.js.map +1 -0
- package/dist/core/compute.d.ts +17 -0
- package/dist/core/compute.d.ts.map +1 -0
- package/dist/core/compute.js +287 -0
- package/dist/core/compute.js.map +1 -0
- package/dist/core/compute.test.d.ts +2 -0
- package/dist/core/compute.test.d.ts.map +1 -0
- package/dist/core/compute.test.js +633 -0
- package/dist/core/compute.test.js.map +1 -0
- package/dist/core/explain.d.ts +14 -0
- package/dist/core/explain.d.ts.map +1 -0
- package/dist/core/explain.js +78 -0
- package/dist/core/explain.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/validate.d.ts +16 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +361 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/core/validate.test.d.ts +2 -0
- package/dist/core/validate.test.d.ts.map +1 -0
- package/dist/core/validate.test.js +638 -0
- package/dist/core/validate.test.js.map +1 -0
- package/dist/core/validation-utils.d.ts +20 -0
- package/dist/core/validation-utils.d.ts.map +1 -0
- package/dist/core/validation-utils.js +289 -0
- package/dist/core/validation-utils.js.map +1 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluator/computed.d.ts +14 -0
- package/dist/evaluator/computed.d.ts.map +1 -0
- package/dist/evaluator/computed.js +60 -0
- package/dist/evaluator/computed.js.map +1 -0
- package/dist/evaluator/context.d.ts +59 -0
- package/dist/evaluator/context.d.ts.map +1 -0
- package/dist/evaluator/context.js +41 -0
- package/dist/evaluator/context.js.map +1 -0
- package/dist/evaluator/dag.d.ts +30 -0
- package/dist/evaluator/dag.d.ts.map +1 -0
- package/dist/evaluator/dag.js +121 -0
- package/dist/evaluator/dag.js.map +1 -0
- package/dist/evaluator/expr.d.ts +11 -0
- package/dist/evaluator/expr.d.ts.map +1 -0
- package/dist/evaluator/expr.js +649 -0
- package/dist/evaluator/expr.js.map +1 -0
- package/dist/evaluator/expr.test.d.ts +2 -0
- package/dist/evaluator/expr.test.d.ts.map +1 -0
- package/dist/evaluator/expr.test.js +449 -0
- package/dist/evaluator/expr.test.js.map +1 -0
- package/dist/evaluator/flow.d.ts +35 -0
- package/dist/evaluator/flow.d.ts.map +1 -0
- package/dist/evaluator/flow.js +387 -0
- package/dist/evaluator/flow.js.map +1 -0
- package/dist/evaluator/flow.test.d.ts +2 -0
- package/dist/evaluator/flow.test.d.ts.map +1 -0
- package/dist/evaluator/flow.test.js +499 -0
- package/dist/evaluator/flow.test.js.map +1 -0
- package/dist/evaluator/index.d.ts +6 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +6 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/factories.d.ts +22 -0
- package/dist/factories.d.ts.map +1 -0
- package/dist/factories.js +44 -0
- package/dist/factories.js.map +1 -0
- package/dist/index.d.ts +47 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -45
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +13 -0
- package/dist/index.test.js.map +1 -0
- package/dist/schema/action.d.ts +14 -0
- package/dist/schema/action.d.ts.map +1 -0
- package/dist/schema/action.js +30 -0
- package/dist/schema/action.js.map +1 -0
- package/dist/schema/common.d.ts +37 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +20 -0
- package/dist/schema/common.js.map +1 -0
- package/dist/schema/computed.d.ts +23 -0
- package/dist/schema/computed.d.ts.map +1 -0
- package/dist/schema/computed.js +34 -0
- package/dist/schema/computed.js.map +1 -0
- package/dist/schema/domain.d.ts +50 -0
- package/dist/schema/domain.d.ts.map +1 -0
- package/dist/schema/domain.js +60 -0
- package/dist/schema/domain.js.map +1 -0
- package/dist/schema/expr.d.ts +303 -0
- package/dist/schema/expr.d.ts.map +1 -0
- package/dist/schema/expr.js +283 -0
- package/dist/schema/expr.js.map +1 -0
- package/dist/schema/field.d.ts +48 -0
- package/dist/schema/field.d.ts.map +1 -0
- package/dist/schema/field.js +31 -0
- package/dist/schema/field.js.map +1 -0
- package/dist/schema/flow.d.ts +103 -0
- package/dist/schema/flow.d.ts.map +1 -0
- package/dist/schema/flow.js +82 -0
- package/dist/schema/flow.js.map +1 -0
- package/dist/schema/host-context.d.ts +12 -0
- package/dist/schema/host-context.d.ts.map +1 -0
- package/dist/schema/host-context.js +23 -0
- package/dist/schema/host-context.js.map +1 -0
- package/dist/schema/index.d.ts +13 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +25 -2
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/patch.d.ts +59 -0
- package/dist/schema/patch.d.ts.map +1 -0
- package/dist/schema/patch.js +60 -0
- package/dist/schema/patch.js.map +1 -0
- package/dist/schema/result.d.ts +142 -0
- package/dist/schema/result.d.ts.map +1 -0
- package/dist/schema/result.js +94 -0
- package/dist/schema/result.js.map +1 -0
- package/dist/schema/snapshot.d.ts +153 -0
- package/dist/schema/snapshot.d.ts.map +1 -0
- package/dist/schema/snapshot.js +160 -0
- package/dist/schema/snapshot.js.map +1 -0
- package/dist/schema/trace.d.ts +98 -0
- package/dist/schema/trace.d.ts.map +1 -0
- package/dist/schema/trace.js +90 -0
- package/dist/schema/trace.js.map +1 -0
- package/dist/schema/type-spec.d.ts +34 -0
- package/dist/schema/type-spec.d.ts.map +1 -0
- package/dist/schema/type-spec.js +40 -0
- package/dist/schema/type-spec.js.map +1 -0
- package/dist/utils/canonical.d.ts +37 -0
- package/dist/utils/canonical.d.ts.map +1 -0
- package/dist/utils/canonical.js +122 -0
- package/dist/utils/canonical.js.map +1 -0
- package/dist/utils/canonical.test.d.ts +2 -0
- package/dist/utils/canonical.test.d.ts.map +1 -0
- package/dist/utils/canonical.test.js +183 -0
- package/dist/utils/canonical.test.js.map +1 -0
- package/dist/utils/hash.d.ts +28 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +152 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/hash.test.d.ts +2 -0
- package/dist/utils/hash.test.d.ts.map +1 -0
- package/dist/utils/hash.test.js +170 -0
- package/dist/utils/hash.test.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/path.d.ts +40 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +132 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/path.test.d.ts +2 -0
- package/dist/utils/path.test.d.ts.map +1 -0
- package/dist/utils/path.test.js +191 -0
- package/dist/utils/path.test.js.map +1 -0
- package/package.json +28 -41
- package/LICENSE +0 -21
- package/dist/dag/graph.d.ts +0 -62
- package/dist/dag/graph.d.ts.map +0 -1
- package/dist/dag/graph.js +0 -244
- package/dist/dag/graph.js.map +0 -1
- package/dist/dag/index.d.ts +0 -4
- package/dist/dag/index.d.ts.map +0 -1
- package/dist/dag/index.js +0 -4
- package/dist/dag/index.js.map +0 -1
- package/dist/dag/propagation.d.ts +0 -58
- package/dist/dag/propagation.d.ts.map +0 -1
- package/dist/dag/propagation.js +0 -224
- package/dist/dag/propagation.js.map +0 -1
- package/dist/dag/topological.d.ts +0 -33
- package/dist/dag/topological.d.ts.map +0 -1
- package/dist/dag/topological.js +0 -173
- package/dist/dag/topological.js.map +0 -1
- package/dist/domain/define.d.ts +0 -82
- package/dist/domain/define.d.ts.map +0 -1
- package/dist/domain/define.js +0 -105
- package/dist/domain/define.js.map +0 -1
- package/dist/domain/index.d.ts +0 -4
- package/dist/domain/index.d.ts.map +0 -1
- package/dist/domain/index.js +0 -4
- package/dist/domain/index.js.map +0 -1
- package/dist/domain/types.d.ts +0 -203
- package/dist/domain/types.d.ts.map +0 -1
- package/dist/domain/types.js +0 -2
- package/dist/domain/types.js.map +0 -1
- package/dist/domain/validate.d.ts +0 -17
- package/dist/domain/validate.d.ts.map +0 -1
- package/dist/domain/validate.js +0 -204
- package/dist/domain/validate.js.map +0 -1
- package/dist/effect/index.d.ts +0 -4
- package/dist/effect/index.d.ts.map +0 -1
- package/dist/effect/index.js +0 -4
- package/dist/effect/index.js.map +0 -1
- package/dist/effect/result.d.ts +0 -100
- package/dist/effect/result.d.ts.map +0 -1
- package/dist/effect/result.js +0 -163
- package/dist/effect/result.js.map +0 -1
- package/dist/effect/runner.d.ts +0 -98
- package/dist/effect/runner.d.ts.map +0 -1
- package/dist/effect/runner.js +0 -321
- package/dist/effect/runner.js.map +0 -1
- package/dist/effect/types.d.ts +0 -169
- package/dist/effect/types.d.ts.map +0 -1
- package/dist/effect/types.js +0 -28
- package/dist/effect/types.js.map +0 -1
- package/dist/expression/analyzer.d.ts +0 -42
- package/dist/expression/analyzer.d.ts.map +0 -1
- package/dist/expression/analyzer.js +0 -166
- package/dist/expression/analyzer.js.map +0 -1
- package/dist/expression/evaluator.d.ts +0 -16
- package/dist/expression/evaluator.d.ts.map +0 -1
- package/dist/expression/evaluator.js +0 -382
- package/dist/expression/evaluator.js.map +0 -1
- package/dist/expression/index.d.ts +0 -5
- package/dist/expression/index.d.ts.map +0 -1
- package/dist/expression/index.js +0 -5
- package/dist/expression/index.js.map +0 -1
- package/dist/expression/parser.d.ts +0 -37
- package/dist/expression/parser.d.ts.map +0 -1
- package/dist/expression/parser.js +0 -201
- package/dist/expression/parser.js.map +0 -1
- package/dist/expression/types.d.ts +0 -123
- package/dist/expression/types.d.ts.map +0 -1
- package/dist/expression/types.js +0 -10
- package/dist/expression/types.js.map +0 -1
- package/dist/policy/field-policy.d.ts +0 -63
- package/dist/policy/field-policy.d.ts.map +0 -1
- package/dist/policy/field-policy.js +0 -138
- package/dist/policy/field-policy.js.map +0 -1
- package/dist/policy/index.d.ts +0 -3
- package/dist/policy/index.d.ts.map +0 -1
- package/dist/policy/index.js +0 -3
- package/dist/policy/index.js.map +0 -1
- package/dist/policy/precondition.d.ts +0 -58
- package/dist/policy/precondition.d.ts.map +0 -1
- package/dist/policy/precondition.js +0 -115
- package/dist/policy/precondition.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -4
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -4
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -94
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/runtime.js +0 -294
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/runtime/snapshot.d.ts +0 -39
- package/dist/runtime/snapshot.d.ts.map +0 -1
- package/dist/runtime/snapshot.js +0 -264
- package/dist/runtime/snapshot.js.map +0 -1
- package/dist/runtime/subscription.d.ts +0 -82
- package/dist/runtime/subscription.d.ts.map +0 -1
- package/dist/runtime/subscription.js +0 -222
- package/dist/runtime/subscription.js.map +0 -1
- package/dist/schema/integration.d.ts +0 -89
- package/dist/schema/integration.d.ts.map +0 -1
- package/dist/schema/integration.js +0 -171
- package/dist/schema/integration.js.map +0 -1
- package/dist/schema/validation.d.ts +0 -51
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/schema/validation.js +0 -212
- package/dist/schema/validation.js.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ExprNode } from "../schema/expr.js";
|
|
2
|
+
import type { FlowNode } from "../schema/flow.js";
|
|
3
|
+
import type { FieldSpec, StateSpec } from "../schema/field.js";
|
|
4
|
+
import type { ComputedSpec } from "../schema/computed.js";
|
|
5
|
+
export declare function isValidSchemaId(id: string): boolean;
|
|
6
|
+
export declare function isValidSemver(version: string): boolean;
|
|
7
|
+
export declare function collectGetPathsFromExpr(expr: ExprNode): string[];
|
|
8
|
+
export declare function collectGetPathsFromFlow(flow: FlowNode): string[];
|
|
9
|
+
export declare function pathExistsInStateSpec(state: StateSpec, path: string): boolean;
|
|
10
|
+
export declare function pathExistsInComputedSpec(computed: ComputedSpec, path: string): boolean;
|
|
11
|
+
export declare function pathExistsInFieldSpec(spec: FieldSpec, path: string): boolean;
|
|
12
|
+
export declare function validateValueAgainstFieldSpec(value: unknown, spec: FieldSpec, options?: {
|
|
13
|
+
allowPartial?: boolean;
|
|
14
|
+
allowUndefined?: boolean;
|
|
15
|
+
}): {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
message?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function getFieldSpecAtPath(spec: FieldSpec, path: string): FieldSpec | null;
|
|
20
|
+
//# sourceMappingURL=validation-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-utils.d.ts","sourceRoot":"","sources":["../../src/core/validation-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAQ1D,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAiGhE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAoChE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAsC5E;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,SAAS,EACf,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7D;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAuDnC;AAwCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CA8BlF"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
const SEMVER_REGEX = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
2
|
+
const URI_SCHEME_REGEX = /^[a-zA-Z][a-zA-Z0-9+.-]*:/;
|
|
3
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
4
|
+
export function isValidSchemaId(id) {
|
|
5
|
+
return URI_SCHEME_REGEX.test(id) || UUID_REGEX.test(id);
|
|
6
|
+
}
|
|
7
|
+
export function isValidSemver(version) {
|
|
8
|
+
return SEMVER_REGEX.test(version);
|
|
9
|
+
}
|
|
10
|
+
export function collectGetPathsFromExpr(expr) {
|
|
11
|
+
const paths = [];
|
|
12
|
+
const visit = (node) => {
|
|
13
|
+
switch (node.kind) {
|
|
14
|
+
case "lit":
|
|
15
|
+
return;
|
|
16
|
+
case "get":
|
|
17
|
+
paths.push(node.path);
|
|
18
|
+
return;
|
|
19
|
+
case "eq":
|
|
20
|
+
case "neq":
|
|
21
|
+
case "gt":
|
|
22
|
+
case "gte":
|
|
23
|
+
case "lt":
|
|
24
|
+
case "lte":
|
|
25
|
+
case "add":
|
|
26
|
+
case "sub":
|
|
27
|
+
case "mul":
|
|
28
|
+
case "div":
|
|
29
|
+
case "mod":
|
|
30
|
+
visit(node.left);
|
|
31
|
+
visit(node.right);
|
|
32
|
+
return;
|
|
33
|
+
case "and":
|
|
34
|
+
case "or":
|
|
35
|
+
case "concat":
|
|
36
|
+
case "coalesce":
|
|
37
|
+
node.args.forEach(visit);
|
|
38
|
+
return;
|
|
39
|
+
case "not":
|
|
40
|
+
case "typeof":
|
|
41
|
+
case "isNull":
|
|
42
|
+
case "len":
|
|
43
|
+
visit(node.arg);
|
|
44
|
+
return;
|
|
45
|
+
case "first":
|
|
46
|
+
case "last":
|
|
47
|
+
visit(node.array);
|
|
48
|
+
return;
|
|
49
|
+
case "if":
|
|
50
|
+
visit(node.cond);
|
|
51
|
+
visit(node.then);
|
|
52
|
+
visit(node.else);
|
|
53
|
+
return;
|
|
54
|
+
case "substring":
|
|
55
|
+
visit(node.str);
|
|
56
|
+
visit(node.start);
|
|
57
|
+
if (node.end)
|
|
58
|
+
visit(node.end);
|
|
59
|
+
return;
|
|
60
|
+
case "trim":
|
|
61
|
+
visit(node.str);
|
|
62
|
+
return;
|
|
63
|
+
case "at":
|
|
64
|
+
visit(node.array);
|
|
65
|
+
visit(node.index);
|
|
66
|
+
return;
|
|
67
|
+
case "slice":
|
|
68
|
+
visit(node.array);
|
|
69
|
+
visit(node.start);
|
|
70
|
+
if (node.end)
|
|
71
|
+
visit(node.end);
|
|
72
|
+
return;
|
|
73
|
+
case "includes":
|
|
74
|
+
visit(node.array);
|
|
75
|
+
visit(node.item);
|
|
76
|
+
return;
|
|
77
|
+
case "filter":
|
|
78
|
+
case "find":
|
|
79
|
+
case "every":
|
|
80
|
+
case "some":
|
|
81
|
+
visit(node.array);
|
|
82
|
+
visit(node.predicate);
|
|
83
|
+
return;
|
|
84
|
+
case "map":
|
|
85
|
+
visit(node.array);
|
|
86
|
+
visit(node.mapper);
|
|
87
|
+
return;
|
|
88
|
+
case "append":
|
|
89
|
+
visit(node.array);
|
|
90
|
+
node.items.forEach(visit);
|
|
91
|
+
return;
|
|
92
|
+
case "object":
|
|
93
|
+
Object.values(node.fields).forEach(visit);
|
|
94
|
+
return;
|
|
95
|
+
case "keys":
|
|
96
|
+
case "values":
|
|
97
|
+
case "entries":
|
|
98
|
+
visit(node.obj);
|
|
99
|
+
return;
|
|
100
|
+
case "merge":
|
|
101
|
+
node.objects.forEach(visit);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
visit(expr);
|
|
106
|
+
return paths;
|
|
107
|
+
}
|
|
108
|
+
export function collectGetPathsFromFlow(flow) {
|
|
109
|
+
const paths = [];
|
|
110
|
+
const visitFlow = (node) => {
|
|
111
|
+
switch (node.kind) {
|
|
112
|
+
case "seq":
|
|
113
|
+
node.steps.forEach(visitFlow);
|
|
114
|
+
return;
|
|
115
|
+
case "if":
|
|
116
|
+
paths.push(...collectGetPathsFromExpr(node.cond));
|
|
117
|
+
visitFlow(node.then);
|
|
118
|
+
if (node.else)
|
|
119
|
+
visitFlow(node.else);
|
|
120
|
+
return;
|
|
121
|
+
case "patch":
|
|
122
|
+
if (node.op !== "unset" && node.value) {
|
|
123
|
+
paths.push(...collectGetPathsFromExpr(node.value));
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
case "effect":
|
|
127
|
+
Object.values(node.params).forEach((expr) => {
|
|
128
|
+
paths.push(...collectGetPathsFromExpr(expr));
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
case "fail":
|
|
132
|
+
if (node.message) {
|
|
133
|
+
paths.push(...collectGetPathsFromExpr(node.message));
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
case "call":
|
|
137
|
+
case "halt":
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
visitFlow(flow);
|
|
142
|
+
return paths;
|
|
143
|
+
}
|
|
144
|
+
export function pathExistsInStateSpec(state, path) {
|
|
145
|
+
return pathExistsInFieldSpec({ type: "object", required: true, fields: state.fields }, path);
|
|
146
|
+
}
|
|
147
|
+
export function pathExistsInComputedSpec(computed, path) {
|
|
148
|
+
return path in computed.fields;
|
|
149
|
+
}
|
|
150
|
+
export function pathExistsInFieldSpec(spec, path) {
|
|
151
|
+
if (!path) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
const segments = path.split(".");
|
|
155
|
+
let current = spec;
|
|
156
|
+
for (const segment of segments) {
|
|
157
|
+
if (!current) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
const fieldType = current.type;
|
|
161
|
+
if (fieldType === "object") {
|
|
162
|
+
if (!current.fields) {
|
|
163
|
+
// Open object allows any nested path (e.g., Json types)
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
if (!(segment in current.fields)) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
current = current.fields[segment];
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (fieldType === "array") {
|
|
173
|
+
if (!isNumericSegment(segment)) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
current = current.items ?? null;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
export function validateValueAgainstFieldSpec(value, spec, options) {
|
|
184
|
+
if (value === undefined) {
|
|
185
|
+
if (options?.allowUndefined && spec.required === false) {
|
|
186
|
+
return { ok: true };
|
|
187
|
+
}
|
|
188
|
+
return { ok: false, message: "Value is required" };
|
|
189
|
+
}
|
|
190
|
+
if (value === null) {
|
|
191
|
+
return { ok: true };
|
|
192
|
+
}
|
|
193
|
+
const fieldType = spec.type;
|
|
194
|
+
if (typeof fieldType === "object" && "enum" in fieldType) {
|
|
195
|
+
return fieldType.enum.some((entry) => Object.is(entry, value))
|
|
196
|
+
? { ok: true }
|
|
197
|
+
: { ok: false, message: "Value is not in enum" };
|
|
198
|
+
}
|
|
199
|
+
switch (fieldType) {
|
|
200
|
+
case "null":
|
|
201
|
+
return value === null ? { ok: true } : { ok: false, message: "Expected null" };
|
|
202
|
+
case "string":
|
|
203
|
+
return typeof value === "string" ? { ok: true } : { ok: false, message: "Expected string" };
|
|
204
|
+
case "number":
|
|
205
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
206
|
+
? { ok: true }
|
|
207
|
+
: { ok: false, message: "Expected number" };
|
|
208
|
+
case "boolean":
|
|
209
|
+
return typeof value === "boolean" ? { ok: true } : { ok: false, message: "Expected boolean" };
|
|
210
|
+
case "object":
|
|
211
|
+
if (value === null || Array.isArray(value) || typeof value !== "object") {
|
|
212
|
+
return { ok: false, message: "Expected object" };
|
|
213
|
+
}
|
|
214
|
+
return validateObjectValue(value, spec, options?.allowPartial ?? false, options?.allowUndefined ?? false);
|
|
215
|
+
case "array":
|
|
216
|
+
if (!Array.isArray(value)) {
|
|
217
|
+
return { ok: false, message: "Expected array" };
|
|
218
|
+
}
|
|
219
|
+
if (!spec.items) {
|
|
220
|
+
return { ok: true };
|
|
221
|
+
}
|
|
222
|
+
for (const item of value) {
|
|
223
|
+
const result = validateValueAgainstFieldSpec(item, spec.items, { allowUndefined: false });
|
|
224
|
+
if (!result.ok) {
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return { ok: true };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function validateObjectValue(value, spec, allowPartial, allowUndefined) {
|
|
232
|
+
if (!spec.fields) {
|
|
233
|
+
return { ok: true };
|
|
234
|
+
}
|
|
235
|
+
const fieldEntries = Object.entries(spec.fields);
|
|
236
|
+
const fieldNames = new Set(fieldEntries.map(([name]) => name));
|
|
237
|
+
for (const key of Object.keys(value)) {
|
|
238
|
+
if (!fieldNames.has(key)) {
|
|
239
|
+
return { ok: false, message: `Unknown field: ${key}` };
|
|
240
|
+
}
|
|
241
|
+
const fieldSpec = spec.fields[key];
|
|
242
|
+
const result = validateValueAgainstFieldSpec(value[key], fieldSpec, {
|
|
243
|
+
allowPartial,
|
|
244
|
+
allowUndefined,
|
|
245
|
+
});
|
|
246
|
+
if (!result.ok) {
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (!allowPartial) {
|
|
251
|
+
for (const [name, fieldSpec] of fieldEntries) {
|
|
252
|
+
if (fieldSpec.required && !(name in value)) {
|
|
253
|
+
return { ok: false, message: `Missing required field: ${name}` };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return { ok: true };
|
|
258
|
+
}
|
|
259
|
+
export function getFieldSpecAtPath(spec, path) {
|
|
260
|
+
if (!path)
|
|
261
|
+
return spec;
|
|
262
|
+
const segments = path.split(".");
|
|
263
|
+
let current = spec;
|
|
264
|
+
for (const segment of segments) {
|
|
265
|
+
if (!current)
|
|
266
|
+
return null;
|
|
267
|
+
const fieldType = current.type;
|
|
268
|
+
if (fieldType === "object") {
|
|
269
|
+
if (!current.fields || !(segment in current.fields)) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
current = current.fields[segment];
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (fieldType === "array") {
|
|
276
|
+
if (!isNumericSegment(segment)) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
current = current.items ?? null;
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
return current;
|
|
285
|
+
}
|
|
286
|
+
function isNumericSegment(segment) {
|
|
287
|
+
return /^[0-9]+$/.test(segment);
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=validation-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-utils.js","sourceRoot":"","sources":["../../src/core/validation-utils.ts"],"names":[],"mappings":"AAKA,MAAM,YAAY,GAChB,gGAAgG,CAAC;AACnG,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AACrD,MAAM,UAAU,GACd,4EAA4E,CAAC;AAE/E,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAc;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,KAAK,GAAG,CAAC,IAAc,EAAE,EAAE;QAC/B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,KAAK;gBACR,OAAO;YACT,KAAK,KAAK;gBACR,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,OAAO;YACT,KAAK,IAAI,CAAC;YACV,KAAK,KAAK,CAAC;YACX,KAAK,IAAI,CAAC;YACV,KAAK,KAAK,CAAC;YACX,KAAK,IAAI,CAAC;YACV,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,KAAK;gBACR,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,KAAK,KAAK,CAAC;YACX,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ,CAAC;YACd,KAAK,UAAU;gBACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzB,OAAO;YACT,KAAK,KAAK,CAAC;YACX,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ,CAAC;YACd,KAAK,KAAK;gBACR,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;YACT,KAAK,OAAO,CAAC;YACb,KAAK,MAAM;gBACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO;YACT,KAAK,WAAW;gBACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,IAAI,IAAI,CAAC,GAAG;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9B,OAAO;YACT,KAAK,MAAM;gBACT,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;YACT,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,KAAK,OAAO;gBACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,IAAI,IAAI,CAAC,GAAG;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9B,OAAO;YACT,KAAK,UAAU;gBACb,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO;YACT,KAAK,QAAQ,CAAC;YACd,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO,CAAC;YACb,KAAK,MAAM;gBACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,OAAO;YACT,KAAK,KAAK;gBACR,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnB,OAAO;YACT,KAAK,QAAQ;gBACX,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1B,OAAO;YACT,KAAK,QAAQ;gBACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1C,OAAO;YACT,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACZ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;YACT,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5B,OAAO;QACX,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAc;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,SAAS,GAAG,CAAC,IAAc,EAAE,EAAE;QACnC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,KAAK;gBACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC9B,OAAO;YACT,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,IAAI,IAAI,CAAC,IAAI;oBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO;YACT,KAAK,OAAO;gBACV,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACtC,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,CAAC;gBACD,OAAO;YACT,KAAK,QAAQ;gBACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,KAAK,MAAM;gBACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvD,CAAC;gBACD,OAAO;YACT,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACT,OAAO;QACX,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAgB,EAAE,IAAY;IAClE,OAAO,qBAAqB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAsB,EAAE,IAAY;IAC3E,OAAO,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAe,EAAE,IAAY;IACjE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,GAAqB,IAAI,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;QAC/B,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,wDAAwD;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;YAChC,SAAS;QACX,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAAc,EACd,IAAe,EACf,OAA8D;IAE9D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;IAC5B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;QACzD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;YACd,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IACrD,CAAC;IAED,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QACjF,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAC9F,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxD,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;gBACd,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAChD,KAAK,SAAS;YACZ,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAChG,KAAK,QAAQ;YACX,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,mBAAmB,CACxB,KAAgC,EAChC,IAAI,EACJ,OAAO,EAAE,YAAY,IAAI,KAAK,EAC9B,OAAO,EAAE,cAAc,IAAI,KAAK,CACjC,CAAC;QACJ,KAAK,OAAO;YACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACtB,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1F,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA8B,EAC9B,IAAe,EACf,YAAqB,EACrB,cAAuB;IAEvB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,GAAG,EAAE,EAAE,CAAC;QACzD,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE;YAClE,YAAY;YACZ,cAAc;SACf,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7C,IAAI,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,2BAA2B,IAAI,EAAE,EAAE,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAe,EAAE,IAAY;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,GAAqB,IAAI,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;QAC/B,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;YAChC,SAAS;QACX,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ErrorValue } from "./schema/snapshot.js";
|
|
3
|
+
/**
|
|
4
|
+
* Core error codes
|
|
5
|
+
*/
|
|
6
|
+
export declare const CoreErrorCode: z.ZodEnum<{
|
|
7
|
+
VALIDATION_ERROR: "VALIDATION_ERROR";
|
|
8
|
+
PATH_NOT_FOUND: "PATH_NOT_FOUND";
|
|
9
|
+
TYPE_MISMATCH: "TYPE_MISMATCH";
|
|
10
|
+
DIVISION_BY_ZERO: "DIVISION_BY_ZERO";
|
|
11
|
+
INDEX_OUT_OF_BOUNDS: "INDEX_OUT_OF_BOUNDS";
|
|
12
|
+
UNKNOWN_ACTION: "UNKNOWN_ACTION";
|
|
13
|
+
ACTION_UNAVAILABLE: "ACTION_UNAVAILABLE";
|
|
14
|
+
INVALID_INPUT: "INVALID_INPUT";
|
|
15
|
+
CYCLIC_DEPENDENCY: "CYCLIC_DEPENDENCY";
|
|
16
|
+
UNKNOWN_FLOW: "UNKNOWN_FLOW";
|
|
17
|
+
CYCLIC_CALL: "CYCLIC_CALL";
|
|
18
|
+
UNKNOWN_EFFECT: "UNKNOWN_EFFECT";
|
|
19
|
+
INTERNAL_ERROR: "INTERNAL_ERROR";
|
|
20
|
+
}>;
|
|
21
|
+
export type CoreErrorCode = z.infer<typeof CoreErrorCode>;
|
|
22
|
+
/**
|
|
23
|
+
* Create an error value (errors are values, not exceptions)
|
|
24
|
+
*/
|
|
25
|
+
export declare function createError(code: CoreErrorCode, message: string, actionId: string, nodePath: string, timestamp: number, context?: Record<string, unknown>): ErrorValue;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a value is an ErrorValue
|
|
28
|
+
*/
|
|
29
|
+
export declare function isErrorValue(value: unknown): value is ErrorValue;
|
|
30
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;EAcxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,UAAU,CAWZ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAehE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Core error codes
|
|
4
|
+
*/
|
|
5
|
+
export const CoreErrorCode = z.enum([
|
|
6
|
+
"VALIDATION_ERROR",
|
|
7
|
+
"PATH_NOT_FOUND",
|
|
8
|
+
"TYPE_MISMATCH",
|
|
9
|
+
"DIVISION_BY_ZERO",
|
|
10
|
+
"INDEX_OUT_OF_BOUNDS",
|
|
11
|
+
"UNKNOWN_ACTION",
|
|
12
|
+
"ACTION_UNAVAILABLE",
|
|
13
|
+
"INVALID_INPUT",
|
|
14
|
+
"CYCLIC_DEPENDENCY",
|
|
15
|
+
"UNKNOWN_FLOW",
|
|
16
|
+
"CYCLIC_CALL",
|
|
17
|
+
"UNKNOWN_EFFECT",
|
|
18
|
+
"INTERNAL_ERROR",
|
|
19
|
+
]);
|
|
20
|
+
/**
|
|
21
|
+
* Create an error value (errors are values, not exceptions)
|
|
22
|
+
*/
|
|
23
|
+
export function createError(code, message, actionId, nodePath, timestamp, context) {
|
|
24
|
+
return {
|
|
25
|
+
code,
|
|
26
|
+
message,
|
|
27
|
+
source: {
|
|
28
|
+
actionId,
|
|
29
|
+
nodePath,
|
|
30
|
+
},
|
|
31
|
+
timestamp,
|
|
32
|
+
context,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if a value is an ErrorValue
|
|
37
|
+
*/
|
|
38
|
+
export function isErrorValue(value) {
|
|
39
|
+
if (typeof value !== "object" || value === null) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const obj = value;
|
|
43
|
+
return (typeof obj.code === "string" &&
|
|
44
|
+
typeof obj.message === "string" &&
|
|
45
|
+
typeof obj.source === "object" &&
|
|
46
|
+
obj.source !== null &&
|
|
47
|
+
typeof obj.source.actionId === "string" &&
|
|
48
|
+
typeof obj.source.nodePath === "string" &&
|
|
49
|
+
typeof obj.timestamp === "number");
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC;IAClC,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,qBAAqB;IACrB,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,mBAAmB;IACnB,cAAc;IACd,aAAa;IACb,gBAAgB;IAChB,gBAAgB;CACjB,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,IAAmB,EACnB,OAAe,EACf,QAAgB,EAChB,QAAgB,EAChB,SAAiB,EACjB,OAAiC;IAEjC,OAAO;QACL,IAAI;QACJ,OAAO;QACP,MAAM,EAAE;YACN,QAAQ;YACR,QAAQ;SACT;QACD,SAAS;QACT,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC9B,GAAG,CAAC,MAAM,KAAK,IAAI;QACnB,OAAQ,GAAG,CAAC,MAAkC,CAAC,QAAQ,KAAK,QAAQ;QACpE,OAAQ,GAAG,CAAC,MAAkC,CAAC,QAAQ,KAAK,QAAQ;QACpE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DomainSchema } from "../schema/domain.js";
|
|
2
|
+
import type { Snapshot } from "../schema/snapshot.js";
|
|
3
|
+
import type { SemanticPath, Result } from "../schema/common.js";
|
|
4
|
+
import type { ErrorValue } from "../schema/snapshot.js";
|
|
5
|
+
/**
|
|
6
|
+
* Evaluate all computed values for a snapshot
|
|
7
|
+
* Returns the computed values record or an error
|
|
8
|
+
*/
|
|
9
|
+
export declare function evaluateComputed(schema: DomainSchema, snapshot: Snapshot): Result<Record<SemanticPath, unknown>, ErrorValue>;
|
|
10
|
+
/**
|
|
11
|
+
* Evaluate a single computed value
|
|
12
|
+
*/
|
|
13
|
+
export declare function evaluateSingleComputed(schema: DomainSchema, snapshot: Snapshot, path: SemanticPath): Result<unknown, ErrorValue>;
|
|
14
|
+
//# sourceMappingURL=computed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../src/evaluator/computed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,CAmDnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GACjB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAe7B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ok, err, isErr } from "../schema/common.js";
|
|
2
|
+
import { createError } from "../errors.js";
|
|
3
|
+
import { createContext } from "./context.js";
|
|
4
|
+
import { createTraceContext } from "../schema/trace.js";
|
|
5
|
+
import { evaluateExpr } from "./expr.js";
|
|
6
|
+
import { buildDependencyGraph, topologicalSort } from "./dag.js";
|
|
7
|
+
/**
|
|
8
|
+
* Evaluate all computed values for a snapshot
|
|
9
|
+
* Returns the computed values record or an error
|
|
10
|
+
*/
|
|
11
|
+
export function evaluateComputed(schema, snapshot) {
|
|
12
|
+
const trace = createTraceContext(snapshot.meta.timestamp);
|
|
13
|
+
// Build dependency graph
|
|
14
|
+
const graph = buildDependencyGraph(schema.computed);
|
|
15
|
+
// Get topological order
|
|
16
|
+
const sortResult = topologicalSort(graph);
|
|
17
|
+
if (!sortResult.ok) {
|
|
18
|
+
return err(createError("CYCLIC_DEPENDENCY", sortResult.error.message, "", sortResult.error.path ?? "", trace.timestamp));
|
|
19
|
+
}
|
|
20
|
+
// Evaluate in topological order
|
|
21
|
+
const computed = {};
|
|
22
|
+
// Create a temporary snapshot with computed values being built
|
|
23
|
+
let tempSnapshot = {
|
|
24
|
+
...snapshot,
|
|
25
|
+
computed,
|
|
26
|
+
};
|
|
27
|
+
for (const path of sortResult.value) {
|
|
28
|
+
const spec = schema.computed.fields[path];
|
|
29
|
+
if (!spec)
|
|
30
|
+
continue;
|
|
31
|
+
// Create context with current state of computed values
|
|
32
|
+
const ctx = createContext(tempSnapshot, schema, null, path, undefined, trace);
|
|
33
|
+
// Evaluate the expression
|
|
34
|
+
const result = evaluateExpr(spec.expr, ctx);
|
|
35
|
+
if (isErr(result)) {
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
// Store the computed value
|
|
39
|
+
computed[path] = result.value;
|
|
40
|
+
// Update temp snapshot for next iteration
|
|
41
|
+
tempSnapshot = {
|
|
42
|
+
...tempSnapshot,
|
|
43
|
+
computed: { ...computed },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return ok(computed);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Evaluate a single computed value
|
|
50
|
+
*/
|
|
51
|
+
export function evaluateSingleComputed(schema, snapshot, path) {
|
|
52
|
+
const trace = createTraceContext(snapshot.meta.timestamp);
|
|
53
|
+
const spec = schema.computed.fields[path];
|
|
54
|
+
if (!spec) {
|
|
55
|
+
return err(createError("PATH_NOT_FOUND", `Computed field not found: ${path}`, "", path, trace.timestamp));
|
|
56
|
+
}
|
|
57
|
+
const ctx = createContext(snapshot, schema, null, path, undefined, trace);
|
|
58
|
+
return evaluateExpr(spec.expr, ctx);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=computed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computed.js","sourceRoot":"","sources":["../../src/evaluator/computed.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEjE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EACpB,QAAkB;IAElB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,yBAAyB;IACzB,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpD,wBAAwB;IACxB,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC,WAAW,CACpB,mBAAmB,EACnB,UAAU,CAAC,KAAK,CAAC,OAAO,EACxB,EAAE,EACF,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAC3B,KAAK,CAAC,SAAS,CAChB,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,MAAM,QAAQ,GAAkC,EAAE,CAAC;IAEnD,+DAA+D;IAC/D,IAAI,YAAY,GAAa;QAC3B,GAAG,QAAQ;QACX,QAAQ;KACT,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,uDAAuD;QACvD,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAE9E,0BAA0B;QAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAE5C,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2BAA2B;QAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAE9B,0CAA0C;QAC1C,YAAY,GAAG;YACb,GAAG,YAAY;YACf,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAoB,EACpB,QAAkB,EAClB,IAAkB;IAElB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC,WAAW,CACpB,gBAAgB,EAChB,6BAA6B,IAAI,EAAE,EACnC,EAAE,EACF,IAAI,EACJ,KAAK,CAAC,SAAS,CAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAC1E,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Snapshot } from "../schema/snapshot.js";
|
|
2
|
+
import type { DomainSchema } from "../schema/domain.js";
|
|
3
|
+
import { type TraceContext } from "../schema/trace.js";
|
|
4
|
+
/**
|
|
5
|
+
* Evaluation context for expressions and flows
|
|
6
|
+
*/
|
|
7
|
+
export type EvalContext = {
|
|
8
|
+
/**
|
|
9
|
+
* Current snapshot state
|
|
10
|
+
*/
|
|
11
|
+
readonly snapshot: Snapshot;
|
|
12
|
+
/**
|
|
13
|
+
* Domain schema
|
|
14
|
+
*/
|
|
15
|
+
readonly schema: DomainSchema;
|
|
16
|
+
/**
|
|
17
|
+
* Current action being processed (if any)
|
|
18
|
+
*/
|
|
19
|
+
readonly currentAction: string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Current node path in the flow (for tracing)
|
|
22
|
+
*/
|
|
23
|
+
readonly nodePath: string;
|
|
24
|
+
/**
|
|
25
|
+
* Intent ID for the current intent (for re-entry safety)
|
|
26
|
+
*/
|
|
27
|
+
readonly intentId?: string;
|
|
28
|
+
/**
|
|
29
|
+
* UUID generator counter (for deterministic UUID generation)
|
|
30
|
+
*/
|
|
31
|
+
uuidCounter?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Trace context for deterministic trace ID generation
|
|
34
|
+
*/
|
|
35
|
+
readonly trace: TraceContext;
|
|
36
|
+
/**
|
|
37
|
+
* Collection context variables (for filter, map, find, etc.)
|
|
38
|
+
*/
|
|
39
|
+
readonly $item?: unknown;
|
|
40
|
+
readonly $index?: number;
|
|
41
|
+
readonly $array?: unknown[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Create a new evaluation context
|
|
45
|
+
*/
|
|
46
|
+
export declare function createContext(snapshot: Snapshot, schema: DomainSchema, currentAction?: string | null, nodePath?: string, intentId?: string, timestampOrTrace?: number | TraceContext): EvalContext;
|
|
47
|
+
/**
|
|
48
|
+
* Create context with collection variables for filter/map/find/etc.
|
|
49
|
+
*/
|
|
50
|
+
export declare function withCollectionContext(ctx: EvalContext, item: unknown, index: number, array: unknown[]): EvalContext;
|
|
51
|
+
/**
|
|
52
|
+
* Update context with new snapshot
|
|
53
|
+
*/
|
|
54
|
+
export declare function withSnapshot(ctx: EvalContext, snapshot: Snapshot): EvalContext;
|
|
55
|
+
/**
|
|
56
|
+
* Update context with new node path
|
|
57
|
+
*/
|
|
58
|
+
export declare function withNodePath(ctx: EvalContext, nodePath: string): EvalContext;
|
|
59
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/evaluator/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,YAAY,EACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,MAAM,GAAG,YAAY,GACvC,WAAW,CAYb;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EAAE,GACf,WAAW,CAOb;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAE9E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAE5E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createTraceContext } from "../schema/trace.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create a new evaluation context
|
|
4
|
+
*/
|
|
5
|
+
export function createContext(snapshot, schema, currentAction, nodePath, intentId, timestampOrTrace) {
|
|
6
|
+
return {
|
|
7
|
+
snapshot,
|
|
8
|
+
schema,
|
|
9
|
+
currentAction: currentAction ?? null,
|
|
10
|
+
nodePath: nodePath ?? "",
|
|
11
|
+
intentId,
|
|
12
|
+
uuidCounter: 0,
|
|
13
|
+
trace: typeof timestampOrTrace === "object"
|
|
14
|
+
? timestampOrTrace
|
|
15
|
+
: createTraceContext(timestampOrTrace ?? Date.now()),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create context with collection variables for filter/map/find/etc.
|
|
20
|
+
*/
|
|
21
|
+
export function withCollectionContext(ctx, item, index, array) {
|
|
22
|
+
return {
|
|
23
|
+
...ctx,
|
|
24
|
+
$item: item,
|
|
25
|
+
$index: index,
|
|
26
|
+
$array: array,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Update context with new snapshot
|
|
31
|
+
*/
|
|
32
|
+
export function withSnapshot(ctx, snapshot) {
|
|
33
|
+
return { ...ctx, snapshot };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Update context with new node path
|
|
37
|
+
*/
|
|
38
|
+
export function withNodePath(ctx, nodePath) {
|
|
39
|
+
return { ...ctx, nodePath };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/evaluator/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAiD3E;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAkB,EAClB,MAAoB,EACpB,aAA6B,EAC7B,QAAiB,EACjB,QAAiB,EACjB,gBAAwC;IAExC,OAAO;QACL,QAAQ;QACR,MAAM;QACN,aAAa,EAAE,aAAa,IAAI,IAAI;QACpC,QAAQ,EAAE,QAAQ,IAAI,EAAE;QACxB,QAAQ;QACR,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,OAAO,gBAAgB,KAAK,QAAQ;YACzC,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;KACvD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAgB,EAChB,IAAa,EACb,KAAa,EACb,KAAgB;IAEhB,OAAO;QACL,GAAG,GAAG;QACN,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,QAAkB;IAC/D,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,QAAgB;IAC7D,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ComputedSpec } from "../schema/computed.js";
|
|
2
|
+
import type { SemanticPath } from "../schema/common.js";
|
|
3
|
+
import type { Result } from "../schema/common.js";
|
|
4
|
+
import type { ValidationError } from "../schema/result.js";
|
|
5
|
+
/**
|
|
6
|
+
* Dependency graph for computed values
|
|
7
|
+
*/
|
|
8
|
+
export type DependencyGraph = {
|
|
9
|
+
readonly nodes: readonly SemanticPath[];
|
|
10
|
+
readonly edges: ReadonlyMap<SemanticPath, readonly SemanticPath[]>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Build a dependency graph from ComputedSpec
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildDependencyGraph(computed: ComputedSpec): DependencyGraph;
|
|
16
|
+
/**
|
|
17
|
+
* Topological sort using Kahn's algorithm
|
|
18
|
+
* Returns sorted order or error if cycles detected
|
|
19
|
+
*/
|
|
20
|
+
export declare function topologicalSort(graph: DependencyGraph): Result<SemanticPath[], ValidationError>;
|
|
21
|
+
/**
|
|
22
|
+
* Detect cycles in the dependency graph
|
|
23
|
+
* Returns array of cycle paths or null if no cycles
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectCycles(graph: DependencyGraph): SemanticPath[][] | null;
|
|
26
|
+
/**
|
|
27
|
+
* Get all dependencies (transitive) for a given node
|
|
28
|
+
*/
|
|
29
|
+
export declare function getTransitiveDeps(graph: DependencyGraph, node: SemanticPath): Set<SemanticPath>;
|
|
30
|
+
//# sourceMappingURL=dag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../src/evaluator/dag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC;CACpE,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,eAAe,CAW5E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,eAAe,CAAC,CAuD/F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,EAAE,EAAE,GAAG,IAAI,CAqC5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,YAAY,GACjB,GAAG,CAAC,YAAY,CAAC,CAanB"}
|