@manifesto-ai/core 0.2.0 → 1.0.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 (259) hide show
  1. package/README.md +130 -368
  2. package/dist/core/apply.d.ts +16 -0
  3. package/dist/core/apply.d.ts.map +1 -0
  4. package/dist/core/apply.js +52 -0
  5. package/dist/core/apply.js.map +1 -0
  6. package/dist/core/compute.d.ts +17 -0
  7. package/dist/core/compute.d.ts.map +1 -0
  8. package/dist/core/compute.js +197 -0
  9. package/dist/core/compute.js.map +1 -0
  10. package/dist/core/compute.test.d.ts +2 -0
  11. package/dist/core/compute.test.d.ts.map +1 -0
  12. package/dist/core/compute.test.js +400 -0
  13. package/dist/core/compute.test.js.map +1 -0
  14. package/dist/core/explain.d.ts +14 -0
  15. package/dist/core/explain.d.ts.map +1 -0
  16. package/dist/core/explain.js +74 -0
  17. package/dist/core/explain.js.map +1 -0
  18. package/dist/core/index.d.ts +5 -0
  19. package/dist/core/index.d.ts.map +1 -0
  20. package/dist/core/index.js +5 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/core/validate.d.ts +15 -0
  23. package/dist/core/validate.d.ts.map +1 -0
  24. package/dist/core/validate.js +143 -0
  25. package/dist/core/validate.js.map +1 -0
  26. package/dist/core/validate.test.d.ts +2 -0
  27. package/dist/core/validate.test.d.ts.map +1 -0
  28. package/dist/core/validate.test.js +450 -0
  29. package/dist/core/validate.test.js.map +1 -0
  30. package/dist/errors.d.ts +30 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +51 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/evaluator/computed.d.ts +14 -0
  35. package/dist/evaluator/computed.d.ts.map +1 -0
  36. package/dist/evaluator/computed.js +57 -0
  37. package/dist/evaluator/computed.js.map +1 -0
  38. package/dist/evaluator/context.d.ts +46 -0
  39. package/dist/evaluator/context.d.ts.map +1 -0
  40. package/dist/evaluator/context.js +35 -0
  41. package/dist/evaluator/context.js.map +1 -0
  42. package/dist/evaluator/dag.d.ts +30 -0
  43. package/dist/evaluator/dag.d.ts.map +1 -0
  44. package/dist/evaluator/dag.js +121 -0
  45. package/dist/evaluator/dag.js.map +1 -0
  46. package/dist/evaluator/expr.d.ts +11 -0
  47. package/dist/evaluator/expr.d.ts.map +1 -0
  48. package/dist/evaluator/expr.js +498 -0
  49. package/dist/evaluator/expr.js.map +1 -0
  50. package/dist/evaluator/expr.test.d.ts +2 -0
  51. package/dist/evaluator/expr.test.d.ts.map +1 -0
  52. package/dist/evaluator/expr.test.js +426 -0
  53. package/dist/evaluator/expr.test.js.map +1 -0
  54. package/dist/evaluator/flow.d.ts +35 -0
  55. package/dist/evaluator/flow.d.ts.map +1 -0
  56. package/dist/evaluator/flow.js +234 -0
  57. package/dist/evaluator/flow.js.map +1 -0
  58. package/dist/evaluator/flow.test.d.ts +2 -0
  59. package/dist/evaluator/flow.test.d.ts.map +1 -0
  60. package/dist/evaluator/flow.test.js +446 -0
  61. package/dist/evaluator/flow.test.js.map +1 -0
  62. package/dist/evaluator/index.d.ts +6 -0
  63. package/dist/evaluator/index.d.ts.map +1 -0
  64. package/dist/evaluator/index.js +6 -0
  65. package/dist/evaluator/index.js.map +1 -0
  66. package/dist/factories.d.ts +20 -0
  67. package/dist/factories.d.ts.map +1 -0
  68. package/dist/factories.js +43 -0
  69. package/dist/factories.js.map +1 -0
  70. package/dist/index.d.ts +46 -11
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +30 -45
  73. package/dist/index.js.map +1 -1
  74. package/dist/index.test.d.ts +2 -0
  75. package/dist/index.test.d.ts.map +1 -0
  76. package/dist/index.test.js +13 -0
  77. package/dist/index.test.js.map +1 -0
  78. package/dist/schema/action.d.ts +14 -0
  79. package/dist/schema/action.d.ts.map +1 -0
  80. package/dist/schema/action.js +30 -0
  81. package/dist/schema/action.js.map +1 -0
  82. package/dist/schema/common.d.ts +37 -0
  83. package/dist/schema/common.d.ts.map +1 -0
  84. package/dist/schema/common.js +20 -0
  85. package/dist/schema/common.js.map +1 -0
  86. package/dist/schema/computed.d.ts +23 -0
  87. package/dist/schema/computed.d.ts.map +1 -0
  88. package/dist/schema/computed.js +34 -0
  89. package/dist/schema/computed.js.map +1 -0
  90. package/dist/schema/domain.d.ts +46 -0
  91. package/dist/schema/domain.d.ts.map +1 -0
  92. package/dist/schema/domain.js +54 -0
  93. package/dist/schema/domain.js.map +1 -0
  94. package/dist/schema/expr.d.ts +260 -0
  95. package/dist/schema/expr.d.ts.map +1 -0
  96. package/dist/schema/expr.js +247 -0
  97. package/dist/schema/expr.js.map +1 -0
  98. package/dist/schema/field.d.ts +48 -0
  99. package/dist/schema/field.d.ts.map +1 -0
  100. package/dist/schema/field.js +31 -0
  101. package/dist/schema/field.js.map +1 -0
  102. package/dist/schema/flow.d.ts +103 -0
  103. package/dist/schema/flow.d.ts.map +1 -0
  104. package/dist/schema/flow.js +82 -0
  105. package/dist/schema/flow.js.map +1 -0
  106. package/dist/schema/index.d.ts +11 -2
  107. package/dist/schema/index.d.ts.map +1 -1
  108. package/dist/schema/index.js +22 -2
  109. package/dist/schema/index.js.map +1 -1
  110. package/dist/schema/patch.d.ts +59 -0
  111. package/dist/schema/patch.d.ts.map +1 -0
  112. package/dist/schema/patch.js +60 -0
  113. package/dist/schema/patch.js.map +1 -0
  114. package/dist/schema/result.d.ts +130 -0
  115. package/dist/schema/result.d.ts.map +1 -0
  116. package/dist/schema/result.js +90 -0
  117. package/dist/schema/result.js.map +1 -0
  118. package/dist/schema/snapshot.d.ts +151 -0
  119. package/dist/schema/snapshot.d.ts.map +1 -0
  120. package/dist/schema/snapshot.js +156 -0
  121. package/dist/schema/snapshot.js.map +1 -0
  122. package/dist/schema/trace.d.ts +87 -0
  123. package/dist/schema/trace.d.ts.map +1 -0
  124. package/dist/schema/trace.js +79 -0
  125. package/dist/schema/trace.js.map +1 -0
  126. package/dist/utils/canonical.d.ts +29 -0
  127. package/dist/utils/canonical.d.ts.map +1 -0
  128. package/dist/utils/canonical.js +56 -0
  129. package/dist/utils/canonical.js.map +1 -0
  130. package/dist/utils/canonical.test.d.ts +2 -0
  131. package/dist/utils/canonical.test.d.ts.map +1 -0
  132. package/dist/utils/canonical.test.js +153 -0
  133. package/dist/utils/canonical.test.js.map +1 -0
  134. package/dist/utils/hash.d.ts +20 -0
  135. package/dist/utils/hash.d.ts.map +1 -0
  136. package/dist/utils/hash.js +38 -0
  137. package/dist/utils/hash.js.map +1 -0
  138. package/dist/utils/hash.test.d.ts +2 -0
  139. package/dist/utils/hash.test.d.ts.map +1 -0
  140. package/dist/utils/hash.test.js +146 -0
  141. package/dist/utils/hash.test.js.map +1 -0
  142. package/dist/utils/index.d.ts +4 -0
  143. package/dist/utils/index.d.ts.map +1 -0
  144. package/dist/utils/index.js +4 -0
  145. package/dist/utils/index.js.map +1 -0
  146. package/dist/utils/path.d.ts +40 -0
  147. package/dist/utils/path.d.ts.map +1 -0
  148. package/dist/utils/path.js +132 -0
  149. package/dist/utils/path.js.map +1 -0
  150. package/dist/utils/path.test.d.ts +2 -0
  151. package/dist/utils/path.test.d.ts.map +1 -0
  152. package/dist/utils/path.test.js +191 -0
  153. package/dist/utils/path.test.js.map +1 -0
  154. package/package.json +28 -42
  155. package/LICENSE +0 -21
  156. package/dist/dag/graph.d.ts +0 -62
  157. package/dist/dag/graph.d.ts.map +0 -1
  158. package/dist/dag/graph.js +0 -244
  159. package/dist/dag/graph.js.map +0 -1
  160. package/dist/dag/index.d.ts +0 -4
  161. package/dist/dag/index.d.ts.map +0 -1
  162. package/dist/dag/index.js +0 -4
  163. package/dist/dag/index.js.map +0 -1
  164. package/dist/dag/propagation.d.ts +0 -58
  165. package/dist/dag/propagation.d.ts.map +0 -1
  166. package/dist/dag/propagation.js +0 -224
  167. package/dist/dag/propagation.js.map +0 -1
  168. package/dist/dag/topological.d.ts +0 -33
  169. package/dist/dag/topological.d.ts.map +0 -1
  170. package/dist/dag/topological.js +0 -173
  171. package/dist/dag/topological.js.map +0 -1
  172. package/dist/domain/define.d.ts +0 -82
  173. package/dist/domain/define.d.ts.map +0 -1
  174. package/dist/domain/define.js +0 -91
  175. package/dist/domain/define.js.map +0 -1
  176. package/dist/domain/index.d.ts +0 -4
  177. package/dist/domain/index.d.ts.map +0 -1
  178. package/dist/domain/index.js +0 -4
  179. package/dist/domain/index.js.map +0 -1
  180. package/dist/domain/types.d.ts +0 -203
  181. package/dist/domain/types.d.ts.map +0 -1
  182. package/dist/domain/types.js +0 -2
  183. package/dist/domain/types.js.map +0 -1
  184. package/dist/domain/validate.d.ts +0 -17
  185. package/dist/domain/validate.d.ts.map +0 -1
  186. package/dist/domain/validate.js +0 -204
  187. package/dist/domain/validate.js.map +0 -1
  188. package/dist/effect/index.d.ts +0 -4
  189. package/dist/effect/index.d.ts.map +0 -1
  190. package/dist/effect/index.js +0 -4
  191. package/dist/effect/index.js.map +0 -1
  192. package/dist/effect/result.d.ts +0 -100
  193. package/dist/effect/result.d.ts.map +0 -1
  194. package/dist/effect/result.js +0 -163
  195. package/dist/effect/result.js.map +0 -1
  196. package/dist/effect/runner.d.ts +0 -98
  197. package/dist/effect/runner.d.ts.map +0 -1
  198. package/dist/effect/runner.js +0 -321
  199. package/dist/effect/runner.js.map +0 -1
  200. package/dist/effect/types.d.ts +0 -169
  201. package/dist/effect/types.d.ts.map +0 -1
  202. package/dist/effect/types.js +0 -28
  203. package/dist/effect/types.js.map +0 -1
  204. package/dist/expression/analyzer.d.ts +0 -42
  205. package/dist/expression/analyzer.d.ts.map +0 -1
  206. package/dist/expression/analyzer.js +0 -166
  207. package/dist/expression/analyzer.js.map +0 -1
  208. package/dist/expression/evaluator.d.ts +0 -16
  209. package/dist/expression/evaluator.d.ts.map +0 -1
  210. package/dist/expression/evaluator.js +0 -382
  211. package/dist/expression/evaluator.js.map +0 -1
  212. package/dist/expression/index.d.ts +0 -5
  213. package/dist/expression/index.d.ts.map +0 -1
  214. package/dist/expression/index.js +0 -5
  215. package/dist/expression/index.js.map +0 -1
  216. package/dist/expression/parser.d.ts +0 -37
  217. package/dist/expression/parser.d.ts.map +0 -1
  218. package/dist/expression/parser.js +0 -201
  219. package/dist/expression/parser.js.map +0 -1
  220. package/dist/expression/types.d.ts +0 -123
  221. package/dist/expression/types.d.ts.map +0 -1
  222. package/dist/expression/types.js +0 -10
  223. package/dist/expression/types.js.map +0 -1
  224. package/dist/policy/field-policy.d.ts +0 -63
  225. package/dist/policy/field-policy.d.ts.map +0 -1
  226. package/dist/policy/field-policy.js +0 -138
  227. package/dist/policy/field-policy.js.map +0 -1
  228. package/dist/policy/index.d.ts +0 -3
  229. package/dist/policy/index.d.ts.map +0 -1
  230. package/dist/policy/index.js +0 -3
  231. package/dist/policy/index.js.map +0 -1
  232. package/dist/policy/precondition.d.ts +0 -58
  233. package/dist/policy/precondition.d.ts.map +0 -1
  234. package/dist/policy/precondition.js +0 -115
  235. package/dist/policy/precondition.js.map +0 -1
  236. package/dist/runtime/index.d.ts +0 -4
  237. package/dist/runtime/index.d.ts.map +0 -1
  238. package/dist/runtime/index.js +0 -4
  239. package/dist/runtime/index.js.map +0 -1
  240. package/dist/runtime/runtime.d.ts +0 -94
  241. package/dist/runtime/runtime.d.ts.map +0 -1
  242. package/dist/runtime/runtime.js +0 -294
  243. package/dist/runtime/runtime.js.map +0 -1
  244. package/dist/runtime/snapshot.d.ts +0 -39
  245. package/dist/runtime/snapshot.d.ts.map +0 -1
  246. package/dist/runtime/snapshot.js +0 -264
  247. package/dist/runtime/snapshot.js.map +0 -1
  248. package/dist/runtime/subscription.d.ts +0 -82
  249. package/dist/runtime/subscription.d.ts.map +0 -1
  250. package/dist/runtime/subscription.js +0 -222
  251. package/dist/runtime/subscription.js.map +0 -1
  252. package/dist/schema/integration.d.ts +0 -89
  253. package/dist/schema/integration.d.ts.map +0 -1
  254. package/dist/schema/integration.js +0 -171
  255. package/dist/schema/integration.js.map +0 -1
  256. package/dist/schema/validation.d.ts +0 -51
  257. package/dist/schema/validation.d.ts.map +0 -1
  258. package/dist/schema/validation.js +0 -212
  259. package/dist/schema/validation.js.map +0 -1
