@almadar/runtime 5.1.0 → 5.2.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.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { B as BindingContext, E as EvaluationContextExtensions, P as PatternProps, a as EffectHandlers, b as EffectContext, c as ExecutionEnvironment, d as EffectResult, T as TraitDefinition } from './types-DwDhc9Jt.js';
2
- export { e as Effect, f as EventListener, H as HANDLER_MANIFEST, I as IEventBus, R as RuntimeConfig, g as RuntimeEvent, h as TraitState, i as TransitionObserver, j as TransitionResult, U as Unsubscribe } from './types-DwDhc9Jt.js';
3
- import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult, a as LoadedSchema, b as LoadedOrbital, P as PersistenceAdapter } from './OrbitalServerRuntime-D-b_dg8I.js';
4
- export { E as EntitySharingMap, c as EventBus, d as EventNamespaceMap, e as InMemoryPersistence, O as OrbitalEventRequest, f as OrbitalEventResponse, g as OrbitalServerRuntimeConfig, h as PreprocessOptions, i as PreprocessResult, j as PreprocessedSchema, k as ProcessEventOptions, R as RegisteredOrbital, l as RuntimeOrbital, m as RuntimeOrbitalSchema, n as RuntimeTrait, o as StateMachineManager, p as createInitialTraitState, q as findInitialState, r as findTransition, s as getIsolatedCollectionName, t as getNamespacedEvent, u as isBrowser, v as isElectron, w as isNamespacedEvent, x as isNode, y as normalizeEventKey, z as parseNamespacedEvent, A as preprocessSchema, B as processEvent } from './OrbitalServerRuntime-D-b_dg8I.js';
1
+ import { B as BindingContext, E as EvaluationContextExtensions, P as PatternProps, a as EffectHandlers, b as EffectContext, c as ExecutionEnvironment, d as EffectResult, T as TraitDefinition } from './types-SmmabGZk.js';
2
+ export { e as Effect, f as EventListener, H as HANDLER_MANIFEST, I as IEventBus, R as RuntimeConfig, g as RuntimeEvent, h as TraitState, i as TransitionObserver, j as TransitionResult, U as Unsubscribe } from './types-SmmabGZk.js';
3
+ import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult, a as LoadedSchema, b as LoadedOrbital, P as PersistenceAdapter } from './OrbitalServerRuntime-BrJ7m0hz.js';
4
+ export { E as EntitySharingMap, c as EventBus, d as EventNamespaceMap, e as InMemoryPersistence, O as OrbitalEventRequest, f as OrbitalEventResponse, g as OrbitalServerRuntimeConfig, h as PreprocessOptions, i as PreprocessResult, j as PreprocessedSchema, k as ProcessEventOptions, R as RegisteredOrbital, l as RuntimeOrbital, m as RuntimeOrbitalSchema, n as RuntimeTrait, o as StateMachineManager, p as createInitialTraitState, q as findInitialState, r as findTransition, s as getIsolatedCollectionName, t as getNamespacedEvent, u as isBrowser, v as isElectron, w as isNamespacedEvent, x as isNode, y as normalizeEventKey, z as parseNamespacedEvent, A as preprocessSchema, B as processEvent } from './OrbitalServerRuntime-BrJ7m0hz.js';
5
5
  import { EvaluationContext } from '@almadar/evaluator';
6
6
  export { EvaluationContext, createMinimalContext } from '@almadar/evaluator';
7
- import { EventPayload, EntityRow, OrbitalDefinition, OrbitalSchema } from '@almadar/core';
7
+ import { EventPayload, EntityRow, PayloadField, OrbitalDefinition, OrbitalSchema } from '@almadar/core';
8
8
  export { ServerBridgeConfig, ServerBridgeState } from './ServerBridge.js';
9
9
  import 'express';
10
10
 
@@ -615,6 +615,45 @@ interface OsHandlerResult {
615
615
  * @packageDocumentation
616
616
  */
617
617
 
618
+ /**
619
+ * Per-event payload-validation error. Returned by `validateEventPayload`
620
+ * when a request body doesn't match the trait's listens schema for the
621
+ * dispatched event. Caller (HTTP handler in either path) translates
622
+ * this into a 400 response.
623
+ */
624
+ interface PayloadValidationFailure {
625
+ readonly event: string;
626
+ readonly field: string;
627
+ readonly reason: 'missing' | 'null' | 'wrong-type';
628
+ readonly expectedType?: string;
629
+ }
630
+ /**
631
+ * Validate an incoming event payload against its trait's declared
632
+ * `stateMachine.events[i].payloadSchema`. Currently checks the
633
+ * `required: true` flag against undefined/null values — i.e. enforces
634
+ * the `!` author marker at the API boundary so the persist effect
635
+ * never sees a missing-but-required field.
636
+ *
637
+ * Returns an empty array if the payload is valid; one entry per
638
+ * violation otherwise. Pass through if the event has no schema
639
+ * (e.g. INIT, untyped emits) — coverage walks of unschemaed events
640
+ * stay legal.
641
+ *
642
+ * Both the runtime path (`OrbitalServerRuntime.processOrbitalEvent`)
643
+ * and the compiled-path generated handlers call this with the same
644
+ * arguments so guards behave identically across the two paths.
645
+ *
646
+ * Uses `@almadar/core`'s `PayloadField` directly — that's the type
647
+ * the IR's `Event.payloadSchema` carries (open `type: string`,
648
+ * matching the Rust validator's acceptance of entity-name references
649
+ * like `ListItem`). No parallel runtime type.
650
+ */
651
+ declare function validateEventPayload(eventKey: string, payload: EventPayload | undefined, schema: ReadonlyArray<PayloadField> | undefined): PayloadValidationFailure[];
652
+ /**
653
+ * Format a validation failure into a human-readable error string for
654
+ * the API response body.
655
+ */
656
+ declare function formatPayloadValidationError(failures: ReadonlyArray<PayloadValidationFailure>): string;
618
657
  /**
619
658
  * Emit declaration from a trait.
620
659
  */
@@ -838,4 +877,4 @@ declare namespace index {
838
877
  export { type index_ComposeBehaviorsInput as ComposeBehaviorsInput, type index_ComposeBehaviorsResult as ComposeBehaviorsResult, type index_EventWiringEntry as EventWiringEntry, type index_LayoutStrategy as LayoutStrategy, type index_PipeStep as PipeStep, index_applyEventWiring as applyEventWiring, index_composeBehaviors as composeBehaviors, index_detectLayoutStrategy as detectLayoutStrategy, index_pipeBehaviors as pipeBehaviors };
839
878
  }
840
879
 
841
- export { BindingContext, type ClientEventBus, type ComposeBehaviorsInput, type ComposeBehaviorsResult, type CreateClientEffectHandlersOptions, type CreateServerEffectHandlersOptions, EffectContext, EffectExecutor, type EffectExecutorOptions, EffectHandlers, EffectResult, type EntityField, type EntitySchema, type EventWiringEntry, ExecutionEnvironment, ImportChainLike, type LayoutStrategy, LoadResult, LoadedOrbital, LoadedSchema, MockPersistenceAdapter, type MockPersistenceConfig, type OsHandlerContext, type OsHandlerResult, type PayloadMismatch, PersistenceAdapter, type PipeStep, SchemaLoader, type ServerEffectResult, type SlotSetter, TraitDefinition, UnifiedLoaderOptions, applyEventWiring, buildEmitsFromTraits, composeBehaviors, index as composition, containsBindings, createClientEffectHandlers, createContextFromBindings, createMockPersistence, createServerEffectHandlers, createTestExecutor, createUnifiedLoader, detectLayoutStrategy, extractBindings, interpolateProps, interpolateValue, pipeBehaviors, validatePayloadShapes };
880
+ export { BindingContext, type ClientEventBus, type ComposeBehaviorsInput, type ComposeBehaviorsResult, type CreateClientEffectHandlersOptions, type CreateServerEffectHandlersOptions, EffectContext, EffectExecutor, type EffectExecutorOptions, EffectHandlers, EffectResult, type EntityField, type EntitySchema, type EventWiringEntry, ExecutionEnvironment, ImportChainLike, type LayoutStrategy, LoadResult, LoadedOrbital, LoadedSchema, MockPersistenceAdapter, type MockPersistenceConfig, type OsHandlerContext, type OsHandlerResult, type PayloadMismatch, type PayloadValidationFailure, PersistenceAdapter, type PipeStep, SchemaLoader, type ServerEffectResult, type SlotSetter, TraitDefinition, UnifiedLoaderOptions, applyEventWiring, buildEmitsFromTraits, composeBehaviors, index as composition, containsBindings, createClientEffectHandlers, createContextFromBindings, createMockPersistence, createServerEffectHandlers, createTestExecutor, createUnifiedLoader, detectLayoutStrategy, extractBindings, formatPayloadValidationError, interpolateProps, interpolateValue, pipeBehaviors, validateEventPayload, validatePayloadShapes };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createLogger, EffectExecutor, createContextFromBindings } from './chunk-T343XTYB.js';
2
- export { EffectExecutor, EventBus, HANDLER_MANIFEST, InMemoryPersistence, MockPersistenceAdapter, StateMachineManager, containsBindings, createContextFromBindings, createInitialTraitState, createMinimalContext, createMockPersistence, createTestExecutor, createUnifiedLoader, extractBindings, findInitialState, findTransition, getIsolatedCollectionName, getNamespacedEvent, interpolateProps, interpolateValue, isBrowser, isElectron, isNamespacedEvent, isNode, normalizeEventKey, parseNamespacedEvent, preprocessSchema, processEvent } from './chunk-T343XTYB.js';
1
+ import { createLogger, EffectExecutor, createContextFromBindings } from './chunk-OG2NHXES.js';
2
+ export { EffectExecutor, EventBus, HANDLER_MANIFEST, InMemoryPersistence, MockPersistenceAdapter, StateMachineManager, buildEmitsFromTraits, containsBindings, createContextFromBindings, createInitialTraitState, createMinimalContext, createMockPersistence, createTestExecutor, createUnifiedLoader, extractBindings, findInitialState, findTransition, formatPayloadValidationError, getIsolatedCollectionName, getNamespacedEvent, interpolateProps, interpolateValue, isBrowser, isElectron, isNamespacedEvent, isNode, normalizeEventKey, parseNamespacedEvent, preprocessSchema, processEvent, validateEventPayload, validatePayloadShapes } from './chunk-OG2NHXES.js';
3
3
  import { __export } from './chunk-PZ5AY32C.js';
4
4
  import { evaluate } from '@almadar/evaluator';
5
5
  import { isInlineTrait } from '@almadar/core';
@@ -447,83 +447,6 @@ function createServerEffectHandlers(opts) {
447
447
  return handlers;
448
448
  }
449
449
 
450
- // src/PayloadValidator.ts
451
- function validatePayloadShapes(traits, emits) {
452
- const mismatches = [];
453
- const emitIndex = /* @__PURE__ */ new Map();
454
- for (const [traitName, declarations] of emits) {
455
- for (const decl of declarations) {
456
- const fields = decl.payloadSchema?.map((p) => p.name) ?? [];
457
- emitIndex.set(decl.event, { traitName, fields });
458
- }
459
- }
460
- for (const trait of traits) {
461
- if (!trait.listens) continue;
462
- for (const listener of trait.listens) {
463
- const emitter = emitIndex.get(listener.event);
464
- if (!emitter) continue;
465
- if (!listener.payloadMapping) continue;
466
- const payloadRefs = extractPayloadReferences(listener.payloadMapping);
467
- for (const ref of payloadRefs) {
468
- if (!emitter.fields.includes(ref)) {
469
- mismatches.push({
470
- listenerTrait: trait.name,
471
- emitterTrait: emitter.traitName,
472
- event: listener.event,
473
- referencedField: ref,
474
- availableFields: emitter.fields
475
- });
476
- }
477
- }
478
- }
479
- }
480
- return mismatches;
481
- }
482
- function extractPayloadReferences(mapping) {
483
- const refs = [];
484
- function collect(value) {
485
- if (typeof value === "string") {
486
- const match = value.match(/^@payload\.(\w+)$/);
487
- if (match) {
488
- refs.push(match[1]);
489
- }
490
- } else if (typeof value === "object" && value !== null) {
491
- if (Array.isArray(value)) {
492
- value.forEach(collect);
493
- } else {
494
- Object.values(value).forEach(collect);
495
- }
496
- }
497
- }
498
- Object.values(mapping).forEach(collect);
499
- return [...new Set(refs)];
500
- }
501
- function buildEmitsFromTraits(traits, explicitEmits) {
502
- const result = new Map(explicitEmits ?? []);
503
- for (const trait of traits) {
504
- if (result.has(trait.name)) continue;
505
- const emitDecls = [];
506
- for (const transition of trait.transitions) {
507
- if (!transition.effects) continue;
508
- for (const effect of transition.effects) {
509
- if (!Array.isArray(effect)) continue;
510
- if (effect[0] === "emit" && typeof effect[1] === "string") {
511
- const event = effect[1];
512
- const payloadObj = effect[2];
513
- const payloadSchema = payloadObj ? Object.keys(payloadObj).map((name) => ({ name })) : void 0;
514
- if (!emitDecls.some((d) => d.event === event)) {
515
- emitDecls.push({ event, payloadSchema });
516
- }
517
- }
518
- }
519
- }
520
- if (emitDecls.length > 0) {
521
- result.set(trait.name, emitDecls);
522
- }
523
- }
524
- return result;
525
- }
526
-
527
450
  // src/composition/index.ts
528
451
  var composition_exports = {};
