@kalada/core 0.2.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 (140) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs +133 -0
  3. package/dist/kalada-v1/canonical-input.cjs.map +1 -0
  4. package/dist/kalada-v1/canonical-input.d.cts +26 -0
  5. package/dist/kalada-v1/canonical-input.d.ts +26 -0
  6. package/dist/kalada-v1/canonical-input.js +122 -0
  7. package/dist/kalada-v1/canonical-input.js.map +1 -0
  8. package/dist/kalada-v1/canonicalize.cjs +93 -130
  9. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  10. package/dist/kalada-v1/canonicalize.d.cts +1 -0
  11. package/dist/kalada-v1/canonicalize.d.ts +1 -0
  12. package/dist/kalada-v1/canonicalize.js +71 -108
  13. package/dist/kalada-v1/canonicalize.js.map +1 -1
  14. package/dist/kalada-v1/codec.cjs +24 -0
  15. package/dist/kalada-v1/codec.cjs.map +1 -1
  16. package/dist/kalada-v1/codec.d.cts +5 -0
  17. package/dist/kalada-v1/codec.d.ts +5 -0
  18. package/dist/kalada-v1/codec.js +24 -0
  19. package/dist/kalada-v1/codec.js.map +1 -1
  20. package/dist/kalada-v1/compile.cjs +24 -1
  21. package/dist/kalada-v1/compile.cjs.map +1 -1
  22. package/dist/kalada-v1/compile.d.cts +1 -0
  23. package/dist/kalada-v1/compile.d.ts +1 -0
  24. package/dist/kalada-v1/compile.js +25 -2
  25. package/dist/kalada-v1/compile.js.map +1 -1
  26. package/dist/kalada-v1/dependencies.cjs +55 -2
  27. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  28. package/dist/kalada-v1/dependencies.d.cts +1 -0
  29. package/dist/kalada-v1/dependencies.d.ts +1 -0
  30. package/dist/kalada-v1/dependencies.js +55 -2
  31. package/dist/kalada-v1/dependencies.js.map +1 -1
  32. package/dist/kalada-v1/diagnostics.cjs +29 -4
  33. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  34. package/dist/kalada-v1/diagnostics.d.cts +5 -3
  35. package/dist/kalada-v1/diagnostics.d.ts +5 -3
  36. package/dist/kalada-v1/diagnostics.js +29 -4
  37. package/dist/kalada-v1/diagnostics.js.map +1 -1
  38. package/dist/kalada-v1/evaluate.cjs +23 -117
  39. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  40. package/dist/kalada-v1/evaluate.d.cts +4 -2
  41. package/dist/kalada-v1/evaluate.d.ts +4 -2
  42. package/dist/kalada-v1/evaluate.js +24 -118
  43. package/dist/kalada-v1/evaluate.js.map +1 -1
  44. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  45. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  46. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  47. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  48. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  49. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  50. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  51. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  52. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  53. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  54. package/dist/kalada-v1/evaluation-frames.js +14 -0
  55. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  56. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  57. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  58. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  59. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  60. package/dist/kalada-v1/evaluation-machine.js +224 -0
  61. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  62. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  63. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  64. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  65. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  66. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  67. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  68. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  69. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  70. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  71. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  72. package/dist/kalada-v1/evaluation-state.js +81 -0
  73. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  74. package/dist/kalada-v1/factories.cjs +46 -0
  75. package/dist/kalada-v1/factories.cjs.map +1 -1
  76. package/dist/kalada-v1/factories.d.cts +24 -1
  77. package/dist/kalada-v1/factories.d.ts +24 -1
  78. package/dist/kalada-v1/factories.js +46 -0
  79. package/dist/kalada-v1/factories.js.map +1 -1
  80. package/dist/kalada-v1/function-contracts.cjs +150 -0
  81. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  82. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  83. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  84. package/dist/kalada-v1/function-contracts.js +144 -0
  85. package/dist/kalada-v1/function-contracts.js.map +1 -0
  86. package/dist/kalada-v1/index.cjs +30 -0
  87. package/dist/kalada-v1/index.d.cts +5 -3
  88. package/dist/kalada-v1/index.d.ts +5 -3
  89. package/dist/kalada-v1/index.js +4 -2
  90. package/dist/kalada-v1/limits.cjs +23 -2
  91. package/dist/kalada-v1/limits.cjs.map +1 -1
  92. package/dist/kalada-v1/limits.d.cts +6 -3
  93. package/dist/kalada-v1/limits.d.ts +6 -3
  94. package/dist/kalada-v1/limits.js +23 -3
  95. package/dist/kalada-v1/limits.js.map +1 -1
  96. package/dist/kalada-v1/runtime-values.cjs +112 -0
  97. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  98. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  99. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  100. package/dist/kalada-v1/runtime-values.js +105 -0
  101. package/dist/kalada-v1/runtime-values.js.map +1 -0
  102. package/dist/kalada-v1/schemas.cjs +136 -3
  103. package/dist/kalada-v1/schemas.cjs.map +1 -1
  104. package/dist/kalada-v1/schemas.d.cts +2 -1
  105. package/dist/kalada-v1/schemas.d.ts +2 -1
  106. package/dist/kalada-v1/schemas.js +137 -5
  107. package/dist/kalada-v1/schemas.js.map +1 -1
  108. package/dist/kalada-v1/static-analysis.cjs +177 -0
  109. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  110. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  111. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  112. package/dist/kalada-v1/static-analysis.js +175 -0
  113. package/dist/kalada-v1/static-analysis.js.map +1 -0
  114. package/dist/kalada-v1/static-types.cjs +229 -0
  115. package/dist/kalada-v1/static-types.cjs.map +1 -0
  116. package/dist/kalada-v1/static-types.d.cts +8 -0
  117. package/dist/kalada-v1/static-types.d.ts +8 -0
  118. package/dist/kalada-v1/static-types.js +227 -0
  119. package/dist/kalada-v1/static-types.js.map +1 -0
  120. package/dist/kalada-v1/temporal-evaluation.cjs +95 -0
  121. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
  122. package/dist/kalada-v1/temporal-evaluation.d.cts +18 -0
  123. package/dist/kalada-v1/temporal-evaluation.d.ts +18 -0
  124. package/dist/kalada-v1/temporal-evaluation.js +90 -0
  125. package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
  126. package/dist/kalada-v1/temporal.cjs +42 -0
  127. package/dist/kalada-v1/temporal.cjs.map +1 -0
  128. package/dist/kalada-v1/temporal.d.cts +22 -0
  129. package/dist/kalada-v1/temporal.d.ts +22 -0
  130. package/dist/kalada-v1/temporal.js +37 -0
  131. package/dist/kalada-v1/temporal.js.map +1 -0
  132. package/dist/kalada-v1/types.d.cts +108 -5
  133. package/dist/kalada-v1/types.d.ts +108 -5
  134. package/dist/kalada-v1/values.cjs +13 -1
  135. package/dist/kalada-v1/values.cjs.map +1 -1
  136. package/dist/kalada-v1/values.d.cts +2 -1
  137. package/dist/kalada-v1/values.d.ts +2 -1
  138. package/dist/kalada-v1/values.js +13 -1
  139. package/dist/kalada-v1/values.js.map +1 -1
  140. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ import { JsonValue } from './json.js';
