@manifesto-ai/core 0.3.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 +129 -499
  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 +25 -39
  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 -105
  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,400 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { compute } from "./compute.js";
3
+ import { createSnapshot, createIntent } from "../factories.js";
4
+ // Helper to create a minimal domain schema
5
+ function createTestSchema(overrides = {}) {
6
+ return {
7
+ id: "test",
8
+ version: "1.0.0",
9
+ hash: "test-hash",
10
+ state: { fields: {} },
11
+ computed: { fields: {} },
12
+ actions: {},
13
+ ...overrides,
14
+ };
15
+ }
16
+ describe("compute", () => {
17
+ describe("Basic Intent Processing", () => {
18
+ it("should process a simple action", async () => {
19
+ const schema = createTestSchema({
20
+ actions: {
21
+ increment: {
22
+ flow: {
23
+ kind: "patch",
24
+ op: "set",
25
+ path: "count",
26
+ value: {
27
+ kind: "add",
28
+ left: { kind: "coalesce", args: [{ kind: "get", path: "count" }, { kind: "lit", value: 0 }] },
29
+ right: { kind: "lit", value: 1 },
30
+ },
31
+ },
32
+ },
33
+ },
34
+ });
35
+ const snapshot = createSnapshot({ count: 0 }, "test-hash");
36
+ const intent = createIntent("increment");
37
+ const result = await compute(schema, snapshot, intent);
38
+ expect(result.status).toBe("complete");
39
+ expect(result.snapshot.data).toEqual({ count: 1 });
40
+ expect(result.snapshot.meta.version).toBe(1);
41
+ });
42
+ it("should handle unknown action", async () => {
43
+ const schema = createTestSchema();
44
+ const snapshot = createSnapshot({}, "test-hash");
45
+ const intent = createIntent("nonexistent");
46
+ const result = await compute(schema, snapshot, intent);
47
+ expect(result.status).toBe("error");
48
+ expect(result.snapshot.system.lastError?.code).toBe("UNKNOWN_ACTION");
49
+ });
50
+ it("should handle action with input", async () => {
51
+ const schema = createTestSchema({
52
+ actions: {
53
+ setName: {
54
+ flow: {
55
+ kind: "patch",
56
+ op: "set",
57
+ path: "name",
58
+ value: { kind: "get", path: "input.name" },
59
+ },
60
+ },
61
+ },
62
+ });
63
+ const snapshot = createSnapshot({}, "test-hash");
64
+ const intent = createIntent("setName", { name: "Alice" });
65
+ const result = await compute(schema, snapshot, intent);
66
+ expect(result.status).toBe("complete");
67
+ expect(result.snapshot.data).toEqual({ name: "Alice" });
68
+ });
69
+ });
70
+ describe("Availability Check", () => {
71
+ it("should check availability condition", async () => {
72
+ const schema = createTestSchema({
73
+ actions: {
74
+ withdraw: {
75
+ available: {
76
+ kind: "gt",
77
+ left: { kind: "get", path: "balance" },
78
+ right: { kind: "lit", value: 0 },
79
+ },
80
+ flow: {
81
+ kind: "patch",
82
+ op: "set",
83
+ path: "balance",
84
+ value: {
85
+ kind: "sub",
86
+ left: { kind: "get", path: "balance" },
87
+ right: { kind: "get", path: "input.amount" },
88
+ },
89
+ },
90
+ },
91
+ },
92
+ });
93
+ // Should succeed when balance > 0
94
+ const snapshot1 = createSnapshot({ balance: 100 }, "test-hash");
95
+ const intent1 = createIntent("withdraw", { amount: 50 });
96
+ const result1 = await compute(schema, snapshot1, intent1);
97
+ expect(result1.status).toBe("complete");
98
+ expect(result1.snapshot.data).toEqual({ balance: 50 });
99
+ // Should fail when balance = 0
100
+ const snapshot2 = createSnapshot({ balance: 0 }, "test-hash");
101
+ const intent2 = createIntent("withdraw", { amount: 50 });
102
+ const result2 = await compute(schema, snapshot2, intent2);
103
+ expect(result2.status).toBe("error");
104
+ expect(result2.snapshot.system.lastError?.code).toBe("ACTION_UNAVAILABLE");
105
+ });
106
+ });
107
+ describe("Computed Values", () => {
108
+ it("should recompute computed values after action", async () => {
109
+ const schema = createTestSchema({
110
+ computed: {
111
+ fields: {
112
+ "computed.total": {
113
+ expr: {
114
+ kind: "add",
115
+ left: { kind: "coalesce", args: [{ kind: "get", path: "a" }, { kind: "lit", value: 0 }] },
116
+ right: { kind: "coalesce", args: [{ kind: "get", path: "b" }, { kind: "lit", value: 0 }] },
117
+ },
118
+ deps: ["a", "b"],
119
+ },
120
+ },
121
+ },
122
+ actions: {
123
+ setA: {
124
+ flow: {
125
+ kind: "patch",
126
+ op: "set",
127
+ path: "a",
128
+ value: { kind: "get", path: "input.value" },
129
+ },
130
+ },
131
+ },
132
+ });
133
+ const snapshot = createSnapshot({ a: 10, b: 20 }, "test-hash");
134
+ const intent = createIntent("setA", { value: 100 });
135
+ const result = await compute(schema, snapshot, intent);
136
+ expect(result.status).toBe("complete");
137
+ expect(result.snapshot.data).toEqual({ a: 100, b: 20 });
138
+ expect(result.snapshot.computed["computed.total"]).toBe(120);
139
+ });
140
+ });
141
+ describe("Effects (Pending Status)", () => {
142
+ it("should return pending status when effect is encountered", async () => {
143
+ const schema = createTestSchema({
144
+ actions: {
145
+ fetchData: {
146
+ flow: {
147
+ kind: "seq",
148
+ steps: [
149
+ { kind: "patch", op: "set", path: "loading", value: { kind: "lit", value: true } },
150
+ {
151
+ kind: "effect",
152
+ type: "http",
153
+ params: {
154
+ url: { kind: "lit", value: "https://api.example.com/data" },
155
+ },
156
+ },
157
+ ],
158
+ },
159
+ },
160
+ },
161
+ });
162
+ const snapshot = createSnapshot({}, "test-hash");
163
+ const intent = createIntent("fetchData");
164
+ const result = await compute(schema, snapshot, intent);
165
+ expect(result.status).toBe("pending");
166
+ expect(result.snapshot.data).toEqual({ loading: true });
167
+ expect(result.snapshot.system.pendingRequirements).toHaveLength(1);
168
+ expect(result.snapshot.system.pendingRequirements[0].type).toBe("http");
169
+ });
170
+ });
171
+ describe("Halt", () => {
172
+ it("should return halted status when halt is encountered", async () => {
173
+ const schema = createTestSchema({
174
+ actions: {
175
+ conditionalHalt: {
176
+ flow: {
177
+ kind: "seq",
178
+ steps: [
179
+ { kind: "patch", op: "set", path: "started", value: { kind: "lit", value: true } },
180
+ {
181
+ kind: "if",
182
+ cond: { kind: "get", path: "input.shouldHalt" },
183
+ then: { kind: "halt", reason: "User requested halt" },
184
+ },
185
+ { kind: "patch", op: "set", path: "completed", value: { kind: "lit", value: true } },
186
+ ],
187
+ },
188
+ },
189
+ },
190
+ });
191
+ // With halt
192
+ const snapshot1 = createSnapshot({}, "test-hash");
193
+ const intent1 = createIntent("conditionalHalt", { shouldHalt: true });
194
+ const result1 = await compute(schema, snapshot1, intent1);
195
+ expect(result1.status).toBe("halted");
196
+ expect(result1.snapshot.data).toEqual({ started: true });
197
+ // Without halt
198
+ const snapshot2 = createSnapshot({}, "test-hash");
199
+ const intent2 = createIntent("conditionalHalt", { shouldHalt: false });
200
+ const result2 = await compute(schema, snapshot2, intent2);
201
+ expect(result2.status).toBe("complete");
202
+ expect(result2.snapshot.data).toEqual({ started: true, completed: true });
203
+ });
204
+ });
205
+ describe("Error Handling", () => {
206
+ it("should handle fail flow", async () => {
207
+ const schema = createTestSchema({
208
+ actions: {
209
+ validateInput: {
210
+ flow: {
211
+ kind: "if",
212
+ cond: { kind: "isNull", arg: { kind: "get", path: "input.value" } },
213
+ then: { kind: "fail", code: "MISSING_VALUE", message: { kind: "lit", value: "Value is required" } },
214
+ else: { kind: "patch", op: "set", path: "value", value: { kind: "get", path: "input.value" } },
215
+ },
216
+ },
217
+ },
218
+ });
219
+ // With null input
220
+ const snapshot1 = createSnapshot({}, "test-hash");
221
+ const intent1 = createIntent("validateInput", { value: null });
222
+ const result1 = await compute(schema, snapshot1, intent1);
223
+ expect(result1.status).toBe("error");
224
+ expect(result1.snapshot.system.lastError?.message).toBe("Value is required");
225
+ // With valid input
226
+ const snapshot2 = createSnapshot({}, "test-hash");
227
+ const intent2 = createIntent("validateInput", { value: "test" });
228
+ const result2 = await compute(schema, snapshot2, intent2);
229
+ expect(result2.status).toBe("complete");
230
+ expect(result2.snapshot.data).toEqual({ value: "test" });
231
+ });
232
+ });
233
+ describe("Trace Generation", () => {
234
+ it("should generate trace graph", async () => {
235
+ const schema = createTestSchema({
236
+ actions: {
237
+ simpleAction: {
238
+ flow: {
239
+ kind: "seq",
240
+ steps: [
241
+ { kind: "patch", op: "set", path: "a", value: { kind: "lit", value: 1 } },
242
+ { kind: "patch", op: "set", path: "b", value: { kind: "lit", value: 2 } },
243
+ ],
244
+ },
245
+ },
246
+ },
247
+ });
248
+ const snapshot = createSnapshot({}, "test-hash");
249
+ const intent = createIntent("simpleAction");
250
+ const result = await compute(schema, snapshot, intent);
251
+ expect(result.trace).toBeDefined();
252
+ expect(result.trace.intent).toEqual({ type: "simpleAction", input: undefined });
253
+ expect(result.trace.baseVersion).toBe(0);
254
+ expect(result.trace.resultVersion).toBe(1);
255
+ expect(result.trace.duration).toBeGreaterThanOrEqual(0);
256
+ expect(result.trace.terminatedBy).toBe("complete");
257
+ });
258
+ });
259
+ describe("Complex Scenarios", () => {
260
+ it("should handle a todo app workflow", async () => {
261
+ const schema = createTestSchema({
262
+ computed: {
263
+ fields: {
264
+ "computed.activeCount": {
265
+ expr: {
266
+ kind: "len",
267
+ arg: {
268
+ kind: "filter",
269
+ array: { kind: "coalesce", args: [{ kind: "get", path: "todos" }, { kind: "lit", value: [] }] },
270
+ predicate: { kind: "not", arg: { kind: "get", path: "$item.completed" } },
271
+ },
272
+ },
273
+ deps: ["todos"],
274
+ },
275
+ },
276
+ },
277
+ actions: {
278
+ addTodo: {
279
+ flow: {
280
+ kind: "patch",
281
+ op: "set",
282
+ path: "todos",
283
+ value: {
284
+ kind: "coalesce",
285
+ args: [
286
+ {
287
+ kind: "if",
288
+ cond: { kind: "isNull", arg: { kind: "get", path: "todos" } },
289
+ then: { kind: "lit", value: [] },
290
+ else: { kind: "get", path: "todos" },
291
+ },
292
+ { kind: "lit", value: [] },
293
+ ],
294
+ },
295
+ },
296
+ },
297
+ },
298
+ });
299
+ // First add - initialize todos array
300
+ const snapshot = createSnapshot({}, "test-hash");
301
+ const intent = createIntent("addTodo", { text: "Test todo" });
302
+ const result = await compute(schema, snapshot, intent);
303
+ expect(result.status).toBe("complete");
304
+ expect(result.snapshot.computed["computed.activeCount"]).toBe(0);
305
+ });
306
+ it("should handle sequential operations with state dependencies", async () => {
307
+ const schema = createTestSchema({
308
+ actions: {
309
+ transfer: {
310
+ flow: {
311
+ kind: "seq",
312
+ steps: [
313
+ {
314
+ kind: "patch",
315
+ op: "set",
316
+ path: "fromBalance",
317
+ value: {
318
+ kind: "sub",
319
+ left: { kind: "get", path: "fromBalance" },
320
+ right: { kind: "get", path: "input.amount" },
321
+ },
322
+ },
323
+ {
324
+ kind: "patch",
325
+ op: "set",
326
+ path: "toBalance",
327
+ value: {
328
+ kind: "add",
329
+ left: { kind: "get", path: "toBalance" },
330
+ right: { kind: "get", path: "input.amount" },
331
+ },
332
+ },
333
+ ],
334
+ },
335
+ },
336
+ },
337
+ });
338
+ const snapshot = createSnapshot({
339
+ fromBalance: 100,
340
+ toBalance: 50,
341
+ }, "test-hash");
342
+ const intent = createIntent("transfer", { amount: 30 });
343
+ const result = await compute(schema, snapshot, intent);
344
+ expect(result.status).toBe("complete");
345
+ expect(result.snapshot.data).toEqual({
346
+ fromBalance: 70,
347
+ toBalance: 80,
348
+ });
349
+ });
350
+ });
351
+ describe("Version Management", () => {
352
+ it("should increment version on each compute", async () => {
353
+ const schema = createTestSchema({
354
+ actions: {
355
+ noop: {
356
+ flow: { kind: "seq", steps: [] },
357
+ },
358
+ },
359
+ });
360
+ const snapshot = createSnapshot({}, "test-hash");
361
+ expect(snapshot.meta.version).toBe(0);
362
+ const result1 = await compute(schema, snapshot, createIntent("noop"));
363
+ expect(result1.snapshot.meta.version).toBe(1);
364
+ const result2 = await compute(schema, result1.snapshot, createIntent("noop"));
365
+ expect(result2.snapshot.meta.version).toBe(2);
366
+ });
367
+ });
368
+ describe("System State", () => {
369
+ it("should track errors in system.errors", async () => {
370
+ const schema = createTestSchema({
371
+ actions: {
372
+ fail: {
373
+ flow: { kind: "fail", code: "TEST_ERROR" },
374
+ },
375
+ },
376
+ });
377
+ const snapshot = createSnapshot({}, "test-hash");
378
+ const result1 = await compute(schema, snapshot, createIntent("fail"));
379
+ expect(result1.snapshot.system.errors).toHaveLength(1);
380
+ expect(result1.snapshot.system.lastError?.code).toBe("VALIDATION_ERROR");
381
+ // Run again to accumulate errors
382
+ const result2 = await compute(schema, result1.snapshot, createIntent("fail"));
383
+ expect(result2.snapshot.system.errors).toHaveLength(2);
384
+ });
385
+ it("should reset currentAction after completion", async () => {
386
+ const schema = createTestSchema({
387
+ actions: {
388
+ test: {
389
+ flow: { kind: "patch", op: "set", path: "done", value: { kind: "lit", value: true } },
390
+ },
391
+ },
392
+ });
393
+ const snapshot = createSnapshot({}, "test-hash");
394
+ const result = await compute(schema, snapshot, createIntent("test"));
395
+ expect(result.snapshot.system.currentAction).toBeNull();
396
+ expect(result.snapshot.system.status).toBe("idle");
397
+ });
398
+ });
399
+ });
400
+ //# sourceMappingURL=compute.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.test.js","sourceRoot":"","sources":["../../src/core/compute.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DomainSchema } from "../schema/domain.js";
2
+ import type { Snapshot } from "../schema/snapshot.js";
3
+ import type { SemanticPath } from "../schema/common.js";
4
+ import type { ExplainResult } from "../schema/result.js";
5
+ /**
6
+ * Explain why a value is what it is
7
+ *
8
+ * @param schema - The domain schema
9
+ * @param snapshot - Current snapshot state
10
+ * @param path - The path to explain
11
+ * @returns ExplainResult with value, trace, and dependencies
12
+ */
13
+ export declare function explain(schema: DomainSchema, snapshot: Snapshot, path: SemanticPath): ExplainResult;
14
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/core/explain.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,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GACjB,aAAa,CAiCf"}
@@ -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"}