@@ -0,0 +1,74 @@
1
+ import { createTraceNode } from "../schema/trace.js";
2
+ import { getByPath } from "../utils/path.js";
3
+ import { createContext } from "../evaluator/context.js";
4
+ import { evaluateExpr } from "../evaluator/expr.js";
5
+ import { isOk } from "../schema/common.js";
6
+ /**
7
+ * Explain why a value is what it is
8
+ *
9
+ * @param schema - The domain schema
10
+ * @param snapshot - Current snapshot state
11
+ * @param path - The path to explain
12
+ * @returns ExplainResult with value, trace, and dependencies
13
+ */
14
+ export function explain(schema, snapshot, path) {
15
+ // Check if it's a computed path
16
+ if (path.startsWith("computed.")) {
17
+ return explainComputed(schema, snapshot, path);
18
+ }
19
+ // Check if it's a system path
20
+ if (path.startsWith("system.")) {
21
+ const value = getByPath(snapshot.system, path.slice(7));
22
+ return {
23
+ value,
24
+ trace: createTraceNode("expr", path, { path }, value, []),
25
+ deps: [],
26
+ };
27
+ }
28
+ // Check if it's an input path
29
+ if (path.startsWith("input.") || path === "input") {
30
+ const value = path === "input" ? snapshot.input : getByPath(snapshot.input, path.slice(6));
31
+ return {
32
+ value,
33
+ trace: createTraceNode("expr", path, { path }, value, []),
34
+ deps: [],
35
+ };
36
+ }
37
+ // Default: it's a data path
38
+ const value = getByPath(snapshot.data, path);
39
+ return {
40
+ value,
41
+ trace: createTraceNode("expr", path, { path }, value, []),
42
+ deps: [],
43
+ };
44
+ }
45
+ /**
46
+ * Explain a computed value
47
+ */
48
+ function explainComputed(schema, snapshot, path) {
49
+ const spec = schema.computed.fields[path];
50
+ if (!spec) {
51
+ // Not a computed field, just return the stored value
52
+ const value = snapshot.computed[path];
53
+ return {
54
+ value,
55
+ trace: createTraceNode("computed", path, { path }, value, []),
56
+ deps: [],
57
+ };
58
+ }
59
+ // Evaluate the expression to get the trace
60
+ const ctx = createContext(snapshot, schema, null, path);
61
+ const result = evaluateExpr(spec.expr, ctx);
62
+ const value = isOk(result) ? result.value : null;
63
+ // Build trace with dependency information
64
+ const childTraces = spec.deps.map((dep) => {
65
+ const depResult = explain(schema, snapshot, dep);
66
+ return depResult.trace;
67
+ });
68
+ return {
69
+ value,
70
+ trace: createTraceNode("computed", path, { expr: spec.expr }, value, childTraces),
71
+ deps: spec.deps,
72
+ };
73
+ }
74
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/core/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { validate } from "./validate.js";
2
+ export { apply } from "./apply.js";
3
+ export { compute } from "./compute.js";
4
+ export { explain } from "./explain.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { validate } from "./validate.js";
2
+ export { apply } from "./apply.js";
3
+ export { compute } from "./compute.js";
4
+ export { explain } from "./explain.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ValidationResult } from "../schema/result.js";
2
+ /**
3
+ * Validate a domain schema
4
+ *
5
+ * Validation rules:
6
+ * - V-001: All paths in ComputedSpec.deps MUST exist
7
+ * - V-002: ComputedSpec dependency graph MUST be acyclic
8
+ * - V-003: All paths in ExprNode.get MUST exist (TODO: implement path validation)
9
+ * - V-004: All `call` references in FlowSpec MUST exist
10
+ * - V-005: FlowSpec `call` graph MUST be acyclic
11
+ * - V-006: ActionSpec.available expression MUST return boolean (runtime check)
12
+ * - V-007: ActionSpec.input MUST be valid FieldSpec (Zod handles this)
13
+ */
14
+ export declare function validate(schema: unknown): ValidationResult;
15
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAC;AAK7E;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAiD1D"}
@@ -0,0 +1,143 @@
1
+ import { DomainSchema } from "../schema/domain.js";
2
+ import { validResult, invalidResult } from "../schema/result.js";
3
+ import { buildDependencyGraph, topologicalSort, detectCycles } from "../evaluator/dag.js";
4
+ import { isErr } from "../schema/common.js";
5
+ /**
6
+ * Validate a domain schema
7
+ *
8
+ * Validation rules:
9
+ * - V-001: All paths in ComputedSpec.deps MUST exist
10
+ * - V-002: ComputedSpec dependency graph MUST be acyclic
11
+ * - V-003: All paths in ExprNode.get MUST exist (TODO: implement path validation)
12
+ * - V-004: All `call` references in FlowSpec MUST exist
13
+ * - V-005: FlowSpec `call` graph MUST be acyclic
14
+ * - V-006: ActionSpec.available expression MUST return boolean (runtime check)
15
+ * - V-007: ActionSpec.input MUST be valid FieldSpec (Zod handles this)
16
+ */
17
+ export function validate(schema) {
18
+ const errors = [];
19
+ // First, validate with Zod schema
20
+ const parseResult = DomainSchema.safeParse(schema);
21
+ if (!parseResult.success) {
22
+ const zodErrors = parseResult.error.issues.map((e) => ({
23
+ code: "SCHEMA_ERROR",
24
+ message: e.message,
25
+ path: e.path.map(String).join("."),
26
+ }));
27
+ return invalidResult(zodErrors);
28
+ }
29
+ const domainSchema = parseResult.data;
30
+ // V-002: Check computed dependency graph is acyclic
31
+ const depGraph = buildDependencyGraph(domainSchema.computed);
32
+ const sortResult = topologicalSort(depGraph);
33
+ if (isErr(sortResult)) {
34
+ errors.push(sortResult.error);
35
+ }
36
+ // Additional cycle detection for detailed error
37
+ const cycles = detectCycles(depGraph);
38
+ if (cycles) {
39
+ for (const cycle of cycles) {
40
+ errors.push({
41
+ code: "V-002",
42
+ message: `Cyclic dependency: ${cycle.join(" -> ")}`,
43
+ path: cycle[0],
44
+ });
45
+ }
46
+ }
47
+ // V-004: Check all call references exist
48
+ const actionNames = new Set(Object.keys(domainSchema.actions));
49
+ const callErrors = validateCallReferences(domainSchema, actionNames);
50
+ errors.push(...callErrors);
51
+ // V-005: Check call graph is acyclic
52
+ const callCycleErrors = validateCallGraph(domainSchema);
53
+ errors.push(...callCycleErrors);
54
+ if (errors.length > 0) {
55
+ return invalidResult(errors);
56
+ }
57
+ return validResult();
58
+ }
59
+ /**
60
+ * Validate that all call references exist
61
+ */
62
+ function validateCallReferences(schema, actionNames) {
63
+ const errors = [];
64
+ for (const [actionName, action] of Object.entries(schema.actions)) {
65
+ const calls = collectCalls(action.flow);
66
+ for (const callName of calls) {
67
+ if (!actionNames.has(callName)) {
68
+ errors.push({
69
+ code: "V-004",
70
+ message: `Unknown flow reference: "${callName}" in action "${actionName}"`,
71
+ path: `actions.${actionName}`,
72
+ });
73
+ }
74
+ }
75
+ }
76
+ return errors;
77
+ }
78
+ /**
79
+ * Collect all call references from a flow node
80
+ */
81
+ function collectCalls(flow) {
82
+ const calls = [];
83
+ switch (flow.kind) {
84
+ case "call":
85
+ calls.push(flow.flow);
86
+ break;
87
+ case "seq":
88
+ for (const step of flow.steps) {
89
+ calls.push(...collectCalls(step));
90
+ }
91
+ break;
92
+ case "if":
93
+ calls.push(...collectCalls(flow.then));
94
+ if (flow.else) {
95
+ calls.push(...collectCalls(flow.else));
96
+ }
97
+ break;
98
+ }
99
+ return calls;
100
+ }
101
+ /**
102
+ * Validate call graph for cycles
103
+ */
104
+ function validateCallGraph(schema) {
105
+ const errors = [];
106
+ // Build call graph
107
+ const edges = new Map();
108
+ for (const [actionName, action] of Object.entries(schema.actions)) {
109
+ edges.set(actionName, collectCalls(action.flow));
110
+ }
111
+ // Detect cycles using DFS
112
+ const visited = new Set();
113
+ const recursionStack = new Set();
114
+ function dfs(node, path) {
115
+ visited.add(node);
116
+ recursionStack.add(node);
117
+ const deps = edges.get(node) ?? [];
118
+ for (const dep of deps) {
119
+ if (!visited.has(dep)) {
120
+ if (dfs(dep, [...path, dep])) {
121
+ return true;
122
+ }
123
+ }
124
+ else if (recursionStack.has(dep)) {
125
+ errors.push({
126
+ code: "V-005",
127
+ message: `Cyclic call detected: ${[...path, dep].join(" -> ")}`,
128
+ path: `actions.${node}`,
129
+ });
130
+ return true;
131
+ }
132
+ }
133
+ recursionStack.delete(node);
134
+ return false;
135
+ }
136
+ for (const actionName of edges.keys()) {
137
+ if (!visited.has(actionName)) {
138
+ dfs(actionName, [actionName]);
139
+ }
140
+ }
141
+ return errors;
142
+ }
143
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.test.d.ts","sourceRoot":"","sources":["../../src/core/validate.test.ts"],"names":[],"mappings":""}