2
+ import { KaladaFunctionParameter, KaladaType, KaladaV1Expression, KaladaCoreFunctionName, KaladaFunctionType, NamedFunction } from './types.js';
3
+ import { KaladaValue } from './values.js';
4
+ import './temporal.js';
5
+
6
+ type RuntimeEnvironment = ReadonlyMap<string, RuntimeValue>;
7
+ type RuntimeValue = KaladaValue | UserClosure<JsonValue> | CoreCallable;
8
+ interface RecursiveEnvironment<R extends JsonValue> {
9
+ readonly names: readonly string[];
10
+ readonly closures: readonly UserClosure<R>[];
11
+ }
12
+ interface UserClosure<R extends JsonValue> {
13
+ readonly callable: "user";
14
+ readonly name: string | null;
15
+ readonly path: readonly (string | number)[];
16
+ readonly parameters: readonly KaladaFunctionParameter[];
17
+ readonly returns: KaladaType;
18
+ readonly body: KaladaV1Expression<R>;
19
+ readonly captures: RuntimeEnvironment;
20
+ readonly recursive: RecursiveEnvironment<R> | null;
21
+ }
22
+ interface CoreCallable {
23
+ readonly callable: "core";
24
+ readonly name: KaladaCoreFunctionName;
25
+ }
26
+ declare function isCallable(value: RuntimeValue): value is UserClosure<JsonValue> | CoreCallable;
27
+ declare function coreCallable(name: KaladaCoreFunctionName): CoreCallable;
28
+ declare function callableType(value: UserClosure<JsonValue> | CoreCallable): KaladaFunctionType;
29
+ declare function matchesType(value: RuntimeValue, expected: KaladaType): boolean;
30
+ declare function closureFromExpression<R extends JsonValue>(node: Extract<KaladaV1Expression<R>, {
31
+ kind: "function";
32
+ }>, path: readonly (string | number)[], captures: RuntimeEnvironment): UserClosure<R>;
33
+ declare function closureFromMember<R extends JsonValue>(node: NamedFunction<R>, path: readonly (string | number)[], captures: RuntimeEnvironment, recursive: RecursiveEnvironment<R>): UserClosure<R>;
34
+
35
+ export { type CoreCallable, type RecursiveEnvironment, type RuntimeEnvironment, type RuntimeValue, type UserClosure, callableType, closureFromExpression, closureFromMember, coreCallable, isCallable, matchesType };
@@ -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"]}
@@ -58,10 +58,89 @@ const expression = {
58
58
  "variant",
59
59
  "value"
60
60
  ]),
