@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,287 @@
1
+ import { createError } from "../errors.js";
2
+ import { createContext } from "../evaluator/context.js";
3
+ import { evaluateExpr } from "../evaluator/expr.js";
4
+ import { evaluateFlow, createFlowState } from "../evaluator/flow.js";
5
+ import { evaluateComputed } from "../evaluator/computed.js";
6
+ import { isOk, isErr } from "../schema/common.js";
7
+ /**
8
+ * Compute the result of dispatching an intent
9
+ *
10
+ * This is the ONLY entry point for computation.
11
+ * Each call is independent - there is no suspended context.
12
+ *
13
+ * @param schema - The domain schema
14
+ * @param snapshot - Current snapshot state
15
+ * @param intent - The intent to process
16
+ * @returns ComputeResult with new snapshot, trace, and status
17
+ */
18
+ export async function compute(schema, snapshot, intent) {
19
+ const startTime = Date.now();
20
+ // 0. Ensure computed values are up-to-date before availability check
21
+ let currentSnapshot = snapshot;
22
+ const initialComputedResult = evaluateComputed(schema, snapshot);
23
+ if (isOk(initialComputedResult)) {
24
+ currentSnapshot = {
25
+ ...snapshot,
26
+ computed: initialComputedResult.value,
27
+ };
28
+ }
29
+ // 1. Look up the action
30
+ const action = schema.actions[intent.type];
31
+ if (!action) {
32
+ return createErrorResult(currentSnapshot, intent, "UNKNOWN_ACTION", `Unknown action: ${intent.type}`, startTime);
33
+ }
34
+ // 1.5 Validate intentId (must be non-empty)
35
+ if (!intent.intentId || intent.intentId === "") {
36
+ return createErrorResult(currentSnapshot, intent, "INVALID_INPUT", "Intent must have a non-empty intentId", startTime);
37
+ }
38
+ // 1.6 Validate input against action's input schema
39
+ if (action.input) {
40
+ const inputError = validateInput(action.input, intent.input);
41
+ if (inputError) {
42
+ return createErrorResult(currentSnapshot, intent, "INVALID_INPUT", inputError, startTime);
43
+ }
44
+ }
45
+ // 2. Check availability condition
46
+ if (action.available) {
47
+ const ctx = createContext(currentSnapshot, schema, intent.type, "available", intent.intentId);
48
+ const availResult = evaluateExpr(action.available, ctx);
49
+ if (isErr(availResult)) {
50
+ return createErrorResult(currentSnapshot, intent, "INTERNAL_ERROR", `Error evaluating availability: ${availResult.error.message}`, startTime);
51
+ }
52
+ // Availability must return a boolean (A28: available conditions must be pure)
53
+ if (typeof availResult.value !== "boolean") {
54
+ return createErrorResult(currentSnapshot, intent, "TYPE_MISMATCH", `Availability condition must return boolean, got ${typeof availResult.value}`, startTime);
55
+ }
56
+ if (!availResult.value) {
57
+ return createErrorResult(currentSnapshot, intent, "ACTION_UNAVAILABLE", `Action "${intent.type}" is not available`, startTime);
58
+ }
59
+ }
60
+ // 3. Prepare snapshot with input and system state
61
+ const preparedSnapshot = {
62
+ ...currentSnapshot,
63
+ input: intent.input,
64
+ system: {
65
+ ...currentSnapshot.system,
66
+ status: "computing",
67
+ currentAction: intent.type,
68
+ },
69
+ };
70
+ // 4. Create evaluation context and flow state
71
+ const ctx = createContext(preparedSnapshot, schema, intent.type, `actions.${intent.type}.flow`, intent.intentId);
72
+ const flowState = createFlowState(preparedSnapshot);
73
+ // 5. Evaluate the flow
74
+ const flowResult = await evaluateFlow(action.flow, ctx, flowState, `actions.${intent.type}.flow`);
75
+ // 6. Get final snapshot from flow state
76
+ let finalSnapshot = flowResult.state.snapshot;
77
+ // 7. Recompute all computed values
78
+ const computedResult = evaluateComputed(schema, finalSnapshot);
79
+ if (isOk(computedResult)) {
80
+ finalSnapshot = {
81
+ ...finalSnapshot,
82
+ computed: computedResult.value,
83
+ };
84
+ }
85
+ // 8. Update system state based on flow result
86
+ const systemStatus = mapFlowStatus(flowResult.state.status);
87
+ const systemState = {
88
+ status: systemStatus === "complete" || systemStatus === "halted" ? "idle" : systemStatus,
89
+ lastError: flowResult.state.error,
90
+ errors: flowResult.state.error
91
+ ? [...finalSnapshot.system.errors, flowResult.state.error]
92
+ : finalSnapshot.system.errors,
93
+ pendingRequirements: [...flowResult.state.requirements],
94
+ currentAction: systemStatus === "pending" ? intent.type : null,
95
+ };
96
+ finalSnapshot = {
97
+ ...finalSnapshot,
98
+ system: systemState,
99
+ meta: {
100
+ ...finalSnapshot.meta,
101
+ version: finalSnapshot.meta.version + 1,
102
+ timestamp: Date.now(),
103
+ },
104
+ };
105
+ // 9. Build trace graph
106
+ const trace = {
107
+ root: flowResult.trace,
108
+ nodes: collectTraceNodes(flowResult.trace),
109
+ intent: { type: intent.type, input: intent.input },
110
+ baseVersion: currentSnapshot.meta.version,
111
+ resultVersion: finalSnapshot.meta.version,
112
+ duration: Date.now() - startTime,
113
+ terminatedBy: mapFlowStatusToTermination(flowResult.state.status),
114
+ };
115
+ return {
116
+ snapshot: finalSnapshot,
117
+ requirements: [...flowResult.state.requirements],
118
+ trace,
119
+ status: systemStatus,
120
+ };
121
+ }
122
+ /**
123
+ * Map flow status to compute status
124
+ */
125
+ function mapFlowStatus(status) {
126
+ switch (status) {
127
+ case "running":
128
+ case "complete":
129
+ return "complete";
130
+ case "pending":
131
+ return "pending";
132
+ case "halted":
133
+ return "halted";
134
+ case "error":
135
+ return "error";
136
+ }
137
+ }
138
+ /**
139
+ * Map flow status to trace termination
140
+ */
141
+ function mapFlowStatusToTermination(status) {
142
+ switch (status) {
143
+ case "running":
144
+ case "complete":
145
+ return "complete";
146
+ case "pending":
147
+ return "effect";
148
+ case "halted":
149
+ return "halt";
150
+ case "error":
151
+ return "error";
152
+ }
153
+ }
154
+ /**
155
+ * Collect all trace nodes into a flat map
156
+ */
157
+ function collectTraceNodes(root) {
158
+ const nodes = {};
159
+ function collect(node) {
160
+ nodes[node.id] = node;
161
+ for (const child of node.children) {
162
+ collect(child);
163
+ }
164
+ }
165
+ collect(root);
166
+ return nodes;
167
+ }
168
+ /**
169
+ * Create an error result
170
+ */
171
+ function createErrorResult(snapshot, intent, code, message, startTime) {
172
+ const error = createError(code, message, intent.type, "", Date.now());
173
+ const errorSnapshot = {
174
+ ...snapshot,
175
+ input: intent.input,
176
+ system: {
177
+ ...snapshot.system,
178
+ status: "error",
179
+ lastError: error,
180
+ errors: [...snapshot.system.errors, error],
181
+ currentAction: null,
182
+ },
183
+ meta: {
184
+ ...snapshot.meta,
185
+ version: snapshot.meta.version + 1,
186
+ timestamp: Date.now(),
187
+ },
188
+ };
189
+ const trace = {
190
+ root: {
191
+ id: `trace-error-${Date.now()}`,
192
+ kind: "error",
193
+ sourcePath: "",
194
+ inputs: {},
195
+ output: error,
196
+ children: [],
197
+ timestamp: Date.now(),
198
+ },
199
+ nodes: {},
200
+ intent: { type: intent.type, input: intent.input },
201
+ baseVersion: snapshot.meta.version,
202
+ resultVersion: errorSnapshot.meta.version,
203
+ duration: Date.now() - startTime,
204
+ terminatedBy: "error",
205
+ };
206
+ return {
207
+ snapshot: errorSnapshot,
208
+ requirements: [],
209
+ trace,
210
+ status: "error",
211
+ };
212
+ }
213
+ /**
214
+ * Validate input against action's input schema
215
+ * Returns error message if invalid, null if valid
216
+ */
217
+ function validateInput(inputSpec, input) {
218
+ // Check type
219
+ if (inputSpec.type === "object") {
220
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
221
+ return `Expected object input, got ${typeof input}`;
222
+ }
223
+ const inputObj = input;
224
+ const fields = inputSpec.fields ?? {};
225
+ // Check for required fields
226
+ for (const [fieldName, fieldSpec] of Object.entries(fields)) {
227
+ if (fieldSpec.required && !(fieldName in inputObj)) {
228
+ return `Missing required field: ${fieldName}`;
229
+ }
230
+ }
231
+ // Check for unknown fields
232
+ for (const key of Object.keys(inputObj)) {
233
+ if (!(key in fields)) {
234
+ return `Unknown field: ${key}`;
235
+ }
236
+ }
237
+ // Recursively validate nested fields
238
+ for (const [fieldName, fieldSpec] of Object.entries(fields)) {
239
+ if (fieldName in inputObj) {
240
+ const error = validateFieldValue(fieldSpec, inputObj[fieldName], fieldName);
241
+ if (error)
242
+ return error;
243
+ }
244
+ }
245
+ }
246
+ return null;
247
+ }
248
+ /**
249
+ * Validate a field value against its spec
250
+ */
251
+ function validateFieldValue(spec, value, path) {
252
+ if (value === undefined || value === null) {
253
+ if (spec.required) {
254
+ return `Missing required field: ${path}`;
255
+ }
256
+ return null;
257
+ }
258
+ switch (spec.type) {
259
+ case "string":
260
+ if (typeof value !== "string") {
261
+ return `Expected string for ${path}, got ${typeof value}`;
262
+ }
263
+ break;
264
+ case "number":
265
+ if (typeof value !== "number") {
266
+ return `Expected number for ${path}, got ${typeof value}`;
267
+ }
268
+ break;
269
+ case "boolean":
270
+ if (typeof value !== "boolean") {
271
+ return `Expected boolean for ${path}, got ${typeof value}`;
272
+ }
273
+ break;
274
+ case "array":
275
+ if (!Array.isArray(value)) {
276
+ return `Expected array for ${path}, got ${typeof value}`;
277
+ }
278
+ break;
279
+ case "object":
280
+ if (typeof value !== "object" || Array.isArray(value)) {
281
+ return `Expected object for ${path}, got ${typeof value}`;
282
+ }
283
+ break;
284
+ }
285
+ return null;
286
+ }
287
+ //# sourceMappingURL=compute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../src/core/compute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compute.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.test.d.ts","sourceRoot":"","sources":["../../src/core/compute.test.ts"],"names":[],"mappings":""}