@almadar/runtime 6.9.2 → 6.9.4

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/EventBus.ts","../src/BindingResolver.ts","../src/StateMachineCore.ts","../src/types.ts","../src/EffectExecutor.ts","../src/PayloadValidator.ts","../src/config-defaults.ts","../src/MockPersistenceAdapter.ts","../src/loader/schema-loader.ts","../src/loader/http-loader.ts","../src/loader/unified-loader.ts","../src/loader/almadar-studio-config.ts","../src/resolver/reference-resolver.ts","../src/UsesIntegration.ts","../src/PersistenceAdapter.ts"],"names":["createLogger","isKnownOperator"],"mappings":"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","file":"chunk-R6Y4IJ7I.js","sourcesContent":["/**\n * EventBus - Platform-Agnostic Pub/Sub Implementation\n *\n * Pure TypeScript event bus for cross-trait communication.\n * Works on both client (browser) and server (Node.js).\n *\n * @packageDocumentation\n */\n\nimport { createLogger } from '@almadar/logger';\nimport type { IEventBus, RuntimeEvent, EventListener, Unsubscribe, EventPayload } from './types.js';\n\nconst log = createLogger('almadar:runtime:eventbus');\n\n/**\n * EventBus - Simple pub/sub event bus\n *\n * @example\n * ```typescript\n * const bus = new EventBus({ debug: true });\n *\n * // Subscribe\n * const unsub = bus.on('ORDER_CONFIRMED', (event) => {\n * log.debug('order-confirmed', { orderId: event.payload?.orderId });\n * });\n *\n * // Emit\n * bus.emit('ORDER_CONFIRMED', { orderId: '123' });\n *\n * // Unsubscribe\n * unsub();\n * ```\n */\nexport class EventBus implements IEventBus {\n private listeners: Map<string, Set<EventListener>> = new Map();\n /** Maximum recursion depth before circuit breaker activates (RCG-05) */\n private maxDepth: number;\n /** Current emission depth for circular loop detection */\n private depth: number = 0;\n\n constructor(options: { debug?: boolean; maxDepth?: number } = {}) {\n // `debug` is accepted for backwards-compatibility but is now a no-op;\n // diagnostic output is gated by @almadar/logger (env ALMADAR_DEBUG or\n // globalThis.__ALMADAR_DEBUG__='almadar:runtime:eventbus').\n void options.debug;\n this.maxDepth = options.maxDepth ?? 10;\n }\n\n /**\n * Emit an event to all registered listeners.\n *\n * Includes circuit breaker (RCG-05): if emit is called recursively\n * beyond `maxDepth`, the event is dropped and an error is logged.\n * This prevents infinite loops from circular emit/listen chains.\n */\n emit(\n type: string,\n payload?: EventPayload,\n source?: RuntimeEvent['source']\n ): void {\n // RCG-05: Circuit breaker for circular event loops\n if (this.depth >= this.maxDepth) {\n log.error('circular event loop dropped', { type, depth: this.depth, maxDepth: this.maxDepth });\n return;\n }\n\n const event: RuntimeEvent = {\n type,\n payload,\n timestamp: Date.now(),\n source,\n };\n\n const listeners = this.listeners.get(type);\n const listenerCount = listeners?.size ?? 0;\n\n if (listenerCount > 0) {\n log.debug('emit', { type, listenerCount, depth: this.depth });\n } else {\n log.warn('emit no listeners', { type });\n }\n\n this.depth++;\n try {\n if (listeners) {\n // Copy to avoid mutation during iteration\n const listenersCopy = Array.from(listeners);\n for (const listener of listenersCopy) {\n try {\n listener(event);\n } catch (error) {\n log.error('listener threw', { type, error: error instanceof Error ? error : String(error) });\n }\n }\n }\n\n // Wildcard listeners receive all events\n if (type !== '*') {\n const wildcardListeners = this.listeners.get('*');\n if (wildcardListeners) {\n for (const listener of Array.from(wildcardListeners)) {\n try {\n listener(event);\n } catch (error) {\n log.error('wildcard listener threw', { error: error instanceof Error ? error : String(error) });\n }\n }\n }\n }\n } finally {\n this.depth--;\n }\n }\n\n /**\n * Subscribe to an event type\n */\n on(type: string, listener: EventListener): Unsubscribe {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set());\n }\n\n const listeners = this.listeners.get(type)!;\n listeners.add(listener);\n\n log.debug('subscribe', { type, total: listeners.size });\n\n return () => {\n listeners.delete(listener);\n log.debug('unsubscribe', { type, remaining: listeners.size });\n if (listeners.size === 0) {\n this.listeners.delete(type);\n }\n };\n }\n\n /**\n * Subscribe to ALL events (wildcard listener)\n * Useful for event tracking, logging, debugging\n */\n onAny(listener: EventListener): Unsubscribe {\n return this.on('*', listener);\n }\n\n /**\n * Check if there are listeners for an event type\n */\n hasListeners(type: string): boolean {\n const listeners = this.listeners.get(type);\n return listeners !== undefined && listeners.size > 0;\n }\n\n /**\n * Get all registered event types\n */\n getRegisteredEvents(): string[] {\n return Array.from(this.listeners.keys());\n }\n\n /**\n * Clear all listeners\n */\n clear(): void {\n log.debug('clear', { eventTypeCount: this.listeners.size });\n this.listeners.clear();\n }\n\n /**\n * Get listener count for an event type (for testing)\n */\n getListenerCount(type: string): number {\n return this.listeners.get(type)?.size ?? 0;\n }\n}\n\n/**\n * Create a new EventBus instance\n */\nexport function createEventBus(options?: { debug?: boolean }): IEventBus {\n return new EventBus(options);\n}\n","/**\n * BindingResolver - Platform-Agnostic Binding Resolution\n *\n * Resolves binding references like @entity.field, @payload.value, @state\n * in props and values. Works on both client and server.\n *\n * Uses the shared S-expression evaluator for actual resolution.\n *\n * @packageDocumentation\n */\n\nimport {\n evaluate,\n resolveBinding,\n createMinimalContext,\n type EvaluationContext,\n} from '@almadar/evaluator';\n// Import from the browser-safe `@almadar/std/registry` subpath (pure operator\n// metadata) rather than the `@almadar/std` index — the index also bundles the\n// node-only registry LOADER (createRequire/fs/path), which has no place in the\n// runtime interpreter that ships to the renderer.\nimport { isKnownStdOperator as isKnownOperator } from '@almadar/std/registry';\nimport type { BindingContext, EntityRow, PatternProps, EvaluationContextExtensions } from './types.js';\nimport { createLogger } from '@almadar/logger';\n\nconst bindLog = createLogger('almadar:runtime:bindings');\n// See OrbitalServerRuntime — same `almadar:runtime:render-ui` namespace,\n// instantiated here so interpolation of pattern objects can report\n// whether the resolved row reference matches what arrived in ctx.\nconst renderLog = createLogger('almadar:runtime:render-ui');\n\n// Re-export for convenience\nexport { createMinimalContext, type EvaluationContext };\n\n/**\n * Binding roots whose values only exist in client UI state and therefore\n * cannot be resolved server-side. These bindings round-trip through the\n * server unchanged; the client (`@almadar/ui`) substitutes them at render\n * time.\n *\n * `trait` — `@trait.<TraitName>[.<slot>]` — resolves via `<TraitFrame>` to\n * the referenced trait's current `render-ui` output. See\n * `docs/Almadar_Std_Gaps.md` §3.8.\n */\nexport const CLIENT_ONLY_BINDING_ROOTS: ReadonlySet<string> = new Set(['trait']);\n\n/** Return true when the binding's root segment is reserved for client-only resolution. */\nfunction isClientOnlyBinding(value: string): boolean {\n if (!value.startsWith('@')) return false;\n const afterAt = value.slice(1);\n const firstDot = afterAt.indexOf('.');\n const root = firstDot === -1 ? afterAt : afterAt.slice(0, firstDot);\n return CLIENT_ONLY_BINDING_ROOTS.has(root);\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Interpolate binding references in props.\n *\n * @param props - Props object with potential binding references\n * @param ctx - Evaluation context with bindings\n * @returns New props object with resolved values\n *\n * @example\n * ```ts\n * const ctx = createContextFromBindings({ name: 'Project Alpha', count: 42 });\n * const props = {\n * title: '@entity.name',\n * total: ['+', '@entity.count', 10],\n * };\n * const result = interpolateProps(props, ctx);\n * // { title: 'Project Alpha', total: 52 }\n * ```\n */\nexport function interpolateProps(\n props: PatternProps,\n ctx: EvaluationContext\n): PatternProps {\n // Identity-preserving walk: if no key produced a different value\n // from the input, return the ORIGINAL `props` reference instead of\n // a fresh clone. Pre-fix every render-ui evaluation deep-cloned\n // pattern objects (and the resolved entity rows nested inside),\n // which gave Form's `entity` prop a fresh JS reference per pass\n // and silently fired the `[normalizedInitialData]` reset useEffect\n // mid-edit, wiping typed values. The compiled path uses a stable\n // `lastPayload.row` from `useReducer` and never hit this; the\n // runtime path now matches that semantic — pure data passes through\n // by reference, only branches that actually resolve a binding (or\n // an sexpr) yield a new value.\n const result: PatternProps = {};\n let anyChanged = false;\n for (const [key, value] of Object.entries(props)) {\n const interpolated = interpolateValue(value, ctx) as PatternProps[string];\n result[key] = interpolated;\n if (interpolated !== value) anyChanged = true;\n }\n // When a pattern carries an `entity: @payload.row` binding, log\n // whether the resolved row matches the same JS reference still\n // present on ctx.payload.row. Originally added to confirm the\n // clone hypothesis; kept as permanent observability so future\n // regressions of this contract surface immediately.\n const entityBindingRaw = props['entity'];\n const typeBindingRaw = props['type'];\n const patternType = typeof typeBindingRaw === 'string' ? typeBindingRaw : undefined;\n if (typeof entityBindingRaw === 'string') {\n renderLog.debug('interpolateProps:entity', () => {\n const resolvedEntity = result['entity'];\n const resolvedRow: EntityRow | null =\n resolvedEntity !== null && typeof resolvedEntity === 'object' && !Array.isArray(resolvedEntity)\n ? (resolvedEntity as EntityRow)\n : null;\n const ctxRow = ctx.payload['row'];\n const ctxPayloadKeys = Object.keys(ctx.payload).join(',');\n const payloadDataRaw = ctx.payload['data'];\n const payloadDataLen = Array.isArray(payloadDataRaw) ? payloadDataRaw.length : null;\n const ctxEntityRaw = ctx.entity as EntityRow | EntityRow[] | null;\n const ctxEntityLen = Array.isArray(ctxEntityRaw) ? ctxEntityRaw.length : null;\n const resolvedLen = Array.isArray(resolvedEntity) ? resolvedEntity.length : null;\n return {\n patternType,\n entityBinding: entityBindingRaw,\n resolvedIsObject: resolvedRow !== null,\n resolvedIsArray: Array.isArray(resolvedEntity),\n resolvedLen,\n resolvedEqualsCtxRow: ctxRow !== undefined && resolvedRow !== null && resolvedRow === ctxRow,\n resolvedRowId: resolvedRow?.id,\n ctxPayloadKeys,\n ctxPayloadDataLen: payloadDataLen,\n ctxEntityIsArray: Array.isArray(ctxEntityRaw),\n ctxEntityLen,\n };\n });\n }\n if (patternType === 'form-section' || patternType === 'form') {\n bindLog.debug('form-binding', () => {\n const modeRaw = result['mode'];\n const submitRaw = result['submitEvent'];\n const cancelRaw = result['cancelEvent'];\n return {\n patternType,\n mode: typeof modeRaw === 'string' ? modeRaw : undefined,\n submitEvent: typeof submitRaw === 'string' ? submitRaw : undefined,\n cancelEvent: typeof cancelRaw === 'string' ? cancelRaw : undefined,\n entity: JSON.stringify(result['entity'] ?? null),\n fields: JSON.stringify(result['fields'] ?? null),\n };\n });\n }\n return anyChanged ? result : props;\n}\n\n/**\n * Interpolate a single value.\n */\nexport function interpolateValue(value: unknown, ctx: EvaluationContext): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return interpolateString(value, ctx);\n }\n\n if (Array.isArray(value)) {\n return interpolateArray(value, ctx);\n }\n\n if (typeof value === 'object') {\n return interpolateProps(value as PatternProps, ctx);\n }\n\n return value;\n}\n\n// ============================================================================\n// String Interpolation\n// ============================================================================\n\n/**\n * Interpolate a string value.\n */\nfunction interpolateString(value: string, ctx: EvaluationContext): unknown {\n // Pure binding - resolve directly\n if (value.startsWith('@') && isPureBinding(value)) {\n // Client-only bindings (currently `@trait.*`) round-trip through\n // the server unchanged — the client's render layer substitutes the\n // referenced trait's current frame via `<TraitFrame>`.\n if (isClientOnlyBinding(value)) {\n bindLog.debug('passthrough:client-only', { binding: value });\n return value;\n }\n const resolved = resolveBinding(value, ctx);\n bindLog.debug('resolve', { binding: value, resolvedType: typeof resolved });\n return resolved;\n }\n\n // Embedded bindings\n if (value.includes('@')) {\n return interpolateEmbeddedBindings(value, ctx);\n }\n\n return value;\n}\n\n/**\n * Check if a string is a pure binding (no embedded text).\n *\n * Accepts bracket-index segments anywhere in the path —\n * `@config.sections[0].bullets`, `@payload.rows[2]`, etc. — so the\n * binding is fully consumed by `resolveBinding` instead of falling\n * through to `interpolateEmbeddedBindings` which would stop at the\n * first `[`, partially resolve, and string-concat the suffix.\n */\nfunction isPureBinding(value: string): boolean {\n return /^@[\\w]+(?:\\[\\d+\\])*(?:\\.[\\w]+(?:\\[\\d+\\])*)*$/.test(value);\n}\n\n/**\n * Interpolate embedded bindings in a string.\n */\nfunction interpolateEmbeddedBindings(value: string, ctx: EvaluationContext): string {\n // Match bindings with optional bracket-index segments\n // (`@config.sections[0].bullets`, `@payload.rows[2]`) so the regex\n // captures the WHOLE binding before delegating to resolveBinding —\n // pre-fix the regex stopped at the first `[`, which left the\n // suffix dangling and string-concatenated junk onto the resolved\n // prefix (the SplitSection `bullets` crash).\n return value.replace(/@[\\w]+(?:\\[\\d+\\])*(?:\\.[\\w]+(?:\\[\\d+\\])*)*/g, (match) => {\n // Client-only bindings round-trip verbatim; see CLIENT_ONLY_BINDING_ROOTS.\n if (isClientOnlyBinding(match)) {\n return match;\n }\n const resolved = resolveBinding(match, ctx);\n return resolved !== undefined ? String(resolved) : match;\n });\n}\n\n// ============================================================================\n// Array Interpolation\n// ============================================================================\n\n/**\n * Interpolate an array value.\n */\nfunction interpolateArray(value: unknown[], ctx: EvaluationContext): unknown {\n if (value.length === 0) {\n // Preserve identity for empty arrays too — same rationale as\n // `interpolateProps` below.\n return value;\n }\n\n // Per-item render lambdas (`[\"fn\", argName, body]`) are\n // structurally SExpressions — `fn` is a registered control-category\n // operator — but they must NOT be evaluated here. The renderer\n // (`@almadar/ui`'s `renderPatternProps`) is the consumer that\n // converts them into React render props at render time, when each\n // row's `arg` is actually known. Evaluating now produces an\n // unserialisable function value that gets stripped to `undefined`\n // when crossing the server bridge, which is exactly the gap that\n // left std-search/std-filter `renderItem` undefined and the\n // Filter atom's chips empty. Preserve the raw array (with deep\n // recursion into the body so nested `@<arg>.*` placeholders and\n // any other inner SExpressions stay intact) instead.\n if (Array.isArray(value) && value.length === 3 && value[0] === 'fn'\n && typeof value[1] === 'string') {\n return value;\n }\n\n if (isSExpression(value)) {\n const result = evaluate(value as Parameters<typeof evaluate>[0], ctx);\n bindLog.debug('sexpr:eval', () => ({\n operator: typeof value[0] === 'string' ? value[0] : '<non-string>',\n argCount: value.length - 1,\n inputJson: JSON.stringify(value).slice(0, 300),\n resultType: typeof result,\n resultJson: typeof result === 'object' && result !== null\n ? JSON.stringify(result).slice(0, 2000)\n : String(result),\n }));\n return result;\n }\n\n // Identity-preserving map: only return a new array if any item\n // actually changed during interpolation. Otherwise the original\n // array reference passes through unchanged. Mirrors\n // `interpolateProps`' identity rule so e.g. an entity-row array\n // (`entity: @payload.data` resolved to `[row1, row2, ...]`)\n // doesn't get cloned every render-ui evaluation. The element type\n // is the input array's own element type — no `unknown` annotation\n // beyond the function's existing public surface.\n const mapped: typeof value = [];\n let anyChanged = false;\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const interpolated = interpolateValue(item, ctx);\n mapped.push(interpolated);\n if (interpolated !== item) anyChanged = true;\n }\n return anyChanged ? mapped : value;\n}\n\n/**\n * Check if an array is an S-expression.\n */\nfunction isSExpression(value: unknown[]): boolean {\n if (value.length === 0) return false;\n\n const first = value[0];\n if (typeof first !== 'string') return false;\n\n if (isKnownOperator(first)) return true;\n if (first.includes('/')) return true;\n if (first === 'lambda' || first === 'let') return true;\n\n return false;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if a value contains any binding references.\n */\nexport function containsBindings(value: unknown): boolean {\n if (typeof value === 'string') {\n return value.includes('@');\n }\n\n if (Array.isArray(value)) {\n return value.some(containsBindings);\n }\n\n if (value !== null && typeof value === 'object') {\n return Object.values(value as PatternProps).some(containsBindings);\n }\n\n return false;\n}\n\n/**\n * Extract all binding references from a value.\n */\nexport function extractBindings(value: unknown): string[] {\n const bindings: string[] = [];\n\n function collect(v: unknown): void {\n if (typeof v === 'string') {\n const matches = v.match(/@[\\w]+(?:\\.[\\w]+)*/g);\n if (matches) {\n bindings.push(...matches);\n }\n } else if (Array.isArray(v)) {\n v.forEach(collect);\n } else if (v !== null && typeof v === 'object') {\n Object.values(v as PatternProps).forEach(collect);\n }\n }\n\n collect(value);\n return [...new Set(bindings)];\n}\n\n/**\n * Create an EvaluationContext from a BindingContext.\n *\n * @param bindings - Binding context with entity, payload, state data\n * @param strictBindings - When true, log warnings for undefined binding paths (RCG-01)\n * @param contextExtensions - Optional fields to spread onto the context (e.g., { agent: AgentContext })\n */\nexport function createContextFromBindings(\n bindings: BindingContext,\n strictBindings?: boolean,\n contextExtensions?: EvaluationContextExtensions,\n): EvaluationContext {\n const ctx = createMinimalContext(\n bindings.entity || {},\n bindings.payload || {},\n bindings.state || 'idle'\n );\n if (strictBindings) {\n ctx.strictBindings = true;\n }\n // Surface the call-site trait config on the context so `@config.X`\n // bindings resolve in render-ui patterns. See OrbitalServerRuntime's\n // executeEffects where `bindings.config` is populated from\n // RegisteredOrbital.configByTrait.\n if (bindings.config) {\n ctx.config = bindings.config;\n }\n // V2 Phase 6: the `@EntityName.field` cross-entity binding path via\n // `ctx.singletons` is gone. Cross-trait data flow routes through the\n // event bus (listen on an `[external]` Event<T> emit and read via\n // `@payload.<field>`). Named bindings are no longer copied into the\n // singleton lookup table.\n // Spread context extensions (e.g., agent: AgentContext) onto the evaluation context.\n // This is how ctx.agent gets populated for agent/* operator dispatch.\n if (contextExtensions) {\n Object.assign(ctx, contextExtensions);\n }\n return ctx;\n}\n","/**\n * StateMachineCore - Platform-Agnostic State Machine Logic\n *\n * Pure TypeScript implementation of trait state machine execution.\n * Extracts the core logic from useTraitStateMachine for use on\n * both client and server.\n *\n * @packageDocumentation\n */\n\nimport type {\n TraitState,\n TraitDefinition,\n TransitionResult,\n BindingContext,\n RuntimeConfig,\n TransitionObserver,\n EntityRow,\n EventPayload,\n ConfigContext,\n EvaluationContextExtensions,\n} from './types.js';\nimport { interpolateValue, createContextFromBindings } from './BindingResolver.js';\nimport { evaluateGuard } from '@almadar/evaluator';\nimport { createLogger } from '@almadar/logger';\n\nconst smLog = createLogger('almadar:runtime:sm');\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Find the initial state for a trait definition.\n */\nexport function findInitialState(trait: TraitDefinition): string {\n // Guard against missing or empty states array\n if (!trait.states || trait.states.length === 0) {\n smLog.warn('trait-has-no-states', { trait: trait.name });\n return 'unknown';\n }\n const markedInitial = trait.states.find((s) => s.isInitial)?.name;\n const firstState = trait.states[0]?.name;\n return markedInitial || firstState || 'unknown';\n}\n\n/**\n * Create initial trait state for a trait definition.\n */\nexport function createInitialTraitState(trait: TraitDefinition): TraitState {\n return {\n traitName: trait.name,\n currentState: findInitialState(trait),\n previousState: null,\n lastEvent: null,\n context: {},\n };\n}\n\n/**\n * Find every transition matching the current state + event key (in\n * declaration order). Used by `processEvent` to disambiguate guarded\n * sibling transitions: when several transitions share the same\n * `from`/`event` and differ by guard (e.g. retry under attempts<3 vs\n * give-up under attempts>=3), the runtime must consider all of them and\n * pick the first whose guard passes.\n */\nexport function findMatchingTransitions(\n trait: TraitDefinition,\n currentState: string,\n eventKey: string\n): TraitDefinition['transitions'] {\n if (!trait.transitions || trait.transitions.length === 0) {\n return [];\n }\n return trait.transitions.filter((t) => {\n if (Array.isArray(t.from)) {\n return t.from.includes(currentState) && t.event === eventKey;\n }\n return t.from === currentState && t.event === eventKey;\n });\n}\n\n/**\n * Find a matching transition from the current state for the given event.\n *\n * **Guard-unaware**: returns the first transition matching `from` /\n * `event` regardless of any attached guard. Use `findMatchingTransitions`\n * when multiple sibling transitions share the same `from`/`event` and\n * disambiguate by guard.\n */\nexport function findTransition(\n trait: TraitDefinition,\n currentState: string,\n eventKey: string\n): TraitDefinition['transitions'][0] | undefined {\n return findMatchingTransitions(trait, currentState, eventKey)[0];\n}\n\n/**\n * Normalize event key - strip UI: prefix if present.\n */\nexport function normalizeEventKey(eventKey: string): string {\n if (!eventKey) return '';\n return eventKey.startsWith('UI:') ? eventKey.slice(3) : eventKey;\n}\n\n// ============================================================================\n// State Machine Processor\n// ============================================================================\n\n/**\n * Options for processing an event through the state machine.\n */\nexport interface ProcessEventOptions {\n /** Current trait state */\n traitState: TraitState;\n /** Trait definition */\n trait: TraitDefinition;\n /** Event key to process */\n eventKey: string;\n /** Event payload */\n payload?: EventPayload;\n /** Entity data for binding resolution */\n entityData?: EntityRow;\n /**\n * Trait config for `@config.X` resolution inside guard expressions.\n * Surfaced on the EvaluationContext so guards can write mode-aware\n * predicates — e.g. std-modal's OPEN can require `@payload.row` only\n * when `@config.mode === \"edit\"`. The validator (sigil_context.rs)\n * allows `@config` in guard context as of v3.12.0; this field is\n * the runtime side of the same contract. Threaded by the caller\n * (typically `OrbitalServerRuntime.processEvent` reading from the\n * trait's `RegisteredOrbital.configByTrait`).\n */\n config?: ConfigContext;\n /**\n * Guard evaluation error handling mode. (RCG-02)\n * - \"permissive\": Guard errors allow the transition (default, backwards-compatible)\n * - \"strict\": Guard errors block the transition\n */\n guardMode?: \"strict\" | \"permissive\";\n /**\n * When true, log warnings when bindings resolve to undefined. (RCG-01)\n */\n strictBindings?: boolean;\n /**\n * Additional fields to spread onto EvaluationContext for guard evaluation.\n * Used to inject module contexts (e.g., { agent: AgentContext }).\n */\n contextExtensions?: EvaluationContextExtensions;\n}\n\n/**\n * Process an event through a trait's state machine.\n *\n * This is a pure function that:\n * 1. Finds matching transitions\n * 2. Evaluates guards\n * 3. Returns the transition result (but does not execute effects)\n *\n * @returns TransitionResult with effects to execute\n *\n * @example\n * ```ts\n * const result = processEvent({\n * traitState: { traitName: 'Cart', currentState: 'empty', ... },\n * trait: cartTraitDefinition,\n * eventKey: 'ADD_ITEM',\n * payload: { productId: '123' },\n * });\n *\n * if (result.executed) {\n * // Execute effects\n * for (const effect of result.effects) {\n * effectExecutor.execute(effect);\n * }\n * // Update state\n * traitState.currentState = result.newState;\n * }\n * ```\n */\nexport function processEvent(options: ProcessEventOptions): TransitionResult {\n const {\n traitState, trait, eventKey, payload, entityData,\n config,\n guardMode = 'permissive',\n strictBindings = false,\n contextExtensions,\n } = options;\n const normalizedEvent = normalizeEventKey(eventKey);\n\n // Find every transition matching from/event so we can pick the first\n // whose guard passes. This supports the standard \"retry vs give-up\"\n // pattern where two transitions share from/event and differ by guard\n // (e.g. attempts<3 → idle vs attempts>=3 → failed).\n const candidates = findMatchingTransitions(trait, traitState.currentState, normalizedEvent);\n\n if (candidates.length === 0) {\n smLog.debug('noTransition', { trait: trait.name, event: normalizedEvent, currentState: traitState.currentState });\n return {\n executed: false,\n newState: traitState.currentState,\n previousState: traitState.currentState,\n effects: [],\n };\n }\n\n // Try each candidate in declaration order; pick the first whose\n // guard passes (or that has no guard). Guard errors fall through to\n // the next candidate in permissive mode, block in strict mode.\n let lastFailedGuardTransition: TraitDefinition['transitions'][0] | undefined;\n\n for (const transition of candidates) {\n smLog.debug('processEvent', { trait: trait.name, event: normalizedEvent, currentState: traitState.currentState, to: transition.to });\n\n if (!transition.guard) {\n // Unguarded transition wins immediately.\n return {\n executed: true,\n newState: transition.to,\n previousState: traitState.currentState,\n effects: transition.effects || [],\n transition: {\n from: traitState.currentState,\n to: transition.to,\n event: normalizedEvent,\n },\n };\n }\n\n const ctx = createContextFromBindings({\n entity: entityData,\n payload,\n state: traitState.currentState,\n // Surface call-site config so `@config.X` resolves inside\n // guard expressions (matches the validator's allowed sigil\n // list as of v3.12.0). createContextFromBindings already\n // propagates `bindings.config` to ctx.config when present —\n // we just need to pass it through here.\n config,\n }, strictBindings, contextExtensions);\n\n try {\n const guardPasses = evaluateGuard(\n transition.guard as Parameters<typeof evaluateGuard>[0],\n ctx\n );\n smLog.debug('guard:evaluate', { trait: trait.name, event: normalizedEvent, guardResult: guardPasses });\n if (guardPasses) {\n return {\n executed: true,\n newState: transition.to,\n previousState: traitState.currentState,\n effects: transition.effects || [],\n transition: {\n from: traitState.currentState,\n to: transition.to,\n event: normalizedEvent,\n },\n guardResult: true,\n };\n }\n // Guard failed — try the next candidate.\n lastFailedGuardTransition = transition;\n } catch (error) {\n if (guardMode === 'strict') {\n // RCG-02: In strict mode, guard errors block the transition\n smLog.error('guard-error-blocks-transition', {\n from: traitState.currentState,\n to: transition.to,\n event: normalizedEvent,\n error: error instanceof Error ? error : String(error),\n });\n return {\n executed: false,\n newState: traitState.currentState,\n previousState: traitState.currentState,\n effects: [],\n transition: {\n from: traitState.currentState,\n to: transition.to,\n event: normalizedEvent,\n },\n guardResult: false,\n };\n }\n // Permissive mode: log and allow (treat as guard pass).\n smLog.error('guard-evaluation-error', {\n error: error instanceof Error ? error : String(error),\n });\n return {\n executed: true,\n newState: transition.to,\n previousState: traitState.currentState,\n effects: transition.effects || [],\n transition: {\n from: traitState.currentState,\n to: transition.to,\n event: normalizedEvent,\n },\n guardResult: true,\n };\n }\n }\n\n // No candidate's guard passed.\n return {\n executed: false,\n newState: traitState.currentState,\n previousState: traitState.currentState,\n effects: [],\n transition: lastFailedGuardTransition\n ? {\n from: traitState.currentState,\n to: lastFailedGuardTransition.to,\n event: normalizedEvent,\n }\n : undefined,\n guardResult: false,\n };\n}\n\n// ============================================================================\n// State Machine Manager\n// ============================================================================\n\n/**\n * Stateful manager for multiple trait state machines.\n *\n * Platform-agnostic - can be used directly on server or wrapped\n * in a React hook on client.\n *\n * @example\n * ```ts\n * const manager = new StateMachineManager([cartTrait, userTrait]);\n *\n * // Process event\n * const results = manager.sendEvent('ADD_ITEM', { productId: '123' });\n *\n * // Get current states\n * const cartState = manager.getState('Cart');\n * ```\n */\n/** Entry in a per-trait event queue. */\nexport interface QueuedEvent {\n eventKey: string;\n payload?: EventPayload;\n entityData?: EntityRow;\n /** Per-trait entity overrides (see `sendEvent` doc). */\n entityByTrait?: Record<string, EntityRow>;\n}\n\n/**\n * Default scope used when an event arrives without a specific entityId.\n * Single-entity orbitals (the common case for UI traits) all share this\n * scope, so the public API stays identical to the pre-multi-entity world.\n */\nconst SINGLETON_SCOPE = '__singleton__';\n\nfunction scopeOf(entityData?: EntityRow): string {\n const id = entityData && (entityData['id'] as string | undefined);\n return id ?? SINGLETON_SCOPE;\n}\n\nfunction compositeKey(traitName: string, scope: string): string {\n return `${traitName}::${scope}`;\n}\n\nexport class StateMachineManager {\n private traits: Map<string, TraitDefinition> = new Map();\n /**\n * Per-trait call-site config, surfaced to guard expressions so\n * `@config.X` resolves at runtime. Populated by the orbital's\n * registration step (see `OrbitalServerRuntime.registerOrbital`'s\n * `configByTrait` projection). Empty for atom-scope traits whose\n * call-site config wasn't supplied — guards that read `@config.X`\n * in that case will see `undefined` and short-circuit accordingly.\n */\n private traitConfigs: Map<string, ConfigContext> = new Map();\n /**\n * State map keyed by `${traitName}::${entityId | __singleton__}`.\n *\n * Each entity instance of an orbital gets its own copy of every\n * trait's state machine. This is what enables N parallel subagents\n * (one OrbitalProcess row per dispatched orbital) to all run their\n * own Build/Validate/Fix cycle without colliding on shared trait\n * state — the original cause of GAP-AGB-2.\n *\n * Initial state is created lazily on first event for each scope, so\n * adding a trait does not pre-allocate state for every potential\n * entity (and there's no need to know entity ids up front).\n */\n private states: Map<string, TraitState> = new Map();\n private config: RuntimeConfig;\n private observer?: TransitionObserver;\n\n // Actor-model queues, also keyed by `${traitName}::${entityId}` so\n // each entity gets its own actor loop and concurrent subagents do\n // not serialize through a shared queue.\n private queues: Map<string, QueuedEvent[]> = new Map();\n private processing: Set<string> = new Set();\n\n constructor(\n traits: TraitDefinition[] = [],\n config: RuntimeConfig = {},\n observer?: TransitionObserver\n ) {\n this.config = config;\n this.observer = observer;\n for (const trait of traits) {\n this.addTrait(trait);\n }\n }\n\n /**\n * Set the transition observer for runtime verification.\n * Wire this to `verificationRegistry.recordTransition()` to enable\n * automatic verification tracking.\n */\n setObserver(observer: TransitionObserver): void {\n this.observer = observer;\n }\n\n /**\n * Add a trait to the manager.\n */\n addTrait(trait: TraitDefinition): void {\n this.traits.set(trait.name, trait);\n // Lazy: state for each entity scope is created on first event.\n }\n\n /**\n * Bind the call-site config for a trait so guard `@config.X`\n * resolves at runtime. Typically called by the orbital\n * registration step right after `addTrait`. Idempotent; passing\n * `undefined` clears the binding.\n */\n setTraitConfig(traitName: string, config: ConfigContext | undefined): void {\n if (config === undefined) {\n this.traitConfigs.delete(traitName);\n } else {\n this.traitConfigs.set(traitName, config);\n }\n }\n\n /**\n * Remove a trait from the manager.\n */\n removeTrait(traitName: string): void {\n this.traits.delete(traitName);\n // Drop every per-entity state row for this trait.\n const prefix = `${traitName}::`;\n for (const key of [...this.states.keys()]) {\n if (key.startsWith(prefix)) this.states.delete(key);\n }\n for (const key of [...this.queues.keys()]) {\n if (key.startsWith(prefix)) this.queues.delete(key);\n }\n for (const key of [...this.processing]) {\n if (key.startsWith(prefix)) this.processing.delete(key);\n }\n }\n\n /**\n * Get-or-init the state row for a (trait, entityId) pair.\n * Returns undefined if the trait isn't registered.\n */\n private getOrInitState(\n traitName: string,\n scope: string\n ): TraitState | undefined {\n const trait = this.traits.get(traitName);\n if (!trait) return undefined;\n const key = compositeKey(traitName, scope);\n let state = this.states.get(key);\n if (!state) {\n state = createInitialTraitState(trait);\n this.states.set(key, state);\n }\n return state;\n }\n\n /**\n * Get current state for a trait.\n *\n * For single-entity orbitals, omit `entityId` — returns the singleton\n * scope. For multi-entity orbitals (e.g. agent OrbitalSubagent), pass\n * the entity row id to look up that specific instance's state.\n */\n getState(traitName: string, entityId?: string): TraitState | undefined {\n const scope = entityId ?? SINGLETON_SCOPE;\n const key = compositeKey(traitName, scope);\n const existing = this.states.get(key);\n if (existing) return existing;\n // Lazy init for read-then-no-event scenarios (e.g. ticks).\n return this.getOrInitState(traitName, scope);\n }\n\n /**\n * Get a flat traitName→state map. For multi-entity orbitals this\n * returns one entry per trait collapsed onto the singleton scope (or\n * the first observed scope if singleton is empty). Use\n * `getAllStatesByScope()` to get the full per-entity view.\n */\n getAllStates(): Map<string, TraitState> {\n const out = new Map<string, TraitState>();\n for (const traitName of this.traits.keys()) {\n const singleton = this.states.get(compositeKey(traitName, SINGLETON_SCOPE));\n if (singleton) {\n out.set(traitName, singleton);\n continue;\n }\n // Fall back to the first observed entity scope for this trait.\n for (const [key, state] of this.states) {\n if (key.startsWith(`${traitName}::`)) {\n out.set(traitName, state);\n break;\n }\n }\n }\n return out;\n }\n\n /**\n * Get every per-entity state row, grouped by trait. Useful for\n * inspecting parallel subagent state.\n */\n getAllStatesByScope(): Map<string, Map<string, TraitState>> {\n const grouped = new Map<string, Map<string, TraitState>>();\n for (const [key, state] of this.states) {\n const sep = key.indexOf('::');\n if (sep < 0) continue;\n const traitName = key.slice(0, sep);\n const scope = key.slice(sep + 2);\n let bucket = grouped.get(traitName);\n if (!bucket) {\n bucket = new Map();\n grouped.set(traitName, bucket);\n }\n bucket.set(scope, state);\n }\n return grouped;\n }\n\n /**\n * Check if a trait can handle an event from its current state.\n */\n canHandleEvent(traitName: string, eventKey: string, entityId?: string): boolean {\n const trait = this.traits.get(traitName);\n const state = this.getOrInitState(traitName, entityId ?? SINGLETON_SCOPE);\n if (!trait || !state) return false;\n\n return !!findTransition(trait, state.currentState, normalizeEventKey(eventKey));\n }\n\n /**\n * Send an event to all traits.\n *\n * `entityByTrait` lets callers supply per-trait entity rows for guard\n * evaluation when traits accumulate scalar state via `(set @entity.X)`\n * effects across transitions. The runtime UI hook builds this map from\n * its `traitFieldStatesRef` before each dispatch so guards reading\n * `@entity.X` see prior step writes — required for [runtime] entities\n * that have no persistence row to reload.\n *\n * @returns Array of transition results (one per trait that had a matching transition)\n */\n sendEvent(\n eventKey: string,\n payload?: EventPayload,\n entityData?: EntityRow,\n entityByTrait?: Record<string, EntityRow>\n ): Array<{ traitName: string; result: TransitionResult }> {\n const results: Array<{ traitName: string; result: TransitionResult }> = [];\n const scope = scopeOf(entityData);\n\n for (const [traitName, trait] of this.traits) {\n const traitState = this.getOrInitState(traitName, scope);\n if (!traitState) continue;\n const key = compositeKey(traitName, scope);\n\n const perTraitEntity = entityByTrait?.[traitName] ?? entityData;\n\n const result = processEvent({\n traitState,\n trait,\n eventKey,\n payload,\n entityData: perTraitEntity,\n config: this.traitConfigs.get(traitName),\n guardMode: this.config.guardMode,\n strictBindings: this.config.strictBindings,\n contextExtensions: this.config.contextExtensions,\n });\n\n if (result.executed) {\n // Update state for THIS entity's scope only — concurrent\n // entities of the same trait keep independent state.\n this.states.set(key, {\n ...traitState,\n currentState: result.newState,\n previousState: result.previousState,\n lastEvent: normalizeEventKey(eventKey),\n context: { ...traitState.context, ...payload } as ConfigContext,\n });\n\n results.push({ traitName, result });\n\n // Notify observer (for verificationRegistry wiring)\n if (this.observer && result.transition) {\n this.observer.onTransition({\n traitName,\n from: result.transition.from,\n to: result.transition.to,\n event: result.transition.event,\n guardResult: result.guardResult,\n // Effects will be traced when executed — placeholder here\n effects: [],\n });\n }\n }\n }\n\n return results;\n }\n\n // ========================================================================\n // Actor-Model Queue API (opt-in, does not affect sendEvent)\n // ========================================================================\n\n /**\n * Enqueue an event into every trait's per-trait queue.\n *\n * Events are not processed immediately. Call `drainQueue()` for each\n * trait to process them sequentially (actor-model guarantee: one event\n * at a time per trait, effects fully awaited before the next event).\n */\n enqueueEvent(\n eventKey: string,\n payload?: EventPayload,\n entityData?: EntityRow,\n entityByTrait?: Record<string, EntityRow>\n ): void {\n const scope = scopeOf(entityData);\n for (const [traitName] of this.traits) {\n const key = compositeKey(traitName, scope);\n const queue = this.queues.get(key) ?? [];\n queue.push({ eventKey, payload, entityData, entityByTrait });\n this.queues.set(key, queue);\n }\n }\n\n /**\n * Drain a single (trait, entity) pair's event queue, processing\n * events sequentially. Pass `entityId` to drain a specific entity\n * instance; omit it to drain the singleton scope.\n */\n async drainQueue(\n traitName: string,\n executeEffects: (\n traitName: string,\n result: TransitionResult,\n payload?: EventPayload\n ) => Promise<void>,\n entityId?: string\n ): Promise<void> {\n const scope = entityId ?? SINGLETON_SCOPE;\n const key = compositeKey(traitName, scope);\n if (this.processing.has(key)) return;\n this.processing.add(key);\n\n const queue = this.queues.get(key) ?? [];\n while (queue.length > 0) {\n const entry = queue.shift()!;\n const trait = this.traits.get(traitName);\n const traitState = this.getOrInitState(traitName, scope);\n if (!trait || !traitState) continue;\n\n const perTraitEntity =\n entry.entityByTrait?.[traitName] ?? entry.entityData;\n\n const result = processEvent({\n traitState,\n trait,\n eventKey: entry.eventKey,\n payload: entry.payload,\n entityData: perTraitEntity,\n config: this.traitConfigs.get(traitName),\n guardMode: this.config.guardMode,\n strictBindings: this.config.strictBindings,\n contextExtensions: this.config.contextExtensions,\n });\n\n if (result.executed) {\n this.states.set(key, {\n ...traitState,\n currentState: result.newState,\n previousState: result.previousState,\n lastEvent: normalizeEventKey(entry.eventKey),\n context: { ...traitState.context, ...entry.payload } as ConfigContext,\n });\n\n if (this.observer && result.transition) {\n this.observer.onTransition({\n traitName,\n from: result.transition.from,\n to: result.transition.to,\n event: result.transition.event,\n guardResult: result.guardResult,\n effects: [],\n });\n }\n\n // Await effects before processing the next event in this trait's queue\n await executeEffects(traitName, result, entry.payload);\n }\n }\n\n this.processing.delete(key);\n }\n\n /**\n * Check whether a trait's queue is currently being drained.\n */\n isProcessing(traitName: string, entityId?: string): boolean {\n return this.processing.has(compositeKey(traitName, entityId ?? SINGLETON_SCOPE));\n }\n\n /**\n * Get the number of pending events in a trait's queue.\n */\n getQueueLength(traitName: string, entityId?: string): number {\n return this.queues.get(compositeKey(traitName, entityId ?? SINGLETON_SCOPE))?.length ?? 0;\n }\n\n /**\n * Reset a trait to its initial state.\n *\n * If `entityId` is provided, resets only that entity's scope.\n * Otherwise resets every entity scope known for the trait.\n */\n resetTrait(traitName: string, entityId?: string): void {\n const trait = this.traits.get(traitName);\n if (!trait) return;\n if (entityId) {\n this.states.set(compositeKey(traitName, entityId), createInitialTraitState(trait));\n return;\n }\n const prefix = `${traitName}::`;\n for (const key of [...this.states.keys()]) {\n if (key.startsWith(prefix)) {\n this.states.set(key, createInitialTraitState(trait));\n }\n }\n }\n\n /**\n * Reset all traits to initial states (every entity scope).\n */\n resetAll(): void {\n for (const [traitName, trait] of this.traits) {\n const prefix = `${traitName}::`;\n for (const key of [...this.states.keys()]) {\n if (key.startsWith(prefix)) {\n this.states.set(key, createInitialTraitState(trait));\n }\n }\n }\n }\n}\n","/**\n * Unified Runtime Types\n *\n * Platform-agnostic interfaces for trait execution on client or server.\n *\n * @packageDocumentation\n */\n\nimport type {\n EntityRow,\n EventPayload,\n FetchResult,\n ServiceParams,\n ResolvedPatternProps,\n AgentContext,\n BusEvent,\n BusEventSource,\n BusEventListener,\n Unsubscribe as CoreUnsubscribe,\n PatternConfig,\n} from '@almadar/core';\n\n// ============================================================================\n// Runtime Data Types (re-exported from @almadar/core)\n// ============================================================================\n\nexport type { EntityRow, EventPayload, FetchResult, ServiceParams };\n\n/** Alias for ResolvedPatternProps to avoid breaking internal consumers */\nexport type PatternProps = ResolvedPatternProps;\n\n/**\n * Value a render-ui pattern prop can carry AFTER interpolation. Mirrors\n * `FieldValue` but extends with `RuntimeRenderPattern` so nested pattern\n * configs (children, slot props that are themselves render-ui nodes)\n * round-trip without an `unknown` escape hatch.\n */\nexport type RuntimePatternValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | EntityRow\n | EntityRow[]\n | readonly RuntimePatternValue[]\n | RuntimeRenderPattern;\n\n/**\n * Shape of a render-ui pattern AFTER interpolation, as the runtime hands\n * it to `EffectHandlers.renderUI`. Different from `ResolvedPatternProps`\n * (`@almadar/core`) because the post-interpolation pattern carries\n * resolved EntityRow values (e.g. `{ entity: <row> }` from `@payload.row`)\n * not just primitives. Used by render-ui observability helpers to narrow\n * safely without `unknown` casts.\n */\nexport interface RuntimeRenderPattern {\n readonly [prop: string]: RuntimePatternValue;\n}\n\n/**\n * Configuration context.\n *\n * Re-export of `TraitConfig` from `@almadar/core` for the runtime's binding\n * and state-machine layers. Supports scalar, array, and nested-object values\n * so `config.fields = [\"name\", \"description\"]` and similar authoring shapes\n * flow through the binding context without type widening.\n */\nimport type { TraitConfig } from '@almadar/core';\nexport type ConfigContext = TraitConfig;\n\n// ============================================================================\n// Event Bus Types\n// ============================================================================\n\n/**\n * Event structure for cross-trait communication.\n * Re-export of `BusEvent` from `@almadar/core` so runtime + ui + codegen\n * all agree on the bus envelope shape. `RuntimeEvent` is kept as a type\n * alias for anyone importing by the old name.\n */\nexport type RuntimeEvent = BusEvent;\nexport type EventListener = BusEventListener;\nexport type Unsubscribe = CoreUnsubscribe;\n\n/**\n * Event bus interface for pub/sub communication\n */\nexport interface IEventBus {\n /** Emit an event */\n emit(type: string, payload?: EventPayload, source?: BusEventSource): void;\n /** Subscribe to an event */\n on(type: string, listener: EventListener): Unsubscribe;\n /** Subscribe to ALL events (wildcard listener) */\n onAny(listener: EventListener): Unsubscribe;\n /** Check if there are listeners for an event */\n hasListeners(type: string): boolean;\n /** Get all registered event types */\n getRegisteredEvents(): string[];\n /** Clear all listeners */\n clear(): void;\n}\n\n// ============================================================================\n// State Machine Types\n// ============================================================================\n\n/**\n * State of a single trait's state machine\n */\nexport interface TraitState {\n /** Trait name */\n traitName: string;\n /** Current state name */\n currentState: string;\n /** Previous state (null if initial) */\n previousState: string | null;\n /** Last event that caused a transition */\n lastEvent: string | null;\n /** Custom context data */\n context: ConfigContext;\n}\n\n/**\n * Result of processing an event through a state machine\n */\nexport interface TransitionResult {\n /** Whether a transition was executed */\n executed: boolean;\n /** New state after transition (same as current if not executed) */\n newState: string;\n /** Previous state before transition */\n previousState: string;\n /** Effects to execute (empty if guard failed or no transition found) */\n effects: unknown[];\n /** The transition that was executed (undefined if none) */\n transition?: {\n from: string;\n to: string;\n event: string;\n };\n /** Guard evaluation result (undefined if no guard) */\n guardResult?: boolean;\n}\n\n/**\n * Minimal trait definition for state machine processing\n */\nexport interface TraitDefinition {\n name: string;\n states: Array<{ name: string; isInitial?: boolean }>;\n transitions: Array<{\n from: string | string[];\n to: string;\n event: string;\n guard?: unknown;\n effects?: unknown[];\n /** Compensating transition when effects fail (RCG-04) */\n onEffectError?: {\n to: string;\n effects?: unknown[];\n };\n }>;\n /** Cross-trait event listeners (optional) */\n listens?: Array<{\n event: string;\n triggers: string;\n payloadMapping?: EventPayload;\n }>;\n}\n\n// ============================================================================\n// Effect Handler Types\n// ============================================================================\n\n/**\n * Effect handlers interface - platform-specific implementations\n *\n * Client: React hooks, DOM, router\n * Server: Express, database, integrators\n */\nexport interface EffectHandlers {\n /**\n * Emit an event to the event bus.\n *\n * `source` carries the emitter's identity (orbital + trait) so that\n * source-scoped listeners (`TraitName EVENT -> TRIGGER` and\n * `Orbital.TraitName EVENT -> TRIGGER` in .lolo) can filter incoming\n * events by their originating trait. Omitted when the emit is\n * synthesized by a non-trait context (e.g. test harness).\n */\n emit: (event: string, payload?: EventPayload, source?: RuntimeEvent['source']) => void;\n\n /** Persist data (create/update/delete/batch) */\n persist: (\n action: 'create' | 'update' | 'delete' | 'batch',\n entityType: string,\n data?: EntityRow\n ) => Promise<void>;\n\n /** Set a field value on an entity */\n set: (entityId: string, field: string, value: unknown) => void;\n\n /** Call an external service */\n callService: (\n service: string,\n action: string,\n params?: ServiceParams\n ) => Promise<unknown>;\n\n /** Fetch entity data (server only) - returns data for client-side rendering.\n *\n * Always returns a `FetchResult` (`{rows, total}`) on success. `total`\n * is the count of rows matching the `filter` BEFORE `offset`/`limit`\n * are applied so a paginating caller can compute totalPages without\n * a second round-trip. Single-id fetches return `total: 1`. `null`\n * means \"not found / failed\".\n */\n fetch?: (\n entityType: string,\n options?: {\n id?: string;\n filter?: unknown;\n limit?: number;\n offset?: number;\n /** Relation fields to include (populate) in the response */\n include?: string[];\n }\n ) => Promise<FetchResult | null>;\n\n /** Spawn a new entity instance */\n spawn?: (entityType: string, props?: EntityRow) => void;\n\n /** Despawn (delete) an entity instance */\n despawn?: (entityId: string) => void;\n\n // Platform-specific handlers (optional)\n\n /** Render UI to a slot (client only). `pattern` is the post-interpolation\n * `PatternConfig` from the trait's `(render-ui slot pattern)` SExpr, or\n * `null` when the trait clears the slot (`render-ui slot null`). */\n renderUI?: (\n slot: string,\n pattern: PatternConfig | null,\n props?: PatternProps,\n priority?: number\n ) => void;\n\n /** Navigate to a route (client only) */\n navigate?: (path: string, params?: { [key: string]: string }) => void;\n\n /** Show a notification (client: toast, server: log) */\n notify?: (message: string, type: 'success' | 'error' | 'warning' | 'info') => void;\n\n /** Log a message */\n log?: (message: string, level?: 'log' | 'warn' | 'error', data?: unknown) => void;\n\n // Resource operators (ref/deref/swap!/watch/atomic)\n\n /** Ref: declarative data subscription (server: same as fetch) */\n ref?: (\n entityType: string,\n options?: {\n id?: string;\n filter?: unknown;\n limit?: number;\n offset?: number;\n include?: string[];\n }\n ) => Promise<FetchResult | null>;\n\n /** Deref: one-shot data read (server: same as fetch) */\n deref?: (\n entityType: string,\n options?: {\n id?: string;\n filter?: unknown;\n }\n ) => Promise<FetchResult | null>;\n\n /** Swap!: atomic read-modify-write on an entity */\n swap?: (\n entityType: string,\n entityId: string,\n transform: unknown,\n ) => Promise<EntityRow | null>;\n\n /** Watch: client-side reactive subscription (no-op on server) */\n watch?: (\n entityType: string,\n options?: { id?: string; filter?: unknown; limit?: number },\n ) => void;\n\n /** Atomic: execute inner effects as a transaction */\n atomic?: (\n effects: unknown[],\n ) => Promise<void>;\n\n // === Composition handlers (compile-time, optional) ===\n /** Compose multiple orbitals into one schema. Compile-time only. */\n composeBehaviors?: (config: { appName: string; orbitals: unknown[]; layoutStrategy?: string; eventWiring?: unknown[]; entityMappings?: Record<string, string> }) => Promise<unknown> | unknown;\n /** Apply cross-orbital event wiring. Compile-time only. */\n applyEventWiring?: (orbitals: unknown[], wiring: unknown[]) => Promise<unknown[]> | unknown[];\n /** Auto-detect layout strategy. Compile-time only. */\n detectLayoutStrategy?: (orbitals: unknown[], wiring?: unknown[]) => Promise<string> | string;\n /** Left-to-right behavior pipeline. Compile-time only. */\n pipeBehaviors?: (seed: unknown, ...steps: Array<(prev: unknown) => unknown>) => Promise<unknown> | unknown;\n\n // OS trigger handlers (server-side only)\n //\n // Each handler may accept an optional `emit` config — when present, the\n // handler fires `emit.on_message` in place of the hardcoded event name\n // (e.g. `OS_FILE_MODIFIED`). Hardcoded fallback is preserved so existing\n // schemas without `emit:` keep working.\n /** Watch file system for changes matching glob pattern */\n osWatchFiles?: (\n glob: string,\n options: { recursive?: boolean; debounce?: number },\n emit?: OsEmitConfig,\n ) => void;\n /** Monitor a process by name */\n osWatchProcess?: (name: string, subcommand?: string, emit?: OsEmitConfig) => void;\n /** Monitor a port for open/close */\n osWatchPort?: (port: number, protocol: string, emit?: OsEmitConfig) => void;\n /** Intercept HTTP responses matching pattern */\n osWatchHttp?: (urlPattern: string, method?: string, emit?: OsEmitConfig) => void;\n /** Register a cron schedule */\n osWatchCron?: (expression: string, emit?: OsEmitConfig) => void;\n /** Register an OS signal handler */\n osWatchSignal?: (signal: string, emit?: OsEmitConfig) => void;\n /** Watch an environment variable for changes */\n osWatchEnv?: (variable: string, emit?: OsEmitConfig) => void;\n /** Configure debounce for an OS event type */\n osDebounce?: (ms: number, eventType: string) => void;\n}\n\n/**\n * Author-configured `emit:` block threaded into `os/watch-*` handlers.\n * Narrower than @almadar/core's `EmitConfig` — only the keys streaming\n * operators meaningfully fire.\n */\nexport type OsEmitConfig = Pick<import('@almadar/core').EmitConfig, 'on_message' | 'failure'>;\n\n// ============================================================================\n// Binding Context Types\n// ============================================================================\n\n/**\n * Context for resolving bindings like @entity.field, @payload.value\n */\nexport interface BindingContext {\n /** Current entity data */\n entity?: EntityRow;\n /** Event payload data */\n payload?: EventPayload;\n /** Current state name */\n state?: string;\n /** Trait-level state/config */\n config?: ConfigContext;\n /** Additional custom bindings */\n [key: string]: unknown;\n}\n\n// ============================================================================\n// Effect Types\n// ============================================================================\n\n/**\n * S-expression effect array\n * First element is the operator, rest are arguments\n */\nexport type Effect = [string, ...unknown[]];\n\n/**\n * Effect execution context\n */\nexport interface EffectContext {\n /** Trait name */\n traitName: string;\n /** Orbital that owns the firing trait. Used to stamp the source\n * metadata on emits so source-scoped listens (`TraitName EVENT` for\n * intra-orbital, `Orbital.TraitName EVENT` for cross-orbital) can\n * filter by emitter identity. */\n orbitalName?: string;\n /** Current state */\n state: string;\n /** Transition description */\n transition: string;\n /** Linked entity name */\n linkedEntity?: string;\n /** Entity ID (if available) */\n entityId?: string;\n}\n\n// ============================================================================\n// Effect Result Types (RCG-04)\n// ============================================================================\n\n/**\n * Result of executing a single effect, with status tracking.\n */\nexport interface EffectResult {\n /** Effect operator (e.g., \"persist\", \"render-ui\") */\n type: string;\n /** Effect arguments */\n args: unknown[];\n /** Whether the effect executed successfully */\n status: \"executed\" | \"failed\" | \"skipped\";\n /** Error message if failed */\n error?: string;\n /** Execution duration in milliseconds */\n durationMs?: number;\n}\n\n// ============================================================================\n// Runtime Configuration (RCG-01, RCG-02, RCG-05)\n// ============================================================================\n\n/**\n * Runtime configuration for strictness and safety modes.\n *\n * These options control how the runtime handles edge cases:\n * - `strictBindings`: Log warnings when bindings resolve to undefined (RCG-01)\n * - `guardMode`: Control whether guard errors block or allow transitions (RCG-02)\n * - `maxEventDepth`: Prevent infinite event loops (RCG-05)\n */\nexport interface RuntimeConfig {\n /**\n * When true, log warnings when bindings like @entity.field resolve to undefined.\n * Helps detect typos and missing fields early. (RCG-01)\n * @default false\n */\n strictBindings?: boolean;\n\n /**\n * Guard evaluation error handling mode. (RCG-02)\n * - \"permissive\": Guard errors allow the transition (current default behavior)\n * - \"strict\": Guard errors block the transition\n * @default \"permissive\"\n */\n guardMode?: \"strict\" | \"permissive\";\n\n /**\n * Maximum event emission depth before triggering circuit breaker. (RCG-05)\n * Prevents infinite loops from circular emit/listen chains.\n * @default 10\n */\n maxEventDepth?: number;\n\n /**\n * Additional fields to spread onto every EvaluationContext.\n * Used to inject module contexts (e.g., { agent: AgentContext }).\n * The evaluator dispatches agent/* operators to ctx.agent.\n */\n contextExtensions?: EvaluationContextExtensions;\n}\n\n/**\n * Typed extensions that get spread onto every EvaluationContext.\n * Each field here corresponds to an optional field on EvaluationContext.\n */\nexport interface EvaluationContextExtensions {\n /** Agent context for agent/* operators (memory, LLM, tools, session) */\n agent?: AgentContext;\n}\n\n// ============================================================================\n// Handler Manifest Types (RCG-03)\n// ============================================================================\n\n/**\n * Execution context for handler manifest validation.\n * Defines which effect handlers should be available in each environment.\n */\nexport type ExecutionEnvironment = \"client\" | \"server\" | \"test\" | \"ssr\";\n\n// ============================================================================\n// Transition Observer Types (Verification Registry Wiring)\n// ============================================================================\n\n/**\n * Observer interface for recording transition and effect traces.\n * Implement this to wire in the verificationRegistry or other monitoring tools.\n *\n * The runtime calls these hooks automatically when transitions execute and\n * effects complete, enabling runtime verification without tight coupling.\n */\nexport interface TransitionObserver {\n /**\n * Called after a transition is processed (whether or not it executed).\n */\n onTransition(trace: {\n traitName: string;\n from: string;\n to: string;\n event: string;\n guardResult?: boolean;\n effects: Array<{\n type: string;\n args: unknown[];\n status: \"executed\" | \"failed\" | \"skipped\";\n error?: string;\n durationMs?: number;\n }>;\n }): void;\n}\n\n/**\n * Maps execution environments to their available effect handlers.\n */\nexport const HANDLER_MANIFEST: Record<ExecutionEnvironment, string[]> = {\n client: [\"render-ui\", \"render\", \"navigate\", \"notify\", \"emit\", \"set\", \"log\", \"ref\", \"deref\", \"watch\"],\n server: [\"persist\", \"fetch\", \"call-service\", \"emit\", \"set\", \"spawn\", \"despawn\", \"log\", \"ref\", \"deref\", \"swap!\", \"atomic\", \"os/watch-files\", \"os/watch-process\", \"os/watch-port\", \"os/watch-http\", \"os/watch-cron\", \"os/watch-signal\", \"os/watch-env\", \"os/debounce\"],\n test: [\n \"render-ui\", \"render\", \"navigate\", \"notify\", \"emit\", \"set\",\n \"persist\", \"fetch\", \"call-service\", \"spawn\", \"despawn\", \"log\",\n \"ref\", \"deref\", \"swap!\", \"watch\", \"atomic\",\n ],\n ssr: [\"render-ui\", \"render\", \"fetch\", \"emit\", \"set\", \"log\", \"ref\", \"deref\"],\n};\n","/**\n * EffectExecutor - Platform-Agnostic Effect Dispatch\n *\n * Routes S-expression effects to appropriate handlers.\n * Platform-specific adapters provide handler implementations.\n *\n * @packageDocumentation\n */\n\nimport type { EmitConfig, FetchOptions, PatternConfig } from '@almadar/core';\nimport type {\n EffectHandlers,\n Effect,\n EffectContext,\n EffectResult,\n ExecutionEnvironment,\n} from './types.js';\nimport { HANDLER_MANIFEST } from './types.js';\nimport { interpolateValue, createContextFromBindings } from './BindingResolver.js';\nimport type { BindingContext, EntityRow, EventPayload, FetchResult, ServiceParams, PatternProps, EvaluationContextExtensions } from './types.js';\nimport { createLogger } from '@almadar/logger';\n\nconst effectLog = createLogger('almadar:runtime:effects');\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Full executor options with handlers and context.\n */\nexport interface EffectExecutorOptions {\n /** Effect handlers (platform-specific) */\n handlers: EffectHandlers;\n /** Binding context for resolving @entity.field references */\n bindings: BindingContext;\n /** Effect execution context (trait name, state, etc.) */\n context: EffectContext;\n /** Enable debug logging */\n debug?: boolean;\n /** When true, log warnings when bindings resolve to undefined (RCG-01) */\n strictBindings?: boolean;\n /** Additional fields to spread onto EvaluationContext (e.g., { agent: AgentContext }) */\n contextExtensions?: EvaluationContextExtensions;\n}\n\n// ============================================================================\n// Effect Parsing\n// ============================================================================\n\n/**\n * Parse an effect into operator and arguments.\n */\nfunction parseEffect(effect: unknown): { operator: string; args: unknown[] } | null {\n if (!Array.isArray(effect) || effect.length === 0) {\n return null;\n }\n\n const [operator, ...args] = effect;\n if (typeof operator !== 'string') {\n return null;\n }\n\n return { operator, args };\n}\n\n/**\n * Resolve all bindings in effect arguments.\n */\nfunction resolveArgs(\n args: unknown[],\n bindings: BindingContext,\n strictBindings?: boolean,\n contextExtensions?: EvaluationContextExtensions,\n): unknown[] {\n const ctx = createContextFromBindings(bindings, strictBindings, contextExtensions);\n return args.map((arg) => interpolateValue(arg, ctx));\n}\n\n// ============================================================================\n// Effect Executor\n// ============================================================================\n\n/**\n * EffectExecutor - Routes effects to handlers.\n *\n * @example\n * ```ts\n * const executor = new EffectExecutor({\n * handlers: {\n * emit: (event, payload) => eventBus.emit(event, payload),\n * persist: async (action, entity, data) => { ... },\n * set: (id, field, value) => { ... },\n * callService: async (service, action, params) => { ... },\n * },\n * bindings: { entity: { name: 'Product' }, payload: { id: '123' } },\n * context: { traitName: 'Cart', state: 'active', transition: 'idle->active' },\n * });\n *\n * // Execute a single effect\n * executor.execute(['emit', 'ITEM_ADDED', { count: 1 }]);\n *\n * // Execute multiple effects\n * executor.executeAll([\n * ['set', 'item', 'quantity', 5],\n * ['emit', 'QUANTITY_UPDATED'],\n * ]);\n * ```\n */\nexport class EffectExecutor {\n private handlers: EffectHandlers;\n private bindings: BindingContext;\n private context: EffectContext;\n private debug: boolean;\n private strictBindings: boolean;\n private contextExtensions?: EvaluationContextExtensions;\n\n constructor(options: EffectExecutorOptions) {\n this.handlers = options.handlers;\n this.bindings = options.bindings;\n this.context = options.context;\n this.debug = options.debug ?? false;\n this.strictBindings = options.strictBindings ?? false;\n this.contextExtensions = options.contextExtensions;\n }\n\n // ==========================================================================\n // Handler Manifest Validation (RCG-03)\n // ==========================================================================\n\n /**\n * Validate that all effect types used in a schema have handlers registered.\n * Call this at runtime startup to catch missing handler setup immediately.\n *\n * @param usedEffectTypes - Effect operator names used in the loaded schemas\n * @param environment - Execution environment for context-aware error messages\n * @returns Array of missing handler errors (empty if all handlers are available)\n *\n * @example\n * ```ts\n * const missing = EffectExecutor.validateHandlers(\n * ['persist', 'render-ui', 'fetch'],\n * executor.getRegisteredHandlers(),\n * 'client'\n * );\n * if (missing.length > 0) {\n * console.error('Missing handlers:', missing);\n * }\n * ```\n */\n static validateHandlers(\n usedEffectTypes: string[],\n registeredHandlers: string[],\n environment?: ExecutionEnvironment\n ): string[] {\n const errors: string[] = [];\n const expectedHandlers = environment\n ? HANDLER_MANIFEST[environment]\n : undefined;\n\n for (const effectType of usedEffectTypes) {\n if (!registeredHandlers.includes(effectType)) {\n let message = `Effect \"${effectType}\" is used in schema but no handler is registered.`;\n if (expectedHandlers && !expectedHandlers.includes(effectType)) {\n message += ` Effect \"${effectType}\" is not expected in \"${environment}\" environment.`;\n }\n errors.push(message);\n }\n }\n\n return errors;\n }\n\n /**\n * Get list of effect operators that have handlers registered.\n */\n getRegisteredHandlers(): string[] {\n const registered: string[] = [];\n const handlerMap: { [op: string]: ((...args: never[]) => unknown) | undefined } = {\n 'emit': this.handlers.emit,\n 'persist': this.handlers.persist,\n 'set': this.handlers.set,\n 'call-service': this.handlers.callService,\n 'fetch': this.handlers.fetch,\n 'spawn': this.handlers.spawn,\n 'despawn': this.handlers.despawn,\n 'render-ui': this.handlers.renderUI,\n 'render': this.handlers.renderUI,\n 'navigate': this.handlers.navigate,\n 'notify': this.handlers.notify,\n 'log': this.handlers.log,\n 'ref': this.handlers.ref,\n 'deref': this.handlers.deref,\n 'swap!': this.handlers.swap,\n 'watch': this.handlers.watch,\n 'atomic': this.handlers.atomic,\n 'behavior/compose': this.handlers.composeBehaviors,\n 'behavior/wire': this.handlers.applyEventWiring,\n 'behavior/detect-layout': this.handlers.detectLayoutStrategy,\n 'behavior/pipe': this.handlers.pipeBehaviors,\n };\n for (const [name, handler] of Object.entries(handlerMap)) {\n if (handler) {\n registered.push(name);\n }\n }\n // Compound operators are always available\n registered.push('do', 'when');\n return registered;\n }\n\n /**\n * Execute a single effect.\n */\n async execute(effect: unknown): Promise<void> {\n const parsed = parseEffect(effect);\n if (!parsed) {\n if (this.debug) {\n effectLog.warn('invalid-effect-format', () => ({ effectJson: JSON.stringify(effect ?? null) }));\n }\n return;\n }\n\n const { operator, args } = parsed;\n\n // Compound operators ('do', 'when') contain nested effects as arguments.\n // Skip resolveArgs for these — each nested effect will be resolved\n // individually when this.execute() recurses into it via dispatch().\n const isCompound = operator === 'do' || operator === 'when';\n\n // `set` with an `@entity.<field>` path literal uses that first arg as a\n // binding PATH, not as a value to resolve. Skip interpolating args[0] so\n // dispatch('set', ...) can parse the field name from the path. This\n // applies to both the bare 3-elem form AND the 4-elem form with a\n // trailing `emit:` options object (added by close-the-circuit Stage 2).\n // The purely positional 4-elem form (entityId, field, value) falls\n // through the normal resolve path below.\n const isSetPathForm =\n operator === 'set' &&\n args.length >= 2 &&\n typeof args[0] === 'string' &&\n (args[0] as string).startsWith('@entity.');\n\n // Resource-fetch operators carry a `filter` SExpression in args[1]\n // that the handler evaluates per-row against the fetched collection.\n // Pre-interpolation collapses it to a single constant boolean (e.g.\n // `(or (= \"active\" \"\") (= (object/get @entity \"status\") \"active\"))`\n // becomes literal `true` or `false` against the OUTER trait's bound\n // entity), so the handler then applies the same constant to every\n // row — no narrowing. Preserve the filter SExpression verbatim;\n // resolve the rest of the options object normally.\n const isFetchLike =\n (operator === 'fetch' ||\n operator === 'ref' ||\n operator === 'deref' ||\n operator === 'os/watch-collection' ||\n operator === 'os/watch') &&\n args.length >= 2 &&\n args[1] !== null &&\n typeof args[1] === 'object' &&\n !Array.isArray(args[1]);\n\n let resolvedArgs: unknown[];\n if (isCompound) {\n resolvedArgs = args;\n } else if (isSetPathForm) {\n const ctx = createContextFromBindings(this.bindings, this.strictBindings, this.contextExtensions);\n // Preserve args[0] (the @entity.<path> literal); resolve the rest.\n resolvedArgs = [args[0], ...args.slice(1).map((a) => interpolateValue(a, ctx))];\n } else if (isFetchLike) {\n const ctx = createContextFromBindings(this.bindings, this.strictBindings, this.contextExtensions);\n const opts = args[1] as FetchOptions;\n const resolvedOpts: FetchOptions = {\n ...(opts.id !== undefined && { id: interpolateValue(opts.id, ctx) as string }),\n ...(opts.filter !== undefined && { filter: opts.filter }),\n ...(opts.limit !== undefined && { limit: interpolateValue(opts.limit, ctx) as number }),\n ...(opts.offset !== undefined && { offset: interpolateValue(opts.offset, ctx) as number }),\n ...(opts.include !== undefined && { include: interpolateValue(opts.include, ctx) as string[] }),\n ...(opts.emit !== undefined && { emit: interpolateValue(opts.emit, ctx) as FetchOptions['emit'] }),\n };\n resolvedArgs = [\n interpolateValue(args[0], ctx),\n resolvedOpts,\n ...args.slice(2).map((a) => interpolateValue(a, ctx)),\n ];\n } else {\n resolvedArgs = resolveArgs(args, this.bindings, this.strictBindings, this.contextExtensions);\n }\n\n effectLog.debug('execute', { operator, argCount: resolvedArgs.length, context: this.context.traitName });\n\n if (this.debug) {\n effectLog.debug('executing', () => ({ operator, argsJson: JSON.stringify(resolvedArgs) }));\n }\n\n try {\n await this.dispatch(operator, resolvedArgs);\n effectLog.debug('execute:result', { operator, success: true });\n } catch (error) {\n effectLog.error('execute:error', {\n operator,\n error: error instanceof Error ? error : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Execute multiple effects in sequence.\n */\n async executeAll(effects: unknown[]): Promise<void> {\n for (const effect of effects) {\n await this.execute(effect);\n }\n }\n\n /**\n * Execute multiple effects in parallel.\n */\n async executeParallel(effects: unknown[]): Promise<void> {\n await Promise.all(effects.map((effect) => this.execute(effect)));\n }\n\n // ==========================================================================\n // Effect Execution with Results (RCG-04)\n // ==========================================================================\n\n /**\n * Execute effects and return detailed results for each.\n * Enables compensating transitions by reporting which effects failed.\n *\n * Unlike `executeAll`, this method does NOT throw on effect errors.\n * Instead, it captures errors in the returned `EffectResult[]` array.\n */\n async executeWithResults(effects: unknown[]): Promise<EffectResult[]> {\n const results: EffectResult[] = [];\n\n for (const effect of effects) {\n const parsed = parseEffect(effect);\n if (!parsed) {\n results.push({\n type: 'unknown',\n args: [],\n status: 'skipped',\n error: 'Invalid effect format',\n });\n continue;\n }\n\n const start = Date.now();\n const { operator, args: rawArgs } = parsed;\n const isCompound = operator === 'do' || operator === 'when';\n const resolvedArgs = isCompound\n ? rawArgs\n : resolveArgs(rawArgs, this.bindings, this.strictBindings, this.contextExtensions);\n\n try {\n await this.dispatch(operator, resolvedArgs);\n results.push({\n type: operator,\n args: resolvedArgs,\n status: 'executed',\n durationMs: Date.now() - start,\n });\n } catch (error) {\n const errorMessage = error instanceof Error\n ? error.message\n : String(error);\n results.push({\n type: operator,\n args: resolvedArgs,\n status: 'failed',\n error: errorMessage,\n durationMs: Date.now() - start,\n });\n }\n }\n\n return results;\n }\n\n // ==========================================================================\n // `emit:` config extraction — close-the-circuit on async/reactive ops.\n //\n // `fetch`, `persist`, `call-service`, `set`, `ref`, `os/watch-*` may carry\n // an `emit:` key in their options object. After the effect's work finishes,\n // the runtime fires the author-configured bus event so downstream state\n // machines can branch on success/failure without stitching async/sequence.\n //\n // See `docs/Almadar_Std_Gaps.md` §3.1 and the emit-config plan for the\n // semantics. The compiled-path shell does the same work in generated JS.\n // ==========================================================================\n\n private extractEmitConfig(rawOpt: unknown): EmitConfig | undefined {\n if (!rawOpt || typeof rawOpt !== 'object' || Array.isArray(rawOpt)) {\n return undefined;\n }\n const obj = rawOpt as { emit?: unknown };\n const emitBlock = obj.emit;\n if (!emitBlock || typeof emitBlock !== 'object' || Array.isArray(emitBlock)) {\n return undefined;\n }\n // Narrow to the known-keys shape so we don't need a Record index.\n // Resolver accepts both snake_case and camelCase; mirror that here.\n const block = emitBlock as {\n success?: unknown;\n failure?: unknown;\n on_change?: unknown;\n onChange?: unknown;\n on_message?: unknown;\n onMessage?: unknown;\n };\n const asStr = (v: unknown): string | undefined =>\n typeof v === 'string' ? v : undefined;\n return {\n success: asStr(block.success),\n failure: asStr(block.failure),\n on_change: asStr(block.on_change) ?? asStr(block.onChange),\n on_message: asStr(block.on_message) ?? asStr(block.onMessage),\n };\n }\n\n /** Build the source metadata stamp for an emit fired from this trait. */\n private sourceStamp(): import('./types.js').RuntimeEvent['source'] {\n return {\n orbital: this.context.orbitalName,\n trait: this.context.traitName,\n transition: this.context.transition,\n };\n }\n\n private emitSuccess(\n emit: EmitConfig | undefined,\n key: 'success' | 'on_change' | 'on_message',\n payload: unknown,\n ): void {\n const eventName = emit?.[key];\n if (eventName) {\n this.handlers.emit(eventName, payload as EventPayload | undefined, this.sourceStamp());\n }\n }\n\n private emitFailure(\n emit: EmitConfig | undefined,\n err: unknown,\n ): void {\n if (!emit?.failure) return;\n const error = err instanceof Error ? err.message : String(err);\n this.handlers.emit(emit.failure, { error } as EventPayload, this.sourceStamp());\n }\n\n /**\n * Narrow the generic emit config into the `os/watch-*` handler surface\n * (only `on_message` + `failure` are meaningful for streaming ops).\n * Returns `undefined` when neither field is set so handlers can test\n * with a single `if (emit)` guard.\n */\n private osEmit(\n emit: EmitConfig | undefined,\n ): import('./types.js').OsEmitConfig | undefined {\n if (!emit || (!emit.on_message && !emit.failure)) return undefined;\n return {\n on_message: emit.on_message,\n failure: emit.failure,\n };\n }\n\n // ==========================================================================\n // Effect Dispatch\n // ==========================================================================\n\n private async dispatch(operator: string, args: unknown[]): Promise<void> {\n switch (operator) {\n // === Universal Effects ===\n\n case 'emit': {\n const event = args[0] as string;\n const payload = args[1] as EventPayload | undefined;\n this.handlers.emit(event, payload, this.sourceStamp());\n break;\n }\n\n case 'set': {\n // Two accepted forms (operators.json declares maxArity:2 → 3-elem canonical;\n // 4-elem historically accepted for back-compat with consumers that resolve\n // the entity id externally):\n // 3-elem: ['set', '@entity.<field>', value] — parse the field out of the path\n // 4-elem: ['set', entityId, field, value] — caller supplies entity id + field\n // +emit: ['set', '@entity.<field>', value, { emit: {...} }]\n // bindings.entity is EntityRow | undefined from @almadar/core —\n // use it directly instead of casting to a record.\n const entity: EntityRow | undefined = this.bindings.entity;\n let entityId: string | undefined;\n let field: string;\n let value: unknown;\n let emitCfg: EmitConfig | undefined;\n\n // Distinguish path-based (`@entity.<field>`) from explicit 4-elem forms.\n // The path form's 3rd arg may carry `emit:` options; the 4-elem\n // form's 4th arg may carry the same. `args.length` alone is\n // ambiguous once `emit:` arrives, so use the path prefix as the\n // discriminator.\n if (typeof args[0] === 'string' && (args[0] as string).startsWith('@entity.')) {\n const path = args[0] as string;\n field = path.slice('@entity.'.length);\n value = args[1];\n emitCfg = this.extractEmitConfig(args[2]);\n entityId = typeof entity?.['id'] === 'string' ? (entity['id'] as string) : undefined;\n // Auto-seed entity.id from @payload.id when the trait's\n // entity context is empty. Row-click patterns (e.g.\n // std-confirmation's REQUEST) open a modal for a specific\n // row, then `(set @entity.pendingId @payload.id)` to\n // remember which one — but the trait's entity starts\n // empty, so the old \"bail with missing-entity-id\" path\n // silently dropped the set and every subsequent\n // `@entity.*` read returned undefined. Compiled path\n // already has this implicit contract (server dispatches\n // with the payload's row identified). Mirror it here so\n // runtime and compiled render the same @entity.* values.\n if (!entityId) {\n const payload = this.bindings.payload;\n const payloadId = payload && typeof payload === 'object' && 'id' in payload\n ? (payload as EventPayload).id\n : undefined;\n if (typeof payloadId === 'string') {\n entityId = payloadId;\n // Seed a minimal entity so follow-up reads in the\n // same transition (and the mirror write below)\n // see a real row.\n if (!entity) {\n this.bindings.entity = { id: payloadId } as EntityRow;\n } else {\n entity['id'] = payloadId;\n }\n effectLog.debug('set:auto-seed-entity-id', { path, id: payloadId });\n } else {\n // No persistable entity id (and the payload\n // doesn't carry one — typical for instance-scoped\n // notification traits whose SHOW payload is\n // `{ message, notificationType }`, and for\n // [runtime] entities like wizards that accumulate\n // scalar state across transitions). Update the\n // in-memory binding AND still dispatch through\n // handlers.set so the per-trait scalar-state\n // wrapper in useTraitStateMachine populates\n // `traitFieldStatesRef` — guards in subsequent\n // sendEvent calls read `@entity.X` from there.\n // Without the handlers.set call, the wrapper\n // never runs and step-skip guards always fail.\n effectLog.debug('set:in-memory-mirror-only', { path });\n if (!entity) {\n this.bindings.entity = {} as EntityRow;\n }\n (this.bindings.entity as EntityRow)[field] =\n value as EntityRow[string];\n this.handlers.set(entityId ?? '', field, value);\n this.emitSuccess(emitCfg, 'success', value);\n break;\n }\n }\n } else {\n entityId = args[0] as string;\n field = args[1] as string;\n value = args[2];\n emitCfg = this.extractEmitConfig(args[3]);\n }\n\n this.handlers.set(entityId, field, value);\n // Mirror the write into the in-memory bindings so later\n // effects in the same transition (and any `when`/`if`\n // guards evaluated against @entity.*) observe the new\n // value. Without this, a transition that increments a\n // counter and then conditionally emits on the counter\n // reads the pre-increment value.\n //\n // Match by id when both sides have one. When the\n // in-memory entity is \"rowless\" (id-less), still mirror —\n // a path-form set against the singleton in-memory entity\n // is the only one that landed here without an id, and\n // dropping the mirror would let the compiled vs runtime\n // paths diverge on the very next render.\n if (entity && (entity['id'] === entityId || !entity['id'])) {\n // EntityRow indexes to FieldValue; the effect's value is\n // runtime-shaped `unknown`. The set handler above already\n // persisted the real type-checked write — this mirror\n // write is for in-memory binding reads only.\n entity[field] = value as EntityRow[string];\n }\n // set is synchronous — fire success immediately with the new value.\n this.emitSuccess(emitCfg, 'success', value);\n break;\n }\n\n case 'persist': {\n const action = args[0] as 'create' | 'update' | 'delete' | 'batch';\n // Optional trailing options object carrying `emit:` — detected\n // by having an `emit` key, never by position (so inline data\n // payloads for create/update are not mistaken for options).\n const last = args[args.length - 1];\n const emitCfg = last && typeof last === 'object' && !Array.isArray(last) && 'emit' in (last as object)\n ? this.extractEmitConfig(last)\n : undefined;\n effectLog.debug('persist:dispatch', {\n action,\n argCount: args.length,\n argTypes: args.map((a) => Array.isArray(a) ? 'array' : a === null ? 'null' : typeof a).join(','),\n traitName: this.context.traitName,\n transition: this.context.transition,\n });\n effectLog.debug('persist:emit-config', {\n action,\n hasEmitCfg: emitCfg !== undefined,\n success: emitCfg?.success,\n failure: emitCfg?.failure,\n });\n try {\n if (action === 'batch') {\n // Batch mode: [\"persist\", \"batch\", [...operations]]\n const operations = args[1] as unknown[];\n await this.handlers.persist('batch', '', { operations } as EntityRow);\n effectLog.debug('persist:success', {\n action,\n entityType: 'batch',\n opCount: operations.length,\n willEmit: emitCfg?.success,\n });\n this.emitSuccess(emitCfg, 'success', operations);\n effectLog.debug('persist:emit-fired', { action, eventName: emitCfg?.success });\n } else {\n const entityType = args[1] as string;\n const data = args[2] as EntityRow | undefined;\n await this.handlers.persist(action, entityType, data);\n // persist() returns void — best available success payload\n // is the data that went in, which matches the interpreted\n // runtime's existing @entity reactivity contract.\n const dataId = typeof data === 'string'\n ? data\n : (data && typeof data === 'object' ? ((data as { id?: unknown }).id as string | undefined) : undefined);\n effectLog.debug('persist:success', {\n action,\n entityType,\n dataId,\n willEmit: emitCfg?.success,\n });\n this.emitSuccess(emitCfg, 'success', data);\n effectLog.debug('persist:emit-fired', { action, eventName: emitCfg?.success });\n }\n } catch (err) {\n effectLog.error('persist:error', {\n action,\n entityType: action === 'batch' ? 'batch' : (args[1] as string),\n error: err instanceof Error ? err.message : String(err),\n });\n this.emitFailure(emitCfg, err);\n throw err;\n }\n break;\n }\n\n case 'call-service': {\n const service = args[0] as string;\n const action = args[1] as string;\n const params = args[2] as ServiceParams | undefined;\n // Optional trailing options object carrying `emit:` at args[3].\n const emitCfg = this.extractEmitConfig(args[3]);\n try {\n const result = await this.handlers.callService(service, action, params);\n this.emitSuccess(emitCfg, 'success', result);\n } catch (err) {\n this.emitFailure(emitCfg, err);\n throw err;\n }\n break;\n }\n\n case 'fetch': {\n if (this.handlers.fetch) {\n const entityType = args[0] as string;\n const rawOpt = args[1];\n // Support both shorthand ['fetch', 'Entity', 'id-value']\n // and full options ['fetch', 'Entity', { id: 'id-value', emit: {...} }]\n const options = typeof rawOpt === 'string'\n ? { id: rawOpt }\n : rawOpt as {\n id?: string;\n filter?: unknown;\n limit?: number;\n offset?: number;\n include?: string[];\n } | undefined;\n const emitCfg = this.extractEmitConfig(rawOpt);\n try {\n const result = await this.handlers.fetch(entityType, options);\n // Authors read fetched records via `@payload.data`. The\n // sibling `totalCount` is the pre-pagination row count so\n // paginating consumers can compute totalPages without a\n // second round-trip. `result === null` means \"not found\";\n // emit success with `data: null, totalCount: 0` so the\n // payload shape stays stable.\n const payload: EventPayload = result\n ? { data: result.rows, totalCount: result.total }\n : { data: null, totalCount: 0 };\n this.emitSuccess(emitCfg, 'success', payload);\n } catch (err) {\n this.emitFailure(emitCfg, err);\n throw err;\n }\n } else {\n this.logUnsupported('fetch');\n }\n break;\n }\n\n // === Resource Operators ===\n\n case 'ref': {\n const refEntityType = args[0] as string;\n const rawRefOpt = args[1];\n const refOptions = typeof rawRefOpt === 'string'\n ? { id: rawRefOpt }\n : rawRefOpt as {\n id?: string;\n filter?: unknown;\n limit?: number;\n offset?: number;\n include?: string[];\n } | undefined;\n const refEmitCfg = this.extractEmitConfig(rawRefOpt);\n try {\n let result: FetchResult | null = null;\n if (this.handlers.ref) {\n result = await this.handlers.ref(refEntityType, refOptions);\n } else if (this.handlers.fetch) {\n result = await this.handlers.fetch(refEntityType, refOptions);\n } else {\n this.logUnsupported('ref');\n }\n // Interpreted runtime fires `on_change` once on the initial\n // subscribe. Match fetch's payload shape so paginating\n // subscribers receive the same {data, totalCount} contract.\n const refPayload: EventPayload = result\n ? { data: result.rows, totalCount: result.total }\n : { data: null, totalCount: 0 };\n this.emitSuccess(refEmitCfg, 'on_change', refPayload);\n } catch (err) {\n this.emitFailure(refEmitCfg, err);\n throw err;\n }\n break;\n }\n\n case 'deref': {\n const derefEntityType = args[0] as string;\n const rawDerefOpt = args[1];\n const derefOptions = typeof rawDerefOpt === 'string'\n ? { id: rawDerefOpt }\n : rawDerefOpt as {\n id?: string;\n filter?: unknown;\n } | undefined;\n if (this.handlers.deref) {\n await this.handlers.deref(derefEntityType, derefOptions);\n } else if (this.handlers.fetch) {\n await this.handlers.fetch(derefEntityType, derefOptions);\n } else {\n this.logUnsupported('deref');\n }\n break;\n }\n\n case 'swap!': {\n if (this.handlers.swap) {\n const swapEntityType = args[0] as string;\n const swapEntityId = args[1] as string;\n const swapTransform = args[2];\n await this.handlers.swap(swapEntityType, swapEntityId, swapTransform);\n } else {\n this.logUnsupported('swap!');\n }\n break;\n }\n\n case 'watch': {\n if (this.handlers.watch) {\n const watchEntityType = args[0] as string;\n const watchOptions = args[1] as { id?: string; filter?: unknown; limit?: number } | undefined;\n this.handlers.watch(watchEntityType, watchOptions);\n } else {\n // Watch is a no-op on server - just log in debug mode\n if (this.debug) {\n effectLog.debug('watch:noop-server', { entityType: typeof args[0] === 'string' ? args[0] : undefined });\n }\n }\n break;\n }\n\n case 'atomic': {\n if (this.handlers.atomic) {\n const atomicEffects = args as unknown[];\n await this.handlers.atomic(atomicEffects);\n } else {\n // Fallback: execute inner effects sequentially\n const atomicEffects = args as unknown[];\n for (const inner of atomicEffects) {\n await this.execute(inner);\n }\n }\n break;\n }\n\n case 'spawn': {\n if (this.handlers.spawn) {\n const entityType = args[0] as string;\n const props = args[1] as EntityRow | undefined;\n this.handlers.spawn(entityType, props);\n } else {\n this.logUnsupported('spawn');\n }\n break;\n }\n\n case 'despawn': {\n if (this.handlers.despawn) {\n const entityId = args[0] as string;\n this.handlers.despawn(entityId);\n } else {\n this.logUnsupported('despawn');\n }\n break;\n }\n\n case 'log': {\n if (this.handlers.log) {\n const message = args[0] as string;\n const level = args[1] as 'log' | 'warn' | 'error' | undefined;\n const data = args[2];\n this.handlers.log(message, level, data);\n } else {\n effectLog.debug('log:fallback', () => ({\n message: typeof args[0] === 'string' ? args[0] : JSON.stringify(args[0] ?? null),\n extraJson: JSON.stringify(args.slice(1)),\n }));\n }\n break;\n }\n\n // === Client-Only Effects ===\n\n case 'render-ui':\n case 'render': {\n if (this.handlers.renderUI) {\n const slot = args[0] as string;\n // The render-ui SExpr's pattern slot carries either a\n // resolved `PatternConfig` (post-interpolation) or `null`\n // when the trait is clearing the slot. Anything else is\n // a schema bug — runtime keeps the type narrow so\n // downstream renderers don't have to re-validate.\n const patternRaw = args[1];\n const pattern: PatternConfig | null =\n patternRaw === null\n ? null\n : (patternRaw as PatternConfig);\n const props = args[2] as PatternProps | undefined;\n const priority = args[3] as number | undefined;\n this.handlers.renderUI(slot, pattern, props, priority);\n } else {\n this.logUnsupported('render-ui');\n }\n break;\n }\n\n case 'navigate': {\n if (this.handlers.navigate) {\n const path = args[0] as string;\n const params = args[1] as { [key: string]: string } | undefined;\n this.handlers.navigate(path, params);\n } else {\n this.logUnsupported('navigate');\n }\n break;\n }\n\n case 'notify': {\n if (this.handlers.notify) {\n const message = args[0] as string;\n const type = (args[1] as 'success' | 'error' | 'warning' | 'info') || 'info';\n this.handlers.notify(message, type);\n } else {\n const category = typeof args[1] === 'string' ? args[1] : 'info';\n const message = typeof args[0] === 'string' ? args[0] : JSON.stringify(args[0] ?? null);\n effectLog.info('notify', { category, message });\n }\n break;\n }\n\n // === Compound Effects ===\n\n case 'do': {\n // Sequential execution of nested effects\n const nestedEffects = args as unknown[];\n for (const nested of nestedEffects) {\n await this.execute(nested);\n }\n break;\n }\n\n case 'when': {\n // Conditional effect: ['when', condition, thenEffect, elseEffect?]\n // Only the condition needs binding resolution — then/else are\n // nested effects that will be resolved when execute() recurses.\n const ctx = createContextFromBindings(this.bindings, false, this.contextExtensions);\n const condition = interpolateValue(args[0], ctx);\n const thenEffect = args[1];\n const elseEffect = args[2];\n\n if (condition) {\n await this.execute(thenEffect);\n } else if (elseEffect) {\n await this.execute(elseEffect);\n }\n break;\n }\n\n // OS trigger operators (server-side only)\n //\n // Each may carry `emit:` inside a trailing options object. The\n // executor extracts it and passes it to the handler so the\n // hardcoded fallback name (e.g. OS_CRON_FIRE) is replaced by the\n // author-configured event.\n case 'os/watch-files': {\n if (this.handlers.osWatchFiles) {\n const glob = args[0] as string;\n // options may carry emit: — strip it before passing to the handler.\n const rawOptions = args[1] as\n | { recursive?: boolean; debounce?: number; emit?: unknown }\n | undefined;\n const emitCfg = this.extractEmitConfig(rawOptions);\n const options = rawOptions\n ? { recursive: rawOptions.recursive, debounce: rawOptions.debounce }\n : {};\n this.handlers.osWatchFiles(glob, options, this.osEmit(emitCfg));\n } else {\n this.logUnsupported('os/watch-files');\n }\n break;\n }\n case 'os/watch-process': {\n if (this.handlers.osWatchProcess) {\n const emitCfg = this.extractEmitConfig(args[2]);\n this.handlers.osWatchProcess(\n args[0] as string,\n args[1] as string | undefined,\n this.osEmit(emitCfg),\n );\n } else {\n this.logUnsupported('os/watch-process');\n }\n break;\n }\n case 'os/watch-port': {\n if (this.handlers.osWatchPort) {\n const emitCfg = this.extractEmitConfig(args[2]);\n this.handlers.osWatchPort(\n args[0] as number,\n (args[1] as string) ?? 'tcp',\n this.osEmit(emitCfg),\n );\n } else {\n this.logUnsupported('os/watch-port');\n }\n break;\n }\n case 'os/watch-http': {\n if (this.handlers.osWatchHttp) {\n const emitCfg = this.extractEmitConfig(args[2]);\n this.handlers.osWatchHttp(\n args[0] as string,\n args[1] as string | undefined,\n this.osEmit(emitCfg),\n );\n } else {\n this.logUnsupported('os/watch-http');\n }\n break;\n }\n case 'os/watch-cron': {\n if (this.handlers.osWatchCron) {\n const emitCfg = this.extractEmitConfig(args[1]);\n this.handlers.osWatchCron(args[0] as string, this.osEmit(emitCfg));\n } else {\n this.logUnsupported('os/watch-cron');\n }\n break;\n }\n case 'os/watch-signal': {\n if (this.handlers.osWatchSignal) {\n const emitCfg = this.extractEmitConfig(args[1]);\n this.handlers.osWatchSignal(args[0] as string, this.osEmit(emitCfg));\n } else {\n this.logUnsupported('os/watch-signal');\n }\n break;\n }\n case 'os/watch-env': {\n if (this.handlers.osWatchEnv) {\n const emitCfg = this.extractEmitConfig(args[1]);\n this.handlers.osWatchEnv(args[0] as string, this.osEmit(emitCfg));\n } else {\n this.logUnsupported('os/watch-env');\n }\n break;\n }\n case 'os/debounce': {\n if (this.handlers.osDebounce) {\n this.handlers.osDebounce(args[0] as number, args[1] as string);\n } else {\n this.logUnsupported('os/debounce');\n }\n break;\n }\n\n // === Composition operators (compile-time, optional) ===\n\n case 'behavior/compose': {\n if (this.handlers.composeBehaviors) {\n const config = args[0] as { appName: string; orbitals: unknown[]; layoutStrategy?: string; eventWiring?: unknown[]; entityMappings?: Record<string, string> };\n await this.handlers.composeBehaviors(config);\n } else {\n this.logUnsupported('behavior/compose');\n }\n break;\n }\n\n case 'behavior/wire': {\n if (this.handlers.applyEventWiring) {\n const wireOrbitals = args[0] as unknown[];\n const wireEntries = args[1] as unknown[];\n await this.handlers.applyEventWiring(wireOrbitals, wireEntries);\n } else {\n this.logUnsupported('behavior/wire');\n }\n break;\n }\n\n case 'behavior/detect-layout': {\n if (this.handlers.detectLayoutStrategy) {\n const layoutOrbitals = args[0] as unknown[];\n const layoutWiring = args[1] as unknown[] | undefined;\n await this.handlers.detectLayoutStrategy(layoutOrbitals, layoutWiring);\n } else {\n this.logUnsupported('behavior/detect-layout');\n }\n break;\n }\n\n case 'behavior/pipe': {\n if (this.handlers.pipeBehaviors) {\n const [pipeSeed, ...pipeSteps] = args;\n await this.handlers.pipeBehaviors(\n pipeSeed,\n ...(pipeSteps as Array<(prev: unknown) => unknown>),\n );\n } else {\n this.logUnsupported('behavior/pipe');\n }\n break;\n }\n\n default: {\n if (this.debug) {\n effectLog.warn('unknown-operator', { operator });\n }\n }\n }\n }\n\n private logUnsupported(operator: string): void {\n if (this.debug) {\n effectLog.warn('unsupported-on-platform', { operator });\n }\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a minimal EffectExecutor for testing or simple scenarios.\n */\nexport function createTestExecutor(\n overrides: Partial<EffectHandlers> = {}\n): EffectExecutor {\n const noopAsync = async () => { };\n const noop = () => { };\n\n return new EffectExecutor({\n handlers: {\n emit: overrides.emit ?? noop,\n persist: overrides.persist ?? noopAsync,\n set: overrides.set ?? noop,\n callService: overrides.callService ?? (async () => ({})),\n ...overrides,\n },\n bindings: {},\n context: {\n traitName: 'TestTrait',\n state: 'test',\n transition: 'test->test',\n },\n debug: true,\n });\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 { PayloadField } from '@almadar/core';\nimport type { TraitDefinition, EventPayload } from './types.js';\n\n// ============================================================================\n// Per-Request Payload Validation\n// ============================================================================\n\n/**\n * Per-event payload-validation error. Returned by `validateEventPayload`\n * when a request body doesn't match the trait's listens schema for the\n * dispatched event. Caller (HTTP handler in either path) translates\n * this into a 400 response.\n */\nexport interface PayloadValidationFailure {\n readonly event: string;\n readonly field: string;\n readonly reason: 'missing' | 'null' | 'wrong-type';\n readonly expectedType?: string;\n}\n\n/**\n * Validate an incoming event payload against its trait's declared\n * `stateMachine.events[i].payloadSchema`. Currently checks the\n * `required: true` flag against undefined/null values — i.e. enforces\n * the `!` author marker at the API boundary so the persist effect\n * never sees a missing-but-required field.\n *\n * Returns an empty array if the payload is valid; one entry per\n * violation otherwise. Pass through if the event has no schema\n * (e.g. INIT, untyped emits) — coverage walks of unschemaed events\n * stay legal.\n *\n * Both the runtime path (`OrbitalServerRuntime.processOrbitalEvent`)\n * and the compiled-path generated handlers call this with the same\n * arguments so guards behave identically across the two paths.\n *\n * Uses `@almadar/core`'s `PayloadField` directly — that's the type\n * the IR's `Event.payloadSchema` carries (open `type: string`,\n * matching the Rust validator's acceptance of entity-name references\n * like `ListItem`). No parallel runtime type.\n */\nexport function validateEventPayload(\n eventKey: string,\n payload: EventPayload | undefined,\n schema: ReadonlyArray<PayloadField> | undefined,\n): PayloadValidationFailure[] {\n if (!schema || schema.length === 0) return [];\n const failures: PayloadValidationFailure[] = [];\n for (const field of schema) {\n if (!field.required) continue;\n const value = payload?.[field.name];\n if (value === undefined) {\n failures.push({ event: eventKey, field: field.name, reason: 'missing', expectedType: field.type });\n continue;\n }\n if (value === null) {\n failures.push({ event: eventKey, field: field.name, reason: 'null', expectedType: field.type });\n }\n }\n return failures;\n}\n\n/**\n * Format a validation failure into a human-readable error string for\n * the API response body.\n */\nexport function formatPayloadValidationError(failures: ReadonlyArray<PayloadValidationFailure>): string {\n if (failures.length === 0) return '';\n const parts = failures.map((f) =>\n `${f.field} (${f.reason}${f.expectedType ? `, expected ${f.expectedType}` : ''})`,\n );\n return `Payload validation failed for event '${failures[0].event}': ${parts.join('; ')}`;\n}\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 * log.warn('payload-mismatch', {\n * listenerTrait: m.listenerTrait,\n * emitterTrait: m.emitterTrait,\n * event: m.event,\n * referencedField: m.referencedField,\n * availableFields: 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 * Pure config-default extraction — kept OUT of `OrbitalServerRuntime.ts` so the\n * package index can re-export it without dragging that module's node-only\n * imports (`module`/`createRequire`, the external loader) into a browser bundle.\n * This file has zero node dependencies (types only, from `@almadar/core`).\n */\nimport type { TraitConfig, TraitConfigValue, DeclaredTraitConfig } from '@almadar/core';\n\n/**\n * Walk a trait's declared `config { }` schema and return the flat\n * `{ key: default, ... }` map. Seeds `@config.X` binding context with the\n * atom's own declared defaults before any call-site override is applied.\n * Mirrors the compiled path's `DEFAULT_<TRAIT>_CONFIG` constant (backend.rs).\n */\nexport function collectDeclaredConfigDefaults(\n trait: { config?: DeclaredTraitConfig } | undefined,\n): TraitConfig | undefined {\n if (!trait) return undefined;\n const schema = trait.config;\n if (!schema || typeof schema !== 'object') return undefined;\n const defaults: Record<string, TraitConfigValue> = {};\n let hasAny = false;\n for (const [key, field] of Object.entries(schema)) {\n if (field && typeof field === 'object' && !Array.isArray(field) && 'default' in field) {\n const def = (field as { default?: TraitConfigValue }).default;\n if (def !== undefined) {\n defaults[key] = def;\n hasAny = true;\n }\n }\n }\n return hasAny ? defaults : undefined;\n}\n","/**\n * MockPersistenceAdapter - In-memory data store with faker-based mock generation\n *\n * Provides a stateful mock data layer that implements PersistenceAdapter.\n * Uses @faker-js/faker for realistic data generation based on field types.\n *\n * @packageDocumentation\n */\n\nimport { faker } from '@faker-js/faker';\nimport type { PersistenceAdapter } from './OrbitalServerRuntime.js';\nimport type { EntityRow } from './types.js';\nimport type { EntityField, FieldValue } from '@almadar/core';\nimport { createLogger } from '@almadar/logger';\n\nconst mockLog = createLogger('almadar:runtime:mock');\n\n/** Default seed used when callers don't provide one. Fixed so re-seeds\n * during hermetic-frame mode produce identical row data each time —\n * matching the compiled path's compile-baked-in mock semantics. */\nconst DEFAULT_MOCK_SEED = 42;\n\n/** Return a deterministic stock-photo URL from Picsum Photos.\n * Free, no API key, seed-stable so the same entity+field always renders\n * the same image across reruns. Used for fields declaring\n * `format: \"image\" | \"avatar\" | \"thumbnail\"` and a few well-known field\n * names (`imageUrl`, `photo`, etc.). */\nfunction picsumUrl(entityName: string, fieldName: string, width = 400, height = 400): string {\n const seed = `${entityName}-${fieldName}-${faker.number.int({ min: 0, max: 1000 })}`;\n return `https://picsum.photos/seed/${encodeURIComponent(seed)}/${width}/${height}`;\n}\n/** Reference timestamp used as `now` for seeded rows. Deterministic so\n * diff observers don't see all rows as \"changed\" between frames just\n * because the wallclock advanced. */\nconst SEED_REFERENCE_TIMESTAMP = '2024-01-01T00:00:00.000Z';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n// EntityField is the canonical discriminated union from @almadar/core\n// (re-exported here so existing consumers don't break). All variant-specific\n// fields (`items`, `properties`, `relation`, `values`, `format`) live on the\n// canonical type — no local shadow shape.\nexport type { EntityField };\n\n/** EntityField narrowed to require `name`. The canonical type makes `name`\n * optional (it's omitted on nested `items` / `properties` descriptors), but\n * the seed loop iterates by name. Callers filter for name-having fields\n * at the registerEntity boundary. */\ntype NamedEntityField = EntityField & { name: string };\n\nexport interface EntitySchema {\n name: string;\n fields: NamedEntityField[];\n /** Pre-authored instance data from the schema (used instead of faker generation) */\n seedData?: EntityRow[];\n}\n\nexport interface MockPersistenceConfig {\n /** Seed for deterministic generation */\n seed?: number;\n /** Default number of records to generate per entity */\n defaultSeedCount?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n// ============================================================================\n// MockPersistenceAdapter\n// ============================================================================\n\n/**\n * In-memory mock data store with CRUD operations and faker-based seeding.\n */\nexport class MockPersistenceAdapter implements PersistenceAdapter {\n private stores: Map<string, Map<string, EntityRow>> = new Map();\n private schemas: Map<string, EntitySchema> = new Map();\n private idCounters: Map<string, number> = new Map();\n private config: MockPersistenceConfig;\n\n constructor(config: MockPersistenceConfig = {}) {\n this.config = {\n defaultSeedCount: 6,\n debug: false,\n ...config,\n // Apply default after spread so an undefined `seed` in the\n // input doesn't overwrite the default.\n seed: config.seed ?? DEFAULT_MOCK_SEED,\n };\n faker.seed(this.config.seed);\n mockLog.debug('mock:adapter:init', { seed: this.config.seed });\n }\n\n /** Re-anchor faker's PRNG to the configured seed. Called before every\n * re-seed loop so identical reseed sequences produce identical rows\n * (timestamps + faker-generated fields). Without this, the first\n * reseed produces row set A, the second produces row set B, and\n * diff observers see all rows as \"changed\" between frames. */\n resetFakerSeed(): void {\n if (this.config.seed !== undefined) {\n faker.seed(this.config.seed);\n }\n }\n\n // ============================================================================\n // Store Management\n // ============================================================================\n\n private getStore(entityName: string): Map<string, EntityRow> {\n const normalized = entityName.toLowerCase();\n if (!this.stores.has(normalized)) {\n this.stores.set(normalized, new Map());\n this.idCounters.set(normalized, 0);\n }\n return this.stores.get(normalized)!;\n }\n\n private nextId(entityName: string): string {\n const normalized = entityName.toLowerCase();\n const counter = (this.idCounters.get(normalized) ?? 0) + 1;\n this.idCounters.set(normalized, counter);\n return `${this.capitalizeFirst(entityName)} Id ${counter}`;\n }\n\n // ============================================================================\n // Schema & Seeding\n // ============================================================================\n\n /**\n * Register an entity schema and seed mock data.\n * If the schema has seedData, those instances are used directly.\n * Otherwise, random mock data is generated with faker.\n */\n registerEntity(schema: EntitySchema, seedCount?: number): void {\n const normalized = schema.name.toLowerCase();\n this.schemas.set(normalized, schema);\n\n if (schema.seedData && schema.seedData.length > 0) {\n // Seed with actual pre-authored instances\n this.seedFromInstances(schema.name, schema.seedData);\n } else {\n const count = seedCount ?? this.config.defaultSeedCount ?? 6;\n this.seed(schema.name, schema.fields, count);\n }\n\n // Phase 9.6.A: re-link relation fields across ALL registered entities.\n // Relations may point at entities registered before OR after this one;\n // a global pass after each registration is cheap (O(rows × fields)) and\n // keeps relation arrays in sync with whichever stores currently exist.\n this.linkRelationFields();\n }\n\n /**\n * Walk every row of every registered entity and fill in `type: \"relation\"`\n * fields with real IDs from the target entity's store. Without this pass,\n * relation fields stay as placeholder `[]` / `\"\"` and `populateRelations`\n * in OrbitalServerRuntime has nothing to hydrate — catalog/preview demos\n * of nested-tree atoms (e.g. std-thread-comments-linear with ThreadPost.\n * replies → [ThreadPost]) render empty reply cards.\n *\n * For self-referential relations, each row gets 2–4 sibling IDs (excluding\n * self). For cross-entity relations, IDs are picked from the target store.\n * The runtime caps recursion at depth=2 in `populateRelations`, so\n * grandparent-of-self cycles render two levels deep then stop.\n */\n linkRelationFields(): void {\n for (const [normalizedName, schema] of this.schemas) {\n const store = this.stores.get(normalizedName);\n if (!store) continue;\n // Narrow to RelationEntityField (with required `relation` config) via the\n // canonical discriminator. The `f is NamedEntityField & { type: \"relation\" }`\n // predicate is what makes `field.relation` typed in the loop below — no\n // record-access casts, no unknown narrowing.\n const relationFields = schema.fields.filter(\n (f): f is NamedEntityField & { type: 'relation'; relation: { entity: string; cardinality?: string; field?: string } } =>\n f.type === 'relation',\n );\n if (relationFields.length === 0) continue;\n for (const row of store.values()) {\n for (const field of relationFields) {\n const targetStore = this.stores.get(field.relation.entity.toLowerCase());\n if (!targetStore || targetStore.size === 0) continue;\n // Eligible IDs: every id in the target store, minus this row's own id\n // (only when target === self entity) so a comment doesn't list itself\n // as its own reply.\n const selfId = row['id'] as string | undefined;\n const sameStore = targetStore === store;\n const eligible: string[] = [];\n for (const id of targetStore.keys()) {\n if (sameStore && id === selfId) continue;\n eligible.push(id);\n }\n if (eligible.length === 0) continue;\n const cardinality = field.relation.cardinality ?? 'many';\n if (cardinality === 'one' || cardinality === 'many-to-one') {\n row[field.name] = faker.helpers.arrayElement(eligible) as FieldValue;\n } else {\n // many / one-to-many / many-to-many → pick 2–4 IDs\n const pickCount = Math.min(eligible.length, faker.number.int({ min: 2, max: 4 }));\n row[field.name] = faker.helpers\n .shuffle(eligible.slice())\n .slice(0, pickCount) as FieldValue;\n }\n }\n }\n }\n }\n\n /**\n * Seed an entity with pre-authored instance data.\n */\n seedFromInstances(entityName: string, instances: EntityRow[]): void {\n const store = this.getStore(entityName);\n\n if (this.config.debug) {\n mockLog.debug('seeding-from-instances', { count: instances.length, entity: entityName });\n }\n\n for (const instance of instances) {\n const id = (instance.id as string) || this.nextId(entityName);\n const item: EntityRow = {\n ...instance,\n id,\n createdAt: instance.createdAt as string || SEED_REFERENCE_TIMESTAMP,\n updatedAt: SEED_REFERENCE_TIMESTAMP,\n };\n store.set(id, item);\n }\n }\n\n /**\n * Seed an entity with mock data.\n */\n seed(entityName: string, fields: EntityField[], count: number): void {\n const store = this.getStore(entityName);\n const normalized = entityName.toLowerCase();\n\n if (this.config.debug) {\n mockLog.debug('seeding', { count, entity: entityName });\n }\n\n const generated: Array<{ id: string; updatedAt: string }> = [];\n for (let i = 0; i < count; i++) {\n const item = this.generateMockItem(normalized, entityName, fields, i + 1);\n store.set(item.id as string, item);\n generated.push({\n id: item.id as string,\n updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : '',\n });\n }\n mockLog.debug('mock:seed', () => ({ entityName, count, idsAndTimestamps: JSON.stringify(generated) }));\n }\n\n /**\n * Generate a single mock item based on field schemas.\n */\n private generateMockItem(\n normalizedName: string,\n entityName: string,\n fields: EntityField[],\n index: number\n ): EntityRow {\n const id = this.nextId(entityName);\n // Deterministic timestamps: keep updatedAt anchored at the seed\n // reference so re-seeded rows compare identically across hermetic\n // frames. createdAt uses faker (also deterministic with seed) to\n // simulate a realistic creation date.\n const item: EntityRow = {\n id,\n createdAt: faker.date.past({ years: 1 }).toISOString(),\n updatedAt: SEED_REFERENCE_TIMESTAMP,\n };\n\n for (const field of fields) {\n // Skip nameless nested-descriptor fields (canonical EntityField allows\n // `name?` on inner items/properties; the top-level seed loop only\n // iterates real named fields).\n if (!field.name) continue;\n if (field.name === 'id' || field.name === 'createdAt' || field.name === 'updatedAt') {\n continue;\n }\n item[field.name] = this.generateFieldValue(entityName, field, index);\n }\n\n return item;\n }\n\n /** Max nesting depth for recursive array/object schemas (e.g. a Comment\n * entity whose `replies: [Comment]` field references itself). Without\n * this guard, generateArrayValue → generateObjectValue → generateArray…\n * recurses until stack overflow on every recursive type. Three levels\n * is enough to render a useful thread depth (parent → reply → sub-reply)\n * in catalog/preview without blowing the fixture. */\n private static MAX_NESTED_DEPTH = 3;\n\n /**\n * Generate a mock value for a field based on its schema.\n */\n private generateFieldValue(entityName: string, field: EntityField, index: number, depth = 0): FieldValue {\n // Mock-seed default policy: numeric fields preserve their declared\n // default (so `tokenCount : number = 0` stays 0), every other type\n // falls through to faker. Mirrors the gate in the compiled-path\n // codegen (`backend.rs:generate_seed_mock_data`). String/enum/bool/\n // date placeholder defaults like `name = \"\"` would otherwise paint\n // every seeded row with the same literal.\n const fieldTypeLc = field.type.toLowerCase();\n // `values` is on ScalarEntityField + EnumEntityField only. Narrow via\n // the discriminator instead of casting to `unknown` so we keep canonical\n // type safety end-to-end.\n const values = 'values' in field ? field.values : undefined;\n mockLog.debug('field:generate', {\n entityName,\n fieldName: field.name,\n fieldType: fieldTypeLc,\n hasValues: !!values?.length,\n valuesCount: values?.length ?? 0,\n values: values?.length ? values.join(',') : null,\n format: field.format ?? null,\n hasDefault: field.default !== undefined,\n });\n const isNumeric = fieldTypeLc === 'number' || fieldTypeLc === 'integer';\n if (isNumeric && field.default !== undefined) {\n return field.default as FieldValue;\n }\n\n // Always populate seeded fields. The previous 80% heuristic dropped\n // ~20% of optional fields to null to \"exercise the UI's empty path\",\n // but that flaked runtime-verify — a seeded row could silently come\n // out with `name=null` and the DataGrid would render a blank-title\n // card that didn't match any test expectation. Deterministic seed\n // data is more valuable than random-nil stress; callers who want\n // nil-testing should construct that scenario explicitly.\n //\n // Switch on the canonical `field.type` (not the lowercased local var) so\n // each case narrows `field` to its discriminated-union variant — e.g.\n // `case 'array'` gives us `ArrayEntityField` with typed `items`, `case\n // 'relation'` gives `RelationEntityField` with typed `relation`. No\n // `unknown`/record-typed access needed.\n switch (field.type) {\n case 'string':\n return this.generateStringValue(entityName, field, index);\n\n case 'number':\n return faker.number.int({ min: 0, max: 100 });\n\n case 'boolean':\n return faker.datatype.boolean();\n\n case 'date':\n case 'timestamp':\n case 'datetime':\n return this.generateDateValue(field);\n\n case 'enum':\n // After narrowing, field is EnumEntityField with required values. The\n // optional check is defensive in case canonical changes shape.\n if (field.values && field.values.length > 0) {\n return faker.helpers.arrayElement(field.values);\n }\n return null;\n\n case 'relation':\n // Placeholder — filled in by `linkRelationFields` after the seed pass\n // (target entity's store may not exist yet at field-generation time).\n // many-cardinality → empty array slot; one-cardinality → empty string slot.\n return field.relation?.cardinality === 'one' ? '' : [];\n\n case 'array':\n return this.generateArrayValue(entityName, field, index, depth);\n case 'object':\n return this.generateObjectValue(entityName, field, index, depth);\n\n default:\n // Treat unknown types as strings\n return this.generateStringValue(entityName, field, index);\n }\n }\n\n /**\n * Generate 3–5 elements for an array field. When `items` describes an\n * object shape (the common case for `tiles: [KpiTile]`-style declarations),\n * each element is recursively mock-generated against `items.properties`.\n * When `items` describes a scalar, each element uses the scalar generator\n * for that type. When `items` is missing (legacy `[object] = []` declarations\n * with no element schema), falls back to an empty array — the historical\n * behavior.\n */\n private generateArrayValue(entityName: string, field: EntityField, index: number, depth = 0): FieldValue {\n if (field.type !== 'array' || !field.items) return [];\n // Stop recursing on self-referential types (e.g. Comment.replies: [Comment]).\n // Without this guard, faker would loop forever materialising replies-of-\n // replies-of-replies until the call stack blows.\n if (depth >= MockPersistenceAdapter.MAX_NESTED_DEPTH) return [];\n const count = faker.number.int({ min: 3, max: 5 });\n const out: FieldValue[] = [];\n const elementName = field.name ?? 'item';\n for (let i = 0; i < count; i++) {\n // Synthesize a child EntityField for the element. Each iteration gets a\n // fresh `index` so per-element string generators don't repeat verbatim.\n // The spread preserves the discriminator on `items` (string/object/array/…)\n // so generateFieldValue's switch narrows correctly.\n const elementField = {\n ...field.items,\n name: `${elementName}[${i}]`,\n } as EntityField;\n out.push(this.generateFieldValue(entityName, elementField, index * 10 + i, depth + 1));\n }\n return out as FieldValue;\n }\n\n /**\n * Generate a single object value with each declared property populated\n * by faker. Walks `properties` and recursively delegates to\n * `generateFieldValue` per property so nested objects-of-arrays-of-objects\n * compose correctly.\n */\n private generateObjectValue(entityName: string, field: EntityField, index: number, depth = 0): FieldValue {\n if (!field.properties) return null;\n if (depth >= MockPersistenceAdapter.MAX_NESTED_DEPTH) return null;\n const out: Record<string, FieldValue> = {};\n for (const [propName, propField] of Object.entries(field.properties)) {\n // The nested schema may omit `name` (it's implied by the parent key)\n // — synthesize one so downstream string generators that read `field.name`\n // have something to log against.\n const childField = { ...propField, name: propName } as EntityField;\n out[propName] = this.generateFieldValue(entityName, childField, index, depth + 1);\n }\n return out as FieldValue;\n }\n\n /**\n * Generate a string value based on the field's declared schema metadata.\n * Reads `values` (enum) first, then `format` (email/url/phone/uuid/date/\n * datetime), then falls back to faker.lorem.words. No field-name heuristics\n * — the schema is the source of truth. If a caller needs a real email, they\n * declare `format: \"email\"`; if they need an enum, they declare `values: [...]`.\n */\n private generateStringValue(entityName: string, field: EntityField, _index: number): string {\n // `values` exists on Scalar + Enum variants only. Narrow via canonical\n // discriminator so the access is type-safe without a record cast.\n const values = 'values' in field ? field.values : undefined;\n if (values && values.length > 0) {\n return faker.helpers.arrayElement(values);\n }\n // `field.name` is optional on the canonical EntityField (nested item/\n // property descriptors omit it). Top-level seed loop filters those out,\n // so name is set here in practice — but the type system needs the\n // explicit fallback to satisfy strict-null checks.\n const fieldName = field.name ?? 'field';\n switch (field.format) {\n case 'email': return faker.internet.email();\n case 'url': return faker.internet.url();\n case 'phone': return faker.phone.number();\n case 'uuid': return faker.string.uuid();\n case 'date': return faker.date.recent().toISOString().split('T')[0]!;\n case 'datetime': return faker.date.recent().toISOString();\n case 'image':\n case 'avatar':\n case 'thumbnail':\n return picsumUrl(entityName, fieldName);\n }\n // Field-name fallback for image-bearing string fields. Authors who haven't\n // (yet) annotated `format: \"image\"` still get a real photo from Picsum\n // rather than a `faker.lorem.words(2)` sentence that breaks data-grid\n // imageField rendering. Heuristic is narrow + clearly named.\n const lname = fieldName.toLowerCase();\n if (\n lname === 'image' ||\n lname === 'imageurl' ||\n lname === 'image_url' ||\n lname === 'photo' ||\n lname === 'photourl' ||\n lname === 'photo_url' ||\n lname === 'avatar' ||\n lname === 'avatarurl' ||\n lname === 'avatar_url' ||\n lname === 'thumbnail' ||\n lname === 'thumbnailurl' ||\n lname === 'thumbnail_url' ||\n lname === 'picture' ||\n lname === 'pictureurl' ||\n lname === 'cover' ||\n lname === 'coverurl' ||\n lname === 'banner' ||\n lname === 'bannerurl'\n ) {\n return picsumUrl(entityName, fieldName);\n }\n const value = faker.lorem.words(2);\n mockLog.debug('field:fallback-lorem', () => ({\n entityName,\n fieldName: field.name,\n hasValues: false,\n format: field.format ?? null,\n generated: value,\n }));\n return value;\n }\n\n /**\n * Generate a date value. Uses the field's `format` (date vs datetime) to\n * decide ISO shape; otherwise returns a recent ISO-8601 datetime. No\n * field-name heuristics.\n */\n private generateDateValue(field: EntityField): string {\n const date = faker.date.recent({ days: 30 });\n if (field.format === 'date') return date.toISOString().split('T')[0]!;\n return date.toISOString();\n }\n\n private capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n // ============================================================================\n // PersistenceAdapter Implementation\n // ============================================================================\n\n async create(\n entityType: string,\n data: EntityRow\n ): Promise<{ id: string }> {\n const store = this.getStore(entityType);\n const id = this.nextId(entityType);\n const now = new Date().toISOString();\n\n const withDefaults = this.applyFieldDefaults(entityType, data);\n\n const item = {\n ...withDefaults,\n id,\n createdAt: now,\n updatedAt: now,\n };\n\n store.set(id, item);\n return { id };\n }\n\n /**\n * Fill in any entity-declared field defaults that the caller omitted.\n * SAVE payloads coming from form-section only carry the fields the user\n * edited; persisted rows should still honor `field.default` so downstream\n * row-content probes (VG11f) see a row whose every declared-default field\n * is non-empty. `@now` resolves to the current ISO timestamp.\n */\n private applyFieldDefaults(entityType: string, data: EntityRow): EntityRow {\n const schema = this.schemas.get(entityType.toLowerCase());\n if (!schema) return data;\n const result: EntityRow = { ...data };\n for (const field of schema.fields) {\n if (field.name === 'id' || field.name === 'createdAt' || field.name === 'updatedAt') continue;\n if (result[field.name] !== undefined) continue;\n if (field.default === undefined) continue;\n result[field.name] = field.default === '@now'\n ? new Date().toISOString()\n : (field.default as FieldValue);\n }\n return result;\n }\n\n async update(\n entityType: string,\n id: string,\n data: EntityRow\n ): Promise<void> {\n const store = this.getStore(entityType);\n const existing = store.get(id);\n\n if (!existing) {\n throw new Error(`Entity ${entityType} with id ${id} not found`);\n }\n\n const updated = {\n ...existing,\n ...data,\n id, // Preserve original ID\n updatedAt: new Date().toISOString(),\n };\n\n store.set(id, updated);\n }\n\n async delete(entityType: string, id: string): Promise<void> {\n const store = this.getStore(entityType);\n if (!store.has(id)) {\n throw new Error(`Entity ${entityType} with id ${id} not found`);\n }\n store.delete(id);\n }\n\n async getById(\n entityType: string,\n id: string\n ): Promise<EntityRow | null> {\n const store = this.getStore(entityType);\n return store.get(id) ?? null;\n }\n\n async list(entityType: string): Promise<Array<EntityRow>> {\n const store = this.getStore(entityType);\n return Array.from(store.values());\n }\n\n // ============================================================================\n // Utilities\n // ============================================================================\n\n /**\n * Clear all data for an entity.\n */\n clear(entityName: string): void {\n const normalized = entityName.toLowerCase();\n this.stores.delete(normalized);\n this.idCounters.delete(normalized);\n }\n\n /** Clear all data + re-anchor faker so the next seed loop reproduces\n * identical rows. Hermetic-frame mode calls this between every step\n * via OrbitalServerRuntime.resetMockPersistence. */\n clearAll(): void {\n this.stores.clear();\n this.idCounters.clear();\n this.resetFakerSeed();\n mockLog.debug('mock:adapter:clearAll', { reanchored: this.config.seed });\n }\n\n /**\n * Get count of items for an entity.\n */\n count(entityName: string): number {\n const store = this.getStore(entityName);\n return store.size;\n }\n}\n\n/**\n * Create a MockPersistenceAdapter instance.\n */\nexport function createMockPersistence(config?: MockPersistenceConfig): MockPersistenceAdapter {\n return new MockPersistenceAdapter(config);\n}\n","/**\n * SchemaLoader Interface\n *\n * Abstract interface for loading OrbitalSchema files from various sources.\n * Implementations exist for:\n * - FileSystemLoader (Node.js) - uses fs module\n * - HttpLoader (Browser) - uses fetch API\n * - UnifiedLoader (Auto-detect) - routes to appropriate loader\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalSchema, Orbital } from \"@almadar/core\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Result of loading a schema.\n */\nexport interface LoadedSchema {\n /** The loaded schema */\n schema: OrbitalSchema;\n\n /** Source path/URL (resolved) */\n sourcePath: string;\n\n /** Original import path */\n importPath: string;\n}\n\n/**\n * Result of loading a single orbital from a schema.\n */\nexport interface LoadedOrbital {\n /** The loaded orbital */\n orbital: Orbital;\n\n /** Source path/URL (resolved) */\n sourcePath: string;\n\n /** Original import path */\n importPath: string;\n}\n\n/**\n * Loader result with error handling.\n */\nexport type LoadResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n\n/**\n * Base options for all loaders.\n */\nexport interface BaseLoaderOptions {\n /** Base path/URL for resolving relative imports */\n basePath: string;\n\n /** Standard library root path/URL */\n stdLibPath?: string;\n\n /** Scoped package roots (e.g., { \"@game-lib\": \"/path/to/lib\" }) */\n scopedPaths?: Record<string, string>;\n}\n\n/**\n * Options for file system loading.\n */\nexport interface FileSystemLoaderOptions extends BaseLoaderOptions {\n /** Whether to allow paths outside basePath (security) */\n allowOutsideBasePath?: boolean;\n}\n\n/**\n * Options for HTTP loading.\n */\nexport interface HttpLoaderOptions extends BaseLoaderOptions {\n /** Default fetch options */\n fetchOptions?: RequestInit;\n\n /** Request timeout in milliseconds */\n timeout?: number;\n\n /** Whether to use credentials (cookies, auth headers) */\n credentials?: RequestCredentials;\n}\n\n/**\n * Combined options for unified loader.\n */\nexport interface UnifiedLoaderOptions extends BaseLoaderOptions {\n /** File system specific options */\n fileSystem?: Omit<FileSystemLoaderOptions, keyof BaseLoaderOptions>;\n\n /** HTTP specific options */\n http?: Omit<HttpLoaderOptions, keyof BaseLoaderOptions>;\n\n /** Force a specific loader type */\n forceLoader?: \"filesystem\" | \"http\";\n}\n\n/**\n * Loader strategy type for environment-specific loading.\n */\nexport type LoaderStrategy = \"filesystem\" | \"http\" | \"auto\";\n\n// ============================================================================\n// SchemaLoader Interface\n// ============================================================================\n\n/**\n * Abstract interface for schema loaders.\n *\n * All loaders must implement:\n * - load() - Load a schema from an import path\n * - resolvePath() - Resolve an import path to absolute path/URL\n *\n * @example\n * ```typescript\n * // Using FileSystemLoader (Node.js)\n * const loader: SchemaLoader = new FileSystemLoader({ basePath: \"/schemas\" });\n * const result = await loader.load(\"./my-schema.orb\");\n *\n * // Using HttpLoader (Browser)\n * const loader: SchemaLoader = new HttpLoader({ basePath: \"/api/schemas\" });\n * const result = await loader.load(\"./my-schema.orb\");\n *\n * // Using UnifiedLoader (auto-detect)\n * const loader: SchemaLoader = createUnifiedLoader({ basePath: \"/schemas\" });\n * const result = await loader.load(\"./my-schema.orb\");\n * ```\n */\nexport interface SchemaLoader {\n /**\n * Load a schema from an import path.\n *\n * @param importPath - The import path (e.g., \"./health.orb\", \"std/behaviors/game-core\")\n * @param fromPath - The path of the file doing the import (for relative resolution)\n * @param chain - Import chain for circular detection (optional)\n */\n load(\n importPath: string,\n fromPath?: string,\n chain?: ImportChainLike\n ): Promise<LoadResult<LoadedSchema>>;\n\n /**\n * Load a specific orbital from a schema by name.\n *\n * @param importPath - The import path\n * @param orbitalName - The orbital name (optional, defaults to first orbital)\n * @param fromPath - The path of the file doing the import\n * @param chain - Import chain for circular detection (optional)\n */\n loadOrbital(\n importPath: string,\n orbitalName?: string,\n fromPath?: string,\n chain?: ImportChainLike\n ): Promise<LoadResult<LoadedOrbital>>;\n\n /**\n * Resolve an import path to an absolute path/URL.\n *\n * @param importPath - The import path\n * @param fromPath - The path of the file doing the import (optional)\n */\n resolvePath(importPath: string, fromPath?: string): LoadResult<string>;\n\n /**\n * Clear the loader's cache.\n */\n clearCache(): void;\n\n /**\n * Get cache statistics.\n */\n getCacheStats(): { size: number };\n}\n\n/**\n * Interface for import chain (circular detection).\n * This allows different implementations to interoperate.\n */\nexport interface ImportChainLike {\n /**\n * Try to add a path to the chain.\n * @returns Error message if circular, null if OK\n */\n push(absolutePath: string): string | null;\n\n /**\n * Remove the last path from the chain.\n */\n pop(): void;\n\n /**\n * Clone the chain for nested loading.\n */\n clone(): ImportChainLike;\n}\n\n// ============================================================================\n// Environment Detection\n// ============================================================================\n\n/**\n * Detect if running in Electron.\n */\nexport function isElectron(): boolean {\n return typeof process !== \"undefined\" && !!process.versions?.electron;\n}\n\n/**\n * Detect if running in browser (not Electron).\n */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && !isElectron();\n}\n\n/**\n * Detect if running in Node.js (not browser).\n */\nexport function isNode(): boolean {\n return typeof process !== \"undefined\" && !isBrowser();\n}\n\n/**\n * Get the recommended loader strategy for the current environment.\n */\nexport function getDefaultLoaderStrategy(): LoaderStrategy {\n if (isBrowser()) {\n return \"http\";\n }\n return \"filesystem\";\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Schema loader factory function type.\n */\nexport type SchemaLoaderFactory<T extends BaseLoaderOptions = BaseLoaderOptions> = (\n options: T\n) => SchemaLoader;\n","/**\n * HTTP Schema Loader\n *\n * Loads OrbitalSchema files via HTTP/fetch for browser environments.\n * Also works in Node.js with the fetch API.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalSchema, Orbital } from \"@almadar/core\";\nimport { OrbitalSchemaSchema } from \"@almadar/core\";\nimport type {\n SchemaLoader,\n LoadedSchema,\n LoadedOrbital,\n LoadResult,\n HttpLoaderOptions,\n ImportChainLike,\n} from \"./schema-loader.js\";\n\n// ============================================================================\n// Import Chain Implementation\n// ============================================================================\n\n/**\n * Tracks import chains to detect circular imports.\n * Compatible with ImportChainLike interface.\n */\nexport class HttpImportChain implements ImportChainLike {\n private chain: string[] = [];\n\n /**\n * Try to add a path to the chain.\n * @returns Error message if circular, null if OK\n */\n push(absolutePath: string): string | null {\n if (this.chain.includes(absolutePath)) {\n const cycle = [\n ...this.chain.slice(this.chain.indexOf(absolutePath)),\n absolutePath,\n ];\n return `Circular import detected: ${cycle.join(\" -> \")}`;\n }\n this.chain.push(absolutePath);\n return null;\n }\n\n /**\n * Remove the last path from the chain.\n */\n pop(): void {\n this.chain.pop();\n }\n\n /**\n * Clone the chain for nested loading.\n */\n clone(): HttpImportChain {\n const newChain = new HttpImportChain();\n newChain.chain = [...this.chain];\n return newChain;\n }\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\n/**\n * Cache for loaded schemas to avoid re-fetching.\n */\nclass HttpLoaderCache {\n private cache = new Map<string, LoadedSchema>();\n\n get(url: string): LoadedSchema | undefined {\n return this.cache.get(url);\n }\n\n set(url: string, schema: LoadedSchema): void {\n this.cache.set(url, schema);\n }\n\n has(url: string): boolean {\n return this.cache.has(url);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n// ============================================================================\n// HTTP Loader\n// ============================================================================\n\n/**\n * HttpLoader - Loads OrbitalSchema files via HTTP/fetch.\n *\n * Designed for browser environments where file system access is not available.\n * Uses the fetch API for loading schemas.\n *\n * Path Resolution:\n * - Relative paths: `./health.orb` -> base URL + path\n * - Standard library: `std/behaviors/game-core` -> std lib URL + path\n * - Scoped packages: `@scope/pkg.orb` -> scoped URL + path\n * - Absolute URLs: `https://...` -> used directly\n *\n * @example\n * ```typescript\n * const loader = new HttpLoader({\n * basePath: \"/api/schemas\",\n * stdLibPath: \"https://cdn.example.com/orbital-std\",\n * });\n *\n * // Load from relative path\n * const result = await loader.load(\"./my-schema.orb\");\n *\n * // Load from std library\n * const stdResult = await loader.load(\"std/behaviors/game-core\");\n * ```\n */\nexport class HttpLoader implements SchemaLoader {\n private options: Required<\n Pick<HttpLoaderOptions, \"basePath\" | \"stdLibPath\" | \"scopedPaths\">\n > &\n HttpLoaderOptions;\n private cache: HttpLoaderCache;\n\n constructor(options: HttpLoaderOptions) {\n this.options = {\n basePath: options.basePath,\n stdLibPath: options.stdLibPath ?? \"\",\n scopedPaths: options.scopedPaths ?? {},\n fetchOptions: options.fetchOptions,\n timeout: options.timeout ?? 30000,\n credentials: options.credentials ?? \"same-origin\",\n };\n this.cache = new HttpLoaderCache();\n }\n\n /**\n * Load a schema from an import path.\n */\n async load(\n importPath: string,\n fromPath?: string,\n chain?: ImportChainLike\n ): Promise<LoadResult<LoadedSchema>> {\n const importChain = chain ?? new HttpImportChain();\n\n // Resolve to absolute URL\n const resolveResult = this.resolvePath(importPath, fromPath);\n if (!resolveResult.success) {\n return resolveResult;\n }\n const absoluteUrl = resolveResult.data;\n\n // Check for circular imports\n const circularError = importChain.push(absoluteUrl);\n if (circularError) {\n return { success: false, error: circularError };\n }\n\n try {\n // Check cache\n const cached = this.cache.get(absoluteUrl);\n if (cached) {\n return { success: true, data: cached };\n }\n\n // Fetch and parse the schema\n const loadResult = await this.fetchSchema(absoluteUrl);\n if (!loadResult.success) {\n return loadResult;\n }\n\n const loaded: LoadedSchema = {\n schema: loadResult.data,\n sourcePath: absoluteUrl,\n importPath,\n };\n\n // Cache the result\n this.cache.set(absoluteUrl, loaded);\n\n return { success: true, data: loaded };\n } finally {\n importChain.pop();\n }\n }\n\n /**\n * Load a specific orbital from a schema by name.\n */\n async loadOrbital(\n importPath: string,\n orbitalName?: string,\n fromPath?: string,\n chain?: ImportChainLike\n ): Promise<LoadResult<LoadedOrbital>> {\n const schemaResult = await this.load(importPath, fromPath, chain);\n if (!schemaResult.success) {\n return schemaResult;\n }\n\n const schema = schemaResult.data.schema;\n let orbital: Orbital;\n\n if (orbitalName) {\n const found = schema.orbitals.find(\n (o: Orbital) => o.name === orbitalName\n );\n if (!found) {\n return {\n success: false,\n error: `Orbital \"${orbitalName}\" not found in ${importPath}. Available: ${schema.orbitals.map((o: Orbital) => o.name).join(\", \")}`,\n };\n }\n orbital = found;\n } else {\n // Default to first orbital\n if (schema.orbitals.length === 0) {\n return {\n success: false,\n error: `No orbitals found in ${importPath}`,\n };\n }\n orbital = schema.orbitals[0];\n }\n\n return {\n success: true,\n data: {\n orbital,\n sourcePath: schemaResult.data.sourcePath,\n importPath,\n },\n };\n }\n\n /**\n * Resolve an import path to an absolute URL.\n */\n resolvePath(importPath: string, fromPath?: string): LoadResult<string> {\n // Already absolute URL\n if (importPath.startsWith(\"http://\") || importPath.startsWith(\"https://\")) {\n return { success: true, data: importPath };\n }\n\n // Standard library\n if (importPath.startsWith(\"std/\")) {\n return this.resolveStdPath(importPath);\n }\n\n // Scoped packages\n if (importPath.startsWith(\"@\")) {\n return this.resolveScopedPath(importPath);\n }\n\n // Relative paths\n if (importPath.startsWith(\"./\") || importPath.startsWith(\"../\")) {\n return this.resolveRelativePath(importPath, fromPath);\n }\n\n // Default: treat as relative to base path\n return this.resolveRelativePath(`./${importPath}`, fromPath);\n }\n\n /**\n * Resolve a standard library path.\n */\n private resolveStdPath(importPath: string): LoadResult<string> {\n if (!this.options.stdLibPath) {\n return {\n success: false,\n error: `Standard library URL not configured. Cannot load: ${importPath}`,\n };\n }\n\n // std/behaviors/game-core -> stdLibPath/behaviors/game-core.orb\n const relativePath = importPath.slice(4); // Remove \"std/\"\n let absoluteUrl = this.joinUrl(this.options.stdLibPath, relativePath);\n\n // Add .orb extension if not present\n if (!absoluteUrl.endsWith(\".orb\")) {\n absoluteUrl += \".orb\";\n }\n\n return { success: true, data: absoluteUrl };\n }\n\n /**\n * Resolve a scoped package path.\n */\n private resolveScopedPath(importPath: string): LoadResult<string> {\n // Extract scope: @game-lib/enemies.orb -> @game-lib\n const match = importPath.match(/^(@[^/]+)/);\n if (!match) {\n return {\n success: false,\n error: `Invalid scoped package path: ${importPath}`,\n };\n }\n\n const scope = match[1];\n const scopeRoot = this.options.scopedPaths[scope];\n if (!scopeRoot) {\n return {\n success: false,\n error: `Scoped package \"${scope}\" not configured. Available: ${Object.keys(this.options.scopedPaths).join(\", \") || \"none\"}`,\n };\n }\n\n // @game-lib/enemies.orb -> scopeRoot/enemies.orb\n const relativePath = importPath.slice(scope.length + 1); // Remove \"@scope/\"\n let absoluteUrl = this.joinUrl(scopeRoot, relativePath);\n\n // Add .orb extension if not present\n if (!absoluteUrl.endsWith(\".orb\")) {\n absoluteUrl += \".orb\";\n }\n\n return { success: true, data: absoluteUrl };\n }\n\n /**\n * Resolve a relative path.\n */\n private resolveRelativePath(\n importPath: string,\n fromPath?: string\n ): LoadResult<string> {\n const baseUrl = fromPath ? this.getParentUrl(fromPath) : this.options.basePath;\n\n let absoluteUrl = this.joinUrl(baseUrl, importPath);\n\n // Add .orb extension if not present\n if (!absoluteUrl.endsWith(\".orb\")) {\n absoluteUrl += \".orb\";\n }\n\n return { success: true, data: absoluteUrl };\n }\n\n /**\n * Fetch and parse an OrbitalSchema from a URL.\n */\n private async fetchSchema(url: string): Promise<LoadResult<OrbitalSchema>> {\n try {\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.options.timeout\n );\n\n try {\n const response = await fetch(url, {\n ...this.options.fetchOptions,\n credentials: this.options.credentials,\n signal: controller.signal,\n headers: {\n Accept: \"application/json\",\n ...this.options.fetchOptions?.headers,\n },\n });\n\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText} for ${url}`,\n };\n }\n\n const text = await response.text();\n\n // Parse JSON\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch (e) {\n return {\n success: false,\n error: `Invalid JSON in ${url}: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n\n // Validate with Zod\n const parseResult = OrbitalSchemaSchema.safeParse(data);\n if (!parseResult.success) {\n const errors = parseResult.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n return {\n success: false,\n error: `Invalid schema in ${url}:\\n${errors}`,\n };\n }\n\n return { success: true, data: parseResult.data as OrbitalSchema };\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (e) {\n if (e instanceof Error && e.name === \"AbortError\") {\n return {\n success: false,\n error: `Request timeout for ${url} (${this.options.timeout}ms)`,\n };\n }\n return {\n success: false,\n error: `Failed to fetch ${url}: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }\n\n /**\n * Join URL parts, handling relative paths and trailing slashes.\n */\n private joinUrl(base: string, path: string): string {\n // Handle absolute URLs in path\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path;\n }\n\n // Use URL API if available (browser and modern Node.js)\n if (typeof URL !== \"undefined\") {\n try {\n // Ensure base has a trailing slash for proper resolution\n const baseUrl = base.endsWith(\"/\") ? base : base + \"/\";\n return new URL(path, baseUrl).href;\n } catch {\n // Fall back to string manipulation\n }\n }\n\n // Simple string manipulation fallback\n const normalizedBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const normalizedPath = path.startsWith(\"/\") ? path : \"/\" + path;\n\n // Handle relative path navigation\n if (normalizedPath.startsWith(\"/./\")) {\n return normalizedBase + normalizedPath.slice(2);\n }\n\n // Handle parent directory navigation\n if (normalizedPath.startsWith(\"/../\")) {\n const baseParts = normalizedBase.split(\"/\");\n baseParts.pop(); // Remove last segment\n return baseParts.join(\"/\") + normalizedPath.slice(3);\n }\n\n return normalizedBase + normalizedPath;\n }\n\n /**\n * Get parent URL (directory) from a URL.\n */\n private getParentUrl(url: string): string {\n if (typeof URL !== \"undefined\") {\n try {\n const urlObj = new URL(url);\n const pathParts = urlObj.pathname.split(\"/\");\n pathParts.pop(); // Remove file name\n urlObj.pathname = pathParts.join(\"/\");\n return urlObj.href;\n } catch {\n // Fall back to string manipulation\n }\n }\n\n const lastSlash = url.lastIndexOf(\"/\");\n if (lastSlash !== -1) {\n return url.slice(0, lastSlash);\n }\n return url;\n }\n\n /**\n * Clear the cache.\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics.\n */\n getCacheStats(): { size: number } {\n return { size: this.cache.size };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create an HTTP loader with sensible defaults.\n */\nexport function createHttpLoader(\n basePath: string,\n options?: Partial<HttpLoaderOptions>\n): HttpLoader {\n return new HttpLoader({\n basePath,\n ...options,\n });\n}\n","/**\n * Unified Schema Loader\n *\n * Auto-detects the environment and routes to the appropriate loader:\n * - FileSystemLoader for Node.js/Electron\n * - HttpLoader for browser\n *\n * Also handles mixed loading scenarios where some imports use filesystem\n * and others use HTTP.\n *\n * @packageDocumentation\n */\n\nimport type {\n SchemaLoader,\n LoadedSchema,\n LoadedOrbital,\n LoadResult,\n UnifiedLoaderOptions,\n ImportChainLike,\n} from \"./schema-loader.js\";\nimport { isElectron, isBrowser, isNode } from \"./schema-loader.js\";\nimport { HttpLoader, HttpImportChain } from \"./http-loader.js\";\n\n// ============================================================================\n// Dynamic Import for FileSystem Loader\n// ============================================================================\n\n// Type for the external loader module (loaded dynamically in Node.js)\ntype ExternalLoaderModule = typeof import(\"./external-loader.js\");\n\nlet externalLoaderModule: ExternalLoaderModule | null = null;\n\n/**\n * Dynamically import the external loader (Node.js only).\n * This avoids bundling fs module in browser builds.\n */\nasync function getExternalLoaderModule(): Promise<ExternalLoaderModule | null> {\n if (externalLoaderModule) {\n return externalLoaderModule;\n }\n\n if (isBrowser()) {\n return null;\n }\n\n try {\n // Dynamic import to avoid bundling fs in browser\n externalLoaderModule = await import(\"./external-loader.js\");\n return externalLoaderModule;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Unified Import Chain\n// ============================================================================\n\n/**\n * Import chain that works with both loaders.\n */\nexport class UnifiedImportChain implements ImportChainLike {\n private chain: string[] = [];\n\n push(path: string): string | null {\n // Normalize path for comparison (handle both file paths and URLs)\n const normalized = this.normalizePath(path);\n if (this.chain.includes(normalized)) {\n const cycle = [\n ...this.chain.slice(this.chain.indexOf(normalized)),\n normalized,\n ];\n return `Circular import detected: ${cycle.join(\" -> \")}`;\n }\n this.chain.push(normalized);\n return null;\n }\n\n pop(): void {\n this.chain.pop();\n }\n\n clone(): UnifiedImportChain {\n const newChain = new UnifiedImportChain();\n newChain.chain = [...this.chain];\n return newChain;\n }\n\n private normalizePath(path: string): string {\n // For URLs, use the full URL\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path;\n }\n // For file paths, normalize path separators\n return path.replace(/\\\\/g, \"/\");\n }\n}\n\n// ============================================================================\n// Unified Loader\n// ============================================================================\n\n/**\n * UnifiedLoader - Auto-detects environment and routes to appropriate loader.\n *\n * Loading Strategy:\n * - Electron: Uses FileSystemLoader with HTTP fallback for remote URLs\n * - Browser: Uses HttpLoader only (no filesystem access)\n * - Node.js: Uses FileSystemLoader with HTTP for remote URLs\n *\n * Import Type Resolution:\n * - `./local.orb`: FileSystem (Node/Electron) or Error (Browser)\n * - `std/behaviors/x`: FileSystem OR HTTP (configurable)\n * - `@scope/pkg.orb`: FileSystem OR HTTP (configurable)\n * - `https://...`: Always HTTP\n *\n * @example\n * ```typescript\n * const loader = createUnifiedLoader({\n * basePath: \"/project/schemas\",\n * stdLibPath: \"/project/std\", // or \"https://cdn.example.com/std\"\n * });\n *\n * // Load relative file (uses FileSystem in Node, error in Browser)\n * const local = await loader.load(\"./my-schema.orb\");\n *\n * // Load from URL (always uses HTTP)\n * const remote = await loader.load(\"https://example.com/schema.orb\");\n *\n * // Load from std library (uses configured path type)\n * const std = await loader.load(\"std/behaviors/game-core\");\n * ```\n */\nexport class UnifiedLoader implements SchemaLoader {\n private options: UnifiedLoaderOptions;\n private httpLoader: HttpLoader | null = null;\n private fsLoader: SchemaLoader | null = null;\n private fsLoaderInitialized = false;\n private cache = new Map<string, LoadedSchema>();\n\n constructor(options: UnifiedLoaderOptions) {\n this.options = options;\n\n // Initialize HTTP loader (always available)\n this.httpLoader = new HttpLoader({\n basePath: options.basePath,\n stdLibPath: options.stdLibPath,\n scopedPaths: options.scopedPaths,\n ...options.http,\n });\n }\n\n /**\n * Initialize the filesystem loader if available.\n */\n private async initFsLoader(): Promise<void> {\n if (this.fsLoaderInitialized) {\n return;\n }\n\n this.fsLoaderInitialized = true;\n\n if (this.options.forceLoader === \"http\") {\n return;\n }\n\n const module = await getExternalLoaderModule();\n if (module) {\n this.fsLoader = new module.ExternalOrbitalLoader({\n basePath: this.options.basePath,\n stdLibPath: this.options.stdLibPath,\n scopedPaths: this.options.scopedPaths,\n ...this.options.fileSystem,\n }) as SchemaLoader;\n }\n }\n\n /**\n * Determine which loader to use for an import path.\n */\n private getLoaderForPath(importPath: string): \"http\" | \"filesystem\" {\n // Force loader if configured\n if (this.options.forceLoader) {\n return this.options.forceLoader;\n }\n\n // HTTP URLs always use HTTP loader\n if (importPath.startsWith(\"http://\") || importPath.startsWith(\"https://\")) {\n return \"http\";\n }\n\n // Check if std lib is configured as HTTP\n if (importPath.startsWith(\"std/\") && this.options.stdLibPath) {\n if (\n this.options.stdLibPath.startsWith(\"http://\") ||\n this.options.stdLibPath.startsWith(\"https://\")\n ) {\n return \"http\";\n }\n }\n\n // Check if scoped package is configured as HTTP\n if (importPath.startsWith(\"@\") && this.options.scopedPaths) {\n const match = importPath.match(/^(@[^/]+)/);\n if (match) {\n const scopePath = this.options.scopedPaths[match[1]];\n if (\n scopePath &&\n (scopePath.startsWith(\"http://\") || scopePath.startsWith(\"https://\"))\n ) {\n return \"http\";\n }\n }\n }\n\n // Browser always uses HTTP (no filesystem)\n if (isBrowser()) {\n return \"http\";\n }\n\n // Node.js/Electron use filesystem for local files\n return \"filesystem\";\n }\n\n /**\n * Load a schema from an import path.\n *\n * Note: We delegate chain management to the inner loader (HttpLoader or FsLoader).\n * The inner loader handles circular import detection, so we don't push/pop here.\n * We only use the unified cache to avoid duplicate loads across loaders.\n */\n async load(\n importPath: string,\n fromPath?: string,\n chain?: ImportChainLike\n ): Promise<LoadResult<LoadedSchema>> {\n // Ensure filesystem loader is initialized\n await this.initFsLoader();\n\n const importChain = chain ?? new UnifiedImportChain();\n const loaderType = this.getLoaderForPath(importPath);\n\n // Resolve path first to check cache\n const resolveResult = this.resolvePath(importPath, fromPath);\n if (!resolveResult.success) {\n return resolveResult;\n }\n const absolutePath = resolveResult.data;\n\n // Check unified cache\n const cached = this.cache.get(absolutePath);\n if (cached) {\n return { success: true, data: cached };\n }\n\n // Delegate to appropriate loader - the inner loader handles chain management\n let result: LoadResult<LoadedSchema>;\n\n if (loaderType === \"http\") {\n if (!this.httpLoader) {\n return {\n success: false,\n error: \"HTTP loader not available\",\n };\n }\n result = await this.httpLoader.load(importPath, fromPath, importChain);\n } else {\n if (!this.fsLoader) {\n // Fall back to HTTP if filesystem not available\n if (this.httpLoader) {\n result = await this.httpLoader.load(\n importPath,\n fromPath,\n importChain\n );\n } else {\n return {\n success: false,\n error: `Filesystem loader not available and import \"${importPath}\" cannot be loaded via HTTP. ` +\n `This typically happens when loading local files in a browser environment.`,\n };\n }\n } else {\n result = await this.fsLoader.load(importPath, fromPath, importChain);\n }\n }\n\n // Cache successful results in unified cache\n if (result.success) {\n this.cache.set(absolutePath, result.data);\n }\n\n return result;\n }\n\n /**\n * Load a specific orbital from a schema by name.\n */\n async loadOrbital(\n importPath: string,\n orbitalName?: string,\n fromPath?: string,\n chain?: ImportChainLike\n ): Promise<LoadResult<LoadedOrbital>> {\n const schemaResult = await this.load(importPath, fromPath, chain);\n if (!schemaResult.success) {\n return schemaResult;\n }\n\n const schema = schemaResult.data.schema;\n\n if (orbitalName) {\n const found = schema.orbitals.find((o) => o.name === orbitalName);\n if (!found) {\n return {\n success: false,\n error: `Orbital \"${orbitalName}\" not found in ${importPath}. Available: ${schema.orbitals.map((o) => o.name).join(\", \")}`,\n };\n }\n return {\n success: true,\n data: {\n orbital: found,\n sourcePath: schemaResult.data.sourcePath,\n importPath,\n },\n };\n }\n\n // Default to first orbital\n if (schema.orbitals.length === 0) {\n return {\n success: false,\n error: `No orbitals found in ${importPath}`,\n };\n }\n\n return {\n success: true,\n data: {\n orbital: schema.orbitals[0],\n sourcePath: schemaResult.data.sourcePath,\n importPath,\n },\n };\n }\n\n /**\n * Resolve an import path to an absolute path/URL.\n */\n resolvePath(importPath: string, fromPath?: string): LoadResult<string> {\n const loaderType = this.getLoaderForPath(importPath);\n\n if (loaderType === \"http\" && this.httpLoader) {\n return this.httpLoader.resolvePath(importPath, fromPath);\n }\n\n if (this.fsLoader) {\n return this.fsLoader.resolvePath(importPath, fromPath);\n }\n\n // Fallback to HTTP loader\n if (this.httpLoader) {\n return this.httpLoader.resolvePath(importPath, fromPath);\n }\n\n return {\n success: false,\n error: \"No loader available for path resolution\",\n };\n }\n\n /**\n * Clear all caches.\n */\n clearCache(): void {\n this.cache.clear();\n this.httpLoader?.clearCache();\n this.fsLoader?.clearCache();\n }\n\n /**\n * Get combined cache statistics.\n */\n getCacheStats(): { size: number } {\n let size = this.cache.size;\n if (this.httpLoader) {\n size += this.httpLoader.getCacheStats().size;\n }\n if (this.fsLoader) {\n size += this.fsLoader.getCacheStats().size;\n }\n return { size };\n }\n\n /**\n * Check if filesystem loading is available.\n */\n async hasFilesystemAccess(): Promise<boolean> {\n await this.initFsLoader();\n return this.fsLoader !== null;\n }\n\n /**\n * Get current environment info.\n */\n getEnvironmentInfo(): {\n isElectron: boolean;\n isBrowser: boolean;\n isNode: boolean;\n hasFilesystem: boolean;\n } {\n return {\n isElectron: isElectron(),\n isBrowser: isBrowser(),\n isNode: isNode(),\n hasFilesystem: this.fsLoader !== null,\n };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a unified loader with sensible defaults.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const loader = createUnifiedLoader({\n * basePath: \"/schemas\",\n * stdLibPath: \"/std\",\n * });\n *\n * // With HTTP std library\n * const loader = createUnifiedLoader({\n * basePath: \"/schemas\",\n * stdLibPath: \"https://cdn.example.com/orbital-std\",\n * });\n *\n * // Force HTTP only (browser-like behavior)\n * const loader = createUnifiedLoader({\n * basePath: \"/api/schemas\",\n * forceLoader: \"http\",\n * });\n * ```\n */\nexport function createUnifiedLoader(\n options: UnifiedLoaderOptions\n): UnifiedLoader {\n return new UnifiedLoader(options);\n}\n\n/**\n * Create a loader appropriate for the current environment.\n *\n * Convenience function that:\n * - In browser: Creates HttpLoader\n * - In Node.js/Electron: Creates UnifiedLoader\n */\nexport async function createAutoLoader(\n options: UnifiedLoaderOptions\n): Promise<SchemaLoader> {\n if (isBrowser()) {\n return new HttpLoader({\n basePath: options.basePath,\n stdLibPath: options.stdLibPath,\n scopedPaths: options.scopedPaths,\n ...options.http,\n });\n }\n\n const loader = new UnifiedLoader(options);\n await loader.hasFilesystemAccess(); // Trigger initialization\n return loader;\n}\n","/**\n * Almadar Studio Loader Configuration\n *\n * Provides Electron-specific configuration for loading OrbitalSchema files\n * in the Almadar Studio desktop application.\n *\n * Features:\n * - Auto-detect bundled vs downloaded std library\n * - File system access for local .orb files\n * - HTTP fallback for remote schemas\n * - Workspace-relative path resolution\n *\n * @packageDocumentation\n */\n\nimport { createLogger } from '@almadar/logger';\nimport type { UnifiedLoaderOptions } from \"./schema-loader.js\";\nimport { isElectron } from \"./schema-loader.js\";\n\nconst log = createLogger('almadar:runtime:studio-config');\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Almadar Studio configuration options.\n */\nexport interface AlmadarStudioConfig {\n /**\n * Path to the workspace directory (user's project).\n * All relative imports are resolved from here.\n */\n workspacePath: string;\n\n /**\n * Path to bundled std library (in app resources).\n * Used when std library is bundled with the app.\n */\n bundledStdPath?: string;\n\n /**\n * Path to downloaded/cached std library.\n * Used when std library is downloaded on first run.\n */\n downloadedStdPath?: string;\n\n /**\n * URL for downloading std library if not available locally.\n */\n stdLibDownloadUrl?: string;\n\n /**\n * Scoped package paths for local packages.\n * e.g., { \"@my-company\": \"/path/to/packages\" }\n */\n localPackages?: Record<string, string>;\n\n /**\n * URLs for remote scoped packages (HTTP fallback).\n * e.g., { \"@community\": \"https://orbitals.example.com/packages\" }\n */\n remotePackages?: Record<string, string>;\n\n /**\n * Enable verbose logging.\n */\n debug?: boolean;\n}\n\n/**\n * Resolved paths for Almadar Studio.\n */\nexport interface ResolvedAlmadarPaths {\n /** Workspace path (base for relative imports) */\n workspacePath: string;\n\n /** Resolved std library path (bundled or downloaded) */\n stdLibPath: string | null;\n\n /** Whether std library was found locally */\n stdLibAvailable: boolean;\n\n /** Fallback URL for std library if not local */\n stdLibFallbackUrl: string | null;\n\n /** Combined scoped package paths (local + remote) */\n scopedPaths: Record<string, string>;\n}\n\n// ============================================================================\n// Default Paths\n// ============================================================================\n\n/**\n * Default paths for Almadar Studio in different environments.\n */\nexport const ALMADAR_DEFAULTS = {\n /**\n * Default bundled std library path (relative to app resources).\n * In Electron: process.resourcesPath + '/std'\n */\n BUNDLED_STD_SUBPATH: \"std\",\n\n /**\n * Default downloaded std library path (in user data).\n * In Electron: app.getPath('userData') + '/orbital-std'\n */\n DOWNLOADED_STD_SUBPATH: \"orbital-std\",\n\n /**\n * Default std library download URL.\n */\n STD_LIB_DOWNLOAD_URL: \"https://cdn.almadar.dev/orbital-std\",\n\n /**\n * Default remote package registry URL.\n */\n REMOTE_PACKAGE_URL: \"https://registry.almadar.dev/packages\",\n};\n\n// ============================================================================\n// Path Resolution\n// ============================================================================\n\n/**\n * Check if a path exists (works in both Node.js and Electron).\n * Returns false in browser environment.\n */\nasync function pathExists(path: string): Promise<boolean> {\n if (typeof window !== \"undefined\" && !isElectron()) {\n return false;\n }\n\n try {\n // Dynamic import to avoid bundling fs in browser\n const fs = await import(\"fs\");\n return fs.existsSync(path);\n } catch {\n return false;\n }\n}\n\n/**\n * Extended process type for Electron environment.\n */\ninterface ElectronProcess extends NodeJS.Process {\n resourcesPath?: string;\n}\n\n/**\n * Get Electron app paths if available.\n */\nfunction getElectronPaths(): {\n resourcesPath: string | null;\n userDataPath: string | null;\n} {\n if (!isElectron()) {\n return { resourcesPath: null, userDataPath: null };\n }\n\n try {\n // In Electron renderer process\n interface ElectronWindow { electronAPI?: { resourcesPath?: string; userDataPath?: string } }\n if (typeof window !== \"undefined\" && (window as ElectronWindow).electronAPI) {\n const api = (window as ElectronWindow).electronAPI!;\n return {\n resourcesPath: api.resourcesPath || null,\n userDataPath: api.userDataPath || null,\n };\n }\n\n // In Electron main process\n const electronProcess = process as ElectronProcess;\n if (typeof process !== \"undefined\" && electronProcess.resourcesPath) {\n return {\n resourcesPath: electronProcess.resourcesPath,\n userDataPath: null, // Would need app.getPath('userData')\n };\n }\n } catch {\n // Ignore errors\n }\n\n return { resourcesPath: null, userDataPath: null };\n}\n\n/**\n * Resolve std library path, checking bundled first, then downloaded.\n */\nasync function resolveStdLibPath(\n config: AlmadarStudioConfig\n): Promise<{ path: string | null; available: boolean }> {\n // Check explicit bundled path first\n if (config.bundledStdPath) {\n if (await pathExists(config.bundledStdPath)) {\n return { path: config.bundledStdPath, available: true };\n }\n }\n\n // Check explicit downloaded path\n if (config.downloadedStdPath) {\n if (await pathExists(config.downloadedStdPath)) {\n return { path: config.downloadedStdPath, available: true };\n }\n }\n\n // Try Electron default paths\n const electronPaths = getElectronPaths();\n\n if (electronPaths.resourcesPath) {\n const bundledPath = `${electronPaths.resourcesPath}/${ALMADAR_DEFAULTS.BUNDLED_STD_SUBPATH}`;\n if (await pathExists(bundledPath)) {\n return { path: bundledPath, available: true };\n }\n }\n\n if (electronPaths.userDataPath) {\n const downloadedPath = `${electronPaths.userDataPath}/${ALMADAR_DEFAULTS.DOWNLOADED_STD_SUBPATH}`;\n if (await pathExists(downloadedPath)) {\n return { path: downloadedPath, available: true };\n }\n }\n\n // No local std library found\n return { path: null, available: false };\n}\n\n/**\n * Resolve all paths for Almadar Studio configuration.\n */\nexport async function resolveAlmadarPaths(\n config: AlmadarStudioConfig\n): Promise<ResolvedAlmadarPaths> {\n const stdLibResult = await resolveStdLibPath(config);\n\n // Combine local and remote scoped packages\n const scopedPaths: Record<string, string> = {\n ...(config.localPackages || {}),\n ...(config.remotePackages || {}),\n };\n\n return {\n workspacePath: config.workspacePath,\n stdLibPath: stdLibResult.path,\n stdLibAvailable: stdLibResult.available,\n stdLibFallbackUrl: stdLibResult.available\n ? null\n : config.stdLibDownloadUrl || ALMADAR_DEFAULTS.STD_LIB_DOWNLOAD_URL,\n scopedPaths,\n };\n}\n\n// ============================================================================\n// Loader Factory\n// ============================================================================\n\n/**\n * Create UnifiedLoader options for Almadar Studio.\n *\n * @example\n * ```typescript\n * // In Almadar Studio\n * const options = await createAlmadarLoaderOptions({\n * workspacePath: '/Users/dev/my-project',\n * });\n *\n * const loader = createUnifiedLoader(options);\n * const result = await loader.load('./my-schema.orb');\n * ```\n */\nexport async function createAlmadarLoaderOptions(\n config: AlmadarStudioConfig\n): Promise<UnifiedLoaderOptions> {\n const resolved = await resolveAlmadarPaths(config);\n\n if (config.debug) {\n log.debug('resolved-paths', {\n workspacePath: resolved.workspacePath,\n stdLibPath: resolved.stdLibPath,\n stdLibAvailable: resolved.stdLibAvailable,\n stdLibFallbackUrl: resolved.stdLibFallbackUrl,\n scopedPaths: resolved.scopedPaths,\n });\n }\n\n // Determine std library path (local or URL fallback)\n const stdLibPath = resolved.stdLibPath || resolved.stdLibFallbackUrl || undefined;\n\n return {\n basePath: resolved.workspacePath,\n stdLibPath,\n scopedPaths: resolved.scopedPaths,\n fileSystem: {\n allowOutsideBasePath: false, // Security: don't allow path traversal\n },\n http: {\n timeout: 30000,\n credentials: \"omit\", // Don't send cookies to CDN\n },\n };\n}\n\n/**\n * Check if std library needs to be downloaded.\n */\nexport async function needsStdLibDownload(\n config: AlmadarStudioConfig\n): Promise<boolean> {\n const resolved = await resolveAlmadarPaths(config);\n return !resolved.stdLibAvailable;\n}\n\n/**\n * Get the download URL for std library.\n */\nexport function getStdLibDownloadUrl(config: AlmadarStudioConfig): string {\n return config.stdLibDownloadUrl || ALMADAR_DEFAULTS.STD_LIB_DOWNLOAD_URL;\n}\n\n/**\n * Get the target path for downloaded std library.\n */\nexport function getStdLibDownloadTarget(config: AlmadarStudioConfig): string | null {\n if (config.downloadedStdPath) {\n return config.downloadedStdPath;\n }\n\n const electronPaths = getElectronPaths();\n if (electronPaths.userDataPath) {\n return `${electronPaths.userDataPath}/${ALMADAR_DEFAULTS.DOWNLOADED_STD_SUBPATH}`;\n }\n\n return null;\n}\n\n// ============================================================================\n// Workspace Detection\n// ============================================================================\n\n/**\n * Detect workspace from a schema file path.\n * Looks for common project markers (.git, package.json, orbital.config.json).\n */\nexport async function detectWorkspace(schemaPath: string): Promise<string | null> {\n if (typeof window !== \"undefined\" && !isElectron()) {\n return null;\n }\n\n try {\n const path = await import(\"path\");\n const fs = await import(\"fs\");\n\n let current = path.dirname(schemaPath);\n const root = path.parse(current).root;\n\n while (current !== root) {\n // Check for project markers\n const markers = [\n \".git\",\n \"package.json\",\n \"orbital.config.json\",\n \"almadar.config.json\",\n \".orbital\",\n ];\n\n for (const marker of markers) {\n const markerPath = path.join(current, marker);\n if (fs.existsSync(markerPath)) {\n return current;\n }\n }\n\n current = path.dirname(current);\n }\n } catch {\n // Ignore errors\n }\n\n return null;\n}\n","/**\n * Reference Resolver\n *\n * Resolves `uses` imports and component references in OrbitalSchema.\n * Handles:\n * - `Alias.entity` entity references\n * - `Alias.traits.TraitName` trait references\n * - `Alias.pages.PageName` page references\n *\n * @packageDocumentation\n */\n\nimport type {\n Orbital,\n OrbitalDefinition,\n EntityRef,\n PageRef,\n PageRefObject,\n Entity,\n Page,\n Trait,\n TraitRef,\n TraitConfig,\n TraitEventListener,\n OrbitalSchema,\n UseDeclaration,\n PatternConfig,\n} from \"@almadar/core\";\nimport {\n isEntityReference,\n isEntityCall,\n isPageReference,\n isPageReferenceString,\n isPageReferenceObject,\n parseEntityRef,\n parsePageRef,\n parseImportedTraitRef,\n isInlineTrait,\n} from \"@almadar/core\";\nimport type {\n LoaderOptions,\n} from \"../loader/external-loader.js\";\nimport type {\n SchemaLoader,\n ImportChainLike,\n} from \"../loader/schema-loader.js\";\nimport { createLogger } from '@almadar/logger';\n\nconst refResolverLog = createLogger(\"almadar:runtime:ref-resolver\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Resolved imports from `uses` declarations.\n */\nexport interface ResolvedImports {\n /** Map of alias -> loaded orbital */\n orbitals: Map<string, ResolvedImport>;\n}\n\n/**\n * A single resolved import.\n */\nexport interface ResolvedImport {\n /** The alias used for this import */\n alias: string;\n\n /** The original import path */\n from: string;\n\n /** The loaded orbital */\n orbital: Orbital;\n\n /** Absolute source path */\n sourcePath: string;\n}\n\n/**\n * Fully resolved orbital with all references expanded.\n */\nexport interface ResolvedOrbital {\n /** Original orbital name */\n name: string;\n\n /** Resolved entity (always inline after resolution) */\n entity: Entity;\n\n /** Whether entity was referenced from an import */\n entitySource?: {\n alias: string;\n persistence: \"persistent\" | \"runtime\" | \"singleton\";\n };\n\n /** Resolved traits (references expanded) */\n traits: ResolvedTrait[];\n\n /** Resolved pages (references expanded with path overrides applied) */\n pages: ResolvedPage[];\n\n /** Resolved imports */\n imports: ResolvedImports;\n\n /** Original orbital definition */\n original: OrbitalDefinition;\n}\n\n/**\n * Resolved trait with source tracking.\n */\nexport interface ResolvedTrait {\n /** The trait definition */\n trait: Trait;\n\n /** Source of the trait */\n source:\n | { type: \"inline\" }\n | { type: \"local\"; name: string }\n | { type: \"imported\"; alias: string; traitName: string };\n\n /** Linked entity for this trait */\n linkedEntity?: string;\n\n /** Configuration overrides */\n config?: TraitConfig;\n}\n\n/**\n * Resolved page with source tracking.\n */\nexport interface ResolvedPage {\n /** The page definition */\n page: Page;\n\n /** Source of the page */\n source:\n | { type: \"inline\" }\n | { type: \"imported\"; alias: string; pageName: string };\n\n /** Whether path was overridden */\n pathOverridden: boolean;\n\n /** Original path before override */\n originalPath?: string;\n}\n\n/**\n * Resolution options.\n */\nexport interface ResolveOptions extends LoaderOptions {\n /** Map of local trait definitions (name -> trait) */\n localTraits?: Map<string, Trait>;\n\n /** Whether to skip loading external imports (for testing) */\n skipExternalLoading?: boolean;\n\n /** Custom schema loader instance (optional, defaults to ExternalOrbitalLoader) */\n loader?: SchemaLoader;\n}\n\n/**\n * Resolution result.\n */\nexport type ResolveResult<T> =\n | { success: true; data: T; warnings: string[] }\n | { success: false; errors: string[] };\n\n// ============================================================================\n// Call-site event rename\n// ============================================================================\n\n/**\n * Recursively rewrite every event-name prop inside a render-ui config\n * tree. These are the user-dispatchable event keys the client renders\n * on buttons / actions / form handlers — they live at arbitrary nesting\n * depth inside a render-ui's second argument and must track the same\n * rename the state machine does, or the button emits the old key into\n * a machine that only knows the new one (dead-click bug).\n *\n * Rewrites:\n * - `action: \"X\"` on any pattern (button, chip, floating-action, ...)\n * - any prop whose key ends in `Event` with a non-binding string value\n * (`submitEvent`, `cancelEvent`, `selectEvent`, `changeEvent`, ...)\n * - `actions: [{ event: \"X\" }]` and `itemActions: [{ event: \"X\" }]`\n * - `onX: \"EVENT\"` handlers\n *\n * Skips anything that looks like a binding (`@config.X`, `@entity.Y`).\n * Recurses into every nested object/array value without hardcoding\n * slot / child field names — traits using `children`, `content`,\n * `leading`, `trailing`, etc. all get covered automatically.\n */\nfunction renameEventsInRenderUiConfig(\n node: PatternConfig | readonly unknown[] | unknown,\n rename: (k: string | undefined) => string | undefined,\n): PatternConfig | unknown[] | unknown {\n if (node === null || node === undefined) return node;\n if (Array.isArray(node)) {\n return node.map((item) => renameEventsInRenderUiConfig(item, rename));\n }\n if (typeof node !== \"object\") return node;\n\n // Every PatternConfig variant is a string-indexable object — the\n // discriminated union's `type` field picks which pattern's props\n // apply, but Object.entries returns each prop as [string, PropValue].\n // Mapped output preserves every key by re-spreading the node via a\n // shallow iteration, so we never lose the discriminator or untouched\n // props.\n const obj = node as PatternConfig;\n const next: PatternConfig = { ...obj };\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"action\" && typeof value === \"string\" && !value.startsWith(\"@\")) {\n (next as { [k: string]: PatternConfig[keyof PatternConfig] })[key] =\n (rename(value) ?? value) as PatternConfig[keyof PatternConfig];\n continue;\n }\n if (/^on[A-Z]/.test(key) && typeof value === \"string\" && !value.startsWith(\"@\")) {\n (next as { [k: string]: PatternConfig[keyof PatternConfig] })[key] =\n (rename(value) ?? value) as PatternConfig[keyof PatternConfig];\n continue;\n }\n if (key.endsWith(\"Event\") && typeof value === \"string\" && !value.startsWith(\"@\")) {\n (next as { [k: string]: PatternConfig[keyof PatternConfig] })[key] =\n (rename(value) ?? value) as PatternConfig[keyof PatternConfig];\n continue;\n }\n if ((key === \"actions\" || key === \"itemActions\") && Array.isArray(value)) {\n const rewrittenArray = value.map((entry): unknown => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return entry;\n // Pattern action entries have a shared minimal contract: `event`\n // (required event key), `label`, `icon`, `variant`. Narrow to\n // that shape for the event rewrite; other keys pass through the\n // spread intact.\n const action = entry as { event?: string; [k: string]: unknown };\n if (typeof action.event === \"string\" && !action.event.startsWith(\"@\")) {\n return { ...action, event: rename(action.event) ?? action.event };\n }\n return action;\n });\n (next as { [k: string]: unknown })[key] = rewrittenArray;\n continue;\n }\n (next as { [k: string]: unknown })[key] = renameEventsInRenderUiConfig(value, rename);\n }\n return next;\n}\n\n/**\n * Rewrite event names inside an effects SExpr array. Walks every\n * `(render-ui slot config)` call and passes the config through\n * {@link renameEventsInRenderUiConfig}. Preserves non-render-ui effects\n * unchanged.\n */\nfunction renameEventsInEffects(\n effects: readonly unknown[],\n rename: (k: string | undefined) => string | undefined,\n): unknown[] {\n return effects.map((effect) => {\n if (!Array.isArray(effect)) return effect;\n if (effect[0] === \"render-ui\" && effect.length >= 3) {\n const slot = effect[1];\n const config = effect[2];\n const nextConfig = renameEventsInRenderUiConfig(config, rename);\n return [effect[0], slot, nextConfig, ...effect.slice(3)];\n }\n return effect;\n });\n}\n\n/**\n * Apply a call-site `events: { OLD: NEW, ... }` rename map to a resolved\n * trait's state machine. Rewrites every mention of an old key in:\n * - `stateMachine.transitions[].event` (the trigger)\n * - `stateMachine.transitions[].effects[]` render-ui button / action /\n * itemAction / submitEvent / cancelEvent / onX event-name props\n * - `stateMachine.events[].key` + `.name` (humanized display)\n * - `emits[].event`\n *\n * Does NOT rewrite `listens[].event`: those entries reference OTHER traits'\n * events, not this trait's own events, so the rename doesn't apply.\n *\n * Returns the trait unchanged when `renames` is empty or undefined.\n */\n/**\n * Walk a render-ui pattern config and rewrite every `entity: \"<oldName>\"`\n * string to `entity: \"<newName>\"`. Applied when a molecule pins an\n * imported atom to a different linked entity — the atom declared\n * `entity: \"ModalRecord\"` on its form-section, but at the ref site the\n * molecule said `linkedEntity: \"CartItem\"`, so the runtime needs to see\n * `entity: \"CartItem\"` at render time for schema enrichment\n * (UISlotRenderer looks up `schemaCtx.entities.get(entityName)` to\n * inject field types + enum values for form controls).\n *\n * Without this rewrite, the lookup misses the molecule-level entity and\n * the form renders text inputs for every field — including enum-shaped\n * ones that should be `<Select>`. VG20.\n *\n * Bindings (`@entity.X`, `@payload.X`) are NOT touched; only bare string\n * literals matching `atomLinkedEntity` get rewritten.\n */\nfunction renameEntityInRenderUiConfig(\n node: PatternConfig | readonly unknown[] | unknown,\n oldName: string,\n newName: string,\n): PatternConfig | unknown[] | unknown {\n if (node === null || node === undefined) return node;\n if (Array.isArray(node)) {\n return node.map((item) => renameEntityInRenderUiConfig(item, oldName, newName));\n }\n if (typeof node !== \"object\") return node;\n const obj = node as PatternConfig;\n const next: PatternConfig = { ...obj };\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"entity\" && value === oldName) {\n (next as { [k: string]: unknown })[key] = newName;\n continue;\n }\n (next as { [k: string]: unknown })[key] = renameEntityInRenderUiConfig(value, oldName, newName);\n }\n return next;\n}\n\n/**\n * Walk a trait's effects and rewrite entity-name literals to match the\n * call-site's `linkedEntity` override.\n *\n * The previous version only rewrote `(render-ui ...)` config payloads,\n * with a comment claiming \"other effects use bindings, not string\n * literals\" — which is wrong. Several operators take the entity name\n * as a positional STRING LITERAL argument:\n *\n * - `(fetch <Entity> [options])` — position 1\n * - `(persist <create|update|delete|clear> <Entity> ...)` — position 2\n * - `(ref <Entity|@binding> [options])` — position 1 (string-only)\n * - `(deref <Entity|@binding> [options])` — position 1 (string-only)\n * - `(spawn <Entity> [initialState])` — position 1\n *\n * Without this rewrite, an inlined std-browse atom rebound via\n * `trait FilteredItemBrowse = Browse.traits.BrowseItemBrowse -> FilteredListItem {}`\n * would still call `MockPersistenceAdapter.list(\"BrowseItem\")` — which\n * returns zero rows because only `FilteredListItem` is registered. The\n * data-grid renders empty even though the molecule looks correct in\n * `.lolo`. The compiled-path codegen handles this in Rust at compile\n * time; the runtime must do the equivalent rewrite at registration\n * time.\n *\n * Wrapper operators (`do`, `atomic`, `if`, `when`, `let`, `async/*`)\n * recurse into nested effects so a `(do (fetch X) ...)` block is\n * rewritten end-to-end.\n */\nfunction renameEntityInEffects(\n effects: readonly unknown[],\n oldName: string,\n newName: string,\n): unknown[] {\n return effects.map((effect) => renameEntityInEffect(effect, oldName, newName));\n}\n\n/**\n * Operators that take an entity-name string literal as their FIRST\n * positional argument: `(op \"<Entity>\" ...)`.\n * Source: `@almadar/core/types/effect.ts` (FetchEffect, RefEffect,\n * DerefEffect, SpawnEffect tuple shapes).\n */\nconst ENTITY_AT_POS_1 = new Set([\"fetch\", \"ref\", \"deref\", \"spawn\"]);\n\n/**\n * Wrapper operators where ALL positional args (positions ≥ 1) are\n * nested effects. Recurse into every arg. From the typed effect\n * tuples: DoEffect, AtomicEffect, AsyncRaceEffect, AsyncAllEffect,\n * AsyncSequenceEffect.\n */\nconst ALL_ARGS_ARE_EFFECTS = new Set([\n \"do\",\n \"atomic\",\n \"async/race\",\n \"async/all\",\n \"async/sequence\",\n]);\n\n/**\n * Wrapper operators where position 1 is something other than an\n * effect (a condition expression, a let-binding list, or an\n * async-timing value), and positions ≥ 2 are nested effects.\n * Skipping position 1 is critical so we don't accidentally rewrite\n * a literal value used as a comparison RHS (e.g. `(if (= @entity.foo\n * \"BrowseItem\") ...)` — the string \"BrowseItem\" there is a value\n * being compared, not an entity-name we want to rename).\n *\n * IfEffect / WhenEffect — position 1 is `Expression` (condition).\n * LetEffect — position 1 is `[string, unknown][]` (bindings).\n * AsyncDelay / Debounce / Throttle / Interval — position 1 is duration.\n */\nconst ARGS_FROM_POS_2_ARE_EFFECTS = new Set([\n \"if\",\n \"when\",\n \"let\",\n \"async/delay\",\n \"async/debounce\",\n \"async/throttle\",\n \"async/interval\",\n]);\n\nfunction renameEntityInEffect(\n effect: unknown,\n oldName: string,\n newName: string,\n): unknown {\n if (!Array.isArray(effect) || effect.length === 0) return effect;\n const op = effect[0];\n if (typeof op !== \"string\") return effect;\n\n // `(render-ui slot config)` — recurse into the pattern tree config.\n // Bare `entity: \"<OldName>\"` string-literal props inside the\n // pattern tree get rewritten too.\n if (op === \"render-ui\" && effect.length >= 3) {\n const [, slot, config, ...rest] = effect;\n const nextConfig = renameEntityInRenderUiConfig(config, oldName, newName);\n return [op, slot, nextConfig, ...rest];\n }\n\n // `(persist <op> <Entity> ...)`. Entity at position 2 (after the\n // create/update/delete/clear keyword). Per PersistEffect tuple shape.\n if (op === \"persist\" && effect.length >= 3 && effect[2] === oldName) {\n return [op, effect[1], newName, ...effect.slice(3)];\n }\n\n // Operators with the entity name at position 1.\n if (ENTITY_AT_POS_1.has(op) && effect[1] === oldName) {\n return [op, newName, ...effect.slice(2)];\n }\n\n // Wrappers — recurse into nested effects. Whether to skip position 1\n // depends on the operator's argument structure (see set comments).\n const skipFirstNonEffectArg = ARGS_FROM_POS_2_ARE_EFFECTS.has(op);\n const recurseAll = ALL_ARGS_ARE_EFFECTS.has(op);\n if (recurseAll || skipFirstNonEffectArg) {\n const startIndex = skipFirstNonEffectArg ? 2 : 1;\n return effect.map((arg, i) => {\n if (i < startIndex) return arg;\n if (Array.isArray(arg)) {\n return renameEntityInEffect(arg, oldName, newName);\n }\n return arg;\n });\n }\n\n return effect;\n}\n\n/**\n * Apply a linkedEntity override from a trait-ref call site to an\n * imported atom. When the atom declared `entity: \"ModalRecord\"` inside\n * its render-ui configs and the ref site supplied\n * `linkedEntity: \"CartItem\"`, rewrite every such literal so runtime\n * consumers (EntitySchemaContext lookup, DataService collection binding)\n * see the molecule-level entity name. No-op when either argument is\n * missing or when the names match.\n */\nfunction applyLinkedEntityRename(\n trait: Trait,\n linkedEntity: string | undefined,\n): Trait {\n const atomLinked = trait.linkedEntity;\n if (!linkedEntity || !atomLinked || linkedEntity === atomLinked) return trait;\n const sm = trait.stateMachine;\n if (!sm) return { ...trait, linkedEntity };\n const nextTransitions = (sm.transitions ?? []).map((t) => {\n const nextEffects = t.effects\n ? (renameEntityInEffects(\n t.effects as readonly unknown[],\n atomLinked,\n linkedEntity,\n ) as typeof t.effects)\n : t.effects;\n return { ...t, effects: nextEffects };\n });\n // Observability: structured log fires once per call-site rebind so\n // verifier traces show exactly which trait got which entity rewrite.\n // Especially load-bearing for catching the \"fetch <OldEntity>\" gap\n // that was silently dropping data-grid rows on every embedded atom.\n refResolverLog.info(\"linkedEntity:rename\", {\n trait: trait.name,\n from: atomLinked,\n to: linkedEntity,\n transitionCount: nextTransitions.length,\n });\n return {\n ...trait,\n linkedEntity,\n stateMachine: { ...sm, transitions: nextTransitions },\n } as Trait;\n}\n\nfunction applyEventRenames(\n trait: Trait,\n renames?: { [oldKey: string]: string },\n): Trait {\n if (!renames || Object.keys(renames).length === 0) return trait;\n const rename = (k: string | undefined): string | undefined =>\n k !== undefined && k in renames ? renames[k] : k;\n const sm = trait.stateMachine;\n if (!sm) return trait;\n const nextTransitions = (sm.transitions ?? []).map((t) => {\n const nextEvent = rename(t.event) ?? t.event;\n const nextEffects = t.effects\n ? (renameEventsInEffects(t.effects as readonly unknown[], rename) as typeof t.effects)\n : t.effects;\n return { ...t, event: nextEvent, effects: nextEffects };\n });\n const nextEvents = (sm.events ?? []).map((e) => {\n const newKey = rename(e.key);\n if (newKey === e.key) return e;\n return { ...e, key: newKey ?? e.key };\n });\n const nextEmits = (trait.emits ?? []).map((em) => {\n if (typeof em === \"string\") return rename(em) ?? em;\n const newEvent = rename(em.event);\n return newEvent === em.event ? em : { ...em, event: newEvent ?? em.event };\n });\n return {\n ...trait,\n stateMachine: {\n ...sm,\n transitions: nextTransitions,\n events: nextEvents,\n },\n emits: nextEmits,\n } as Trait;\n}\n\n// ============================================================================\n// Reference Resolver\n// ============================================================================\n\n/**\n * ReferenceResolver - Resolves all references in an orbital.\n */\nexport class ReferenceResolver {\n private loader: SchemaLoader;\n private options: ResolveOptions;\n private localTraits: Map<string, Trait>;\n\n private loaderInitialized = false;\n\n constructor(options: ResolveOptions) {\n this.options = options;\n // Use provided loader; filesystem loader will be created lazily if needed\n this.loader = options.loader as SchemaLoader;\n this.localTraits = options.localTraits ?? new Map();\n }\n\n private async ensureLoader(): Promise<void> {\n if (this.loader || this.loaderInitialized) return;\n this.loaderInitialized = true;\n try {\n const { ExternalOrbitalLoader } = await import(\"../loader/external-loader.js\");\n this.loader = new ExternalOrbitalLoader(this.options);\n } catch {\n // Filesystem loader not available (browser environment)\n }\n }\n\n /**\n * Resolve all references in an orbital.\n */\n async resolve(\n orbital: OrbitalDefinition,\n sourcePath?: string,\n chain?: ImportChainLike\n ): Promise<ResolveResult<ResolvedOrbital>> {\n const errors: string[] = [];\n const warnings: string[] = [];\n const importChain = chain ?? { push: () => null, pop: () => {}, clone() { return this; } } as ImportChainLike;\n\n // Step 1: Resolve imports.\n //\n // Skip external loading when the orbital is ALREADY fully resolved — i.e.\n // every trait is an inline definition. A schema produced by `orbital\n // resolve` (the canonical Rust resolver) has all trait refs inlined yet\n // deliberately keeps `uses` as the import-provenance record. Re-loading\n // those imports here is redundant and re-introduces external-loader\n // failures (e.g. std behaviors not found at the runtime's lookup paths)\n // even though nothing in the orbital still references them. Skipping the\n // load leaves `uses` intact (no information lost) and makes preprocessing\n // idempotent over an already-resolved schema.\n const traitsList = orbital.traits ?? [];\n const alreadyResolved =\n traitsList.length > 0 && traitsList.every((t) => isInlineTrait(t));\n const importsResult = alreadyResolved\n ? { success: true as const, data: { orbitals: new Map<string, ResolvedImport>() }, warnings: [] as string[] }\n : await this.resolveImports(orbital.uses ?? [], sourcePath, importChain);\n if (!importsResult.success) {\n return { success: false, errors: importsResult.errors };\n }\n const imports = importsResult.data;\n\n // Step 2: Resolve entity\n const entityResult = this.resolveEntity(orbital.entity, imports);\n if (!entityResult.success) {\n errors.push(...entityResult.errors);\n }\n\n // Step 3: Resolve traits\n const traitsResult = this.resolveTraits(orbital.traits, imports);\n if (!traitsResult.success) {\n errors.push(...traitsResult.errors);\n }\n\n // Step 4: Resolve pages\n const pagesResult = this.resolvePages(orbital.pages, imports);\n if (!pagesResult.success) {\n errors.push(...pagesResult.errors);\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n // At this point all results are successful (errors array is empty)\n // Use type narrowing to access data safely\n if (!entityResult.success || !traitsResult.success || !pagesResult.success) {\n // This should never happen since we checked errors above\n return { success: false, errors: ['Internal error: unexpected failure state'] };\n }\n\n return {\n success: true,\n data: {\n name: orbital.name,\n entity: entityResult.data.entity,\n entitySource: entityResult.data.source,\n traits: traitsResult.data,\n pages: pagesResult.data,\n imports,\n original: orbital,\n },\n warnings,\n };\n }\n\n /**\n * Resolve `uses` declarations to loaded orbitals.\n */\n private async resolveImports(\n uses: UseDeclaration[],\n sourcePath?: string,\n chain?: ImportChainLike\n ): Promise<ResolveResult<ResolvedImports>> {\n const errors: string[] = [];\n const orbitals = new Map<string, ResolvedImport>();\n\n if (this.options.skipExternalLoading) {\n return {\n success: true,\n data: { orbitals },\n warnings: [\"External loading skipped\"],\n };\n }\n\n for (const use of uses) {\n // Check for duplicate aliases\n if (orbitals.has(use.as)) {\n errors.push(`Duplicate import alias: ${use.as}`);\n continue;\n }\n\n // Load the orbital\n await this.ensureLoader();\n if (!this.loader) {\n errors.push(`No loader available to resolve import: ${use.from}`);\n continue;\n }\n const loadResult = await this.loader.loadOrbital(\n use.from,\n undefined,\n sourcePath,\n chain\n );\n\n if (!loadResult.success) {\n errors.push(`Failed to load \"${use.from}\" as \"${use.as}\": ${loadResult.error}`);\n continue;\n }\n\n orbitals.set(use.as, {\n alias: use.as,\n from: use.from,\n orbital: loadResult.data.orbital,\n sourcePath: loadResult.data.sourcePath,\n });\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: { orbitals }, warnings: [] };\n }\n\n /**\n * Resolve entity reference.\n */\n private resolveEntity(\n entityRef: EntityRef,\n imports: ResolvedImports\n ): ResolveResult<{\n entity: Entity;\n source?: { alias: string; persistence: \"persistent\" | \"runtime\" | \"singleton\" };\n }> {\n // EntityCall (Phase F): synthesize a placeholder Entity from the call shape.\n // Full inlining is the compiler's job; this resolver returns the local view.\n if (isEntityCall(entityRef)) {\n const fallbackName =\n entityRef.name ?? entityRef.extends.replace(/\\.entity$/, \"\");\n return {\n success: true,\n data: {\n entity: {\n name: fallbackName,\n fields: entityRef.fields ?? [],\n ...(entityRef.persistence\n ? { persistence: entityRef.persistence }\n : {}),\n ...(entityRef.collection ? { collection: entityRef.collection } : {}),\n },\n },\n warnings: [],\n };\n }\n\n // Inline entity\n if (!isEntityReference(entityRef)) {\n return {\n success: true,\n data: { entity: entityRef },\n warnings: [],\n };\n }\n\n // Reference: \"Alias.entity\"\n const parsed = parseEntityRef(entityRef);\n if (!parsed) {\n return {\n success: false,\n errors: [`Invalid entity reference format: ${entityRef}. Expected \"Alias.entity\"`],\n };\n }\n\n const imported = imports.orbitals.get(parsed.alias);\n if (!imported) {\n return {\n success: false,\n errors: [\n `Unknown import alias in entity reference: ${parsed.alias}. ` +\n `Available aliases: ${Array.from(imports.orbitals.keys()).join(\", \") || \"none\"}`,\n ],\n };\n }\n\n // Get entity from imported orbital\n const importedEntity = this.getEntityFromOrbital(imported.orbital);\n if (!importedEntity) {\n return {\n success: false,\n errors: [\n `Imported orbital \"${parsed.alias}\" does not have an inline entity. ` +\n `Entity references cannot be chained.`,\n ],\n };\n }\n\n // Determine persistence type\n const persistence = importedEntity.persistence ?? \"persistent\";\n\n return {\n success: true,\n data: {\n entity: importedEntity,\n source: {\n alias: parsed.alias,\n persistence: persistence as \"persistent\" | \"runtime\" | \"singleton\",\n },\n },\n warnings: [],\n };\n }\n\n /**\n * Get the entity from an orbital (handling EntityRef).\n */\n private getEntityFromOrbital(orbital: Orbital): Entity | null {\n const entityRef = orbital.entity;\n if (typeof entityRef === \"string\") {\n // It's a reference - we don't support chained references\n return null;\n }\n if (isEntityCall(entityRef)) {\n // EntityCall form - synthesize a placeholder Entity from the call shape\n const fallbackName =\n entityRef.name ?? entityRef.extends.replace(/\\.entity$/, \"\");\n return {\n name: fallbackName,\n fields: entityRef.fields ?? [],\n ...(entityRef.persistence\n ? { persistence: entityRef.persistence }\n : {}),\n ...(entityRef.collection ? { collection: entityRef.collection } : {}),\n };\n }\n return entityRef;\n }\n\n /**\n * Resolve trait references.\n */\n private resolveTraits(\n traitRefs: TraitRef[],\n imports: ResolvedImports\n ): ResolveResult<ResolvedTrait[]> {\n const errors: string[] = [];\n const resolved: ResolvedTrait[] = [];\n\n for (const traitRef of traitRefs) {\n const result = this.resolveTraitRef(traitRef, imports);\n if (!result.success) {\n errors.push(...result.errors);\n } else {\n resolved.push(result.data!);\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: resolved, warnings: [] };\n }\n\n /**\n * Resolve a single trait reference.\n */\n private resolveTraitRef(\n traitRef: TraitRef,\n imports: ResolvedImports\n ): ResolveResult<ResolvedTrait> {\n // Case 1: Inline trait definition\n if (typeof traitRef !== \"string\" && \"stateMachine\" in traitRef) {\n return {\n success: true,\n data: {\n trait: traitRef as Trait,\n source: { type: \"inline\" },\n },\n warnings: [],\n };\n }\n\n // Case 2: Reference object { ref: \"...\", name?, config?, linkedEntity?, events?, listens? }\n // `events` is the call-site rename map ({ OLD: NEW, ... }). Every mention\n // of an old key inside the resolved trait's state machine (transition\n // triggers, events list entries, emits) is rewritten to the new key.\n // Without this, buttons in a molecule that dispatch the renamed event\n // (e.g. `ADD_ITEM` instead of the atom's internal `OPEN`) fire into a\n // trait whose state machine still only knows the old trigger, and the\n // transition silently fails to fire.\n //\n // `listens` is the Phase F.7 override: replace the imported trait's\n // `listens` array entirely with the call-site list. Required for\n // ref-based traits that need cross-trait subscription wiring (e.g.\n // CartItemAddItem listening to CartItemCartBrowse.ADD_ITEM); without\n // it the atom's empty listens flow through and the bus subscription\n // is never set up.\n if (typeof traitRef !== \"string\" && \"ref\" in traitRef) {\n const refObj = traitRef as {\n ref: string;\n name?: string;\n config?: TraitConfig;\n linkedEntity?: string;\n events?: { [oldKey: string]: string };\n listens?: TraitEventListener[];\n };\n return this.resolveTraitRefString(\n refObj.ref,\n imports,\n refObj.config,\n refObj.linkedEntity,\n refObj.name,\n refObj.events,\n refObj.listens,\n );\n }\n\n // Case 3: String reference\n if (typeof traitRef === \"string\") {\n return this.resolveTraitRefString(traitRef, imports);\n }\n\n return {\n success: false,\n errors: [`Unknown trait reference format: ${JSON.stringify(traitRef)}`],\n };\n }\n\n /**\n * Resolve a trait reference string.\n */\n private resolveTraitRefString(\n ref: string,\n imports: ResolvedImports,\n config?: TraitConfig,\n linkedEntity?: string,\n overrideName?: string,\n eventRenames?: { [oldKey: string]: string },\n listensOverride?: TraitEventListener[],\n ): ResolveResult<ResolvedTrait> {\n // Check if it's an imported trait reference: \"Alias.traits.TraitName\"\n const parsed = parseImportedTraitRef(ref);\n\n if (parsed) {\n // Imported trait\n const imported = imports.orbitals.get(parsed.alias);\n if (!imported) {\n return {\n success: false,\n errors: [\n `Unknown import alias in trait reference: ${parsed.alias}. ` +\n `Available aliases: ${Array.from(imports.orbitals.keys()).join(\", \") || \"none\"}`,\n ],\n };\n }\n\n // Find the trait in the imported orbital\n const trait = this.findTraitInOrbital(imported.orbital, parsed.traitName);\n if (!trait) {\n return {\n success: false,\n errors: [\n `Trait \"${parsed.traitName}\" not found in imported orbital \"${parsed.alias}\". ` +\n `Available traits: ${this.listTraitsInOrbital(imported.orbital).join(\", \") || \"none\"}`,\n ],\n };\n }\n\n // Rename the resolved trait if the call site declared one. Molecules\n // use this to give an imported atom a domain-specific local name\n // (e.g. `std-search`'s `SearchResultSearch` renamed to\n // `FilteredItemSearch` inside `std-filtered-list`). Without the\n // rename, `@trait.FilteredItemSearch` substrings in render-ui\n // patterns would fail to resolve because the trait index keys\n // would still hold the atom's original name.\n const baseTrait: Trait = overrideName\n ? { ...trait, name: overrideName }\n : trait;\n const reboundTrait = applyLinkedEntityRename(baseTrait, linkedEntity);\n const renamedTrait = applyEventRenames(reboundTrait, eventRenames);\n const finalTrait: Trait = listensOverride !== undefined\n ? { ...renamedTrait, listens: listensOverride }\n : renamedTrait;\n if (listensOverride !== undefined) {\n refResolverLog.info(\"listens-override:imported\", {\n trait: finalTrait.name,\n ref,\n atomListens: trait.listens?.length ?? 0,\n callSiteListens: listensOverride.length,\n });\n }\n\n return {\n success: true,\n data: {\n trait: finalTrait,\n source: { type: \"imported\", alias: parsed.alias, traitName: parsed.traitName },\n config,\n linkedEntity,\n },\n warnings: [],\n };\n }\n\n // Local trait (from localTraits map)\n const localTrait = this.localTraits.get(ref);\n if (localTrait) {\n const baseLocal: Trait = overrideName\n ? { ...localTrait, name: overrideName }\n : localTrait;\n const reboundLocal = applyLinkedEntityRename(baseLocal, linkedEntity);\n const renamedLocalTrait = applyEventRenames(reboundLocal, eventRenames);\n const finalLocalTrait: Trait = listensOverride !== undefined\n ? { ...renamedLocalTrait, listens: listensOverride }\n : renamedLocalTrait;\n if (listensOverride !== undefined) {\n refResolverLog.info(\"listens-override:local\", {\n trait: finalLocalTrait.name,\n ref,\n atomListens: localTrait.listens?.length ?? 0,\n callSiteListens: listensOverride.length,\n });\n }\n return {\n success: true,\n data: {\n trait: finalLocalTrait,\n source: { type: \"local\", name: ref },\n config,\n linkedEntity,\n },\n warnings: [],\n };\n }\n\n return {\n success: false,\n errors: [\n `Trait \"${ref}\" not found. ` +\n `For imported traits, use format \"Alias.traits.TraitName\". ` +\n `Local traits available: ${Array.from(this.localTraits.keys()).join(\", \") || \"none\"}`,\n ],\n };\n }\n\n /**\n * Find a trait in an orbital by name.\n */\n private findTraitInOrbital(orbital: Orbital, traitName: string): Trait | null {\n for (const traitRef of orbital.traits) {\n // Inline trait\n if (typeof traitRef !== \"string\" && \"stateMachine\" in traitRef) {\n if ((traitRef as Trait).name === traitName) {\n return traitRef as Trait;\n }\n }\n // Reference with name\n if (typeof traitRef !== \"string\" && \"ref\" in traitRef) {\n const refObj = traitRef as { ref?: string; name?: string };\n if (refObj.ref === traitName || refObj.name === traitName) {\n // This is a reference, not an inline definition\n // We can't return it directly - need to look up in local traits\n // For now, skip these\n }\n }\n }\n return null;\n }\n\n /**\n * List trait names in an orbital.\n */\n private listTraitsInOrbital(orbital: Orbital): string[] {\n const names: string[] = [];\n for (const traitRef of orbital.traits) {\n if (typeof traitRef !== \"string\" && \"stateMachine\" in traitRef) {\n names.push((traitRef as Trait).name);\n }\n }\n return names;\n }\n\n /**\n * Resolve page references.\n */\n private resolvePages(\n pageRefs: PageRef[],\n imports: ResolvedImports\n ): ResolveResult<ResolvedPage[]> {\n const errors: string[] = [];\n const resolved: ResolvedPage[] = [];\n\n for (const pageRef of pageRefs) {\n const result = this.resolvePageRef(pageRef, imports);\n if (!result.success) {\n errors.push(...result.errors);\n } else {\n resolved.push(result.data!);\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: resolved, warnings: [] };\n }\n\n /**\n * Resolve a single page reference.\n */\n private resolvePageRef(\n pageRef: PageRef,\n imports: ResolvedImports\n ): ResolveResult<ResolvedPage> {\n // Case 1: Inline page definition\n if (!isPageReference(pageRef)) {\n return {\n success: true,\n data: {\n page: pageRef as Page,\n source: { type: \"inline\" },\n pathOverridden: false,\n },\n warnings: [],\n };\n }\n\n // Case 2: String reference \"Alias.pages.PageName\"\n if (isPageReferenceString(pageRef)) {\n return this.resolvePageRefString(pageRef, imports);\n }\n\n // Case 3: Object reference { ref: \"Alias.pages.PageName\", path?: \"/override\" }\n if (isPageReferenceObject(pageRef)) {\n return this.resolvePageRefObject(pageRef, imports);\n }\n\n return {\n success: false,\n errors: [`Unknown page reference format: ${JSON.stringify(pageRef)}`],\n };\n }\n\n /**\n * Resolve a page reference string.\n */\n private resolvePageRefString(\n ref: string,\n imports: ResolvedImports\n ): ResolveResult<ResolvedPage> {\n const parsed = parsePageRef(ref);\n if (!parsed) {\n return {\n success: false,\n errors: [`Invalid page reference format: ${ref}. Expected \"Alias.pages.PageName\"`],\n };\n }\n\n const imported = imports.orbitals.get(parsed.alias);\n if (!imported) {\n return {\n success: false,\n errors: [\n `Unknown import alias in page reference: ${parsed.alias}. ` +\n `Available aliases: ${Array.from(imports.orbitals.keys()).join(\", \") || \"none\"}`,\n ],\n };\n }\n\n const page = this.findPageInOrbital(imported.orbital, parsed.pageName);\n if (!page) {\n return {\n success: false,\n errors: [\n `Page \"${parsed.pageName}\" not found in imported orbital \"${parsed.alias}\". ` +\n `Available pages: ${this.listPagesInOrbital(imported.orbital).join(\", \") || \"none\"}`,\n ],\n };\n }\n\n return {\n success: true,\n data: {\n page,\n source: { type: \"imported\", alias: parsed.alias, pageName: parsed.pageName },\n pathOverridden: false,\n },\n warnings: [],\n };\n }\n\n /**\n * Resolve a page reference object with optional path override.\n */\n private resolvePageRefObject(\n refObj: PageRefObject,\n imports: ResolvedImports\n ): ResolveResult<ResolvedPage> {\n const baseResult = this.resolvePageRefString(refObj.ref, imports);\n if (!baseResult.success) {\n return baseResult;\n }\n\n const resolved = baseResult.data!;\n\n // Apply path override if provided\n if (refObj.path) {\n const originalPath = resolved.page.path;\n resolved.page = {\n ...resolved.page,\n path: refObj.path,\n };\n resolved.pathOverridden = true;\n resolved.originalPath = originalPath;\n }\n\n return {\n success: true,\n data: resolved,\n warnings: baseResult.warnings,\n };\n }\n\n /**\n * Find a page in an orbital by name.\n */\n private findPageInOrbital(orbital: Orbital, pageName: string): Page | null {\n const pages = orbital.pages;\n if (!pages) return null;\n\n for (const pageRef of pages) {\n // Only look at inline pages (we don't support chained page references)\n if (typeof pageRef !== \"string\" && !(\"ref\" in pageRef)) {\n const page = pageRef as Page;\n if (page.name === pageName) {\n // Return a copy to avoid mutation issues\n return { ...page };\n }\n }\n }\n return null;\n }\n\n /**\n * List page names in an orbital.\n */\n private listPagesInOrbital(orbital: Orbital): string[] {\n const pages = orbital.pages;\n if (!pages) return [];\n\n const names: string[] = [];\n for (const pageRef of pages) {\n if (typeof pageRef !== \"string\" && !(\"ref\" in pageRef)) {\n names.push((pageRef as Page).name);\n }\n }\n return names;\n }\n\n /**\n * Add local traits for resolution.\n */\n addLocalTraits(traits: Trait[]): void {\n for (const trait of traits) {\n this.localTraits.set(trait.name, trait);\n }\n }\n\n /**\n * Clear loader cache.\n */\n clearCache(): void {\n this.loader?.clearCache();\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a reference resolver with sensible defaults.\n */\nexport function createResolver(\n basePath: string,\n options?: Partial<ResolveOptions>\n): ReferenceResolver {\n return new ReferenceResolver({\n basePath,\n ...options,\n });\n}\n\n// ============================================================================\n// Schema Resolution\n// ============================================================================\n\n/**\n * Resolve all references in an OrbitalSchema.\n */\nexport async function resolveSchema(\n schema: OrbitalSchema,\n options: ResolveOptions\n): Promise<ResolveResult<ResolvedOrbital[]>> {\n const resolver = new ReferenceResolver(options);\n const errors: string[] = [];\n const warnings: string[] = [];\n const resolved: ResolvedOrbital[] = [];\n\n // Collect all inline traits from all orbitals for local trait resolution\n for (const orbital of schema.orbitals) {\n const inlineTraits = orbital.traits.filter(\n (t): t is Trait => typeof t !== \"string\" && \"stateMachine\" in t\n );\n resolver.addLocalTraits(inlineTraits);\n }\n\n // Resolve each orbital\n for (const orbital of schema.orbitals) {\n const result = await resolver.resolve(orbital);\n if (!result.success) {\n errors.push(`Orbital \"${orbital.name}\": ${result.errors.join(\", \")}`);\n } else {\n resolved.push(result.data);\n warnings.push(...result.warnings.map((w) => `Orbital \"${orbital.name}\": ${w}`));\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: resolved, warnings };\n}\n","/**\n * Uses Integration for OrbitalServerRuntime\n *\n * Pre-processes OrbitalSchema to resolve `uses` declarations\n * before registration with the runtime.\n *\n * Features:\n * - Resolves all `uses` imports\n * - Expands entity/trait/page references\n * - Handles entity persistence semantics\n * - Applies event namespacing for imported traits\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalSchema, Orbital, OrbitalDefinition, Entity, Page, Trait, TraitRef } from \"@almadar/core\";\nimport {\n isEntityReference,\n isPageReference,\n isPageReferenceString,\n isPageReferenceObject,\n} from \"@almadar/core\";\nimport {\n ReferenceResolver,\n resolveSchema,\n type ResolvedOrbital,\n type ResolveOptions,\n} from \"./resolver/reference-resolver.js\";\nimport {\n type SchemaLoader,\n createUnifiedLoader,\n isBrowser,\n} from \"./loader/index.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Result of pre-processing a schema.\n */\nexport interface PreprocessedSchema {\n /** Schema with all references resolved */\n schema: OrbitalSchema;\n\n /** Entity sharing information (for runtime isolation) */\n entitySharing: EntitySharingMap;\n\n /** Event namespace mapping */\n eventNamespaces: EventNamespaceMap;\n\n /** Warnings from resolution */\n warnings: string[];\n}\n\n/**\n * Map of orbital -> entity sharing info\n */\nexport interface EntitySharingMap {\n [orbitalName: string]: {\n /** The entity name */\n entityName: string;\n /** Persistence type */\n persistence: \"persistent\" | \"runtime\" | \"singleton\";\n /** Whether this entity is shared with other orbitals */\n isShared: boolean;\n /** Source orbital if imported */\n sourceAlias?: string;\n /** Collection name for persistent entities */\n collectionName?: string;\n };\n}\n\n/**\n * Map of trait events to namespaced events\n */\nexport interface EventNamespaceMap {\n [orbitalName: string]: {\n [traitName: string]: {\n /** Original event -> namespaced event */\n emits: Record<string, string>;\n /** Namespaced event -> original event (for listeners) */\n listens: Record<string, string>;\n };\n };\n}\n\n/**\n * Options for preprocessing.\n */\nexport interface PreprocessOptions extends ResolveOptions {\n /** Apply event namespacing to imported traits */\n namespaceEvents?: boolean;\n}\n\n/**\n * Result type for preprocessing.\n */\nexport type PreprocessResult =\n | { success: true; data: PreprocessedSchema }\n | { success: false; errors: string[] };\n\n// ============================================================================\n// Pre-processor\n// ============================================================================\n\n/**\n * Preprocess a schema to resolve all `uses` references.\n *\n * This is the integration point between the new `uses` system and the\n * existing OrbitalServerRuntime. It:\n *\n * 1. Resolves all `uses` declarations\n * 2. Expands entity references to inline definitions\n * 3. Expands trait references to inline definitions\n * 4. Expands page references with path overrides\n * 5. Builds entity sharing map for runtime isolation\n * 6. Builds event namespace map for cross-orbital events\n *\n * @example\n * ```typescript\n * const result = await preprocessSchema(schema, {\n * basePath: \"/project/schemas\",\n * });\n *\n * if (result.success) {\n * // Register the preprocessed schema\n * runtime.register(result.data.schema);\n *\n * // Use entitySharing for isolation decisions\n * if (result.data.entitySharing[\"Level1\"].persistence === \"runtime\") {\n * // Entities are isolated per orbital\n * }\n * }\n * ```\n */\nexport async function preprocessSchema(\n schema: OrbitalSchema,\n options: PreprocessOptions\n): Promise<PreprocessResult> {\n const namespaceEvents = options.namespaceEvents ?? true;\n\n // Resolve all references\n const resolveResult = await resolveSchema(schema, options);\n if (!resolveResult.success) {\n return { success: false, errors: resolveResult.errors };\n }\n\n const resolved = resolveResult.data;\n const warnings = resolveResult.warnings;\n\n // Build preprocessed orbitals\n const preprocessedOrbitals: Orbital[] = [];\n const entitySharing: EntitySharingMap = {};\n const eventNamespaces: EventNamespaceMap = {};\n\n for (const resolvedOrbital of resolved) {\n const orbitalName = resolvedOrbital.name;\n\n // Build entity sharing info\n const persistence = resolvedOrbital.entitySource?.persistence ??\n (resolvedOrbital.entity.persistence as \"persistent\" | \"runtime\" | \"singleton\" | undefined) ??\n \"persistent\";\n\n entitySharing[orbitalName] = {\n entityName: resolvedOrbital.entity.name,\n persistence,\n isShared: persistence !== \"runtime\",\n sourceAlias: resolvedOrbital.entitySource?.alias,\n collectionName: resolvedOrbital.entity.collection,\n };\n\n // Build event namespace map\n eventNamespaces[orbitalName] = {};\n for (const resolvedTrait of resolvedOrbital.traits) {\n const traitName = resolvedTrait.trait.name;\n const namespace: { emits: Record<string, string>; listens: Record<string, string> } = {\n emits: {},\n listens: {},\n };\n\n // Namespace emitted events if the trait is imported\n if (namespaceEvents && resolvedTrait.source.type === \"imported\") {\n const emits = resolvedTrait.trait.emits ?? [];\n for (const emit of emits) {\n const eventName = typeof emit === \"string\" ? emit : emit.event;\n // External events get namespaced: OrbitalName.TraitName.EVENT\n namespace.emits[eventName] = `${orbitalName}.${traitName}.${eventName}`;\n }\n\n const listens = resolvedTrait.trait.listens ?? [];\n for (const listen of listens) {\n // Listening to namespaced events\n namespace.listens[listen.event] = listen.event;\n }\n }\n\n eventNamespaces[orbitalName][traitName] = namespace;\n }\n\n // Build preprocessed orbital with resolved inline definitions\n const preprocessedOrbital: OrbitalDefinition = {\n name: orbitalName,\n description: resolvedOrbital.original.description,\n visual_prompt: resolvedOrbital.original.visual_prompt,\n // Resolved entity (always inline now)\n entity: resolvedOrbital.entity,\n // Resolved traits (inline definitions)\n traits: (resolvedOrbital.traits || []).map((rt) => {\n // If it has config or linkedEntity, wrap in reference object.\n // `rt.trait.name` reflects any call-site rename applied by\n // ReferenceResolver.resolveTraitRefString's `overrideName`, so\n // `ref` and `_resolved.name` stay consistent with whatever local\n // name the molecule/organism declared for the inlined trait.\n if (rt.config || rt.linkedEntity) {\n return {\n ref: rt.trait.name,\n config: rt.config,\n linkedEntity: rt.linkedEntity,\n // Include the resolved trait definition for runtime\n _resolved: rt.trait,\n } as TraitRef;\n }\n // Otherwise return the inline trait\n return rt.trait as TraitRef;\n }),\n // Resolved pages (inline definitions with path overrides applied)\n pages: resolvedOrbital.pages.map((rp) => rp.page),\n // Preserve other fields\n exposes: resolvedOrbital.original.exposes,\n domainContext: resolvedOrbital.original.domainContext,\n design: resolvedOrbital.original.design,\n // Gap #22: pass through auxiliary entities so OrbitalServerRuntime's\n // mock-seed branch registers SearchResult / FilterTarget / PagedItem\n // alongside the molecule's primary entity. Without this, an inlined\n // .orb that has `auxiliaryEntities` populated by the Rust inline\n // phase still loses them here, and `(set @entity.searchTerm ...)` /\n // `(fetch SearchResult ...)` from no-rebind imports hit unregistered\n // persistence and silently no-op.\n auxiliaryEntities: resolvedOrbital.original.auxiliaryEntities,\n };\n\n preprocessedOrbitals.push(preprocessedOrbital);\n }\n\n // Build preprocessed schema\n const preprocessedSchema: OrbitalSchema = {\n ...schema,\n orbitals: preprocessedOrbitals,\n };\n\n return {\n success: true,\n data: {\n schema: preprocessedSchema,\n entitySharing,\n eventNamespaces,\n warnings,\n },\n };\n}\n\n// ============================================================================\n// Entity Isolation Helper\n// ============================================================================\n\n/**\n * Get the collection name for an orbital's entity, considering isolation.\n *\n * - `persistent` entities share the same collection\n * - `runtime` entities get isolated collections per orbital\n * - `singleton` entities share a single-record collection\n */\nexport function getIsolatedCollectionName(\n orbitalName: string,\n entitySharing: EntitySharingMap\n): string {\n const info = entitySharing[orbitalName];\n if (!info) {\n throw new Error(`Unknown orbital: ${orbitalName}`);\n }\n\n if (info.persistence === \"runtime\") {\n // Isolated: use orbital-prefixed collection\n return `${orbitalName}_${info.entityName}`;\n }\n\n // Shared: use the entity's collection name or default\n return info.collectionName || info.entityName.toLowerCase() + \"s\";\n}\n\n// ============================================================================\n// Event Namespacing Helper\n// ============================================================================\n\n/**\n * Get the namespaced event name for an orbital's trait event.\n */\nexport function getNamespacedEvent(\n orbitalName: string,\n traitName: string,\n eventName: string,\n eventNamespaces: EventNamespaceMap\n): string {\n const orbitalNs = eventNamespaces[orbitalName];\n if (!orbitalNs) return eventName;\n\n const traitNs = orbitalNs[traitName];\n if (!traitNs) return eventName;\n\n return traitNs.emits[eventName] || eventName;\n}\n\n/**\n * Check if an event name is namespaced (contains dots).\n */\nexport function isNamespacedEvent(eventName: string): boolean {\n return eventName.includes(\".\");\n}\n\n/**\n * Parse a namespaced event name.\n */\nexport function parseNamespacedEvent(\n eventName: string\n): { orbital?: string; trait?: string; event: string } {\n const parts = eventName.split(\".\");\n if (parts.length === 3) {\n return { orbital: parts[0], trait: parts[1], event: parts[2] };\n }\n if (parts.length === 2) {\n return { trait: parts[0], event: parts[1] };\n }\n return { event: eventName };\n}\n\n// ============================================================================\n// Loader Factory Helper\n// ============================================================================\n\n/**\n * Options for creating a schema preprocessor.\n */\nexport interface CreatePreprocessorOptions {\n /** Base path for schema files */\n basePath: string;\n\n /** Standard library path (filesystem or URL) */\n stdLibPath?: string;\n\n /** Scoped package paths */\n scopedPaths?: Record<string, string>;\n\n /** Custom loader instance (optional) */\n loader?: SchemaLoader;\n\n /** Apply event namespacing to imported traits */\n namespaceEvents?: boolean;\n}\n\n/**\n * Create a schema preprocessor with automatic loader selection.\n *\n * In browser environments, uses HttpLoader.\n * In Node.js/Electron, uses UnifiedLoader (filesystem + HTTP fallback).\n *\n * @example\n * ```typescript\n * // Server-side (Node.js)\n * const preprocessor = createPreprocessor({\n * basePath: \"/project/schemas\",\n * stdLibPath: \"/project/std\",\n * });\n *\n * // Browser-side (uses HTTP)\n * const preprocessor = createPreprocessor({\n * basePath: \"/api/schemas\",\n * stdLibPath: \"https://cdn.example.com/orbital-std\",\n * });\n *\n * // Custom loader\n * const preprocessor = createPreprocessor({\n * basePath: \"/schemas\",\n * loader: myCustomLoader,\n * });\n * ```\n */\nexport function createPreprocessor(options: CreatePreprocessorOptions): {\n preprocess: (schema: OrbitalSchema) => Promise<PreprocessResult>;\n loader: SchemaLoader;\n} {\n // Create loader if not provided\n const loader = options.loader ?? createUnifiedLoader({\n basePath: options.basePath,\n stdLibPath: options.stdLibPath,\n scopedPaths: options.scopedPaths,\n });\n\n const preprocess = (schema: OrbitalSchema) =>\n preprocessSchema(schema, {\n basePath: options.basePath,\n stdLibPath: options.stdLibPath,\n scopedPaths: options.scopedPaths,\n loader,\n namespaceEvents: options.namespaceEvents,\n });\n\n return { preprocess, loader };\n}\n\n/**\n * Preprocess a schema with automatic loader selection.\n *\n * Convenience wrapper around `preprocessSchema` that creates\n * an appropriate loader based on the environment.\n *\n * @example\n * ```typescript\n * const result = await preprocessSchemaAuto(schema, {\n * basePath: \"/schemas\",\n * stdLibPath: \"/std\",\n * });\n * ```\n */\nexport async function preprocessSchemaAuto(\n schema: OrbitalSchema,\n options: Omit<CreatePreprocessorOptions, \"loader\">\n): Promise<PreprocessResult> {\n const { preprocess } = createPreprocessor(options);\n return preprocess(schema);\n}\n","/**\n * PersistenceAdapter — the storage contract for runtime effect handlers.\n *\n * The server-side runtime and the in-browser mock runtime both invoke\n * `fetch` / `persist` / `ref` / `deref` / `swap!` effects against an\n * implementation of this interface. Extracted from\n * `OrbitalServerRuntime.ts` so it can be imported by browser code that\n * cannot depend on the server module (which pulls in express).\n *\n * @packageDocumentation\n */\nimport type { EntityRow } from \"./types.js\";\n\n/**\n * Storage contract for CRUD operations on runtime entity rows.\n *\n * Implementations:\n * - `InMemoryPersistence` (this file) — simple Map-backed store, used by\n * the browser mock runtime and as the default when an adapter is not\n * supplied to `OrbitalServerRuntime`.\n * - `MockPersistenceAdapter` — in-memory with faker-generated seed data\n * for realistic preview content.\n * - `LocalPersistenceAdapter` — localStorage-backed, browser-safe.\n * - Consumer-provided (e.g. Firestore, Postgres) for production servers.\n */\nexport interface PersistenceAdapter {\n create(entityType: string, data: EntityRow): Promise<{ id: string }>;\n update(entityType: string, id: string, data: EntityRow): Promise<void>;\n delete(entityType: string, id: string): Promise<void>;\n getById(entityType: string, id: string): Promise<EntityRow | null>;\n list(entityType: string): Promise<EntityRow[]>;\n}\n\n/**\n * Simple in-memory persistence for dev/testing and offline previews.\n * Keys each entity collection by type, rows by generated string id.\n */\nexport class InMemoryPersistence implements PersistenceAdapter {\n private data = new Map<string, Map<string, EntityRow>>();\n private idCounter = 0;\n\n /**\n * Seed the store with pre-existing rows.\n *\n * Accepts either a plain `Record<entityType, EntityRow[]>` or an iterable\n * of `[entityType, EntityRow[]]` entries. Rows without an `id` get one\n * generated at insert time; rows with an `id` keep it (so re-seeding\n * after a schema rebuild preserves identities used in render bindings).\n */\n seed(seedData: Record<string, EntityRow[]> | Iterable<[string, EntityRow[]]>): void {\n const entries: Iterable<[string, EntityRow[]]> =\n Symbol.iterator in Object(seedData)\n ? (seedData as Iterable<[string, EntityRow[]]>)\n : Object.entries(seedData as Record<string, EntityRow[]>);\n for (const [entityType, rows] of entries) {\n if (!this.data.has(entityType)) {\n this.data.set(entityType, new Map());\n }\n const collection = this.data.get(entityType)!;\n for (const row of rows) {\n const id = (row.id as string) || `${entityType}-${++this.idCounter}`;\n collection.set(id, { ...row, id });\n }\n }\n }\n\n async create(\n entityType: string,\n data: EntityRow,\n ): Promise<{ id: string }> {\n const id = (data.id as string) || `${entityType}-${++this.idCounter}`;\n if (!this.data.has(entityType)) {\n this.data.set(entityType, new Map());\n }\n this.data.get(entityType)!.set(id, { ...data, id });\n return { id };\n }\n\n async update(\n entityType: string,\n id: string,\n data: EntityRow,\n ): Promise<void> {\n const collection = this.data.get(entityType);\n if (collection?.has(id)) {\n const existing = collection.get(id)!;\n collection.set(id, { ...existing, ...data });\n }\n }\n\n async delete(entityType: string, id: string): Promise<void> {\n this.data.get(entityType)?.delete(id);\n }\n\n async getById(\n entityType: string,\n id: string,\n ): Promise<EntityRow | null> {\n return this.data.get(entityType)?.get(id) || null;\n }\n\n async list(entityType: string): Promise<EntityRow[]> {\n const collection = this.data.get(entityType);\n return collection ? Array.from(collection.values()) : [];\n }\n\n /**\n * Snapshot the entire store as a plain object (entityType → rows).\n * Useful for feeding a fresh render-time binding layer with the\n * current persistence view.\n */\n snapshot(): Record<string, EntityRow[]> {\n const out: Record<string, EntityRow[]> = {};\n for (const [entityType, collection] of this.data) {\n out[entityType] = Array.from(collection.values());\n }\n return out;\n }\n}\n"]}