@almadar/core 10.129.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) 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-BhnofAik.d.ts} +5966 -7116
  4. package/dist/builders.d.ts +6 -6
  5. package/dist/builders.js +7 -6
  6. package/dist/{bus-CcbB__oo.d.ts → bus-BrRFWDQK.d.ts} +270 -354
  7. package/dist/chunk-347APWFM.js +286 -0
  8. package/dist/chunk-347APWFM.js.map +1 -0
  9. package/dist/chunk-3URQAGD7.js +98 -0
  10. package/dist/chunk-3URQAGD7.js.map +1 -0
  11. package/dist/chunk-7GHJU5WI.js +39 -0
  12. package/dist/chunk-7GHJU5WI.js.map +1 -0
  13. package/dist/chunk-B4MNHGBP.js +8 -0
  14. package/dist/chunk-B4MNHGBP.js.map +1 -0
  15. package/dist/{chunk-KDMV222Q.js → chunk-F6KHUW7T.js} +304 -373
  16. package/dist/chunk-F6KHUW7T.js.map +1 -0
  17. package/dist/chunk-FGT5OS2Y.js +918 -0
  18. package/dist/chunk-FGT5OS2Y.js.map +1 -0
  19. package/dist/chunk-FQLEAMAB.js +24 -0
  20. package/dist/chunk-FQLEAMAB.js.map +1 -0
  21. package/dist/chunk-HEXOGHQ4.js +3264 -0
  22. package/dist/chunk-HEXOGHQ4.js.map +1 -0
  23. package/dist/chunk-JCD6GLBX.js +412 -0
  24. package/dist/chunk-JCD6GLBX.js.map +1 -0
  25. package/dist/{chunk-QUOTJULD.js → chunk-MGLG2XLD.js} +20 -219
  26. package/dist/chunk-MGLG2XLD.js.map +1 -0
  27. package/dist/chunk-MTBEBSNO.js +1293 -0
  28. package/dist/chunk-MTBEBSNO.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-UZPYYI37.js} +524 -26
  32. package/dist/{chunk-RYPVOI6H.js.map → chunk-UZPYYI37.js.map} +1 -1
  33. package/dist/chunk-VG7BRFUD.js +152 -0
  34. package/dist/chunk-VG7BRFUD.js.map +1 -0
  35. package/dist/chunk-Y2DYZPP5.js +2329 -0
  36. package/dist/chunk-Y2DYZPP5.js.map +1 -0
  37. package/dist/chunk-ZEI7C32D.js +1566 -0
  38. package/dist/chunk-ZEI7C32D.js.map +1 -0
  39. package/dist/{domain-Dz3jP-UM.d.ts → domain-CfKPpXCP.d.ts} +51 -51
  40. package/dist/{effect-result-Bebwu9yT.d.ts → effect-result-DPERsn_v.d.ts} +641 -851
  41. package/dist/{effect-CiEVLsZz.d.ts → effect-wP-IdRt2.d.ts} +236 -443
  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-DomgmRBG.d.ts} +29 -729
  54. package/dist/index.d.ts +69 -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 +1205 -1215
  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/index.d.ts +24 -120
  74. package/dist/patterns/index.js +3 -3
  75. package/dist/patterns/patterns-registry.json +522 -24
  76. package/dist/patterns/registry.json +522 -24
  77. package/dist/trait-CzG9M89M.d.ts +3519 -0
  78. package/dist/types/index.d.ts +9 -10
  79. package/dist/types/index.js +11 -5
  80. package/dist/{types-DGwrltUF.d.ts → types-BHlTjwWd.d.ts} +3 -3
  81. package/fixtures/events-wire/client-effects-by-trait/response.json +0 -18
  82. package/fixtures/events-wire/client-effects-provenance/response.json +0 -18
  83. package/fixtures/events-wire/effect-results-every-kind/response.json +2 -27
  84. package/fixtures/events-wire/navigate-1/response.json +8 -5
  85. package/fixtures/events-wire/navigate-2/response.json +11 -8
  86. package/fixtures/events-wire/navigate-3/response.json +14 -11
  87. package/fixtures/events-wire/navigate-back/response.json +7 -4
  88. package/fixtures/events-wire/render-ui-3/response.json +12 -9
  89. package/fixtures/events-wire/render-ui-clear/response.json +0 -7
  90. package/fixtures/events-wire/sse-stream/response.json +0 -20
  91. package/fixtures/events-wire/sse-stream/stream.json +0 -20
  92. package/fixtures/events-wire/stateless-traits/response.json +14 -5
  93. package/fixtures/kernel-wire/golden/basic-entity.json +1687 -0
  94. package/fixtures/kernel-wire/golden/entity-rerender.json +743 -0
  95. package/fixtures/kernel-wire/golden/rollback.json +793 -0
  96. package/fixtures/kernel-wire/golden/tick-counter.json +1538 -0
  97. package/fixtures/kernel-wire/golden/two-orbital-chore.json +847 -0
  98. package/fixtures/kernel-wire/golden/two-orbital-task.json +457 -0
  99. package/fixtures/kernel-wire/played-step.json +136 -0
  100. package/fixtures/kernel-wire/scripts/basic-entity.json +28 -0
  101. package/fixtures/kernel-wire/scripts/entity-rerender.json +13 -0
  102. package/fixtures/kernel-wire/scripts/rollback.json +53 -0
  103. package/fixtures/kernel-wire/scripts/tick-counter.json +26 -0
  104. package/fixtures/kernel-wire/scripts/two-orbital-chore.json +9 -0
  105. package/fixtures/kernel-wire/scripts/two-orbital-task.json +9 -0
  106. package/package.json +28 -19
  107. package/dist/builders-DmZE5By0.d.ts +0 -2663
  108. package/dist/chunk-45I2O4SJ.js +0 -4646
  109. package/dist/chunk-45I2O4SJ.js.map +0 -1
  110. package/dist/chunk-6LR43Z5E.js +0 -3061
  111. package/dist/chunk-6LR43Z5E.js.map +0 -1
  112. package/dist/chunk-GIUA3NUJ.js +0 -809
  113. package/dist/chunk-GIUA3NUJ.js.map +0 -1
  114. package/dist/chunk-GTY53NS5.js +0 -1908
  115. package/dist/chunk-GTY53NS5.js.map +0 -1
  116. package/dist/chunk-JOHDVS6J.js +0 -1614
  117. package/dist/chunk-JOHDVS6J.js.map +0 -1
  118. package/dist/chunk-KDMV222Q.js.map +0 -1
  119. package/dist/chunk-QRHJUS3D.js +0 -23
  120. package/dist/chunk-QRHJUS3D.js.map +0 -1
  121. package/dist/chunk-QUOTJULD.js.map +0 -1
  122. package/dist/chunk-V5VNGRVU.js +0 -66
  123. package/dist/chunk-V5VNGRVU.js.map +0 -1
  124. package/dist/chunk-X4SC7FGF.js.map +0 -1
  125. package/dist/entityAccess-BPSz1i2n.d.ts +0 -80
  126. package/dist/mock/index.d.ts +0 -153
  127. package/dist/mock/index.js +0 -190
  128. package/dist/mock/index.js.map +0 -1
  129. package/dist/schema-T5RT5s6H.d.ts +0 -282
  130. package/dist/state-machine/index.d.ts +0 -359
  131. package/dist/state-machine/index.js +0 -3
  132. package/dist/state-machine/index.js.map +0 -1
