@kalada/core 0.3.0 → 0.4.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 (114) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs.map +1 -1
  3. package/dist/kalada-v1/canonical-input.d.cts +3 -2
  4. package/dist/kalada-v1/canonical-input.d.ts +3 -2
  5. package/dist/kalada-v1/canonical-input.js.map +1 -1
  6. package/dist/kalada-v1/canonicalize.cjs +16 -1
  7. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  8. package/dist/kalada-v1/canonicalize.js +16 -1
  9. package/dist/kalada-v1/canonicalize.js.map +1 -1
  10. package/dist/kalada-v1/compile.cjs +13 -4
  11. package/dist/kalada-v1/compile.cjs.map +1 -1
  12. package/dist/kalada-v1/compile.js +14 -5
  13. package/dist/kalada-v1/compile.js.map +1 -1
  14. package/dist/kalada-v1/dependencies.cjs +49 -2
  15. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  16. package/dist/kalada-v1/dependencies.js +49 -2
  17. package/dist/kalada-v1/dependencies.js.map +1 -1
  18. package/dist/kalada-v1/diagnostics.cjs +24 -4
  19. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  20. package/dist/kalada-v1/diagnostics.d.cts +4 -3
  21. package/dist/kalada-v1/diagnostics.d.ts +4 -3
  22. package/dist/kalada-v1/diagnostics.js +24 -4
  23. package/dist/kalada-v1/diagnostics.js.map +1 -1
  24. package/dist/kalada-v1/evaluate.cjs +10 -139
  25. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  26. package/dist/kalada-v1/evaluate.d.cts +3 -2
  27. package/dist/kalada-v1/evaluate.d.ts +3 -2
  28. package/dist/kalada-v1/evaluate.js +12 -141
  29. package/dist/kalada-v1/evaluate.js.map +1 -1
  30. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  31. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  32. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  33. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  34. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  35. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  36. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  37. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  38. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  39. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  40. package/dist/kalada-v1/evaluation-frames.js +14 -0
  41. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  42. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  43. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  44. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  45. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  46. package/dist/kalada-v1/evaluation-machine.js +224 -0
  47. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  48. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  49. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  50. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  51. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  52. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  53. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  54. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  55. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  56. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  57. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  58. package/dist/kalada-v1/evaluation-state.js +81 -0
  59. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  60. package/dist/kalada-v1/factories.cjs +28 -0
  61. package/dist/kalada-v1/factories.cjs.map +1 -1
  62. package/dist/kalada-v1/factories.d.cts +16 -1
  63. package/dist/kalada-v1/factories.d.ts +16 -1
  64. package/dist/kalada-v1/factories.js +28 -0
  65. package/dist/kalada-v1/factories.js.map +1 -1
  66. package/dist/kalada-v1/function-contracts.cjs +150 -0
  67. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  68. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  69. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  70. package/dist/kalada-v1/function-contracts.js +144 -0
  71. package/dist/kalada-v1/function-contracts.js.map +1 -0
  72. package/dist/kalada-v1/index.cjs +13 -0
  73. package/dist/kalada-v1/index.d.cts +4 -3
  74. package/dist/kalada-v1/index.d.ts +4 -3
  75. package/dist/kalada-v1/index.js +3 -2
  76. package/dist/kalada-v1/limits.cjs +23 -2
  77. package/dist/kalada-v1/limits.cjs.map +1 -1
  78. package/dist/kalada-v1/limits.d.cts +5 -3
  79. package/dist/kalada-v1/limits.d.ts +5 -3
  80. package/dist/kalada-v1/limits.js +23 -3
  81. package/dist/kalada-v1/limits.js.map +1 -1
  82. package/dist/kalada-v1/runtime-values.cjs +112 -0
  83. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  84. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  85. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  86. package/dist/kalada-v1/runtime-values.js +105 -0
  87. package/dist/kalada-v1/runtime-values.js.map +1 -0
  88. package/dist/kalada-v1/schemas.cjs +107 -2
  89. package/dist/kalada-v1/schemas.cjs.map +1 -1
  90. package/dist/kalada-v1/schemas.d.cts +2 -1
  91. package/dist/kalada-v1/schemas.d.ts +2 -1
  92. package/dist/kalada-v1/schemas.js +108 -4
  93. package/dist/kalada-v1/schemas.js.map +1 -1
  94. package/dist/kalada-v1/static-analysis.cjs +177 -0
  95. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  96. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  97. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  98. package/dist/kalada-v1/static-analysis.js +175 -0
  99. package/dist/kalada-v1/static-analysis.js.map +1 -0
  100. package/dist/kalada-v1/static-types.cjs +229 -0
  101. package/dist/kalada-v1/static-types.cjs.map +1 -0
  102. package/dist/kalada-v1/static-types.d.cts +8 -0
  103. package/dist/kalada-v1/static-types.d.ts +8 -0
  104. package/dist/kalada-v1/static-types.js +227 -0
  105. package/dist/kalada-v1/static-types.js.map +1 -0
  106. package/dist/kalada-v1/temporal-evaluation.cjs +21 -0
  107. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -1
  108. package/dist/kalada-v1/temporal-evaluation.d.cts +7 -2
  109. package/dist/kalada-v1/temporal-evaluation.d.ts +7 -2
  110. package/dist/kalada-v1/temporal-evaluation.js +20 -1
  111. package/dist/kalada-v1/temporal-evaluation.js.map +1 -1
  112. package/dist/kalada-v1/types.d.cts +78 -4
  113. package/dist/kalada-v1/types.d.ts +78 -4
  114. package/package.json +1 -1
