@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.
Files changed (279) hide show
  1. package/README.md +148 -498
  2. package/dist/__tests__/apply.test.d.ts +2 -0
  3. package/dist/__tests__/apply.test.d.ts.map +1 -0
  4. package/dist/__tests__/apply.test.js +144 -0
  5. package/dist/__tests__/apply.test.js.map +1 -0
  6. package/dist/__tests__/jcs.test.d.ts +2 -0
  7. package/dist/__tests__/jcs.test.d.ts.map +1 -0
  8. package/dist/__tests__/jcs.test.js +45 -0
  9. package/dist/__tests__/jcs.test.js.map +1 -0
  10. package/dist/core/apply.d.ts +17 -0
  11. package/dist/core/apply.d.ts.map +1 -0
  12. package/dist/core/apply.js +130 -0
  13. package/dist/core/apply.js.map +1 -0
  14. package/dist/core/compute.d.ts +17 -0
  15. package/dist/core/compute.d.ts.map +1 -0
  16. package/dist/core/compute.js +287 -0
  17. package/dist/core/compute.js.map +1 -0
  18. package/dist/core/compute.test.d.ts +2 -0
  19. package/dist/core/compute.test.d.ts.map +1 -0
  20. package/dist/core/compute.test.js +633 -0
  21. package/dist/core/compute.test.js.map +1 -0
  22. package/dist/core/explain.d.ts +14 -0
  23. package/dist/core/explain.d.ts.map +1 -0
  24. package/dist/core/explain.js +78 -0
  25. package/dist/core/explain.js.map +1 -0
  26. package/dist/core/index.d.ts +5 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/core/index.js +5 -0
  29. package/dist/core/index.js.map +1 -0
  30. package/dist/core/validate.d.ts +16 -0
  31. package/dist/core/validate.d.ts.map +1 -0
  32. package/dist/core/validate.js +361 -0
  33. package/dist/core/validate.js.map +1 -0
  34. package/dist/core/validate.test.d.ts +2 -0
  35. package/dist/core/validate.test.d.ts.map +1 -0
  36. package/dist/core/validate.test.js +638 -0
  37. package/dist/core/validate.test.js.map +1 -0
  38. package/dist/core/validation-utils.d.ts +20 -0
  39. package/dist/core/validation-utils.d.ts.map +1 -0
  40. package/dist/core/validation-utils.js +289 -0
  41. package/dist/core/validation-utils.js.map +1 -0
  42. package/dist/errors.d.ts +30 -0
  43. package/dist/errors.d.ts.map +1 -0
  44. package/dist/errors.js +51 -0
  45. package/dist/errors.js.map +1 -0
  46. package/dist/evaluator/computed.d.ts +14 -0
  47. package/dist/evaluator/computed.d.ts.map +1 -0
  48. package/dist/evaluator/computed.js +60 -0
  49. package/dist/evaluator/computed.js.map +1 -0
  50. package/dist/evaluator/context.d.ts +59 -0
  51. package/dist/evaluator/context.d.ts.map +1 -0
  52. package/dist/evaluator/context.js +41 -0
  53. package/dist/evaluator/context.js.map +1 -0
  54. package/dist/evaluator/dag.d.ts +30 -0
  55. package/dist/evaluator/dag.d.ts.map +1 -0
  56. package/dist/evaluator/dag.js +121 -0
  57. package/dist/evaluator/dag.js.map +1 -0
  58. package/dist/evaluator/expr.d.ts +11 -0
  59. package/dist/evaluator/expr.d.ts.map +1 -0
  60. package/dist/evaluator/expr.js +649 -0
  61. package/dist/evaluator/expr.js.map +1 -0
  62. package/dist/evaluator/expr.test.d.ts +2 -0
  63. package/dist/evaluator/expr.test.d.ts.map +1 -0
  64. package/dist/evaluator/expr.test.js +449 -0
  65. package/dist/evaluator/expr.test.js.map +1 -0
  66. package/dist/evaluator/flow.d.ts +35 -0
  67. package/dist/evaluator/flow.d.ts.map +1 -0
  68. package/dist/evaluator/flow.js +387 -0
  69. package/dist/evaluator/flow.js.map +1 -0
  70. package/dist/evaluator/flow.test.d.ts +2 -0
  71. package/dist/evaluator/flow.test.d.ts.map +1 -0
  72. package/dist/evaluator/flow.test.js +499 -0
  73. package/dist/evaluator/flow.test.js.map +1 -0
  74. package/dist/evaluator/index.d.ts +6 -0
  75. package/dist/evaluator/index.d.ts.map +1 -0
  76. package/dist/evaluator/index.js +6 -0
  77. package/dist/evaluator/index.js.map +1 -0
  78. package/dist/factories.d.ts +22 -0
  79. package/dist/factories.d.ts.map +1 -0
  80. package/dist/factories.js +44 -0
  81. package/dist/factories.js.map +1 -0
  82. package/dist/index.d.ts +47 -11
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +30 -45
  85. package/dist/index.js.map +1 -1
  86. package/dist/index.test.d.ts +2 -0
  87. package/dist/index.test.d.ts.map +1 -0
  88. package/dist/index.test.js +13 -0
  89. package/dist/index.test.js.map +1 -0
  90. package/dist/schema/action.d.ts +14 -0
  91. package/dist/schema/action.d.ts.map +1 -0
  92. package/dist/schema/action.js +30 -0
  93. package/dist/schema/action.js.map +1 -0
  94. package/dist/schema/common.d.ts +37 -0
  95. package/dist/schema/common.d.ts.map +1 -0
  96. package/dist/schema/common.js +20 -0
  97. package/dist/schema/common.js.map +1 -0
  98. package/dist/schema/computed.d.ts +23 -0
  99. package/dist/schema/computed.d.ts.map +1 -0
  100. package/dist/schema/computed.js +34 -0
  101. package/dist/schema/computed.js.map +1 -0
  102. package/dist/schema/domain.d.ts +50 -0
  103. package/dist/schema/domain.d.ts.map +1 -0
  104. package/dist/schema/domain.js +60 -0
  105. package/dist/schema/domain.js.map +1 -0
  106. package/dist/schema/expr.d.ts +303 -0
  107. package/dist/schema/expr.d.ts.map +1 -0
  108. package/dist/schema/expr.js +283 -0
  109. package/dist/schema/expr.js.map +1 -0
  110. package/dist/schema/field.d.ts +48 -0
  111. package/dist/schema/field.d.ts.map +1 -0
  112. package/dist/schema/field.js +31 -0
  113. package/dist/schema/field.js.map +1 -0
  114. package/dist/schema/flow.d.ts +103 -0
  115. package/dist/schema/flow.d.ts.map +1 -0
  116. package/dist/schema/flow.js +82 -0
  117. package/dist/schema/flow.js.map +1 -0
  118. package/dist/schema/host-context.d.ts +12 -0
  119. package/dist/schema/host-context.d.ts.map +1 -0
  120. package/dist/schema/host-context.js +23 -0
  121. package/dist/schema/host-context.js.map +1 -0
  122. package/dist/schema/index.d.ts +13 -2
  123. package/dist/schema/index.d.ts.map +1 -1
  124. package/dist/schema/index.js +25 -2
  125. package/dist/schema/index.js.map +1 -1
  126. package/dist/schema/patch.d.ts +59 -0
  127. package/dist/schema/patch.d.ts.map +1 -0
  128. package/dist/schema/patch.js +60 -0
  129. package/dist/schema/patch.js.map +1 -0
  130. package/dist/schema/result.d.ts +142 -0
  131. package/dist/schema/result.d.ts.map +1 -0
  132. package/dist/schema/result.js +94 -0
  133. package/dist/schema/result.js.map +1 -0
  134. package/dist/schema/snapshot.d.ts +153 -0
  135. package/dist/schema/snapshot.d.ts.map +1 -0
  136. package/dist/schema/snapshot.js +160 -0
  137. package/dist/schema/snapshot.js.map +1 -0
  138. package/dist/schema/trace.d.ts +98 -0
  139. package/dist/schema/trace.d.ts.map +1 -0
  140. package/dist/schema/trace.js +90 -0
  141. package/dist/schema/trace.js.map +1 -0
  142. package/dist/schema/type-spec.d.ts +34 -0
  143. package/dist/schema/type-spec.d.ts.map +1 -0
  144. package/dist/schema/type-spec.js +40 -0
  145. package/dist/schema/type-spec.js.map +1 -0
  146. package/dist/utils/canonical.d.ts +37 -0
  147. package/dist/utils/canonical.d.ts.map +1 -0
  148. package/dist/utils/canonical.js +122 -0
  149. package/dist/utils/canonical.js.map +1 -0
  150. package/dist/utils/canonical.test.d.ts +2 -0
  151. package/dist/utils/canonical.test.d.ts.map +1 -0
  152. package/dist/utils/canonical.test.js +183 -0
  153. package/dist/utils/canonical.test.js.map +1 -0
  154. package/dist/utils/hash.d.ts +28 -0
  155. package/dist/utils/hash.d.ts.map +1 -0
  156. package/dist/utils/hash.js +152 -0
  157. package/dist/utils/hash.js.map +1 -0
  158. package/dist/utils/hash.test.d.ts +2 -0
  159. package/dist/utils/hash.test.d.ts.map +1 -0
  160. package/dist/utils/hash.test.js +170 -0
  161. package/dist/utils/hash.test.js.map +1 -0
  162. package/dist/utils/index.d.ts +4 -0
  163. package/dist/utils/index.d.ts.map +1 -0
  164. package/dist/utils/index.js +4 -0
  165. package/dist/utils/index.js.map +1 -0
  166. package/dist/utils/path.d.ts +40 -0
  167. package/dist/utils/path.d.ts.map +1 -0
  168. package/dist/utils/path.js +132 -0
  169. package/dist/utils/path.js.map +1 -0
  170. package/dist/utils/path.test.d.ts +2 -0
  171. package/dist/utils/path.test.d.ts.map +1 -0
  172. package/dist/utils/path.test.js +191 -0
  173. package/dist/utils/path.test.js.map +1 -0
  174. package/package.json +28 -41
  175. package/LICENSE +0 -21
  176. package/dist/dag/graph.d.ts +0 -62
  177. package/dist/dag/graph.d.ts.map +0 -1
  178. package/dist/dag/graph.js +0 -244
  179. package/dist/dag/graph.js.map +0 -1
  180. package/dist/dag/index.d.ts +0 -4
  181. package/dist/dag/index.d.ts.map +0 -1
  182. package/dist/dag/index.js +0 -4
  183. package/dist/dag/index.js.map +0 -1
  184. package/dist/dag/propagation.d.ts +0 -58
  185. package/dist/dag/propagation.d.ts.map +0 -1
  186. package/dist/dag/propagation.js +0 -224
  187. package/dist/dag/propagation.js.map +0 -1
  188. package/dist/dag/topological.d.ts +0 -33
  189. package/dist/dag/topological.d.ts.map +0 -1
  190. package/dist/dag/topological.js +0 -173
  191. package/dist/dag/topological.js.map +0 -1
  192. package/dist/domain/define.d.ts +0 -82
  193. package/dist/domain/define.d.ts.map +0 -1
  194. package/dist/domain/define.js +0 -105
  195. package/dist/domain/define.js.map +0 -1
  196. package/dist/domain/index.d.ts +0 -4
  197. package/dist/domain/index.d.ts.map +0 -1
  198. package/dist/domain/index.js +0 -4
  199. package/dist/domain/index.js.map +0 -1
  200. package/dist/domain/types.d.ts +0 -203
  201. package/dist/domain/types.d.ts.map +0 -1
  202. package/dist/domain/types.js +0 -2
  203. package/dist/domain/types.js.map +0 -1
  204. package/dist/domain/validate.d.ts +0 -17
  205. package/dist/domain/validate.d.ts.map +0 -1
  206. package/dist/domain/validate.js +0 -204
  207. package/dist/domain/validate.js.map +0 -1
  208. package/dist/effect/index.d.ts +0 -4
  209. package/dist/effect/index.d.ts.map +0 -1
  210. package/dist/effect/index.js +0 -4
  211. package/dist/effect/index.js.map +0 -1
  212. package/dist/effect/result.d.ts +0 -100
  213. package/dist/effect/result.d.ts.map +0 -1
  214. package/dist/effect/result.js +0 -163
  215. package/dist/effect/result.js.map +0 -1
  216. package/dist/effect/runner.d.ts +0 -98
  217. package/dist/effect/runner.d.ts.map +0 -1
  218. package/dist/effect/runner.js +0 -321
  219. package/dist/effect/runner.js.map +0 -1
  220. package/dist/effect/types.d.ts +0 -169
  221. package/dist/effect/types.d.ts.map +0 -1
  222. package/dist/effect/types.js +0 -28
  223. package/dist/effect/types.js.map +0 -1
  224. package/dist/expression/analyzer.d.ts +0 -42
  225. package/dist/expression/analyzer.d.ts.map +0 -1
  226. package/dist/expression/analyzer.js +0 -166
  227. package/dist/expression/analyzer.js.map +0 -1
  228. package/dist/expression/evaluator.d.ts +0 -16
  229. package/dist/expression/evaluator.d.ts.map +0 -1
  230. package/dist/expression/evaluator.js +0 -382
  231. package/dist/expression/evaluator.js.map +0 -1
  232. package/dist/expression/index.d.ts +0 -5
  233. package/dist/expression/index.d.ts.map +0 -1
  234. package/dist/expression/index.js +0 -5
  235. package/dist/expression/index.js.map +0 -1
  236. package/dist/expression/parser.d.ts +0 -37
  237. package/dist/expression/parser.d.ts.map +0 -1
  238. package/dist/expression/parser.js +0 -201
  239. package/dist/expression/parser.js.map +0 -1
  240. package/dist/expression/types.d.ts +0 -123
  241. package/dist/expression/types.d.ts.map +0 -1
  242. package/dist/expression/types.js +0 -10
  243. package/dist/expression/types.js.map +0 -1
  244. package/dist/policy/field-policy.d.ts +0 -63
  245. package/dist/policy/field-policy.d.ts.map +0 -1
  246. package/dist/policy/field-policy.js +0 -138
  247. package/dist/policy/field-policy.js.map +0 -1
  248. package/dist/policy/index.d.ts +0 -3
  249. package/dist/policy/index.d.ts.map +0 -1
  250. package/dist/policy/index.js +0 -3
  251. package/dist/policy/index.js.map +0 -1
  252. package/dist/policy/precondition.d.ts +0 -58
  253. package/dist/policy/precondition.d.ts.map +0 -1
  254. package/dist/policy/precondition.js +0 -115
  255. package/dist/policy/precondition.js.map +0 -1
  256. package/dist/runtime/index.d.ts +0 -4
  257. package/dist/runtime/index.d.ts.map +0 -1
  258. package/dist/runtime/index.js +0 -4
  259. package/dist/runtime/index.js.map +0 -1
  260. package/dist/runtime/runtime.d.ts +0 -94
  261. package/dist/runtime/runtime.d.ts.map +0 -1
  262. package/dist/runtime/runtime.js +0 -294
  263. package/dist/runtime/runtime.js.map +0 -1
  264. package/dist/runtime/snapshot.d.ts +0 -39
  265. package/dist/runtime/snapshot.d.ts.map +0 -1
  266. package/dist/runtime/snapshot.js +0 -264
  267. package/dist/runtime/snapshot.js.map +0 -1
  268. package/dist/runtime/subscription.d.ts +0 -82
  269. package/dist/runtime/subscription.d.ts.map +0 -1
  270. package/dist/runtime/subscription.js +0 -222
  271. package/dist/runtime/subscription.js.map +0 -1
  272. package/dist/schema/integration.d.ts +0 -89
  273. package/dist/schema/integration.d.ts.map +0 -1
  274. package/dist/schema/integration.js +0 -171
  275. package/dist/schema/integration.js.map +0 -1
  276. package/dist/schema/validation.d.ts +0 -51
  277. package/dist/schema/validation.d.ts.map +0 -1
  278. package/dist/schema/validation.js +0 -212
  279. 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":"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"}
@@ -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":"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"}
@@ -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"}