@@ -0,0 +1,412 @@
1
+ import { mergeCallSiteConfigOverrides, parseOrbitalSchema, isOrbitalValue, OrbitalValueSchema, isInlineTrait, isEntityReference, parseEntityRef, isEntityCall } from './chunk-ZEI7C32D.js';
2
+
3
+ // src/builders/apply-config-overrides.ts
4
+ function overrideTrait(trait, values) {
5
+ if (isInlineTrait(trait)) {
6
+ const config = trait.config;
7
+ if (config === void 0) return trait;
8
+ const next = { ...config };
9
+ for (const [field, value] of Object.entries(values)) {
10
+ const decl = config[field];
11
+ if (decl !== void 0) {
12
+ next[field] = { ...decl, default: value };
13
+ }
14
+ }
15
+ return { ...trait, config: next };
16
+ }
17
+ return { ...trait, config: mergeCallSiteConfigOverrides(trait.config ?? {}, values) };
18
+ }
19
+ function traitIdentity(trait) {
20
+ if (trait.name !== void 0) return trait.name;
21
+ return "ref" in trait ? trait.ref : void 0;
22
+ }
23
+ function applyTraitConfigOverrides(schema, overrides) {
24
+ if (overrides === void 0 || Object.keys(overrides).length === 0) return schema;
25
+ return {
26
+ ...schema,
27
+ orbitals: schema.orbitals.map((orbital) => ({
28
+ ...orbital,
29
+ traits: orbital.traits.map((trait) => {
30
+ if (typeof trait === "string") return trait;
31
+ const id = traitIdentity(trait);
32
+ const values = id !== void 0 ? overrides[id] : void 0;
33
+ return values !== void 0 ? overrideTrait(trait, values) : trait;
34
+ })
35
+ }))
36
+ };
37
+ }
38
+
39
+ // src/builders/layout-trait.ts
40
+ function makeSlot(traitName) {
41
+ return `@trait.${traitName}`;
42
+ }
43
+ function makeRenderUI(slot, root) {
44
+ if (root === null) return ["render-ui", slot, null];
45
+ if (typeof root === "string") return ["render-ui", slot, root];
46
+ return ["render-ui", slot, root];
47
+ }
48
+ function makeLayoutTrait(opts) {
49
+ const slot = opts.slot ?? "main";
50
+ const effects = [];
51
+ const emits = [];
52
+ const eventDefs = [
53
+ { key: "INIT", name: "Initialize" }
54
+ ];
55
+ if (opts.fetchEntity) {
56
+ if (!opts.loadedEvent || !opts.loadFailedEvent) {
57
+ throw new Error(
58
+ `makeLayoutTrait: fetchEntity '${opts.fetchEntity}' set but loadedEvent / loadFailedEvent are required`
59
+ );
60
+ }
61
+ const payloadSchema = opts.loadedPayloadSchema ?? [{ name: "data", type: `[${opts.fetchEntity}]` }];
62
+ emits.push(
63
+ { event: opts.loadedEvent, scope: "internal", payloadSchema },
64
+ {
65
+ event: opts.loadFailedEvent,
66
+ scope: "internal",
67
+ payloadSchema: [
68
+ { name: "error", type: "string" },
69
+ { name: "code", type: "string" }
70
+ ]
71
+ }
72
+ );
73
+ eventDefs.push(
74
+ { key: opts.loadedEvent, name: `${opts.fetchEntity} loaded`, payloadSchema },
75
+ {
76
+ key: opts.loadFailedEvent,
77
+ name: `${opts.fetchEntity} load failed`,
78
+ payloadSchema: [
79
+ { name: "error", type: "string" },
80
+ { name: "code", type: "string" }
81
+ ]
82
+ }
83
+ );
84
+ const fetchFx = [
85
+ "fetch",
86
+ opts.fetchEntity,
87
+ { emit: { success: opts.loadedEvent, failure: opts.loadFailedEvent } }
88
+ ];
89
+ effects.push(fetchFx);
90
+ }
91
+ effects.push(makeRenderUI(slot, opts.renderUI));
92
+ if (opts.extraEffects && opts.extraEffects.length > 0) {
93
+ effects.push(...opts.extraEffects);
94
+ }
95
+ const trait = {
96
+ name: opts.name,
97
+ ...opts.description ? { description: opts.description } : {},
98
+ linkedEntity: opts.linkedEntity,
99
+ ...emits.length > 0 ? { emits } : {},
100
+ stateMachine: {
101
+ states: [{ name: "composing", isInitial: true }],
102
+ events: eventDefs,
103
+ transitions: [
104
+ {
105
+ from: "composing",
106
+ to: "composing",
107
+ event: "INIT",
108
+ effects
109
+ }
110
+ ]
111
+ }
112
+ };
113
+ return trait;
114
+ }
115
+
116
+ // src/builders.ts
117
+ function ensureIdField(fields) {
118
+ if (!fields || fields.length === 0) return [{ name: "id", type: "string", required: true }];
119
+ if (fields.some((f) => f.name === "id")) return fields;
120
+ return [{ name: "id", type: "string", required: true }, ...fields];
121
+ }
122
+ function plural(name) {
123
+ return name + "s";
124
+ }
125
+ function resolveEntityNameForBuilder(ref) {
126
+ if (isEntityReference(ref)) {
127
+ return parseEntityRef(ref)?.alias ?? ref;
128
+ }
129
+ if (isEntityCall(ref)) {
130
+ if (ref.name) return ref.name;
131
+ return parseEntityRef(ref.extends)?.alias ?? ref.extends;
132
+ }
133
+ return ref.name;
134
+ }
135
+ function makeEntity(opts) {
136
+ const fields = ensureIdField(opts.fields);
137
+ const persistence = opts.persistence ?? "runtime";
138
+ return {
139
+ name: opts.name,
140
+ persistence,
141
+ ...persistence === "persistent" ? { collection: opts.collection ?? plural(opts.name).toLowerCase() } : {},
142
+ fields,
143
+ ...opts.instances && opts.instances.length > 0 ? { instances: opts.instances } : {}
144
+ };
145
+ }
146
+ function makePage(opts) {
147
+ return {
148
+ name: opts.name,
149
+ path: opts.path,
150
+ ...opts.isInitial ? { isInitial: true } : {},
151
+ traits: [{ ref: opts.traitName }]
152
+ };
153
+ }
154
+ function makeOrbital(name, entity, traits, pages) {
155
+ return { name, entity, traits, pages };
156
+ }
157
+ function makeTraitRef(opts) {
158
+ const ref = { ref: opts.ref };
159
+ if (opts.from !== void 0) ref.from = opts.from;
160
+ if (opts.name !== void 0) ref.name = opts.name;
161
+ if (opts.linkedEntity !== void 0) ref.linkedEntity = opts.linkedEntity;
162
+ if (opts.linkedEntityId !== void 0) ref.linkedEntityId = opts.linkedEntityId;
163
+ if (opts.events !== void 0) ref.events = opts.events;
164
+ if (opts.typeArgs !== void 0) ref.typeArgs = opts.typeArgs;
165
+ if (opts.fields !== void 0) ref.fields = opts.fields;
166
+ if (opts.effects !== void 0) ref.effects = opts.effects;
167
+ if (opts.listens !== void 0) ref.listens = opts.listens;
168
+ if (opts.emitsScope !== void 0) ref.emitsScope = opts.emitsScope;
169
+ if (opts.config !== void 0) ref.config = opts.config;
170
+ return ref;
171
+ }
172
+ function makePageRef(opts) {
173
+ const ref = { ref: opts.ref };
174
+ if (opts.from !== void 0) ref.from = opts.from;
175
+ if (opts.path !== void 0) ref.path = opts.path;
176
+ if (opts.linkedEntity !== void 0) ref.linkedEntity = opts.linkedEntity;
177
+ if (opts.traits !== void 0) ref.traits = opts.traits;
178
+ return ref;
179
+ }
180
+ function makeOrbitalWithUses(opts) {
181
+ const orbital = {
182
+ name: opts.name,
183
+ uses: opts.uses,
184
+ ...opts.expects !== void 0 ? { expects: opts.expects } : {},
185
+ entity: opts.entity,
186
+ ...opts.auxiliaryEntities !== void 0 ? { auxiliaryEntities: opts.auxiliaryEntities } : {},
187
+ traits: opts.traits,
188
+ pages: opts.pages ?? [],
189
+ ...opts.config !== void 0 ? { config: opts.config } : {}
190
+ };
191
+ return orbital;
192
+ }
193
+ var ORBITAL_VALUE_IMPORT_ALIAS = "Source";
194
+ function orbitalImportFromValue(value) {
195
+ const { behavior, orbital, name, app, config, traits, uses, siblings, ...body } = value;
196
+ const ref = `${ORBITAL_VALUE_IMPORT_ALIAS}.orbitals.${orbital}`;
197
+ const clash = (uses ?? []).find((u) => u.as === ORBITAL_VALUE_IMPORT_ALIAS);
198
+ if (clash !== void 0) {
199
+ throw new Error(`orbital value ${orbital}: an import aliased '${ORBITAL_VALUE_IMPORT_ALIAS}' (from ${clash.from}) collides with the value's own source alias`);
200
+ }
201
+ const traitOverrides = traits === void 0 ? void 0 : Object.fromEntries(
202
+ Object.entries(traits).map(([trait, overrides]) => {
203
+ const { config: traitConfig, ...rest } = overrides;
204
+ return [trait, { ...rest, ...traitConfig !== void 0 ? { config: mergeCallSiteConfigOverrides({}, traitConfig) } : {} }];
205
+ })
206
+ );
207
+ return {
208
+ name: name ?? orbital,
209
+ uses: [{ from: behavior, as: ORBITAL_VALUE_IMPORT_ALIAS, ...app !== void 0 ? { config: mergeCallSiteConfigOverrides({}, app) } : {} }, ...uses ?? []],
210
+ entity: `${ref}.entity`,
211
+ traits: (siblings ?? []).map((sibling) => ({
212
+ name: sibling.name,
213
+ ref: sibling.ref,
214
+ ...sibling.linkedEntity !== void 0 ? { linkedEntity: sibling.linkedEntity } : {},
215
+ ...sibling.config !== void 0 ? { config: mergeCallSiteConfigOverrides({}, sibling.config) } : {}
216
+ })),
217
+ pages: [],
218
+ reference: {
219
+ ref,
220
+ ...body,
221
+ ...config !== void 0 ? { config: mergeCallSiteConfigOverrides({}, config) } : {},
222
+ ...traitOverrides !== void 0 ? { traits: traitOverrides } : {}
223
+ }
224
+ };
225
+ }
226
+ function parseProgram(data) {
227
+ if (data === null || typeof data !== "object" || Array.isArray(data) || !("orbitals" in data) || !Array.isArray(data.orbitals)) {
228
+ return parseOrbitalSchema(data);
229
+ }
230
+ return parseOrbitalSchema({
231
+ ...data,
232
+ orbitals: data.orbitals.map((entry) => isOrbitalValue(entry) ? orbitalImportFromValue(OrbitalValueSchema.parse(entry)) : entry)
233
+ });
234
+ }
235
+ function makeAtomOrbital(opts) {
236
+ const traitRef = makeTraitRef({
237
+ from: opts.atomPath,
238
+ ref: opts.traitRef,
239
+ linkedEntity: opts.entity.name,
240
+ ...opts.traitOverrides?.name !== void 0 ? { name: opts.traitOverrides.name } : {},
241
+ ...opts.traitOverrides?.events !== void 0 ? { events: opts.traitOverrides.events } : {},
242
+ ...opts.traitOverrides?.effects !== void 0 ? { effects: opts.traitOverrides.effects } : {},
243
+ ...opts.traitOverrides?.listens !== void 0 ? { listens: opts.traitOverrides.listens } : {},
244
+ ...opts.traitOverrides?.emitsScope !== void 0 ? { emitsScope: opts.traitOverrides.emitsScope } : {},
245
+ ...opts.traitOverrides?.config !== void 0 ? { config: opts.traitOverrides.config } : {}
246
+ });
247
+ const pages = opts.pageRef ? [
248
+ makePageRef({
249
+ from: opts.atomPath,
250
+ ref: opts.pageRef,
251
+ linkedEntity: opts.entity.name,
252
+ ...opts.pageOverrides?.path !== void 0 ? { path: opts.pageOverrides.path } : {}
253
+ })
254
+ ] : void 0;
255
+ return makeOrbitalWithUses({
256
+ name: opts.name,
257
+ uses: [{ from: opts.atomPath, as: opts.alias }],
258
+ entity: opts.entity,
259
+ traits: [traitRef],
260
+ ...pages !== void 0 ? { pages } : {}
261
+ });
262
+ }
263
+ function makeSchema(name, ...definitions) {
264
+ return { name, version: "1.0.0", orbitals: definitions };
265
+ }
266
+ function asDefinitions(inputs) {
267
+ return inputs.flatMap((input) => {
268
+ if ("orbitals" in input && Array.isArray(input.orbitals)) {
269
+ return input.orbitals;
270
+ }
271
+ return [input];
272
+ });
273
+ }
274
+ function asDefinition(input) {
275
+ if ("orbitals" in input && Array.isArray(input.orbitals)) {
276
+ return input.orbitals[0];
277
+ }
278
+ return input;
279
+ }
280
+ function mergeOrbitals(name, entity, sources, pages) {
281
+ const allTraits = sources.flatMap(
282
+ (s) => s.traits.map((t) => structuredClone(t))
283
+ );
284
+ return { name, entity, traits: allTraits, pages };
285
+ }
286
+ function wire(source, target, event, triggers) {
287
+ const s = structuredClone(source);
288
+ const t = structuredClone(target);
289
+ s.emits = [...s.emits ?? [], { ...event, scope: event.scope ?? "internal" }];
290
+ t.listens = [...t.listens ?? [], {
291
+ event: event.event,
292
+ triggers,
293
+ scope: "internal"
294
+ }];
295
+ return [s, t];
296
+ }
297
+ function extractTrait(input) {
298
+ const orbital = asDefinition(input);
299
+ return structuredClone(orbital.traits[0]);
300
+ }
301
+ function connect(a, b, event, triggers) {
302
+ const aClone = structuredClone(asDefinition(a));
303
+ const bClone = structuredClone(asDefinition(b));
304
+ const aTrait = aClone.traits[0];
305
+ if (aTrait) {
306
+ const emitContract = {
307
+ ...event,
308
+ scope: event.scope ?? "external"
309
+ };
310
+ aTrait.emits = [...aTrait.emits ?? [], emitContract];
311
+ }
312
+ const bTrait = bClone.traits[0];
313
+ if (bTrait) {
314
+ const listener = {
315
+ event: event.event,
316
+ triggers: triggers ?? "INIT",
317
+ scope: "external"
318
+ };
319
+ bTrait.listens = [...bTrait.listens ?? [], listener];
320
+ }
321
+ return [aClone, bClone];
322
+ }
323
+ function compose(orbitals, pages, connections, appName) {
324
+ const cloned = structuredClone(asDefinitions(orbitals));
325
+ for (const conn of connections) {
326
+ const emitter = cloned.find((o) => {
327
+ const traits = o.traits;
328
+ return traits.some((t) => t.name === conn.from);
329
+ });
330
+ const listener = cloned.find((o) => {
331
+ const traits = o.traits;
332
+ return traits.some((t) => t.name === conn.to);
333
+ });
334
+ if (emitter && listener) {
335
+ const eTrait = emitter.traits.find((t) => t.name === conn.from);
336
+ const lTrait = listener.traits.find((t) => t.name === conn.to);
337
+ if (eTrait) {
338
+ const emitContract = { ...conn.event, scope: conn.event.scope ?? "external" };
339
+ eTrait.emits = [...eTrait.emits ?? [], emitContract];
340
+ }
341
+ if (lTrait) {
342
+ const listenContract = {
343
+ event: conn.event.event,
344
+ triggers: conn.triggers ?? "INIT",
345
+ scope: "external"
346
+ };
347
+ lTrait.listens = [...lTrait.listens ?? [], listenContract];
348
+ }
349
+ }
350
+ }
351
+ for (const orbital of cloned) {
352
+ const traitNames = orbital.traits.map((t) => t.name);
353
+ const matchingPages = pages.filter(
354
+ (p) => p.traits.some((t) => traitNames.includes(t))
355
+ );
356
+ orbital.pages = matchingPages.map((p) => ({
357
+ name: p.name,
358
+ path: p.path,
359
+ ...p.isInitial ? { isInitial: true } : {},
360
+ traits: p.traits.filter((t) => traitNames.includes(t)).map((ref) => ({ ref }))
361
+ }));
362
+ }
363
+ return {
364
+ name: appName ?? "Application",
365
+ version: "1.0.0",
366
+ orbitals: cloned
367
+ };
368
+ }
369
+ function pipe(orbitals, events, appName) {
370
+ if (events.length !== orbitals.length - 1) {
371
+ throw new Error(`pipe requires exactly ${orbitals.length - 1} events for ${orbitals.length} orbitals`);
372
+ }
373
+ const cloned = structuredClone(asDefinitions(orbitals));
374
+ for (let i = 0; i < events.length; i++) {
375
+ const aTrait = cloned[i].traits[0];
376
+ const bTrait = cloned[i + 1].traits[0];
377
+ if (aTrait) {
378
+ const emitContract = { ...events[i], scope: events[i].scope ?? "external" };
379
+ aTrait.emits = [...aTrait.emits ?? [], emitContract];
380
+ }
381
+ if (bTrait) {
382
+ const listener = {
383
+ event: events[i].event,
384
+ triggers: "INIT",
385
+ scope: "external"
386
+ };
387
+ bTrait.listens = [...bTrait.listens ?? [], listener];
388
+ }
389
+ }
390
+ const pages = cloned.map((o, i) => {
391
+ const entityName = resolveEntityNameForBuilder(o.entity);
392
+ const traitNames = o.traits.map((t) => t.name);
393
+ return {
394
+ name: `${entityName}Page`,
395
+ path: `/${plural(entityName).toLowerCase()}`,
396
+ ...i === 0 ? { isInitial: true } : {},
397
+ traits: traitNames.map((ref) => ({ ref }))
398
+ };
399
+ });
400
+ for (let i = 0; i < cloned.length; i++) {
401
+ cloned[i].pages = [pages[i]];
402
+ }
403
+ return {
404
+ name: appName ?? "Application",
405
+ version: "1.0.0",
406
+ orbitals: cloned
407
+ };
408
+ }
409
+
410
+ export { ORBITAL_VALUE_IMPORT_ALIAS, applyTraitConfigOverrides, compose, connect, ensureIdField, extractTrait, makeAtomOrbital, makeEntity, makeLayoutTrait, makeOrbital, makeOrbitalWithUses, makePage, makePageRef, makeRenderUI, makeSchema, makeSlot, makeTraitRef, mergeOrbitals, orbitalImportFromValue, parseProgram, pipe, plural, wire };
411
+ //# sourceMappingURL=chunk-JCD6GLBX.js.map
412
+ //# sourceMappingURL=chunk-JCD6GLBX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builders/apply-config-overrides.ts","../src/builders/layout-trait.ts","../src/builders.ts"],"names":[],"mappings":"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","file":"chunk-JCD6GLBX.js","sourcesContent":["/**\n * Apply trait config overrides to a schema — pure, returns a new schema.\n *\n * Used by config-driven preview surfaces (the playground property inspector and\n * the verify config-sweep) to render a behavior with different `config` values\n * WITHOUT recompiling: the override is written onto the matching trait, then the\n * schema is re-registered and re-rendered.\n *\n * The resolved schema's traits are inlined `Trait`s whose `config` is the\n * DECLARED schema (`{ field: { type, default, ... } }`), so an override patches\n * each field's `default`. A trait that instead carries call-site value config\n * (a `{ ref, config }` reference) gets the values merged directly.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalSchema } from '../types/schema.js';\nimport type { TraitRef, TraitConfig, ConfigFieldDeclaration } from '../types/trait.js';\nimport { isInlineTrait, mergeCallSiteConfigOverrides } from '../types/trait.js';\n\nfunction overrideTrait(trait: Exclude<TraitRef, string>, values: TraitConfig): Exclude<TraitRef, string> {\n if (isInlineTrait(trait)) {\n // Inlined Trait: `config` is the DECLARED schema → patch each field's `default`.\n const config = trait.config;\n if (config === undefined) return trait;\n const next: Record<string, ConfigFieldDeclaration> = { ...config };\n for (const [field, value] of Object.entries(values)) {\n const decl = config[field];\n if (decl !== undefined) {\n next[field] = { ...decl, default: value };\n }\n }\n return { ...trait, config: next };\n }\n\n return { ...trait, config: mergeCallSiteConfigOverrides(trait.config ?? {}, values) };\n}\n\nfunction traitIdentity(trait: Exclude<TraitRef, string>): string | undefined {\n if (trait.name !== undefined) return trait.name;\n return 'ref' in trait ? trait.ref : undefined;\n}\n\n/**\n * Return a new schema with `config` overrides applied to traits whose identity\n * (`name`, falling back to `ref`) matches a key in `overrides`. Fields not\n * declared on the trait are ignored — overrides never invent config.\n */\nexport function applyTraitConfigOverrides(\n schema: OrbitalSchema,\n overrides: Readonly<Record<string, TraitConfig>>,\n): OrbitalSchema {\n if (overrides === undefined || Object.keys(overrides).length === 0) return schema;\n return {\n ...schema,\n orbitals: schema.orbitals.map((orbital) => ({\n ...orbital,\n traits: orbital.traits.map((trait) => {\n if (typeof trait === 'string') return trait;\n const id = traitIdentity(trait);\n const values = id !== undefined ? overrides[id] : undefined;\n return values !== undefined ? overrideTrait(trait, values) : trait;\n }),\n })),\n };\n}\n","/**\n * Layout-Trait Builders\n *\n * Helpers for constructing the canonical inline LayoutTrait pattern that\n * std layout-shell molecules (`std-filtered-list`, `std-master-detail-layout`,\n * etc.) use to wrap a set of atom trait references in a `(render-ui main)`\n * effect with `@trait.X` slot embeds.\n *\n * The canonical LayoutTrait is stateless: ONE state (`composing`, initial),\n * ONE transition (`INIT` self-loop) carrying two effects — `(fetch Entity\n * {emit: {success, failure}})` and `(render-ui \"main\" <pattern-tree>)`. Atoms\n * embedded via `@trait.X` slot references react to the bus events the fetch\n * emits; the LayoutTrait owns no further state.\n *\n * Usage from a std layout-shell molecule:\n *\n * ```ts\n * import { makeSlot, makeLayoutTrait } from '@almadar/core/builders';\n *\n * const layout = makeLayoutTrait({\n * name: 'DashboardLayout',\n * linkedEntity: 'Metric',\n * fetchEntity: 'Metric',\n * loadedEvent: 'MetricLoaded',\n * loadFailedEvent: 'MetricLoadFailed',\n * renderUI: {\n * type: 'stack',\n * direction: 'vertical',\n * children: [\n * makeSlot('StatsRow'),\n * makeSlot('ChartsRow'),\n * makeSlot('FeedRow'),\n * ],\n * },\n * });\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { AnyPatternConfig } from '../patterns/index.js';\nimport type { Trait } from '../types/trait.js';\nimport type { Effect, FetchEffect, RenderBinding, RenderUIEffect, UISlot } from '../types/effect.js';\n\n/**\n * Build a `@trait.<name>` slot reference string. Used as a child entry in a\n * pattern tree to embed another trait's render-ui at that position. The\n * runtime resolves `@trait.X` to the matching trait's render-ui inline.\n *\n * @example makeSlot('FilteredItemSearch') // \"@trait.FilteredItemSearch\"\n */\nexport function makeSlot(traitName: string): string {\n return `@trait.${traitName}`;\n}\n\n/**\n * Build a `(render-ui <slot> <root>)` effect tuple. Pattern-typed sugar over\n * the raw `RenderUIEffect` literal so callers don't have to spell out the\n * three-element tuple form.\n *\n * @param slot - Canonical UI slot name (`'main'`, `'header'`, etc. — see UI_SLOTS).\n * @param root - The pattern config for this slot's content, OR a `@`-binding\n * string ({@link RenderBinding}) pointing at a render tree in `config` /\n * `payload` (e.g. `'@config.bodyContent'`). Pass `null` to clear.\n */\nexport function makeRenderUI(\n slot: UISlot,\n root: AnyPatternConfig | RenderBinding | null,\n): RenderUIEffect {\n // Branch the return so TS narrows into the correct tuple variant of the\n // RenderUIEffect union (each arm is a distinct tuple shape).\n if (root === null) return ['render-ui', slot, null];\n if (typeof root === 'string') return ['render-ui', slot, root];\n return ['render-ui', slot, root];\n}\n\n/**\n * Options for {@link makeLayoutTrait}.\n */\nexport interface MakeLayoutTraitOpts {\n /** Trait name, e.g. `\"DashboardGridLayout\"`. */\n name: string;\n /** Entity this layout's emits/listens bind to. */\n linkedEntity: string;\n /** Optional human-readable description (carried through to `Trait.description`). */\n description?: string;\n /**\n * Entity name to fetch on INIT. When set, a `(fetch <Entity> {emit:\n * {success, failure}})` effect is prepended to the INIT transition. Omit\n * for purely-presentational layouts that don't load data themselves.\n */\n fetchEntity?: string;\n /**\n * Event name emitted on successful fetch. Required when `fetchEntity` is\n * set; the LayoutTrait declares this event in its `emits` and uses it as\n * the `success` emit-name in the fetch effect.\n * Convention: `\"<Entity>Loaded\"`.\n */\n loadedEvent?: string;\n /**\n * Event name emitted on fetch failure. Required when `fetchEntity` is\n * set. Convention: `\"<Entity>LoadFailed\"`.\n */\n loadFailedEvent?: string;\n /**\n * Payload schema for the loaded event. Defaults to `[{ name: \"data\", type:\n * \"[<Entity>]\" }]` when `fetchEntity` is set. Provide explicitly when the\n * payload should carry additional fields.\n */\n loadedPayloadSchema?: Array<{ name: string; type: string; required?: boolean }>;\n /**\n * The pattern tree for the layout's main slot. Children may include\n * `@trait.X` slot strings (built via {@link makeSlot}) interleaved with\n * inline pattern configs (`{ type: 'stack', ... }`). The shape conforms to\n * `AnyPatternConfig` from `@almadar/patterns`.\n */\n renderUI: AnyPatternConfig;\n /**\n * Override the slot the render-ui effect targets. Defaults to `'main'`.\n * Specify when the layout shell should render into a sub-slot (rare).\n */\n slot?: UISlot;\n /**\n * Additional effects appended to the INIT transition AFTER the fetch +\n * render-ui pair. Most layouts don't need this; provided for advanced\n * cases (analytics emit, persistence seed, etc.).\n */\n extraEffects?: Effect[];\n}\n\n/**\n * Build the canonical stateless LayoutTrait used by std layout-shell molecules.\n *\n * Result shape:\n * - `linkedEntity` set per the option\n * - `emits` declares the loaded + loadFailed events when `fetchEntity` is set\n * - One state: `'composing'` (`isInitial: true`)\n * - One transition: `composing → composing` on `INIT`, with effects:\n * - (when `fetchEntity` set) `['fetch', '<Entity>', { emit: { success, failure } }]`\n * - `['render-ui', slot, renderUI]`\n * - …`extraEffects` if provided\n *\n * Atoms whose trait names appear as `@trait.<name>` strings inside `renderUI`\n * get embedded by the runtime when the orbital instantiates. The LayoutTrait\n * itself stays stateless — all reactive behaviour lives in the embedded atoms.\n */\nexport function makeLayoutTrait(opts: MakeLayoutTraitOpts): Trait {\n const slot: UISlot = opts.slot ?? 'main';\n const effects: Effect[] = [];\n\n // Build emits list based on fetch configuration.\n const emits: Trait['emits'] = [];\n const eventDefs: NonNullable<Trait['stateMachine']>['events'] = [\n { key: 'INIT', name: 'Initialize' },\n ];\n\n if (opts.fetchEntity) {\n if (!opts.loadedEvent || !opts.loadFailedEvent) {\n throw new Error(\n `makeLayoutTrait: fetchEntity '${opts.fetchEntity}' set but loadedEvent / loadFailedEvent are required`,\n );\n }\n const payloadSchema =\n opts.loadedPayloadSchema ?? [{ name: 'data', type: `[${opts.fetchEntity}]` }];\n emits.push(\n { event: opts.loadedEvent, scope: 'internal', payloadSchema },\n {\n event: opts.loadFailedEvent,\n scope: 'internal',\n payloadSchema: [\n { name: 'error', type: 'string' },\n { name: 'code', type: 'string' },\n ],\n },\n );\n eventDefs.push(\n { key: opts.loadedEvent, name: `${opts.fetchEntity} loaded`, payloadSchema },\n {\n key: opts.loadFailedEvent,\n name: `${opts.fetchEntity} load failed`,\n payloadSchema: [\n { name: 'error', type: 'string' },\n { name: 'code', type: 'string' },\n ],\n },\n );\n // (fetch <Entity> { emit: { success, failure } })\n const fetchFx: FetchEffect = [\n 'fetch',\n opts.fetchEntity,\n { emit: { success: opts.loadedEvent, failure: opts.loadFailedEvent } },\n ];\n effects.push(fetchFx);\n }\n\n effects.push(makeRenderUI(slot, opts.renderUI));\n if (opts.extraEffects && opts.extraEffects.length > 0) {\n effects.push(...opts.extraEffects);\n }\n\n const trait: Trait = {\n name: opts.name,\n ...(opts.description ? { description: opts.description } : {}),\n linkedEntity: opts.linkedEntity,\n ...(emits.length > 0 ? { emits } : {}),\n stateMachine: {\n states: [{ name: 'composing', isInitial: true }],\n events: eventDefs,\n transitions: [\n {\n from: 'composing',\n to: 'composing',\n event: 'INIT',\n effects,\n },\n ],\n },\n };\n\n return trait;\n}\n","/**\n * Orbital Builders\n *\n * Pure functions for constructing and composing Orbitals.\n * No new types. Everything uses existing core types:\n * Entity, Trait, Page, OrbitalDefinition, OrbitalSchema.\n *\n * Three categories:\n * 1. Builders: construct Entity, Page from common params\n * 2. Utilities: ensureIdField, resolveDefaults\n * 3. Composition: connect, compose, pipe\n *\n * @packageDocumentation\n */\n\nimport type { Entity, EntityPersistence, EntityRow } from './types/entity.js';\nimport type { EntityField } from './types/field.js';\nimport type { Page } from './types/page.js';\nimport type { EntityRef, ExpectDeclaration, OrbitalDefinition, OrbitalRefTraitOverride, PageRef, PageRefObject, UseDeclaration } from './types/orbital.js';\nimport { isEntityCall, isEntityReference, parseEntityRef } from './types/orbital.js';\nimport type { OrbitalSchema } from './types/schema.js';\nimport type { TraitEventContract, TraitEventListener, Trait, TraitRef, TraitReference, TraitConfig, CallSiteConfig, DeclaredTraitConfig } from './types/trait.js';\nimport type { SExpr } from './types/expression.js';\nimport type { RuntimeValue } from './types/json.js';\nimport { isOrbitalValue, OrbitalValueSchema, type OrbitalValue } from './types/behavior-value.js';\nimport { mergeCallSiteConfigOverrides } from './types/trait.js';\nimport { parseOrbitalSchema } from './types/schema.js';\nimport type { EntityId } from './types/identity.js';\n\nexport { applyTraitConfigOverrides } from './builders/apply-config-overrides.js';\nexport type { LayoutStrategy } from './builders/layout-strategy.js';\nexport type { EventWiringEntry } from './builders/event-wiring.js';\n// LayoutTrait + slot-embedding helpers (Phase 7.6 — atom-composition recipe path).\nexport {\n type MakeLayoutTraitOpts,\n makeSlot,\n makeRenderUI,\n makeLayoutTrait,\n} from './builders/layout-trait.js';\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Ensure the fields array has an `id` field. Prepends one if missing.\n */\nexport function ensureIdField(fields?: EntityField[]): EntityField[] {\n if (!fields || fields.length === 0) return [{ name: 'id', type: 'string', required: true }];\n if (fields.some(f => f.name === 'id')) return fields;\n return [{ name: 'id', type: 'string', required: true }, ...fields];\n}\n\n/**\n * Simple pluralization: append 's'.\n */\nexport function plural(name: string): string {\n return name + 's';\n}\n\n/**\n * Resolve a printable entity name from any EntityRef shape.\n *\n * Handles:\n * - inline Entity object (uses `name`)\n * - bare string reference like \"Modal.entity\" (uses the alias)\n * - EntityCall { extends: \"Modal.entity\", name? } (uses `name` if set, else the alias)\n */\nfunction resolveEntityNameForBuilder(ref: EntityRef): string {\n if (isEntityReference(ref)) {\n return parseEntityRef(ref)?.alias ?? ref;\n }\n if (isEntityCall(ref)) {\n if (ref.name) return ref.name;\n return parseEntityRef(ref.extends)?.alias ?? ref.extends;\n }\n return ref.name;\n}\n\n// ============================================================================\n// Entity Builder\n// ============================================================================\n\nexport interface MakeEntityOpts {\n name: string;\n fields: EntityField[];\n persistence?: EntityPersistence;\n collection?: string;\n /** Pre-authored seed data instances */\n instances?: EntityRow[];\n}\n\n/**\n * Build an Entity from options. Auto-adds id field, auto-derives collection.\n */\nexport function makeEntity(opts: MakeEntityOpts): Entity {\n const fields = ensureIdField(opts.fields);\n const persistence = opts.persistence ?? 'runtime';\n return {\n name: opts.name,\n persistence,\n ...(persistence === 'persistent'\n ? { collection: opts.collection ?? plural(opts.name).toLowerCase() }\n : {}),\n fields,\n ...(opts.instances && opts.instances.length > 0 ? { instances: opts.instances } : {}),\n };\n}\n\n// ============================================================================\n// Page Builder\n// ============================================================================\n\nexport interface MakePageOpts {\n name: string;\n path: string;\n traitName: string;\n isInitial?: boolean;\n}\n\n/**\n * Build a Page that binds to a single trait.\n */\nexport function makePage(opts: MakePageOpts): Page {\n return {\n name: opts.name,\n path: opts.path,\n ...(opts.isInitial ? { isInitial: true } : {}),\n traits: [{ ref: opts.traitName }],\n };\n}\n\n// ============================================================================\n// Orbital Builder\n// ============================================================================\n\n/**\n * Build an OrbitalDefinition from its three components.\n */\nexport function makeOrbital(\n name: string,\n entity: Entity,\n traits: Trait[],\n pages: Page[],\n): OrbitalDefinition {\n return { name, entity, traits, pages } as OrbitalDefinition;\n}\n\n// ============================================================================\n// Reference-form Builders (Phase 4.2)\n// ============================================================================\n//\n// The atom/molecule/organism composition model (see CLAUDE.md \"Std Behaviors\")\n// treats every imported orbital as a callable unit: a reference site is a call\n// site whose sibling fields are call arguments. The compiler's inline pass\n// applies overrides from the reference to a cloned copy of the imported unit.\n//\n// These four helpers are convenience factories for constructing the reference\n// payloads (TraitReference, PageRefObject) and the orbital skeleton that\n// holds them. They exist to compress the otherwise ~200-line-per-behavior TS\n// rewrite down to ~30 lines. They purely pass-through fields: undefined\n// optionals are omitted (the emitted object never contains `key: undefined`),\n// so the result stays compatible with the inliner's \"present-means-override\"\n// semantics.\n\n/**\n * Options for {@link makeTraitRef}.\n */\nexport interface MakeTraitRefOpts {\n /**\n * Optional registry path disambiguator that pairs with {@link ref}\n * (see {@link TraitReference.from}).\n */\n from?: string;\n /** Trait reference string, e.g. \"Browse.traits.BrowseItemBrowse\". */\n ref: string;\n /** Rename the inlined trait at the call site. */\n name?: string;\n /** Rebind the trait to a different linkedEntity. */\n linkedEntity?: string;\n /** Dual-carry id sibling of {@link linkedEntity} (V4 identity graph). */\n linkedEntityId?: EntityId;\n /** Per-key rename map, e.g. `{ OPEN: \"ADD_ITEM\" }`. */\n events?: Record<string, string>;\n /**\n * 3-II trait type-parameter arguments (`:: p SomeType`): declared-param\n * name → type-vocabulary name. Mirrors {@link TraitReference.typeArgs}.\n */\n typeArgs?: Record<string, string>;\n /**\n * Entity-field remap, e.g. `{ name: \"title\", folder: \"parentId\" }`. Rewrites\n * the inlined trait's canonical `@entity.X` / `@payload.row.X` references to\n * the consumer entity's field names. Mirrors {@link TraitReference.fields}.\n */\n fields?: Record<string, string>;\n /**\n * Per-event SExpression effect replacement. Keys are POST-rename event\n * names. See {@link TraitReference.effects} for the full contract.\n */\n effects?: Record<string, SExpr[]>;\n /** Replace the imported trait's `listens` array entirely. */\n listens?: TraitEventListener[];\n /** Set every emit's scope. */\n emitsScope?: 'internal' | 'external';\n /**\n * Call-site config overrides. Each entry is either a plain wiring value\n * (`TraitConfigValue`) or a fully-annotated re-declaration\n * (`ConfigFieldDeclaration`). Matches {@link TraitReference.config}.\n */\n config?: CallSiteConfig;\n}\n\n/**\n * Typed-narrowing variant of {@link MakeTraitRefOpts} for callers that know\n * the imported atom's overridable surfaces — its event-key set, listen-key\n * set, and config shape. Generated std factories use this variant so an LLM\n * tool consumer (orbital-agent) sees the closed event-name set and the\n * config field schema instead of the un-narrowed `Record<string, string>` /\n * `TraitConfig` defaults.\n *\n * Type parameters:\n * - `EventKey` — string union of the atom's emit event names. Narrows the\n * `events` rename map's keys to legal originals only.\n * - `ConfigShape` — typed shape of the trait's `config { ... }` block (literal\n * unions intact). Narrows the `config` override to the atom's actual fields.\n * Extends `CallSiteConfig` to allow both plain wiring values and annotated\n * declarations. Existing callers using plain `TraitConfig` shapes are\n * unaffected (TraitConfig ⊆ CallSiteConfig).\n * - `ListenKey` — string union of the atom's listen-key contract. Narrows\n * each listens entry's `event` against the atom's real subscription set.\n *\n * Runtime behavior is unchanged — {@link makeTraitRef} accepts both the\n * narrow and wide forms via the standard structural-typing rules. This is\n * a type-level narrowing only; widening at the call boundary is intentional.\n */\nexport interface MakeTraitRefOptsTyped<\n EventKey extends string = string,\n ConfigShape extends CallSiteConfig = Record<string, never>,\n ListenKey extends string = string,\n> extends Omit<\n MakeTraitRefOpts,\n 'events' | 'effects' | 'listens' | 'config'\n > {\n /** Per-key rename map, narrowed to the atom's actual event keys. */\n events?: Partial<Record<EventKey, string>>;\n /**\n * Per-event SExpression effect replacement. Keys are POST-rename event\n * names so they're caller-defined (no narrowing here); values stay typed\n * as `SExpr[]`.\n */\n effects?: Partial<Record<string, SExpr[]>>;\n /**\n * Replace the imported trait's `listens` array entirely. Each entry's\n * `event` field is narrowed to {@link ListenKey} where the atom's\n * subscription set is fixed; otherwise this widens to plain string.\n */\n listens?: Array<TraitEventListener & { event?: ListenKey }>;\n /** Typed call-site config overrides — narrowed to {@link ConfigShape}. */\n config?: ConfigShape;\n}\n\n/**\n * Build a {@link TraitReference} from options.\n *\n * Pass-through factory: copies only the fields that are actually provided,\n * so optionals stay absent (no `key: undefined` slots) and the emitted\n * object matches the inliner's expectation that \"present = override\".\n */\nexport function makeTraitRef(opts: MakeTraitRefOpts): TraitReference {\n const ref: TraitReference = { ref: opts.ref };\n if (opts.from !== undefined) ref.from = opts.from;\n if (opts.name !== undefined) ref.name = opts.name;\n if (opts.linkedEntity !== undefined) ref.linkedEntity = opts.linkedEntity;\n if (opts.linkedEntityId !== undefined) ref.linkedEntityId = opts.linkedEntityId;\n if (opts.events !== undefined) ref.events = opts.events;\n if (opts.typeArgs !== undefined) ref.typeArgs = opts.typeArgs;\n if (opts.fields !== undefined) ref.fields = opts.fields;\n if (opts.effects !== undefined) ref.effects = opts.effects;\n if (opts.listens !== undefined) ref.listens = opts.listens;\n if (opts.emitsScope !== undefined) ref.emitsScope = opts.emitsScope;\n if (opts.config !== undefined) ref.config = opts.config;\n return ref;\n}\n\n/**\n * Options for {@link makePageRef}.\n */\nexport interface MakePageRefOpts {\n /**\n * Optional registry path disambiguator that pairs with {@link ref}\n * (see {@link PageRefObject.from}).\n */\n from?: string;\n /** Page reference string, e.g. \"Browse.pages.BrowseItemPage\". */\n ref: string;\n /** URL path override. */\n path?: string;\n /** Rebind the page's primary entity. */\n linkedEntity?: string;\n /** Replace the page's trait list. */\n traits?: TraitRef[];\n}\n\n/**\n * Typed-narrowing variant of {@link MakePageRefOpts}. Narrows the `traits`\n * override array's entries to the orbital's known trait-name union — so the\n * agent can't pass a trait name that doesn't exist on the page's owning\n * orbital. Generated std page-helpers use this variant to surface the\n * trait set in the tool schema; un-narrowed call sites stay compatible.\n *\n * Type parameter:\n * - `TraitName` — string union of trait names the page may reference.\n */\nexport interface MakePageRefOptsTyped<TraitName extends string = string>\n extends Omit<MakePageRefOpts, 'traits'> {\n traits?: Array<{ ref: TraitName } | TraitRef>;\n}\n\n/**\n * Build a {@link PageRefObject} from options. Pass-through factory — omits\n * optional keys that are `undefined`.\n */\nexport function makePageRef(opts: MakePageRefOpts): PageRefObject {\n const ref: PageRefObject = { ref: opts.ref };\n if (opts.from !== undefined) ref.from = opts.from;\n if (opts.path !== undefined) ref.path = opts.path;\n if (opts.linkedEntity !== undefined) ref.linkedEntity = opts.linkedEntity;\n if (opts.traits !== undefined) ref.traits = opts.traits;\n return ref;\n}\n\n/**\n * Options for {@link makeOrbitalWithUses}.\n */\nexport interface MakeOrbitalWithUsesOpts {\n /** Orbital name. */\n name: string;\n /**\n * Per-orbital `uses:` header entries (see CLAUDE.md \"uses: lives inside\n * the orbital\").\n */\n uses: UseDeclaration[];\n /** Entity (inline or reference form). */\n entity: EntityRef;\n /**\n * Derived `expects` declarations (consumer-side requirements). Threaded\n * verbatim — derivation lives in `orb` (`orb behaviors expects`); builders never\n * compute it. Omitted from the result when not provided.\n */\n expects?: ExpectDeclaration[];\n /**\n * Auxiliary entities (name-resolution side channel for un-rebound atom\n * imports — see {@link OrbitalDefinition.auxiliaryEntities}). Threaded\n * verbatim; omitted from the result when not provided.\n */\n auxiliaryEntities?: EntityRef[];\n /** Trait references. */\n traits: TraitRef[];\n /** Optional page references (omitted entirely when not provided). */\n pages?: PageRef[];\n /** The orbital's own declared config knobs, threaded verbatim; omitted when not provided. */\n config?: DeclaredTraitConfig;\n}\n\n/**\n * Build an {@link OrbitalDefinition} with the `uses:` header set. Follows\n * the convention that `uses:` lives on the orbital (not the schema).\n *\n * When `pages` is omitted, the result has no `pages` property (matches the\n * existing {@link OrbitalDefinition.pages} optionality in descriptors that\n * carry trait-only atoms).\n */\nexport function makeOrbitalWithUses(opts: MakeOrbitalWithUsesOpts): OrbitalDefinition {\n const orbital: OrbitalDefinition = {\n name: opts.name,\n uses: opts.uses,\n ...(opts.expects !== undefined ? { expects: opts.expects } : {}),\n entity: opts.entity,\n ...(opts.auxiliaryEntities !== undefined ? { auxiliaryEntities: opts.auxiliaryEntities } : {}),\n traits: opts.traits,\n pages: opts.pages ?? [],\n ...(opts.config !== undefined ? { config: opts.config } : {}),\n };\n return orbital;\n}\n\n/** The alias an orbital value's import binds its source under (one import per orbital, so a fixed name is unambiguous). */\nexport const ORBITAL_VALUE_IMPORT_ALIAS = 'Source';\n\n/**\n * The import orbital an orbital value stands for (LOLO §8b): the value's\n * behavior imported under {@link ORBITAL_VALUE_IMPORT_ALIAS}, its orbital\n * referenced, and its recorded body as the reference body. Plain config values\n * are wrapped into the IR's declaration form here.\n */\nexport function orbitalImportFromValue(value: OrbitalValue): OrbitalDefinition {\n const { behavior, orbital, name, app, config, traits, uses, siblings, ...body } = value;\n const ref = `${ORBITAL_VALUE_IMPORT_ALIAS}.orbitals.${orbital}`;\n const clash = (uses ?? []).find((u) => u.as === ORBITAL_VALUE_IMPORT_ALIAS);\n if (clash !== undefined) {\n throw new Error(`orbital value ${orbital}: an import aliased '${ORBITAL_VALUE_IMPORT_ALIAS}' (from ${clash.from}) collides with the value's own source alias`);\n }\n const traitOverrides =\n traits === undefined\n ? undefined\n : Object.fromEntries(\n Object.entries(traits).map(([trait, overrides]): [string, OrbitalRefTraitOverride] => {\n const { config: traitConfig, ...rest } = overrides;\n return [trait, { ...rest, ...(traitConfig !== undefined ? { config: mergeCallSiteConfigOverrides({}, traitConfig) } : {}) }];\n }),\n );\n return {\n name: name ?? orbital,\n uses: [{ from: behavior, as: ORBITAL_VALUE_IMPORT_ALIAS, ...(app !== undefined ? { config: mergeCallSiteConfigOverrides({}, app) } : {}) }, ...(uses ?? [])],\n entity: `${ref}.entity`,\n traits: (siblings ?? []).map((sibling) => ({\n name: sibling.name,\n ref: sibling.ref,\n ...(sibling.linkedEntity !== undefined ? { linkedEntity: sibling.linkedEntity } : {}),\n ...(sibling.config !== undefined ? { config: mergeCallSiteConfigOverrides({}, sibling.config) } : {}),\n })),\n pages: [],\n reference: {\n ref,\n ...body,\n ...(config !== undefined ? { config: mergeCallSiteConfigOverrides({}, config) } : {}),\n ...(traitOverrides !== undefined ? { traits: traitOverrides } : {}),\n },\n };\n}\n\n/**\n * Parse a program held as data: an orbital value at `orbitals[i]` is the import\n * orbital it stands for ({@link orbitalImportFromValue}); everything else must\n * already be IR.\n */\nexport function parseProgram(data: RuntimeValue): OrbitalSchema {\n if (data === null || typeof data !== 'object' || Array.isArray(data) || !('orbitals' in data) || !Array.isArray(data.orbitals)) {\n return parseOrbitalSchema(data);\n }\n return parseOrbitalSchema({\n ...data,\n orbitals: data.orbitals.map((entry) => (isOrbitalValue(entry) ? orbitalImportFromValue(OrbitalValueSchema.parse(entry)) : entry)),\n });\n}\n\n/**\n * Options for {@link makeAtomOrbital}.\n *\n * Overrides for the single trait reference. Mirrors the {@link MakeTraitRefOpts}\n * subset that is meaningful at the atom-wrapping call site.\n */\nexport interface MakeAtomOrbitalTraitOverrides {\n name?: string;\n events?: Record<string, string>;\n effects?: Record<string, SExpr[]>;\n listens?: TraitEventListener[];\n emitsScope?: 'internal' | 'external';\n config?: CallSiteConfig;\n}\n\n/**\n * Options for {@link makeAtomOrbital}.\n */\nexport interface MakeAtomOrbitalOpts {\n /** Orbital name, e.g. `${entityName}Orbital`. */\n name: string;\n /** Atom registry path, e.g. `std/behaviors/atoms/std-browse`. */\n atomPath: string;\n /** Import alias (PascalCase), e.g. `Browse`. */\n alias: string;\n /** Entity definition to attach to the orbital. */\n entity: Entity;\n /** Trait reference string, e.g. `Browse.traits.BrowseItemBrowse`. */\n traitRef: string;\n /** Optional trait-level overrides applied at the call site. */\n traitOverrides?: MakeAtomOrbitalTraitOverrides;\n /** Optional page reference string, e.g. `Browse.pages.BrowseItemPage`. */\n pageRef?: string;\n /** Optional page-level overrides applied at the call site. */\n pageOverrides?: { path?: string };\n}\n\n/**\n * Build a single-atom {@link OrbitalDefinition}.\n *\n * The common atom shape: one entity + one trait reference + (optionally) one\n * page reference, all under a single `uses:` import. Wraps\n * {@link makeTraitRef}, {@link makePageRef}, and {@link makeOrbitalWithUses}.\n *\n * The trait reference is linkedEntity-bound to `entity.name` by default so\n * that the inliner's entity-substitution pass rewrites every `[\"fetch\", X]`\n * and `@X.path` reference inside the atom.\n */\nexport function makeAtomOrbital(opts: MakeAtomOrbitalOpts): OrbitalDefinition {\n const traitRef = makeTraitRef({\n from: opts.atomPath,\n ref: opts.traitRef,\n linkedEntity: opts.entity.name,\n ...(opts.traitOverrides?.name !== undefined ? { name: opts.traitOverrides.name } : {}),\n ...(opts.traitOverrides?.events !== undefined ? { events: opts.traitOverrides.events } : {}),\n ...(opts.traitOverrides?.effects !== undefined ? { effects: opts.traitOverrides.effects } : {}),\n ...(opts.traitOverrides?.listens !== undefined ? { listens: opts.traitOverrides.listens } : {}),\n ...(opts.traitOverrides?.emitsScope !== undefined\n ? { emitsScope: opts.traitOverrides.emitsScope }\n : {}),\n ...(opts.traitOverrides?.config !== undefined ? { config: opts.traitOverrides.config } : {}),\n });\n\n const pages: PageRef[] | undefined = opts.pageRef\n ? [\n makePageRef({\n from: opts.atomPath,\n ref: opts.pageRef,\n linkedEntity: opts.entity.name,\n ...(opts.pageOverrides?.path !== undefined ? { path: opts.pageOverrides.path } : {}),\n }),\n ]\n : undefined;\n\n return makeOrbitalWithUses({\n name: opts.name,\n uses: [{ from: opts.atomPath, as: opts.alias }],\n entity: opts.entity,\n traits: [traitRef],\n ...(pages !== undefined ? { pages } : {}),\n });\n}\n\n/**\n * Wrap one or more OrbitalDefinitions into an OrbitalSchema.\n * Every .orb file should be a full OrbitalSchema — this is the builder for that.\n */\nexport function makeSchema(name: string, ...definitions: OrbitalDefinition[]): OrbitalSchema {\n return { name, version: '1.0.0', orbitals: definitions };\n}\n\n/**\n * Unwrap inputs that may be OrbitalSchema or OrbitalDefinition into a flat\n * array of OrbitalDefinitions. Used internally by compose/pipe/connect/extractTrait\n * so they accept both types.\n */\nfunction asDefinitions(inputs: (OrbitalDefinition | OrbitalSchema)[]): OrbitalDefinition[] {\n return inputs.flatMap(input => {\n if ('orbitals' in input && Array.isArray((input as OrbitalSchema).orbitals)) {\n return (input as OrbitalSchema).orbitals as OrbitalDefinition[];\n }\n return [input as OrbitalDefinition];\n });\n}\n\n/** Unwrap a single OrbitalSchema | OrbitalDefinition to OrbitalDefinition. */\nfunction asDefinition(input: OrbitalDefinition | OrbitalSchema): OrbitalDefinition {\n if ('orbitals' in input && Array.isArray((input as OrbitalSchema).orbitals)) {\n return (input as OrbitalSchema).orbitals[0] as OrbitalDefinition;\n }\n return input as OrbitalDefinition;\n}\n\n// ============================================================================\n// Intra-Orbital Composition\n// ============================================================================\n\n/**\n * Merge multiple OrbitalDefinitions into one.\n * Collects all traits from all sources into a single orbital with a shared entity.\n * Pure: clones all traits, no mutation.\n */\nexport function mergeOrbitals(\n name: string,\n entity: Entity,\n sources: OrbitalDefinition[],\n pages: Page[],\n): OrbitalDefinition {\n const allTraits = sources.flatMap(s =>\n (s.traits as Trait[]).map(t => structuredClone(t)),\n );\n return { name, entity, traits: allTraits, pages } as OrbitalDefinition;\n}\n\n/**\n * Wire an intra-orbital event between two traits.\n * Adds emits to the source trait, listens to the target trait.\n * Pure: returns cloned traits, no mutation.\n */\nexport function wire(\n source: Trait,\n target: Trait,\n event: TraitEventContract,\n triggers: string,\n): [Trait, Trait] {\n const s = structuredClone(source);\n const t = structuredClone(target);\n\n s.emits = [...(s.emits ?? []), { ...event, scope: event.scope ?? ('internal' as const) }];\n t.listens = [...(t.listens ?? []), {\n event: event.event,\n triggers,\n scope: 'internal' as const,\n }];\n\n return [s, t];\n}\n\n/**\n * Extract the first trait from an OrbitalDefinition or OrbitalSchema.\n * If given an OrbitalSchema, unwraps to the first orbital inside it.\n */\nexport function extractTrait(input: OrbitalDefinition | OrbitalSchema): Trait {\n const orbital = asDefinition(input);\n return structuredClone((orbital.traits as Trait[])[0]);\n}\n\n// ============================================================================\n// Composition: connect\n// ============================================================================\n\n/**\n * Wire a cross-orbital event between two orbitals.\n * Adds emits to a's first trait, listens to b's first trait.\n * Pure: returns new orbitals, no mutation.\n */\nexport function connect(\n a: OrbitalDefinition | OrbitalSchema,\n b: OrbitalDefinition | OrbitalSchema,\n event: TraitEventContract,\n triggers?: string,\n): [OrbitalDefinition, OrbitalDefinition] {\n const aClone = structuredClone(asDefinition(a));\n const bClone = structuredClone(asDefinition(b));\n\n // Add emit to first trait of a\n const aTrait = (aClone.traits as Trait[])[0];\n if (aTrait) {\n const emitContract: TraitEventContract = {\n ...event,\n scope: event.scope ?? 'external',\n };\n aTrait.emits = [...(aTrait.emits ?? []), emitContract];\n }\n\n // Add listen to first trait of b\n const bTrait = (bClone.traits as Trait[])[0];\n if (bTrait) {\n const listener: TraitEventListener = {\n event: event.event,\n triggers: triggers ?? 'INIT',\n scope: 'external',\n };\n bTrait.listens = [...(bTrait.listens ?? []), listener];\n }\n\n return [aClone, bClone];\n}\n\n// ============================================================================\n// Composition: compose\n// ============================================================================\n\nexport interface ComposeConnection {\n from: string;\n to: string;\n event: TraitEventContract;\n triggers?: string;\n}\n\nexport interface ComposePage {\n name: string;\n path: string;\n traits: string[];\n isInitial?: boolean;\n}\n\n/**\n * Compose multiple orbitals into a single OrbitalSchema (application).\n * Applies connections (cross-orbital event wiring) and page assignments.\n */\nexport function compose(\n orbitals: (OrbitalDefinition | OrbitalSchema)[],\n pages: ComposePage[],\n connections: ComposeConnection[],\n appName?: string,\n): OrbitalSchema {\n const cloned = structuredClone(asDefinitions(orbitals));\n\n // Apply connections\n for (const conn of connections) {\n const emitter = cloned.find(o => {\n const traits = o.traits as Trait[];\n return traits.some(t => t.name === conn.from);\n });\n const listener = cloned.find(o => {\n const traits = o.traits as Trait[];\n return traits.some(t => t.name === conn.to);\n });\n\n if (emitter && listener) {\n const eTrait = (emitter.traits as Trait[]).find(t => t.name === conn.from);\n const lTrait = (listener.traits as Trait[]).find(t => t.name === conn.to);\n\n if (eTrait) {\n const emitContract: TraitEventContract = { ...conn.event, scope: conn.event.scope ?? 'external' };\n eTrait.emits = [...(eTrait.emits ?? []), emitContract];\n }\n if (lTrait) {\n const listenContract: TraitEventListener = {\n event: conn.event.event,\n triggers: conn.triggers ?? 'INIT',\n scope: 'external',\n };\n lTrait.listens = [...(lTrait.listens ?? []), listenContract];\n }\n }\n }\n\n // Assign pages to orbitals\n for (const orbital of cloned) {\n const traitNames = (orbital.traits as Trait[]).map(t => t.name);\n const matchingPages = pages.filter(p =>\n p.traits.some(t => traitNames.includes(t)),\n );\n orbital.pages = matchingPages.map(p => ({\n name: p.name,\n path: p.path,\n ...(p.isInitial ? { isInitial: true } : {}),\n traits: p.traits\n .filter(t => traitNames.includes(t))\n .map(ref => ({ ref })),\n }));\n }\n\n return {\n name: appName ?? 'Application',\n version: '1.0.0',\n orbitals: cloned,\n };\n}\n\n// ============================================================================\n// Composition: pipe\n// ============================================================================\n\n/**\n * Chain orbitals in sequence with automatic event wiring.\n * Sugar over connect + compose: wires events[0] from orbital[0] to orbital[1], etc.\n */\nexport function pipe(\n orbitals: (OrbitalDefinition | OrbitalSchema)[],\n events: TraitEventContract[],\n appName?: string,\n): OrbitalSchema {\n if (events.length !== orbitals.length - 1) {\n throw new Error(`pipe requires exactly ${orbitals.length - 1} events for ${orbitals.length} orbitals`);\n }\n\n const cloned = structuredClone(asDefinitions(orbitals));\n\n // Wire adjacent pairs\n for (let i = 0; i < events.length; i++) {\n const aTrait = (cloned[i].traits as Trait[])[0];\n const bTrait = (cloned[i + 1].traits as Trait[])[0];\n\n if (aTrait) {\n const emitContract: TraitEventContract = { ...events[i], scope: events[i].scope ?? 'external' };\n aTrait.emits = [...(aTrait.emits ?? []), emitContract];\n }\n if (bTrait) {\n const listener: TraitEventListener = {\n event: events[i].event,\n triggers: 'INIT',\n scope: 'external',\n };\n bTrait.listens = [...(bTrait.listens ?? []), listener];\n }\n }\n\n // Auto-generate pages: one per orbital, first is initial\n const pages: Page[] = cloned.map((o, i) => {\n const entityName = resolveEntityNameForBuilder(o.entity);\n const traitNames = (o.traits as Trait[]).map(t => t.name);\n return {\n name: `${entityName}Page`,\n path: `/${plural(entityName).toLowerCase()}`,\n ...(i === 0 ? { isInitial: true } : {}),\n traits: traitNames.map(ref => ({ ref })),\n };\n });\n\n // Assign pages back to orbitals\n for (let i = 0; i < cloned.length; i++) {\n cloned[i].pages = [pages[i]];\n }\n\n return {\n name: appName ?? 'Application',\n version: '1.0.0',\n orbitals: cloned,\n };\n}\n"]}