@@ -0,0 +1,105 @@
1
+ import { isInstant, isDuration } from './temporal.js';
2
+ import { isOption, isResult } from './values.js';
3
+
4
+ const callables = /* @__PURE__ */ new WeakSet();
5
+ function isCallable(value) {
6
+ return typeof value === "object" && value !== null && callables.has(value);
7
+ }
8
+ function coreCallable(name) {
9
+ return branded({ callable: "core", name });
10
+ }
11
+ function callableType(value) {
12
+ if (value.callable === "user") {
13
+ return Object.freeze({
14
+ kind: "function-type",
15
+ parameters: Object.freeze(value.parameters.map((item) => item.type)),
16
+ returns: value.returns
17
+ });
18
+ }
19
+ const json = primitive("json");
20
+ const callback = functionType(
21
+ [json, primitive("number")],
22
+ primitive(value.name === "map" ? "json" : "boolean")
23
+ );
24
+ const array = Object.freeze({ kind: "array-type", element: json });
25
+ return functionType(
26
+ [array, callback],
27
+ value.name === "some" || value.name === "every" ? primitive("boolean") : array
28
+ );
29
+ }
30
+ function matchesType(value, expected) {
31
+ if (expected.kind === "function-type") {
32
+ return isCallable(value) && equalType(callableType(value), expected);
33
+ }
34
+ if (isCallable(value)) return false;
35
+ if (expected.kind === "primitive-type") return matchesPrimitive(value, expected.name);
36
+ if (expected.kind === "option-type") {
37
+ return isOption(value) && (value.variant === "none" || matchesType(value.value, expected.value));
38
+ }
39
+ if (expected.kind === "result-type") {
40
+ return isResult(value) && matchesType(value.value, value.variant === "ok" ? expected.ok : expected.error);
41
+ }
42
+ return Array.isArray(value) && value.every((item) => matchesType(item, expected.element));
43
+ }
44
+ function closureFromExpression(node, path, captures) {
45
+ return branded({
46
+ callable: "user",
47
+ name: null,
48
+ path,
49
+ parameters: node.parameters,
50
+ returns: node.returns,
51
+ body: node.body,
52
+ captures,
53
+ recursive: null
54
+ });
55
+ }
56
+ function closureFromMember(node, path, captures, recursive) {
57
+ return branded({
58
+ callable: "user",
59
+ name: node.name,
60
+ path,
61
+ parameters: node.parameters,
62
+ returns: node.returns,
63
+ body: node.body,
64
+ captures,
65
+ recursive
66
+ });
67
+ }
68
+ function branded(value) {
69
+ Object.freeze(value);
70
+ callables.add(value);
71
+ return value;
72
+ }
73
+ function matchesPrimitive(value, name) {
74
+ if (name === "json")
75
+ return !isOption(value) && !isResult(value) && !isInstant(value) && !isDuration(value);
76
+ if (name === "Instant") return isInstant(value);
77
+ if (name === "Duration") return isDuration(value);
78
+ if (name === "null") return value === null;
79
+ return typeof value === name;
80
+ }
81
+ function equalType(left, right) {
82
+ if (left.kind !== right.kind) return false;
83
+ if (left.kind === "primitive-type" && right.kind === "primitive-type")
84
+ return left.name === right.name;
85
+ if (left.kind === "option-type" && right.kind === "option-type")
86
+ return equalType(left.value, right.value);
87
+ if (left.kind === "array-type" && right.kind === "array-type")
88
+ return equalType(left.element, right.element);
89
+ if (left.kind === "result-type" && right.kind === "result-type")
90
+ return equalType(left.ok, right.ok) && equalType(left.error, right.error);
91
+ if (left.kind !== "function-type" || right.kind !== "function-type") return false;
92
+ return left.parameters.length === right.parameters.length && left.parameters.every(
93
+ (item, index) => equalType(item, right.parameters[index])
94
+ ) && equalType(left.returns, right.returns);
95
+ }
96
+ function primitive(name) {
97
+ return Object.freeze({ kind: "primitive-type", name });
98
+ }
99
+ function functionType(parameters, returns) {
100
+ return Object.freeze({ kind: "function-type", parameters: Object.freeze(parameters), returns });
101
+ }
102
+
103
+ export { callableType, closureFromExpression, closureFromMember, coreCallable, isCallable, matchesType };
104
+ //# sourceMappingURL=runtime-values.js.map
105
+ //# sourceMappingURL=runtime-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/runtime-values.ts"],"names":[],"mappings":"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","file":"runtime-values.js","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport { isDuration, isInstant } from \"./temporal.js\";\nimport type {\n KaladaCoreFunctionName,\n KaladaFunctionParameter,\n KaladaFunctionType,\n KaladaType,\n KaladaV1Expression,\n NamedFunction,\n} from \"./types.js\";\nimport { isOption, isResult, type KaladaValue } from \"./values.js\";\n\nexport type RuntimeEnvironment = ReadonlyMap<string, RuntimeValue>;\nexport type RuntimeValue = KaladaValue | UserClosure<JsonValue> | CoreCallable;\n\nexport interface RecursiveEnvironment<R extends JsonValue> {\n readonly names: readonly string[];\n readonly closures: readonly UserClosure<R>[];\n}\n\nexport interface UserClosure<R extends JsonValue> {\n readonly callable: \"user\";\n readonly name: string | null;\n readonly path: readonly (string | number)[];\n readonly parameters: readonly KaladaFunctionParameter[];\n readonly returns: KaladaType;\n readonly body: KaladaV1Expression<R>;\n readonly captures: RuntimeEnvironment;\n readonly recursive: RecursiveEnvironment<R> | null;\n}\n\nexport interface CoreCallable {\n readonly callable: \"core\";\n readonly name: KaladaCoreFunctionName;\n}\n\nconst callables = new WeakSet<object>();\n\nexport function isCallable(value: RuntimeValue): value is UserClosure<JsonValue> | CoreCallable {\n return typeof value === \"object\" && value !== null && callables.has(value);\n}\n\nexport function coreCallable(name: KaladaCoreFunctionName): CoreCallable {\n return branded({ callable: \"core\", name });\n}\n\nexport function callableType(value: UserClosure<JsonValue> | CoreCallable): KaladaFunctionType {\n if (value.callable === \"user\") {\n return Object.freeze({\n kind: \"function-type\",\n parameters: Object.freeze(value.parameters.map((item) => item.type)),\n returns: value.returns,\n });\n }\n const json = primitive(\"json\");\n const callback = functionType(\n [json, primitive(\"number\")],\n primitive(value.name === \"map\" ? \"json\" : \"boolean\"),\n );\n const array = Object.freeze({ kind: \"array-type\", element: json }) as KaladaType;\n return functionType(\n [array, callback],\n value.name === \"some\" || value.name === \"every\" ? primitive(\"boolean\") : array,\n );\n}\n\nexport function matchesType(value: RuntimeValue, expected: KaladaType): boolean {\n if (expected.kind === \"function-type\") {\n return isCallable(value) && equalType(callableType(value), expected);\n }\n if (isCallable(value)) return false;\n if (expected.kind === \"primitive-type\") return matchesPrimitive(value, expected.name);\n if (expected.kind === \"option-type\") {\n return (\n isOption(value) && (value.variant === \"none\" || matchesType(value.value, expected.value))\n );\n }\n if (expected.kind === \"result-type\") {\n return (\n isResult(value) &&\n matchesType(value.value, value.variant === \"ok\" ? expected.ok : expected.error)\n );\n }\n return Array.isArray(value) && value.every((item) => matchesType(item, expected.element));\n}\n\nexport function closureFromExpression<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function\" }>,\n path: readonly (string | number)[],\n captures: RuntimeEnvironment,\n): UserClosure<R> {\n return branded({\n callable: \"user\",\n name: null,\n path,\n parameters: node.parameters,\n returns: node.returns,\n body: node.body,\n captures,\n recursive: null,\n });\n}\n\nexport function closureFromMember<R extends JsonValue>(\n node: NamedFunction<R>,\n path: readonly (string | number)[],\n captures: RuntimeEnvironment,\n recursive: RecursiveEnvironment<R>,\n): UserClosure<R> {\n return branded({\n callable: \"user\",\n name: node.name,\n path,\n parameters: node.parameters,\n returns: node.returns,\n body: node.body,\n captures,\n recursive,\n });\n}\n\nfunction branded<T extends object>(value: T): T {\n Object.freeze(value);\n callables.add(value);\n return value;\n}\n\nfunction matchesPrimitive(value: KaladaValue, name: string): boolean {\n if (name === \"json\")\n return !isOption(value) && !isResult(value) && !isInstant(value) && !isDuration(value);\n if (name === \"Instant\") return isInstant(value);\n if (name === \"Duration\") return isDuration(value);\n if (name === \"null\") return value === null;\n return typeof value === name;\n}\n\nfunction equalType(left: KaladaType, right: KaladaType): boolean {\n if (left.kind !== right.kind) return false;\n if (left.kind === \"primitive-type\" && right.kind === \"primitive-type\")\n return left.name === right.name;\n if (left.kind === \"option-type\" && right.kind === \"option-type\")\n return equalType(left.value, right.value);\n if (left.kind === \"array-type\" && right.kind === \"array-type\")\n return equalType(left.element, right.element);\n if (left.kind === \"result-type\" && right.kind === \"result-type\")\n return equalType(left.ok, right.ok) && equalType(left.error, right.error);\n if (left.kind !== \"function-type\" || right.kind !== \"function-type\") return false;\n return (\n left.parameters.length === right.parameters.length &&\n left.parameters.every((item, index) =>\n equalType(item, right.parameters[index] as KaladaType),\n ) &&\n equalType(left.returns, right.returns)\n );\n}\n\nfunction primitive(name: \"number\" | \"boolean\" | \"json\"): KaladaType {\n return Object.freeze({ kind: \"primitive-type\", name });\n}\n\nfunction functionType(parameters: readonly KaladaType[], returns: KaladaType): KaladaFunctionType {\n return Object.freeze({ kind: \"function-type\", parameters: Object.freeze(parameters), returns });\n}\n"]}
@@ -71,9 +71,76 @@ const expression = {
71
71
  "greater-than-or-equal"
72
72
  ]),