61
+ node("instant", { milliseconds: safeInteger() }, ["milliseconds"]),
62
+ node("duration", { milliseconds: safeInteger() }, ["milliseconds"]),
63
+ node("current-instant", {}, []),
64
+ temporalNode("temporal-arithmetic", ["add", "subtract"]),
65
+ temporalNode("temporal-comparison", [
66
+ "equal",
67
+ "not-equal",
68
+ "less-than",
69
+ "less-than-or-equal",
70
+ "greater-than",
71
+ "greater-than-or-equal"
72
+ ]),
61
73
  matchNode("Option", [arm("some", true), arm("none", false)]),
62
- 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"])
63
105
  ]
64
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) };
65
144
  const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
66
145
  $schema: "https://json-schema.org/draft/2020-12/schema",
67
146
  $id: "https://kalada.dev/schema/program/kalada-v1",
@@ -75,7 +154,7 @@ const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
75
154
  },
76
155
  required: ["format", "version", "profile", "expression"],
77
156
  additionalProperties: false,
78
- $defs: { jsonValue, expression }
157
+ $defs: { jsonValue, expression: legacyExpression }
79
158
  });
80
159
  const KALADA_VALUE_V1_SCHEMA = deepFreeze({
81
160
  $schema: "https://json-schema.org/draft/2020-12/schema",
@@ -89,7 +168,9 @@ const KALADA_VALUE_V1_SCHEMA = deepFreeze({
89
168
  valueEnvelope("Option", "none"),
90
169
  valueEnvelope("Option", "some", { $ref: "#/$defs/encodedValue" }),
91
170
  valueEnvelope("Result", "ok", { $ref: "#/$defs/encodedValue" }),
92
- valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" })
171
+ valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" }),
172
+ valueEnvelope("Instant", "milliseconds", safeInteger()),
173
+ valueEnvelope("Duration", "milliseconds", safeInteger())
93
174
  ]
94
175
  }
95
176
  }
@@ -102,6 +183,20 @@ function node(kind, properties, required) {
102
183
  additionalProperties: false
103
184
  };
104
185
  }