529
452
  __export(composition_exports, {
@@ -738,6 +661,6 @@ function pipeBehaviors(seed, ...steps) {
738
661
  return current;
739
662
  }
740
663
 
741
- export { applyEventWiring, buildEmitsFromTraits, composeBehaviors, composition_exports as composition, createClientEffectHandlers, createServerEffectHandlers, detectLayoutStrategy, pipeBehaviors, validatePayloadShapes };
664
+ export { applyEventWiring, composeBehaviors, composition_exports as composition, createClientEffectHandlers, createServerEffectHandlers, detectLayoutStrategy, pipeBehaviors };
742
665
  //# sourceMappingURL=index.js.map
743
666
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ClientEffectHandlers.ts","../src/ServerEffectHandlers.ts","../src/PayloadValidator.ts","../src/composition/index.ts","../src/composition/event-wiring.ts","../src/composition/layout-strategy.ts","../src/composition/compose-behaviors.ts","../src/composition/pipe.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Client Effect Handlers Factory\n *\n * Creates the standard effect handler set for client-side trait execution.\n * Platform-agnostic — works with any UI framework that provides the required interfaces.\n *\n * @packageDocumentation\n */\n\nimport type { EffectHandlers, EventPayload, PatternProps } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal event bus interface required by the factory.\n */\nexport interface ClientEventBus {\n emit: (type: string, payload?: EventPayload) => void;\n}\n\n/**\n * Slot setter interface for render-ui effects.\n * The factory doesn't know about React state — it just calls this function.\n */\nexport interface SlotSetter {\n /** Accumulate a pattern into the pending slot map */\n addPattern: (slot: string, pattern: unknown, props?: PatternProps) => void;\n /** Mark a slot for clearing */\n clearSlot: (slot: string) => void;\n}\n\n/**\n * Options for creating client effect handlers.\n */\nexport interface CreateClientEffectHandlersOptions {\n /** Event bus for emit effects */\n eventBus: ClientEventBus;\n /** Slot setter for render-ui effects */\n slotSetter: SlotSetter;\n /** Navigate function for navigate effects */\n navigate?: (path: string, params?: { [key: string]: string }) => void;\n /** Notify function for notification effects */\n notify?: (message: string, type: 'success' | 'error' | 'warning' | 'info') => void;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create client-side effect handlers for trait state machine execution.\n *\n * Client handles: emit, renderUI, navigate, notify\n * Server handles: persist, set, callService (logged as warnings on client)\n *\n * @example\n * ```ts\n * const handlers = createClientEffectHandlers({\n * eventBus,\n * slotSetter: {\n * addPattern: (slot, pattern, props) => pendingSlots.get(slot)?.push({ pattern, props }),\n * clearSlot: (slot) => pendingSlots.set(slot, []),\n * },\n * navigate: (path) => router.push(path),\n * notify: (msg, type) => toast[type](msg),\n * });\n * ```\n */\nexport function createClientEffectHandlers(\n options: CreateClientEffectHandlersOptions\n): EffectHandlers {\n const { eventBus, slotSetter, navigate, notify } = options;\n\n return {\n emit: (event: string, payload?: EventPayload) => {\n // The event bus emits with shape `{ type, payload, source }` per\n // IEventBus. Subscribers read `event.payload` to get the trait-\n // supplied payload. Wrapping it again as `{ payload }` here\n // produced a doubly-nested envelope — `@payload.X` bindings on\n // the receiving render-ui then resolved to `undefined` because\n // the real keys lived one level deeper. Pass the payload through\n // directly so the subscriber sees exactly what the trait emitted.\n const prefixedEvent = event.startsWith('UI:') ? event : `UI:${event}`;\n eventBus.emit(prefixedEvent, payload);\n },\n\n persist: async () => {\n console.warn('[ClientEffectHandlers] persist is server-side only, ignored on client');\n },\n\n set: () => {\n console.warn('[ClientEffectHandlers] set is server-side only, ignored on client');\n },\n\n callService: async () => {\n console.warn('[ClientEffectHandlers] callService is server-side only, ignored on client');\n return {};\n },\n\n renderUI: (slot: string, pattern: unknown, props?: PatternProps) => {\n if (pattern === null) {\n slotSetter.clearSlot(slot);\n return;\n }\n slotSetter.addPattern(slot, pattern, props);\n },\n\n navigate: navigate ?? ((path: string) => {\n console.warn('[ClientEffectHandlers] No navigate handler, ignoring:', path);\n }),\n\n notify: notify ?? ((msg: string, type?: string) => {\n console.log(`[ClientEffectHandlers] notify (${type}):`, msg);\n }),\n };\n}\n","/**\n * ServerEffectHandlers — reusable factory for the server-side effect layer.\n *\n * Mirrors the handlers built inline in\n * `OrbitalServerRuntime.executeEffects` so both the real server runtime\n * AND the in-browser mock runtime (`@almadar/ui` OrbPreview autoMock) can\n * share the same `fetch` / `persist` / `set` / `ref` / `deref` / `swap!` /\n * `atomic` / `callService` semantics against a `PersistenceAdapter`.\n *\n * Browser-safe: only imports core + this package's browser-safe modules.\n * Does NOT import express/Node, so it is reachable from `@almadar/ui`.\n *\n * @packageDocumentation\n */\n\nimport type { EventPayload, SExpr } from \"@almadar/core\";\nimport type { PersistenceAdapter } from \"./PersistenceAdapter.js\";\nimport type {\n EffectHandlers,\n BindingContext,\n EffectContext,\n EntityRow,\n} from \"./types.js\";\nimport { EffectExecutor } from \"./EffectExecutor.js\";\nimport { createContextFromBindings } from \"./BindingResolver.js\";\nimport { evaluate } from \"@almadar/evaluator\";\nimport { createLogger } from \"./logger.js\";\n\nconst effectLog = createLogger(\"almadar:runtime:effects\");\n\n/**\n * Minimal event-bus contract the server handlers need. Narrower than the\n * full `IEventBus` so clients with a React-context bus (only `emit` is\n * relevant for effect dispatch) can hand it in without adapter code.\n */\nexport interface ServerEffectEventBus {\n emit(\n event: string,\n payload?: EventPayload,\n source?: { orbital?: string; trait?: string },\n ): void;\n}\n\n/**\n * Result entry recorded for each effect invocation. Mirrors the server\n * runtime's `EffectResult`. Callers who want telemetry pass an array that\n * the factory appends to; otherwise it's unused.\n */\nexport interface ServerEffectResult {\n effect:\n | \"set\"\n | \"persist\"\n | \"call-service\"\n | \"fetch\"\n | \"ref\"\n | \"deref\"\n | \"swap\"\n | \"atomic\";\n action?: string;\n entityType?: string;\n data?: unknown;\n success: boolean;\n error?: string;\n}\n\nexport interface CreateServerEffectHandlersOptions {\n /** Persistent store backing `fetch` / `persist` / `ref` / `deref` / `swap`. */\n persistence: PersistenceAdapter;\n /** Event bus that `emit` delegates to. Only `.emit()` is required. */\n eventBus: ServerEffectEventBus;\n /** The trait's linked entity type (used as the default for persist/set). */\n entityType: string;\n /** Current entity row id (used by `set`, `persist update/delete` fallback). */\n entityId?: string;\n /**\n * Binding object passed to inner `atomic` evaluator. When absent, atomic\n * effects still run but have no access to `@entity` / `@payload` bindings.\n */\n bindings?: BindingContext;\n /** Effect context passed to the inner `atomic` executor. */\n context?: EffectContext;\n /** Per-event result sink. Optional — telemetry only. */\n effectResults?: ServerEffectResult[];\n /**\n * Per-event fetched-data cache. `fetch` writes here so downstream UI\n * renderers can resolve `@entity` bindings from the latest load without\n * a separate round-trip.\n */\n fetchedData?: Record<string, EntityRow[]>;\n /** Per-event emit log. Optional — telemetry only. */\n emittedEvents?: Array<{ event: string; payload?: EventPayload }>;\n /** Source stamp applied to all emits. */\n source?: { orbital?: string; trait?: string };\n /** Consumer-supplied `call-service` handler. When absent, calls warn and return null. */\n callService?: (\n service: string,\n action: string,\n params: unknown,\n ) => Promise<unknown>;\n /** Verbose logging. */\n debug?: boolean;\n}\n\n/**\n * Build the full server-side effect handler set bound to a persistence\n * adapter. The returned object satisfies `EffectHandlers` and can be\n * handed directly to `EffectExecutor`.\n *\n * Scope: one handler object per transition — capture `entityId`,\n * `bindings`, `context`, and the sink arrays at build time. For a new\n * transition, call this factory again.\n *\n * Intentionally does NOT implement:\n * - `renderUI` / `notify` / `navigate` — these are client-side, provided\n * by `createClientEffectHandlers`. A mock runtime merges both handler\n * sets.\n * - `os/watch-*` observers — these are a no-op outside the server.\n * - Schema-aware relation cardinality / on-delete cascades — those live\n * in `OrbitalServerRuntime` and depend on the full registered schema.\n * Clients that need them can wrap the persist handler with their own\n * validation.\n */\nexport function createServerEffectHandlers(\n opts: CreateServerEffectHandlersOptions,\n): EffectHandlers {\n const {\n persistence,\n eventBus,\n entityType,\n entityId,\n bindings,\n context,\n effectResults,\n fetchedData,\n emittedEvents,\n source,\n callService: consumerCallService,\n debug,\n } = opts;\n\n const record = (entry: ServerEffectResult): void => {\n effectResults?.push(entry);\n };\n\n const handlers: EffectHandlers = {\n emit: (event, eventPayload, emitSource) => {\n if (debug) {\n console.log(`[ServerEffectHandlers] emit ${event}`, eventPayload);\n }\n const stamp = emitSource ?? source;\n eventBus.emit(event, eventPayload, stamp);\n emittedEvents?.push({ event, payload: eventPayload });\n effectLog.debug(\"emit:push\", {\n event,\n cumulativeEmittedCount: emittedEvents?.length,\n sourceTrait: stamp?.trait,\n sourceOrbital: stamp?.orbital,\n emittedEventsBound: emittedEvents !== undefined,\n });\n },\n\n set: async (targetId, field, value) => {\n const id = targetId || entityId;\n if (!id) return;\n try {\n await persistence.update(entityType, id, { [field]: value } as EntityRow);\n record({\n effect: \"set\",\n entityType,\n data: { id, field, value },\n success: true,\n });\n } catch (err) {\n record({\n effect: \"set\",\n entityType,\n data: { id, field, value },\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n\n persist: async (action, targetEntityType, data) => {\n if (action === \"batch\") {\n const operations = (data as { operations?: unknown[] } | undefined)?.operations;\n if (!Array.isArray(operations) || operations.length === 0) {\n record({\n effect: \"persist\",\n action: \"batch\",\n success: false,\n error: \"Batch requires a non-empty operations array\",\n });\n return;\n }\n const batchResults: unknown[] = [];\n const completed: unknown[] = [];\n let batchFailed = false;\n let batchError = \"\";\n for (const op of operations) {\n if (!Array.isArray(op) || op.length < 2) {\n batchFailed = true;\n batchError = `Invalid batch operation format: ${JSON.stringify(op)}`;\n break;\n }\n const [opAction, opEntityType, ...opRest] = op as [\n string,\n string,\n ...unknown[],\n ];\n try {\n switch (opAction) {\n case \"create\": {\n const createData = (opRest[0] as EntityRow) || ({} as EntityRow);\n const { id: newId } = await persistence.create(\n opEntityType,\n createData,\n );\n batchResults.push({\n action: \"create\",\n entityType: opEntityType,\n id: newId,\n ...createData,\n });\n completed.push({\n action: \"create\",\n entityType: opEntityType,\n id: newId,\n });\n break;\n }\n case \"update\": {\n const updateId = opRest[0] as string;\n const updateData = (opRest[1] as EntityRow) || ({} as EntityRow);\n await persistence.update(opEntityType, updateId, updateData);\n const updated = await persistence.getById(opEntityType, updateId);\n batchResults.push({\n action: \"update\",\n entityType: opEntityType,\n id: updateId,\n ...(updated || updateData),\n });\n completed.push({\n action: \"update\",\n entityType: opEntityType,\n id: updateId,\n });\n break;\n }\n case \"delete\": {\n const deleteId = opRest[0] as string;\n await persistence.delete(opEntityType, deleteId);\n batchResults.push({\n action: \"delete\",\n entityType: opEntityType,\n id: deleteId,\n deleted: true,\n });\n completed.push({\n action: \"delete\",\n entityType: opEntityType,\n id: deleteId,\n });\n break;\n }\n default:\n batchFailed = true;\n batchError = `Unknown batch operation action: ${opAction}`;\n break;\n }\n } catch (err) {\n batchFailed = true;\n batchError = `Batch operation [${opAction}, ${opEntityType}] failed: ${\n err instanceof Error ? err.message : String(err)\n }`;\n break;\n }\n if (batchFailed) break;\n }\n record({\n effect: \"persist\",\n action: \"batch\",\n data: {\n operations: batchResults,\n completedCount: completed.length,\n totalCount: operations.length,\n },\n success: !batchFailed,\n ...(batchFailed ? { error: batchError } : {}),\n });\n return;\n }\n\n const type = targetEntityType || entityType;\n let resultData: EntityRow | undefined;\n const sizeBefore = (await persistence.list(type)).length;\n try {\n switch (action) {\n case \"create\": {\n const { id } = await persistence.create(type, (data ?? {}) as EntityRow);\n resultData = { id, ...((data ?? {}) as EntityRow) };\n break;\n }\n case \"update\": {\n const row = (data ?? {}) as EntityRow;\n const idOrFallback = (row.id as string | undefined) ?? entityId;\n if (idOrFallback) {\n await persistence.update(type, idOrFallback, row);\n const updated = await persistence.getById(type, idOrFallback);\n resultData = updated ?? { id: idOrFallback, ...row };\n }\n break;\n }\n case \"delete\": {\n const directId = typeof data === \"string\" ? data : undefined;\n const nestedId =\n typeof data === \"object\" && data !== null\n ? ((data as { id?: string }).id)\n : undefined;\n const deleteId = directId ?? nestedId ?? entityId;\n if (deleteId) {\n await persistence.delete(type, deleteId);\n resultData = { id: deleteId, deleted: true } as EntityRow;\n }\n break;\n }\n }\n const sizeAfter = (await persistence.list(type)).length;\n effectLog.debug(\"persist:store-mutate\", {\n action,\n entityType: type,\n resultId: resultData?.id as string | undefined,\n sizeBefore,\n sizeAfter,\n delta: sizeAfter - sizeBefore,\n });\n record({\n effect: \"persist\",\n action,\n entityType: type,\n data: resultData,\n success: true,\n });\n } catch (err) {\n effectLog.error(\"persist:store-mutate-error\", {\n action,\n entityType: type,\n error: err instanceof Error ? err.message : String(err),\n });\n record({\n effect: \"persist\",\n action,\n entityType: type,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n\n callService: async (service, action, params) => {\n try {\n let result: unknown = null;\n if (consumerCallService) {\n result = await consumerCallService(service, action, params);\n } else if (debug) {\n console.warn(\n `[ServerEffectHandlers] call-service not configured: ${service}.${action}`,\n );\n }\n record({\n effect: \"call-service\",\n action: `${service}.${action}`,\n data: result,\n success: true,\n });\n return result;\n } catch (err) {\n record({\n effect: \"call-service\",\n action: `${service}.${action}`,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n fetch: async (fetchEntityType, options) => {\n try {\n let result: EntityRow | EntityRow[] | null = null;\n if (options?.id) {\n const entity = await persistence.getById(fetchEntityType, options.id);\n if (entity) {\n if (fetchedData) fetchedData[fetchEntityType] = [entity];\n result = entity;\n }\n } else {\n let entities = await persistence.list(fetchEntityType);\n if (options?.offset && options.offset > 0) {\n entities = entities.slice(options.offset);\n }\n if (options?.limit && options.limit > 0) {\n entities = entities.slice(0, options.limit);\n }\n if (fetchedData) fetchedData[fetchEntityType] = entities;\n result = entities;\n }\n if (bindings && result) {\n const records = Array.isArray(result) ? result : [result];\n if (records.length > 0) {\n const merged: EntityRow & EntityRow[] = Object.assign([...records], records[0]);\n bindings[fetchEntityType] = merged;\n if (fetchEntityType === entityType) {\n bindings.entity = merged;\n }\n }\n }\n return result;\n } catch (err) {\n console.error(\n `[ServerEffectHandlers] fetch error for ${fetchEntityType}:`,\n err,\n );\n return null;\n }\n },\n\n ref: async (refEntityType, options) => {\n // `ref` = `fetch` for mock/dev runtimes; real server uses the same\n // underlying persistence read, the difference (reactive subscription\n // vs one-shot) is a render-layer concern.\n return handlers.fetch!(refEntityType, options);\n },\n\n deref: async (derefEntityType, options) => {\n try {\n let result: EntityRow | EntityRow[] | null = null;\n if (options?.id) {\n const entity = await persistence.getById(derefEntityType, options.id);\n if (entity) {\n if (fetchedData) fetchedData[derefEntityType] = [entity];\n result = entity;\n }\n } else {\n const entities = await persistence.list(derefEntityType);\n if (fetchedData) fetchedData[derefEntityType] = entities;\n result = entities;\n }\n if (bindings && result) {\n const records = Array.isArray(result) ? result : [result];\n if (records.length > 0) {\n const merged: EntityRow & EntityRow[] = Object.assign([...records], records[0]);\n bindings[derefEntityType] = merged;\n if (derefEntityType === entityType) {\n bindings.entity = merged;\n }\n }\n }\n record({\n effect: \"deref\",\n entityType: derefEntityType,\n success: true,\n });\n return result;\n } catch (err) {\n record({\n effect: \"deref\",\n entityType: derefEntityType,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n swap: async (swapEntityType, swapEntityId, transform) => {\n try {\n const current = await persistence.getById(swapEntityType, swapEntityId);\n if (!current) {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: `Entity ${swapEntityType}/${swapEntityId} not found`,\n });\n return null;\n }\n const ctx = createContextFromBindings(\n { current, entity: bindings?.entity, payload: bindings?.payload },\n false,\n );\n let newData: EntityRow;\n if (Array.isArray(transform)) {\n const evalResult = evaluate(transform as SExpr, ctx);\n if (\n evalResult &&\n typeof evalResult === \"object\" &&\n !Array.isArray(evalResult)\n ) {\n newData = evalResult as EntityRow;\n } else {\n newData = current;\n }\n } else if (typeof transform === \"object\" && transform !== null) {\n newData = { ...current, ...transform };\n } else {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: \"swap! transform must be an S-expression or object\",\n });\n return null;\n }\n await persistence.update(swapEntityType, swapEntityId, newData);\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n data: { id: swapEntityId, ...newData },\n success: true,\n });\n return newData;\n } catch (err) {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n watch: (_watchEntityType: string) => {\n // watch is a server-only reactive subscription. In the browser mock\n // runtime there is no long-lived observation — every render already\n // re-reads the persistence snapshot, so this is a no-op.\n },\n\n atomic: async (atomicEffects) => {\n const atomicExecutor = new EffectExecutor({\n handlers,\n bindings: bindings ?? ({} as BindingContext),\n context:\n context ?? ({\n traitName: \"atomic\",\n state: \"unknown\",\n transition: \"unknown\",\n } as EffectContext),\n });\n try {\n await atomicExecutor.executeAll(atomicEffects as unknown[]);\n record({ effect: \"atomic\", success: true });\n } catch (err) {\n record({\n effect: \"atomic\",\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n };\n\n return handlers;\n}\n","/**\n * PayloadValidator - Cross-Trait Payload Shape Validation (RCG-10)\n *\n * Validates that listener `payloadMapping` references match the emitter's\n * payload field names. Catches mismatches like `@payload.task_id` when the\n * emitter defines `taskId`.\n *\n * @packageDocumentation\n */\n\nimport type { TraitDefinition, EventPayload } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Emit declaration from a trait.\n */\ninterface EmitDeclaration {\n event: string;\n payloadSchema?: Array<{ name: string; type?: string }>;\n}\n\n/**\n * Payload validation error.\n */\nexport interface PayloadMismatch {\n /** Listening trait name */\n listenerTrait: string;\n /** Emitting trait name */\n emitterTrait: string;\n /** Event name */\n event: string;\n /** The payload field referenced in the listener's payloadMapping */\n referencedField: string;\n /** Available fields from the emitter's payload declaration */\n availableFields: string[];\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate that all listener payloadMapping references match emitter payload fields.\n *\n * @param traits - All trait definitions in the schema\n * @param emits - Emit declarations per trait (traitName → EmitDeclaration[])\n * @returns Array of payload mismatches (empty if all valid)\n *\n * @example\n * ```ts\n * const mismatches = validatePayloadShapes(traits, emitsMap);\n * for (const m of mismatches) {\n * console.warn(\n * `Trait \"${m.listenerTrait}\" references @payload.${m.referencedField} ` +\n * `for event \"${m.event}\" but emitter \"${m.emitterTrait}\" only declares: ` +\n * `${m.availableFields.join(', ')}`\n * );\n * }\n * ```\n */\nexport function validatePayloadShapes(\n traits: TraitDefinition[],\n emits: Map<string, EmitDeclaration[]>\n): PayloadMismatch[] {\n const mismatches: PayloadMismatch[] = [];\n\n // Build event→emitter lookup: event name → { traitName, payload fields }\n const emitIndex = new Map<string, { traitName: string; fields: string[] }>();\n for (const [traitName, declarations] of emits) {\n for (const decl of declarations) {\n const fields = decl.payloadSchema?.map((p) => p.name) ?? [];\n emitIndex.set(decl.event, { traitName, fields });\n }\n }\n\n // Check each listener's payloadMapping references\n for (const trait of traits) {\n if (!trait.listens) continue;\n\n for (const listener of trait.listens) {\n const emitter = emitIndex.get(listener.event);\n if (!emitter) continue; // No emitter found — separate validation concern\n\n if (!listener.payloadMapping) continue;\n\n // Extract @payload.X references from payloadMapping values\n const payloadRefs = extractPayloadReferences(listener.payloadMapping);\n\n for (const ref of payloadRefs) {\n if (!emitter.fields.includes(ref)) {\n mismatches.push({\n listenerTrait: trait.name,\n emitterTrait: emitter.traitName,\n event: listener.event,\n referencedField: ref,\n availableFields: emitter.fields,\n });\n }\n }\n }\n }\n\n return mismatches;\n}\n\n/**\n * Extract payload field references from a payloadMapping object.\n * Finds all `@payload.fieldName` patterns and returns the field names.\n */\nfunction extractPayloadReferences(mapping: EventPayload): string[] {\n const refs: string[] = [];\n\n function collect(value: unknown): void {\n if (typeof value === 'string') {\n const match = value.match(/^@payload\\.(\\w+)$/);\n if (match) {\n refs.push(match[1]);\n }\n } else if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n value.forEach(collect);\n } else {\n Object.values(value as EventPayload).forEach(collect);\n }\n }\n }\n\n Object.values(mapping).forEach(collect);\n return [...new Set(refs)];\n}\n\n/**\n * Build emit declarations map from trait definitions.\n * Extracts emits from transitions that use the `emit` effect.\n *\n * Note: This is a heuristic — it parses emit effects from transitions.\n * For full accuracy, the schema should include explicit `emits` declarations.\n */\nexport function buildEmitsFromTraits(\n traits: TraitDefinition[],\n explicitEmits?: Map<string, EmitDeclaration[]>\n): Map<string, EmitDeclaration[]> {\n // Start with explicit emits if provided\n const result = new Map<string, EmitDeclaration[]>(explicitEmits ?? []);\n\n for (const trait of traits) {\n if (result.has(trait.name)) continue; // Explicit declarations take precedence\n\n const emitDecls: EmitDeclaration[] = [];\n for (const transition of trait.transitions) {\n if (!transition.effects) continue;\n\n for (const effect of transition.effects) {\n if (!Array.isArray(effect)) continue;\n if (effect[0] === 'emit' && typeof effect[1] === 'string') {\n const event = effect[1] as string;\n // Payload value at the emit call site — used to\n // infer a `payloadSchema` from the runtime literal\n // when an explicit declaration isn't supplied.\n const payloadObj = effect[2] as EventPayload | undefined;\n const payloadSchema = payloadObj\n ? Object.keys(payloadObj).map((name) => ({ name }))\n : undefined;\n\n // Avoid duplicates\n if (!emitDecls.some((d) => d.event === event)) {\n emitDecls.push({ event, payloadSchema });\n }\n }\n }\n }\n\n if (emitDecls.length > 0) {\n result.set(trait.name, emitDecls);\n }\n }\n\n return result;\n}\n","/**\n * Composition Module\n *\n * Runtime-side TypeScript composition layer for behavior/* operators.\n *\n * Composition is normally a compile-time concept, evaluated by the Rust\n * compiler pass before code generation. The runtime ships an equivalent\n * TypeScript implementation so dev-mode hot reload, agent-driven dynamic\n * composition, and the legacy `composeBehaviors()` callers all have a\n * usable in-process implementation. The handlers are wired into\n * `EffectExecutor` as optional handlers (`composeBehaviors`,\n * `applyEventWiring`, `detectLayoutStrategy`, `pipeBehaviors`) so\n * consumers that do not need composition pay no cost.\n *\n * @packageDocumentation\n */\n\n// Compose behaviors (main entry point)\nexport {\n type ComposeBehaviorsInput,\n type ComposeBehaviorsResult,\n composeBehaviors,\n} from './compose-behaviors.js';\n\n// Event wiring\nexport { type EventWiringEntry, applyEventWiring } from './event-wiring.js';\n\n// Layout strategy detection\nexport { type LayoutStrategy, detectLayoutStrategy } from './layout-strategy.js';\n\n// Pipe (left-to-right behavior pipeline)\nexport { type PipeStep, pipeBehaviors } from './pipe.js';\n","/**\n * Event Wiring\n *\n * Applies cross-orbital event wiring to orbital definitions.\n * Adds emits/listens declarations to traits so they can communicate\n * across orbital boundaries.\n *\n * @packageDocumentation\n */\n\nimport type {\n OrbitalDefinition,\n Trait,\n TraitEventContract,\n TraitEventListener,\n} from '@almadar/core';\nimport { isInlineTrait } from '@almadar/core';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A single event wiring entry connecting two traits across orbitals.\n */\nexport interface EventWiringEntry {\n /** Source trait name or orbital name */\n from: string;\n /** Event name (UPPER_SNAKE_CASE) */\n event: string;\n /** Target trait name or orbital name */\n to: string;\n /** Event to trigger on the listener side */\n triggers: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Find a trait by name across all orbitals.\n * Only inline traits can be mutated; string/ref traits are skipped.\n * Returns the inline Trait object if found, or null.\n */\nfunction findInlineTrait(\n orbitals: OrbitalDefinition[],\n name: string,\n): Trait | null {\n for (const orbital of orbitals) {\n for (const traitRef of orbital.traits) {\n if (isInlineTrait(traitRef) && traitRef.name === name) {\n return traitRef;\n }\n }\n }\n return null;\n}\n\n/**\n * Check if an emit already exists in the list.\n * @internal\n */\nfunction hasEmit(emits: TraitEventContract[], event: string): boolean {\n return emits.some((e) => e.event === event);\n}\n\n/**\n * Check if a listen already exists in the list.\n * @internal\n */\nfunction hasListen(\n listens: TraitEventListener[],\n event: string,\n triggers: string,\n): boolean {\n return listens.some((l) => l.event === event && l.triggers === triggers);\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Apply event wiring to orbital definitions.\n *\n * For each wiring entry:\n * 1. Find the source trait and add an external emit (if not already present)\n * 2. Find the target trait and add an external listen (if not already present)\n *\n * Returns a new array of orbitals with wiring applied (deep-cloned).\n */\nexport function applyEventWiring(\n orbitals: OrbitalDefinition[],\n wiring: EventWiringEntry[],\n): OrbitalDefinition[] {\n // Deep clone to avoid mutating input\n const cloned: OrbitalDefinition[] = JSON.parse(\n JSON.stringify(orbitals),\n ) as OrbitalDefinition[];\n\n for (const entry of wiring) {\n // Wire the source: add emit\n const sourceTrait = findInlineTrait(cloned, entry.from);\n if (sourceTrait) {\n if (!sourceTrait.emits) {\n sourceTrait.emits = [];\n }\n if (!hasEmit(sourceTrait.emits, entry.event)) {\n sourceTrait.emits.push({\n event: entry.event,\n scope: 'external',\n });\n }\n }\n\n // Wire the target: add listen\n const targetTrait = findInlineTrait(cloned, entry.to);\n if (targetTrait) {\n if (!targetTrait.listens) {\n targetTrait.listens = [];\n }\n if (!hasListen(targetTrait.listens, entry.event, entry.triggers)) {\n targetTrait.listens.push({\n event: entry.event,\n triggers: entry.triggers,\n scope: 'external',\n });\n }\n }\n }\n\n return cloned;\n}\n","/**\n * Layout Strategy Detection\n *\n * Auto-detects the best layout strategy for a composed application\n * based on the number of orbitals and their event wiring topology.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition } from '@almadar/core';\nimport type { EventWiringEntry } from './event-wiring.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Layout strategy for the composed application.\n *\n * - 'single': One orbital, one page\n * - 'tabs': 2-4 orbitals with no sequential chain\n * - 'sidebar': 5+ orbitals (navigation-heavy)\n * - 'dashboard': Single page with all orbitals visible\n * - 'wizard-flow': Sequential event chain detected (A -> B -> C)\n */\nexport type LayoutStrategy =\n | 'sidebar'\n | 'tabs'\n | 'dashboard'\n | 'wizard-flow'\n | 'single';\n\n// ============================================================================\n// Chain Detection\n// ============================================================================\n\n/**\n * Detect whether the event wiring forms a sequential chain.\n *\n * A sequential chain exists when orbital A's `from` feeds into B's `to`,\n * and B's `from` feeds into C's `to`, forming A -> B -> C.\n *\n * We build a directed graph from wiring entries and look for a chain\n * that covers 3+ nodes (the minimum for a meaningful wizard flow).\n */\nfunction hasSequentialChain(wiring: EventWiringEntry[]): boolean {\n if (wiring.length < 2) {\n return false;\n }\n\n // Build adjacency: from -> Set<to>\n const adjacency = new Map<string, Set<string>>();\n const allTargets = new Set<string>();\n\n for (const entry of wiring) {\n let targets = adjacency.get(entry.from);\n if (!targets) {\n targets = new Set<string>();\n adjacency.set(entry.from, targets);\n }\n targets.add(entry.to);\n allTargets.add(entry.to);\n }\n\n // Find roots (nodes that are sources but never targets)\n const roots: string[] = [];\n for (const from of adjacency.keys()) {\n if (!allTargets.has(from)) {\n roots.push(from);\n }\n }\n\n // If no clear root, try all sources\n const starts = roots.length > 0 ? roots : [...adjacency.keys()];\n\n // Walk from each start and measure chain length\n for (const start of starts) {\n let current = start;\n let length = 1;\n const visited = new Set<string>([current]);\n\n while (true) {\n const nexts = adjacency.get(current);\n if (!nexts || nexts.size === 0) break;\n\n // Follow the first unvisited successor (linear chain)\n let advanced = false;\n for (const next of nexts) {\n if (!visited.has(next)) {\n visited.add(next);\n current = next;\n length++;\n advanced = true;\n break;\n }\n }\n\n if (!advanced) break;\n }\n\n // A chain of 3+ nodes qualifies as wizard-flow\n if (length >= 3) {\n return true;\n }\n }\n\n return false;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Detect the best layout strategy based on orbital count and event wiring.\n *\n * Heuristic:\n * 1. Sequential event chain detected -> 'wizard-flow'\n * 2. 1 orbital -> 'single'\n * 3. 2-4 orbitals -> 'tabs'\n * 4. 5+ orbitals -> 'sidebar'\n */\nexport function detectLayoutStrategy(\n orbitals: OrbitalDefinition[],\n eventWiring?: EventWiringEntry[],\n): LayoutStrategy {\n // Check for sequential chain first (takes priority)\n if (eventWiring && eventWiring.length > 0 && hasSequentialChain(eventWiring)) {\n return 'wizard-flow';\n }\n\n const count = orbitals.length;\n\n if (count <= 1) {\n return 'single';\n }\n\n if (count <= 4) {\n return 'tabs';\n }\n\n return 'sidebar';\n}\n","/**\n * Compose Behaviors\n *\n * Main entry point for composing multiple orbital definitions into\n * a single OrbitalSchema application. Handles event wiring, layout\n * strategy detection, and page generation.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition, OrbitalSchema, Page } from '@almadar/core';\nimport type { EventWiringEntry } from './event-wiring.js';\nimport { applyEventWiring } from './event-wiring.js';\nimport type { LayoutStrategy } from './layout-strategy.js';\nimport { detectLayoutStrategy } from './layout-strategy.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Input for composing behaviors into an application.\n */\nexport interface ComposeBehaviorsInput {\n /** Application name */\n appName: string;\n /** Orbital definitions to compose */\n orbitals: OrbitalDefinition[];\n /** Layout strategy override, or 'auto' to detect */\n layoutStrategy?: LayoutStrategy | 'auto';\n /** Cross-orbital event wiring */\n eventWiring?: EventWiringEntry[];\n /** Optional entity name mappings (original -> renamed) */\n entityMappings?: Record<string, string>;\n}\n\n/**\n * Result of composing behaviors.\n */\nexport interface ComposeBehaviorsResult {\n /** The composed OrbitalSchema */\n schema: OrbitalSchema;\n /** Layout metadata */\n layout: { strategy: LayoutStrategy; pageCount: number };\n /** Wiring metadata */\n wiring: { connections: number };\n}\n\n// ============================================================================\n// Page Generation\n// ============================================================================\n\nfunction toKebabCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Generate pages for each orbital based on the layout strategy.\n *\n * For strategies that produce one page per orbital (sidebar, tabs, wizard-flow),\n * each orbital gets a page at `/<kebab-name>` with `isInitial` on the first.\n *\n * For 'dashboard', all orbitals share a single page.\n * For 'single', the lone orbital gets a single root page.\n */\nfunction generatePages(\n orbitals: OrbitalDefinition[],\n strategy: LayoutStrategy,\n): Page[] {\n switch (strategy) {\n case 'single': {\n const orbital = orbitals[0];\n const name = orbital?.name ?? 'Main';\n return [\n {\n name: `${name}Page`,\n path: '/',\n isInitial: true,\n primaryEntity: getEntityName(orbital),\n },\n ];\n }\n\n case 'dashboard': {\n return [\n {\n name: 'DashboardPage',\n path: '/',\n viewType: 'dashboard',\n isInitial: true,\n },\n ];\n }\n\n case 'sidebar':\n case 'tabs':\n case 'wizard-flow': {\n return orbitals.map((orbital, index) => ({\n name: `${orbital.name}Page`,\n path: index === 0 ? '/' : `/${toKebabCase(orbital.name)}`,\n isInitial: index === 0,\n primaryEntity: getEntityName(orbital),\n }));\n }\n }\n}\n\n/**\n * Extract entity name from an orbital definition.\n * Handles both inline entities and string references.\n */\nfunction getEntityName(orbital: OrbitalDefinition | undefined): string | undefined {\n if (!orbital) return undefined;\n const entity = orbital.entity;\n if (typeof entity === 'string') {\n // Reference like \"Alias.entity\" - extract the alias as entity name\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Compose multiple orbital definitions into a single application schema.\n *\n * Steps:\n * 1. Apply event wiring (adds emits/listens to traits)\n * 2. Detect or use provided layout strategy\n * 3. Generate pages based on the strategy\n * 4. Build the final OrbitalSchema\n */\nexport function composeBehaviors(\n input: ComposeBehaviorsInput,\n): ComposeBehaviorsResult {\n const {\n appName,\n orbitals: rawOrbitals,\n layoutStrategy: strategyInput,\n eventWiring,\n } = input;\n\n // Step 1: Apply event wiring\n const wiredOrbitals =\n eventWiring && eventWiring.length > 0\n ? applyEventWiring(rawOrbitals, eventWiring)\n : rawOrbitals;\n\n // Step 2: Determine layout strategy\n const strategy: LayoutStrategy =\n !strategyInput || strategyInput === 'auto'\n ? detectLayoutStrategy(wiredOrbitals, eventWiring)\n : strategyInput;\n\n // Step 3: Generate pages\n const pages = generatePages(wiredOrbitals, strategy);\n\n // Step 4: Assign generated pages to orbitals (merge, don't replace existing)\n const orbitalsWithPages = wiredOrbitals.map((orbital, index) => {\n // If the orbital already has pages, keep them\n if (orbital.pages && orbital.pages.length > 0) {\n return orbital;\n }\n\n // Assign the generated page for this orbital\n const page = strategy === 'dashboard' || strategy === 'single'\n ? pages[0]\n : pages[index];\n\n return {\n ...orbital,\n pages: page ? [page] : [],\n };\n });\n\n // Step 5: Build the schema\n const schema: OrbitalSchema = {\n name: appName,\n version: '1.0.0',\n orbitals: orbitalsWithPages,\n };\n\n return {\n schema,\n layout: {\n strategy,\n pageCount: pages.length,\n },\n wiring: {\n connections: eventWiring?.length ?? 0,\n },\n };\n}\n","/**\n * Pipe Behaviors\n *\n * Left-to-right composition. Each step receives the previous result as its\n * first argument and returns the value handed to the next step.\n *\n * @packageDocumentation\n */\n\n/**\n * A single step in a behavior pipeline.\n */\nexport type PipeStep<I, O> = (input: I) => O;\n\n/**\n * Apply a series of transformation steps to a seed value, left to right.\n * Each step receives the previous step's output as its first argument.\n *\n * @example\n * ```ts\n * pipeBehaviors(1, (n) => n + 1, (n) => n * 10); // -> 20\n * ```\n */\nexport function pipeBehaviors<T>(\n seed: T,\n ...steps: Array<PipeStep<unknown, unknown>>\n): unknown {\n let current: unknown = seed;\n for (const step of steps) {\n current = step(current);\n }\n return current;\n}\n"]}
1
+ {"version":3,"sources":["../src/ClientEffectHandlers.ts","../src/ServerEffectHandlers.ts","../src/composition/index.ts","../src/composition/event-wiring.ts","../src/composition/layout-strategy.ts","../src/composition/compose-behaviors.ts","../src/composition/pipe.ts"],"names":[],"mappings":";;;;;;;AAsEO,SAAS,2BACZ,OAAA,EACc;AACd,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,QAAO,GAAI,OAAA;AAEnD,EAAA,OAAO;AAAA,IACH,IAAA,EAAM,CAAC,KAAA,EAAe,OAAA,KAA2B;AAQ7C,MAAA,MAAM,gBAAgB,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,GAAI,KAAA,GAAQ,MAAM,KAAK,CAAA,CAAA;AACnE,MAAA,QAAA,CAAS,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IACxC,CAAA;AAAA,IAEA,SAAS,YAAY;AACjB,MAAA,OAAA,CAAQ,KAAK,uEAAuE,CAAA;AAAA,IACxF,CAAA;AAAA,IAEA,KAAK,MAAM;AACP,MAAA,OAAA,CAAQ,KAAK,mEAAmE,CAAA;AAAA,IACpF,CAAA;AAAA,IAEA,aAAa,YAAY;AACrB,MAAA,OAAA,CAAQ,KAAK,2EAA2E,CAAA;AACxF,MAAA,OAAO,EAAC;AAAA,IACZ,CAAA;AAAA,IAEA,QAAA,EAAU,CAAC,IAAA,EAAc,OAAA,EAAkB,KAAA,KAAyB;AAChE,MAAA,IAAI,YAAY,IAAA,EAAM;AAClB,QAAA,UAAA,CAAW,UAAU,IAAI,CAAA;AACzB,QAAA;AAAA,MACJ;AACA,MAAA,UAAA,CAAW,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AAAA,IAC9C,CAAA;AAAA,IAEA,QAAA,EAAU,QAAA,KAAa,CAAC,IAAA,KAAiB;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK,yDAAyD,IAAI,CAAA;AAAA,IAC9E,CAAA,CAAA;AAAA,IAEA,MAAA,EAAQ,MAAA,KAAW,CAAC,GAAA,EAAa,IAAA,KAAkB;AAC/C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,IAAI,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA;AAAA,IAC/D,CAAA;AAAA,GACJ;AACJ;ACzFA,IAAM,SAAA,GAAY,aAAa,yBAAyB,CAAA;AA8FjD,SAAS,2BACd,IAAA,EACgB;AAChB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,EAAa,mBAAA;AAAA,IACb;AAAA,GACF,GAAI,IAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAoC;AAClD,IAAA,aAAA,EAAe,KAAK,KAAK,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,QAAA,GAA2B;AAAA,IAC/B,IAAA,EAAM,CAAC,KAAA,EAAO,YAAA,EAAc,UAAA,KAAe;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAA,EAAI,YAAY,CAAA;AAAA,MAClE;AACA,MAAA,MAAM,QAAQ,UAAA,IAAc,MAAA;AAC5B,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,YAAA,EAAc,KAAK,CAAA;AACxC,MAAA,aAAA,EAAe,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,cAAc,CAAA;AACpD,MAAA,SAAA,CAAU,MAAM,WAAA,EAAa;AAAA,QAC3B,KAAA;AAAA,QACA,wBAAwB,aAAA,EAAe,MAAA;AAAA,QACvC,aAAa,KAAA,EAAO,KAAA;AAAA,QACpB,eAAe,KAAA,EAAO,OAAA;AAAA,QACtB,oBAAoB,aAAA,KAAkB;AAAA,OACvC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,GAAA,EAAK,OAAO,QAAA,EAAU,KAAA,EAAO,KAAA,KAAU;AACrC,MAAA,MAAM,KAAK,QAAA,IAAY,QAAA;AACvB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,CAAY,OAAO,UAAA,EAAY,EAAA,EAAI,EAAE,CAAC,KAAK,GAAG,KAAA,EAAoB,CAAA;AACxE,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,KAAA;AAAA,UACR,UAAA;AAAA,UACA,IAAA,EAAM,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,UACzB,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,KAAA;AAAA,UACR,UAAA;AAAA,UACA,IAAA,EAAM,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,UACzB,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IAEA,OAAA,EAAS,OAAO,MAAA,EAAQ,gBAAA,EAAkB,IAAA,KAAS;AACjD,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,MAAM,aAAc,IAAA,EAAiD,UAAA;AACrE,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACzD,UAAA,MAAA,CAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,MAAA,EAAQ,OAAA;AAAA,YACR,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACR,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,MAAM,eAA0B,EAAC;AACjC,QAAA,MAAM,YAAuB,EAAC;AAC9B,QAAA,IAAI,WAAA,GAAc,KAAA;AAClB,QAAA,IAAI,UAAA,GAAa,EAAA;AACjB,QAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,UAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,IAAK,EAAA,CAAG,SAAS,CAAA,EAAG;AACvC,YAAA,WAAA,GAAc,IAAA;AACd,YAAA,UAAA,GAAa,CAAA,gCAAA,EAAmC,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAA;AAClE,YAAA;AAAA,UACF;AACA,UAAA,MAAM,CAAC,QAAA,EAAU,YAAA,EAAc,GAAG,MAAM,CAAA,GAAI,EAAA;AAK5C,UAAA,IAAI;AACF,YAAA,QAAQ,QAAA;AAAU,cAChB,KAAK,QAAA,EAAU;AACb,gBAAA,MAAM,UAAA,GAAc,MAAA,CAAO,CAAC,CAAA,IAAoB,EAAC;AACjD,gBAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAM,GAAI,MAAM,WAAA,CAAY,MAAA;AAAA,kBACtC,YAAA;AAAA,kBACA;AAAA,iBACF;AACA,gBAAA,YAAA,CAAa,IAAA,CAAK;AAAA,kBAChB,MAAA,EAAQ,QAAA;AAAA,kBACR,UAAA,EAAY,YAAA;AAAA,kBACZ,EAAA,EAAI,KAAA;AAAA,kBACJ,GAAG;AAAA,iBACJ,CAAA;AACD,gBAAA,SAAA,CAAU,IAAA,CAAK;AAAA,kBACb,MAAA,EAAQ,QAAA;AAAA,kBACR,UAAA,EAAY,YAAA;AAAA,kBACZ,EAAA,EAAI;AAAA,iBACL,CAAA;AACD,gBAAA;AAAA,cACF;AAAA,cACA,KAAK,QAAA,EAAU;AACb,gBAAA,MAAM,QAAA,GAAW,OAAO,CAAC,CAAA;AACzB,gBAAA,MAAM,UAAA,GAAc,MAAA,CAAO,CAAC,CAAA,IAAoB,EAAC;AACjD,gBAAA,MAAM,WAAA,CAAY,MAAA,CAAO,YAAA,EAAc,QAAA,EAAU,UAAU,CAAA;AAC3D,gBAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,OAAA,CAAQ,cAAc,QAAQ,CAAA;AAChE,gBAAA,YAAA,CAAa,IAAA,CAAK;AAAA,kBAChB,MAAA,EAAQ,QAAA;AAAA,kBACR,UAAA,EAAY,YAAA;AAAA,kBACZ,EAAA,EAAI,QAAA;AAAA,kBACJ,GAAI,OAAA,IAAW;AAAA,iBAChB,CAAA;AACD,gBAAA,SAAA,CAAU,IAAA,CAAK;AAAA,kBACb,MAAA,EAAQ,QAAA;AAAA,kBACR,UAAA,EAAY,YAAA;AAAA,kBACZ,EAAA,EAAI;AAAA,iBACL,CAAA;AACD,gBAAA;AAAA,cACF;AAAA,cACA,KAAK,QAAA,EAAU;AACb,gBAAA,MAAM,QAAA,GAAW,OAAO,CAAC,CAAA;AACzB,gBAAA,MAAM,WAAA,CAAY,MAAA,CAAO,YAAA,EAAc,QAAQ,CAAA;AAC/C,gBAAA,YAAA,CAAa,IAAA,CAAK;AAAA,kBAChB,MAAA,EAAQ,QAAA;AAAA,kBACR,UAAA,EAAY,YAAA;AAAA,kBACZ,EAAA,EAAI,QAAA;AAAA,kBACJ,OAAA,EAAS;AAAA,iBACV,CAAA;AACD,gBAAA,SAAA,CAAU,IAAA,CAAK;AAAA,kBACb,MAAA,EAAQ,QAAA;AAAA,kBACR,UAAA,EAAY,YAAA;AAAA,kBACZ,EAAA,EAAI;AAAA,iBACL,CAAA;AACD,gBAAA;AAAA,cACF;AAAA,cACA;AACE,gBAAA,WAAA,GAAc,IAAA;AACd,gBAAA,UAAA,GAAa,mCAAmC,QAAQ,CAAA,CAAA;AACxD,gBAAA;AAAA;AACJ,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,WAAA,GAAc,IAAA;AACd,YAAA,UAAA,GAAa,CAAA,iBAAA,EAAoB,QAAQ,CAAA,EAAA,EAAK,YAAY,CAAA,UAAA,EACxD,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,CAAA;AACA,YAAA;AAAA,UACF;AACA,UAAA,IAAI,WAAA,EAAa;AAAA,QACnB;AACA,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,SAAA;AAAA,UACR,MAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAM;AAAA,YACJ,UAAA,EAAY,YAAA;AAAA,YACZ,gBAAgB,SAAA,CAAU,MAAA;AAAA,YAC1B,YAAY,UAAA,CAAW;AAAA,WACzB;AAAA,UACA,SAAS,CAAC,WAAA;AAAA,UACV,GAAI,WAAA,GAAc,EAAE,KAAA,EAAO,UAAA,KAAe;AAAC,SAC5C,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,gBAAA,IAAoB,UAAA;AACjC,MAAA,IAAI,UAAA;AACJ,MAAA,MAAM,UAAA,GAAA,CAAc,MAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA;AAClD,MAAA,IAAI;AACF,QAAA,QAAQ,MAAA;AAAQ,UACd,KAAK,QAAA,EAAU;AACb,YAAA,MAAM,EAAE,IAAG,GAAI,MAAM,YAAY,MAAA,CAAO,IAAA,EAAO,IAAA,IAAQ,EAAgB,CAAA;AACvE,YAAA,UAAA,GAAa,EAAE,EAAA,EAAI,GAAK,IAAA,IAAQ,EAAC,EAAiB;AAClD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,QAAA,EAAU;AACb,YAAA,MAAM,GAAA,GAAO,QAAQ,EAAC;AACtB,YAAA,MAAM,YAAA,GAAgB,IAAI,EAAA,IAA6B,QAAA;AACvD,YAAA,IAAI,YAAA,EAAc;AAChB,cAAA,MAAM,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,YAAA,EAAc,GAAG,CAAA;AAChD,cAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,OAAA,CAAQ,MAAM,YAAY,CAAA;AAC5D,cAAA,UAAA,GAAa,OAAA,IAAW,EAAE,EAAA,EAAI,YAAA,EAAc,GAAG,GAAA,EAAI;AAAA,YACrD;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,QAAA,EAAU;AACb,YAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,KAAA,CAAA;AACnD,YAAA,MAAM,WACJ,OAAO,IAAA,KAAS,YAAY,IAAA,KAAS,IAAA,GAC/B,KAAyB,EAAA,GAC3B,KAAA,CAAA;AACN,YAAA,MAAM,QAAA,GAAW,YAAY,QAAA,IAAY,QAAA;AACzC,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,MAAM,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AACvC,cAAA,UAAA,GAAa,EAAE,EAAA,EAAI,QAAA,EAAU,OAAA,EAAS,IAAA,EAAK;AAAA,YAC7C;AACA,YAAA;AAAA,UACF;AAAA;AAEF,QAAA,MAAM,SAAA,GAAA,CAAa,MAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA;AACjD,QAAA,SAAA,CAAU,MAAM,sBAAA,EAAwB;AAAA,UACtC,MAAA;AAAA,UACA,UAAA,EAAY,IAAA;AAAA,UACZ,UAAU,UAAA,EAAY,EAAA;AAAA,UACtB,UAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAO,SAAA,GAAY;AAAA,SACpB,CAAA;AACD,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,SAAA;AAAA,UACR,MAAA;AAAA,UACA,UAAA,EAAY,IAAA;AAAA,UACZ,IAAA,EAAM,UAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,SAAA,CAAU,MAAM,4BAAA,EAA8B;AAAA,UAC5C,MAAA;AAAA,UACA,UAAA,EAAY,IAAA;AAAA,UACZ,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AACD,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,SAAA;AAAA,UACR,MAAA;AAAA,UACA,UAAA,EAAY,IAAA;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IAEA,WAAA,EAAa,OAAO,OAAA,EAAS,MAAA,EAAQ,MAAA,KAAW;AAC9C,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,GAAkB,IAAA;AACtB,QAAA,IAAI,mBAAA,EAAqB;AACvB,UAAA,MAAA,GAAS,MAAM,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,QAC5D,WAAW,KAAA,EAAO;AAChB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,oDAAA,EAAuD,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,WAC1E;AAAA,QACF;AACA,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,cAAA;AAAA,UACR,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,UAC5B,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,cAAA;AAAA,UACR,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,UAC5B,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,KAAA,EAAO,OAAO,eAAA,EAAiB,OAAA,KAAY;AACzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,GAAyC,IAAA;AAC7C,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,MAAM,SAAS,MAAM,WAAA,CAAY,OAAA,CAAQ,eAAA,EAAiB,QAAQ,EAAE,CAAA;AACpE,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,IAAI,WAAA,EAAa,WAAA,CAAY,eAAe,CAAA,GAAI,CAAC,MAAM,CAAA;AACvD,YAAA,MAAA,GAAS,MAAA;AAAA,UACX;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,QAAA,GAAW,MAAM,WAAA,CAAY,IAAA,CAAK,eAAe,CAAA;AACrD,UAAA,IAAI,OAAA,EAAS,MAAA,IAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACzC,YAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,UAC1C;AACA,UAAA,IAAI,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,GAAQ,CAAA,EAAG;AACvC,YAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,UAC5C;AACA,UAAA,IAAI,WAAA,EAAa,WAAA,CAAY,eAAe,CAAA,GAAI,QAAA;AAChD,UAAA,MAAA,GAAS,QAAA;AAAA,QACX;AACA,QAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,UAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AACxD,UAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,YAAA,MAAM,MAAA,GAAkC,OAAO,MAAA,CAAO,CAAC,GAAG,OAAO,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC9E,YAAA,QAAA,CAAS,eAAe,CAAA,GAAI,MAAA;AAC5B,YAAA,IAAI,oBAAoB,UAAA,EAAY;AAClC,cAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,0CAA0C,eAAe,CAAA,CAAA,CAAA;AAAA,UACzD;AAAA,SACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,GAAA,EAAK,OAAO,aAAA,EAAe,OAAA,KAAY;AAIrC,MAAA,OAAO,QAAA,CAAS,KAAA,CAAO,aAAA,EAAe,OAAO,CAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,KAAA,EAAO,OAAO,eAAA,EAAiB,OAAA,KAAY;AACzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,GAAyC,IAAA;AAC7C,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,MAAM,SAAS,MAAM,WAAA,CAAY,OAAA,CAAQ,eAAA,EAAiB,QAAQ,EAAE,CAAA;AACpE,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,IAAI,WAAA,EAAa,WAAA,CAAY,eAAe,CAAA,GAAI,CAAC,MAAM,CAAA;AACvD,YAAA,MAAA,GAAS,MAAA;AAAA,UACX;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,IAAA,CAAK,eAAe,CAAA;AACvD,UAAA,IAAI,WAAA,EAAa,WAAA,CAAY,eAAe,CAAA,GAAI,QAAA;AAChD,UAAA,MAAA,GAAS,QAAA;AAAA,QACX;AACA,QAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,UAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AACxD,UAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,YAAA,MAAM,MAAA,GAAkC,OAAO,MAAA,CAAO,CAAC,GAAG,OAAO,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC9E,YAAA,QAAA,CAAS,eAAe,CAAA,GAAI,MAAA;AAC5B,YAAA,IAAI,oBAAoB,UAAA,EAAY;AAClC,cAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AACA,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,OAAA;AAAA,UACR,UAAA,EAAY,eAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,OAAA;AAAA,UACR,UAAA,EAAY,eAAA;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,IAAA,EAAM,OAAO,cAAA,EAAgB,YAAA,EAAc,SAAA,KAAc;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,OAAA,CAAQ,gBAAgB,YAAY,CAAA;AACtE,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAA,CAAO;AAAA,YACL,MAAA,EAAQ,MAAA;AAAA,YACR,UAAA,EAAY,cAAA;AAAA,YACZ,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,CAAA,OAAA,EAAU,cAAc,CAAA,CAAA,EAAI,YAAY,CAAA,UAAA;AAAA,WAChD,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,GAAA,GAAM,yBAAA;AAAA,UACV,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAU,MAAA,EAAQ,OAAA,EAAS,UAAU,OAAA,EAAQ;AAAA,UAChE;AAAA,SACF;AACA,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,SAAA,EAAoB,GAAG,CAAA;AACnD,UAAA,IACE,UAAA,IACA,OAAO,UAAA,KAAe,QAAA,IACtB,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EACzB;AACA,YAAA,OAAA,GAAU,UAAA;AAAA,UACZ,CAAA,MAAO;AACL,YAAA,OAAA,GAAU,OAAA;AAAA,UACZ;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,SAAA,KAAc,QAAA,IAAY,cAAc,IAAA,EAAM;AAC9D,UAAA,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,GAAG,SAAA,EAAU;AAAA,QACvC,CAAA,MAAO;AACL,UAAA,MAAA,CAAO;AAAA,YACL,MAAA,EAAQ,MAAA;AAAA,YACR,UAAA,EAAY,cAAA;AAAA,YACZ,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACR,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,WAAA,CAAY,MAAA,CAAO,cAAA,EAAgB,YAAA,EAAc,OAAO,CAAA;AAC9D,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,cAAA;AAAA,UACZ,IAAA,EAAM,EAAE,EAAA,EAAI,YAAA,EAAc,GAAG,OAAA,EAAQ;AAAA,UACrC,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,OAAO,OAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,cAAA;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,KAAA,EAAO,CAAC,gBAAA,KAA6B;AAAA,IAIrC,CAAA;AAAA,IAEA,MAAA,EAAQ,OAAO,aAAA,KAAkB;AAC/B,MAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,QACxC,QAAA;AAAA,QACA,QAAA,EAAU,YAAa,EAAC;AAAA,QACxB,SACE,OAAA,IAAY;AAAA,UACV,SAAA,EAAW,QAAA;AAAA,UACX,KAAA,EAAO,SAAA;AAAA,UACP,UAAA,EAAY;AAAA;AACd,OACH,CAAA;AACD,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,CAAe,WAAW,aAA0B,CAAA;AAC1D,QAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,MAC5C,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,QAAA;AACT;;;ACpjBA,IAAA,mBAAA,GAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AC6CA,SAAS,eAAA,CACL,UACA,IAAA,EACY;AACZ,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC5B,IAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,MAAA,EAAQ;AACnC,MAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,IAAA,EAAM;AACnD,QAAA,OAAO,QAAA;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AACA,EAAA,OAAO,IAAA;AACX;AAMA,SAAS,OAAA,CAAQ,OAA6B,KAAA,EAAwB;AAClE,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAC9C;AAMA,SAAS,SAAA,CACL,OAAA,EACA,KAAA,EACA,QAAA,EACO;AACP,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,KAAA,IAAS,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA;AAC3E;AAeO,SAAS,gBAAA,CACZ,UACA,MAAA,EACmB;AAEnB,EAAA,MAAM,SAA8B,IAAA,CAAK,KAAA;AAAA,IACrC,IAAA,CAAK,UAAU,QAAQ;AAAA,GAC3B;AAEA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAExB,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AACtD,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACpB,QAAA,WAAA,CAAY,QAAQ,EAAC;AAAA,MACzB;AACA,MAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,CAAY,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AAC1C,QAAA,WAAA,CAAY,MAAM,IAAA,CAAK;AAAA,UACnB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,KAAA,EAAO;AAAA,SACV,CAAA;AAAA,MACL;AAAA,IACJ;AAGA,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,MAAA,EAAQ,KAAA,CAAM,EAAE,CAAA;AACpD,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACtB,QAAA,WAAA,CAAY,UAAU,EAAC;AAAA,MAC3B;AACA,MAAA,IAAI,CAAC,UAAU,WAAA,CAAY,OAAA,EAAS,MAAM,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC9D,QAAA,WAAA,CAAY,QAAQ,IAAA,CAAK;AAAA,UACrB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,KAAA,EAAO;AAAA,SACV,CAAA;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAO,MAAA;AACX;;;ACxFA,SAAS,mBAAmB,MAAA,EAAqC;AAC7D,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACX;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,OAAA,uBAAc,GAAA,EAAY;AAC1B,MAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AAAA,IACrC;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AACpB,IAAA,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,IAAA,EAAK,EAAG;AACjC,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACnB;AAAA,EACJ;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA,GAAI,QAAQ,CAAC,GAAG,SAAA,CAAU,IAAA,EAAM,CAAA;AAG9D,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAY,CAAC,OAAO,CAAC,CAAA;AAEzC,IAAA,OAAO,IAAA,EAAM;AACT,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACnC,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,CAAA,EAAG;AAGhC,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,UAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,MAAA,EAAA;AACA,UAAA,QAAA,GAAW,IAAA;AACX,UAAA;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AAAA,IACnB;AAGA,IAAA,IAAI,UAAU,CAAA,EAAG;AACb,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,OAAO,KAAA;AACX;AAeO,SAAS,oBAAA,CACZ,UACA,WAAA,EACc;AAEd,EAAA,IAAI,eAAe,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,kBAAA,CAAmB,WAAW,CAAA,EAAG;AAC1E,IAAA,OAAO,aAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAEvB,EAAA,IAAI,SAAS,CAAA,EAAG;AACZ,IAAA,OAAO,QAAA;AAAA,EACX;AAEA,EAAA,IAAI,SAAS,CAAA,EAAG;AACZ,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,OAAO,SAAA;AACX;;;AC1FA,SAAS,YAAY,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CACF,QAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,WAAA,EAAY;AACrB;AAWA,SAAS,aAAA,CACL,UACA,QAAA,EACM;AACN,EAAA,QAAQ,QAAA;AAAU,IACd,KAAK,QAAA,EAAU;AACX,MAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,MAAA;AAC9B,MAAA,OAAO;AAAA,QACH;AAAA,UACI,IAAA,EAAM,GAAG,IAAI,CAAA,IAAA,CAAA;AAAA,UACb,IAAA,EAAM,GAAA;AAAA,UACN,SAAA,EAAW,IAAA;AAAA,UACX,aAAA,EAAe,cAAc,OAAO;AAAA;AACxC,OACJ;AAAA,IACJ;AAAA,IAEA,KAAK,WAAA,EAAa;AACd,MAAA,OAAO;AAAA,QACH;AAAA,UACI,IAAA,EAAM,eAAA;AAAA,UACN,IAAA,EAAM,GAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV,SAAA,EAAW;AAAA;AACf,OACJ;AAAA,IACJ;AAAA,IAEA,KAAK,SAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,aAAA,EAAe;AAChB,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,MAAW;AAAA,QACrC,IAAA,EAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,IAAA,CAAA;AAAA,QACrB,IAAA,EAAM,UAAU,CAAA,GAAI,GAAA,GAAM,IAAI,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,QACvD,WAAW,KAAA,KAAU,CAAA;AAAA,QACrB,aAAA,EAAe,cAAc,OAAO;AAAA,OACxC,CAAE,CAAA;AAAA,IACN;AAAA;AAER;AAMA,SAAS,cAAc,OAAA,EAA4D;AAC/E,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAE5B,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAClB;AAeO,SAAS,iBACZ,KAAA,EACsB;AACtB,EAAA,MAAM;AAAA,IACF,OAAA;AAAA,IACA,QAAA,EAAU,WAAA;AAAA,IACV,cAAA,EAAgB,aAAA;AAAA,IAChB;AAAA,GACJ,GAAI,KAAA;AAGJ,EAAA,MAAM,aAAA,GACF,eAAe,WAAA,CAAY,MAAA,GAAS,IAC9B,gBAAA,CAAiB,WAAA,EAAa,WAAW,CAAA,GACzC,WAAA;AAGV,EAAA,MAAM,QAAA,GACF,CAAC,aAAA,IAAiB,aAAA,KAAkB,SAC9B,oBAAA,CAAqB,aAAA,EAAe,WAAW,CAAA,GAC/C,aAAA;AAGV,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,aAAA,EAAe,QAAQ,CAAA;AAGnD,EAAA,MAAM,iBAAA,GAAoB,aAAA,CAAc,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAE5D,IAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,OAAA;AAAA,IACX;AAGA,IAAA,MAAM,IAAA,GAAO,aAAa,WAAA,IAAe,QAAA,KAAa,WAChD,KAAA,CAAM,CAAC,CAAA,GACP,KAAA,CAAM,KAAK,CAAA;AAEjB,IAAA,OAAO;AAAA,MACH,GAAG,OAAA;AAAA,MACH,KAAA,EAAO,IAAA,GAAO,CAAC,IAAI,IAAI;AAAC,KAC5B;AAAA,EACJ,CAAC,CAAA;AAGD,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC1B,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACd;AAEA,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACJ,QAAA;AAAA,MACA,WAAW,KAAA,CAAM;AAAA,KACrB;AAAA,IACA,MAAA,EAAQ;AAAA,MACJ,WAAA,EAAa,aAAa,MAAA,IAAU;AAAA;AACxC,GACJ;AACJ;;;AC9KO,SAAS,aAAA,CACZ,SACG,KAAA,EACI;AACP,EAAA,IAAI,OAAA,GAAmB,IAAA;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,OAAA,GAAU,KAAK,OAAO,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,OAAA;AACX","file":"index.js","sourcesContent":["/**\n * Client Effect Handlers Factory\n *\n * Creates the standard effect handler set for client-side trait execution.\n * Platform-agnostic — works with any UI framework that provides the required interfaces.\n *\n * @packageDocumentation\n */\n\nimport type { EffectHandlers, EventPayload, PatternProps } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal event bus interface required by the factory.\n */\nexport interface ClientEventBus {\n emit: (type: string, payload?: EventPayload) => void;\n}\n\n/**\n * Slot setter interface for render-ui effects.\n * The factory doesn't know about React state — it just calls this function.\n */\nexport interface SlotSetter {\n /** Accumulate a pattern into the pending slot map */\n addPattern: (slot: string, pattern: unknown, props?: PatternProps) => void;\n /** Mark a slot for clearing */\n clearSlot: (slot: string) => void;\n}\n\n/**\n * Options for creating client effect handlers.\n */\nexport interface CreateClientEffectHandlersOptions {\n /** Event bus for emit effects */\n eventBus: ClientEventBus;\n /** Slot setter for render-ui effects */\n slotSetter: SlotSetter;\n /** Navigate function for navigate effects */\n navigate?: (path: string, params?: { [key: string]: string }) => void;\n /** Notify function for notification effects */\n notify?: (message: string, type: 'success' | 'error' | 'warning' | 'info') => void;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create client-side effect handlers for trait state machine execution.\n *\n * Client handles: emit, renderUI, navigate, notify\n * Server handles: persist, set, callService (logged as warnings on client)\n *\n * @example\n * ```ts\n * const handlers = createClientEffectHandlers({\n * eventBus,\n * slotSetter: {\n * addPattern: (slot, pattern, props) => pendingSlots.get(slot)?.push({ pattern, props }),\n * clearSlot: (slot) => pendingSlots.set(slot, []),\n * },\n * navigate: (path) => router.push(path),\n * notify: (msg, type) => toast[type](msg),\n * });\n * ```\n */\nexport function createClientEffectHandlers(\n options: CreateClientEffectHandlersOptions\n): EffectHandlers {\n const { eventBus, slotSetter, navigate, notify } = options;\n\n return {\n emit: (event: string, payload?: EventPayload) => {\n // The event bus emits with shape `{ type, payload, source }` per\n // IEventBus. Subscribers read `event.payload` to get the trait-\n // supplied payload. Wrapping it again as `{ payload }` here\n // produced a doubly-nested envelope — `@payload.X` bindings on\n // the receiving render-ui then resolved to `undefined` because\n // the real keys lived one level deeper. Pass the payload through\n // directly so the subscriber sees exactly what the trait emitted.\n const prefixedEvent = event.startsWith('UI:') ? event : `UI:${event}`;\n eventBus.emit(prefixedEvent, payload);\n },\n\n persist: async () => {\n console.warn('[ClientEffectHandlers] persist is server-side only, ignored on client');\n },\n\n set: () => {\n console.warn('[ClientEffectHandlers] set is server-side only, ignored on client');\n },\n\n callService: async () => {\n console.warn('[ClientEffectHandlers] callService is server-side only, ignored on client');\n return {};\n },\n\n renderUI: (slot: string, pattern: unknown, props?: PatternProps) => {\n if (pattern === null) {\n slotSetter.clearSlot(slot);\n return;\n }\n slotSetter.addPattern(slot, pattern, props);\n },\n\n navigate: navigate ?? ((path: string) => {\n console.warn('[ClientEffectHandlers] No navigate handler, ignoring:', path);\n }),\n\n notify: notify ?? ((msg: string, type?: string) => {\n console.log(`[ClientEffectHandlers] notify (${type}):`, msg);\n }),\n };\n}\n","/**\n * ServerEffectHandlers — reusable factory for the server-side effect layer.\n *\n * Mirrors the handlers built inline in\n * `OrbitalServerRuntime.executeEffects` so both the real server runtime\n * AND the in-browser mock runtime (`@almadar/ui` OrbPreview autoMock) can\n * share the same `fetch` / `persist` / `set` / `ref` / `deref` / `swap!` /\n * `atomic` / `callService` semantics against a `PersistenceAdapter`.\n *\n * Browser-safe: only imports core + this package's browser-safe modules.\n * Does NOT import express/Node, so it is reachable from `@almadar/ui`.\n *\n * @packageDocumentation\n */\n\nimport type { EventPayload, SExpr } from \"@almadar/core\";\nimport type { PersistenceAdapter } from \"./PersistenceAdapter.js\";\nimport type {\n EffectHandlers,\n BindingContext,\n EffectContext,\n EntityRow,\n} from \"./types.js\";\nimport { EffectExecutor } from \"./EffectExecutor.js\";\nimport { createContextFromBindings } from \"./BindingResolver.js\";\nimport { evaluate } from \"@almadar/evaluator\";\nimport { createLogger } from \"./logger.js\";\n\nconst effectLog = createLogger(\"almadar:runtime:effects\");\n\n/**\n * Minimal event-bus contract the server handlers need. Narrower than the\n * full `IEventBus` so clients with a React-context bus (only `emit` is\n * relevant for effect dispatch) can hand it in without adapter code.\n */\nexport interface ServerEffectEventBus {\n emit(\n event: string,\n payload?: EventPayload,\n source?: { orbital?: string; trait?: string },\n ): void;\n}\n\n/**\n * Result entry recorded for each effect invocation. Mirrors the server\n * runtime's `EffectResult`. Callers who want telemetry pass an array that\n * the factory appends to; otherwise it's unused.\n */\nexport interface ServerEffectResult {\n effect:\n | \"set\"\n | \"persist\"\n | \"call-service\"\n | \"fetch\"\n | \"ref\"\n | \"deref\"\n | \"swap\"\n | \"atomic\";\n action?: string;\n entityType?: string;\n data?: unknown;\n success: boolean;\n error?: string;\n}\n\nexport interface CreateServerEffectHandlersOptions {\n /** Persistent store backing `fetch` / `persist` / `ref` / `deref` / `swap`. */\n persistence: PersistenceAdapter;\n /** Event bus that `emit` delegates to. Only `.emit()` is required. */\n eventBus: ServerEffectEventBus;\n /** The trait's linked entity type (used as the default for persist/set). */\n entityType: string;\n /** Current entity row id (used by `set`, `persist update/delete` fallback). */\n entityId?: string;\n /**\n * Binding object passed to inner `atomic` evaluator. When absent, atomic\n * effects still run but have no access to `@entity` / `@payload` bindings.\n */\n bindings?: BindingContext;\n /** Effect context passed to the inner `atomic` executor. */\n context?: EffectContext;\n /** Per-event result sink. Optional — telemetry only. */\n effectResults?: ServerEffectResult[];\n /**\n * Per-event fetched-data cache. `fetch` writes here so downstream UI\n * renderers can resolve `@entity` bindings from the latest load without\n * a separate round-trip.\n */\n fetchedData?: Record<string, EntityRow[]>;\n /** Per-event emit log. Optional — telemetry only. */\n emittedEvents?: Array<{ event: string; payload?: EventPayload }>;\n /** Source stamp applied to all emits. */\n source?: { orbital?: string; trait?: string };\n /** Consumer-supplied `call-service` handler. When absent, calls warn and return null. */\n callService?: (\n service: string,\n action: string,\n params: unknown,\n ) => Promise<unknown>;\n /** Verbose logging. */\n debug?: boolean;\n}\n\n/**\n * Build the full server-side effect handler set bound to a persistence\n * adapter. The returned object satisfies `EffectHandlers` and can be\n * handed directly to `EffectExecutor`.\n *\n * Scope: one handler object per transition — capture `entityId`,\n * `bindings`, `context`, and the sink arrays at build time. For a new\n * transition, call this factory again.\n *\n * Intentionally does NOT implement:\n * - `renderUI` / `notify` / `navigate` — these are client-side, provided\n * by `createClientEffectHandlers`. A mock runtime merges both handler\n * sets.\n * - `os/watch-*` observers — these are a no-op outside the server.\n * - Schema-aware relation cardinality / on-delete cascades — those live\n * in `OrbitalServerRuntime` and depend on the full registered schema.\n * Clients that need them can wrap the persist handler with their own\n * validation.\n */\nexport function createServerEffectHandlers(\n opts: CreateServerEffectHandlersOptions,\n): EffectHandlers {\n const {\n persistence,\n eventBus,\n entityType,\n entityId,\n bindings,\n context,\n effectResults,\n fetchedData,\n emittedEvents,\n source,\n callService: consumerCallService,\n debug,\n } = opts;\n\n const record = (entry: ServerEffectResult): void => {\n effectResults?.push(entry);\n };\n\n const handlers: EffectHandlers = {\n emit: (event, eventPayload, emitSource) => {\n if (debug) {\n console.log(`[ServerEffectHandlers] emit ${event}`, eventPayload);\n }\n const stamp = emitSource ?? source;\n eventBus.emit(event, eventPayload, stamp);\n emittedEvents?.push({ event, payload: eventPayload });\n effectLog.debug(\"emit:push\", {\n event,\n cumulativeEmittedCount: emittedEvents?.length,\n sourceTrait: stamp?.trait,\n sourceOrbital: stamp?.orbital,\n emittedEventsBound: emittedEvents !== undefined,\n });\n },\n\n set: async (targetId, field, value) => {\n const id = targetId || entityId;\n if (!id) return;\n try {\n await persistence.update(entityType, id, { [field]: value } as EntityRow);\n record({\n effect: \"set\",\n entityType,\n data: { id, field, value },\n success: true,\n });\n } catch (err) {\n record({\n effect: \"set\",\n entityType,\n data: { id, field, value },\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n\n persist: async (action, targetEntityType, data) => {\n if (action === \"batch\") {\n const operations = (data as { operations?: unknown[] } | undefined)?.operations;\n if (!Array.isArray(operations) || operations.length === 0) {\n record({\n effect: \"persist\",\n action: \"batch\",\n success: false,\n error: \"Batch requires a non-empty operations array\",\n });\n return;\n }\n const batchResults: unknown[] = [];\n const completed: unknown[] = [];\n let batchFailed = false;\n let batchError = \"\";\n for (const op of operations) {\n if (!Array.isArray(op) || op.length < 2) {\n batchFailed = true;\n batchError = `Invalid batch operation format: ${JSON.stringify(op)}`;\n break;\n }\n const [opAction, opEntityType, ...opRest] = op as [\n string,\n string,\n ...unknown[],\n ];\n try {\n switch (opAction) {\n case \"create\": {\n const createData = (opRest[0] as EntityRow) || ({} as EntityRow);\n const { id: newId } = await persistence.create(\n opEntityType,\n createData,\n );\n batchResults.push({\n action: \"create\",\n entityType: opEntityType,\n id: newId,\n ...createData,\n });\n completed.push({\n action: \"create\",\n entityType: opEntityType,\n id: newId,\n });\n break;\n }\n case \"update\": {\n const updateId = opRest[0] as string;\n const updateData = (opRest[1] as EntityRow) || ({} as EntityRow);\n await persistence.update(opEntityType, updateId, updateData);\n const updated = await persistence.getById(opEntityType, updateId);\n batchResults.push({\n action: \"update\",\n entityType: opEntityType,\n id: updateId,\n ...(updated || updateData),\n });\n completed.push({\n action: \"update\",\n entityType: opEntityType,\n id: updateId,\n });\n break;\n }\n case \"delete\": {\n const deleteId = opRest[0] as string;\n await persistence.delete(opEntityType, deleteId);\n batchResults.push({\n action: \"delete\",\n entityType: opEntityType,\n id: deleteId,\n deleted: true,\n });\n completed.push({\n action: \"delete\",\n entityType: opEntityType,\n id: deleteId,\n });\n break;\n }\n default:\n batchFailed = true;\n batchError = `Unknown batch operation action: ${opAction}`;\n break;\n }\n } catch (err) {\n batchFailed = true;\n batchError = `Batch operation [${opAction}, ${opEntityType}] failed: ${\n err instanceof Error ? err.message : String(err)\n }`;\n break;\n }\n if (batchFailed) break;\n }\n record({\n effect: \"persist\",\n action: \"batch\",\n data: {\n operations: batchResults,\n completedCount: completed.length,\n totalCount: operations.length,\n },\n success: !batchFailed,\n ...(batchFailed ? { error: batchError } : {}),\n });\n return;\n }\n\n const type = targetEntityType || entityType;\n let resultData: EntityRow | undefined;\n const sizeBefore = (await persistence.list(type)).length;\n try {\n switch (action) {\n case \"create\": {\n const { id } = await persistence.create(type, (data ?? {}) as EntityRow);\n resultData = { id, ...((data ?? {}) as EntityRow) };\n break;\n }\n case \"update\": {\n const row = (data ?? {}) as EntityRow;\n const idOrFallback = (row.id as string | undefined) ?? entityId;\n if (idOrFallback) {\n await persistence.update(type, idOrFallback, row);\n const updated = await persistence.getById(type, idOrFallback);\n resultData = updated ?? { id: idOrFallback, ...row };\n }\n break;\n }\n case \"delete\": {\n const directId = typeof data === \"string\" ? data : undefined;\n const nestedId =\n typeof data === \"object\" && data !== null\n ? ((data as { id?: string }).id)\n : undefined;\n const deleteId = directId ?? nestedId ?? entityId;\n if (deleteId) {\n await persistence.delete(type, deleteId);\n resultData = { id: deleteId, deleted: true } as EntityRow;\n }\n break;\n }\n }\n const sizeAfter = (await persistence.list(type)).length;\n effectLog.debug(\"persist:store-mutate\", {\n action,\n entityType: type,\n resultId: resultData?.id as string | undefined,\n sizeBefore,\n sizeAfter,\n delta: sizeAfter - sizeBefore,\n });\n record({\n effect: \"persist\",\n action,\n entityType: type,\n data: resultData,\n success: true,\n });\n } catch (err) {\n effectLog.error(\"persist:store-mutate-error\", {\n action,\n entityType: type,\n error: err instanceof Error ? err.message : String(err),\n });\n record({\n effect: \"persist\",\n action,\n entityType: type,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n\n callService: async (service, action, params) => {\n try {\n let result: unknown = null;\n if (consumerCallService) {\n result = await consumerCallService(service, action, params);\n } else if (debug) {\n console.warn(\n `[ServerEffectHandlers] call-service not configured: ${service}.${action}`,\n );\n }\n record({\n effect: \"call-service\",\n action: `${service}.${action}`,\n data: result,\n success: true,\n });\n return result;\n } catch (err) {\n record({\n effect: \"call-service\",\n action: `${service}.${action}`,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n fetch: async (fetchEntityType, options) => {\n try {\n let result: EntityRow | EntityRow[] | null = null;\n if (options?.id) {\n const entity = await persistence.getById(fetchEntityType, options.id);\n if (entity) {\n if (fetchedData) fetchedData[fetchEntityType] = [entity];\n result = entity;\n }\n } else {\n let entities = await persistence.list(fetchEntityType);\n if (options?.offset && options.offset > 0) {\n entities = entities.slice(options.offset);\n }\n if (options?.limit && options.limit > 0) {\n entities = entities.slice(0, options.limit);\n }\n if (fetchedData) fetchedData[fetchEntityType] = entities;\n result = entities;\n }\n if (bindings && result) {\n const records = Array.isArray(result) ? result : [result];\n if (records.length > 0) {\n const merged: EntityRow & EntityRow[] = Object.assign([...records], records[0]);\n bindings[fetchEntityType] = merged;\n if (fetchEntityType === entityType) {\n bindings.entity = merged;\n }\n }\n }\n return result;\n } catch (err) {\n console.error(\n `[ServerEffectHandlers] fetch error for ${fetchEntityType}:`,\n err,\n );\n return null;\n }\n },\n\n ref: async (refEntityType, options) => {\n // `ref` = `fetch` for mock/dev runtimes; real server uses the same\n // underlying persistence read, the difference (reactive subscription\n // vs one-shot) is a render-layer concern.\n return handlers.fetch!(refEntityType, options);\n },\n\n deref: async (derefEntityType, options) => {\n try {\n let result: EntityRow | EntityRow[] | null = null;\n if (options?.id) {\n const entity = await persistence.getById(derefEntityType, options.id);\n if (entity) {\n if (fetchedData) fetchedData[derefEntityType] = [entity];\n result = entity;\n }\n } else {\n const entities = await persistence.list(derefEntityType);\n if (fetchedData) fetchedData[derefEntityType] = entities;\n result = entities;\n }\n if (bindings && result) {\n const records = Array.isArray(result) ? result : [result];\n if (records.length > 0) {\n const merged: EntityRow & EntityRow[] = Object.assign([...records], records[0]);\n bindings[derefEntityType] = merged;\n if (derefEntityType === entityType) {\n bindings.entity = merged;\n }\n }\n }\n record({\n effect: \"deref\",\n entityType: derefEntityType,\n success: true,\n });\n return result;\n } catch (err) {\n record({\n effect: \"deref\",\n entityType: derefEntityType,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n swap: async (swapEntityType, swapEntityId, transform) => {\n try {\n const current = await persistence.getById(swapEntityType, swapEntityId);\n if (!current) {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: `Entity ${swapEntityType}/${swapEntityId} not found`,\n });\n return null;\n }\n const ctx = createContextFromBindings(\n { current, entity: bindings?.entity, payload: bindings?.payload },\n false,\n );\n let newData: EntityRow;\n if (Array.isArray(transform)) {\n const evalResult = evaluate(transform as SExpr, ctx);\n if (\n evalResult &&\n typeof evalResult === \"object\" &&\n !Array.isArray(evalResult)\n ) {\n newData = evalResult as EntityRow;\n } else {\n newData = current;\n }\n } else if (typeof transform === \"object\" && transform !== null) {\n newData = { ...current, ...transform };\n } else {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: \"swap! transform must be an S-expression or object\",\n });\n return null;\n }\n await persistence.update(swapEntityType, swapEntityId, newData);\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n data: { id: swapEntityId, ...newData },\n success: true,\n });\n return newData;\n } catch (err) {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n watch: (_watchEntityType: string) => {\n // watch is a server-only reactive subscription. In the browser mock\n // runtime there is no long-lived observation — every render already\n // re-reads the persistence snapshot, so this is a no-op.\n },\n\n atomic: async (atomicEffects) => {\n const atomicExecutor = new EffectExecutor({\n handlers,\n bindings: bindings ?? ({} as BindingContext),\n context:\n context ?? ({\n traitName: \"atomic\",\n state: \"unknown\",\n transition: \"unknown\",\n } as EffectContext),\n });\n try {\n await atomicExecutor.executeAll(atomicEffects as unknown[]);\n record({ effect: \"atomic\", success: true });\n } catch (err) {\n record({\n effect: \"atomic\",\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n };\n\n return handlers;\n}\n","/**\n * Composition Module\n *\n * Runtime-side TypeScript composition layer for behavior/* operators.\n *\n * Composition is normally a compile-time concept, evaluated by the Rust\n * compiler pass before code generation. The runtime ships an equivalent\n * TypeScript implementation so dev-mode hot reload, agent-driven dynamic\n * composition, and the legacy `composeBehaviors()` callers all have a\n * usable in-process implementation. The handlers are wired into\n * `EffectExecutor` as optional handlers (`composeBehaviors`,\n * `applyEventWiring`, `detectLayoutStrategy`, `pipeBehaviors`) so\n * consumers that do not need composition pay no cost.\n *\n * @packageDocumentation\n */\n\n// Compose behaviors (main entry point)\nexport {\n type ComposeBehaviorsInput,\n type ComposeBehaviorsResult,\n composeBehaviors,\n} from './compose-behaviors.js';\n\n// Event wiring\nexport { type EventWiringEntry, applyEventWiring } from './event-wiring.js';\n\n// Layout strategy detection\nexport { type LayoutStrategy, detectLayoutStrategy } from './layout-strategy.js';\n\n// Pipe (left-to-right behavior pipeline)\nexport { type PipeStep, pipeBehaviors } from './pipe.js';\n","/**\n * Event Wiring\n *\n * Applies cross-orbital event wiring to orbital definitions.\n * Adds emits/listens declarations to traits so they can communicate\n * across orbital boundaries.\n *\n * @packageDocumentation\n */\n\nimport type {\n OrbitalDefinition,\n Trait,\n TraitEventContract,\n TraitEventListener,\n} from '@almadar/core';\nimport { isInlineTrait } from '@almadar/core';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A single event wiring entry connecting two traits across orbitals.\n */\nexport interface EventWiringEntry {\n /** Source trait name or orbital name */\n from: string;\n /** Event name (UPPER_SNAKE_CASE) */\n event: string;\n /** Target trait name or orbital name */\n to: string;\n /** Event to trigger on the listener side */\n triggers: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Find a trait by name across all orbitals.\n * Only inline traits can be mutated; string/ref traits are skipped.\n * Returns the inline Trait object if found, or null.\n */\nfunction findInlineTrait(\n orbitals: OrbitalDefinition[],\n name: string,\n): Trait | null {\n for (const orbital of orbitals) {\n for (const traitRef of orbital.traits) {\n if (isInlineTrait(traitRef) && traitRef.name === name) {\n return traitRef;\n }\n }\n }\n return null;\n}\n\n/**\n * Check if an emit already exists in the list.\n * @internal\n */\nfunction hasEmit(emits: TraitEventContract[], event: string): boolean {\n return emits.some((e) => e.event === event);\n}\n\n/**\n * Check if a listen already exists in the list.\n * @internal\n */\nfunction hasListen(\n listens: TraitEventListener[],\n event: string,\n triggers: string,\n): boolean {\n return listens.some((l) => l.event === event && l.triggers === triggers);\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Apply event wiring to orbital definitions.\n *\n * For each wiring entry:\n * 1. Find the source trait and add an external emit (if not already present)\n * 2. Find the target trait and add an external listen (if not already present)\n *\n * Returns a new array of orbitals with wiring applied (deep-cloned).\n */\nexport function applyEventWiring(\n orbitals: OrbitalDefinition[],\n wiring: EventWiringEntry[],\n): OrbitalDefinition[] {\n // Deep clone to avoid mutating input\n const cloned: OrbitalDefinition[] = JSON.parse(\n JSON.stringify(orbitals),\n ) as OrbitalDefinition[];\n\n for (const entry of wiring) {\n // Wire the source: add emit\n const sourceTrait = findInlineTrait(cloned, entry.from);\n if (sourceTrait) {\n if (!sourceTrait.emits) {\n sourceTrait.emits = [];\n }\n if (!hasEmit(sourceTrait.emits, entry.event)) {\n sourceTrait.emits.push({\n event: entry.event,\n scope: 'external',\n });\n }\n }\n\n // Wire the target: add listen\n const targetTrait = findInlineTrait(cloned, entry.to);\n if (targetTrait) {\n if (!targetTrait.listens) {\n targetTrait.listens = [];\n }\n if (!hasListen(targetTrait.listens, entry.event, entry.triggers)) {\n targetTrait.listens.push({\n event: entry.event,\n triggers: entry.triggers,\n scope: 'external',\n });\n }\n }\n }\n\n return cloned;\n}\n","/**\n * Layout Strategy Detection\n *\n * Auto-detects the best layout strategy for a composed application\n * based on the number of orbitals and their event wiring topology.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition } from '@almadar/core';\nimport type { EventWiringEntry } from './event-wiring.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Layout strategy for the composed application.\n *\n * - 'single': One orbital, one page\n * - 'tabs': 2-4 orbitals with no sequential chain\n * - 'sidebar': 5+ orbitals (navigation-heavy)\n * - 'dashboard': Single page with all orbitals visible\n * - 'wizard-flow': Sequential event chain detected (A -> B -> C)\n */\nexport type LayoutStrategy =\n | 'sidebar'\n | 'tabs'\n | 'dashboard'\n | 'wizard-flow'\n | 'single';\n\n// ============================================================================\n// Chain Detection\n// ============================================================================\n\n/**\n * Detect whether the event wiring forms a sequential chain.\n *\n * A sequential chain exists when orbital A's `from` feeds into B's `to`,\n * and B's `from` feeds into C's `to`, forming A -> B -> C.\n *\n * We build a directed graph from wiring entries and look for a chain\n * that covers 3+ nodes (the minimum for a meaningful wizard flow).\n */\nfunction hasSequentialChain(wiring: EventWiringEntry[]): boolean {\n if (wiring.length < 2) {\n return false;\n }\n\n // Build adjacency: from -> Set<to>\n const adjacency = new Map<string, Set<string>>();\n const allTargets = new Set<string>();\n\n for (const entry of wiring) {\n let targets = adjacency.get(entry.from);\n if (!targets) {\n targets = new Set<string>();\n adjacency.set(entry.from, targets);\n }\n targets.add(entry.to);\n allTargets.add(entry.to);\n }\n\n // Find roots (nodes that are sources but never targets)\n const roots: string[] = [];\n for (const from of adjacency.keys()) {\n if (!allTargets.has(from)) {\n roots.push(from);\n }\n }\n\n // If no clear root, try all sources\n const starts = roots.length > 0 ? roots : [...adjacency.keys()];\n\n // Walk from each start and measure chain length\n for (const start of starts) {\n let current = start;\n let length = 1;\n const visited = new Set<string>([current]);\n\n while (true) {\n const nexts = adjacency.get(current);\n if (!nexts || nexts.size === 0) break;\n\n // Follow the first unvisited successor (linear chain)\n let advanced = false;\n for (const next of nexts) {\n if (!visited.has(next)) {\n visited.add(next);\n current = next;\n length++;\n advanced = true;\n break;\n }\n }\n\n if (!advanced) break;\n }\n\n // A chain of 3+ nodes qualifies as wizard-flow\n if (length >= 3) {\n return true;\n }\n }\n\n return false;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Detect the best layout strategy based on orbital count and event wiring.\n *\n * Heuristic:\n * 1. Sequential event chain detected -> 'wizard-flow'\n * 2. 1 orbital -> 'single'\n * 3. 2-4 orbitals -> 'tabs'\n * 4. 5+ orbitals -> 'sidebar'\n */\nexport function detectLayoutStrategy(\n orbitals: OrbitalDefinition[],\n eventWiring?: EventWiringEntry[],\n): LayoutStrategy {\n // Check for sequential chain first (takes priority)\n if (eventWiring && eventWiring.length > 0 && hasSequentialChain(eventWiring)) {\n return 'wizard-flow';\n }\n\n const count = orbitals.length;\n\n if (count <= 1) {\n return 'single';\n }\n\n if (count <= 4) {\n return 'tabs';\n }\n\n return 'sidebar';\n}\n","/**\n * Compose Behaviors\n *\n * Main entry point for composing multiple orbital definitions into\n * a single OrbitalSchema application. Handles event wiring, layout\n * strategy detection, and page generation.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition, OrbitalSchema, Page } from '@almadar/core';\nimport type { EventWiringEntry } from './event-wiring.js';\nimport { applyEventWiring } from './event-wiring.js';\nimport type { LayoutStrategy } from './layout-strategy.js';\nimport { detectLayoutStrategy } from './layout-strategy.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Input for composing behaviors into an application.\n */\nexport interface ComposeBehaviorsInput {\n /** Application name */\n appName: string;\n /** Orbital definitions to compose */\n orbitals: OrbitalDefinition[];\n /** Layout strategy override, or 'auto' to detect */\n layoutStrategy?: LayoutStrategy | 'auto';\n /** Cross-orbital event wiring */\n eventWiring?: EventWiringEntry[];\n /** Optional entity name mappings (original -> renamed) */\n entityMappings?: Record<string, string>;\n}\n\n/**\n * Result of composing behaviors.\n */\nexport interface ComposeBehaviorsResult {\n /** The composed OrbitalSchema */\n schema: OrbitalSchema;\n /** Layout metadata */\n layout: { strategy: LayoutStrategy; pageCount: number };\n /** Wiring metadata */\n wiring: { connections: number };\n}\n\n// ============================================================================\n// Page Generation\n// ============================================================================\n\nfunction toKebabCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Generate pages for each orbital based on the layout strategy.\n *\n * For strategies that produce one page per orbital (sidebar, tabs, wizard-flow),\n * each orbital gets a page at `/<kebab-name>` with `isInitial` on the first.\n *\n * For 'dashboard', all orbitals share a single page.\n * For 'single', the lone orbital gets a single root page.\n */\nfunction generatePages(\n orbitals: OrbitalDefinition[],\n strategy: LayoutStrategy,\n): Page[] {\n switch (strategy) {\n case 'single': {\n const orbital = orbitals[0];\n const name = orbital?.name ?? 'Main';\n return [\n {\n name: `${name}Page`,\n path: '/',\n isInitial: true,\n primaryEntity: getEntityName(orbital),\n },\n ];\n }\n\n case 'dashboard': {\n return [\n {\n name: 'DashboardPage',\n path: '/',\n viewType: 'dashboard',\n isInitial: true,\n },\n ];\n }\n\n case 'sidebar':\n case 'tabs':\n case 'wizard-flow': {\n return orbitals.map((orbital, index) => ({\n name: `${orbital.name}Page`,\n path: index === 0 ? '/' : `/${toKebabCase(orbital.name)}`,\n isInitial: index === 0,\n primaryEntity: getEntityName(orbital),\n }));\n }\n }\n}\n\n/**\n * Extract entity name from an orbital definition.\n * Handles both inline entities and string references.\n */\nfunction getEntityName(orbital: OrbitalDefinition | undefined): string | undefined {\n if (!orbital) return undefined;\n const entity = orbital.entity;\n if (typeof entity === 'string') {\n // Reference like \"Alias.entity\" - extract the alias as entity name\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Compose multiple orbital definitions into a single application schema.\n *\n * Steps:\n * 1. Apply event wiring (adds emits/listens to traits)\n * 2. Detect or use provided layout strategy\n * 3. Generate pages based on the strategy\n * 4. Build the final OrbitalSchema\n */\nexport function composeBehaviors(\n input: ComposeBehaviorsInput,\n): ComposeBehaviorsResult {\n const {\n appName,\n orbitals: rawOrbitals,\n layoutStrategy: strategyInput,\n eventWiring,\n } = input;\n\n // Step 1: Apply event wiring\n const wiredOrbitals =\n eventWiring && eventWiring.length > 0\n ? applyEventWiring(rawOrbitals, eventWiring)\n : rawOrbitals;\n\n // Step 2: Determine layout strategy\n const strategy: LayoutStrategy =\n !strategyInput || strategyInput === 'auto'\n ? detectLayoutStrategy(wiredOrbitals, eventWiring)\n : strategyInput;\n\n // Step 3: Generate pages\n const pages = generatePages(wiredOrbitals, strategy);\n\n // Step 4: Assign generated pages to orbitals (merge, don't replace existing)\n const orbitalsWithPages = wiredOrbitals.map((orbital, index) => {\n // If the orbital already has pages, keep them\n if (orbital.pages && orbital.pages.length > 0) {\n return orbital;\n }\n\n // Assign the generated page for this orbital\n const page = strategy === 'dashboard' || strategy === 'single'\n ? pages[0]\n : pages[index];\n\n return {\n ...orbital,\n pages: page ? [page] : [],\n };\n });\n\n // Step 5: Build the schema\n const schema: OrbitalSchema = {\n name: appName,\n version: '1.0.0',\n orbitals: orbitalsWithPages,\n };\n\n return {\n schema,\n layout: {\n strategy,\n pageCount: pages.length,\n },\n wiring: {\n connections: eventWiring?.length ?? 0,\n },\n };\n}\n","/**\n * Pipe Behaviors\n *\n * Left-to-right composition. Each step receives the previous result as its\n * first argument and returns the value handed to the next step.\n *\n * @packageDocumentation\n */\n\n/**\n * A single step in a behavior pipeline.\n */\nexport type PipeStep<I, O> = (input: I) => O;\n\n/**\n * Apply a series of transformation steps to a seed value, left to right.\n * Each step receives the previous step's output as its first argument.\n *\n * @example\n * ```ts\n * pipeBehaviors(1, (n) => n + 1, (n) => n * 10); // -> 20\n * ```\n */\nexport function pipeBehaviors<T>(\n seed: T,\n ...steps: Array<PipeStep<unknown, unknown>>\n): unknown {\n let current: unknown = seed;\n for (const step of steps) {\n current = step(current);\n }\n return current;\n}\n"]}
@@ -3,7 +3,6 @@ import { EventPayload, AgentContext, TraitConfig, BusEvent, EntityRow, ServicePa
3
3
 
4
4
  /** Alias for ResolvedPatternProps to avoid breaking internal consumers */
5
5
  type PatternProps = ResolvedPatternProps;
6
-
7
6
  type ConfigContext = TraitConfig;
8
7
  /**
9
8
  * Event structure for cross-trait communication.
@@ -338,4 +337,4 @@ interface TransitionObserver {
338
337
  */
339
338
  declare const HANDLER_MANIFEST: Record<ExecutionEnvironment, string[]>;
340
339
 
341
- export { type BindingContext as B, type EvaluationContextExtensions as E, HANDLER_MANIFEST as H, type IEventBus as I, type PatternProps as P, type RuntimeConfig as R, type TraitDefinition as T, type Unsubscribe as U, type EffectHandlers as a, type EffectContext as b, type ExecutionEnvironment as c, type EffectResult as d, type Effect as e, type EventListener as f, type RuntimeEvent as g, type TraitState as h, type TransitionObserver as i, type TransitionResult as j };
340
+ export { type BindingContext as B, type ConfigContext as C, type EvaluationContextExtensions as E, HANDLER_MANIFEST as H, type IEventBus as I, type PatternProps as P, type RuntimeConfig as R, type TraitDefinition as T, type Unsubscribe as U, type EffectHandlers as a, type EffectContext as b, type ExecutionEnvironment as c, type EffectResult as d, type Effect as e, type EventListener as f, type RuntimeEvent as g, type TraitState as h, type TransitionObserver as i, type TransitionResult as j };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/runtime",
3
- "version": "5.1.0",
3
+ "version": "5.2.0",
4
4
  "description": "Interpreted runtime for Almadar orbital applications (OrbitalServerRuntime)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",