73
73
  matchNode("Option", [arm("some", true), arm("none", false)]),
74
- matchNode("Result", [arm("ok", true), arm("err", true)])
74
+ matchNode("Result", [arm("ok", true), arm("err", true)]),
75
+ node(
76
+ "function",
77
+ { parameters: parametersSchema(), returns: typeRef(), body: expressionRef() },
78
+ ["parameters", "returns", "body"]
79
+ ),
80
+ node(
81
+ "call",
82
+ {
83
+ callee: expressionRef(),
84
+ arguments: {
85
+ type: "array",
86
+ maxItems: limits_js.DEFAULT_KALADA_V1_LIMITS.maxAstNodes,
87
+ items: expressionRef()
88
+ }
89
+ },
90
+ ["callee", "arguments"]
91
+ ),
92
+ node(
93
+ "function-group",
94
+ {
95
+ functions: {
96
+ type: "array",
97
+ maxItems: limits_js.DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionGroupSize,
98
+ items: { $ref: "#/$defs/namedFunction" }
99
+ },
100
+ body: expressionRef()
101
+ },
102
+ ["functions", "body"]
103
+ ),
104
+ node("core-function", { name: { enum: ["map", "filter", "some", "every"] } }, ["name"])
75
105
  ]
76
106
  };
107
+ const KALADA_V1_FUNCTION_PROGRAM_SCHEMA = deepFreeze({
108
+ $schema: "https://json-schema.org/draft/2020-12/schema",
109
+ $id: "https://kalada.dev/schema/program/kalada-v1-functions",
110
+ $comment: "The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.",
111
+ type: "object",
112
+ properties: {
113
+ format: { const: "kalada-program" },
114
+ version: { const: 1 },
115
+ profile: { const: "kalada-v1" },
116
+ expression: expressionRef()
117
+ },
118
+ required: ["format", "version", "profile", "expression"],
119
+ additionalProperties: false,
120
+ $defs: {
121
+ jsonValue,
122
+ expression,
123
+ kaladaType: typeSchema(),
124
+ parameter: {
125
+ type: "object",
126
+ properties: { name: bindingName(), type: typeRef() },
127
+ required: ["name", "type"],
128
+ additionalProperties: false
129
+ },
130
+ namedFunction: {
131
+ type: "object",
132
+ properties: {
133
+ name: bindingName(),
134
+ parameters: parametersSchema(),
135
+ returns: typeRef(),
136
+ body: expressionRef()
137
+ },
138
+ required: ["name", "parameters", "returns", "body"],
139
+ additionalProperties: false
140
+ }
141
+ }
142
+ });
143
+ const legacyExpression = { oneOf: expression.oneOf.slice(0, 13) };
77
144
  const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