186
+ function temporalNode(kind, operators) {
187
+ return node(
188
+ kind,
189
+ { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },
190
+ ["operator", "left", "right"]
191
+ );
192
+ }
193
+ function safeInteger() {
194
+ return {
195
+ type: "integer",
196
+ minimum: Number.MIN_SAFE_INTEGER,
197
+ maximum: Number.MAX_SAFE_INTEGER
198
+ };
199
+ }
105
200
  function matchNode(type, arms) {
106
201
  return node(
107
202
  "match",
@@ -142,12 +237,50 @@ function expressionRef() {
142
237
  function bindingName() {
143
238
  return { type: "string", minLength: 1, maxLength: limits_js.DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };
144
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
+ }
145
277
  function deepFreeze(value) {
146
278
  if (typeof value !== "object" || value === null || Object.isFrozen(value)) return value;
147
279
  for (const child of Object.values(value)) deepFreeze(child);
148
280
  return Object.freeze(value);
149
281
  }
150
282
 
283
+ exports.KALADA_V1_FUNCTION_PROGRAM_SCHEMA = KALADA_V1_FUNCTION_PROGRAM_SCHEMA;
151
284
  exports.KALADA_V1_PROGRAM_SCHEMA = KALADA_V1_PROGRAM_SCHEMA;
152
285
  exports.KALADA_VALUE_V1_SCHEMA = KALADA_VALUE_V1_SCHEMA;
153
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 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 ],\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 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(
@@ -56,10 +56,89 @@ const expression = {
56
56
  "variant",
57
57
  "value"
58
58
  ]),
59
+ node("instant", { milliseconds: safeInteger() }, ["milliseconds"]),
60
+ node("duration", { milliseconds: safeInteger() }, ["milliseconds"]),
61
+ node("current-instant", {}, []),
62
+ temporalNode("temporal-arithmetic", ["add", "subtract"]),
63
+ temporalNode("temporal-comparison", [
64
+ "equal",
65
+ "not-equal",
66
+ "less-than",
67
+ "less-than-or-equal",
68
+ "greater-than",
69
+ "greater-than-or-equal"
70
+ ]),
59
71
  matchNode("Option", [arm("some", true), arm("none", false)]),
60
- 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"])
61
103
  ]
62
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) };
63
142
  const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
64
143
  $schema: "https://json-schema.org/draft/2020-12/schema",
65
144
  $id: "https://kalada.dev/schema/program/kalada-v1",
@@ -73,7 +152,7 @@ const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
73
152
  },
74
153
  required: ["format", "version", "profile", "expression"],
75
154
  additionalProperties: false,
76
- $defs: { jsonValue, expression }
155
+ $defs: { jsonValue, expression: legacyExpression }
77
156
  });
78
157
  const KALADA_VALUE_V1_SCHEMA = deepFreeze({
79
158
  $schema: "https://json-schema.org/draft/2020-12/schema",
@@ -87,7 +166,9 @@ const KALADA_VALUE_V1_SCHEMA = deepFreeze({
87
166
  valueEnvelope("Option", "none"),
88
167
  valueEnvelope("Option", "some", { $ref: "#/$defs/encodedValue" }),
89
168
  valueEnvelope("Result", "ok", { $ref: "#/$defs/encodedValue" }),
90
- valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" })
169
+ valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" }),
170
+ valueEnvelope("Instant", "milliseconds", safeInteger()),
171
+ valueEnvelope("Duration", "milliseconds", safeInteger())
91
172
  ]
92
173
  }
93
174
  }
@@ -100,6 +181,20 @@ function node(kind, properties, required) {
100
181
  additionalProperties: false
101
182
  };
102
183
  }
184
+ function temporalNode(kind, operators) {
185
+ return node(
186
+ kind,
187
+ { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },
188
+ ["operator", "left", "right"]
189
+ );
190
+ }
191
+ function safeInteger() {
192
+ return {
193
+ type: "integer",
194
+ minimum: Number.MIN_SAFE_INTEGER,
195
+ maximum: Number.MAX_SAFE_INTEGER
196
+ };
197
+ }
103
198
  function matchNode(type, arms) {
104
199
  return node(
105
200
  "match",
@@ -140,12 +235,49 @@ function expressionRef() {
140
235
  function bindingName() {
141
236
  return { type: "string", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };
142
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
+ }
143
275
  function deepFreeze(value) {
144
276
  if (typeof value !== "object" || value === null || Object.isFrozen(value)) return value;
145
277
  for (const child of Object.values(value)) deepFreeze(child);
146
278
  return Object.freeze(value);
147
279
  }
148
280
 
149
- export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA };
281
+ export { KALADA_V1_FUNCTION_PROGRAM_SCHEMA, KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA };
150
282
  //# sourceMappingURL=schemas.js.map
151
283
  //# sourceMappingURL=schemas.js.map