@almadar/core 10.129.0 → 11.0.1

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 (135) hide show
  1. package/dist/behavior-package.d.ts +49 -11
  2. package/dist/behavior-package.js +1 -1
  3. package/dist/{orbital-CkFdDS9f.d.ts → builders-BdgbY7Th.d.ts} +5828 -6917
  4. package/dist/builders.d.ts +6 -6
  5. package/dist/builders.js +7 -6
  6. package/dist/{bus-CcbB__oo.d.ts → bus-C0hFDNFR.d.ts} +262 -354
  7. package/dist/chunk-347APWFM.js +286 -0
  8. package/dist/chunk-347APWFM.js.map +1 -0
  9. package/dist/chunk-5WQ3U7NJ.js +2363 -0
  10. package/dist/chunk-5WQ3U7NJ.js.map +1 -0
  11. package/dist/chunk-5YTPYMPZ.js +99 -0
  12. package/dist/chunk-5YTPYMPZ.js.map +1 -0
  13. package/dist/chunk-66Q5VX2F.js +3810 -0
  14. package/dist/chunk-66Q5VX2F.js.map +1 -0
  15. package/dist/chunk-7GHJU5WI.js +39 -0
  16. package/dist/chunk-7GHJU5WI.js.map +1 -0
  17. package/dist/chunk-B4MNHGBP.js +8 -0
  18. package/dist/chunk-B4MNHGBP.js.map +1 -0
  19. package/dist/chunk-E4T2MQAV.js +24 -0
  20. package/dist/chunk-E4T2MQAV.js.map +1 -0
  21. package/dist/chunk-ENOCKYGA.js +412 -0
  22. package/dist/chunk-ENOCKYGA.js.map +1 -0
  23. package/dist/chunk-FGT5OS2Y.js +918 -0
  24. package/dist/chunk-FGT5OS2Y.js.map +1 -0
  25. package/dist/chunk-GF7KCLNR.js +3284 -0
  26. package/dist/chunk-GF7KCLNR.js.map +1 -0
  27. package/dist/chunk-PNGFWLHD.js +1567 -0
  28. package/dist/chunk-PNGFWLHD.js.map +1 -0
  29. package/dist/{chunk-X4SC7FGF.js → chunk-RGACZEYC.js} +99 -96
  30. package/dist/chunk-RGACZEYC.js.map +1 -0
  31. package/dist/{chunk-RYPVOI6H.js → chunk-SNZYN7UA.js} +2541 -433
  32. package/dist/{chunk-RYPVOI6H.js.map → chunk-SNZYN7UA.js.map} +1 -1
  33. package/dist/{chunk-KDMV222Q.js → chunk-TDNQT3M3.js} +304 -373
  34. package/dist/chunk-TDNQT3M3.js.map +1 -0
  35. package/dist/chunk-VG7BRFUD.js +152 -0
  36. package/dist/chunk-VG7BRFUD.js.map +1 -0
  37. package/dist/chunk-Z7BI7DE7.js +1293 -0
  38. package/dist/chunk-Z7BI7DE7.js.map +1 -0
  39. package/dist/{domain-Dz3jP-UM.d.ts → domain-Cpmja5ak.d.ts} +55 -55
  40. package/dist/{effect-CiEVLsZz.d.ts → effect-DZaXwSAz.d.ts} +283 -453
  41. package/dist/{effect-result-Bebwu9yT.d.ts → effect-result-1HpXgeBc.d.ts} +656 -851
  42. package/dist/{expression-D0Fs0riG.d.ts → expression-DirYKz-f.d.ts} +5 -13
  43. package/dist/factory/index.d.ts +7 -144
  44. package/dist/factory/index.js +8 -8
  45. package/dist/factory-runtime/index.d.ts +7 -6
  46. package/dist/factory-runtime/index.js +527 -8
  47. package/dist/factory-runtime/index.js.map +1 -1
  48. package/dist/fixtures.d.ts +9 -11
  49. package/dist/fixtures.js +12 -8
  50. package/dist/fixtures.js.map +1 -1
  51. package/dist/i18n/index.d.ts +15 -19
  52. package/dist/i18n/index.js +2 -1
  53. package/dist/{index-BC-Jycqj.d.ts → index-D7SxwNdv.d.ts} +34 -734
  54. package/dist/index.d.ts +92 -247
  55. package/dist/index.js +322 -986
  56. package/dist/index.js.map +1 -1
  57. package/dist/kernel-wire.d.ts +3 -3
  58. package/dist/kernel-wire.js +3 -79
  59. package/dist/kernel-wire.js.map +1 -1
  60. package/dist/language/constructs.json +22 -2
  61. package/dist/language/program-types.json +203 -22
  62. package/dist/language/protocols.json +46 -0
  63. package/dist/language/ui-vocabulary.json +1697 -0
  64. package/dist/language/validation-codes.json +1222 -1212
  65. package/dist/language/vocabulary.json +44 -8
  66. package/dist/language-data.d.ts +7 -4
  67. package/dist/language-data.js +20 -14
  68. package/dist/language-data.js.map +1 -1
  69. package/dist/patterns/component-mapping.json +11 -1
  70. package/dist/patterns/definitions.d.ts +2 -2
  71. package/dist/patterns/definitions.js +1 -1
  72. package/dist/patterns/event-contracts.json +1 -15
  73. package/dist/patterns/game-font-families.json +13 -0
  74. package/dist/patterns/index.d.ts +24 -120
  75. package/dist/patterns/index.js +3 -3
  76. package/dist/patterns/pattern-tile-geometry.json +1065 -0
  77. package/dist/patterns/patterns-registry.json +2539 -431
  78. package/dist/patterns/registry.json +2539 -431
  79. package/dist/trait-sRjIivFq.d.ts +3519 -0
  80. package/dist/types/index.d.ts +9 -10
  81. package/dist/types/index.js +11 -5
  82. package/dist/{types-DGwrltUF.d.ts → types-C6_yPMpn.d.ts} +3 -3
  83. package/fixtures/events-wire/client-effects-by-trait/response.json +0 -18
  84. package/fixtures/events-wire/client-effects-provenance/response.json +0 -18
  85. package/fixtures/events-wire/effect-results-every-kind/response.json +2 -27
  86. package/fixtures/events-wire/navigate-1/response.json +8 -5
  87. package/fixtures/events-wire/navigate-2/response.json +11 -8
  88. package/fixtures/events-wire/navigate-3/response.json +14 -11
  89. package/fixtures/events-wire/navigate-back/response.json +7 -4
  90. package/fixtures/events-wire/render-ui-3/response.json +12 -9
  91. package/fixtures/events-wire/render-ui-clear/response.json +0 -7
  92. package/fixtures/events-wire/sse-stream/response.json +0 -20
  93. package/fixtures/events-wire/sse-stream/stream.json +0 -20
  94. package/fixtures/events-wire/stateless-traits/response.json +14 -5
  95. package/fixtures/kernel-wire/golden/basic-entity.json +1687 -0
  96. package/fixtures/kernel-wire/golden/entity-rerender.json +743 -0
  97. package/fixtures/kernel-wire/golden/rollback.json +793 -0
  98. package/fixtures/kernel-wire/golden/tick-counter.json +1538 -0
  99. package/fixtures/kernel-wire/golden/two-orbital-chore.json +847 -0
  100. package/fixtures/kernel-wire/golden/two-orbital-task.json +457 -0
  101. package/fixtures/kernel-wire/played-step.json +136 -0
  102. package/fixtures/kernel-wire/scripts/basic-entity.json +28 -0
  103. package/fixtures/kernel-wire/scripts/entity-rerender.json +13 -0
  104. package/fixtures/kernel-wire/scripts/rollback.json +53 -0
  105. package/fixtures/kernel-wire/scripts/tick-counter.json +26 -0
  106. package/fixtures/kernel-wire/scripts/two-orbital-chore.json +9 -0
  107. package/fixtures/kernel-wire/scripts/two-orbital-task.json +9 -0
  108. package/package.json +28 -19
  109. package/dist/builders-DmZE5By0.d.ts +0 -2663
  110. package/dist/chunk-45I2O4SJ.js +0 -4646
  111. package/dist/chunk-45I2O4SJ.js.map +0 -1
  112. package/dist/chunk-6LR43Z5E.js +0 -3061
  113. package/dist/chunk-6LR43Z5E.js.map +0 -1
  114. package/dist/chunk-GIUA3NUJ.js +0 -809
  115. package/dist/chunk-GIUA3NUJ.js.map +0 -1
  116. package/dist/chunk-GTY53NS5.js +0 -1908
  117. package/dist/chunk-GTY53NS5.js.map +0 -1
  118. package/dist/chunk-JOHDVS6J.js +0 -1614
  119. package/dist/chunk-JOHDVS6J.js.map +0 -1
  120. package/dist/chunk-KDMV222Q.js.map +0 -1
  121. package/dist/chunk-QRHJUS3D.js +0 -23
  122. package/dist/chunk-QRHJUS3D.js.map +0 -1
  123. package/dist/chunk-QUOTJULD.js +0 -4009
  124. package/dist/chunk-QUOTJULD.js.map +0 -1
  125. package/dist/chunk-V5VNGRVU.js +0 -66
  126. package/dist/chunk-V5VNGRVU.js.map +0 -1
  127. package/dist/chunk-X4SC7FGF.js.map +0 -1
  128. package/dist/entityAccess-BPSz1i2n.d.ts +0 -80
  129. package/dist/mock/index.d.ts +0 -153
  130. package/dist/mock/index.js +0 -190
  131. package/dist/mock/index.js.map +0 -1
  132. package/dist/schema-T5RT5s6H.d.ts +0 -282
  133. package/dist/state-machine/index.d.ts +0 -359
  134. package/dist/state-machine/index.js +0 -3
  135. package/dist/state-machine/index.js.map +0 -1