78
145
  $schema: "https://json-schema.org/draft/2020-12/schema",
79
146
  $id: "https://kalada.dev/schema/program/kalada-v1",
@@ -87,7 +154,7 @@ const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
87
154
  },
88
155
  required: ["format", "version", "profile", "expression"],
89
156
  additionalProperties: false,
90
- $defs: { jsonValue, expression }
157
+ $defs: { jsonValue, expression: legacyExpression }
91
158
  });
92
159
  const KALADA_VALUE_V1_SCHEMA = deepFreeze({
93
160
  $schema: "https://json-schema.org/draft/2020-12/schema",
@@ -170,12 +237,50 @@ function expressionRef() {
170
237
  function bindingName() {
171
238
  return { type: "string", minLength: 1, maxLength: limits_js.DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };
172
239
  }
240
+ function parametersSchema() {
241
+ return {
242
+ type: "array",
243
+ maxItems: limits_js.DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,
244
+ items: { $ref: "#/$defs/parameter" }
245
+ };
246
+ }
247
+ function typeRef() {
248
+ return { $ref: "#/$defs/kaladaType" };
249
+ }
250
+ function typeSchema() {
251
+ const primitive = node(
252
+ "primitive-type",
253
+ { name: { enum: ["null", "boolean", "number", "string", "json", "Instant", "Duration"] } },
254
+ ["name"]
255
+ );
256
+ return {
257
+ oneOf: [
258
+ primitive,
259
+ node("option-type", { value: typeRef() }, ["value"]),
260
+ node("result-type", { ok: typeRef(), error: typeRef() }, ["ok", "error"]),
261
+ node("array-type", { element: typeRef() }, ["element"]),
262
+ node(
263
+ "function-type",
264
+ {
265
+ parameters: {
266
+ type: "array",
267
+ maxItems: limits_js.DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,
268
+ items: typeRef()
269
+ },
270
+ returns: typeRef()
271
+ },
272
+ ["parameters", "returns"]
273
+ )
274
+ ]
275
+ };
276
+ }
173
277
  function deepFreeze(value) {
174
278
  if (typeof value !== "object" || value === null || Object.isFrozen(value)) return value;
175
279
  for (const child of Object.values(value)) deepFreeze(child);
176
280
  return Object.freeze(value);
177
281
  }
178
282
 
283
+ exports.KALADA_V1_FUNCTION_PROGRAM_SCHEMA = KALADA_V1_FUNCTION_PROGRAM_SCHEMA;
179
284
  exports.KALADA_V1_PROGRAM_SCHEMA = KALADA_V1_PROGRAM_SCHEMA;
180
285
  exports.KALADA_VALUE_V1_SCHEMA = KALADA_VALUE_V1_SCHEMA;
181
286
  //# sourceMappingURL=schemas.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":["DEFAULT_KALADA_V1_LIMITS"],"mappings":"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","file":"schemas.cjs","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":["DEFAULT_KALADA_V1_LIMITS","DEFAULT_KALADA_V1_FUNCTION_LIMITS"],"mappings":"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","file":"schemas.cjs","sourcesContent":["import { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n node(\n \"function\",\n { parameters: parametersSchema(), returns: typeRef(), body: expressionRef() },\n [\"parameters\", \"returns\", \"body\"],\n ),\n node(\n \"call\",\n {\n callee: expressionRef(),\n arguments: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_LIMITS.maxAstNodes,\n items: expressionRef(),\n },\n },\n [\"callee\", \"arguments\"],\n ),\n node(\n \"function-group\",\n {\n functions: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionGroupSize,\n items: { $ref: \"#/$defs/namedFunction\" },\n },\n body: expressionRef(),\n },\n [\"functions\", \"body\"],\n ),\n node(\"core-function\", { name: { enum: [\"map\", \"filter\", \"some\", \"every\"] } }, [\"name\"]),\n ],\n};\n\nexport const KALADA_V1_FUNCTION_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1-functions\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: {\n jsonValue,\n expression,\n kaladaType: typeSchema(),\n parameter: {\n type: \"object\",\n properties: { name: bindingName(), type: typeRef() },\n required: [\"name\", \"type\"],\n additionalProperties: false,\n },\n namedFunction: {\n type: \"object\",\n properties: {\n name: bindingName(),\n parameters: parametersSchema(),\n returns: typeRef(),\n body: expressionRef(),\n },\n required: [\"name\", \"parameters\", \"returns\", \"body\"],\n additionalProperties: false,\n },\n },\n});\n\nconst legacyExpression = { oneOf: expression.oneOf.slice(0, 13) };\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression: legacyExpression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction parametersSchema(): Record<string, unknown> {\n return {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,\n items: { $ref: \"#/$defs/parameter\" },\n };\n}\n\nfunction typeRef(): Record<string, string> {\n return { $ref: \"#/$defs/kaladaType\" };\n}\n\nfunction typeSchema(): Record<string, unknown> {\n const primitive = node(\n \"primitive-type\",\n { name: { enum: [\"null\", \"boolean\", \"number\", \"string\", \"json\", \"Instant\", \"Duration\"] } },\n [\"name\"],\n );\n return {\n oneOf: [\n primitive,\n node(\"option-type\", { value: typeRef() }, [\"value\"]),\n node(\"result-type\", { ok: typeRef(), error: typeRef() }, [\"ok\", \"error\"]),\n node(\"array-type\", { element: typeRef() }, [\"element\"]),\n node(\n \"function-type\",\n {\n parameters: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,\n items: typeRef(),\n },\n returns: typeRef(),\n },\n [\"parameters\", \"returns\"],\n ),\n ],\n };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;
2
+ declare const KALADA_V1_FUNCTION_PROGRAM_SCHEMA: KaladaV1JsonSchema;
2
3
  declare const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema;
3
4
  declare const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema;
4
5
 
5
- export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, type KaladaV1JsonSchema };
6
+ export { KALADA_V1_FUNCTION_PROGRAM_SCHEMA, KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, type KaladaV1JsonSchema };
@@ -1,5 +1,6 @@
1
1
  type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;
2
+ declare const KALADA_V1_FUNCTION_PROGRAM_SCHEMA: KaladaV1JsonSchema;
2
3
  declare const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema;
3
4
  declare const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema;
4
5
 
5
- export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, type KaladaV1JsonSchema };
6
+ export { KALADA_V1_FUNCTION_PROGRAM_SCHEMA, KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, type KaladaV1JsonSchema };
@@ -1,4 +1,4 @@
1
- import { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
1
+ import { DEFAULT_KALADA_V1_LIMITS, DEFAULT_KALADA_V1_FUNCTION_LIMITS } from './limits.js';
2
2
 
3
3
  const jsonValue = jsonValueSchema("#/$defs/jsonValue", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);
4
4
  const encodedJsonValue = jsonValueSchema(
@@ -69,9 +69,76 @@ const expression = {
69
69
  "greater-than-or-equal"
70
70
  ]),
71
71
  matchNode("Option", [arm("some", true), arm("none", false)]),
72
- matchNode("Result", [arm("ok", true), arm("err", true)])
72
+ matchNode("Result", [arm("ok", true), arm("err", true)]),
73
+ node(
74
+ "function",
75
+ { parameters: parametersSchema(), returns: typeRef(), body: expressionRef() },
76
+ ["parameters", "returns", "body"]
77
+ ),
78
+ node(
79
+ "call",
80
+ {
81
+ callee: expressionRef(),
82
+ arguments: {
83
+ type: "array",
84
+ maxItems: DEFAULT_KALADA_V1_LIMITS.maxAstNodes,
85
+ items: expressionRef()
86
+ }
87
+ },
88
+ ["callee", "arguments"]
89
+ ),
90
+ node(
91
+ "function-group",
92
+ {
93
+ functions: {
94
+ type: "array",
95
+ maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionGroupSize,
96
+ items: { $ref: "#/$defs/namedFunction" }
97
+ },
98
+ body: expressionRef()
99
+ },
100
+ ["functions", "body"]
101
+ ),
102
+ node("core-function", { name: { enum: ["map", "filter", "some", "every"] } }, ["name"])
73
103
  ]
74
104
  };
105
+ const KALADA_V1_FUNCTION_PROGRAM_SCHEMA = deepFreeze({
106
+ $schema: "https://json-schema.org/draft/2020-12/schema",
107
+ $id: "https://kalada.dev/schema/program/kalada-v1-functions",
108
+ $comment: "The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.",
109
+ type: "object",
110
+ properties: {
111
+ format: { const: "kalada-program" },
112
+ version: { const: 1 },
113
+ profile: { const: "kalada-v1" },
114
+ expression: expressionRef()
115
+ },
116
+ required: ["format", "version", "profile", "expression"],
117
+ additionalProperties: false,
118
+ $defs: {
119
+ jsonValue,
120
+ expression,
121
+ kaladaType: typeSchema(),
122
+ parameter: {
123
+ type: "object",
124
+ properties: { name: bindingName(), type: typeRef() },
125
+ required: ["name", "type"],
126
+ additionalProperties: false
127
+ },
128
+ namedFunction: {
129
+ type: "object",
130
+ properties: {
131
+ name: bindingName(),
132
+ parameters: parametersSchema(),
133
+ returns: typeRef(),
134
+ body: expressionRef()
135
+ },
136
+ required: ["name", "parameters", "returns", "body"],
137
+ additionalProperties: false
138
+ }
139
+ }
140
+ });
141
+ const legacyExpression = { oneOf: expression.oneOf.slice(0, 13) };
75
142
  const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