@@ -0,0 +1,286 @@
1
+ import { setOwn } from './chunk-B4MNHGBP.js';
2
+ import { JsonValueSchema } from './chunk-7GHJU5WI.js';
3
+ import { z } from 'zod';
4
+
5
+ var SExprDataSchema = z.lazy(
6
+ () => z.union([SExprAtomSchema, z.array(SExprDataSchema)])
7
+ );
8
+ var SExprAtomSchema = z.union([
9
+ z.string(),
10
+ z.number(),
11
+ z.boolean(),
12
+ z.null(),
13
+ z.record(z.string(), SExprDataSchema)
14
+ // Objects for payload data
15
+ ]);
16
+ var SExprSchema = z.lazy(
17
+ () => z.union([
18
+ SExprAtomSchema,
19
+ z.array(SExprDataSchema).min(1).refine(
20
+ (arr) => typeof arr[0] === "string",
21
+ { message: "S-expression array must have a string operator as first element" }
22
+ )
23
+ ])
24
+ );
25
+ var ExpressionSchema = SExprSchema;
26
+ var SExprListSchema = z.array(SExprSchema);
27
+ function isSExpr(value) {
28
+ return Array.isArray(value) && value.length > 0 && typeof value[0] === "string";
29
+ }
30
+ function isSExprAtom(value) {
31
+ if (value === null) return true;
32
+ if (Array.isArray(value)) return false;
33
+ const type = typeof value;
34
+ return type === "string" || type === "number" || type === "boolean" || type === "object";
35
+ }
36
+ function isBinding(value) {
37
+ return typeof value === "string" && value.startsWith("@");
38
+ }
39
+ function isSExprCall(value) {
40
+ return isSExpr(value);
41
+ }
42
+ var CORE_BINDINGS = ["entity", "payload", "state", "now", "config", "computed", "trait", "user", "callsitePayload", "pages", "currentTheme"];
43
+ function parseBinding(binding) {
44
+ if (!binding.startsWith("@")) {
45
+ return null;
46
+ }
47
+ const withoutPrefix = binding.slice(1);
48
+ const parts = withoutPrefix.split(".");
49
+ if (parts.length === 0 || parts[0] === "") {
50
+ return null;
51
+ }
52
+ const root = parts[0];
53
+ const path = parts.slice(1);
54
+ const isCore = CORE_BINDINGS.includes(root);
55
+ return {
56
+ type: isCore ? "core" : "entity",
57
+ root,
58
+ path,
59
+ original: binding
60
+ };
61
+ }
62
+ function isValidBinding(binding) {
63
+ const parsed = parseBinding(binding);
64
+ if (!parsed) return false;
65
+ if (parsed.type === "core") {
66
+ if (parsed.root === "state" || parsed.root === "now") {
67
+ return parsed.path.length === 0;
68
+ }
69
+ return true;
70
+ }
71
+ return parsed.path.length > 0;
72
+ }
73
+ function getOperator(expr) {
74
+ if (!isSExpr(expr)) return null;
75
+ return expr[0];
76
+ }
77
+ function formatSExpr(expr) {
78
+ if (expr === null) return "null";
79
+ if (typeof expr === "string") return isBinding(expr) ? expr : JSON.stringify(expr);
80
+ if (typeof expr === "number" || typeof expr === "boolean") return String(expr);
81
+ if (Array.isArray(expr)) {
82
+ const quoted = quoteBodyOf(expr);
83
+ if (quoted !== void 0) return `(${QUOTE_HEAD} ${formatSExpr(decodeQuoteBody(quoted))})`;
84
+ const qq = quasiquoteOf(expr);
85
+ if (qq !== void 0) return `(${QUASIQUOTE_HEAD} ${formatTemplate(decodeQuoteBody(qq.body), qq.holes)})`;
86
+ const op = getOperator(expr);
87
+ if (op !== null) return `(${[op, ...expr.slice(1).map(formatSExpr)].join(" ")})`;
88
+ return `[${expr.map(formatSExpr).join(" ")}]`;
89
+ }
90
+ const entries = Object.keys(expr).sort().map((k) => `${k}: ${formatSExpr(expr[k])}`);
91
+ return entries.length === 0 ? "{}" : `{ ${entries.join(", ")} }`;
92
+ }
93
+ function getArgs(expr) {
94
+ if (!isSExpr(expr)) return [];
95
+ return expr.slice(1);
96
+ }
97
+ function sexpr(operator, ...args) {
98
+ return [operator, ...args];
99
+ }
100
+ function walkSExpr(expr, visitor, parent = null, index = 0) {
101
+ visitor(expr, parent, index);
102
+ if (isSExpr(expr)) {
103
+ for (let i = 0; i < expr.length; i++) {
104
+ walkSExpr(expr[i], visitor, expr, i);
105
+ }
106
+ }
107
+ }
108
+ function collectBindings(expr) {
109
+ const bindings = [];
110
+ walkSExpr(expr, (node) => {
111
+ if (isBinding(node)) {
112
+ bindings.push(node);
113
+ }
114
+ });
115
+ return bindings;
116
+ }
117
+ function isEventPayloadValue(value) {
118
+ if (value === null) return true;
119
+ const kind = typeof value;
120
+ if (kind === "string" || kind === "number" || kind === "boolean") return true;
121
+ if (Array.isArray(value)) return value.every((item) => isEventPayloadValue(item));
122
+ if (kind === "object" && typeof value === "object" && !(value instanceof Date)) {
123
+ return Object.values(value).every((item) => isEventPayloadValue(item));
124
+ }
125
+ return false;
126
+ }
127
+ var EventPayloadValueSchema = JsonValueSchema;
128
+ var EventPayloadSchema = z.record(z.string(), JsonValueSchema);
129
+ function isStaticallyFalse(expr, resolve) {
130
+ const known = (e) => {
131
+ if (typeof e === "string" && e.startsWith("@") && resolve !== void 0) {
132
+ const value2 = resolve(e);
133
+ return value2 === void 0 ? e : value2;
134
+ }
135
+ return e;
136
+ };
137
+ const isLiteral = (e) => e === null || typeof e === "boolean" || typeof e === "number" || typeof e === "string" && !e.startsWith("@");
138
+ const value = known(expr);
139
+ if (value === false || value === null) return true;
140
+ if (typeof value === "number") return value === 0;
141
+ if (typeof value === "string") return value === "";
142
+ if (Array.isArray(value)) {
143
+ const op = value[0];
144
+ if (typeof op !== "string") return value.length === 0;
145
+ const args = value.slice(1);
146
+ switch (op) {
147
+ case "and":
148
+ return args.some((a) => isStaticallyFalse(a, resolve));
149
+ case "or":
150
+ return args.length > 0 && args.every((a) => isStaticallyFalse(a, resolve));
151
+ case "not":
152
+ return args.length === 1 && known(args[0]) === true;
153
+ case "==":
154
+ case "!=": {
155
+ if (args.length !== 2) return false;
156
+ const [l, r] = [known(args[0]), known(args[1])];
157
+ if (!isLiteral(l) || !isLiteral(r)) return false;
158
+ return l === r === (op === "!=");
159
+ }
160
+ default:
161
+ return false;
162
+ }
163
+ }
164
+ if (typeof value === "object") return Object.keys(value).length === 0;
165
+ return false;
166
+ }
167
+ var QUOTE_HEAD = "quote";
168
+ function canonicalQuoteValue(expr) {
169
+ if (Array.isArray(expr)) return expr.map(canonicalQuoteValue);
170
+ if (expr !== null && typeof expr === "object") {
171
+ const out = {};
172
+ for (const key of Object.keys(expr).sort()) setOwn(out, key, canonicalQuoteValue(expr[key]));
173
+ return out;
174
+ }
175
+ return expr;
176
+ }
177
+ function encodeQuoteBody(expr) {
178
+ return JSON.stringify(canonicalQuoteValue(expr)).replace(/@/g, "\\u0040");
179
+ }
180
+ function decodeQuoteBody(body) {
181
+ const value = JSON.parse(body);
182
+ return value;
183
+ }
184
+ function quoteExpr(expr) {
185
+ return [QUOTE_HEAD, encodeQuoteBody(expr)];
186
+ }
187
+ function decodeQuotedValue(expr) {
188
+ const body = quoteBodyOf(expr);
189
+ return body === void 0 ? expr : decodeQuoteBody(body);
190
+ }
191
+ function quoteBodyOf(expr) {
192
+ return Array.isArray(expr) && expr.length === 2 && expr[0] === QUOTE_HEAD && typeof expr[1] === "string" ? expr[1] : void 0;
193
+ }
194
+ var QUASIQUOTE_HEAD = "quasiquote";
195
+ var UNQUOTE_HEAD = "unquote";
196
+ function isHeadedCall(expr, head) {
197
+ return Array.isArray(expr) && expr.length > 0 && expr[0] === head;
198
+ }
199
+ function containsHead(expr, head) {
200
+ if (isHeadedCall(expr, head)) return true;
201
+ if (Array.isArray(expr)) return expr.some((e) => containsHead(e, head));
202
+ if (expr !== null && typeof expr === "object") return Object.values(expr).some((e) => containsHead(e, head));
203
+ return false;
204
+ }
205
+ function extractHoles(expr, holes) {
206
+ if (isHeadedCall(expr, QUASIQUOTE_HEAD)) throw new Error("quasiquote: nested quasiquote is not supported");
207
+ if (isHeadedCall(expr, UNQUOTE_HEAD)) {
208
+ if (expr.length !== 2) throw new Error("quasiquote: (unquote e) takes exactly one expression");
209
+ if (containsHead(expr[1], UNQUOTE_HEAD)) throw new Error("quasiquote: unquote inside an unquote");
210
+ holes.push(expr[1]);
211
+ return [UNQUOTE_HEAD, holes.length - 1];
212
+ }
213
+ if (Array.isArray(expr)) return expr.map((e) => extractHoles(e, holes));
214
+ if (expr !== null && typeof expr === "object") {
215
+ const out = {};
216
+ for (const k of Object.keys(expr).sort()) setOwn(out, k, extractHoles(expr[k], holes));
217
+ return out;
218
+ }
219
+ return expr;
220
+ }
221
+ function quasiquoteExpr(template) {
222
+ const holes = [];
223
+ const body = encodeQuoteBody(extractHoles(template, holes));
224
+ return [QUASIQUOTE_HEAD, body, ...holes];
225
+ }
226
+ function quasiquoteOf(expr) {
227
+ if (!Array.isArray(expr) || expr.length < 2 || expr[0] !== QUASIQUOTE_HEAD || typeof expr[1] !== "string") {
228
+ return void 0;
229
+ }
230
+ return { body: expr[1], holes: expr.slice(2) };
231
+ }
232
+ function countMarkers(expr) {
233
+ if (isHeadedCall(expr, UNQUOTE_HEAD) && expr.length === 2 && typeof expr[1] === "number") return 1;
234
+ if (Array.isArray(expr)) return expr.reduce((n, e) => n + countMarkers(e), 0);
235
+ if (expr !== null && typeof expr === "object") return Object.values(expr).reduce((n, e) => n + countMarkers(e), 0);
236
+ return 0;
237
+ }
238
+ function fillMarkers(expr, values) {
239
+ if (isHeadedCall(expr, UNQUOTE_HEAD) && expr.length === 2 && typeof expr[1] === "number") return values[expr[1]];
240
+ if (Array.isArray(expr)) return expr.map((e) => fillMarkers(e, values));
241
+ if (expr !== null && typeof expr === "object") {
242
+ const out = {};
243
+ for (const [k, v] of Object.entries(expr)) setOwn(out, k, fillMarkers(v, values));
244
+ return out;
245
+ }
246
+ return expr;
247
+ }
248
+ function toProgramData(value) {
249
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
250
+ return value;
251
+ }
252
+ if (Array.isArray(value)) return value.map((v) => toProgramData(v));
253
+ if (typeof value === "object" && !(value instanceof Date) && Object.getPrototypeOf(value) === Object.prototype) {
254
+ const out = {};
255
+ for (const [k, v] of Object.entries(value)) setOwn(out, k, toProgramData(v));
256
+ return out;
257
+ }
258
+ throw new Error(`quasiquote: a hole evaluated to a ${typeof value} value, which cannot be held as program data`);
259
+ }
260
+ function instantiateQuasiquote(body, values) {
261
+ const template = decodeQuoteBody(body);
262
+ const holes = countMarkers(template);
263
+ if (holes !== values.length) {
264
+ throw new Error(`quasiquote: template has ${holes} hole(s), got ${values.length} value(s)`);
265
+ }
266
+ return fillMarkers(template, values);
267
+ }
268
+ function formatTemplate(expr, holes) {
269
+ if (isHeadedCall(expr, UNQUOTE_HEAD) && expr.length === 2 && typeof expr[1] === "number") {
270
+ return `(${UNQUOTE_HEAD} ${formatSExpr(holes[expr[1]])})`;
271
+ }
272
+ if (Array.isArray(expr)) {
273
+ const op = getOperator(expr);
274
+ if (op !== null) return `(${[op, ...expr.slice(1).map((e) => formatTemplate(e, holes))].join(" ")})`;
275
+ return `[${expr.map((e) => formatTemplate(e, holes)).join(" ")}]`;
276
+ }
277
+ if (expr !== null && typeof expr === "object") {
278
+ const entries = Object.keys(expr).sort().map((k) => `${k}: ${formatTemplate(expr[k], holes)}`);
279
+ return entries.length === 0 ? "{}" : `{ ${entries.join(", ")} }`;
280
+ }
281
+ return formatSExpr(expr);
282
+ }
283
+
284
+ export { CORE_BINDINGS, EventPayloadSchema, EventPayloadValueSchema, ExpressionSchema, QUASIQUOTE_HEAD, QUOTE_HEAD, SExprAtomSchema, SExprDataSchema, SExprListSchema, SExprSchema, UNQUOTE_HEAD, collectBindings, decodeQuoteBody, decodeQuotedValue, encodeQuoteBody, formatSExpr, getArgs, getOperator, instantiateQuasiquote, isBinding, isEventPayloadValue, isSExpr, isSExprAtom, isSExprCall, isStaticallyFalse, isValidBinding, parseBinding, quasiquoteExpr, quasiquoteOf, quoteBodyOf, quoteExpr, sexpr, toProgramData, walkSExpr };
285
+ //# sourceMappingURL=chunk-347APWFM.js.map
286
+ //# sourceMappingURL=chunk-347APWFM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/expression.ts"],"names":["value"],"mappings":"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","file":"chunk-347APWFM.js","sourcesContent":["/**\n * S-Expression Types\n *\n * Defines the S-Expression type system for guards, effects, and computed values.\n * S-expressions are JSON arrays where the first element is an operator string.\n *\n * @example\n * // Guard: health > 0\n * [\">\", \"@entity.health\", 0]\n *\n * // Effect: set x to x + vx\n * [\"set\", \"@entity.x\", [\"+\", \"@entity.x\", \"@entity.vx\"]]\n *\n * @packageDocumentation\n */\n\nimport { z } from 'zod';\nimport { setOwn } from './own-key.js';\nimport { JsonValueSchema, type JsonValue, type RuntimeValue } from './json.js';\n\n// ============================================================================\n// S-Expression Type\n// ============================================================================\n\n/**\n * S-Expression type - recursive structure representing expressions.\n *\n * An S-expression is either:\n * - A literal value (string, number, boolean, null)\n * - An object literal (for payload data, props, etc.)\n * - A binding reference (string starting with @)\n * - A call expression (array with operator as first element)\n */\n/** Object literal branch of an S-expression atom (payload data, props, etc.). */\nexport interface SExprObject {\n [key: string]: SExpr;\n}\nexport type SExprAtom = string | number | boolean | null | SExprObject;\nexport type SExpr = SExprAtom | SExpr[];\n\n/**\n * Expression type - S-expressions only.\n * Used for guards, computed values, and effect expressions.\n *\n * NOTE: Legacy string format is no longer supported.\n * All expressions must be S-expression arrays.\n */\nexport type Expression = SExpr;\n\n// ============================================================================\n// S-Expression Schema (Zod)\n// ============================================================================\n\n/**\n * Recursive schema for s-expr-shaped DATA in literal positions (object\n * values, effect arguments). Unlike `SExprSchema`, arrays may be empty or\n * non-operator-headed — literal data lists (`children: []`, `tiles: [...]`)\n * are valid here; only call positions get the operator-head refine.\n */\nexport const SExprDataSchema: z.ZodType<SExpr> = z.lazy(() =>\n z.union([SExprAtomSchema, z.array(SExprDataSchema)]),\n);\n\n/**\n * Schema for atomic S-expression values (non-array)\n * Includes objects for payload data, props, etc.\n */\nexport const SExprAtomSchema: z.ZodType<SExprAtom> = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.record(z.string(), SExprDataSchema), // Objects for payload data\n]);\n\n/**\n * Recursive schema for S-expressions: an atom, or a call — an array whose first element is its\n * string operator. A call's arguments are data (`SExprDataSchema`): an argument array without\n * an operator head is a literal list, as both evaluators read it (an inlined config list in\n * `[\"array/nth\", [{…}, {…}], \"@entity.i\"]`).\n */\nexport const SExprSchema: z.ZodType<SExpr> = z.lazy(() =>\n z.union([\n SExprAtomSchema,\n z\n .array(SExprDataSchema)\n .min(1)\n .refine(\n (arr) => typeof arr[0] === 'string',\n { message: 'S-expression array must have a string operator as first element' }\n ),\n ])\n);\n\n/**\n * Schema for Expression type - S-expressions only.\n * S-expressions are arrays with operator as first element.\n *\n * NOTE: Legacy string format is no longer supported.\n */\nexport const ExpressionSchema: z.ZodType<Expression> = SExprSchema;\n\n/** A list of propositions (`@invariant`, `@ensures`), named so declaration emit does not expand it at every use. */\nexport const SExprListSchema: z.ZodType<SExpr[]> = z.array(SExprSchema);\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for S-expression detection.\n * 100% reliable - structural check, no regex or keyword matching.\n *\n * @param value - Value to check\n * @returns true if value is an S-expression (array with string operator)\n */\nexport function isSExpr(value: RuntimeValue): value is SExpr[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'string'\n );\n}\n\n/**\n * Type guard for S-expression atoms (non-array values).\n * \n * Validates that a value is an S-expression atom (literal value).\n * Includes null, strings, numbers, booleans, and objects. Used to\n * distinguish atomic values from S-expression calls (arrays).\n * \n * @param {RuntimeValue} value - Value to check\n * @returns {boolean} True if value is an S-expression atom, false otherwise\n *\n * @example\n * isSExprAtom('hello'); // returns true\n * isSExprAtom(42); // returns true\n * isSExprAtom(null); // returns true\n * isSExprAtom({ key: 'value' }); // returns true\n * isSExprAtom(['+', 1, 2]); // returns false\n */\nexport function isSExprAtom(value: RuntimeValue): value is SExprAtom {\n if (value === null) return true;\n if (Array.isArray(value)) return false;\n const type = typeof value;\n return type === 'string' || type === 'number' || type === 'boolean' || type === 'object';\n}\n\n/**\n * Checks if a value is a binding reference.\n * \n * Validates that a string is a binding reference (starts with @).\n * Bindings reference runtime values like @entity.health, @payload.amount, @now.\n * Used for identifying bindings in S-expressions and validation.\n * \n * @param {RuntimeValue} value - Value to check\n * @returns {boolean} True if value is a binding reference, false otherwise\n *\n * @example\n * isBinding('@entity.health'); // returns true\n * isBinding('@payload.amount'); // returns true\n * isBinding('not-a-binding'); // returns false\n * isBinding(123); // returns false\n */\nexport function isBinding(value: RuntimeValue): value is string {\n return typeof value === 'string' && value.startsWith('@');\n}\n\n/**\n * Checks if a value is a valid S-expression call (array with operator).\n * \n * Alias for isSExpr() - validates S-expression call structure.\n * Used to distinguish between S-expression calls and atom values.\n * \n * @param {RuntimeValue} value - Value to check\n * @returns {boolean} True if value is a valid S-expression call, false otherwise\n *\n * @example\n * isSExprCall(['+', 1, 2]); // returns true\n * isSExprCall(['set', '@entity.health', 100]); // returns true\n * isSExprCall('not-a-call'); // returns false\n */\nexport function isSExprCall(value: RuntimeValue): value is SExpr[] {\n return isSExpr(value);\n}\n\n// ============================================================================\n// Binding Parsing\n// ============================================================================\n\n/**\n * Parsed binding reference\n */\nexport interface ParsedBinding {\n /** Type of binding: core (@entity, @payload, @state, @now) or entity (@EntityName) */\n type: 'core' | 'entity';\n /** The root binding name (entity, payload, state, now, or EntityName) */\n root: string;\n /** Path segments after the root (e.g., ['health'] for @entity.health) */\n path: string[];\n /** Full original binding string */\n original: string;\n}\n\n/**\n * Core bindings that are always available.\n * Phase 4.5 adds: config, computed, trait (for behavior support).\n * `user` is the authenticated user / agent context (see binding.ts) and is\n * read-only in guards/effects/ticks — atoms reference `@user.id` and\n * `@user.role` for ownership / role-based gating.\n * `callsitePayload` is the call-site-captured event payload emitted by the\n * compiler's inline-trait hoisting; the runtime BindingResolver resolves it\n * at the composing effect.\n * `pages` / `currentTheme` are render-resolved schema sigils (effect-only,\n * see `orbital-rust/crates/orbital-compiler/src/phases/resolve.rs`):\n * substituted from the host orbital's schema (`@pages` → its `NavItem[]`\n * nav array, `@currentTheme` → its `data-theme` key) before codegen — they\n * never survive as live bindings past that substitution pass.\n */\nexport const CORE_BINDINGS = ['entity', 'payload', 'state', 'now', 'config', 'computed', 'trait', 'user', 'callsitePayload', 'pages', 'currentTheme'] as const;\nexport type CoreBinding = (typeof CORE_BINDINGS)[number];\n\n/**\n * Parses a binding reference into its components.\n * \n * Deconstructs a binding string (e.g., '@entity.health') into its constituent\n * parts: type, root, path, and original string. Does NOT use regex - uses\n * structured string operations for reliability and maintainability.\n * \n * @param {string} binding - Binding string starting with @\n * @returns {ParsedBinding | null} Parsed binding object or null if invalid\n * \n * @example\n * parseBinding('@entity.health'); // returns { type: 'core', root: 'entity', path: ['health'], original: '@entity.health' }\n * parseBinding('@User.name'); // returns { type: 'entity', root: 'User', path: ['name'], original: '@User.name' }\n * parseBinding('not-a-binding'); // returns null\n */\nexport function parseBinding(binding: string): ParsedBinding | null {\n if (!binding.startsWith('@')) {\n return null;\n }\n\n // Remove @ prefix\n const withoutPrefix = binding.slice(1);\n\n // Split by dots\n const parts = withoutPrefix.split('.');\n\n if (parts.length === 0 || parts[0] === '') {\n return null;\n }\n\n const root = parts[0];\n const path = parts.slice(1);\n\n // Determine if core binding or entity reference\n const isCore = (CORE_BINDINGS as readonly string[]).includes(root);\n\n return {\n type: isCore ? 'core' : 'entity',\n root,\n path,\n original: binding,\n };\n}\n\n/**\n * Validate a binding reference format.\n *\n * @param binding - Binding string to validate\n * @returns true if valid binding format\n */\nexport function isValidBinding(binding: string): boolean {\n const parsed = parseBinding(binding);\n if (!parsed) return false;\n\n // Core bindings: @entity, @payload, @state, @now (optionally with path)\n // @state and @now don't have paths\n if (parsed.type === 'core') {\n if (parsed.root === 'state' || parsed.root === 'now') {\n return parsed.path.length === 0;\n }\n // @entity and @payload can have paths\n return true;\n }\n\n // Entity bindings: @EntityName.field - must have at least one path segment\n return parsed.path.length > 0;\n}\n\n// ============================================================================\n// S-Expression Utilities\n// ============================================================================\n\n/**\n * Get the operator from an S-expression call.\n *\n * @param expr - S-expression array\n * @returns The operator string or null if not a valid call\n */\nexport function getOperator(expr: SExpr): string | null {\n if (!isSExpr(expr)) return null;\n return expr[0] as string;\n}\n\n/** Where a node sits in its S-expression: argument indices of calls/arrays, keys of object literals. */\nexport type SExprPath = ReadonlyArray<number | string>;\n\n/**\n * One step of a traced evaluation. `enter`/`exit` bracket a node's evaluation\n * (`exit` carries its value or error); `iter` marks a node re-entered (a lambda\n * body per item); `skip` marks an argument the operator never evaluated\n * (short-circuited `and`/`or`, the untaken `if` branch).\n */\nexport interface EvalStep {\n kind: 'enter' | 'exit' | 'iter' | 'skip';\n path: SExprPath;\n value?: RuntimeValue;\n error?: string;\n}\n\nexport type EvalTrace = EvalStep[];\n\n/**\n * Print an S-expression in `.lolo` surface form: calls as `(op args…)`,\n * bindings bare, strings quoted, objects `{ k: v }` (keys sorted), literal arrays `[a b]`.\n * Structural only — a string-headed array is a call, as in {@link isSExpr}.\n */\nexport function formatSExpr(expr: SExpr): string {\n if (expr === null) return 'null';\n if (typeof expr === 'string') return isBinding(expr) ? expr : JSON.stringify(expr);\n if (typeof expr === 'number' || typeof expr === 'boolean') return String(expr);\n if (Array.isArray(expr)) {\n const quoted = quoteBodyOf(expr);\n if (quoted !== undefined) return `(${QUOTE_HEAD} ${formatSExpr(decodeQuoteBody(quoted))})`;\n const qq = quasiquoteOf(expr);\n if (qq !== undefined) return `(${QUASIQUOTE_HEAD} ${formatTemplate(decodeQuoteBody(qq.body), qq.holes)})`;\n const op = getOperator(expr);\n if (op !== null) return `(${[op, ...expr.slice(1).map(formatSExpr)].join(' ')})`;\n return `[${expr.map(formatSExpr).join(' ')}]`;\n }\n const entries = Object.keys(expr).sort().map((k) => `${k}: ${formatSExpr(expr[k])}`);\n return entries.length === 0 ? '{}' : `{ ${entries.join(', ')} }`;\n}\n\n/**\n * Get the arguments from an S-expression call.\n *\n * @param expr - S-expression array\n * @returns Array of arguments (empty if not a valid call)\n */\nexport function getArgs(expr: SExpr): SExpr[] {\n if (!isSExpr(expr)) return [];\n return expr.slice(1);\n}\n\n/**\n * Create an S-expression call.\n *\n * @param operator - The operator string\n * @param args - Arguments to the operator\n * @returns S-expression array\n */\nexport function sexpr(operator: string, ...args: SExpr[]): SExpr[] {\n return [operator, ...args];\n}\n\n/**\n * Walk an S-expression tree and apply a visitor function to each node.\n *\n * @param expr - S-expression to walk\n * @param visitor - Function to call on each node\n */\nexport function walkSExpr(\n expr: SExpr,\n visitor: (node: SExpr, parent: SExpr[] | null, index: number) => void,\n parent: SExpr[] | null = null,\n index: number = 0\n): void {\n visitor(expr, parent, index);\n\n if (isSExpr(expr)) {\n for (let i = 0; i < expr.length; i++) {\n walkSExpr(expr[i], visitor, expr, i);\n }\n }\n}\n\n/**\n * Collect all bindings referenced in an S-expression.\n *\n * @param expr - S-expression to analyze\n * @returns Array of binding strings found\n */\nexport function collectBindings(expr: SExpr): string[] {\n const bindings: string[] = [];\n\n walkSExpr(expr, (node) => {\n if (isBinding(node)) {\n bindings.push(node);\n }\n });\n\n return bindings;\n}\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type SExprInput = z.input<typeof SExprSchema>;\nexport type ExpressionInput = z.input<typeof ExpressionSchema>;\n\n// ============================================================================\n// Runtime Evaluation Types\n// ============================================================================\n\n/** Evaluation context for guards and s-expressions. Recursive. */\nexport interface EvalContext {\n [key: string]: string | number | boolean | Date | null | string[] | EvalContext | undefined;\n}\n\n/**\n * A single value carried by an event payload field: a JSON value. A date is its ISO string, an absent\n * field is an absent key; `Date` and `undefined` never travel on the wire.\n */\nexport type EventPayloadValue = JsonValue;\n\n/**\n * Typed event payload: a JSON object, assignable to the bus's `EventPayload` parameter without casts.\n */\nexport interface EventPayload {\n [key: string]: EventPayloadValue;\n}\n\n/**\n * Runtime guard for `EventPayloadValue` — narrows interpreter-produced\n * `unknown` values at typed substrate boundaries (e.g. `TraceContext.emit`).\n */\nexport function isEventPayloadValue(value: RuntimeValue): value is EventPayloadValue {\n if (value === null) return true;\n const kind = typeof value;\n if (kind === 'string' || kind === 'number' || kind === 'boolean') return true;\n if (Array.isArray(value)) return value.every((item: RuntimeValue) => isEventPayloadValue(item));\n if (kind === 'object' && typeof value === 'object' && !(value instanceof Date)) {\n return Object.values(value).every((item: RuntimeValue) => isEventPayloadValue(item));\n }\n return false;\n}\n\n/** Zod twin of `EventPayloadValue` — the one runtime validator for a bus-emit payload slot. */\nexport const EventPayloadValueSchema: z.ZodType<EventPayloadValue> = JsonValueSchema;\n\n/** Zod twin of `EventPayload` — the wire shape of a bus event's `payload`. */\nexport const EventPayloadSchema: z.ZodType<EventPayload> = z.record(z.string(), JsonValueSchema);\n\n/**\n * Allowed leaf value for `LogMeta`. Mirrors `EventPayloadValue` shape so\n * the same row/list data flows through logs without manual flattening,\n * with `Error` added since structured logs carry exception detail.\n */\nexport type LogMetaValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n | Error\n | LogMeta\n | readonly LogMetaValue[];\n\n/** Structured log/event metadata. Recursive to support nested log data. */\nexport interface LogMeta {\n [key: string]: LogMetaValue;\n}\n\n/**\n * True when `expr` provably evaluates falsy — the twin of orbital-core's\n * `SExpression::is_statically_false`, one table on both paths. Conservative:\n * anything undecidable returns `false` (\"not provably false\"). `resolve`\n * turns a binding (`@config.selfFetch`) into its known literal value, or\n * `undefined` when unknown — the JS path keeps config bindings in guards\n * where Rust inlines them.\n */\nexport function isStaticallyFalse(expr: SExpr, resolve?: (binding: string) => SExprAtom | undefined): boolean {\n const known = (e: SExpr): SExpr => {\n if (typeof e === 'string' && e.startsWith('@') && resolve !== undefined) {\n const value = resolve(e);\n return value === undefined ? e : value;\n }\n return e;\n };\n const isLiteral = (e: SExpr): boolean =>\n e === null || typeof e === 'boolean' || typeof e === 'number' || (typeof e === 'string' && !e.startsWith('@'));\n const value = known(expr);\n if (value === false || value === null) return true;\n if (typeof value === 'number') return value === 0;\n if (typeof value === 'string') return value === '';\n if (Array.isArray(value)) {\n const op = value[0];\n if (typeof op !== 'string') return value.length === 0;\n const args = value.slice(1);\n switch (op) {\n case 'and': return args.some((a) => isStaticallyFalse(a, resolve));\n case 'or': return args.length > 0 && args.every((a) => isStaticallyFalse(a, resolve));\n case 'not': return args.length === 1 && known(args[0]) === true;\n case '==':\n case '!=': {\n if (args.length !== 2) return false;\n const [l, r] = [known(args[0]), known(args[1])];\n if (!isLiteral(l) || !isLiteral(r)) return false;\n return (l === r) === (op === '!=');\n }\n default: return false;\n }\n }\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n}\n\n\n// ============================================================================\n// quote — an S-expression held as data (G-CROSS-041)\n// ============================================================================\n\n/** The special form that holds an S-expression as data: `(quote x)`. */\nexport const QUOTE_HEAD = 'quote';\n\nfunction canonicalQuoteValue(expr: SExpr): SExpr {\n if (Array.isArray(expr)) return expr.map(canonicalQuoteValue);\n if (expr !== null && typeof expr === 'object') {\n const out: SExprObject = {};\n for (const key of Object.keys(expr).sort()) setOwn(out, key, canonicalQuoteValue(expr[key]));\n return out;\n }\n return expr;\n}\n\n/**\n * The IR body of `(quote x)`: canonical JSON of `x` (object keys sorted) with\n * every `@` written as the JSON escape `@`. The body therefore carries no\n * raw `@`, so no binding interpolation, scan or rewrite can reach inside it;\n * any JSON parser restores the original. orbital-core's\n * `schema::quote::encode_quote_body` produces the same bytes.\n */\nexport function encodeQuoteBody(expr: SExpr): string {\n return JSON.stringify(canonicalQuoteValue(expr)).replace(/@/g, '\\\\u0040');\n}\n\n/** Decode a `(quote x)` body back to `x`. */\nexport function decodeQuoteBody(body: string): SExpr {\n const value: SExpr = JSON.parse(body);\n return value;\n}\n\n/** The IR call `[\"quote\", <body>]` for `expr`. */\nexport function quoteExpr(expr: SExpr): [typeof QUOTE_HEAD, string] {\n return [QUOTE_HEAD, encodeQuoteBody(expr)];\n}\n\n/**\n * The data a quoted value stands for: `decodeQuoteBody` of the body when\n * `expr` is a `(quote x)` call, else `expr` unchanged. One level per call —\n * binding path resolution applies it per step, so `(quote …)` nested inside\n * the decoded data decodes there when the path reaches it.\n */\nexport function decodeQuotedValue(expr: SExpr): SExpr;\nexport function decodeQuotedValue(expr: RuntimeValue): RuntimeValue;\nexport function decodeQuotedValue(expr: RuntimeValue): RuntimeValue {\n const body = quoteBodyOf(expr);\n return body === undefined ? expr : decodeQuoteBody(body);\n}\n\n/** The encoded body when `expr` is a `(quote x)` call, else undefined. */\nexport function quoteBodyOf(expr: RuntimeValue): string | undefined {\n return Array.isArray(expr) && expr.length === 2 && expr[0] === QUOTE_HEAD && typeof expr[1] === 'string'\n ? expr[1]\n : undefined;\n}\n\n// ============================================================================\n// quasiquote — a quoted template with live `(unquote e)` holes\n// ============================================================================\n\n/** A quoted template: `(quasiquote x)`. */\nexport const QUASIQUOTE_HEAD = 'quasiquote';\n/** A live hole inside a quasiquote template: `(unquote e)`. */\nexport const UNQUOTE_HEAD = 'unquote';\n\nfunction isHeadedCall(expr: SExpr, head: string): expr is SExpr[] {\n return Array.isArray(expr) && expr.length > 0 && expr[0] === head;\n}\n\nfunction containsHead(expr: SExpr, head: string): boolean {\n if (isHeadedCall(expr, head)) return true;\n if (Array.isArray(expr)) return expr.some((e) => containsHead(e, head));\n if (expr !== null && typeof expr === 'object') return Object.values(expr).some((e) => containsHead(e, head));\n return false;\n}\n\nfunction extractHoles(expr: SExpr, holes: SExpr[]): SExpr {\n if (isHeadedCall(expr, QUASIQUOTE_HEAD)) throw new Error('quasiquote: nested quasiquote is not supported');\n if (isHeadedCall(expr, UNQUOTE_HEAD)) {\n if (expr.length !== 2) throw new Error('quasiquote: (unquote e) takes exactly one expression');\n if (containsHead(expr[1], UNQUOTE_HEAD)) throw new Error('quasiquote: unquote inside an unquote');\n holes.push(expr[1]);\n return [UNQUOTE_HEAD, holes.length - 1];\n }\n if (Array.isArray(expr)) return expr.map((e) => extractHoles(e, holes));\n if (expr !== null && typeof expr === 'object') {\n // Canonical key order, so hole numbering matches the body bytes on every path.\n const out: SExprObject = {};\n for (const k of Object.keys(expr).sort()) setOwn(out, k, extractHoles(expr[k], holes));\n return out;\n }\n return expr;\n}\n\n/**\n * The IR call `[\"quasiquote\", <body>, hole0, hole1, …]` for `template`. The\n * body is a quote body in which each `(unquote e)` became the marker\n * `[\"unquote\", i]`; hole `i` is `e`, left live so bindings resolve in it.\n * orbital-core's `schema::quote::quasiquote_expr` produces the same IR.\n */\nexport function quasiquoteExpr(template: SExpr): [typeof QUASIQUOTE_HEAD, string, ...SExpr[]] {\n const holes: SExpr[] = [];\n const body = encodeQuoteBody(extractHoles(template, holes));\n return [QUASIQUOTE_HEAD, body, ...holes];\n}\n\n/** The body and holes when `expr` is a `(quasiquote x)` call, else undefined. */\nexport function quasiquoteOf(expr: SExpr): { body: string; holes: SExpr[] } | undefined {\n if (!Array.isArray(expr) || expr.length < 2 || expr[0] !== QUASIQUOTE_HEAD || typeof expr[1] !== 'string') {\n return undefined;\n }\n return { body: expr[1], holes: expr.slice(2) };\n}\n\nfunction countMarkers(expr: SExpr): number {\n if (isHeadedCall(expr, UNQUOTE_HEAD) && expr.length === 2 && typeof expr[1] === 'number') return 1;\n if (Array.isArray(expr)) return expr.reduce<number>((n, e) => n + countMarkers(e), 0);\n if (expr !== null && typeof expr === 'object') return Object.values(expr).reduce<number>((n, e) => n + countMarkers(e), 0);\n return 0;\n}\n\nfunction fillMarkers(expr: SExpr, values: readonly SExpr[]): SExpr {\n if (isHeadedCall(expr, UNQUOTE_HEAD) && expr.length === 2 && typeof expr[1] === 'number') return values[expr[1]];\n if (Array.isArray(expr)) return expr.map((e) => fillMarkers(e, values));\n if (expr !== null && typeof expr === 'object') {\n const out: SExprObject = {};\n for (const [k, v] of Object.entries(expr)) setOwn(out, k, fillMarkers(v, values));\n return out;\n }\n return expr;\n}\n\n/**\n * A hole's evaluated value as program data: JSON scalars, arrays and plain\n * objects pass; anything a program cannot hold (a function, a Date, …) throws.\n * Both paths guard `(quasiquote …)` holes with this — orbital-core's\n * `QuasiquoteOp` refuses a lambda the same way.\n */\nexport function toProgramData(value: RuntimeValue): SExpr {\n if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) return value.map((v: RuntimeValue) => toProgramData(v));\n if (typeof value === 'object' && !(value instanceof Date) && Object.getPrototypeOf(value) === Object.prototype) {\n const out: SExprObject = {};\n for (const [k, v] of Object.entries(value)) setOwn(out, k, toProgramData(v));\n return out;\n }\n throw new Error(`quasiquote: a hole evaluated to a ${typeof value} value, which cannot be held as program data`);\n}\n\n/** Decode a quasiquote body and splice `values` (the evaluated holes, in order) into it. */\nexport function instantiateQuasiquote(body: string, values: readonly SExpr[]): SExpr {\n const template = decodeQuoteBody(body);\n const holes = countMarkers(template);\n if (holes !== values.length) {\n throw new Error(`quasiquote: template has ${holes} hole(s), got ${values.length} value(s)`);\n }\n return fillMarkers(template, values);\n}\n\nfunction formatTemplate(expr: SExpr, holes: readonly SExpr[]): string {\n if (isHeadedCall(expr, UNQUOTE_HEAD) && expr.length === 2 && typeof expr[1] === 'number') {\n return `(${UNQUOTE_HEAD} ${formatSExpr(holes[expr[1]])})`;\n }\n if (Array.isArray(expr)) {\n const op = getOperator(expr);\n if (op !== null) return `(${[op, ...expr.slice(1).map((e) => formatTemplate(e, holes))].join(' ')})`;\n return `[${expr.map((e) => formatTemplate(e, holes)).join(' ')}]`;\n }\n if (expr !== null && typeof expr === 'object') {\n const entries = Object.keys(expr).sort().map((k) => `${k}: ${formatTemplate(expr[k], holes)}`);\n return entries.length === 0 ? '{}' : `{ ${entries.join(', ')} }`;\n }\n return formatSExpr(expr);\n}\n"]}