76
143
  $schema: "https://json-schema.org/draft/2020-12/schema",
77
144
  $id: "https://kalada.dev/schema/program/kalada-v1",
@@ -85,7 +152,7 @@ const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
85
152
  },
86
153
  required: ["format", "version", "profile", "expression"],
87
154
  additionalProperties: false,
88
- $defs: { jsonValue, expression }
155
+ $defs: { jsonValue, expression: legacyExpression }
89
156
  });
90
157
  const KALADA_VALUE_V1_SCHEMA = deepFreeze({
91
158
  $schema: "https://json-schema.org/draft/2020-12/schema",
@@ -168,12 +235,49 @@ function expressionRef() {
168
235
  function bindingName() {
169
236
  return { type: "string", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };
170
237
  }
238
+ function parametersSchema() {
239
+ return {
240
+ type: "array",
241
+ maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,
242
+ items: { $ref: "#/$defs/parameter" }
243
+ };
244
+ }
245
+ function typeRef() {
246
+ return { $ref: "#/$defs/kaladaType" };
247
+ }
248
+ function typeSchema() {
249
+ const primitive = node(
250
+ "primitive-type",
251
+ { name: { enum: ["null", "boolean", "number", "string", "json", "Instant", "Duration"] } },
252
+ ["name"]
253
+ );
254
+ return {
255
+ oneOf: [
256
+ primitive,
257
+ node("option-type", { value: typeRef() }, ["value"]),
258
+ node("result-type", { ok: typeRef(), error: typeRef() }, ["ok", "error"]),
259
+ node("array-type", { element: typeRef() }, ["element"]),
260
+ node(
261
+ "function-type",
262
+ {
263
+ parameters: {
264
+ type: "array",
265
+ maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,
266
+ items: typeRef()
267
+ },
268
+ returns: typeRef()
269
+ },
270
+ ["parameters", "returns"]
271
+ )
272
+ ]
273
+ };
274
+ }
171
275
  function deepFreeze(value) {
172
276
  if (typeof value !== "object" || value === null || Object.isFrozen(value)) return value;
173
277
  for (const child of Object.values(value)) deepFreeze(child);
174
278
  return Object.freeze(value);
175
279
  }
176
280
 
177
- export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA };
281
+ export { KALADA_V1_FUNCTION_PROGRAM_SCHEMA, KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA };
178
282
  //# sourceMappingURL=schemas.js.map
179
283
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":[],"mappings":"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","file":"schemas.js","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":[],"mappings":"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","file":"schemas.js","sourcesContent":["import { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n node(\n \"function\",\n { parameters: parametersSchema(), returns: typeRef(), body: expressionRef() },\n [\"parameters\", \"returns\", \"body\"],\n ),\n node(\n \"call\",\n {\n callee: expressionRef(),\n arguments: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_LIMITS.maxAstNodes,\n items: expressionRef(),\n },\n },\n [\"callee\", \"arguments\"],\n ),\n node(\n \"function-group\",\n {\n functions: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionGroupSize,\n items: { $ref: \"#/$defs/namedFunction\" },\n },\n body: expressionRef(),\n },\n [\"functions\", \"body\"],\n ),\n node(\"core-function\", { name: { enum: [\"map\", \"filter\", \"some\", \"every\"] } }, [\"name\"]),\n ],\n};\n\nexport const KALADA_V1_FUNCTION_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1-functions\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: {\n jsonValue,\n expression,\n kaladaType: typeSchema(),\n parameter: {\n type: \"object\",\n properties: { name: bindingName(), type: typeRef() },\n required: [\"name\", \"type\"],\n additionalProperties: false,\n },\n namedFunction: {\n type: \"object\",\n properties: {\n name: bindingName(),\n parameters: parametersSchema(),\n returns: typeRef(),\n body: expressionRef(),\n },\n required: [\"name\", \"parameters\", \"returns\", \"body\"],\n additionalProperties: false,\n },\n },\n});\n\nconst legacyExpression = { oneOf: expression.oneOf.slice(0, 13) };\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression: legacyExpression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction parametersSchema(): Record<string, unknown> {\n return {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,\n items: { $ref: \"#/$defs/parameter\" },\n };\n}\n\nfunction typeRef(): Record<string, string> {\n return { $ref: \"#/$defs/kaladaType\" };\n}\n\nfunction typeSchema(): Record<string, unknown> {\n const primitive = node(\n \"primitive-type\",\n { name: { enum: [\"null\", \"boolean\", \"number\", \"string\", \"json\", \"Instant\", \"Duration\"] } },\n [\"name\"],\n );\n return {\n oneOf: [\n primitive,\n node(\"option-type\", { value: typeRef() }, [\"value\"]),\n node(\"result-type\", { ok: typeRef(), error: typeRef() }, [\"ok\", \"error\"]),\n node(\"array-type\", { element: typeRef() }, [\"element\"]),\n node(\n \"function-type\",\n {\n parameters: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,\n items: typeRef(),\n },\n returns: typeRef(),\n },\n [\"parameters\", \"returns\"],\n ),\n ],\n };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}