@almadar/server 2.0.6 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/env.ts","../src/lib/logger.ts","../src/lib/eventBus.ts","../src/lib/eventBusTransport.ts","../src/lib/eventPersistence.ts","../src/lib/db.ts","../src/services/MockDataService.ts","../src/utils/queryFilters.ts","../src/services/DataService.ts","../src/lib/debugRouter.ts","../src/lib/websocket.ts","../src/middleware/errorHandler.ts","../src/middleware/validation.ts","../src/middleware/authenticateFirebase.ts","../src/stores/firestoreFormat.ts","../src/stores/SchemaProtectionService.ts","../src/stores/SchemaStore.ts","../src/stores/SnapshotStore.ts","../src/stores/ChangeSetStore.ts","../src/stores/ValidationStore.ts","../src/deepagent/memory.ts","../src/deepagent/session.ts","../src/deepagent/skill-agent.ts","../src/middleware/multi-user.ts","../src/websocket/state-sync.ts","../src/lib/serviceDiscovery.ts","../src/routes/observability.ts","../src/index.ts"],"names":["router","ZodError","db","memoryManager","getMultiUserManager","Router","getObservabilityCollector"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\n\n// Load environment variables\ndotenv.config();\n\nconst envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z\n .string()\n .default('3030')\n .transform((val) => parseInt(val, 10)),\n CORS_ORIGIN: z\n .string()\n .default('http://localhost:5173')\n .transform((val) => (val.includes(',') ? val.split(',').map((s) => s.trim()) : val)),\n \n // Database (Prisma/SQL) - optional\n DATABASE_URL: z.string().optional(),\n \n // Firebase/Firestore configuration\n FIREBASE_PROJECT_ID: z.string().optional(),\n FIREBASE_CLIENT_EMAIL: z.string().optional(),\n FIREBASE_PRIVATE_KEY: z.string().optional(),\n FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),\n FIRESTORE_EMULATOR_HOST: z.string().optional(),\n FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),\n \n // API configuration\n API_PREFIX: z.string().default('/api'),\n\n // Mock data configuration\n USE_MOCK_DATA: z.string().default('true').transform((v) => v === 'true'),\n MOCK_SEED: z\n .string()\n .optional()\n .transform((v) => (v ? parseInt(v, 10) : undefined)),\n});\n\nconst parsed = envSchema.safeParse(process.env);\n\nif (!parsed.success) {\n console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);\n throw new Error('Invalid environment variables');\n}\n\nexport const env = parsed.data;\n","import { env } from './env.js';\n\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst colors = {\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n reset: '\\x1b[0m',\n};\n\nconst shouldLog = (level: LogLevel): boolean => {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const minLevel = env.NODE_ENV === 'production' ? 'info' : 'debug';\n return levels.indexOf(level) >= levels.indexOf(minLevel);\n};\n\nconst formatMessage = (level: LogLevel, message: string, meta?: unknown): string => {\n const timestamp = new Date().toISOString();\n const color = colors[level];\n const prefix = `${color}[${level.toUpperCase()}]${colors.reset}`;\n const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${prefix} ${message}${metaStr}`;\n};\n\nexport const logger = {\n debug: (message: string, meta?: unknown) => {\n if (shouldLog('debug')) {\n console.log(formatMessage('debug', message, meta));\n }\n },\n info: (message: string, meta?: unknown) => {\n if (shouldLog('info')) {\n console.log(formatMessage('info', message, meta));\n }\n },\n warn: (message: string, meta?: unknown) => {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message, meta));\n }\n },\n error: (message: string, meta?: unknown) => {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message, meta));\n }\n },\n};\n","/**\n * Server EventBus - Singleton for server-side cross-trait communication\n *\n * This EventBus enables:\n * - Server-side trait event emission after CRUD operations\n * - Server-side trait listeners responding to events\n * - Cross-client event broadcast via WebSocket\n *\n * @packageDocumentation\n */\n\ntype EventHandler = (payload: unknown, meta?: Record<string, unknown>) => void;\n\nexport interface EventLogEntry {\n event: string;\n payload: unknown;\n timestamp: number;\n listenerCount: number;\n wildcardListenerCount: number;\n}\n\nconst MAX_EVENT_LOG = 200;\n\n/**\n * Simple EventBus implementation for server-side events\n */\nexport class EventBus {\n private handlers: Map<string, Set<EventHandler>> = new Map();\n private debug: boolean;\n private eventLog: EventLogEntry[] = [];\n\n constructor(options?: { debug?: boolean }) {\n this.debug = options?.debug ?? false;\n }\n\n on(event: string, handler: EventHandler): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.handlers.get(event)?.delete(handler);\n };\n }\n\n off(event: string, handler: EventHandler): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n emit(event: string, payload?: unknown, meta?: Record<string, unknown>): void {\n if (this.debug) {\n console.log(`[EventBus] Emitting ${event}:`, payload);\n }\n\n const handlers = this.handlers.get(event);\n const listenerCount = handlers?.size ?? 0;\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(payload, meta);\n } catch (err) {\n console.error(`[EventBus] Error in handler for ${event}:`, err);\n }\n });\n }\n\n // Wildcard subscribers receive all events (used by WebSocket broadcast)\n let wildcardListenerCount = 0;\n if (event !== '*') {\n const wildcardHandlers = this.handlers.get('*');\n wildcardListenerCount = wildcardHandlers?.size ?? 0;\n if (wildcardHandlers) {\n wildcardHandlers.forEach(handler => {\n try {\n handler({ type: event, payload, timestamp: Date.now() }, meta);\n } catch (err) {\n console.error(`[EventBus] Error in wildcard handler for ${event}:`, err);\n }\n });\n }\n }\n\n // Record event in log (dev diagnostics)\n if (this.debug) {\n this.eventLog.push({\n event,\n payload,\n timestamp: Date.now(),\n listenerCount,\n wildcardListenerCount,\n });\n if (this.eventLog.length > MAX_EVENT_LOG) {\n this.eventLog.splice(0, this.eventLog.length - MAX_EVENT_LOG);\n }\n }\n }\n\n getRecentEvents(limit = 50): EventLogEntry[] {\n return this.eventLog.slice(-limit);\n }\n\n clearEventLog(): void {\n this.eventLog.length = 0;\n }\n\n getListenerCounts(): Record<string, number> {\n const counts: Record<string, number> = {};\n this.handlers.forEach((handlers, event) => {\n counts[event] = handlers.size;\n });\n return counts;\n }\n\n clear(): void {\n this.handlers.clear();\n this.eventLog.length = 0;\n }\n}\n\n/**\n * Lazy singleton EventBus instance for server-side event communication.\n */\nlet _serverEventBus: EventBus | null = null;\n\nexport function getServerEventBus(): EventBus {\n if (!_serverEventBus) {\n _serverEventBus = new EventBus({\n debug: process.env.NODE_ENV === 'development',\n });\n }\n return _serverEventBus;\n}\n\nexport function resetServerEventBus(): void {\n _serverEventBus?.clear();\n _serverEventBus = null;\n}\n\n/**\n * Type-safe event emission helper\n */\nexport function emitEntityEvent(\n entityType: string,\n action: 'CREATED' | 'UPDATED' | 'DELETED',\n payload: Record<string, unknown>\n): void {\n const eventType = `${entityType.toUpperCase()}_${action}`;\n getServerEventBus().emit(eventType, payload, { orbital: entityType });\n}\n","/**\n * EventBus Transport Layer — Pluggable backends for distributed event communication\n *\n * Transports enable emit/listen to work across processes:\n * - InMemoryTransport: Default, same-process (no-op relay)\n * - RedisTransport: Redis pub/sub for cross-process communication\n *\n * The DistributedEventBus wraps the existing EventBus and relays events\n * through a transport. Local listeners still fire immediately; the transport\n * handles cross-process delivery.\n *\n * @packageDocumentation\n */\n\nimport { EventBus, type EventLogEntry } from './eventBus.js';\n\n// ============================================================================\n// Transport Interface\n// ============================================================================\n\n/**\n * Message shape sent over the transport wire.\n */\nexport interface TransportMessage {\n event: string;\n payload: unknown;\n meta?: Record<string, unknown>;\n /** Source instance ID to prevent echo loops */\n sourceId: string;\n timestamp: number;\n}\n\n/**\n * Callback invoked when a message arrives from another process.\n */\nexport type TransportReceiver = (message: TransportMessage) => void;\n\n/**\n * Pluggable transport interface for cross-process event delivery.\n */\nexport interface IEventBusTransport {\n /** Publish a message to the transport */\n publish(message: TransportMessage): Promise<void>;\n /** Subscribe to incoming messages from other processes */\n subscribe(receiver: TransportReceiver): Promise<void>;\n /** Unsubscribe and clean up resources */\n close(): Promise<void>;\n}\n\n// ============================================================================\n// InMemoryTransport (default — same-process, no network)\n// ============================================================================\n\n/**\n * No-op transport for single-process mode.\n * Events stay in the local EventBus only.\n */\nexport class InMemoryTransport implements IEventBusTransport {\n async publish(): Promise<void> {\n // No-op: events only live in the local EventBus\n }\n\n async subscribe(): Promise<void> {\n // No-op: nothing to subscribe to\n }\n\n async close(): Promise<void> {\n // No-op\n }\n}\n\n// ============================================================================\n// RedisTransport (cross-process via Redis pub/sub)\n// ============================================================================\n\n/**\n * Options for RedisTransport.\n */\nexport interface RedisTransportOptions {\n /** Redis channel name for event relay (default: 'almadar:events') */\n channel?: string;\n /**\n * Publish function — sends serialized message to Redis channel.\n * This is injected so we don't depend on a specific Redis client library.\n */\n publishFn: (channel: string, message: string) => Promise<void>;\n /**\n * Subscribe function — registers a callback for messages on a Redis channel.\n * This is injected so we don't depend on a specific Redis client library.\n */\n subscribeFn: (channel: string, callback: (message: string) => void) => Promise<void>;\n /**\n * Unsubscribe/cleanup function.\n */\n closeFn?: () => Promise<void>;\n}\n\n/**\n * Redis pub/sub transport for cross-process event delivery.\n *\n * Uses dependency-injected publish/subscribe functions so the transport\n * is not coupled to any specific Redis client library (ioredis, redis, etc.).\n *\n * Usage with ioredis:\n * ```typescript\n * import Redis from 'ioredis';\n * const pub = new Redis(process.env.REDIS_URL);\n * const sub = new Redis(process.env.REDIS_URL);\n *\n * const transport = new RedisTransport({\n * publishFn: (ch, msg) => pub.publish(ch, msg).then(() => {}),\n * subscribeFn: (ch, cb) => { sub.subscribe(ch); sub.on('message', (_, msg) => cb(msg)); return Promise.resolve(); },\n * closeFn: async () => { await pub.quit(); await sub.quit(); },\n * });\n * ```\n */\nexport class RedisTransport implements IEventBusTransport {\n private channel: string;\n private publishFn: RedisTransportOptions['publishFn'];\n private subscribeFn: RedisTransportOptions['subscribeFn'];\n private closeFn: RedisTransportOptions['closeFn'];\n\n constructor(options: RedisTransportOptions) {\n this.channel = options.channel ?? 'almadar:events';\n this.publishFn = options.publishFn;\n this.subscribeFn = options.subscribeFn;\n this.closeFn = options.closeFn;\n }\n\n async publish(message: TransportMessage): Promise<void> {\n const serialized = JSON.stringify(message);\n await this.publishFn(this.channel, serialized);\n }\n\n async subscribe(receiver: TransportReceiver): Promise<void> {\n await this.subscribeFn(this.channel, (raw: string) => {\n try {\n const message = JSON.parse(raw) as TransportMessage;\n receiver(message);\n } catch {\n console.error('[RedisTransport] Failed to parse message:', raw);\n }\n });\n }\n\n async close(): Promise<void> {\n if (this.closeFn) {\n await this.closeFn();\n }\n }\n}\n\n// ============================================================================\n// DistributedEventBus\n// ============================================================================\n\nlet instanceCounter = 0;\n\n/**\n * DistributedEventBus wraps the existing EventBus and relays events\n * through a pluggable transport for cross-process communication.\n *\n * - Local emit → fires local listeners + publishes to transport\n * - Transport message received → fires local listeners (skips re-publish)\n *\n * Drop-in replacement for EventBus — same API, same singleton pattern.\n */\nexport class DistributedEventBus {\n private localBus: EventBus;\n private transport: IEventBusTransport;\n private instanceId: string;\n private isRelaying = false;\n\n constructor(options?: {\n debug?: boolean;\n transport?: IEventBusTransport;\n }) {\n this.localBus = new EventBus({ debug: options?.debug });\n this.transport = options?.transport ?? new InMemoryTransport();\n this.instanceId = `instance_${++instanceCounter}_${Date.now()}`;\n }\n\n /**\n * Initialize the transport subscription. Call once at startup.\n */\n async connect(): Promise<void> {\n await this.transport.subscribe((message) => {\n // Skip messages from ourselves (echo prevention)\n if (message.sourceId === this.instanceId) {\n return;\n }\n\n // Relay to local bus without re-publishing to transport\n this.isRelaying = true;\n try {\n this.localBus.emit(message.event, message.payload, message.meta);\n } finally {\n this.isRelaying = false;\n }\n });\n }\n\n /**\n * Emit an event locally and publish to transport for other processes.\n */\n emit(event: string, payload?: unknown, meta?: Record<string, unknown>): void {\n // Always fire locally\n this.localBus.emit(event, payload, meta);\n\n // Publish to transport (unless this emit was triggered by a transport relay)\n if (!this.isRelaying) {\n const message: TransportMessage = {\n event,\n payload,\n meta,\n sourceId: this.instanceId,\n timestamp: Date.now(),\n };\n // Fire-and-forget publish (don't block the emit)\n this.transport.publish(message).catch((err) => {\n console.error('[DistributedEventBus] Transport publish error:', err);\n });\n }\n }\n\n /** Subscribe to an event */\n on(event: string, handler: (payload: unknown, meta?: Record<string, unknown>) => void): () => void {\n return this.localBus.on(event, handler);\n }\n\n /** Unsubscribe from an event */\n off(event: string, handler: (payload: unknown, meta?: Record<string, unknown>) => void): void {\n this.localBus.off(event, handler);\n }\n\n /** Get recent events (dev diagnostics) */\n getRecentEvents(limit?: number): EventLogEntry[] {\n return this.localBus.getRecentEvents(limit);\n }\n\n /** Clear event log */\n clearEventLog(): void {\n this.localBus.clearEventLog();\n }\n\n /** Get listener counts */\n getListenerCounts(): Record<string, number> {\n return this.localBus.getListenerCounts();\n }\n\n /** Clear all listeners and log */\n clear(): void {\n this.localBus.clear();\n }\n\n /** Disconnect transport */\n async disconnect(): Promise<void> {\n await this.transport.close();\n }\n\n /** Get the instance ID (for debugging) */\n getInstanceId(): string {\n return this.instanceId;\n }\n}\n","/**\n * Event Persistence Layer — Optional durable event storage for replay and debugging\n *\n * Wraps the EventBus to persist emitted events. Supports:\n * - In-memory storage (default, for development)\n * - Configurable retention (TTL-based cleanup)\n * - Replay API: query events by name, time range, or source\n * - Required for saga compensation and distributed debugging\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Persisted event record */\nexport interface PersistedEvent {\n /** Unique event ID */\n id: string;\n /** Event name (e.g., 'LLM_RESPONSE') */\n eventName: string;\n /** Event payload */\n payload: unknown;\n /** Source orbital/service that emitted this event */\n source: string;\n /** Timestamp when event was emitted */\n timestamp: number;\n /** Trace ID for distributed tracing correlation */\n traceId: string;\n /** Optional metadata */\n meta?: Record<string, unknown>;\n}\n\n/** Query filters for replaying events */\nexport interface EventQuery {\n /** Filter by event name (exact match) */\n eventName?: string;\n /** Filter by source orbital */\n source?: string;\n /** Filter by trace ID */\n traceId?: string;\n /** Events after this timestamp */\n after?: number;\n /** Events before this timestamp */\n before?: number;\n /** Maximum number of events to return */\n limit?: number;\n /** Sort order */\n order?: 'asc' | 'desc';\n}\n\n/** Options for the event persistence layer */\nexport interface EventPersistenceOptions {\n /** Whether persistence is enabled (default: true) */\n enabled?: boolean;\n /** TTL in milliseconds for event retention (default: 24 hours) */\n retentionMs?: number;\n /** Maximum events to store (default: 10000) */\n maxEvents?: number;\n /** Cleanup interval in milliseconds (default: 5 minutes) */\n cleanupIntervalMs?: number;\n /** Default source identifier */\n defaultSource?: string;\n}\n\n/** Storage backend interface */\nexport interface IEventStore {\n /** Persist an event */\n store(event: PersistedEvent): Promise<void>;\n /** Query events */\n query(filters: EventQuery): Promise<PersistedEvent[]>;\n /** Get a single event by ID */\n get(id: string): Promise<PersistedEvent | null>;\n /** Delete events older than timestamp */\n deleteOlderThan(timestamp: number): Promise<number>;\n /** Get total event count */\n count(): Promise<number>;\n /** Clear all stored events */\n clear(): Promise<void>;\n}\n\n// ============================================================================\n// InMemoryEventStore\n// ============================================================================\n\n/**\n * In-memory event store for development and testing.\n */\nexport class InMemoryEventStore implements IEventStore {\n private events: PersistedEvent[] = [];\n private index: Map<string, PersistedEvent> = new Map();\n\n async store(event: PersistedEvent): Promise<void> {\n this.events.push(event);\n this.index.set(event.id, event);\n }\n\n async query(filters: EventQuery): Promise<PersistedEvent[]> {\n let results = this.events;\n\n if (filters.eventName) {\n results = results.filter(e => e.eventName === filters.eventName);\n }\n if (filters.source) {\n results = results.filter(e => e.source === filters.source);\n }\n if (filters.traceId) {\n results = results.filter(e => e.traceId === filters.traceId);\n }\n if (filters.after !== undefined) {\n results = results.filter(e => e.timestamp > filters.after!);\n }\n if (filters.before !== undefined) {\n results = results.filter(e => e.timestamp < filters.before!);\n }\n\n // Sort\n if (filters.order === 'desc') {\n results = [...results].reverse();\n }\n\n // Limit\n if (filters.limit !== undefined && filters.limit > 0) {\n results = results.slice(0, filters.limit);\n }\n\n return results;\n }\n\n async get(id: string): Promise<PersistedEvent | null> {\n return this.index.get(id) ?? null;\n }\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n const before = this.events.length;\n this.events = this.events.filter(e => e.timestamp >= timestamp);\n\n // Rebuild index\n this.index.clear();\n for (const event of this.events) {\n this.index.set(event.id, event);\n }\n\n return before - this.events.length;\n }\n\n async count(): Promise<number> {\n return this.events.length;\n }\n\n async clear(): Promise<void> {\n this.events = [];\n this.index.clear();\n }\n}\n\n// ============================================================================\n// EventPersistence\n// ============================================================================\n\nlet idCounter = 0;\n\n/**\n * Event persistence layer that can be attached to an EventBus.\n *\n * Usage:\n * ```typescript\n * const persistence = new EventPersistence({ retentionMs: 3600000 });\n * persistence.startCleanup();\n *\n * // Persist an event\n * await persistence.persist('LLM_RESPONSE', { content: '...' }, { source: 'llm-service' });\n *\n * // Replay events\n * const events = await persistence.replay({ eventName: 'LLM_RESPONSE', limit: 10 });\n *\n * // Stop cleanup on shutdown\n * persistence.stopCleanup();\n * ```\n */\nexport class EventPersistence {\n private store: IEventStore;\n private options: Required<EventPersistenceOptions>;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options?: EventPersistenceOptions, store?: IEventStore) {\n this.options = {\n enabled: options?.enabled ?? true,\n retentionMs: options?.retentionMs ?? 24 * 60 * 60 * 1000, // 24 hours\n maxEvents: options?.maxEvents ?? 10000,\n cleanupIntervalMs: options?.cleanupIntervalMs ?? 5 * 60 * 1000, // 5 minutes\n defaultSource: options?.defaultSource ?? 'unknown',\n };\n this.store = store ?? new InMemoryEventStore();\n }\n\n /**\n * Persist an event.\n */\n async persist(\n eventName: string,\n payload: unknown,\n meta?: { source?: string; traceId?: string; [key: string]: unknown },\n ): Promise<PersistedEvent> {\n const event: PersistedEvent = {\n id: `evt_${++idCounter}_${Date.now()}`,\n eventName,\n payload,\n source: meta?.source ?? this.options.defaultSource,\n timestamp: Date.now(),\n traceId: meta?.traceId ?? `trace_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n meta: meta ? { ...meta } : undefined,\n };\n\n if (this.options.enabled) {\n await this.store.store(event);\n }\n\n return event;\n }\n\n /**\n * Replay events matching the query filters.\n */\n async replay(query: EventQuery): Promise<PersistedEvent[]> {\n return this.store.query(query);\n }\n\n /**\n * Get a single event by ID.\n */\n async getEvent(id: string): Promise<PersistedEvent | null> {\n return this.store.get(id);\n }\n\n /**\n * Get event count.\n */\n async getEventCount(): Promise<number> {\n return this.store.count();\n }\n\n /**\n * Run cleanup — delete events older than retention period.\n */\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.options.retentionMs;\n return this.store.deleteOlderThan(cutoff);\n }\n\n /**\n * Start periodic cleanup timer.\n */\n startCleanup(): void {\n if (this.cleanupTimer) return;\n this.cleanupTimer = setInterval(() => {\n this.cleanup().catch(err => {\n console.error('[EventPersistence] Cleanup error:', err);\n });\n }, this.options.cleanupIntervalMs);\n }\n\n /**\n * Stop periodic cleanup timer.\n */\n stopCleanup(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Clear all persisted events.\n */\n async clear(): Promise<void> {\n await this.store.clear();\n }\n\n /**\n * Get the underlying store (for testing or custom queries).\n */\n getStore(): IEventStore {\n return this.store;\n }\n}\n","/**\n * Database Accessors & Initialization\n *\n * This module provides:\n * - `initializeFirebase()` — convenience function to init Firebase from env vars\n * - `getFirestore()`, `getAuth()` — accessors for Firebase services\n * - `db` — lazy Firestore proxy (no eager initialization)\n *\n * The consuming application MUST call `initializeFirebase()` or\n * `admin.initializeApp()` before using any Firebase-dependent features.\n */\n\nimport admin from 'firebase-admin';\n\n/**\n * Initialize Firebase Admin SDK from environment variables.\n *\n * Reads: FIREBASE_PROJECT_ID, FIREBASE_CLIENT_EMAIL, FIREBASE_PRIVATE_KEY,\n * FIREBASE_SERVICE_ACCOUNT_PATH, FIRESTORE_EMULATOR_HOST\n *\n * Safe to call multiple times — returns existing app if already initialized.\n */\nexport function initializeFirebase(): admin.app.App {\n // Already initialized — return existing app\n if (admin.apps.length > 0) {\n return admin.app();\n }\n\n const projectId = process.env.FIREBASE_PROJECT_ID;\n const emulatorHost = process.env.FIRESTORE_EMULATOR_HOST;\n\n // Emulator mode — no credentials needed\n if (emulatorHost) {\n const app = admin.initializeApp({\n projectId: projectId || 'demo-project',\n });\n console.log(`Firebase Admin initialized for emulator: ${emulatorHost}`);\n return app;\n }\n\n // Service account file\n const serviceAccountPath = process.env.FIREBASE_SERVICE_ACCOUNT_PATH;\n if (serviceAccountPath) {\n // Dynamic require for JSON service account file at runtime\n const serviceAccount = require(serviceAccountPath) as Record<string, unknown>;\n return admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId,\n });\n }\n\n // Inline credentials\n const clientEmail = process.env.FIREBASE_CLIENT_EMAIL;\n const privateKey = process.env.FIREBASE_PRIVATE_KEY;\n if (projectId && clientEmail && privateKey) {\n return admin.initializeApp({\n credential: admin.credential.cert({\n projectId,\n clientEmail,\n privateKey: privateKey.replace(/\\\\n/g, '\\n'),\n }),\n projectId,\n });\n }\n\n // Application default credentials (Cloud Run, etc.)\n if (projectId) {\n return admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId,\n });\n }\n\n throw new Error(\n '@almadar/server: Cannot initialize Firebase — no credentials found. ' +\n 'Set FIREBASE_PROJECT_ID + FIREBASE_CLIENT_EMAIL + FIREBASE_PRIVATE_KEY, ' +\n 'or FIREBASE_SERVICE_ACCOUNT_PATH, or FIRESTORE_EMULATOR_HOST.'\n );\n}\n\n/**\n * Get the initialized Firebase app.\n * Throws if Firebase Admin SDK has not been initialized.\n */\nfunction getApp(): admin.app.App {\n if (admin.apps.length === 0) {\n throw new Error(\n '@almadar/server: Firebase Admin SDK is not initialized. ' +\n 'Call initializeFirebase() or admin.initializeApp() before using @almadar/server.'\n );\n }\n return admin.app();\n}\n\n/**\n * Get Firestore instance from the pre-initialized Firebase app.\n */\nexport function getFirestore(): admin.firestore.Firestore {\n return getApp().firestore();\n}\n\n/**\n * Get Firebase Auth instance from the pre-initialized Firebase app.\n */\nexport function getAuth(): admin.auth.Auth {\n return getApp().auth();\n}\n\n// Re-export admin for convenience\nexport { admin };\n\n/**\n * Lazy Firestore proxy — resolves on first property access, not at import time.\n * This prevents the \"Firebase not initialized\" error during module loading.\n */\nexport const db = new Proxy({} as admin.firestore.Firestore, {\n get(_target, prop, receiver) {\n const firestore = getFirestore();\n const value = Reflect.get(firestore, prop, receiver);\n return typeof value === 'function' ? value.bind(firestore) : value;\n },\n});\n","/**\n * MockDataService - In-memory data store with faker-based mock generation\n *\n * Provides a stateful mock data layer that supports all CRUD operations.\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 { env } from '../lib/env.js';\nimport { logger } from '../lib/logger.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FieldSchema {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'enum' | 'relation' | 'array';\n required?: boolean;\n enumValues?: string[];\n min?: number;\n max?: number;\n fakerMethod?: string;\n relatedEntity?: string;\n}\n\nexport interface EntitySchema {\n fields: FieldSchema[];\n seedCount?: number;\n}\n\ninterface BaseEntity {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n// ============================================================================\n// MockDataService\n// ============================================================================\n\n/**\n * In-memory mock data store with CRUD operations and faker-based seeding.\n */\nexport class MockDataService {\n private stores: Map<string, Map<string, unknown>> = new Map();\n private schemas: Map<string, EntitySchema> = new Map();\n private idCounters: Map<string, number> = new Map();\n\n constructor() {\n // Set seed for deterministic generation if provided\n if (env.MOCK_SEED !== undefined) {\n faker.seed(env.MOCK_SEED);\n logger.info(`[Mock] Using seed: ${env.MOCK_SEED}`);\n }\n }\n\n // ============================================================================\n // Store Management\n // ============================================================================\n\n /**\n * Initialize store for an entity.\n */\n private getStore(entityName: string): Map<string, unknown> {\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 /**\n * Generate next ID for an entity.\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 `mock-${normalized}-${counter}`;\n }\n\n // ============================================================================\n // Schema & Seeding\n // ============================================================================\n\n /**\n * Register an entity schema.\n */\n registerSchema(entityName: string, schema: EntitySchema): void {\n this.schemas.set(entityName.toLowerCase(), schema);\n }\n\n /**\n * Seed an entity with mock data.\n */\n seed(entityName: string, fields: FieldSchema[], count: number = 10): void {\n const store = this.getStore(entityName);\n const normalized = entityName.toLowerCase();\n\n logger.info(`[Mock] Seeding ${count} ${entityName}...`);\n\n for (let i = 0; i < count; i++) {\n const item = this.generateMockItem(normalized, fields, i + 1);\n store.set(item.id, item);\n }\n }\n\n /**\n * Generate a single mock item based on field schemas.\n */\n private generateMockItem(entityName: string, fields: FieldSchema[], index: number): BaseEntity & Record<string, unknown> {\n const id = this.nextId(entityName);\n const now = new Date();\n const item: Record<string, unknown> = {\n id,\n createdAt: faker.date.past({ years: 1 }),\n updatedAt: now,\n };\n\n for (const field of fields) {\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 as BaseEntity & Record<string, unknown>;\n }\n\n /**\n * Generate a mock value for a field based on its schema.\n */\n private generateFieldValue(entityName: string, field: FieldSchema, index: number): unknown {\n // Handle optional fields - 80% chance of having a value\n if (!field.required && Math.random() > 0.8) {\n return undefined;\n }\n\n switch (field.type) {\n case 'string':\n return this.generateStringValue(entityName, field, index);\n\n case 'number':\n return faker.number.int({\n min: field.min ?? 0,\n max: field.max ?? 1000,\n });\n\n case 'boolean':\n return faker.datatype.boolean();\n\n case 'date':\n return this.generateDateValue(field);\n\n case 'enum':\n if (field.enumValues && field.enumValues.length > 0) {\n return faker.helpers.arrayElement(field.enumValues);\n }\n return null;\n\n case 'relation':\n // For relations, generate a placeholder ID or null\n if (field.relatedEntity) {\n const relatedStore = this.stores.get(field.relatedEntity.toLowerCase());\n if (relatedStore && relatedStore.size > 0) {\n const ids = Array.from(relatedStore.keys());\n return faker.helpers.arrayElement(ids);\n }\n }\n return null;\n\n case 'array':\n // Generate an empty array for now\n return [];\n\n default:\n return null;\n }\n }\n\n /**\n * Generate a string value based on field name heuristics.\n * Generic name/title fields use a clean readable format (e.g., \"Title 1\").\n * Specific fields (email, phone, etc.) use faker.\n */\n private generateStringValue(_entityName: string, field: FieldSchema, index: number): string {\n const name = field.name.toLowerCase();\n\n // If field has enumValues, use them (even if type is 'string')\n if (field.enumValues && field.enumValues.length > 0) {\n return faker.helpers.arrayElement(field.enumValues);\n }\n\n // Identity fields\n if (name.includes('email')) return faker.internet.email();\n if (name === 'name' || name === 'fullname' || name === 'full_name') return faker.person.fullName();\n if (name === 'firstname' || name === 'first_name') return faker.person.firstName();\n if (name === 'lastname' || name === 'last_name') return faker.person.lastName();\n if (name.includes('username') || name === 'handle') return faker.internet.username();\n\n // Contact fields\n if (name.includes('phone') || name.includes('mobile') || name.includes('tel')) return faker.phone.number();\n if (name.includes('address') || name.includes('street')) return faker.location.streetAddress();\n if (name.includes('city')) return faker.location.city();\n if (name.includes('state') || name.includes('province')) return faker.location.state();\n if (name.includes('country')) return faker.location.country();\n if (name.includes('zip') || name.includes('postal')) return faker.location.zipCode();\n\n // Content fields\n if (name === 'title' || name === 'headline' || name === 'subject') return faker.lorem.sentence({ min: 3, max: 7 }).replace(/\\.$/, '');\n if (name === 'description' || name === 'summary' || name === 'bio' || name === 'about') return faker.lorem.paragraph(2);\n if (name === 'content' || name === 'body' || name === 'text') return faker.lorem.paragraphs(2);\n if (name === 'excerpt' || name === 'snippet' || name === 'preview') return faker.lorem.sentence({ min: 8, max: 15 });\n if (name === 'label' || name === 'tag' || name === 'category') return faker.word.noun();\n if (name === 'note' || name === 'comment' || name === 'message' || name === 'feedback') return faker.lorem.sentence();\n\n // Status / type fields\n if (name === 'status') return faker.helpers.arrayElement(['active', 'pending', 'completed', 'draft', 'archived']);\n if (name === 'priority') return faker.helpers.arrayElement(['low', 'medium', 'high', 'critical']);\n if (name === 'type' || name === 'kind') return faker.helpers.arrayElement(['standard', 'premium', 'basic', 'custom']);\n if (name === 'role') return faker.helpers.arrayElement(['admin', 'editor', 'viewer', 'member']);\n if (name === 'level' || name === 'tier') return faker.helpers.arrayElement(['beginner', 'intermediate', 'advanced', 'expert']);\n if (name === 'severity') return faker.helpers.arrayElement(['info', 'warning', 'error', 'critical']);\n if (name === 'difficulty') return faker.helpers.arrayElement(['easy', 'medium', 'hard']);\n\n // Web / media fields\n if (name.includes('url') || name.includes('website') || name.includes('link')) return faker.internet.url();\n if (name.includes('avatar') || name.includes('image') || name.includes('photo') || name.includes('thumbnail')) return faker.image.avatar();\n if (name.includes('color') || name.includes('colour')) return faker.color.human();\n if (name.includes('uuid') || name === 'guid') return faker.string.uuid();\n if (name.includes('icon')) return faker.helpers.arrayElement(['star', 'heart', 'check', 'alert-circle', 'info', 'folder', 'file', 'user']);\n if (name === 'slug') return faker.helpers.slugify(faker.lorem.words(3));\n\n // Organization / business fields\n if (name === 'company' || name === 'organization' || name === 'org') return faker.company.name();\n if (name === 'department') return faker.commerce.department();\n if (name === 'product' || name === 'productname' || name === 'product_name') return faker.commerce.productName();\n if (name === 'brand') return faker.company.name();\n if (name === 'sku' || name === 'code') return faker.string.alphanumeric(8).toUpperCase();\n if (name === 'currency') return faker.finance.currencyCode();\n if (name.includes('price') || name.includes('cost') || name.includes('amount')) return faker.commerce.price();\n\n // Location / geo fields\n if (name === 'latitude' || name === 'lat') return String(faker.location.latitude());\n if (name === 'longitude' || name === 'lng' || name === 'lon') return String(faker.location.longitude());\n if (name === 'location' || name === 'place' || name === 'venue') return `${faker.location.city()}, ${faker.location.country()}`;\n if (name === 'region' || name === 'zone' || name === 'area') return faker.location.state();\n\n // Technical fields\n if (name === 'ip' || name.includes('ipaddress') || name === 'ip_address') return faker.internet.ip();\n if (name === 'useragent' || name === 'user_agent') return faker.internet.userAgent();\n if (name === 'version' || name === 'firmware') return faker.system.semver();\n if (name === 'platform' || name === 'os') return faker.helpers.arrayElement(['iOS', 'Android', 'Windows', 'macOS', 'Linux']);\n if (name === 'browser') return faker.helpers.arrayElement(['Chrome', 'Firefox', 'Safari', 'Edge']);\n\n // Measurement / unit fields\n if (name === 'unit') return faker.helpers.arrayElement(['kg', 'lb', 'cm', 'm', 'L', 'mL', '°C', '°F', 'psi', 'rpm']);\n if (name === 'metric') return faker.helpers.arrayElement(['temperature', 'pressure', 'humidity', 'speed', 'voltage']);\n if (name === 'operator') return faker.helpers.arrayElement(['gt', 'lt', 'eq', 'gte', 'lte']);\n if (name === 'format' || name === 'mimetype' || name === 'mime_type') return faker.system.mimeType();\n if (name === 'extension' || name === 'ext') return faker.system.fileExt();\n if (name === 'filename' || name === 'file_name') return faker.system.fileName();\n\n // Fallback: generate realistic data based on common suffixes and patterns\n if (name.endsWith('id') || name.endsWith('_id')) return faker.string.alphanumeric(8).toUpperCase();\n if (name.endsWith('name') || name.endsWith('_name')) return faker.person.fullName();\n if (name.endsWith('type') || name.endsWith('_type')) return faker.helpers.arrayElement(['standard', 'premium', 'basic', 'custom', 'special']);\n if (name.endsWith('date') || name.endsWith('_date') || name.endsWith('at')) return faker.date.recent({ days: 90 }).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n if (name.endsWith('count') || name.endsWith('_count')) return String(faker.number.int({ min: 1, max: 100 }));\n if (name.includes('reason') || name.includes('detail')) return faker.lorem.sentence({ min: 4, max: 8 }).replace(/\\.$/, '');\n if (name.includes('field') || name.includes('key') || name.includes('attribute')) return faker.word.noun();\n if (name.includes('value') || name.includes('result') || name.includes('output')) return faker.word.words({ count: { min: 1, max: 3 } });\n if (name.includes('direction') || name.includes('position') || name.includes('mode')) return faker.helpers.arrayElement(['left', 'right', 'center', 'top', 'bottom', 'auto']);\n // Generic fallback: short descriptive phrase\n return faker.word.words({ count: { min: 1, max: 3 } });\n }\n\n /**\n * Capitalize first letter of a string.\n */\n private capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n /**\n * Generate a date value based on field name heuristics.\n */\n private generateDateValue(field: FieldSchema): Date {\n const name = field.name.toLowerCase();\n\n if (name.includes('created') || name.includes('start') || name.includes('birth')) {\n return faker.date.past({ years: 2 });\n }\n if (name.includes('updated') || name.includes('modified')) {\n return faker.date.recent({ days: 30 });\n }\n if (name.includes('deadline') || name.includes('due') || name.includes('end') || name.includes('expires')) {\n return faker.date.future({ years: 1 });\n }\n\n return faker.date.anytime();\n }\n\n // ============================================================================\n // CRUD Operations\n // ============================================================================\n\n /**\n * List all items of an entity.\n */\n list<T>(entityName: string): T[] {\n const store = this.getStore(entityName);\n return Array.from(store.values()) as T[];\n }\n\n /**\n * Get a single item by ID.\n */\n getById<T>(entityName: string, id: string): T | null {\n const store = this.getStore(entityName);\n const item = store.get(id);\n return (item as T) ?? null;\n }\n\n /**\n * Create a new item.\n */\n create<T extends BaseEntity>(entityName: string, data: Partial<T>): T {\n const store = this.getStore(entityName);\n const id = this.nextId(entityName);\n const now = new Date();\n\n const item = {\n ...data,\n id,\n createdAt: now,\n updatedAt: now,\n } as T;\n\n store.set(id, item);\n return item;\n }\n\n /**\n * Update an existing item.\n */\n update<T extends BaseEntity>(entityName: string, id: string, data: Partial<T>): T | null {\n const store = this.getStore(entityName);\n const existing = store.get(id);\n\n if (!existing) {\n return null;\n }\n\n const updated = {\n ...(existing as T),\n ...data,\n id, // Preserve original ID\n updatedAt: new Date(),\n } as T;\n\n store.set(id, updated);\n return updated;\n }\n\n /**\n * Delete an item.\n */\n delete(entityName: string, id: string): boolean {\n const store = this.getStore(entityName);\n if (!store.has(id)) {\n return false;\n }\n store.delete(id);\n return true;\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 /**\n * Clear all data.\n */\n clearAll(): void {\n this.stores.clear();\n this.idCounters.clear();\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// Lazy singleton instance\nlet _mockDataService: MockDataService | null = null;\n\nexport function getMockDataService(): MockDataService {\n if (!_mockDataService) {\n _mockDataService = new MockDataService();\n }\n return _mockDataService;\n}\n\nexport function resetMockDataService(): void {\n _mockDataService?.clearAll();\n _mockDataService = null;\n}\n","/**\n * Query Filter Utilities\n *\n * Parses URL query parameters into Firestore-compatible filter objects.\n * Supports operator encoding in parameter names: field__operator=value\n *\n * @example\n * // URL: /api/tasks?status=active&date__gte=2025-01-01&tags__contains=urgent\n * const filters = parseQueryFilters(req.query);\n * // Returns:\n * // [\n * // { field: 'status', operator: '==', value: 'active' },\n * // { field: 'date', operator: '>=', value: '2025-01-01' },\n * // { field: 'tags', operator: 'array-contains', value: 'urgent' }\n * // ]\n *\n * @packageDocumentation\n */\n\n/**\n * Parsed filter ready for Firestore query\n */\nexport interface ParsedFilter {\n field: string;\n operator: FirestoreWhereFilterOp;\n value: unknown;\n}\n\n/**\n * Firestore where filter operators\n */\nexport type FirestoreWhereFilterOp =\n | '=='\n | '!='\n | '>'\n | '>='\n | '<'\n | '<='\n | 'array-contains'\n | 'array-contains-any'\n | 'in'\n | 'not-in';\n\n/**\n * Map of URL operator suffixes to Firestore operators\n */\nconst OPERATOR_MAP: Record<string, FirestoreWhereFilterOp> = {\n 'eq': '==',\n 'neq': '!=',\n 'gt': '>',\n 'gte': '>=',\n 'lt': '<',\n 'lte': '<=',\n 'contains': 'array-contains',\n 'contains_any': 'array-contains-any',\n 'in': 'in',\n 'not_in': 'not-in',\n // Date operators map to same comparison operators\n 'date_eq': '==',\n 'date_gte': '>=',\n 'date_lte': '<=',\n};\n\n/**\n * Reserved query parameters that should not be treated as filters\n */\nconst RESERVED_PARAMS = new Set([\n 'page',\n 'pageSize',\n 'limit',\n 'offset',\n 'search',\n 'q',\n 'sortBy',\n 'sortOrder',\n 'orderBy',\n 'orderDirection',\n]);\n\n/**\n * Parse query parameters into Firestore-compatible filters.\n *\n * Supports operator encoding: field__operator=value\n *\n * @param query - Express req.query object\n * @returns Array of parsed filters ready for Firestore .where() calls\n *\n * @example\n * ```typescript\n * // In Express route handler:\n * const filters = parseQueryFilters(req.query);\n *\n * let query = db.collection('tasks');\n * for (const filter of filters) {\n * query = query.where(filter.field, filter.operator, filter.value);\n * }\n * ```\n */\nexport function parseQueryFilters(\n query: Record<string, unknown>\n): ParsedFilter[] {\n const filters: ParsedFilter[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n // Skip reserved pagination/sort params\n if (RESERVED_PARAMS.has(key)) continue;\n\n // Skip empty values\n if (value === undefined || value === null || value === '') continue;\n\n // Parse operator from key: field__operator → { field, operator }\n const match = key.match(/^(.+)__(\\w+)$/);\n\n if (match) {\n const [, field, op] = match;\n const firestoreOp = OPERATOR_MAP[op];\n\n if (firestoreOp) {\n filters.push({\n field,\n operator: firestoreOp,\n value: parseValue(value, op),\n });\n } else {\n // Unknown operator - treat as field name with double underscore\n filters.push({\n field: key,\n operator: '==',\n value: parseValue(value, 'eq'),\n });\n }\n } else {\n // No operator suffix → equals\n filters.push({\n field: key,\n operator: '==',\n value: parseValue(value, 'eq'),\n });\n }\n }\n\n return filters;\n}\n\n/**\n * Parse and coerce value based on operator type\n */\nfunction parseValue(value: unknown, operator: string): unknown {\n // Handle array values for 'in' operator\n if (operator === 'in' || operator === 'not_in' || operator === 'contains_any') {\n if (typeof value === 'string') {\n // Parse comma-separated values: \"a,b,c\" → ['a', 'b', 'c']\n return value.split(',').map(v => v.trim());\n }\n if (Array.isArray(value)) {\n return value;\n }\n return [value];\n }\n\n // Handle numeric values\n if (typeof value === 'string') {\n // Try to parse as number if it looks like one\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) {\n const num = parseFloat(value);\n if (!isNaN(num)) {\n return num;\n }\n }\n\n // Handle boolean strings\n if (value === 'true') return true;\n if (value === 'false') return false;\n }\n\n return value;\n}\n\n/**\n * Build a Firestore query with filters applied.\n *\n * @param collection - Base Firestore collection reference or query\n * @param filters - Parsed filters from parseQueryFilters\n * @returns Query with all filters applied\n *\n * @example\n * ```typescript\n * const filters = parseQueryFilters(req.query);\n * const baseQuery = db.collection('tasks');\n * const filteredQuery = applyFiltersToQuery(baseQuery, filters);\n * const snapshot = await filteredQuery.get();\n * ```\n */\nexport function applyFiltersToQuery<T>(\n collection: FirebaseFirestore.Query<T>,\n filters: ParsedFilter[]\n): FirebaseFirestore.Query<T> {\n let query = collection;\n\n for (const filter of filters) {\n query = query.where(\n filter.field,\n filter.operator as FirebaseFirestore.WhereFilterOp,\n filter.value\n );\n }\n\n return query;\n}\n\n/**\n * Extract pagination parameters from query\n */\nexport interface PaginationParams {\n page: number;\n pageSize: number;\n sortBy?: string;\n sortOrder: 'asc' | 'desc';\n}\n\nexport function extractPaginationParams(\n query: Record<string, unknown>,\n defaults: Partial<PaginationParams> = {}\n): PaginationParams {\n return {\n page: parseInt(query.page as string, 10) || defaults.page || 1,\n pageSize: parseInt(query.pageSize as string, 10) || parseInt(query.limit as string, 10) || defaults.pageSize || 20,\n sortBy: (query.sortBy || query.orderBy) as string | undefined,\n sortOrder: ((query.sortOrder || query.orderDirection) as 'asc' | 'desc') || defaults.sortOrder || 'asc',\n };\n}\n","/**\n * DataService - Unified data access abstraction\n *\n * Provides a common interface for data operations that can be backed by\n * either MockDataService (for development) or Firebase (for production).\n *\n * @packageDocumentation\n */\n\nimport type { StoreContract, StoreFilter } from '@almadar/core';\nimport { db } from '../lib/db.js';\nimport { env } from '../lib/env.js';\nimport { logger } from '../lib/logger.js';\nimport { getMockDataService, type FieldSchema } from './MockDataService.js';\nimport {\n parseQueryFilters,\n applyFiltersToQuery,\n type ParsedFilter,\n} from '../utils/queryFilters.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface BaseEntity {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/**\n * Pagination options for list queries\n */\nexport interface PaginationOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Search term to filter results */\n search?: string;\n /** Fields to search in (defaults to all string fields) */\n searchFields?: string[];\n /** Sort field */\n sortBy?: string;\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Filters parsed from query params */\n filters?: ParsedFilter[];\n}\n\n/**\n * Paginated response structure\n */\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\nexport interface DataService {\n list<T>(collection: string): Promise<T[]>;\n listPaginated<T>(collection: string, options?: PaginationOptions): Promise<PaginatedResult<T>>;\n getById<T>(collection: string, id: string): Promise<T | null>;\n create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T>;\n update<T extends BaseEntity>(collection: string, id: string, data: Partial<T>): Promise<T | null>;\n delete(collection: string, id: string): Promise<boolean>;\n query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]>;\n /** Get a typed StoreContract<T> bound to a specific collection. */\n getStore<T extends BaseEntity>(collection: string): StoreContract<T>;\n}\n\n/**\n * Apply filter condition for in-memory filtering.\n * Used by MockDataServiceAdapter for all operators and\n * FirebaseDataService for operators not supported by Firestore.\n */\nfunction applyFilterCondition(value: unknown, operator: string, filterValue: unknown): boolean {\n if (value === null || value === undefined) {\n return operator === '!=' ? filterValue !== null : false;\n }\n\n switch (operator) {\n case '==':\n return value === filterValue;\n case '!=':\n return value !== filterValue;\n case '>':\n return (value as number) > (filterValue as number);\n case '>=':\n return (value as number) >= (filterValue as number);\n case '<':\n return (value as number) < (filterValue as number);\n case '<=':\n return (value as number) <= (filterValue as number);\n case 'array-contains':\n return Array.isArray(value) && value.includes(filterValue);\n case 'array-contains-any':\n return (\n Array.isArray(value) &&\n Array.isArray(filterValue) &&\n filterValue.some((v: unknown) => value.includes(v))\n );\n case 'in':\n return Array.isArray(filterValue) && filterValue.includes(value);\n case 'not-in':\n return Array.isArray(filterValue) && !filterValue.includes(value);\n default:\n return true;\n }\n}\n\n// ============================================================================\n// MockDataServiceAdapter\n// ============================================================================\n\n/**\n * Adapter that wraps MockDataService with async interface.\n */\nclass MockDataServiceAdapter implements DataService {\n async list<T>(collection: string): Promise<T[]> {\n return getMockDataService().list<T>(collection);\n }\n\n async listPaginated<T>(\n collection: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<T>> {\n const {\n page = 1,\n pageSize = 20,\n search,\n searchFields,\n sortBy,\n sortOrder = 'asc',\n filters,\n } = options;\n\n let items = getMockDataService().list<T>(collection);\n\n // Apply field filters (server-side filtering)\n if (filters && filters.length > 0) {\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n return filters.every((filter) => {\n const value = record[filter.field];\n return applyFilterCondition(value, filter.operator, filter.value);\n });\n });\n }\n\n // Apply search filter\n if (search && search.trim()) {\n const searchLower = search.toLowerCase();\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n const fieldsToSearch = searchFields || Object.keys(record);\n return fieldsToSearch.some((field) => {\n const value = record[field];\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n });\n });\n }\n\n // Apply sorting\n if (sortBy) {\n items = [...items].sort((a, b) => {\n const aVal = (a as Record<string, unknown>)[sortBy];\n const bVal = (b as Record<string, unknown>)[sortBy];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n const total = items.length;\n const totalPages = Math.ceil(total / pageSize);\n const startIndex = (page - 1) * pageSize;\n const data = items.slice(startIndex, startIndex + pageSize);\n\n return { data, total, page, pageSize, totalPages };\n }\n\n async getById<T>(collection: string, id: string): Promise<T | null> {\n return getMockDataService().getById<T>(collection, id);\n }\n\n async create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T> {\n return getMockDataService().create<T>(collection, data);\n }\n\n async update<T extends BaseEntity>(\n collection: string,\n id: string,\n data: Partial<T>\n ): Promise<T | null> {\n return getMockDataService().update<T>(collection, id, data);\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n return getMockDataService().delete(collection, id);\n }\n\n async query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]> {\n let items = getMockDataService().list<T>(collection);\n for (const filter of filters) {\n items = items.filter((item) => {\n const value = (item as Record<string, unknown>)[filter.field];\n return applyFilterCondition(value, filter.op, filter.value);\n });\n }\n return items;\n }\n\n getStore<T extends BaseEntity>(collection: string): StoreContract<T> {\n const adapter = this;\n return {\n async getById(id: string): Promise<T | null> {\n return adapter.getById<T>(collection, id);\n },\n async create(data: Omit<T, 'id'>): Promise<T> {\n return adapter.create<T>(collection, data as Partial<T>);\n },\n async update(id: string, data: Partial<T>): Promise<T> {\n const result = await adapter.update<T>(collection, id, data);\n if (!result) throw new Error(`Entity ${id} not found in ${collection}`);\n return result;\n },\n async delete(id: string): Promise<void> {\n adapter.delete(collection, id);\n },\n async query(filters: StoreFilter<T>[]): Promise<T[]> {\n return adapter.query<T>(collection, filters);\n },\n };\n }\n}\n\n// ============================================================================\n// FirebaseDataService\n// ============================================================================\n\n/**\n * Firebase/Firestore implementation of DataService.\n */\nclass FirebaseDataService implements DataService {\n async list<T>(collection: string): Promise<T[]> {\n const snapshot = await db.collection(collection).get();\n return snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n }\n\n async listPaginated<T>(\n collection: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<T>> {\n const {\n page = 1,\n pageSize = 20,\n search,\n searchFields,\n sortBy,\n sortOrder = 'asc',\n filters,\n } = options;\n\n // For Firebase, we apply filters using Firestore's .where() for supported operators\n // Note: For large datasets, consider using Algolia or Elasticsearch for search\n let query: FirebaseFirestore.Query = db.collection(collection);\n\n // Apply field filters using Firestore's where() clauses\n if (filters && filters.length > 0) {\n query = applyFiltersToQuery(query, filters);\n }\n\n // Apply sorting if no search (Firestore can sort natively)\n if (sortBy && !search) {\n query = query.orderBy(sortBy, sortOrder);\n }\n\n const snapshot = await query.get();\n let items = snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n\n // Apply search filter (in-memory for Firebase)\n if (search && search.trim()) {\n const searchLower = search.toLowerCase();\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n const fieldsToSearch = searchFields || Object.keys(record);\n return fieldsToSearch.some((field) => {\n const value = record[field];\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n });\n });\n }\n\n // Apply sorting (in-memory if search was applied)\n if (sortBy && search) {\n items = [...items].sort((a, b) => {\n const aVal = (a as Record<string, unknown>)[sortBy];\n const bVal = (b as Record<string, unknown>)[sortBy];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n const total = items.length;\n const totalPages = Math.ceil(total / pageSize);\n const startIndex = (page - 1) * pageSize;\n const data = items.slice(startIndex, startIndex + pageSize);\n\n return { data, total, page, pageSize, totalPages };\n }\n\n async getById<T>(collection: string, id: string): Promise<T | null> {\n const doc = await db.collection(collection).doc(id).get();\n if (!doc.exists) {\n return null;\n }\n return { id: doc.id, ...doc.data() } as T;\n }\n\n async create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T> {\n const now = new Date();\n const docRef = await db.collection(collection).add({\n ...data,\n createdAt: now,\n updatedAt: now,\n });\n\n return {\n ...data,\n id: docRef.id,\n createdAt: now,\n updatedAt: now,\n } as T;\n }\n\n async update<T extends BaseEntity>(\n collection: string,\n id: string,\n data: Partial<T>\n ): Promise<T | null> {\n const docRef = db.collection(collection).doc(id);\n const doc = await docRef.get();\n\n if (!doc.exists) {\n return null;\n }\n\n const now = new Date();\n await docRef.update({\n ...data,\n updatedAt: now,\n });\n\n return {\n ...doc.data(),\n ...data,\n id,\n updatedAt: now,\n } as T;\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n const docRef = db.collection(collection).doc(id);\n const doc = await docRef.get();\n\n if (!doc.exists) {\n return false;\n }\n\n await docRef.delete();\n return true;\n }\n\n async query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]> {\n let query: FirebaseFirestore.Query = db.collection(collection);\n\n // Apply filters that Firestore supports natively\n const memoryFilters: StoreFilter<T>[] = [];\n for (const filter of filters) {\n if (['==', '!=', '<', '<=', '>', '>=', 'in', 'not-in'].includes(filter.op)) {\n query = query.where(filter.field, filter.op as FirebaseFirestore.WhereFilterOp, filter.value);\n } else {\n memoryFilters.push(filter);\n }\n }\n\n const snapshot = await query.get();\n let items = snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n\n // Apply remaining filters in memory (e.g., 'contains')\n for (const filter of memoryFilters) {\n items = items.filter((item) => {\n const value = (item as Record<string, unknown>)[filter.field];\n return applyFilterCondition(value, filter.op, filter.value);\n });\n }\n\n return items;\n }\n\n getStore<T extends BaseEntity>(collection: string): StoreContract<T> {\n const svc = this;\n return {\n async getById(id: string): Promise<T | null> {\n return svc.getById<T>(collection, id);\n },\n async create(data: Omit<T, 'id'>): Promise<T> {\n return svc.create<T>(collection, data as Partial<T>);\n },\n async update(id: string, data: Partial<T>): Promise<T> {\n const result = await svc.update<T>(collection, id, data);\n if (!result) throw new Error(`Entity ${id} not found in ${collection}`);\n return result;\n },\n async delete(id: string): Promise<void> {\n await svc.delete(collection, id);\n },\n async query(filters: StoreFilter<T>[]): Promise<T[]> {\n return svc.query<T>(collection, filters);\n },\n };\n }\n}\n\n// ============================================================================\n// Factory & Export\n// ============================================================================\n\n/**\n * Create the appropriate data service based on environment configuration.\n */\nfunction createDataService(): DataService {\n if (env.USE_MOCK_DATA) {\n logger.info('[DataService] Using MockDataService');\n return new MockDataServiceAdapter();\n }\n logger.info('[DataService] Using FirebaseDataService');\n return new FirebaseDataService();\n}\n\n/**\n * Lazy singleton data service instance.\n */\nlet _dataService: DataService | null = null;\n\nexport function getDataService(): DataService {\n if (!_dataService) {\n _dataService = createDataService();\n }\n return _dataService;\n}\n\nexport function resetDataService(): void {\n _dataService = null;\n}\n\n// ============================================================================\n// Seeding Helper\n// ============================================================================\n\nexport interface EntitySeedConfig {\n name: string;\n fields: FieldSchema[];\n seedCount: number;\n}\n\n/**\n * Seed mock data for multiple entities.\n * Only works when USE_MOCK_DATA is enabled.\n */\nexport function seedMockData(entities: EntitySeedConfig[]): void {\n if (!env.USE_MOCK_DATA) {\n logger.info('[DataService] Mock mode disabled, skipping seed');\n return;\n }\n\n logger.info('[DataService] Seeding mock data...');\n\n for (const entity of entities) {\n getMockDataService().seed(entity.name, entity.fields, entity.seedCount);\n }\n\n logger.info('[DataService] Mock data seeding complete');\n}\n","/**\n * Debug Events Router\n *\n * Provides diagnostic endpoints for inspecting the server EventBus.\n * Only active when NODE_ENV=development.\n *\n * Endpoints:\n * GET /event-log - Recent emitted events with listener counts\n * DELETE /event-log - Clear the event log\n * GET /listeners - Registered listener counts per event\n * POST /seed - Seed MockDataService with entity data\n *\n * @packageDocumentation\n */\n\nimport { Router } from 'express';\nimport { getServerEventBus } from './eventBus.js';\nimport { seedMockData, type EntitySeedConfig } from '../services/DataService.js';\nimport type { FieldSchema } from '../services/MockDataService.js';\n\n/**\n * Creates an Express router with debug endpoints for the server EventBus.\n * Returns a no-op router in production (no routes registered).\n */\nexport function debugEventsRouter(): Router {\n const router = Router();\n\n if (process.env.NODE_ENV !== 'development') {\n return router;\n }\n\n router.get('/event-log', (_req, res) => {\n const limit = parseInt(String(_req.query.limit) || '50', 10);\n const events = getServerEventBus().getRecentEvents(limit);\n res.json({ count: events.length, events });\n });\n\n router.delete('/event-log', (_req, res) => {\n getServerEventBus().clearEventLog();\n res.json({ cleared: true });\n });\n\n router.get('/listeners', (_req, res) => {\n const counts = getServerEventBus().getListenerCounts();\n const total = Object.values(counts).reduce((sum, n) => sum + n, 0);\n res.json({ total, events: counts });\n });\n\n /**\n * POST /seed - Seed MockDataService with entity data from schema.\n *\n * Body: { entities: Array<{ name: string, fields: FieldSchema[], seedCount?: number }> }\n *\n * Used by the orbital-state-viewer to populate mock data on connect.\n */\n router.post('/seed', (req, res) => {\n const { entities } = req.body as {\n entities?: Array<{ name: string; fields: FieldSchema[]; seedCount?: number }>;\n };\n\n if (!entities || !Array.isArray(entities)) {\n res.status(400).json({ error: 'Body must have \"entities\" array' });\n return;\n }\n\n const configs: EntitySeedConfig[] = entities.map((e) => ({\n name: e.name,\n fields: e.fields,\n seedCount: e.seedCount ?? 5,\n }));\n\n seedMockData(configs);\n\n const summary = configs.map((c) => `${c.name}(${c.seedCount})`).join(', ');\n res.json({ seeded: true, summary });\n });\n\n return router;\n}\n","/**\n * WebSocket Event Broadcast - Cross-client event synchronization\n *\n * Broadcasts server-side events to all connected clients via WebSocket.\n * This enables real-time updates across multiple browser clients.\n *\n * @packageDocumentation\n */\n\nimport { WebSocketServer, WebSocket, type RawData } from 'ws';\nimport type { Server, IncomingMessage } from 'http';\nimport { getServerEventBus } from './eventBus.js';\nimport { logger } from './logger.js';\n\n/**\n * Event structure for broadcasting\n */\ninterface BroadcastEvent {\n type: string;\n payload?: unknown;\n timestamp?: number;\n source?: Record<string, unknown>;\n}\n\n/**\n * WebSocket server instance (singleton)\n */\nlet wss: WebSocketServer | null = null;\n\n/**\n * Setup WebSocket server for event broadcasting.\n *\n * Listens to all server events via wildcard and broadcasts to connected clients.\n *\n * @param server - HTTP server to attach WebSocket to\n * @param path - WebSocket endpoint path (default: '/ws/events')\n *\n * @example\n * ```typescript\n * import { createServer } from 'http';\n * import { setupEventBroadcast } from '@/lib/websocket';\n *\n * const server = createServer(app);\n * setupEventBroadcast(server);\n * ```\n */\nexport function setupEventBroadcast(server: Server, path: string = '/ws/events'): WebSocketServer {\n if (wss) {\n logger.warn('[WebSocket] Server already initialized');\n return wss;\n }\n\n wss = new WebSocketServer({ server, path });\n\n logger.info(`[WebSocket] Server listening at ${path}`);\n\n // Handle new connections\n wss.on('connection', (ws: WebSocket, req: IncomingMessage) => {\n const clientId = req.headers['sec-websocket-key'] || 'unknown';\n logger.debug(`[WebSocket] Client connected: ${clientId}`);\n\n // Send welcome message\n ws.send(\n JSON.stringify({\n type: 'CONNECTED',\n timestamp: Date.now(),\n message: 'Connected to event stream',\n })\n );\n\n // Handle client messages (for future bidirectional communication)\n ws.on('message', (data: RawData) => {\n try {\n const message = JSON.parse(data.toString());\n logger.debug(`[WebSocket] Received from ${clientId}:`, message);\n\n // Handle client-to-server events if needed\n if (message.type && message.payload) {\n // Emit to server event bus with client source\n getServerEventBus().emit(message.type, message.payload, {\n orbital: 'client',\n entity: clientId,\n });\n }\n } catch (error) {\n logger.error(`[WebSocket] Failed to parse message:`, error);\n }\n });\n\n ws.on('close', () => {\n logger.debug(`[WebSocket] Client disconnected: ${clientId}`);\n });\n\n ws.on('error', (error: Error) => {\n logger.error(`[WebSocket] Client error:`, error);\n });\n });\n\n // Subscribe to all server events and broadcast to clients\n getServerEventBus().on('*', (event: unknown) => {\n if (!wss) return;\n\n const typedEvent = event as BroadcastEvent;\n const message = JSON.stringify({\n type: typedEvent.type,\n payload: typedEvent.payload,\n timestamp: typedEvent.timestamp,\n source: typedEvent.source,\n });\n\n let broadcastCount = 0;\n wss.clients.forEach((client: WebSocket) => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n broadcastCount++;\n }\n });\n\n if (broadcastCount > 0) {\n logger.debug(`[WebSocket] Broadcast ${typedEvent.type} to ${broadcastCount} client(s)`);\n }\n });\n\n return wss;\n}\n\n/**\n * Get the WebSocket server instance (for testing or advanced usage)\n */\nexport function getWebSocketServer(): WebSocketServer | null {\n return wss;\n}\n\n/**\n * Close the WebSocket server\n */\nexport function closeWebSocketServer(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!wss) {\n resolve();\n return;\n }\n\n wss.close((err?: Error) => {\n if (err) {\n reject(err);\n } else {\n wss = null;\n resolve();\n }\n });\n });\n}\n\n/**\n * Get connected client count\n */\nexport function getConnectedClientCount(): number {\n if (!wss) return 0;\n return wss.clients.size;\n}\n","import { Request, Response, NextFunction } from 'express';\nimport { ZodError } from 'zod';\nimport { logger } from '../lib/logger.js';\n\n/**\n * Base application error class\n */\nexport class AppError extends Error {\n constructor(\n public statusCode: number,\n public message: string,\n public code?: string\n ) {\n super(message);\n this.name = 'AppError';\n }\n}\n\n/**\n * 404 Not Found error\n */\nexport class NotFoundError extends AppError {\n constructor(message: string = 'Resource not found') {\n super(404, message, 'NOT_FOUND');\n }\n}\n\n/**\n * 400 Bad Request / Validation error\n */\nexport class ValidationError extends AppError {\n constructor(message: string = 'Validation failed') {\n super(400, message, 'VALIDATION_ERROR');\n }\n}\n\n/**\n * 401 Unauthorized error\n */\nexport class UnauthorizedError extends AppError {\n constructor(message: string = 'Unauthorized') {\n super(401, message, 'UNAUTHORIZED');\n }\n}\n\n/**\n * 403 Forbidden error\n */\nexport class ForbiddenError extends AppError {\n constructor(message: string = 'Forbidden') {\n super(403, message, 'FORBIDDEN');\n }\n}\n\n/**\n * 409 Conflict error\n */\nexport class ConflictError extends AppError {\n constructor(message: string = 'Resource conflict') {\n super(409, message, 'CONFLICT');\n }\n}\n\n/**\n * Global error handler middleware\n */\nexport const errorHandler = (\n err: Error,\n _req: Request,\n res: Response,\n _next: NextFunction\n): void => {\n logger.error('Error:', { name: err.name, message: err.message, stack: err.stack });\n\n // Zod validation errors\n if (err instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: err.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n\n // Custom application errors\n if (err instanceof AppError) {\n res.status(err.statusCode).json({\n success: false,\n error: err.message,\n code: err.code,\n });\n return;\n }\n\n // Firebase/Firestore errors\n if (err.name === 'FirebaseError' || err.name === 'FirestoreError') {\n res.status(500).json({\n success: false,\n error: 'Database error',\n code: 'DATABASE_ERROR',\n });\n return;\n }\n\n // Unknown errors\n res.status(500).json({\n success: false,\n error: 'Internal server error',\n code: 'INTERNAL_ERROR',\n });\n};\n\n/**\n * Async handler wrapper to catch errors in async route handlers\n */\nexport const asyncHandler =\n (fn: (req: Request, res: Response, next: NextFunction) => Promise<unknown>) =>\n (req: Request, res: Response, next: NextFunction) => {\n Promise.resolve(fn(req, res, next)).catch(next);\n };\n\n/**\n * 404 handler for unmatched routes\n */\nexport const notFoundHandler = (req: Request, res: Response): void => {\n res.status(404).json({\n success: false,\n error: `Route ${req.method} ${req.path} not found`,\n code: 'ROUTE_NOT_FOUND',\n });\n};\n","import { Request, Response, NextFunction } from 'express';\nimport { AnyZodObject, ZodError } from 'zod';\n\n/**\n * Middleware to validate request body against a Zod schema\n */\nexport const validateBody =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.body = await schema.parseAsync(req.body);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n\n/**\n * Middleware to validate request query parameters against a Zod schema\n */\nexport const validateQuery =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.query = await schema.parseAsync(req.query);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Invalid query parameters',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n\n/**\n * Middleware to validate request params against a Zod schema\n */\nexport const validateParams =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.params = await schema.parseAsync(req.params);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Invalid path parameters',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n","import { NextFunction, Request, Response } from 'express';\nimport type { DecodedIdToken } from 'firebase-admin/auth';\nimport { getAuth } from '../lib/db.js';\nimport { env } from '../lib/env.js';\n\nconst BEARER_PREFIX = 'Bearer ';\n\n/** Fake dev user injected when NODE_ENV=development and no auth header is present */\nconst DEV_USER: DecodedIdToken = {\n uid: 'dev-user-001',\n email: 'dev@localhost',\n email_verified: true,\n aud: 'dev-project',\n auth_time: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n iat: Math.floor(Date.now() / 1000),\n iss: 'https://securetoken.google.com/dev-project',\n sub: 'dev-user-001',\n firebase: {\n identities: {},\n sign_in_provider: 'custom',\n },\n};\n\nexport async function authenticateFirebase(req: Request, res: Response, next: NextFunction) {\n const authorization = req.headers.authorization;\n\n // Dev bypass: in development mode, skip auth if no token is provided\n if (env.NODE_ENV === 'development' && (!authorization || !authorization.startsWith(BEARER_PREFIX))) {\n req.firebaseUser = DEV_USER;\n res.locals.firebaseUser = DEV_USER;\n return next();\n }\n\n try {\n if (!authorization || !authorization.startsWith(BEARER_PREFIX)) {\n return res.status(401).json({ error: 'Authorization header missing or malformed' });\n }\n\n const token = authorization.slice(BEARER_PREFIX.length);\n const decodedToken = await getAuth().verifyIdToken(token);\n\n req.firebaseUser = decodedToken;\n res.locals.firebaseUser = decodedToken;\n\n return next();\n } catch (error) {\n console.error('Firebase authentication failed:', error);\n return res.status(401).json({ error: 'Unauthorized' });\n }\n}\n\nexport default authenticateFirebase;\n\n\n","/**\n * Firestore Serialization Utilities\n *\n * Handles the Firestore 20-level depth limit by serializing deeply nested\n * OrbitalSchema fields (orbitals, traits, services) to JSON strings.\n */\n\nimport type { OrbitalSchema } from '@almadar/core';\n\n/**\n * Convert OrbitalSchema to Firestore-safe format.\n *\n * Serializes orbitals, traits, and services to JSON strings to avoid\n * Firestore's 20-level nesting limit.\n */\nexport function toFirestoreFormat(schema: OrbitalSchema): Record<string, unknown> {\n const data = { ...(schema as unknown as Record<string, unknown>) };\n\n // Serialize orbitals array to JSON string\n if (schema.orbitals) {\n data._orbitalsJson = JSON.stringify(schema.orbitals);\n data.orbitalCount = schema.orbitals.length;\n delete data.orbitals;\n }\n\n // Serialize traits array to JSON string (if present at schema level)\n if (data.traits) {\n const traits = data.traits as unknown[];\n data._traitsJson = JSON.stringify(traits);\n data.traitCount = traits.length;\n delete data.traits;\n }\n\n // Serialize services array to JSON string\n if (schema.services) {\n data._servicesJson = JSON.stringify(schema.services);\n data.serviceCount = schema.services.length;\n delete data.services;\n }\n\n return data;\n}\n\n/**\n * Convert Firestore document back to OrbitalSchema.\n *\n * Deserializes JSON strings back to arrays.\n */\nexport function fromFirestoreFormat(data: Record<string, unknown>): OrbitalSchema {\n const result = { ...data };\n\n // Restore orbitals from _orbitalsJson\n if (result._orbitalsJson && typeof result._orbitalsJson === 'string') {\n try {\n result.orbitals = JSON.parse(result._orbitalsJson);\n delete result._orbitalsJson;\n delete result.orbitalCount;\n } catch (e) {\n console.warn('[OrbitalStore] Failed to parse _orbitalsJson:', e);\n result.orbitals = [];\n }\n }\n\n // Restore traits from _traitsJson\n if (result._traitsJson && typeof result._traitsJson === 'string') {\n try {\n result.traits = JSON.parse(result._traitsJson);\n delete result._traitsJson;\n delete result.traitCount;\n } catch (e) {\n console.warn('[OrbitalStore] Failed to parse _traitsJson:', e);\n }\n }\n\n // Restore services from _servicesJson\n if (result._servicesJson && typeof result._servicesJson === 'string') {\n try {\n result.services = JSON.parse(result._servicesJson);\n delete result._servicesJson;\n delete result.serviceCount;\n } catch (e) {\n console.warn('[OrbitalStore] Failed to parse _servicesJson:', e);\n }\n }\n\n return result as unknown as OrbitalSchema;\n}\n","/**\n * SchemaProtectionService - Detects destructive schema changes\n *\n * Uses real diff functions from @almadar/core to detect and categorize\n * removals, page content reductions, and other destructive changes.\n */\n\nimport type { OrbitalSchema, CategorizedRemovals, PageContentReduction } from '@almadar/core';\nimport {\n diffSchemas,\n isDestructiveChange,\n categorizeRemovals,\n requiresConfirmation,\n detectPageContentReduction,\n hasSignificantPageReduction,\n} from '@almadar/core';\n\nexport class SchemaProtectionService {\n /**\n * Compare two schemas and detect destructive changes.\n *\n * Returns categorized removals including page content reductions.\n */\n compareSchemas(\n before: OrbitalSchema,\n after: OrbitalSchema,\n ): {\n isDestructive: boolean;\n removals: CategorizedRemovals;\n } {\n const changeSet = diffSchemas(before, after);\n const removals = categorizeRemovals(changeSet);\n\n // Detect page content reductions (implicit removals)\n const beforePages = before.orbitals?.flatMap((o) => o.pages || []) || [];\n const afterPages = after.orbitals?.flatMap((o) => o.pages || []) || [];\n const pageContentReductions = detectPageContentReduction(beforePages, afterPages);\n removals.pageContentReductions = pageContentReductions;\n\n const isDestructive =\n isDestructiveChange(changeSet) ||\n hasSignificantPageReduction(pageContentReductions);\n\n return { isDestructive, removals };\n }\n\n /** Check if critical removals require confirmation */\n requiresConfirmation(removals: CategorizedRemovals): boolean {\n return requiresConfirmation(removals);\n }\n\n /** Check for significant page content reductions */\n hasSignificantContentReduction(reductions: PageContentReduction[]): boolean {\n return hasSignificantPageReduction(reductions);\n }\n}\n","/**\n * SchemaStore - Firestore CRUD for OrbitalSchema documents\n *\n * Handles schema get/save/create/delete/list with caching\n * and Firestore serialization.\n */\n\nimport type { OrbitalSchema, StatsView, AppSummary, SaveOptions, SaveResult } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\nimport { toFirestoreFormat, fromFirestoreFormat } from './firestoreFormat.js';\nimport { SchemaProtectionService } from './SchemaProtectionService.js';\nimport type { SnapshotStore } from './SnapshotStore.js';\n\nconst SCHEMA_CACHE_TTL_MS = 60_000;\nconst LIST_CACHE_TTL_MS = 30_000;\n\nexport class SchemaStore {\n private appsCollection: string;\n private schemaCache = new Map<string, { schema: OrbitalSchema; timestamp: number }>();\n private listCache = new Map<string, { apps: AppSummary[]; timestamp: number }>();\n private protectionService = new SchemaProtectionService();\n private snapshotStore: SnapshotStore | null = null;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n /** Set snapshot store for auto-snapshot on destructive saves */\n setSnapshotStore(store: SnapshotStore): void {\n this.snapshotStore = store;\n }\n\n /** Get a schema by app ID */\n async get(uid: string, appId: string): Promise<OrbitalSchema | null> {\n const cacheKey = `${uid}:${appId}`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < SCHEMA_CACHE_TTL_MS) {\n return cached.schema;\n }\n\n try {\n const db = getFirestore();\n const appDoc = await db.doc(`users/${uid}/${this.appsCollection}/${appId}`).get();\n\n if (!appDoc.exists) return null;\n\n const data = appDoc.data() as Record<string, unknown>;\n const hasOrbitals = data.orbitals || data._orbitalsJson;\n if (!data.name || !hasOrbitals) return null;\n\n const schema = fromFirestoreFormat(data);\n this.schemaCache.set(cacheKey, { schema, timestamp: Date.now() });\n return schema;\n } catch (error) {\n console.error('[SchemaStore] Error fetching schema:', error);\n return null;\n }\n }\n\n /**\n * Save a schema (create or full replace).\n *\n * Features:\n * - Detects destructive changes (removals)\n * - Requires confirmation for critical removals\n * - Auto-creates snapshots before destructive changes (if SnapshotStore attached)\n */\n async save(\n uid: string,\n appId: string,\n schema: OrbitalSchema,\n options: SaveOptions = {},\n ): Promise<SaveResult> {\n try {\n const existingSchema = await this.get(uid, appId);\n let snapshotId: string | undefined;\n\n // Create snapshot if snapshotReason provided\n if (existingSchema && options.snapshotReason && this.snapshotStore) {\n snapshotId = await this.snapshotStore.create(uid, appId, existingSchema, options.snapshotReason);\n }\n\n // Check for destructive changes (unless skipProtection)\n if (existingSchema && !options.skipProtection) {\n const comparison = this.protectionService.compareSchemas(existingSchema, schema);\n\n if (comparison.isDestructive) {\n const { removals } = comparison;\n const hasCriticalRemovals = this.protectionService.requiresConfirmation(removals);\n const hasContentReductions = this.protectionService.hasSignificantContentReduction(\n removals.pageContentReductions,\n );\n\n if ((hasCriticalRemovals || hasContentReductions) && !options.confirmRemovals) {\n return {\n success: false,\n requiresConfirmation: true,\n removals: comparison.removals,\n error: hasContentReductions\n ? 'Page content reduction detected - confirmation required'\n : 'Confirmation required for critical removals',\n };\n }\n\n // Auto-snapshot before destructive change\n if (\n !snapshotId &&\n this.snapshotStore &&\n (removals.critical.length > 0 || removals.pageContentReductions.length > 0)\n ) {\n snapshotId = await this.snapshotStore.create(\n uid,\n appId,\n existingSchema,\n `auto_before_removal_${Date.now()}`,\n );\n }\n }\n }\n\n const firestoreData = toFirestoreFormat(schema);\n const now = Date.now();\n const docData = {\n ...firestoreData,\n _metadata: {\n version: options.expectedVersion ? options.expectedVersion + 1 : 1,\n updatedAt: now,\n createdAt: existingSchema ? undefined : now,\n source: options.source || 'manual',\n },\n };\n\n const db = getFirestore();\n await db.doc(`users/${uid}/${this.appsCollection}/${appId}`).set(docData, { merge: true });\n\n this.invalidateCache(uid, appId);\n return { success: true, snapshotId };\n } catch (error) {\n console.error('[SchemaStore] Error saving schema:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /** Create a new app with initial schema */\n async create(\n uid: string,\n metadata: { name: string; description?: string },\n ): Promise<{ appId: string; schema: OrbitalSchema }> {\n const appId = `app-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const now = Date.now();\n\n const schema: OrbitalSchema = {\n name: metadata.name,\n description: metadata.description,\n orbitals: [],\n };\n\n const firestoreData = toFirestoreFormat(schema);\n const docData = {\n ...firestoreData,\n _metadata: { version: 1, createdAt: now, updatedAt: now, source: 'manual' as const },\n };\n\n const db = getFirestore();\n await db.doc(`users/${uid}/${this.appsCollection}/${appId}`).set(docData);\n this.listCache.delete(uid);\n\n return { appId, schema };\n }\n\n /** Delete an app */\n async delete(uid: string, appId: string): Promise<boolean> {\n try {\n const db = getFirestore();\n const ref = db.doc(`users/${uid}/${this.appsCollection}/${appId}`);\n const doc = await ref.get();\n if (!doc.exists) return false;\n\n await ref.delete();\n this.invalidateCache(uid, appId);\n return true;\n } catch (error) {\n console.error('[SchemaStore] Error deleting app:', error);\n return false;\n }\n }\n\n /** List all apps for a user */\n async list(uid: string): Promise<AppSummary[]> {\n const cached = this.listCache.get(uid);\n if (cached && Date.now() - cached.timestamp < LIST_CACHE_TTL_MS) {\n return cached.apps;\n }\n\n try {\n const db = getFirestore();\n const snapshot = await db\n .collection(`users/${uid}/${this.appsCollection}`)\n .select('name', 'description', 'domainContext', '_metadata', 'orbitalCount', 'traitCount')\n .orderBy('_metadata.updatedAt', 'desc')\n .get();\n\n const apps: AppSummary[] = snapshot.docs.map((doc) => {\n const data = doc.data();\n const metadata = data._metadata as { version?: number; createdAt?: number; updatedAt?: number } | undefined;\n const orbitalCount = data.orbitalCount as number | undefined;\n\n return {\n id: doc.id,\n name: (data.name as string) || 'Untitled',\n description: data.description as string | undefined,\n updatedAt: metadata?.updatedAt || Date.now(),\n createdAt: metadata?.createdAt || Date.now(),\n stats: { entities: orbitalCount ?? 0, pages: 0, states: 0, events: 0, transitions: 0 },\n domainContext: data.domainContext as string | undefined,\n hasValidationErrors: false,\n };\n });\n\n this.listCache.set(uid, { apps, timestamp: Date.now() });\n return apps;\n } catch (error) {\n console.error('[SchemaStore] Error listing apps:', error);\n return [];\n }\n }\n\n /** Compute stats from OrbitalSchema */\n computeStats(schema: OrbitalSchema): StatsView {\n const orbitals = schema.orbitals || [];\n const entities = orbitals.length;\n const pages = orbitals.reduce((n, o) => n + (o.pages?.length || 0), 0);\n\n const allTraits = [\n ...((schema as unknown as Record<string, unknown>).traits as unknown[] || []),\n ...orbitals.flatMap((o) =>\n (o.traits || []).filter((t) => typeof t !== 'string' && 'stateMachine' in t),\n ),\n ] as Array<{ stateMachine?: { states?: unknown[]; events?: unknown[]; transitions?: unknown[] } }>;\n\n return {\n states: allTraits.flatMap((t) => t.stateMachine?.states || []).length,\n events: allTraits.flatMap((t) => t.stateMachine?.events || []).length,\n pages,\n entities,\n transitions: allTraits.flatMap((t) => t.stateMachine?.transitions || []).length,\n };\n }\n\n /** Invalidate caches for a specific app */\n invalidateCache(uid: string, appId: string): void {\n this.schemaCache.delete(`${uid}:${appId}`);\n this.listCache.delete(uid);\n }\n\n /** Clear all caches */\n clearCaches(): void {\n this.schemaCache.clear();\n this.listCache.clear();\n }\n\n /** Get the collection path for an app */\n getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Expose apps collection name for subcollection stores */\n getAppsCollection(): string {\n return this.appsCollection;\n }\n}\n","/**\n * SnapshotStore - Firestore CRUD for schema snapshots\n *\n * Snapshots are full copies of the schema at a point in time,\n * stored in subcollection: users/{uid}/apps/{appId}/snapshots/{snapshotId}\n */\n\nimport type { OrbitalSchema, SnapshotDocument, HistoryMeta } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\nimport { toFirestoreFormat, fromFirestoreFormat } from './firestoreFormat.js';\n\nconst SNAPSHOTS_COLLECTION = 'snapshots';\n\nexport class SnapshotStore {\n private appsCollection: string;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n private getCollectionPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}/${SNAPSHOTS_COLLECTION}`;\n }\n\n private getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Create a snapshot of the current schema */\n async create(\n uid: string,\n appId: string,\n schema: OrbitalSchema,\n reason: string,\n ): Promise<string> {\n const db = getFirestore();\n const snapshotId = `snapshot_${Date.now()}`;\n\n const snapshotDoc: SnapshotDocument = {\n id: snapshotId,\n timestamp: Date.now(),\n schema: toFirestoreFormat(schema),\n reason,\n };\n\n await db.doc(`${this.getCollectionPath(uid, appId)}/${snapshotId}`).set(snapshotDoc);\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n const updatedMeta: HistoryMeta = {\n latestSnapshotId: snapshotId,\n latestChangeSetId: currentMeta?.latestChangeSetId,\n snapshotCount: (currentMeta?.snapshotCount || 0) + 1,\n changeSetCount: currentMeta?.changeSetCount || 0,\n };\n\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n return snapshotId;\n }\n\n /** Get all snapshots for an app (ordered by timestamp desc) */\n async getAll(uid: string, appId: string): Promise<SnapshotDocument[]> {\n const db = getFirestore();\n const query = await db\n .collection(this.getCollectionPath(uid, appId))\n .orderBy('timestamp', 'desc')\n .get();\n\n return query.docs.map((doc) => doc.data() as SnapshotDocument);\n }\n\n /** Get a specific snapshot by ID */\n async get(uid: string, appId: string, snapshotId: string): Promise<SnapshotDocument | null> {\n const db = getFirestore();\n const doc = await db.doc(`${this.getCollectionPath(uid, appId)}/${snapshotId}`).get();\n if (!doc.exists) return null;\n return doc.data() as SnapshotDocument;\n }\n\n /** Delete a snapshot */\n async delete(uid: string, appId: string, snapshotId: string): Promise<boolean> {\n const db = getFirestore();\n const ref = db.doc(`${this.getCollectionPath(uid, appId)}/${snapshotId}`);\n const doc = await ref.get();\n if (!doc.exists) return false;\n\n await ref.delete();\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n if (currentMeta) {\n const updatedMeta: HistoryMeta = {\n ...currentMeta,\n snapshotCount: Math.max(0, (currentMeta.snapshotCount || 1) - 1),\n latestSnapshotId:\n currentMeta.latestSnapshotId === snapshotId ? undefined : currentMeta.latestSnapshotId,\n };\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n }\n\n return true;\n }\n\n /** Get schema snapshot at a specific version */\n async getByVersion(uid: string, appId: string, version: number): Promise<OrbitalSchema | null> {\n const db = getFirestore();\n const query = await db\n .collection(this.getCollectionPath(uid, appId))\n .where('version', '==', version)\n .limit(1)\n .get();\n\n if (query.empty) return null;\n const snapshot = query.docs[0].data() as SnapshotDocument;\n return fromFirestoreFormat(snapshot.schema as Record<string, unknown>);\n }\n\n /** Get the schema from a snapshot (deserialized) */\n getSchemaFromSnapshot(snapshot: SnapshotDocument): OrbitalSchema {\n return fromFirestoreFormat(snapshot.schema as Record<string, unknown>);\n }\n}\n","/**\n * ChangeSetStore - Firestore CRUD for schema changesets\n *\n * Changesets track changes made to the schema over time,\n * stored in subcollection: users/{uid}/apps/{appId}/changesets/{changeSetId}\n */\n\nimport type { ChangeSetDocument, HistoryMeta } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\n\nconst CHANGESETS_COLLECTION = 'changesets';\n\nexport class ChangeSetStore {\n private appsCollection: string;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n private getCollectionPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}/${CHANGESETS_COLLECTION}`;\n }\n\n private getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Append a changeset to history */\n async append(uid: string, appId: string, changeSet: ChangeSetDocument): Promise<void> {\n const db = getFirestore();\n\n await db.doc(`${this.getCollectionPath(uid, appId)}/${changeSet.id}`).set(changeSet);\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n const updatedMeta: HistoryMeta = {\n latestSnapshotId: currentMeta?.latestSnapshotId,\n latestChangeSetId: changeSet.id,\n snapshotCount: currentMeta?.snapshotCount || 0,\n changeSetCount: (currentMeta?.changeSetCount || 0) + 1,\n };\n\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n }\n\n /** Get change history for an app (ordered by version desc) */\n async getHistory(uid: string, appId: string): Promise<ChangeSetDocument[]> {\n try {\n const db = getFirestore();\n const query = await db\n .collection(this.getCollectionPath(uid, appId))\n .orderBy('version', 'desc')\n .get();\n\n return query.docs.map((doc) => doc.data() as ChangeSetDocument);\n } catch (error) {\n console.error('[ChangeSetStore] Error getting change history:', error);\n return [];\n }\n }\n\n /** Get a specific changeset by ID */\n async get(uid: string, appId: string, changeSetId: string): Promise<ChangeSetDocument | null> {\n const db = getFirestore();\n const doc = await db.doc(`${this.getCollectionPath(uid, appId)}/${changeSetId}`).get();\n if (!doc.exists) return null;\n return doc.data() as ChangeSetDocument;\n }\n\n /** Update a changeset's status */\n async updateStatus(\n uid: string,\n appId: string,\n changeSetId: string,\n status: 'applied' | 'reverted' | 'pending',\n ): Promise<void> {\n const db = getFirestore();\n const ref = db.doc(`${this.getCollectionPath(uid, appId)}/${changeSetId}`);\n const doc = await ref.get();\n if (!doc.exists) return;\n await ref.update({ status });\n }\n\n /** Delete a changeset */\n async delete(uid: string, appId: string, changeSetId: string): Promise<boolean> {\n const db = getFirestore();\n const ref = db.doc(`${this.getCollectionPath(uid, appId)}/${changeSetId}`);\n const doc = await ref.get();\n if (!doc.exists) return false;\n\n await ref.delete();\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n if (currentMeta) {\n const updatedMeta: HistoryMeta = {\n ...currentMeta,\n changeSetCount: Math.max(0, (currentMeta.changeSetCount || 1) - 1),\n latestChangeSetId:\n currentMeta.latestChangeSetId === changeSetId ? undefined : currentMeta.latestChangeSetId,\n };\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n }\n\n return true;\n }\n}\n","/**\n * ValidationStore - Firestore CRUD for validation results\n *\n * Validation results stored at: users/{uid}/apps/{appId}/validation/current\n */\n\nimport type { ValidationResults, ValidationMeta } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\n\nconst VALIDATION_COLLECTION = 'validation';\nconst VALIDATION_DOC_ID = 'current';\n\nexport class ValidationStore {\n private appsCollection: string;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n private getDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}/${VALIDATION_COLLECTION}/${VALIDATION_DOC_ID}`;\n }\n\n private getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Save validation results */\n async save(uid: string, appId: string, results: ValidationResults): Promise<void> {\n const db = getFirestore();\n\n await db.doc(this.getDocPath(uid, appId)).set(results);\n\n // Update validation metadata in main document\n const validationMeta: ValidationMeta = {\n errorCount: results.errors?.length || 0,\n warningCount: results.warnings?.length || 0,\n validatedAt: results.validatedAt,\n };\n\n await db.doc(this.getAppDocPath(uid, appId)).set(\n { _operational: { validationMeta } },\n { merge: true },\n );\n }\n\n /** Get validation results */\n async get(uid: string, appId: string): Promise<ValidationResults | null> {\n try {\n const db = getFirestore();\n const doc = await db.doc(this.getDocPath(uid, appId)).get();\n if (!doc.exists) return null;\n return doc.data() as ValidationResults;\n } catch (error) {\n console.error('[ValidationStore] Error getting validation results:', error);\n return null;\n }\n }\n\n /** Clear validation results */\n async clear(uid: string, appId: string): Promise<void> {\n const db = getFirestore();\n const { FieldValue } = await import('firebase-admin/firestore');\n\n await db.doc(this.getDocPath(uid, appId)).delete();\n\n await db.doc(this.getAppDocPath(uid, appId)).update({\n '_operational.validationMeta': FieldValue.delete(),\n });\n }\n}\n","/**\n * Memory Manager Singleton\n *\n * Provides Firestore-backed memory management for DeepAgent.\n *\n * @packageDocumentation\n */\n\nimport { MemoryManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\n\nlet memoryManager: MemoryManager | null = null;\n\n/**\n * Get or create the MemoryManager singleton\n */\nexport function getMemoryManager(): MemoryManager {\n if (!memoryManager) {\n memoryManager = new MemoryManager({\n db,\n usersCollection: 'agent_memory_users',\n projectsCollection: 'agent_memory_projects',\n generationsCollection: 'agent_memory_generations',\n patternsCollection: 'agent_memory_patterns',\n interruptsCollection: 'agent_memory_interrupts',\n feedbackCollection: 'agent_memory_feedback',\n checkpointsCollection: 'agent_memory_checkpoints',\n toolPreferencesCollection: 'agent_memory_tool_preferences',\n });\n }\n return memoryManager;\n}\n\n/**\n * Reset the MemoryManager (useful for testing)\n */\nexport function resetMemoryManager(): void {\n memoryManager = null;\n}\n","/**\n * Session Manager Singleton\n *\n * Provides Firestore-backed session management with full GAP features.\n *\n * @packageDocumentation\n */\n\nimport { SessionManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\nimport { getMemoryManager } from './memory.js';\nimport type { FirestoreDb } from '@almadar/agent';\n\nlet sessionManager: SessionManager | null = null;\n\n/**\n * Adapter to make Firebase Firestore compatible with @almadar/agent FirestoreDb interface\n */\nfunction createFirestoreAdapter(firestore: typeof db): FirestoreDb {\n return firestore as unknown as FirestoreDb;\n}\n\n/**\n * Get or create the SessionManager singleton\n */\nexport function getSessionManager(): SessionManager {\n if (!sessionManager) {\n sessionManager = new SessionManager({\n mode: 'firestore',\n firestoreDb: createFirestoreAdapter(db),\n memoryManager: getMemoryManager(), // Enable GAP-002D\n compactionConfig: {\n maxTokens: 150000,\n keepRecentMessages: 10,\n strategy: 'last',\n },\n });\n }\n return sessionManager;\n}\n\n/**\n * Reset the SessionManager (useful for testing)\n */\nexport function resetSessionManager(): void {\n sessionManager = null;\n}\n","/**\n * Skill Agent Factory\n *\n * Creates DeepAgent instances with full GAP feature integration.\n *\n * @packageDocumentation\n */\n\nimport {\n createSkillAgent,\n getObservabilityCollector,\n getMultiUserManager,\n createWorkflowToolWrapper,\n type SkillAgentOptions,\n type SkillAgentResult,\n} from '@almadar/agent';\nimport { getMemoryManager } from './memory.js';\nimport { getSessionManager } from './session.js';\n\ninterface ServerSkillAgentOptions extends SkillAgentOptions {\n /** User ID from Firebase Auth */\n userId: string;\n /** App/Project ID for context */\n appId?: string;\n}\n\n/**\n * Create a skill agent with full server-side GAP integration\n */\nexport async function createServerSkillAgent(\n options: ServerSkillAgentOptions,\n): Promise<SkillAgentResult> {\n const memoryManager = getMemoryManager();\n const sessionManager = getSessionManager();\n const observability = getObservabilityCollector();\n const multiUser = getMultiUserManager();\n\n // Check access if resuming existing session\n if (options.threadId) {\n const access = multiUser.canAccessSession(options.threadId, {\n userId: options.userId,\n roles: ['user'],\n });\n if (!access.allowed) {\n throw new Error(`Access denied: ${access.reason}`);\n }\n }\n\n // Start observability\n observability.startSession(options.threadId ?? 'new', options.userId);\n\n // Create workflow tool wrapper for retry/telemetry (always enabled)\n const workflowToolWrapper = createWorkflowToolWrapper({\n maxRetries: 2,\n enableTelemetry: true,\n timeoutMs: 300000, // 5 minutes\n });\n\n try {\n const result = await createSkillAgent({\n ...options,\n memoryManager, // GAP-001: Enable memory\n userId: options.userId, // GAP-002D: Session → Memory sync\n appId: options.appId,\n toolWrapper: workflowToolWrapper.wrap, // Always use workflow wrapper for reliability\n });\n\n // Assign ownership for new sessions\n if (result.threadId) {\n multiUser.assignSessionOwnership(result.threadId, options.userId);\n }\n\n // Record successful creation\n observability.recordEvent({\n type: 'session_start',\n sessionId: result.threadId,\n userId: options.userId,\n payload: { skill: options.skill },\n });\n\n return result;\n } catch (error) {\n observability.recordError(options.threadId ?? 'new', error as Error);\n throw error;\n }\n}\n\n// Re-export for convenience\nexport { getMemoryManager, getSessionManager };\n","/**\n * Multi-User Middleware\n *\n * Provides user isolation and session ownership using Firebase Auth.\n *\n * @packageDocumentation\n */\n\nimport { getMultiUserManager, createUserContext } from '@almadar/agent';\nimport { getAuth } from '../lib/db.js';\nimport type { Request, Response, NextFunction } from 'express';\n\n// Extend Express Request to include Firebase user\ndeclare global {\n namespace Express {\n interface Request {\n user?: {\n uid: string;\n email?: string;\n roles?: string[];\n orgId?: string;\n };\n userContext?: {\n userId: string;\n orgId?: string;\n roles?: string[];\n };\n }\n }\n}\n\n/**\n * Middleware to set up user context from Firebase Auth\n */\nexport async function multiUserMiddleware(\n req: Request,\n res: Response,\n next: NextFunction,\n): Promise<void> {\n const userId = req.user?.uid;\n\n if (!userId) {\n res.status(401).json({ error: 'Authentication required' });\n return;\n }\n\n // Create user context\n req.userContext = createUserContext(userId, {\n orgId: req.user?.orgId,\n roles: req.user?.roles ?? ['user'],\n });\n\n // Assign session ownership when creating new sessions\n const originalJson = res.json.bind(res);\n res.json = (body: unknown) => {\n if (body && typeof body === 'object' && 'threadId' in body) {\n const multiUser = getMultiUserManager();\n multiUser.assignSessionOwnership(\n (body as { threadId: string }).threadId,\n userId,\n );\n }\n return originalJson(body);\n };\n\n next();\n}\n\n/**\n * Verify Firebase Auth token from Authorization header\n */\nexport async function verifyFirebaseAuth(\n req: Request,\n res: Response,\n next: NextFunction,\n): Promise<void> {\n const authHeader = req.headers.authorization;\n\n if (!authHeader?.startsWith('Bearer ')) {\n res.status(401).json({ error: 'No token provided' });\n return;\n }\n\n const token = authHeader.split('Bearer ')[1];\n\n try {\n const decodedToken = await getAuth().verifyIdToken(token);\n\n // Get custom claims for roles/org\n const user = await getAuth().getUser(decodedToken.uid);\n\n req.user = {\n uid: decodedToken.uid,\n email: decodedToken.email,\n roles: (user.customClaims?.roles as string[]) ?? ['user'],\n orgId: user.customClaims?.orgId as string,\n };\n\n next();\n } catch (error) {\n console.error('Token verification failed:', error);\n res.status(401).json({ error: 'Invalid token' });\n }\n}\n","/**\n * State Sync WebSocket Handler\n *\n * Provides real-time state synchronization using Socket.IO.\n *\n * @packageDocumentation\n */\n\nimport { getStateSyncManager } from '@almadar/agent';\nimport { getMultiUserManager } from '@almadar/agent';\nimport { getAuth } from '../lib/db.js';\n\n// Type definitions for Socket.IO (to avoid dependency)\ninterface Socket {\n data: { user: { uid: string; roles: string[]; orgId?: string } };\n handshake: { auth: { token: string; clientId: string } };\n join: (room: string) => void;\n leave: (room: string) => void;\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n emit: (event: string, ...args: unknown[]) => void;\n to: (room: string) => { emit: (event: string, ...args: unknown[]) => void };\n}\n\ninterface SocketServer {\n use: (middleware: (socket: Socket, next: (err?: Error) => void) => void) => void;\n on: (event: string, handler: (socket: Socket) => void) => void;\n}\n\n/**\n * Set up state sync WebSocket with Firebase Auth\n */\nexport function setupStateSyncWebSocket(io: SocketServer): void {\n const stateSync = getStateSyncManager();\n\n // Firebase Auth middleware for Socket.IO\n io.use(async (socket, next) => {\n try {\n const token = socket.handshake.auth.token as string;\n if (!token) {\n return next(new Error('Authentication required'));\n }\n\n const decodedToken = await getAuth().verifyIdToken(token);\n const user = await getAuth().getUser(decodedToken.uid);\n\n socket.data.user = {\n uid: decodedToken.uid,\n roles: (user.customClaims?.roles as string[]) ?? ['user'],\n orgId: user.customClaims?.orgId as string,\n };\n\n next();\n } catch (error) {\n console.error('Socket auth failed:', error);\n next(new Error('Invalid token'));\n }\n });\n\n io.on('connection', (socket: Socket) => {\n const userId = socket.data.user.uid;\n const clientId = socket.handshake.auth.clientId;\n\n console.log(`[StateSync] Client ${clientId} connected for user ${userId}`);\n\n // Update client ID in sync manager\n stateSync.updateConfig({ clientId });\n\n // Join user's room for targeted updates\n socket.join(`user:${userId}`);\n\n // Listen for state changes from client\n socket.on('stateChange', (...args: unknown[]) => {\n const event = args[0] as { threadId: string };\n \n // Verify ownership\n const multiUser = getMultiUserManager();\n if (!multiUser.isSessionOwner(event.threadId, userId)) {\n socket.emit('error', { message: 'Not session owner' });\n return;\n }\n\n // Process through sync manager\n stateSync.receiveRemoteChange(event as unknown as import('@almadar/agent').StateChangeEvent);\n\n // Broadcast to other clients of same user\n socket.to(`user:${userId}`).emit('remoteChange', event);\n });\n\n // Handle sync required events from agent\n stateSync.on('syncRequired', (changes: unknown[]) => {\n socket.emit('syncBatch', changes);\n });\n\n socket.on('disconnect', () => {\n console.log(`[StateSync] Client ${clientId} disconnected`);\n socket.leave(`user:${userId}`);\n });\n });\n}\n","/**\n * Service Discovery — Registry for service orbital instances\n *\n * Enables distributed event routing by tracking which services are running,\n * what events they emit/listen for, and where they can be reached.\n *\n * Supports:\n * - In-memory registry (default, single-process)\n * - Registration/deregistration with heartbeat\n * - Event routing: find services that listen for a given event\n * - Health tracking via TTL-based expiry\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Service registration record */\nexport interface ServiceRegistration {\n /** Service name (from .orb schema name) */\n name: string;\n /** Unique instance ID */\n instanceId: string;\n /** Host where the service is running */\n host: string;\n /** Port number */\n port: number;\n /** Hash of the .orb schema for version tracking */\n orbHash: string;\n /** Events this service emits */\n emits: string[];\n /** Events this service listens for */\n listens: string[];\n /** Registration timestamp */\n registeredAt: number;\n /** Last heartbeat timestamp */\n lastHeartbeat: number;\n /** Service status */\n status: 'starting' | 'ready' | 'degraded' | 'stopping';\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Options for the service registry */\nexport interface ServiceRegistryOptions {\n /** TTL for service registrations in ms (default: 60000) */\n heartbeatTtlMs?: number;\n /** Cleanup interval for expired registrations (default: 30000) */\n cleanupIntervalMs?: number;\n}\n\n/** Service registry interface for pluggable backends */\nexport interface IServiceRegistry {\n /** Register a service */\n register(service: ServiceRegistration): Promise<void>;\n /** Deregister a service */\n deregister(instanceId: string): Promise<void>;\n /** Update heartbeat for a service */\n heartbeat(instanceId: string): Promise<void>;\n /** Update service status */\n updateStatus(instanceId: string, status: ServiceRegistration['status']): Promise<void>;\n /** Get all registered services */\n getAll(): Promise<ServiceRegistration[]>;\n /** Get services by name */\n getByName(name: string): Promise<ServiceRegistration[]>;\n /** Find services that listen for a given event */\n findListeners(event: string): Promise<ServiceRegistration[]>;\n /** Find services that emit a given event */\n findEmitters(event: string): Promise<ServiceRegistration[]>;\n /** Remove expired registrations */\n cleanup(ttlMs: number): Promise<number>;\n}\n\n// ============================================================================\n// InMemoryServiceRegistry\n// ============================================================================\n\n/**\n * In-memory service registry for single-process and development mode.\n */\nexport class InMemoryServiceRegistry implements IServiceRegistry {\n private services: Map<string, ServiceRegistration> = new Map();\n\n async register(service: ServiceRegistration): Promise<void> {\n this.services.set(service.instanceId, {\n ...service,\n registeredAt: Date.now(),\n lastHeartbeat: Date.now(),\n });\n }\n\n async deregister(instanceId: string): Promise<void> {\n this.services.delete(instanceId);\n }\n\n async heartbeat(instanceId: string): Promise<void> {\n const service = this.services.get(instanceId);\n if (service) {\n service.lastHeartbeat = Date.now();\n }\n }\n\n async updateStatus(instanceId: string, status: ServiceRegistration['status']): Promise<void> {\n const service = this.services.get(instanceId);\n if (service) {\n service.status = status;\n }\n }\n\n async getAll(): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values());\n }\n\n async getByName(name: string): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values()).filter(s => s.name === name);\n }\n\n async findListeners(event: string): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values()).filter(\n s => s.listens.includes(event) && s.status !== 'stopping',\n );\n }\n\n async findEmitters(event: string): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values()).filter(\n s => s.emits.includes(event) && s.status !== 'stopping',\n );\n }\n\n async cleanup(ttlMs: number): Promise<number> {\n const cutoff = Date.now() - ttlMs;\n let removed = 0;\n for (const [id, service] of this.services) {\n if (service.lastHeartbeat < cutoff) {\n this.services.delete(id);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================================\n// ServiceDiscovery (High-Level API)\n// ============================================================================\n\n/**\n * Service discovery manager that wraps a registry backend.\n *\n * Usage:\n * ```typescript\n * const discovery = new ServiceDiscovery();\n * discovery.startCleanup();\n *\n * // Register a service\n * await discovery.register({\n * name: 'LLMService',\n * instanceId: 'llm-001',\n * host: 'localhost',\n * port: 3001,\n * orbHash: 'abc123',\n * emits: ['LLM_RESPONSE', 'LLM_READY'],\n * listens: ['AGENT_LLM_REQUEST'],\n * });\n *\n * // Find who can handle an event\n * const listeners = await discovery.findListeners('AGENT_LLM_REQUEST');\n * ```\n */\nexport class ServiceDiscovery {\n private registry: IServiceRegistry;\n private options: Required<ServiceRegistryOptions>;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options?: ServiceRegistryOptions, registry?: IServiceRegistry) {\n this.options = {\n heartbeatTtlMs: options?.heartbeatTtlMs ?? 60000,\n cleanupIntervalMs: options?.cleanupIntervalMs ?? 30000,\n };\n this.registry = registry ?? new InMemoryServiceRegistry();\n }\n\n /**\n * Register a service with the registry.\n */\n async register(service: Omit<ServiceRegistration, 'registeredAt' | 'lastHeartbeat' | 'status'> & { status?: ServiceRegistration['status'] }): Promise<void> {\n await this.registry.register({\n ...service,\n status: service.status ?? 'starting',\n registeredAt: Date.now(),\n lastHeartbeat: Date.now(),\n });\n }\n\n /**\n * Deregister a service.\n */\n async deregister(instanceId: string): Promise<void> {\n await this.registry.deregister(instanceId);\n }\n\n /**\n * Send heartbeat for a service.\n */\n async heartbeat(instanceId: string): Promise<void> {\n await this.registry.heartbeat(instanceId);\n }\n\n /**\n * Mark a service as ready.\n */\n async markReady(instanceId: string): Promise<void> {\n await this.registry.updateStatus(instanceId, 'ready');\n }\n\n /**\n * Mark a service as degraded.\n */\n async markDegraded(instanceId: string): Promise<void> {\n await this.registry.updateStatus(instanceId, 'degraded');\n }\n\n /**\n * Find all services that listen for a given event.\n */\n async findListeners(event: string): Promise<ServiceRegistration[]> {\n return this.registry.findListeners(event);\n }\n\n /**\n * Find all services that emit a given event.\n */\n async findEmitters(event: string): Promise<ServiceRegistration[]> {\n return this.registry.findEmitters(event);\n }\n\n /**\n * Get all registered services.\n */\n async getAll(): Promise<ServiceRegistration[]> {\n return this.registry.getAll();\n }\n\n /**\n * Get the full event topology (who emits what, who listens for what).\n */\n async getEventTopology(): Promise<{\n events: Array<{\n event: string;\n emitters: string[];\n listeners: string[];\n }>;\n }> {\n const services = await this.registry.getAll();\n const eventMap = new Map<string, { emitters: Set<string>; listeners: Set<string> }>();\n\n for (const service of services) {\n for (const event of service.emits) {\n if (!eventMap.has(event)) eventMap.set(event, { emitters: new Set(), listeners: new Set() });\n eventMap.get(event)!.emitters.add(service.name);\n }\n for (const event of service.listens) {\n if (!eventMap.has(event)) eventMap.set(event, { emitters: new Set(), listeners: new Set() });\n eventMap.get(event)!.listeners.add(service.name);\n }\n }\n\n const events = Array.from(eventMap.entries()).map(([event, { emitters, listeners }]) => ({\n event,\n emitters: Array.from(emitters),\n listeners: Array.from(listeners),\n }));\n\n return { events };\n }\n\n /**\n * Start periodic cleanup of expired services.\n */\n startCleanup(): void {\n if (this.cleanupTimer) return;\n this.cleanupTimer = setInterval(() => {\n this.registry.cleanup(this.options.heartbeatTtlMs).catch(err => {\n console.error('[ServiceDiscovery] Cleanup error:', err);\n });\n }, this.options.cleanupIntervalMs);\n }\n\n /**\n * Stop periodic cleanup.\n */\n stopCleanup(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Get the underlying registry (for testing).\n */\n getRegistry(): IServiceRegistry {\n return this.registry;\n }\n}\n","/**\n * Observability Routes\n *\n * Provides endpoints for metrics, health checks, and telemetry.\n *\n * @packageDocumentation\n */\n\nimport { Router } from 'express';\nimport { getObservabilityCollector } from '@almadar/agent';\n\nconst router: ReturnType<typeof Router> = Router();\n\n/**\n * GET /metrics - Get performance snapshot\n */\nrouter.get('/metrics', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const snapshot = collector.getPerformanceSnapshot();\n res.json(snapshot);\n } catch (error) {\n console.error('Metrics error:', error);\n res.status(500).json({ error: 'Failed to get metrics' });\n }\n});\n\n/**\n * GET /health - Get health check\n */\nrouter.get('/health', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const health = await collector.healthCheck();\n const allHealthy = health.every((h) => h.status === 'healthy');\n\n res.status(allHealthy ? 200 : 503).json({\n status: allHealthy ? 'healthy' : 'degraded',\n timestamp: Date.now(),\n checks: health,\n });\n } catch (error) {\n console.error('Health check error:', error);\n res.status(500).json({\n status: 'unhealthy',\n error: 'Health check failed',\n });\n }\n});\n\n/**\n * GET /sessions/:threadId/telemetry - Get session telemetry\n */\nrouter.get('/sessions/:threadId/telemetry', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const telemetry = collector.getSessionTelemetry(req.params.threadId);\n\n if (!telemetry) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n\n res.json(telemetry);\n } catch (error) {\n console.error('Telemetry error:', error);\n res.status(500).json({ error: 'Failed to get telemetry' });\n }\n});\n\n/**\n * GET /active-sessions - Get active sessions\n */\nrouter.get('/active-sessions', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const sessions = collector.getActiveSessions();\n res.json(sessions);\n } catch (error) {\n console.error('Active sessions error:', error);\n res.status(500).json({ error: 'Failed to get active sessions' });\n }\n});\n\nexport default router;\n","/**\n * @almadar/server - Shared server infrastructure for Almadar applications\n *\n * This package provides:\n * - Database utilities (Firebase/Firestore)\n * - Event bus for cross-trait communication\n * - Express middleware (auth, error handling, validation)\n * - Data services (mock and production)\n * - Query filter utilities\n *\n * @packageDocumentation\n */\n\n// Lib exports\nexport { env } from './lib/env.js';\nexport { logger } from './lib/logger.js';\nexport { EventBus, getServerEventBus, resetServerEventBus, emitEntityEvent, type EventLogEntry } from './lib/eventBus.js';\nexport {\n DistributedEventBus,\n InMemoryTransport,\n RedisTransport,\n type IEventBusTransport,\n type TransportMessage,\n type TransportReceiver,\n type RedisTransportOptions,\n} from './lib/eventBusTransport.js';\nexport {\n EventPersistence,\n InMemoryEventStore,\n type PersistedEvent,\n type EventQuery,\n type EventPersistenceOptions,\n type IEventStore,\n} from './lib/eventPersistence.js';\nexport { debugEventsRouter } from './lib/debugRouter.js';\nexport { initializeFirebase, getFirestore, getAuth, admin, db } from './lib/db.js';\nexport {\n setupEventBroadcast,\n getWebSocketServer,\n closeWebSocketServer,\n getConnectedClientCount,\n} from './lib/websocket.js';\n\n// Middleware exports\nexport {\n errorHandler,\n notFoundHandler,\n asyncHandler,\n AppError,\n NotFoundError,\n ValidationError,\n UnauthorizedError,\n ForbiddenError,\n ConflictError,\n} from './middleware/errorHandler.js';\nexport { validateBody, validateQuery, validateParams } from './middleware/validation.js';\nexport { authenticateFirebase } from './middleware/authenticateFirebase.js';\n\n// Services exports\nexport {\n MockDataService,\n getMockDataService,\n resetMockDataService,\n type FieldSchema,\n type EntitySchema,\n} from './services/MockDataService.js';\nexport {\n getDataService,\n resetDataService,\n seedMockData,\n type DataService,\n type EntitySeedConfig,\n type PaginationOptions,\n type PaginatedResult,\n} from './services/DataService.js';\n\n// Compat re-exports — generated project code imports these constant names.\n// They are now lazy getters; usage like `dataService.getById(...)` works\n// because the function IS the getter (called at import time in a Proxy).\nimport { getMockDataService } from './services/MockDataService.js';\nimport { getDataService } from './services/DataService.js';\nimport { getServerEventBus } from './lib/eventBus.js';\n\n/** @deprecated Use getDataService() instead */\nexport const dataService = new Proxy({} as ReturnType<typeof getDataService>, {\n get(_target, prop, receiver) {\n return Reflect.get(getDataService(), prop, receiver);\n },\n});\n\n/** @deprecated Use getMockDataService() instead */\nexport const mockDataService = new Proxy({} as ReturnType<typeof getMockDataService>, {\n get(_target, prop, receiver) {\n return Reflect.get(getMockDataService(), prop, receiver);\n },\n});\n\n/** @deprecated Use getServerEventBus() instead */\nexport const serverEventBus = new Proxy({} as ReturnType<typeof getServerEventBus>, {\n get(_target, prop, receiver) {\n return Reflect.get(getServerEventBus(), prop, receiver);\n },\n});\n\n// Stores exports\nexport {\n toFirestoreFormat,\n fromFirestoreFormat,\n SchemaStore,\n SnapshotStore,\n ChangeSetStore,\n ValidationStore,\n SchemaProtectionService,\n} from './stores/index.js';\n\n// Utils exports\nexport {\n parseQueryFilters,\n applyFiltersToQuery,\n extractPaginationParams,\n type ParsedFilter,\n type FirestoreWhereFilterOp,\n type PaginationParams,\n} from './utils/queryFilters.js';\n\n// DeepAgent exports (GAP implementations)\nexport {\n getMemoryManager,\n resetMemoryManager,\n} from './deepagent/memory.js';\nexport {\n getSessionManager,\n resetSessionManager,\n} from './deepagent/session.js';\nexport {\n createServerSkillAgent,\n getMemoryManager as getAgentMemoryManager,\n getSessionManager as getAgentSessionManager,\n} from './deepagent/skill-agent.js';\n\n// Multi-user middleware exports\nexport {\n multiUserMiddleware,\n verifyFirebaseAuth,\n} from './middleware/multi-user.js';\n\n// WebSocket exports\nexport { setupStateSyncWebSocket } from './websocket/state-sync.js';\n\n// Service Discovery exports\nexport {\n ServiceDiscovery,\n InMemoryServiceRegistry,\n type ServiceRegistration,\n type ServiceRegistryOptions,\n type IServiceRegistry,\n} from './lib/serviceDiscovery.js';\n\n// Contract exports\nexport type {\n DataServiceActions,\n DataServiceContract,\n EventBusActions,\n EventBusServiceContract,\n ServiceDiscoveryActions,\n ServiceDiscoveryContract,\n ServerServiceContracts,\n} from './contracts.js';\n\n// Route exports\nexport { default as observabilityRouter } from './routes/observability.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/env.ts","../src/lib/logger.ts","../src/lib/eventBus.ts","../src/lib/eventBusTransport.ts","../src/lib/eventPersistence.ts","../src/lib/db.ts","../src/services/MockDataService.ts","../src/utils/queryFilters.ts","../src/services/DataService.ts","../src/lib/debugRouter.ts","../src/lib/websocket.ts","../src/middleware/errorHandler.ts","../src/middleware/validation.ts","../src/middleware/authenticateFirebase.ts","../src/stores/firestoreFormat.ts","../src/stores/SchemaProtectionService.ts","../src/stores/SchemaStore.ts","../src/stores/SnapshotStore.ts","../src/stores/ChangeSetStore.ts","../src/stores/ValidationStore.ts","../src/deepagent/memory.ts","../src/deepagent/session.ts","../src/deepagent/skill-agent.ts","../src/middleware/multi-user.ts","../src/websocket/state-sync.ts","../src/lib/serviceDiscovery.ts","../src/routes/observability.ts","../src/index.ts"],"names":["router","ZodError","db","memoryManager","getMultiUserManager","Router","getObservabilityCollector"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\n\n// Load environment variables\ndotenv.config();\n\nconst envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z\n .string()\n .default('3030')\n .transform((val) => parseInt(val, 10)),\n CORS_ORIGIN: z\n .string()\n .default('http://localhost:5173')\n .transform((val) => (val.includes(',') ? val.split(',').map((s) => s.trim()) : val)),\n \n // Database (Prisma/SQL) - optional\n DATABASE_URL: z.string().optional(),\n \n // Firebase/Firestore configuration\n FIREBASE_PROJECT_ID: z.string().optional(),\n FIREBASE_CLIENT_EMAIL: z.string().optional(),\n FIREBASE_PRIVATE_KEY: z.string().optional(),\n FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),\n FIRESTORE_EMULATOR_HOST: z.string().optional(),\n FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),\n \n // API configuration\n API_PREFIX: z.string().default('/api'),\n\n // Mock data configuration\n USE_MOCK_DATA: z.string().default('true').transform((v) => v === 'true'),\n MOCK_SEED: z\n .string()\n .optional()\n .transform((v) => (v ? parseInt(v, 10) : undefined)),\n});\n\nconst parsed = envSchema.safeParse(process.env);\n\nif (!parsed.success) {\n console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);\n throw new Error('Invalid environment variables');\n}\n\nexport const env = parsed.data;\n","import { env } from './env.js';\n\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst colors = {\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n reset: '\\x1b[0m',\n};\n\nconst shouldLog = (level: LogLevel): boolean => {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const minLevel = env.NODE_ENV === 'production' ? 'info' : 'debug';\n return levels.indexOf(level) >= levels.indexOf(minLevel);\n};\n\nconst formatMessage = (level: LogLevel, message: string, meta?: unknown): string => {\n const timestamp = new Date().toISOString();\n const color = colors[level];\n const prefix = `${color}[${level.toUpperCase()}]${colors.reset}`;\n const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${prefix} ${message}${metaStr}`;\n};\n\nexport const logger = {\n debug: (message: string, meta?: unknown) => {\n if (shouldLog('debug')) {\n console.log(formatMessage('debug', message, meta));\n }\n },\n info: (message: string, meta?: unknown) => {\n if (shouldLog('info')) {\n console.log(formatMessage('info', message, meta));\n }\n },\n warn: (message: string, meta?: unknown) => {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message, meta));\n }\n },\n error: (message: string, meta?: unknown) => {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message, meta));\n }\n },\n};\n","/**\n * Server EventBus - Singleton for server-side cross-trait communication\n *\n * This EventBus enables:\n * - Server-side trait event emission after CRUD operations\n * - Server-side trait listeners responding to events\n * - Cross-client event broadcast via WebSocket\n *\n * @packageDocumentation\n */\n\ntype EventHandler = (payload: unknown, meta?: Record<string, unknown>) => void;\n\nexport interface EventLogEntry {\n event: string;\n payload: unknown;\n timestamp: number;\n listenerCount: number;\n wildcardListenerCount: number;\n}\n\nconst MAX_EVENT_LOG = 200;\n\n/**\n * Simple EventBus implementation for server-side events\n */\nexport class EventBus {\n private handlers: Map<string, Set<EventHandler>> = new Map();\n private debug: boolean;\n private eventLog: EventLogEntry[] = [];\n\n constructor(options?: { debug?: boolean }) {\n this.debug = options?.debug ?? false;\n }\n\n on(event: string, handler: EventHandler): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.handlers.get(event)?.delete(handler);\n };\n }\n\n off(event: string, handler: EventHandler): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n emit(event: string, payload?: unknown, meta?: Record<string, unknown>): void {\n if (this.debug) {\n console.log(`[EventBus] Emitting ${event}:`, payload);\n }\n\n const handlers = this.handlers.get(event);\n const listenerCount = handlers?.size ?? 0;\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(payload, meta);\n } catch (err) {\n console.error(`[EventBus] Error in handler for ${event}:`, err);\n }\n });\n }\n\n // Wildcard subscribers receive all events (used by WebSocket broadcast)\n let wildcardListenerCount = 0;\n if (event !== '*') {\n const wildcardHandlers = this.handlers.get('*');\n wildcardListenerCount = wildcardHandlers?.size ?? 0;\n if (wildcardHandlers) {\n wildcardHandlers.forEach(handler => {\n try {\n handler({ type: event, payload, timestamp: Date.now() }, meta);\n } catch (err) {\n console.error(`[EventBus] Error in wildcard handler for ${event}:`, err);\n }\n });\n }\n }\n\n // Record event in log (dev diagnostics)\n if (this.debug) {\n this.eventLog.push({\n event,\n payload,\n timestamp: Date.now(),\n listenerCount,\n wildcardListenerCount,\n });\n if (this.eventLog.length > MAX_EVENT_LOG) {\n this.eventLog.splice(0, this.eventLog.length - MAX_EVENT_LOG);\n }\n }\n }\n\n getRecentEvents(limit = 50): EventLogEntry[] {\n return this.eventLog.slice(-limit);\n }\n\n clearEventLog(): void {\n this.eventLog.length = 0;\n }\n\n getListenerCounts(): Record<string, number> {\n const counts: Record<string, number> = {};\n this.handlers.forEach((handlers, event) => {\n counts[event] = handlers.size;\n });\n return counts;\n }\n\n clear(): void {\n this.handlers.clear();\n this.eventLog.length = 0;\n }\n}\n\n/**\n * Lazy singleton EventBus instance for server-side event communication.\n */\nlet _serverEventBus: EventBus | null = null;\n\nexport function getServerEventBus(): EventBus {\n if (!_serverEventBus) {\n _serverEventBus = new EventBus({\n debug: process.env.NODE_ENV === 'development',\n });\n }\n return _serverEventBus;\n}\n\nexport function resetServerEventBus(): void {\n _serverEventBus?.clear();\n _serverEventBus = null;\n}\n\n/**\n * Type-safe event emission helper\n */\nexport function emitEntityEvent(\n entityType: string,\n action: 'CREATED' | 'UPDATED' | 'DELETED',\n payload: Record<string, unknown>\n): void {\n const eventType = `${entityType.toUpperCase()}_${action}`;\n getServerEventBus().emit(eventType, payload, { orbital: entityType });\n}\n","/**\n * EventBus Transport Layer — Pluggable backends for distributed event communication\n *\n * Transports enable emit/listen to work across processes:\n * - InMemoryTransport: Default, same-process (no-op relay)\n * - RedisTransport: Redis pub/sub for cross-process communication\n *\n * The DistributedEventBus wraps the existing EventBus and relays events\n * through a transport. Local listeners still fire immediately; the transport\n * handles cross-process delivery.\n *\n * @packageDocumentation\n */\n\nimport { EventBus, type EventLogEntry } from './eventBus.js';\n\n// ============================================================================\n// Transport Interface\n// ============================================================================\n\n/**\n * Message shape sent over the transport wire.\n */\nexport interface TransportMessage {\n event: string;\n payload: unknown;\n meta?: Record<string, unknown>;\n /** Source instance ID to prevent echo loops */\n sourceId: string;\n timestamp: number;\n}\n\n/**\n * Callback invoked when a message arrives from another process.\n */\nexport type TransportReceiver = (message: TransportMessage) => void;\n\n/**\n * Pluggable transport interface for cross-process event delivery.\n */\nexport interface IEventBusTransport {\n /** Publish a message to the transport */\n publish(message: TransportMessage): Promise<void>;\n /** Subscribe to incoming messages from other processes */\n subscribe(receiver: TransportReceiver): Promise<void>;\n /** Unsubscribe and clean up resources */\n close(): Promise<void>;\n}\n\n// ============================================================================\n// InMemoryTransport (default — same-process, no network)\n// ============================================================================\n\n/**\n * No-op transport for single-process mode.\n * Events stay in the local EventBus only.\n */\nexport class InMemoryTransport implements IEventBusTransport {\n async publish(): Promise<void> {\n // No-op: events only live in the local EventBus\n }\n\n async subscribe(): Promise<void> {\n // No-op: nothing to subscribe to\n }\n\n async close(): Promise<void> {\n // No-op\n }\n}\n\n// ============================================================================\n// RedisTransport (cross-process via Redis pub/sub)\n// ============================================================================\n\n/**\n * Options for RedisTransport.\n */\nexport interface RedisTransportOptions {\n /** Redis channel name for event relay (default: 'almadar:events') */\n channel?: string;\n /**\n * Publish function — sends serialized message to Redis channel.\n * This is injected so we don't depend on a specific Redis client library.\n */\n publishFn: (channel: string, message: string) => Promise<void>;\n /**\n * Subscribe function — registers a callback for messages on a Redis channel.\n * This is injected so we don't depend on a specific Redis client library.\n */\n subscribeFn: (channel: string, callback: (message: string) => void) => Promise<void>;\n /**\n * Unsubscribe/cleanup function.\n */\n closeFn?: () => Promise<void>;\n}\n\n/**\n * Redis pub/sub transport for cross-process event delivery.\n *\n * Uses dependency-injected publish/subscribe functions so the transport\n * is not coupled to any specific Redis client library (ioredis, redis, etc.).\n *\n * Usage with ioredis:\n * ```typescript\n * import Redis from 'ioredis';\n * const pub = new Redis(process.env.REDIS_URL);\n * const sub = new Redis(process.env.REDIS_URL);\n *\n * const transport = new RedisTransport({\n * publishFn: (ch, msg) => pub.publish(ch, msg).then(() => {}),\n * subscribeFn: (ch, cb) => { sub.subscribe(ch); sub.on('message', (_, msg) => cb(msg)); return Promise.resolve(); },\n * closeFn: async () => { await pub.quit(); await sub.quit(); },\n * });\n * ```\n */\nexport class RedisTransport implements IEventBusTransport {\n private channel: string;\n private publishFn: RedisTransportOptions['publishFn'];\n private subscribeFn: RedisTransportOptions['subscribeFn'];\n private closeFn: RedisTransportOptions['closeFn'];\n\n constructor(options: RedisTransportOptions) {\n this.channel = options.channel ?? 'almadar:events';\n this.publishFn = options.publishFn;\n this.subscribeFn = options.subscribeFn;\n this.closeFn = options.closeFn;\n }\n\n async publish(message: TransportMessage): Promise<void> {\n const serialized = JSON.stringify(message);\n await this.publishFn(this.channel, serialized);\n }\n\n async subscribe(receiver: TransportReceiver): Promise<void> {\n await this.subscribeFn(this.channel, (raw: string) => {\n try {\n const message = JSON.parse(raw) as TransportMessage;\n receiver(message);\n } catch {\n console.error('[RedisTransport] Failed to parse message:', raw);\n }\n });\n }\n\n async close(): Promise<void> {\n if (this.closeFn) {\n await this.closeFn();\n }\n }\n}\n\n// ============================================================================\n// DistributedEventBus\n// ============================================================================\n\nlet instanceCounter = 0;\n\n/**\n * DistributedEventBus wraps the existing EventBus and relays events\n * through a pluggable transport for cross-process communication.\n *\n * - Local emit → fires local listeners + publishes to transport\n * - Transport message received → fires local listeners (skips re-publish)\n *\n * Drop-in replacement for EventBus — same API, same singleton pattern.\n */\nexport class DistributedEventBus {\n private localBus: EventBus;\n private transport: IEventBusTransport;\n private instanceId: string;\n private isRelaying = false;\n\n constructor(options?: {\n debug?: boolean;\n transport?: IEventBusTransport;\n }) {\n this.localBus = new EventBus({ debug: options?.debug });\n this.transport = options?.transport ?? new InMemoryTransport();\n this.instanceId = `instance_${++instanceCounter}_${Date.now()}`;\n }\n\n /**\n * Initialize the transport subscription. Call once at startup.\n */\n async connect(): Promise<void> {\n await this.transport.subscribe((message) => {\n // Skip messages from ourselves (echo prevention)\n if (message.sourceId === this.instanceId) {\n return;\n }\n\n // Relay to local bus without re-publishing to transport\n this.isRelaying = true;\n try {\n this.localBus.emit(message.event, message.payload, message.meta);\n } finally {\n this.isRelaying = false;\n }\n });\n }\n\n /**\n * Emit an event locally and publish to transport for other processes.\n */\n emit(event: string, payload?: unknown, meta?: Record<string, unknown>): void {\n // Always fire locally\n this.localBus.emit(event, payload, meta);\n\n // Publish to transport (unless this emit was triggered by a transport relay)\n if (!this.isRelaying) {\n const message: TransportMessage = {\n event,\n payload,\n meta,\n sourceId: this.instanceId,\n timestamp: Date.now(),\n };\n // Fire-and-forget publish (don't block the emit)\n this.transport.publish(message).catch((err) => {\n console.error('[DistributedEventBus] Transport publish error:', err);\n });\n }\n }\n\n /** Subscribe to an event */\n on(event: string, handler: (payload: unknown, meta?: Record<string, unknown>) => void): () => void {\n return this.localBus.on(event, handler);\n }\n\n /** Unsubscribe from an event */\n off(event: string, handler: (payload: unknown, meta?: Record<string, unknown>) => void): void {\n this.localBus.off(event, handler);\n }\n\n /** Get recent events (dev diagnostics) */\n getRecentEvents(limit?: number): EventLogEntry[] {\n return this.localBus.getRecentEvents(limit);\n }\n\n /** Clear event log */\n clearEventLog(): void {\n this.localBus.clearEventLog();\n }\n\n /** Get listener counts */\n getListenerCounts(): Record<string, number> {\n return this.localBus.getListenerCounts();\n }\n\n /** Clear all listeners and log */\n clear(): void {\n this.localBus.clear();\n }\n\n /** Disconnect transport */\n async disconnect(): Promise<void> {\n await this.transport.close();\n }\n\n /** Get the instance ID (for debugging) */\n getInstanceId(): string {\n return this.instanceId;\n }\n}\n","/**\n * Event Persistence Layer — Optional durable event storage for replay and debugging\n *\n * Wraps the EventBus to persist emitted events. Supports:\n * - In-memory storage (default, for development)\n * - Configurable retention (TTL-based cleanup)\n * - Replay API: query events by name, time range, or source\n * - Required for saga compensation and distributed debugging\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Persisted event record */\nexport interface PersistedEvent {\n /** Unique event ID */\n id: string;\n /** Event name (e.g., 'LLM_RESPONSE') */\n eventName: string;\n /** Event payload */\n payload: unknown;\n /** Source orbital/service that emitted this event */\n source: string;\n /** Timestamp when event was emitted */\n timestamp: number;\n /** Trace ID for distributed tracing correlation */\n traceId: string;\n /** Optional metadata */\n meta?: Record<string, unknown>;\n}\n\n/** Query filters for replaying events */\nexport interface EventQuery {\n /** Filter by event name (exact match) */\n eventName?: string;\n /** Filter by source orbital */\n source?: string;\n /** Filter by trace ID */\n traceId?: string;\n /** Events after this timestamp */\n after?: number;\n /** Events before this timestamp */\n before?: number;\n /** Maximum number of events to return */\n limit?: number;\n /** Sort order */\n order?: 'asc' | 'desc';\n}\n\n/** Options for the event persistence layer */\nexport interface EventPersistenceOptions {\n /** Whether persistence is enabled (default: true) */\n enabled?: boolean;\n /** TTL in milliseconds for event retention (default: 24 hours) */\n retentionMs?: number;\n /** Maximum events to store (default: 10000) */\n maxEvents?: number;\n /** Cleanup interval in milliseconds (default: 5 minutes) */\n cleanupIntervalMs?: number;\n /** Default source identifier */\n defaultSource?: string;\n}\n\n/** Storage backend interface */\nexport interface IEventStore {\n /** Persist an event */\n store(event: PersistedEvent): Promise<void>;\n /** Query events */\n query(filters: EventQuery): Promise<PersistedEvent[]>;\n /** Get a single event by ID */\n get(id: string): Promise<PersistedEvent | null>;\n /** Delete events older than timestamp */\n deleteOlderThan(timestamp: number): Promise<number>;\n /** Get total event count */\n count(): Promise<number>;\n /** Clear all stored events */\n clear(): Promise<void>;\n}\n\n// ============================================================================\n// InMemoryEventStore\n// ============================================================================\n\n/**\n * In-memory event store for development and testing.\n */\nexport class InMemoryEventStore implements IEventStore {\n private events: PersistedEvent[] = [];\n private index: Map<string, PersistedEvent> = new Map();\n\n async store(event: PersistedEvent): Promise<void> {\n this.events.push(event);\n this.index.set(event.id, event);\n }\n\n async query(filters: EventQuery): Promise<PersistedEvent[]> {\n let results = this.events;\n\n if (filters.eventName) {\n results = results.filter(e => e.eventName === filters.eventName);\n }\n if (filters.source) {\n results = results.filter(e => e.source === filters.source);\n }\n if (filters.traceId) {\n results = results.filter(e => e.traceId === filters.traceId);\n }\n if (filters.after !== undefined) {\n results = results.filter(e => e.timestamp > filters.after!);\n }\n if (filters.before !== undefined) {\n results = results.filter(e => e.timestamp < filters.before!);\n }\n\n // Sort\n if (filters.order === 'desc') {\n results = [...results].reverse();\n }\n\n // Limit\n if (filters.limit !== undefined && filters.limit > 0) {\n results = results.slice(0, filters.limit);\n }\n\n return results;\n }\n\n async get(id: string): Promise<PersistedEvent | null> {\n return this.index.get(id) ?? null;\n }\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n const before = this.events.length;\n this.events = this.events.filter(e => e.timestamp >= timestamp);\n\n // Rebuild index\n this.index.clear();\n for (const event of this.events) {\n this.index.set(event.id, event);\n }\n\n return before - this.events.length;\n }\n\n async count(): Promise<number> {\n return this.events.length;\n }\n\n async clear(): Promise<void> {\n this.events = [];\n this.index.clear();\n }\n}\n\n// ============================================================================\n// EventPersistence\n// ============================================================================\n\nlet idCounter = 0;\n\n/**\n * Event persistence layer that can be attached to an EventBus.\n *\n * Usage:\n * ```typescript\n * const persistence = new EventPersistence({ retentionMs: 3600000 });\n * persistence.startCleanup();\n *\n * // Persist an event\n * await persistence.persist('LLM_RESPONSE', { content: '...' }, { source: 'llm-service' });\n *\n * // Replay events\n * const events = await persistence.replay({ eventName: 'LLM_RESPONSE', limit: 10 });\n *\n * // Stop cleanup on shutdown\n * persistence.stopCleanup();\n * ```\n */\nexport class EventPersistence {\n private store: IEventStore;\n private options: Required<EventPersistenceOptions>;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options?: EventPersistenceOptions, store?: IEventStore) {\n this.options = {\n enabled: options?.enabled ?? true,\n retentionMs: options?.retentionMs ?? 24 * 60 * 60 * 1000, // 24 hours\n maxEvents: options?.maxEvents ?? 10000,\n cleanupIntervalMs: options?.cleanupIntervalMs ?? 5 * 60 * 1000, // 5 minutes\n defaultSource: options?.defaultSource ?? 'unknown',\n };\n this.store = store ?? new InMemoryEventStore();\n }\n\n /**\n * Persist an event.\n */\n async persist(\n eventName: string,\n payload: unknown,\n meta?: { source?: string; traceId?: string; [key: string]: unknown },\n ): Promise<PersistedEvent> {\n const event: PersistedEvent = {\n id: `evt_${++idCounter}_${Date.now()}`,\n eventName,\n payload,\n source: meta?.source ?? this.options.defaultSource,\n timestamp: Date.now(),\n traceId: meta?.traceId ?? `trace_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n meta: meta ? { ...meta } : undefined,\n };\n\n if (this.options.enabled) {\n await this.store.store(event);\n }\n\n return event;\n }\n\n /**\n * Replay events matching the query filters.\n */\n async replay(query: EventQuery): Promise<PersistedEvent[]> {\n return this.store.query(query);\n }\n\n /**\n * Get a single event by ID.\n */\n async getEvent(id: string): Promise<PersistedEvent | null> {\n return this.store.get(id);\n }\n\n /**\n * Get event count.\n */\n async getEventCount(): Promise<number> {\n return this.store.count();\n }\n\n /**\n * Run cleanup — delete events older than retention period.\n */\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.options.retentionMs;\n return this.store.deleteOlderThan(cutoff);\n }\n\n /**\n * Start periodic cleanup timer.\n */\n startCleanup(): void {\n if (this.cleanupTimer) return;\n this.cleanupTimer = setInterval(() => {\n this.cleanup().catch(err => {\n console.error('[EventPersistence] Cleanup error:', err);\n });\n }, this.options.cleanupIntervalMs);\n }\n\n /**\n * Stop periodic cleanup timer.\n */\n stopCleanup(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Clear all persisted events.\n */\n async clear(): Promise<void> {\n await this.store.clear();\n }\n\n /**\n * Get the underlying store (for testing or custom queries).\n */\n getStore(): IEventStore {\n return this.store;\n }\n}\n","/**\n * Database Accessors & Initialization\n *\n * This module provides:\n * - `initializeFirebase()` — convenience function to init Firebase from env vars\n * - `getFirestore()`, `getAuth()` — accessors for Firebase services\n * - `db` — lazy Firestore proxy (no eager initialization)\n *\n * The consuming application MUST call `initializeFirebase()` or\n * `admin.initializeApp()` before using any Firebase-dependent features.\n */\n\nimport admin from 'firebase-admin';\n\n/**\n * Initialize Firebase Admin SDK from environment variables.\n *\n * Reads: FIREBASE_PROJECT_ID, FIREBASE_CLIENT_EMAIL, FIREBASE_PRIVATE_KEY,\n * FIREBASE_SERVICE_ACCOUNT_PATH, FIRESTORE_EMULATOR_HOST\n *\n * Safe to call multiple times — returns existing app if already initialized.\n */\nexport function initializeFirebase(): admin.app.App {\n // Already initialized — return existing app\n if (admin.apps.length > 0) {\n return admin.app();\n }\n\n const projectId = process.env.FIREBASE_PROJECT_ID;\n const emulatorHost = process.env.FIRESTORE_EMULATOR_HOST;\n\n // Emulator mode — no credentials needed\n if (emulatorHost) {\n const app = admin.initializeApp({\n projectId: projectId || 'demo-project',\n });\n console.log(`Firebase Admin initialized for emulator: ${emulatorHost}`);\n return app;\n }\n\n // Service account file\n const serviceAccountPath = process.env.FIREBASE_SERVICE_ACCOUNT_PATH;\n if (serviceAccountPath) {\n // Dynamic require for JSON service account file at runtime\n const serviceAccount = require(serviceAccountPath) as Record<string, unknown>;\n return admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId,\n });\n }\n\n // Inline credentials\n const clientEmail = process.env.FIREBASE_CLIENT_EMAIL;\n const privateKey = process.env.FIREBASE_PRIVATE_KEY;\n if (projectId && clientEmail && privateKey) {\n return admin.initializeApp({\n credential: admin.credential.cert({\n projectId,\n clientEmail,\n privateKey: privateKey.replace(/\\\\n/g, '\\n'),\n }),\n projectId,\n });\n }\n\n // Application default credentials (Cloud Run, etc.)\n if (projectId) {\n return admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId,\n });\n }\n\n throw new Error(\n '@almadar/server: Cannot initialize Firebase — no credentials found. ' +\n 'Set FIREBASE_PROJECT_ID + FIREBASE_CLIENT_EMAIL + FIREBASE_PRIVATE_KEY, ' +\n 'or FIREBASE_SERVICE_ACCOUNT_PATH, or FIRESTORE_EMULATOR_HOST.'\n );\n}\n\n/**\n * Get the initialized Firebase app.\n * Throws if Firebase Admin SDK has not been initialized.\n */\nfunction getApp(): admin.app.App {\n if (admin.apps.length === 0) {\n throw new Error(\n '@almadar/server: Firebase Admin SDK is not initialized. ' +\n 'Call initializeFirebase() or admin.initializeApp() before using @almadar/server.'\n );\n }\n return admin.app();\n}\n\n/**\n * Get Firestore instance from the pre-initialized Firebase app.\n */\nexport function getFirestore(): admin.firestore.Firestore {\n return getApp().firestore();\n}\n\n/**\n * Get Firebase Auth instance from the pre-initialized Firebase app.\n */\nexport function getAuth(): admin.auth.Auth {\n return getApp().auth();\n}\n\n// Re-export admin for convenience\nexport { admin };\n\n/**\n * Lazy Firestore proxy — resolves on first property access, not at import time.\n * This prevents the \"Firebase not initialized\" error during module loading.\n */\nexport const db = new Proxy({} as admin.firestore.Firestore, {\n get(_target, prop, receiver) {\n const firestore = getFirestore();\n const value = Reflect.get(firestore, prop, receiver);\n return typeof value === 'function' ? value.bind(firestore) : value;\n },\n});\n","/**\n * MockDataService - In-memory data store with faker-based mock generation\n *\n * Provides a stateful mock data layer that supports all CRUD operations.\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 { env } from '../lib/env.js';\nimport { logger } from '../lib/logger.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FieldSchema {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'enum' | 'relation' | 'array';\n required?: boolean;\n enumValues?: string[];\n min?: number;\n max?: number;\n fakerMethod?: string;\n relatedEntity?: string;\n}\n\nexport interface EntitySchema {\n fields: FieldSchema[];\n seedCount?: number;\n}\n\ninterface BaseEntity {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n// ============================================================================\n// MockDataService\n// ============================================================================\n\n/**\n * In-memory mock data store with CRUD operations and faker-based seeding.\n */\nexport class MockDataService {\n private stores: Map<string, Map<string, unknown>> = new Map();\n private schemas: Map<string, EntitySchema> = new Map();\n private idCounters: Map<string, number> = new Map();\n\n constructor() {\n // Set seed for deterministic generation if provided\n if (env.MOCK_SEED !== undefined) {\n faker.seed(env.MOCK_SEED);\n logger.info(`[Mock] Using seed: ${env.MOCK_SEED}`);\n }\n }\n\n // ============================================================================\n // Store Management\n // ============================================================================\n\n /**\n * Initialize store for an entity.\n */\n private getStore(entityName: string): Map<string, unknown> {\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 /**\n * Generate next ID for an entity.\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 `mock-${normalized}-${counter}`;\n }\n\n // ============================================================================\n // Schema & Seeding\n // ============================================================================\n\n /**\n * Register an entity schema.\n */\n registerSchema(entityName: string, schema: EntitySchema): void {\n this.schemas.set(entityName.toLowerCase(), schema);\n }\n\n /**\n * Seed an entity with mock data.\n */\n seed(entityName: string, fields: FieldSchema[], count: number = 10): void {\n const store = this.getStore(entityName);\n const normalized = entityName.toLowerCase();\n\n logger.info(`[Mock] Seeding ${count} ${entityName}...`);\n\n for (let i = 0; i < count; i++) {\n const item = this.generateMockItem(normalized, fields, i + 1);\n store.set(item.id, item);\n }\n }\n\n /**\n * Generate a single mock item based on field schemas.\n */\n private generateMockItem(entityName: string, fields: FieldSchema[], index: number): BaseEntity & Record<string, unknown> {\n const id = this.nextId(entityName);\n const now = new Date();\n const item: Record<string, unknown> = {\n id,\n createdAt: faker.date.past({ years: 1 }),\n updatedAt: now,\n };\n\n for (const field of fields) {\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 as BaseEntity & Record<string, unknown>;\n }\n\n /**\n * Generate a mock value for a field based on its schema.\n */\n private generateFieldValue(entityName: string, field: FieldSchema, index: number): unknown {\n // Handle optional fields - 80% chance of having a value\n if (!field.required && Math.random() > 0.8) {\n return undefined;\n }\n\n switch (field.type) {\n case 'string':\n return this.generateStringValue(entityName, field, index);\n\n case 'number':\n return faker.number.int({\n min: field.min ?? 0,\n max: field.max ?? 1000,\n });\n\n case 'boolean':\n return faker.datatype.boolean();\n\n case 'date':\n return this.generateDateValue(field);\n\n case 'enum':\n if (field.enumValues && field.enumValues.length > 0) {\n return faker.helpers.arrayElement(field.enumValues);\n }\n return null;\n\n case 'relation':\n // For relations, generate a placeholder ID or null\n if (field.relatedEntity) {\n const relatedStore = this.stores.get(field.relatedEntity.toLowerCase());\n if (relatedStore && relatedStore.size > 0) {\n const ids = Array.from(relatedStore.keys());\n return faker.helpers.arrayElement(ids);\n }\n }\n return null;\n\n case 'array':\n // Generate an empty array for now\n return [];\n\n default:\n return null;\n }\n }\n\n /**\n * Generate a string value based on field name heuristics.\n * Generic name/title fields use a clean readable format (e.g., \"Title 1\").\n * Specific fields (email, phone, etc.) use faker.\n */\n private generateStringValue(_entityName: string, field: FieldSchema, index: number): string {\n const name = field.name.toLowerCase();\n\n // If field has enumValues, use them (even if type is 'string')\n if (field.enumValues && field.enumValues.length > 0) {\n return faker.helpers.arrayElement(field.enumValues);\n }\n\n // Identity fields\n if (name.includes('email')) return faker.internet.email();\n if (name === 'name' || name === 'fullname' || name === 'full_name') return faker.person.fullName();\n if (name === 'firstname' || name === 'first_name') return faker.person.firstName();\n if (name === 'lastname' || name === 'last_name') return faker.person.lastName();\n if (name.includes('username') || name === 'handle') return faker.internet.username();\n\n // Contact fields\n if (name.includes('phone') || name.includes('mobile') || name.includes('tel')) return faker.phone.number();\n if (name.includes('address') || name.includes('street')) return faker.location.streetAddress();\n if (name.includes('city')) return faker.location.city();\n if (name.includes('state') || name.includes('province')) return faker.location.state();\n if (name.includes('country')) return faker.location.country();\n if (name.includes('zip') || name.includes('postal')) return faker.location.zipCode();\n\n // Content fields\n if (name === 'title' || name === 'headline' || name === 'subject') return faker.lorem.sentence({ min: 3, max: 7 }).replace(/\\.$/, '');\n if (name === 'description' || name === 'summary' || name === 'bio' || name === 'about') return faker.lorem.paragraph(2);\n if (name === 'content' || name === 'body' || name === 'text') return faker.lorem.paragraphs(2);\n if (name === 'excerpt' || name === 'snippet' || name === 'preview') return faker.lorem.sentence({ min: 8, max: 15 });\n if (name === 'label' || name === 'tag' || name === 'category') return faker.word.noun();\n if (name === 'note' || name === 'comment' || name === 'message' || name === 'feedback') return faker.lorem.sentence();\n\n // Status / type fields\n if (name === 'status') return faker.helpers.arrayElement(['active', 'pending', 'completed', 'draft', 'archived']);\n if (name === 'priority') return faker.helpers.arrayElement(['low', 'medium', 'high', 'critical']);\n if (name === 'type' || name === 'kind') return faker.helpers.arrayElement(['standard', 'premium', 'basic', 'custom']);\n if (name === 'role') return faker.helpers.arrayElement(['admin', 'editor', 'viewer', 'member']);\n if (name === 'level' || name === 'tier') return faker.helpers.arrayElement(['beginner', 'intermediate', 'advanced', 'expert']);\n if (name === 'severity') return faker.helpers.arrayElement(['info', 'warning', 'error', 'critical']);\n if (name === 'difficulty') return faker.helpers.arrayElement(['easy', 'medium', 'hard']);\n\n // Web / media fields\n if (name.includes('url') || name.includes('website') || name.includes('link')) return faker.internet.url();\n if (name.includes('avatar') || name.includes('image') || name.includes('photo') || name.includes('thumbnail')) return faker.image.avatar();\n if (name.includes('color') || name.includes('colour')) return faker.color.human();\n if (name.includes('uuid') || name === 'guid') return faker.string.uuid();\n if (name.includes('icon')) return faker.helpers.arrayElement(['star', 'heart', 'check', 'alert-circle', 'info', 'folder', 'file', 'user']);\n if (name === 'slug') return faker.helpers.slugify(faker.lorem.words(3));\n\n // Organization / business fields\n if (name === 'company' || name === 'organization' || name === 'org') return faker.company.name();\n if (name === 'department') return faker.commerce.department();\n if (name === 'product' || name === 'productname' || name === 'product_name') return faker.commerce.productName();\n if (name === 'brand') return faker.company.name();\n if (name === 'sku' || name === 'code') return faker.string.alphanumeric(8).toUpperCase();\n if (name === 'currency') return faker.finance.currencyCode();\n if (name.includes('price') || name.includes('cost') || name.includes('amount')) return faker.commerce.price();\n\n // Location / geo fields\n if (name === 'latitude' || name === 'lat') return String(faker.location.latitude());\n if (name === 'longitude' || name === 'lng' || name === 'lon') return String(faker.location.longitude());\n if (name === 'location' || name === 'place' || name === 'venue') return `${faker.location.city()}, ${faker.location.country()}`;\n if (name === 'region' || name === 'zone' || name === 'area') return faker.location.state();\n\n // Technical fields\n if (name === 'ip' || name.includes('ipaddress') || name === 'ip_address') return faker.internet.ip();\n if (name === 'useragent' || name === 'user_agent') return faker.internet.userAgent();\n if (name === 'version' || name === 'firmware') return faker.system.semver();\n if (name === 'platform' || name === 'os') return faker.helpers.arrayElement(['iOS', 'Android', 'Windows', 'macOS', 'Linux']);\n if (name === 'browser') return faker.helpers.arrayElement(['Chrome', 'Firefox', 'Safari', 'Edge']);\n\n // Measurement / unit fields\n if (name === 'unit') return faker.helpers.arrayElement(['kg', 'lb', 'cm', 'm', 'L', 'mL', '°C', '°F', 'psi', 'rpm']);\n if (name === 'metric') return faker.helpers.arrayElement(['temperature', 'pressure', 'humidity', 'speed', 'voltage']);\n if (name === 'operator') return faker.helpers.arrayElement(['gt', 'lt', 'eq', 'gte', 'lte']);\n if (name === 'format' || name === 'mimetype' || name === 'mime_type') return faker.system.mimeType();\n if (name === 'extension' || name === 'ext') return faker.system.fileExt();\n if (name === 'filename' || name === 'file_name') return faker.system.fileName();\n\n // Fallback: generate realistic data based on common suffixes and patterns\n if (name.endsWith('id') || name.endsWith('_id')) return faker.string.alphanumeric(8).toUpperCase();\n if (name.endsWith('name') || name.endsWith('_name')) return faker.person.fullName();\n if (name.endsWith('type') || name.endsWith('_type')) return faker.helpers.arrayElement(['standard', 'premium', 'basic', 'custom', 'special']);\n if (name.endsWith('date') || name.endsWith('_date') || name.endsWith('at')) return faker.date.recent({ days: 90 }).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n if (name.endsWith('count') || name.endsWith('_count')) return String(faker.number.int({ min: 1, max: 100 }));\n if (name.includes('reason') || name.includes('detail')) return faker.lorem.sentence({ min: 4, max: 8 }).replace(/\\.$/, '');\n if (name.includes('field') || name.includes('key') || name.includes('attribute')) return faker.word.noun();\n if (name.includes('value') || name.includes('result') || name.includes('output')) return faker.word.words({ count: { min: 1, max: 3 } });\n if (name.includes('direction') || name.includes('position') || name.includes('mode')) return faker.helpers.arrayElement(['left', 'right', 'center', 'top', 'bottom', 'auto']);\n // Generic fallback: short descriptive phrase\n return faker.word.words({ count: { min: 1, max: 3 } });\n }\n\n /**\n * Capitalize first letter of a string.\n */\n private capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n /**\n * Generate a date value based on field name heuristics.\n */\n private generateDateValue(field: FieldSchema): Date {\n const name = field.name.toLowerCase();\n\n if (name.includes('created') || name.includes('start') || name.includes('birth')) {\n return faker.date.past({ years: 2 });\n }\n if (name.includes('updated') || name.includes('modified')) {\n return faker.date.recent({ days: 30 });\n }\n if (name.includes('deadline') || name.includes('due') || name.includes('end') || name.includes('expires')) {\n return faker.date.future({ years: 1 });\n }\n\n return faker.date.anytime();\n }\n\n // ============================================================================\n // CRUD Operations\n // ============================================================================\n\n /**\n * List all items of an entity.\n */\n list<T>(entityName: string): T[] {\n const store = this.getStore(entityName);\n return Array.from(store.values()) as T[];\n }\n\n /**\n * Get a single item by ID.\n */\n getById<T>(entityName: string, id: string): T | null {\n const store = this.getStore(entityName);\n const item = store.get(id);\n return (item as T) ?? null;\n }\n\n /**\n * Create a new item.\n */\n create<T extends BaseEntity>(entityName: string, data: Partial<T>): T {\n const store = this.getStore(entityName);\n const id = this.nextId(entityName);\n const now = new Date();\n\n const item = {\n ...data,\n id,\n createdAt: now,\n updatedAt: now,\n } as T;\n\n store.set(id, item);\n return item;\n }\n\n /**\n * Update an existing item.\n */\n update<T extends BaseEntity>(entityName: string, id: string, data: Partial<T>): T | null {\n const store = this.getStore(entityName);\n const existing = store.get(id);\n\n if (!existing) {\n return null;\n }\n\n const updated = {\n ...(existing as T),\n ...data,\n id, // Preserve original ID\n updatedAt: new Date(),\n } as T;\n\n store.set(id, updated);\n return updated;\n }\n\n /**\n * Delete an item.\n */\n delete(entityName: string, id: string): boolean {\n const store = this.getStore(entityName);\n if (!store.has(id)) {\n return false;\n }\n store.delete(id);\n return true;\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 /**\n * Clear all data.\n */\n clearAll(): void {\n this.stores.clear();\n this.idCounters.clear();\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// Lazy singleton instance\nlet _mockDataService: MockDataService | null = null;\n\nexport function getMockDataService(): MockDataService {\n if (!_mockDataService) {\n _mockDataService = new MockDataService();\n }\n return _mockDataService;\n}\n\nexport function resetMockDataService(): void {\n _mockDataService?.clearAll();\n _mockDataService = null;\n}\n","/**\n * Query Filter Utilities\n *\n * Parses URL query parameters into Firestore-compatible filter objects.\n * Supports operator encoding in parameter names: field__operator=value\n *\n * @example\n * // URL: /api/tasks?status=active&date__gte=2025-01-01&tags__contains=urgent\n * const filters = parseQueryFilters(req.query);\n * // Returns:\n * // [\n * // { field: 'status', operator: '==', value: 'active' },\n * // { field: 'date', operator: '>=', value: '2025-01-01' },\n * // { field: 'tags', operator: 'array-contains', value: 'urgent' }\n * // ]\n *\n * @packageDocumentation\n */\n\n/**\n * Parsed filter ready for Firestore query\n */\nexport interface ParsedFilter {\n field: string;\n operator: FirestoreWhereFilterOp;\n value: unknown;\n}\n\n/**\n * Firestore where filter operators\n */\nexport type FirestoreWhereFilterOp =\n | '=='\n | '!='\n | '>'\n | '>='\n | '<'\n | '<='\n | 'array-contains'\n | 'array-contains-any'\n | 'in'\n | 'not-in';\n\n/**\n * Map of URL operator suffixes to Firestore operators\n */\nconst OPERATOR_MAP: Record<string, FirestoreWhereFilterOp> = {\n 'eq': '==',\n 'neq': '!=',\n 'gt': '>',\n 'gte': '>=',\n 'lt': '<',\n 'lte': '<=',\n 'contains': 'array-contains',\n 'contains_any': 'array-contains-any',\n 'in': 'in',\n 'not_in': 'not-in',\n // Date operators map to same comparison operators\n 'date_eq': '==',\n 'date_gte': '>=',\n 'date_lte': '<=',\n};\n\n/**\n * Reserved query parameters that should not be treated as filters\n */\nconst RESERVED_PARAMS = new Set([\n 'page',\n 'pageSize',\n 'limit',\n 'offset',\n 'search',\n 'q',\n 'sortBy',\n 'sortOrder',\n 'orderBy',\n 'orderDirection',\n]);\n\n/**\n * Parse query parameters into Firestore-compatible filters.\n *\n * Supports operator encoding: field__operator=value\n *\n * @param query - Express req.query object\n * @returns Array of parsed filters ready for Firestore .where() calls\n *\n * @example\n * ```typescript\n * // In Express route handler:\n * const filters = parseQueryFilters(req.query);\n *\n * let query = db.collection('tasks');\n * for (const filter of filters) {\n * query = query.where(filter.field, filter.operator, filter.value);\n * }\n * ```\n */\nexport function parseQueryFilters(\n query: Record<string, unknown>\n): ParsedFilter[] {\n const filters: ParsedFilter[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n // Skip reserved pagination/sort params\n if (RESERVED_PARAMS.has(key)) continue;\n\n // Skip empty values\n if (value === undefined || value === null || value === '') continue;\n\n // Parse operator from key: field__operator → { field, operator }\n const match = key.match(/^(.+)__(\\w+)$/);\n\n if (match) {\n const [, field, op] = match;\n const firestoreOp = OPERATOR_MAP[op];\n\n if (firestoreOp) {\n filters.push({\n field,\n operator: firestoreOp,\n value: parseValue(value, op),\n });\n } else {\n // Unknown operator - treat as field name with double underscore\n filters.push({\n field: key,\n operator: '==',\n value: parseValue(value, 'eq'),\n });\n }\n } else {\n // No operator suffix → equals\n filters.push({\n field: key,\n operator: '==',\n value: parseValue(value, 'eq'),\n });\n }\n }\n\n return filters;\n}\n\n/**\n * Parse and coerce value based on operator type\n */\nfunction parseValue(value: unknown, operator: string): unknown {\n // Handle array values for 'in' operator\n if (operator === 'in' || operator === 'not_in' || operator === 'contains_any') {\n if (typeof value === 'string') {\n // Parse comma-separated values: \"a,b,c\" → ['a', 'b', 'c']\n return value.split(',').map(v => v.trim());\n }\n if (Array.isArray(value)) {\n return value;\n }\n return [value];\n }\n\n // Handle numeric values\n if (typeof value === 'string') {\n // Try to parse as number if it looks like one\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) {\n const num = parseFloat(value);\n if (!isNaN(num)) {\n return num;\n }\n }\n\n // Handle boolean strings\n if (value === 'true') return true;\n if (value === 'false') return false;\n }\n\n return value;\n}\n\n/**\n * Build a Firestore query with filters applied.\n *\n * @param collection - Base Firestore collection reference or query\n * @param filters - Parsed filters from parseQueryFilters\n * @returns Query with all filters applied\n *\n * @example\n * ```typescript\n * const filters = parseQueryFilters(req.query);\n * const baseQuery = db.collection('tasks');\n * const filteredQuery = applyFiltersToQuery(baseQuery, filters);\n * const snapshot = await filteredQuery.get();\n * ```\n */\nexport function applyFiltersToQuery<T>(\n collection: FirebaseFirestore.Query<T>,\n filters: ParsedFilter[]\n): FirebaseFirestore.Query<T> {\n let query = collection;\n\n for (const filter of filters) {\n query = query.where(\n filter.field,\n filter.operator as FirebaseFirestore.WhereFilterOp,\n filter.value\n );\n }\n\n return query;\n}\n\n/**\n * Extract pagination parameters from query\n */\nexport interface PaginationParams {\n page: number;\n pageSize: number;\n sortBy?: string;\n sortOrder: 'asc' | 'desc';\n}\n\n/**\n * Extract pagination parameters from a query object.\n *\n * Parses page, pageSize/limit, sortBy/orderBy, and sortOrder/orderDirection\n * from query parameters with sensible defaults.\n *\n * @param {Record<string, unknown>} query - Query object containing pagination params\n * @param {Partial<PaginationParams>} [defaults] - Default values for pagination\n * @returns {PaginationParams} Extracted pagination parameters\n */\nexport function extractPaginationParams(\n query: Record<string, unknown>,\n defaults: Partial<PaginationParams> = {}\n): PaginationParams {\n return {\n page: parseInt(query.page as string, 10) || defaults.page || 1,\n pageSize: parseInt(query.pageSize as string, 10) || parseInt(query.limit as string, 10) || defaults.pageSize || 20,\n sortBy: (query.sortBy || query.orderBy) as string | undefined,\n sortOrder: ((query.sortOrder || query.orderDirection) as 'asc' | 'desc') || defaults.sortOrder || 'asc',\n };\n}\n","/**\n * DataService - Unified data access abstraction\n *\n * Provides a common interface for data operations that can be backed by\n * either MockDataService (for development) or Firebase (for production).\n *\n * @packageDocumentation\n */\n\nimport type { StoreContract, StoreFilter } from '@almadar/core';\nimport { db } from '../lib/db.js';\nimport { env } from '../lib/env.js';\nimport { logger } from '../lib/logger.js';\nimport { getMockDataService, type FieldSchema } from './MockDataService.js';\nimport {\n parseQueryFilters,\n applyFiltersToQuery,\n type ParsedFilter,\n} from '../utils/queryFilters.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface BaseEntity {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/**\n * Pagination options for list queries\n */\nexport interface PaginationOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Search term to filter results */\n search?: string;\n /** Fields to search in (defaults to all string fields) */\n searchFields?: string[];\n /** Sort field */\n sortBy?: string;\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Filters parsed from query params */\n filters?: ParsedFilter[];\n}\n\n/**\n * Paginated response structure\n */\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\nexport interface DataService {\n list<T>(collection: string): Promise<T[]>;\n listPaginated<T>(collection: string, options?: PaginationOptions): Promise<PaginatedResult<T>>;\n getById<T>(collection: string, id: string): Promise<T | null>;\n create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T>;\n update<T extends BaseEntity>(collection: string, id: string, data: Partial<T>): Promise<T | null>;\n delete(collection: string, id: string): Promise<boolean>;\n query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]>;\n /** Get a typed StoreContract<T> bound to a specific collection. */\n getStore<T extends BaseEntity>(collection: string): StoreContract<T>;\n}\n\n/**\n * Apply filter condition for in-memory filtering.\n * Used by MockDataServiceAdapter for all operators and\n * FirebaseDataService for operators not supported by Firestore.\n */\nfunction applyFilterCondition(value: unknown, operator: string, filterValue: unknown): boolean {\n if (value === null || value === undefined) {\n return operator === '!=' ? filterValue !== null : false;\n }\n\n switch (operator) {\n case '==':\n return value === filterValue;\n case '!=':\n return value !== filterValue;\n case '>':\n return (value as number) > (filterValue as number);\n case '>=':\n return (value as number) >= (filterValue as number);\n case '<':\n return (value as number) < (filterValue as number);\n case '<=':\n return (value as number) <= (filterValue as number);\n case 'array-contains':\n return Array.isArray(value) && value.includes(filterValue);\n case 'array-contains-any':\n return (\n Array.isArray(value) &&\n Array.isArray(filterValue) &&\n filterValue.some((v: unknown) => value.includes(v))\n );\n case 'in':\n return Array.isArray(filterValue) && filterValue.includes(value);\n case 'not-in':\n return Array.isArray(filterValue) && !filterValue.includes(value);\n default:\n return true;\n }\n}\n\n// ============================================================================\n// MockDataServiceAdapter\n// ============================================================================\n\n/**\n * Adapter that wraps MockDataService with async interface.\n */\nclass MockDataServiceAdapter implements DataService {\n async list<T>(collection: string): Promise<T[]> {\n return getMockDataService().list<T>(collection);\n }\n\n async listPaginated<T>(\n collection: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<T>> {\n const {\n page = 1,\n pageSize = 20,\n search,\n searchFields,\n sortBy,\n sortOrder = 'asc',\n filters,\n } = options;\n\n let items = getMockDataService().list<T>(collection);\n\n // Apply field filters (server-side filtering)\n if (filters && filters.length > 0) {\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n return filters.every((filter) => {\n const value = record[filter.field];\n return applyFilterCondition(value, filter.operator, filter.value);\n });\n });\n }\n\n // Apply search filter\n if (search && search.trim()) {\n const searchLower = search.toLowerCase();\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n const fieldsToSearch = searchFields || Object.keys(record);\n return fieldsToSearch.some((field) => {\n const value = record[field];\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n });\n });\n }\n\n // Apply sorting\n if (sortBy) {\n items = [...items].sort((a, b) => {\n const aVal = (a as Record<string, unknown>)[sortBy];\n const bVal = (b as Record<string, unknown>)[sortBy];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n const total = items.length;\n const totalPages = Math.ceil(total / pageSize);\n const startIndex = (page - 1) * pageSize;\n const data = items.slice(startIndex, startIndex + pageSize);\n\n return { data, total, page, pageSize, totalPages };\n }\n\n async getById<T>(collection: string, id: string): Promise<T | null> {\n return getMockDataService().getById<T>(collection, id);\n }\n\n async create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T> {\n return getMockDataService().create<T>(collection, data);\n }\n\n async update<T extends BaseEntity>(\n collection: string,\n id: string,\n data: Partial<T>\n ): Promise<T | null> {\n return getMockDataService().update<T>(collection, id, data);\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n return getMockDataService().delete(collection, id);\n }\n\n async query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]> {\n let items = getMockDataService().list<T>(collection);\n for (const filter of filters) {\n items = items.filter((item) => {\n const value = (item as Record<string, unknown>)[filter.field];\n return applyFilterCondition(value, filter.op, filter.value);\n });\n }\n return items;\n }\n\n getStore<T extends BaseEntity>(collection: string): StoreContract<T> {\n const adapter = this;\n return {\n async getById(id: string): Promise<T | null> {\n return adapter.getById<T>(collection, id);\n },\n async create(data: Omit<T, 'id'>): Promise<T> {\n return adapter.create<T>(collection, data as Partial<T>);\n },\n async update(id: string, data: Partial<T>): Promise<T> {\n const result = await adapter.update<T>(collection, id, data);\n if (!result) throw new Error(`Entity ${id} not found in ${collection}`);\n return result;\n },\n async delete(id: string): Promise<void> {\n adapter.delete(collection, id);\n },\n async query(filters: StoreFilter<T>[]): Promise<T[]> {\n return adapter.query<T>(collection, filters);\n },\n };\n }\n}\n\n// ============================================================================\n// FirebaseDataService\n// ============================================================================\n\n/**\n * Firebase/Firestore implementation of DataService.\n */\nclass FirebaseDataService implements DataService {\n async list<T>(collection: string): Promise<T[]> {\n const snapshot = await db.collection(collection).get();\n return snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n }\n\n async listPaginated<T>(\n collection: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<T>> {\n const {\n page = 1,\n pageSize = 20,\n search,\n searchFields,\n sortBy,\n sortOrder = 'asc',\n filters,\n } = options;\n\n // For Firebase, we apply filters using Firestore's .where() for supported operators\n // Note: For large datasets, consider using Algolia or Elasticsearch for search\n let query: FirebaseFirestore.Query = db.collection(collection);\n\n // Apply field filters using Firestore's where() clauses\n if (filters && filters.length > 0) {\n query = applyFiltersToQuery(query, filters);\n }\n\n // Apply sorting if no search (Firestore can sort natively)\n if (sortBy && !search) {\n query = query.orderBy(sortBy, sortOrder);\n }\n\n const snapshot = await query.get();\n let items = snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n\n // Apply search filter (in-memory for Firebase)\n if (search && search.trim()) {\n const searchLower = search.toLowerCase();\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n const fieldsToSearch = searchFields || Object.keys(record);\n return fieldsToSearch.some((field) => {\n const value = record[field];\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n });\n });\n }\n\n // Apply sorting (in-memory if search was applied)\n if (sortBy && search) {\n items = [...items].sort((a, b) => {\n const aVal = (a as Record<string, unknown>)[sortBy];\n const bVal = (b as Record<string, unknown>)[sortBy];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n const total = items.length;\n const totalPages = Math.ceil(total / pageSize);\n const startIndex = (page - 1) * pageSize;\n const data = items.slice(startIndex, startIndex + pageSize);\n\n return { data, total, page, pageSize, totalPages };\n }\n\n async getById<T>(collection: string, id: string): Promise<T | null> {\n const doc = await db.collection(collection).doc(id).get();\n if (!doc.exists) {\n return null;\n }\n return { id: doc.id, ...doc.data() } as T;\n }\n\n async create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T> {\n const now = new Date();\n const docRef = await db.collection(collection).add({\n ...data,\n createdAt: now,\n updatedAt: now,\n });\n\n return {\n ...data,\n id: docRef.id,\n createdAt: now,\n updatedAt: now,\n } as T;\n }\n\n async update<T extends BaseEntity>(\n collection: string,\n id: string,\n data: Partial<T>\n ): Promise<T | null> {\n const docRef = db.collection(collection).doc(id);\n const doc = await docRef.get();\n\n if (!doc.exists) {\n return null;\n }\n\n const now = new Date();\n await docRef.update({\n ...data,\n updatedAt: now,\n });\n\n return {\n ...doc.data(),\n ...data,\n id,\n updatedAt: now,\n } as T;\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n const docRef = db.collection(collection).doc(id);\n const doc = await docRef.get();\n\n if (!doc.exists) {\n return false;\n }\n\n await docRef.delete();\n return true;\n }\n\n async query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]> {\n let query: FirebaseFirestore.Query = db.collection(collection);\n\n // Apply filters that Firestore supports natively\n const memoryFilters: StoreFilter<T>[] = [];\n for (const filter of filters) {\n if (['==', '!=', '<', '<=', '>', '>=', 'in', 'not-in'].includes(filter.op)) {\n query = query.where(filter.field, filter.op as FirebaseFirestore.WhereFilterOp, filter.value);\n } else {\n memoryFilters.push(filter);\n }\n }\n\n const snapshot = await query.get();\n let items = snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n\n // Apply remaining filters in memory (e.g., 'contains')\n for (const filter of memoryFilters) {\n items = items.filter((item) => {\n const value = (item as Record<string, unknown>)[filter.field];\n return applyFilterCondition(value, filter.op, filter.value);\n });\n }\n\n return items;\n }\n\n getStore<T extends BaseEntity>(collection: string): StoreContract<T> {\n const svc = this;\n return {\n async getById(id: string): Promise<T | null> {\n return svc.getById<T>(collection, id);\n },\n async create(data: Omit<T, 'id'>): Promise<T> {\n return svc.create<T>(collection, data as Partial<T>);\n },\n async update(id: string, data: Partial<T>): Promise<T> {\n const result = await svc.update<T>(collection, id, data);\n if (!result) throw new Error(`Entity ${id} not found in ${collection}`);\n return result;\n },\n async delete(id: string): Promise<void> {\n await svc.delete(collection, id);\n },\n async query(filters: StoreFilter<T>[]): Promise<T[]> {\n return svc.query<T>(collection, filters);\n },\n };\n }\n}\n\n// ============================================================================\n// Factory & Export\n// ============================================================================\n\n/**\n * Create the appropriate data service based on environment configuration.\n */\nfunction createDataService(): DataService {\n if (env.USE_MOCK_DATA) {\n logger.info('[DataService] Using MockDataService');\n return new MockDataServiceAdapter();\n }\n logger.info('[DataService] Using FirebaseDataService');\n return new FirebaseDataService();\n}\n\n/**\n * Lazy singleton data service instance.\n */\nlet _dataService: DataService | null = null;\n\nexport function getDataService(): DataService {\n if (!_dataService) {\n _dataService = createDataService();\n }\n return _dataService;\n}\n\nexport function resetDataService(): void {\n _dataService = null;\n}\n\n// ============================================================================\n// Seeding Helper\n// ============================================================================\n\nexport interface EntitySeedConfig {\n name: string;\n fields: FieldSchema[];\n seedCount: number;\n}\n\n/**\n * Seed mock data for multiple entities.\n * Only works when USE_MOCK_DATA is enabled.\n */\nexport function seedMockData(entities: EntitySeedConfig[]): void {\n if (!env.USE_MOCK_DATA) {\n logger.info('[DataService] Mock mode disabled, skipping seed');\n return;\n }\n\n logger.info('[DataService] Seeding mock data...');\n\n for (const entity of entities) {\n getMockDataService().seed(entity.name, entity.fields, entity.seedCount);\n }\n\n logger.info('[DataService] Mock data seeding complete');\n}\n","/**\n * Debug Events Router\n *\n * Provides diagnostic endpoints for inspecting the server EventBus.\n * Only active when NODE_ENV=development.\n *\n * Endpoints:\n * GET /event-log - Recent emitted events with listener counts\n * DELETE /event-log - Clear the event log\n * GET /listeners - Registered listener counts per event\n * POST /seed - Seed MockDataService with entity data\n *\n * @packageDocumentation\n */\n\nimport { Router } from 'express';\nimport { getServerEventBus } from './eventBus.js';\nimport { seedMockData, type EntitySeedConfig } from '../services/DataService.js';\nimport type { FieldSchema } from '../services/MockDataService.js';\n\n/**\n * Creates an Express router with debug endpoints for the server EventBus.\n * Returns a no-op router in production (no routes registered).\n */\nexport function debugEventsRouter(): Router {\n const router = Router();\n\n if (process.env.NODE_ENV !== 'development') {\n return router;\n }\n\n router.get('/event-log', (_req, res) => {\n const limit = parseInt(String(_req.query.limit) || '50', 10);\n const events = getServerEventBus().getRecentEvents(limit);\n res.json({ count: events.length, events });\n });\n\n router.delete('/event-log', (_req, res) => {\n getServerEventBus().clearEventLog();\n res.json({ cleared: true });\n });\n\n router.get('/listeners', (_req, res) => {\n const counts = getServerEventBus().getListenerCounts();\n const total = Object.values(counts).reduce((sum, n) => sum + n, 0);\n res.json({ total, events: counts });\n });\n\n /**\n * POST /seed - Seed MockDataService with entity data from schema.\n *\n * Body: { entities: Array<{ name: string, fields: FieldSchema[], seedCount?: number }> }\n *\n * Used by the orbital-state-viewer to populate mock data on connect.\n */\n router.post('/seed', (req, res) => {\n const { entities } = req.body as {\n entities?: Array<{ name: string; fields: FieldSchema[]; seedCount?: number }>;\n };\n\n if (!entities || !Array.isArray(entities)) {\n res.status(400).json({ error: 'Body must have \"entities\" array' });\n return;\n }\n\n const configs: EntitySeedConfig[] = entities.map((e) => ({\n name: e.name,\n fields: e.fields,\n seedCount: e.seedCount ?? 5,\n }));\n\n seedMockData(configs);\n\n const summary = configs.map((c) => `${c.name}(${c.seedCount})`).join(', ');\n res.json({ seeded: true, summary });\n });\n\n return router;\n}\n","/**\n * WebSocket Event Broadcast - Cross-client event synchronization\n *\n * Broadcasts server-side events to all connected clients via WebSocket.\n * This enables real-time updates across multiple browser clients.\n *\n * @packageDocumentation\n */\n\nimport { WebSocketServer, WebSocket, type RawData } from 'ws';\nimport type { Server, IncomingMessage } from 'http';\nimport { getServerEventBus } from './eventBus.js';\nimport { logger } from './logger.js';\n\n/**\n * Event structure for broadcasting\n */\ninterface BroadcastEvent {\n type: string;\n payload?: unknown;\n timestamp?: number;\n source?: Record<string, unknown>;\n}\n\n/**\n * WebSocket server instance (singleton)\n */\nlet wss: WebSocketServer | null = null;\n\n/**\n * Setup WebSocket server for event broadcasting.\n *\n * Listens to all server events via wildcard and broadcasts to connected clients.\n *\n * @param server - HTTP server to attach WebSocket to\n * @param path - WebSocket endpoint path (default: '/ws/events')\n *\n * @example\n * ```typescript\n * import { createServer } from 'http';\n * import { setupEventBroadcast } from '@/lib/websocket';\n *\n * const server = createServer(app);\n * setupEventBroadcast(server);\n * ```\n */\nexport function setupEventBroadcast(server: Server, path: string = '/ws/events'): WebSocketServer {\n if (wss) {\n logger.warn('[WebSocket] Server already initialized');\n return wss;\n }\n\n wss = new WebSocketServer({ server, path });\n\n logger.info(`[WebSocket] Server listening at ${path}`);\n\n // Handle new connections\n wss.on('connection', (ws: WebSocket, req: IncomingMessage) => {\n const clientId = req.headers['sec-websocket-key'] || 'unknown';\n logger.debug(`[WebSocket] Client connected: ${clientId}`);\n\n // Send welcome message\n ws.send(\n JSON.stringify({\n type: 'CONNECTED',\n timestamp: Date.now(),\n message: 'Connected to event stream',\n })\n );\n\n // Handle client messages (for future bidirectional communication)\n ws.on('message', (data: RawData) => {\n try {\n const message = JSON.parse(data.toString());\n logger.debug(`[WebSocket] Received from ${clientId}:`, message);\n\n // Handle client-to-server events if needed\n if (message.type && message.payload) {\n // Emit to server event bus with client source\n getServerEventBus().emit(message.type, message.payload, {\n orbital: 'client',\n entity: clientId,\n });\n }\n } catch (error) {\n logger.error(`[WebSocket] Failed to parse message:`, error);\n }\n });\n\n ws.on('close', () => {\n logger.debug(`[WebSocket] Client disconnected: ${clientId}`);\n });\n\n ws.on('error', (error: Error) => {\n logger.error(`[WebSocket] Client error:`, error);\n });\n });\n\n // Subscribe to all server events and broadcast to clients\n getServerEventBus().on('*', (event: unknown) => {\n if (!wss) return;\n\n const typedEvent = event as BroadcastEvent;\n const message = JSON.stringify({\n type: typedEvent.type,\n payload: typedEvent.payload,\n timestamp: typedEvent.timestamp,\n source: typedEvent.source,\n });\n\n let broadcastCount = 0;\n wss.clients.forEach((client: WebSocket) => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n broadcastCount++;\n }\n });\n\n if (broadcastCount > 0) {\n logger.debug(`[WebSocket] Broadcast ${typedEvent.type} to ${broadcastCount} client(s)`);\n }\n });\n\n return wss;\n}\n\n/**\n * Get the WebSocket server instance (for testing or advanced usage)\n */\nexport function getWebSocketServer(): WebSocketServer | null {\n return wss;\n}\n\n/**\n * Close the WebSocket server\n */\nexport function closeWebSocketServer(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!wss) {\n resolve();\n return;\n }\n\n wss.close((err?: Error) => {\n if (err) {\n reject(err);\n } else {\n wss = null;\n resolve();\n }\n });\n });\n}\n\n/**\n * Get connected client count\n */\nexport function getConnectedClientCount(): number {\n if (!wss) return 0;\n return wss.clients.size;\n}\n","import { Request, Response, NextFunction } from 'express';\nimport { ZodError } from 'zod';\nimport { logger } from '../lib/logger.js';\n\n/**\n * Base application error class\n */\nexport class AppError extends Error {\n constructor(\n public statusCode: number,\n public message: string,\n public code?: string\n ) {\n super(message);\n this.name = 'AppError';\n }\n}\n\n/**\n * 404 Not Found error\n */\nexport class NotFoundError extends AppError {\n constructor(message: string = 'Resource not found') {\n super(404, message, 'NOT_FOUND');\n }\n}\n\n/**\n * 400 Bad Request / Validation error\n */\nexport class ValidationError extends AppError {\n constructor(message: string = 'Validation failed') {\n super(400, message, 'VALIDATION_ERROR');\n }\n}\n\n/**\n * 401 Unauthorized error\n */\nexport class UnauthorizedError extends AppError {\n constructor(message: string = 'Unauthorized') {\n super(401, message, 'UNAUTHORIZED');\n }\n}\n\n/**\n * 403 Forbidden error\n */\nexport class ForbiddenError extends AppError {\n constructor(message: string = 'Forbidden') {\n super(403, message, 'FORBIDDEN');\n }\n}\n\n/**\n * 409 Conflict error\n */\nexport class ConflictError extends AppError {\n constructor(message: string = 'Resource conflict') {\n super(409, message, 'CONFLICT');\n }\n}\n\n/**\n * Global error handler middleware\n */\nexport const errorHandler = (\n err: Error,\n _req: Request,\n res: Response,\n _next: NextFunction\n): void => {\n logger.error('Error:', { name: err.name, message: err.message, stack: err.stack });\n\n // Zod validation errors\n if (err instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: err.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n\n // Custom application errors\n if (err instanceof AppError) {\n res.status(err.statusCode).json({\n success: false,\n error: err.message,\n code: err.code,\n });\n return;\n }\n\n // Firebase/Firestore errors\n if (err.name === 'FirebaseError' || err.name === 'FirestoreError') {\n res.status(500).json({\n success: false,\n error: 'Database error',\n code: 'DATABASE_ERROR',\n });\n return;\n }\n\n // Unknown errors\n res.status(500).json({\n success: false,\n error: 'Internal server error',\n code: 'INTERNAL_ERROR',\n });\n};\n\n/**\n * Async handler wrapper to catch errors in async route handlers\n */\nexport const asyncHandler =\n (fn: (req: Request, res: Response, next: NextFunction) => Promise<unknown>) =>\n (req: Request, res: Response, next: NextFunction) => {\n Promise.resolve(fn(req, res, next)).catch(next);\n };\n\n/**\n * 404 handler for unmatched routes\n */\nexport const notFoundHandler = (req: Request, res: Response): void => {\n res.status(404).json({\n success: false,\n error: `Route ${req.method} ${req.path} not found`,\n code: 'ROUTE_NOT_FOUND',\n });\n};\n","import { Request, Response, NextFunction } from 'express';\nimport { AnyZodObject, ZodError } from 'zod';\n\n/**\n * Middleware to validate request body against a Zod schema\n */\nexport const validateBody =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.body = await schema.parseAsync(req.body);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n\n/**\n * Middleware to validate request query parameters against a Zod schema\n */\nexport const validateQuery =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.query = await schema.parseAsync(req.query);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Invalid query parameters',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n\n/**\n * Middleware to validate request params against a Zod schema\n */\nexport const validateParams =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.params = await schema.parseAsync(req.params);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Invalid path parameters',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n","import { NextFunction, Request, Response } from 'express';\nimport type { DecodedIdToken } from 'firebase-admin/auth';\nimport { getAuth } from '../lib/db.js';\nimport { env } from '../lib/env.js';\n\nconst BEARER_PREFIX = 'Bearer ';\n\n/** Fake dev user injected when NODE_ENV=development and no auth header is present */\nconst DEV_USER: DecodedIdToken = {\n uid: 'dev-user-001',\n email: 'dev@localhost',\n email_verified: true,\n aud: 'dev-project',\n auth_time: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n iat: Math.floor(Date.now() / 1000),\n iss: 'https://securetoken.google.com/dev-project',\n sub: 'dev-user-001',\n firebase: {\n identities: {},\n sign_in_provider: 'custom',\n },\n};\n\nexport async function authenticateFirebase(req: Request, res: Response, next: NextFunction) {\n const authorization = req.headers.authorization;\n\n // Dev bypass: in development mode, skip auth if no token is provided\n if (env.NODE_ENV === 'development' && (!authorization || !authorization.startsWith(BEARER_PREFIX))) {\n req.firebaseUser = DEV_USER;\n res.locals.firebaseUser = DEV_USER;\n return next();\n }\n\n try {\n if (!authorization || !authorization.startsWith(BEARER_PREFIX)) {\n return res.status(401).json({ error: 'Authorization header missing or malformed' });\n }\n\n const token = authorization.slice(BEARER_PREFIX.length);\n const decodedToken = await getAuth().verifyIdToken(token);\n\n req.firebaseUser = decodedToken;\n res.locals.firebaseUser = decodedToken;\n\n return next();\n } catch (error) {\n console.error('Firebase authentication failed:', error);\n return res.status(401).json({ error: 'Unauthorized' });\n }\n}\n\nexport default authenticateFirebase;\n\n\n","/**\n * Firestore Serialization Utilities\n *\n * Handles the Firestore 20-level depth limit by serializing deeply nested\n * OrbitalSchema fields (orbitals, traits, services) to JSON strings.\n */\n\nimport type { OrbitalSchema } from '@almadar/core';\n\n/**\n * Convert OrbitalSchema to Firestore-safe format.\n *\n * Serializes orbitals, traits, and services to JSON strings to avoid\n * Firestore's 20-level nesting limit.\n */\nexport function toFirestoreFormat(schema: OrbitalSchema): Record<string, unknown> {\n const data = { ...(schema as unknown as Record<string, unknown>) };\n\n // Serialize orbitals array to JSON string\n if (schema.orbitals) {\n data._orbitalsJson = JSON.stringify(schema.orbitals);\n data.orbitalCount = schema.orbitals.length;\n delete data.orbitals;\n }\n\n // Serialize traits array to JSON string (if present at schema level)\n if (data.traits) {\n const traits = data.traits as unknown[];\n data._traitsJson = JSON.stringify(traits);\n data.traitCount = traits.length;\n delete data.traits;\n }\n\n // Serialize services array to JSON string\n if (schema.services) {\n data._servicesJson = JSON.stringify(schema.services);\n data.serviceCount = schema.services.length;\n delete data.services;\n }\n\n return data;\n}\n\n/**\n * Convert Firestore document back to OrbitalSchema.\n *\n * Deserializes JSON strings back to arrays.\n */\nexport function fromFirestoreFormat(data: Record<string, unknown>): OrbitalSchema {\n const result = { ...data };\n\n // Restore orbitals from _orbitalsJson\n if (result._orbitalsJson && typeof result._orbitalsJson === 'string') {\n try {\n result.orbitals = JSON.parse(result._orbitalsJson);\n delete result._orbitalsJson;\n delete result.orbitalCount;\n } catch (e) {\n console.warn('[OrbitalStore] Failed to parse _orbitalsJson:', e);\n result.orbitals = [];\n }\n }\n\n // Restore traits from _traitsJson\n if (result._traitsJson && typeof result._traitsJson === 'string') {\n try {\n result.traits = JSON.parse(result._traitsJson);\n delete result._traitsJson;\n delete result.traitCount;\n } catch (e) {\n console.warn('[OrbitalStore] Failed to parse _traitsJson:', e);\n }\n }\n\n // Restore services from _servicesJson\n if (result._servicesJson && typeof result._servicesJson === 'string') {\n try {\n result.services = JSON.parse(result._servicesJson);\n delete result._servicesJson;\n delete result.serviceCount;\n } catch (e) {\n console.warn('[OrbitalStore] Failed to parse _servicesJson:', e);\n }\n }\n\n return result as unknown as OrbitalSchema;\n}\n","/**\n * SchemaProtectionService - Detects destructive schema changes\n *\n * Uses real diff functions from @almadar/core to detect and categorize\n * removals, page content reductions, and other destructive changes.\n */\n\nimport type { OrbitalSchema, CategorizedRemovals, PageContentReduction } from '@almadar/core';\nimport {\n diffSchemas,\n isDestructiveChange,\n categorizeRemovals,\n requiresConfirmation,\n detectPageContentReduction,\n hasSignificantPageReduction,\n} from '@almadar/core';\n\nexport class SchemaProtectionService {\n /**\n * Compare two schemas and detect destructive changes.\n *\n * Returns categorized removals including page content reductions.\n */\n compareSchemas(\n before: OrbitalSchema,\n after: OrbitalSchema,\n ): {\n isDestructive: boolean;\n removals: CategorizedRemovals;\n } {\n const changeSet = diffSchemas(before, after);\n const removals = categorizeRemovals(changeSet);\n\n // Detect page content reductions (implicit removals)\n const beforePages = before.orbitals?.flatMap((o) => o.pages || []) || [];\n const afterPages = after.orbitals?.flatMap((o) => o.pages || []) || [];\n const pageContentReductions = detectPageContentReduction(beforePages, afterPages);\n removals.pageContentReductions = pageContentReductions;\n\n const isDestructive =\n isDestructiveChange(changeSet) ||\n hasSignificantPageReduction(pageContentReductions);\n\n return { isDestructive, removals };\n }\n\n /** Check if critical removals require confirmation */\n requiresConfirmation(removals: CategorizedRemovals): boolean {\n return requiresConfirmation(removals);\n }\n\n /** Check for significant page content reductions */\n hasSignificantContentReduction(reductions: PageContentReduction[]): boolean {\n return hasSignificantPageReduction(reductions);\n }\n}\n","/**\n * SchemaStore - Firestore CRUD for OrbitalSchema documents\n *\n * Handles schema get/save/create/delete/list with caching\n * and Firestore serialization.\n */\n\nimport type { OrbitalSchema, StatsView, AppSummary, SaveOptions, SaveResult } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\nimport { toFirestoreFormat, fromFirestoreFormat } from './firestoreFormat.js';\nimport { SchemaProtectionService } from './SchemaProtectionService.js';\nimport type { SnapshotStore } from './SnapshotStore.js';\n\nconst SCHEMA_CACHE_TTL_MS = 60_000;\nconst LIST_CACHE_TTL_MS = 30_000;\n\nexport class SchemaStore {\n private appsCollection: string;\n private schemaCache = new Map<string, { schema: OrbitalSchema; timestamp: number }>();\n private listCache = new Map<string, { apps: AppSummary[]; timestamp: number }>();\n private protectionService = new SchemaProtectionService();\n private snapshotStore: SnapshotStore | null = null;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n /** Set snapshot store for auto-snapshot on destructive saves */\n setSnapshotStore(store: SnapshotStore): void {\n this.snapshotStore = store;\n }\n\n /** Get a schema by app ID */\n async get(uid: string, appId: string): Promise<OrbitalSchema | null> {\n const cacheKey = `${uid}:${appId}`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < SCHEMA_CACHE_TTL_MS) {\n return cached.schema;\n }\n\n try {\n const db = getFirestore();\n const appDoc = await db.doc(`users/${uid}/${this.appsCollection}/${appId}`).get();\n\n if (!appDoc.exists) return null;\n\n const data = appDoc.data() as Record<string, unknown>;\n const hasOrbitals = data.orbitals || data._orbitalsJson;\n if (!data.name || !hasOrbitals) return null;\n\n const schema = fromFirestoreFormat(data);\n this.schemaCache.set(cacheKey, { schema, timestamp: Date.now() });\n return schema;\n } catch (error) {\n console.error('[SchemaStore] Error fetching schema:', error);\n return null;\n }\n }\n\n /**\n * Save a schema (create or full replace).\n *\n * Features:\n * - Detects destructive changes (removals)\n * - Requires confirmation for critical removals\n * - Auto-creates snapshots before destructive changes (if SnapshotStore attached)\n */\n async save(\n uid: string,\n appId: string,\n schema: OrbitalSchema,\n options: SaveOptions = {},\n ): Promise<SaveResult> {\n try {\n const existingSchema = await this.get(uid, appId);\n let snapshotId: string | undefined;\n\n // Create snapshot if snapshotReason provided\n if (existingSchema && options.snapshotReason && this.snapshotStore) {\n snapshotId = await this.snapshotStore.create(uid, appId, existingSchema, options.snapshotReason);\n }\n\n // Check for destructive changes (unless skipProtection)\n if (existingSchema && !options.skipProtection) {\n const comparison = this.protectionService.compareSchemas(existingSchema, schema);\n\n if (comparison.isDestructive) {\n const { removals } = comparison;\n const hasCriticalRemovals = this.protectionService.requiresConfirmation(removals);\n const hasContentReductions = this.protectionService.hasSignificantContentReduction(\n removals.pageContentReductions,\n );\n\n if ((hasCriticalRemovals || hasContentReductions) && !options.confirmRemovals) {\n return {\n success: false,\n requiresConfirmation: true,\n removals: comparison.removals,\n error: hasContentReductions\n ? 'Page content reduction detected - confirmation required'\n : 'Confirmation required for critical removals',\n };\n }\n\n // Auto-snapshot before destructive change\n if (\n !snapshotId &&\n this.snapshotStore &&\n (removals.critical.length > 0 || removals.pageContentReductions.length > 0)\n ) {\n snapshotId = await this.snapshotStore.create(\n uid,\n appId,\n existingSchema,\n `auto_before_removal_${Date.now()}`,\n );\n }\n }\n }\n\n const firestoreData = toFirestoreFormat(schema);\n const now = Date.now();\n const docData = {\n ...firestoreData,\n _metadata: {\n version: options.expectedVersion ? options.expectedVersion + 1 : 1,\n updatedAt: now,\n createdAt: existingSchema ? undefined : now,\n source: options.source || 'manual',\n },\n };\n\n const db = getFirestore();\n await db.doc(`users/${uid}/${this.appsCollection}/${appId}`).set(docData, { merge: true });\n\n this.invalidateCache(uid, appId);\n return { success: true, snapshotId };\n } catch (error) {\n console.error('[SchemaStore] Error saving schema:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /** Create a new app with initial schema */\n async create(\n uid: string,\n metadata: { name: string; description?: string },\n ): Promise<{ appId: string; schema: OrbitalSchema }> {\n const appId = `app-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const now = Date.now();\n\n const schema: OrbitalSchema = {\n name: metadata.name,\n description: metadata.description,\n orbitals: [],\n };\n\n const firestoreData = toFirestoreFormat(schema);\n const docData = {\n ...firestoreData,\n _metadata: { version: 1, createdAt: now, updatedAt: now, source: 'manual' as const },\n };\n\n const db = getFirestore();\n await db.doc(`users/${uid}/${this.appsCollection}/${appId}`).set(docData);\n this.listCache.delete(uid);\n\n return { appId, schema };\n }\n\n /** Delete an app */\n async delete(uid: string, appId: string): Promise<boolean> {\n try {\n const db = getFirestore();\n const ref = db.doc(`users/${uid}/${this.appsCollection}/${appId}`);\n const doc = await ref.get();\n if (!doc.exists) return false;\n\n await ref.delete();\n this.invalidateCache(uid, appId);\n return true;\n } catch (error) {\n console.error('[SchemaStore] Error deleting app:', error);\n return false;\n }\n }\n\n /** List all apps for a user */\n async list(uid: string): Promise<AppSummary[]> {\n const cached = this.listCache.get(uid);\n if (cached && Date.now() - cached.timestamp < LIST_CACHE_TTL_MS) {\n return cached.apps;\n }\n\n try {\n const db = getFirestore();\n const snapshot = await db\n .collection(`users/${uid}/${this.appsCollection}`)\n .select('name', 'description', 'domainContext', '_metadata', 'orbitalCount', 'traitCount')\n .orderBy('_metadata.updatedAt', 'desc')\n .get();\n\n const apps: AppSummary[] = snapshot.docs.map((doc) => {\n const data = doc.data();\n const metadata = data._metadata as { version?: number; createdAt?: number; updatedAt?: number } | undefined;\n const orbitalCount = data.orbitalCount as number | undefined;\n\n return {\n id: doc.id,\n name: (data.name as string) || 'Untitled',\n description: data.description as string | undefined,\n updatedAt: metadata?.updatedAt || Date.now(),\n createdAt: metadata?.createdAt || Date.now(),\n stats: { entities: orbitalCount ?? 0, pages: 0, states: 0, events: 0, transitions: 0 },\n domainContext: data.domainContext as string | undefined,\n hasValidationErrors: false,\n };\n });\n\n this.listCache.set(uid, { apps, timestamp: Date.now() });\n return apps;\n } catch (error) {\n console.error('[SchemaStore] Error listing apps:', error);\n return [];\n }\n }\n\n /** Compute stats from OrbitalSchema */\n computeStats(schema: OrbitalSchema): StatsView {\n const orbitals = schema.orbitals || [];\n const entities = orbitals.length;\n const pages = orbitals.reduce((n, o) => n + (o.pages?.length || 0), 0);\n\n const allTraits = [\n ...((schema as unknown as Record<string, unknown>).traits as unknown[] || []),\n ...orbitals.flatMap((o) =>\n (o.traits || []).filter((t) => typeof t !== 'string' && 'stateMachine' in t),\n ),\n ] as Array<{ stateMachine?: { states?: unknown[]; events?: unknown[]; transitions?: unknown[] } }>;\n\n return {\n states: allTraits.flatMap((t) => t.stateMachine?.states || []).length,\n events: allTraits.flatMap((t) => t.stateMachine?.events || []).length,\n pages,\n entities,\n transitions: allTraits.flatMap((t) => t.stateMachine?.transitions || []).length,\n };\n }\n\n /** Invalidate caches for a specific app */\n invalidateCache(uid: string, appId: string): void {\n this.schemaCache.delete(`${uid}:${appId}`);\n this.listCache.delete(uid);\n }\n\n /** Clear all caches */\n clearCaches(): void {\n this.schemaCache.clear();\n this.listCache.clear();\n }\n\n /** Get the collection path for an app */\n getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Expose apps collection name for subcollection stores */\n getAppsCollection(): string {\n return this.appsCollection;\n }\n}\n","/**\n * SnapshotStore - Firestore CRUD for schema snapshots\n *\n * Snapshots are full copies of the schema at a point in time,\n * stored in subcollection: users/{uid}/apps/{appId}/snapshots/{snapshotId}\n */\n\nimport type { OrbitalSchema, SnapshotDocument, HistoryMeta } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\nimport { toFirestoreFormat, fromFirestoreFormat } from './firestoreFormat.js';\n\nconst SNAPSHOTS_COLLECTION = 'snapshots';\n\nexport class SnapshotStore {\n private appsCollection: string;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n private getCollectionPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}/${SNAPSHOTS_COLLECTION}`;\n }\n\n private getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Create a snapshot of the current schema */\n async create(\n uid: string,\n appId: string,\n schema: OrbitalSchema,\n reason: string,\n ): Promise<string> {\n const db = getFirestore();\n const snapshotId = `snapshot_${Date.now()}`;\n\n const snapshotDoc: SnapshotDocument = {\n id: snapshotId,\n timestamp: Date.now(),\n schema: toFirestoreFormat(schema),\n reason,\n };\n\n await db.doc(`${this.getCollectionPath(uid, appId)}/${snapshotId}`).set(snapshotDoc);\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n const updatedMeta: HistoryMeta = {\n latestSnapshotId: snapshotId,\n latestChangeSetId: currentMeta?.latestChangeSetId,\n snapshotCount: (currentMeta?.snapshotCount || 0) + 1,\n changeSetCount: currentMeta?.changeSetCount || 0,\n };\n\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n return snapshotId;\n }\n\n /** Get all snapshots for an app (ordered by timestamp desc) */\n async getAll(uid: string, appId: string): Promise<SnapshotDocument[]> {\n const db = getFirestore();\n const query = await db\n .collection(this.getCollectionPath(uid, appId))\n .orderBy('timestamp', 'desc')\n .get();\n\n return query.docs.map((doc) => doc.data() as SnapshotDocument);\n }\n\n /** Get a specific snapshot by ID */\n async get(uid: string, appId: string, snapshotId: string): Promise<SnapshotDocument | null> {\n const db = getFirestore();\n const doc = await db.doc(`${this.getCollectionPath(uid, appId)}/${snapshotId}`).get();\n if (!doc.exists) return null;\n return doc.data() as SnapshotDocument;\n }\n\n /** Delete a snapshot */\n async delete(uid: string, appId: string, snapshotId: string): Promise<boolean> {\n const db = getFirestore();\n const ref = db.doc(`${this.getCollectionPath(uid, appId)}/${snapshotId}`);\n const doc = await ref.get();\n if (!doc.exists) return false;\n\n await ref.delete();\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n if (currentMeta) {\n const updatedMeta: HistoryMeta = {\n ...currentMeta,\n snapshotCount: Math.max(0, (currentMeta.snapshotCount || 1) - 1),\n latestSnapshotId:\n currentMeta.latestSnapshotId === snapshotId ? undefined : currentMeta.latestSnapshotId,\n };\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n }\n\n return true;\n }\n\n /** Get schema snapshot at a specific version */\n async getByVersion(uid: string, appId: string, version: number): Promise<OrbitalSchema | null> {\n const db = getFirestore();\n const query = await db\n .collection(this.getCollectionPath(uid, appId))\n .where('version', '==', version)\n .limit(1)\n .get();\n\n if (query.empty) return null;\n const snapshot = query.docs[0].data() as SnapshotDocument;\n return fromFirestoreFormat(snapshot.schema as Record<string, unknown>);\n }\n\n /** Get the schema from a snapshot (deserialized) */\n getSchemaFromSnapshot(snapshot: SnapshotDocument): OrbitalSchema {\n return fromFirestoreFormat(snapshot.schema as Record<string, unknown>);\n }\n}\n","/**\n * ChangeSetStore - Firestore CRUD for schema changesets\n *\n * Changesets track changes made to the schema over time,\n * stored in subcollection: users/{uid}/apps/{appId}/changesets/{changeSetId}\n */\n\nimport type { ChangeSetDocument, HistoryMeta } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\n\nconst CHANGESETS_COLLECTION = 'changesets';\n\nexport class ChangeSetStore {\n private appsCollection: string;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n private getCollectionPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}/${CHANGESETS_COLLECTION}`;\n }\n\n private getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Append a changeset to history */\n async append(uid: string, appId: string, changeSet: ChangeSetDocument): Promise<void> {\n const db = getFirestore();\n\n await db.doc(`${this.getCollectionPath(uid, appId)}/${changeSet.id}`).set(changeSet);\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n const updatedMeta: HistoryMeta = {\n latestSnapshotId: currentMeta?.latestSnapshotId,\n latestChangeSetId: changeSet.id,\n snapshotCount: currentMeta?.snapshotCount || 0,\n changeSetCount: (currentMeta?.changeSetCount || 0) + 1,\n };\n\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n }\n\n /** Get change history for an app (ordered by version desc) */\n async getHistory(uid: string, appId: string): Promise<ChangeSetDocument[]> {\n try {\n const db = getFirestore();\n const query = await db\n .collection(this.getCollectionPath(uid, appId))\n .orderBy('version', 'desc')\n .get();\n\n return query.docs.map((doc) => doc.data() as ChangeSetDocument);\n } catch (error) {\n console.error('[ChangeSetStore] Error getting change history:', error);\n return [];\n }\n }\n\n /** Get a specific changeset by ID */\n async get(uid: string, appId: string, changeSetId: string): Promise<ChangeSetDocument | null> {\n const db = getFirestore();\n const doc = await db.doc(`${this.getCollectionPath(uid, appId)}/${changeSetId}`).get();\n if (!doc.exists) return null;\n return doc.data() as ChangeSetDocument;\n }\n\n /** Update a changeset's status */\n async updateStatus(\n uid: string,\n appId: string,\n changeSetId: string,\n status: 'applied' | 'reverted' | 'pending',\n ): Promise<void> {\n const db = getFirestore();\n const ref = db.doc(`${this.getCollectionPath(uid, appId)}/${changeSetId}`);\n const doc = await ref.get();\n if (!doc.exists) return;\n await ref.update({ status });\n }\n\n /** Delete a changeset */\n async delete(uid: string, appId: string, changeSetId: string): Promise<boolean> {\n const db = getFirestore();\n const ref = db.doc(`${this.getCollectionPath(uid, appId)}/${changeSetId}`);\n const doc = await ref.get();\n if (!doc.exists) return false;\n\n await ref.delete();\n\n // Update history metadata\n const appDocRef = db.doc(this.getAppDocPath(uid, appId));\n const appDoc = await appDocRef.get();\n const currentMeta = appDoc.data()?._historyMeta as HistoryMeta | undefined;\n\n if (currentMeta) {\n const updatedMeta: HistoryMeta = {\n ...currentMeta,\n changeSetCount: Math.max(0, (currentMeta.changeSetCount || 1) - 1),\n latestChangeSetId:\n currentMeta.latestChangeSetId === changeSetId ? undefined : currentMeta.latestChangeSetId,\n };\n await appDocRef.set({ _historyMeta: updatedMeta }, { merge: true });\n }\n\n return true;\n }\n}\n","/**\n * ValidationStore - Firestore CRUD for validation results\n *\n * Validation results stored at: users/{uid}/apps/{appId}/validation/current\n */\n\nimport type { ValidationResults, ValidationMeta } from '@almadar/core';\nimport { getFirestore } from '../lib/db.js';\n\nconst VALIDATION_COLLECTION = 'validation';\nconst VALIDATION_DOC_ID = 'current';\n\nexport class ValidationStore {\n private appsCollection: string;\n\n constructor(appsCollection = 'apps') {\n this.appsCollection = appsCollection;\n }\n\n private getDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}/${VALIDATION_COLLECTION}/${VALIDATION_DOC_ID}`;\n }\n\n private getAppDocPath(uid: string, appId: string): string {\n return `users/${uid}/${this.appsCollection}/${appId}`;\n }\n\n /** Save validation results */\n async save(uid: string, appId: string, results: ValidationResults): Promise<void> {\n const db = getFirestore();\n\n await db.doc(this.getDocPath(uid, appId)).set(results);\n\n // Update validation metadata in main document\n const validationMeta: ValidationMeta = {\n errorCount: results.errors?.length || 0,\n warningCount: results.warnings?.length || 0,\n validatedAt: results.validatedAt,\n };\n\n await db.doc(this.getAppDocPath(uid, appId)).set(\n { _operational: { validationMeta } },\n { merge: true },\n );\n }\n\n /** Get validation results */\n async get(uid: string, appId: string): Promise<ValidationResults | null> {\n try {\n const db = getFirestore();\n const doc = await db.doc(this.getDocPath(uid, appId)).get();\n if (!doc.exists) return null;\n return doc.data() as ValidationResults;\n } catch (error) {\n console.error('[ValidationStore] Error getting validation results:', error);\n return null;\n }\n }\n\n /** Clear validation results */\n async clear(uid: string, appId: string): Promise<void> {\n const db = getFirestore();\n const { FieldValue } = await import('firebase-admin/firestore');\n\n await db.doc(this.getDocPath(uid, appId)).delete();\n\n await db.doc(this.getAppDocPath(uid, appId)).update({\n '_operational.validationMeta': FieldValue.delete(),\n });\n }\n}\n","/**\n * Memory Manager Singleton\n *\n * Provides Firestore-backed memory management for DeepAgent.\n *\n * @packageDocumentation\n */\n\nimport { MemoryManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\n\nlet memoryManager: MemoryManager | null = null;\n\n/**\n * Get or create the MemoryManager singleton\n */\nexport function getMemoryManager(): MemoryManager {\n if (!memoryManager) {\n memoryManager = new MemoryManager({\n db,\n usersCollection: 'agent_memory_users',\n projectsCollection: 'agent_memory_projects',\n generationsCollection: 'agent_memory_generations',\n patternsCollection: 'agent_memory_patterns',\n interruptsCollection: 'agent_memory_interrupts',\n feedbackCollection: 'agent_memory_feedback',\n checkpointsCollection: 'agent_memory_checkpoints',\n toolPreferencesCollection: 'agent_memory_tool_preferences',\n });\n }\n return memoryManager;\n}\n\n/**\n * Reset the MemoryManager (useful for testing)\n */\nexport function resetMemoryManager(): void {\n memoryManager = null;\n}\n","/**\n * Session Manager Singleton\n *\n * Provides Firestore-backed session management with full GAP features.\n *\n * @packageDocumentation\n */\n\nimport { SessionManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\nimport { getMemoryManager } from './memory.js';\nimport type { FirestoreDb } from '@almadar/agent';\n\nlet sessionManager: SessionManager | null = null;\n\n/**\n * Adapter to make Firebase Firestore compatible with @almadar/agent FirestoreDb interface\n */\nfunction createFirestoreAdapter(firestore: typeof db): FirestoreDb {\n return firestore as unknown as FirestoreDb;\n}\n\n/**\n * Get or create the SessionManager singleton\n */\nexport function getSessionManager(): SessionManager {\n if (!sessionManager) {\n sessionManager = new SessionManager({\n mode: 'firestore',\n firestoreDb: createFirestoreAdapter(db),\n memoryManager: getMemoryManager(), // Enable GAP-002D\n compactionConfig: {\n maxTokens: 150000,\n keepRecentMessages: 10,\n strategy: 'last',\n },\n });\n }\n return sessionManager;\n}\n\n/**\n * Reset the SessionManager (useful for testing)\n */\nexport function resetSessionManager(): void {\n sessionManager = null;\n}\n","/**\n * Skill Agent Factory\n *\n * Creates DeepAgent instances with full GAP feature integration.\n *\n * @packageDocumentation\n */\n\nimport {\n createSkillAgent,\n getObservabilityCollector,\n getMultiUserManager,\n createWorkflowToolWrapper,\n type SkillAgentOptions,\n type SkillAgentResult,\n} from '@almadar/agent';\nimport { getMemoryManager } from './memory.js';\nimport { getSessionManager } from './session.js';\n\ninterface ServerSkillAgentOptions extends SkillAgentOptions {\n /** User ID from Firebase Auth */\n userId: string;\n /** App/Project ID for context */\n appId?: string;\n}\n\n/**\n * Create a skill agent with full server-side GAP integration\n */\nexport async function createServerSkillAgent(\n options: ServerSkillAgentOptions,\n): Promise<SkillAgentResult> {\n const memoryManager = getMemoryManager();\n const sessionManager = getSessionManager();\n const observability = getObservabilityCollector();\n const multiUser = getMultiUserManager();\n\n // Check access if resuming existing session\n if (options.threadId) {\n const access = multiUser.canAccessSession(options.threadId, {\n userId: options.userId,\n roles: ['user'],\n });\n if (!access.allowed) {\n throw new Error(`Access denied: ${access.reason}`);\n }\n }\n\n // Start observability\n observability.startSession(options.threadId ?? 'new', options.userId);\n\n // Create workflow tool wrapper for retry/telemetry (always enabled)\n const workflowToolWrapper = createWorkflowToolWrapper({\n maxRetries: 2,\n enableTelemetry: true,\n timeoutMs: 300000, // 5 minutes\n });\n\n try {\n const result = await createSkillAgent({\n ...options,\n memoryManager, // GAP-001: Enable memory\n userId: options.userId, // GAP-002D: Session → Memory sync\n appId: options.appId,\n toolWrapper: workflowToolWrapper.wrap, // Always use workflow wrapper for reliability\n });\n\n // Assign ownership for new sessions\n if (result.threadId) {\n multiUser.assignSessionOwnership(result.threadId, options.userId);\n }\n\n // Record successful creation\n observability.recordEvent({\n type: 'session_start',\n sessionId: result.threadId,\n userId: options.userId,\n payload: { skill: options.skill },\n });\n\n return result;\n } catch (error) {\n observability.recordError(options.threadId ?? 'new', error as Error);\n throw error;\n }\n}\n\n// Re-export for convenience\nexport { getMemoryManager, getSessionManager };\n","/**\n * Multi-User Middleware\n *\n * Provides user isolation and session ownership using Firebase Auth.\n *\n * @packageDocumentation\n */\n\nimport { getMultiUserManager, createUserContext } from '@almadar/agent';\nimport { getAuth } from '../lib/db.js';\nimport type { Request, Response, NextFunction } from 'express';\n\n// Extend Express Request to include Firebase user\ndeclare global {\n namespace Express {\n interface Request {\n user?: {\n uid: string;\n email?: string;\n roles?: string[];\n orgId?: string;\n };\n userContext?: {\n userId: string;\n orgId?: string;\n roles?: string[];\n };\n }\n }\n}\n\n/**\n * Middleware to set up user context from Firebase Auth\n */\nexport async function multiUserMiddleware(\n req: Request,\n res: Response,\n next: NextFunction,\n): Promise<void> {\n const userId = req.user?.uid;\n\n if (!userId) {\n res.status(401).json({ error: 'Authentication required' });\n return;\n }\n\n // Create user context\n req.userContext = createUserContext(userId, {\n orgId: req.user?.orgId,\n roles: req.user?.roles ?? ['user'],\n });\n\n // Assign session ownership when creating new sessions\n const originalJson = res.json.bind(res);\n res.json = (body: unknown) => {\n if (body && typeof body === 'object' && 'threadId' in body) {\n const multiUser = getMultiUserManager();\n multiUser.assignSessionOwnership(\n (body as { threadId: string }).threadId,\n userId,\n );\n }\n return originalJson(body);\n };\n\n next();\n}\n\n/**\n * Verify Firebase Auth token from Authorization header\n */\nexport async function verifyFirebaseAuth(\n req: Request,\n res: Response,\n next: NextFunction,\n): Promise<void> {\n const authHeader = req.headers.authorization;\n\n if (!authHeader?.startsWith('Bearer ')) {\n res.status(401).json({ error: 'No token provided' });\n return;\n }\n\n const token = authHeader.split('Bearer ')[1];\n\n try {\n const decodedToken = await getAuth().verifyIdToken(token);\n\n // Get custom claims for roles/org\n const user = await getAuth().getUser(decodedToken.uid);\n\n req.user = {\n uid: decodedToken.uid,\n email: decodedToken.email,\n roles: (user.customClaims?.roles as string[]) ?? ['user'],\n orgId: user.customClaims?.orgId as string,\n };\n\n next();\n } catch (error) {\n console.error('Token verification failed:', error);\n res.status(401).json({ error: 'Invalid token' });\n }\n}\n","/**\n * State Sync WebSocket Handler\n *\n * Provides real-time state synchronization using Socket.IO.\n *\n * @packageDocumentation\n */\n\nimport { getStateSyncManager } from '@almadar/agent';\nimport { getMultiUserManager } from '@almadar/agent';\nimport { getAuth } from '../lib/db.js';\n\n// Type definitions for Socket.IO (to avoid dependency)\ninterface Socket {\n data: { user: { uid: string; roles: string[]; orgId?: string } };\n handshake: { auth: { token: string; clientId: string } };\n join: (room: string) => void;\n leave: (room: string) => void;\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n emit: (event: string, ...args: unknown[]) => void;\n to: (room: string) => { emit: (event: string, ...args: unknown[]) => void };\n}\n\ninterface SocketServer {\n use: (middleware: (socket: Socket, next: (err?: Error) => void) => void) => void;\n on: (event: string, handler: (socket: Socket) => void) => void;\n}\n\n/**\n * Set up state sync WebSocket with Firebase Auth\n */\nexport function setupStateSyncWebSocket(io: SocketServer): void {\n const stateSync = getStateSyncManager();\n\n // Firebase Auth middleware for Socket.IO\n io.use(async (socket, next) => {\n try {\n const token = socket.handshake.auth.token as string;\n if (!token) {\n return next(new Error('Authentication required'));\n }\n\n const decodedToken = await getAuth().verifyIdToken(token);\n const user = await getAuth().getUser(decodedToken.uid);\n\n socket.data.user = {\n uid: decodedToken.uid,\n roles: (user.customClaims?.roles as string[]) ?? ['user'],\n orgId: user.customClaims?.orgId as string,\n };\n\n next();\n } catch (error) {\n console.error('Socket auth failed:', error);\n next(new Error('Invalid token'));\n }\n });\n\n io.on('connection', (socket: Socket) => {\n const userId = socket.data.user.uid;\n const clientId = socket.handshake.auth.clientId;\n\n console.log(`[StateSync] Client ${clientId} connected for user ${userId}`);\n\n // Update client ID in sync manager\n stateSync.updateConfig({ clientId });\n\n // Join user's room for targeted updates\n socket.join(`user:${userId}`);\n\n // Listen for state changes from client\n socket.on('stateChange', (...args: unknown[]) => {\n const event = args[0] as { threadId: string };\n \n // Verify ownership\n const multiUser = getMultiUserManager();\n if (!multiUser.isSessionOwner(event.threadId, userId)) {\n socket.emit('error', { message: 'Not session owner' });\n return;\n }\n\n // Process through sync manager\n stateSync.receiveRemoteChange(event as unknown as import('@almadar/agent').StateChangeEvent);\n\n // Broadcast to other clients of same user\n socket.to(`user:${userId}`).emit('remoteChange', event);\n });\n\n // Handle sync required events from agent\n stateSync.on('syncRequired', (changes: unknown[]) => {\n socket.emit('syncBatch', changes);\n });\n\n socket.on('disconnect', () => {\n console.log(`[StateSync] Client ${clientId} disconnected`);\n socket.leave(`user:${userId}`);\n });\n });\n}\n","/**\n * Service Discovery — Registry for service orbital instances\n *\n * Enables distributed event routing by tracking which services are running,\n * what events they emit/listen for, and where they can be reached.\n *\n * Supports:\n * - In-memory registry (default, single-process)\n * - Registration/deregistration with heartbeat\n * - Event routing: find services that listen for a given event\n * - Health tracking via TTL-based expiry\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Service registration record */\nexport interface ServiceRegistration {\n /** Service name (from .orb schema name) */\n name: string;\n /** Unique instance ID */\n instanceId: string;\n /** Host where the service is running */\n host: string;\n /** Port number */\n port: number;\n /** Hash of the .orb schema for version tracking */\n orbHash: string;\n /** Events this service emits */\n emits: string[];\n /** Events this service listens for */\n listens: string[];\n /** Registration timestamp */\n registeredAt: number;\n /** Last heartbeat timestamp */\n lastHeartbeat: number;\n /** Service status */\n status: 'starting' | 'ready' | 'degraded' | 'stopping';\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Options for the service registry */\nexport interface ServiceRegistryOptions {\n /** TTL for service registrations in ms (default: 60000) */\n heartbeatTtlMs?: number;\n /** Cleanup interval for expired registrations (default: 30000) */\n cleanupIntervalMs?: number;\n}\n\n/** Service registry interface for pluggable backends */\nexport interface IServiceRegistry {\n /** Register a service */\n register(service: ServiceRegistration): Promise<void>;\n /** Deregister a service */\n deregister(instanceId: string): Promise<void>;\n /** Update heartbeat for a service */\n heartbeat(instanceId: string): Promise<void>;\n /** Update service status */\n updateStatus(instanceId: string, status: ServiceRegistration['status']): Promise<void>;\n /** Get all registered services */\n getAll(): Promise<ServiceRegistration[]>;\n /** Get services by name */\n getByName(name: string): Promise<ServiceRegistration[]>;\n /** Find services that listen for a given event */\n findListeners(event: string): Promise<ServiceRegistration[]>;\n /** Find services that emit a given event */\n findEmitters(event: string): Promise<ServiceRegistration[]>;\n /** Remove expired registrations */\n cleanup(ttlMs: number): Promise<number>;\n}\n\n// ============================================================================\n// InMemoryServiceRegistry\n// ============================================================================\n\n/**\n * In-memory service registry for single-process and development mode.\n */\nexport class InMemoryServiceRegistry implements IServiceRegistry {\n private services: Map<string, ServiceRegistration> = new Map();\n\n async register(service: ServiceRegistration): Promise<void> {\n this.services.set(service.instanceId, {\n ...service,\n registeredAt: Date.now(),\n lastHeartbeat: Date.now(),\n });\n }\n\n async deregister(instanceId: string): Promise<void> {\n this.services.delete(instanceId);\n }\n\n async heartbeat(instanceId: string): Promise<void> {\n const service = this.services.get(instanceId);\n if (service) {\n service.lastHeartbeat = Date.now();\n }\n }\n\n async updateStatus(instanceId: string, status: ServiceRegistration['status']): Promise<void> {\n const service = this.services.get(instanceId);\n if (service) {\n service.status = status;\n }\n }\n\n async getAll(): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values());\n }\n\n async getByName(name: string): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values()).filter(s => s.name === name);\n }\n\n async findListeners(event: string): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values()).filter(\n s => s.listens.includes(event) && s.status !== 'stopping',\n );\n }\n\n async findEmitters(event: string): Promise<ServiceRegistration[]> {\n return Array.from(this.services.values()).filter(\n s => s.emits.includes(event) && s.status !== 'stopping',\n );\n }\n\n async cleanup(ttlMs: number): Promise<number> {\n const cutoff = Date.now() - ttlMs;\n let removed = 0;\n for (const [id, service] of this.services) {\n if (service.lastHeartbeat < cutoff) {\n this.services.delete(id);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================================\n// ServiceDiscovery (High-Level API)\n// ============================================================================\n\n/**\n * Service discovery manager that wraps a registry backend.\n *\n * Usage:\n * ```typescript\n * const discovery = new ServiceDiscovery();\n * discovery.startCleanup();\n *\n * // Register a service\n * await discovery.register({\n * name: 'LLMService',\n * instanceId: 'llm-001',\n * host: 'localhost',\n * port: 3001,\n * orbHash: 'abc123',\n * emits: ['LLM_RESPONSE', 'LLM_READY'],\n * listens: ['AGENT_LLM_REQUEST'],\n * });\n *\n * // Find who can handle an event\n * const listeners = await discovery.findListeners('AGENT_LLM_REQUEST');\n * ```\n */\nexport class ServiceDiscovery {\n private registry: IServiceRegistry;\n private options: Required<ServiceRegistryOptions>;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options?: ServiceRegistryOptions, registry?: IServiceRegistry) {\n this.options = {\n heartbeatTtlMs: options?.heartbeatTtlMs ?? 60000,\n cleanupIntervalMs: options?.cleanupIntervalMs ?? 30000,\n };\n this.registry = registry ?? new InMemoryServiceRegistry();\n }\n\n /**\n * Register a service with the registry.\n */\n async register(service: Omit<ServiceRegistration, 'registeredAt' | 'lastHeartbeat' | 'status'> & { status?: ServiceRegistration['status'] }): Promise<void> {\n await this.registry.register({\n ...service,\n status: service.status ?? 'starting',\n registeredAt: Date.now(),\n lastHeartbeat: Date.now(),\n });\n }\n\n /**\n * Deregister a service.\n */\n async deregister(instanceId: string): Promise<void> {\n await this.registry.deregister(instanceId);\n }\n\n /**\n * Send heartbeat for a service.\n */\n async heartbeat(instanceId: string): Promise<void> {\n await this.registry.heartbeat(instanceId);\n }\n\n /**\n * Mark a service as ready.\n */\n async markReady(instanceId: string): Promise<void> {\n await this.registry.updateStatus(instanceId, 'ready');\n }\n\n /**\n * Mark a service as degraded.\n */\n async markDegraded(instanceId: string): Promise<void> {\n await this.registry.updateStatus(instanceId, 'degraded');\n }\n\n /**\n * Find all services that listen for a given event.\n */\n async findListeners(event: string): Promise<ServiceRegistration[]> {\n return this.registry.findListeners(event);\n }\n\n /**\n * Find all services that emit a given event.\n */\n async findEmitters(event: string): Promise<ServiceRegistration[]> {\n return this.registry.findEmitters(event);\n }\n\n /**\n * Get all registered services.\n */\n async getAll(): Promise<ServiceRegistration[]> {\n return this.registry.getAll();\n }\n\n /**\n * Get the full event topology (who emits what, who listens for what).\n */\n async getEventTopology(): Promise<{\n events: Array<{\n event: string;\n emitters: string[];\n listeners: string[];\n }>;\n }> {\n const services = await this.registry.getAll();\n const eventMap = new Map<string, { emitters: Set<string>; listeners: Set<string> }>();\n\n for (const service of services) {\n for (const event of service.emits) {\n if (!eventMap.has(event)) eventMap.set(event, { emitters: new Set(), listeners: new Set() });\n eventMap.get(event)!.emitters.add(service.name);\n }\n for (const event of service.listens) {\n if (!eventMap.has(event)) eventMap.set(event, { emitters: new Set(), listeners: new Set() });\n eventMap.get(event)!.listeners.add(service.name);\n }\n }\n\n const events = Array.from(eventMap.entries()).map(([event, { emitters, listeners }]) => ({\n event,\n emitters: Array.from(emitters),\n listeners: Array.from(listeners),\n }));\n\n return { events };\n }\n\n /**\n * Start periodic cleanup of expired services.\n */\n startCleanup(): void {\n if (this.cleanupTimer) return;\n this.cleanupTimer = setInterval(() => {\n this.registry.cleanup(this.options.heartbeatTtlMs).catch(err => {\n console.error('[ServiceDiscovery] Cleanup error:', err);\n });\n }, this.options.cleanupIntervalMs);\n }\n\n /**\n * Stop periodic cleanup.\n */\n stopCleanup(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Get the underlying registry (for testing).\n */\n getRegistry(): IServiceRegistry {\n return this.registry;\n }\n}\n","/**\n * Observability Routes\n *\n * Provides endpoints for metrics, health checks, and telemetry.\n *\n * @packageDocumentation\n */\n\nimport { Router } from 'express';\nimport { getObservabilityCollector } from '@almadar/agent';\n\nconst router: ReturnType<typeof Router> = Router();\n\n/**\n * GET /metrics - Get performance snapshot\n */\nrouter.get('/metrics', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const snapshot = collector.getPerformanceSnapshot();\n res.json(snapshot);\n } catch (error) {\n console.error('Metrics error:', error);\n res.status(500).json({ error: 'Failed to get metrics' });\n }\n});\n\n/**\n * GET /health - Get health check\n */\nrouter.get('/health', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const health = await collector.healthCheck();\n const allHealthy = health.every((h) => h.status === 'healthy');\n\n res.status(allHealthy ? 200 : 503).json({\n status: allHealthy ? 'healthy' : 'degraded',\n timestamp: Date.now(),\n checks: health,\n });\n } catch (error) {\n console.error('Health check error:', error);\n res.status(500).json({\n status: 'unhealthy',\n error: 'Health check failed',\n });\n }\n});\n\n/**\n * GET /sessions/:threadId/telemetry - Get session telemetry\n */\nrouter.get('/sessions/:threadId/telemetry', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const telemetry = collector.getSessionTelemetry(req.params.threadId);\n\n if (!telemetry) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n\n res.json(telemetry);\n } catch (error) {\n console.error('Telemetry error:', error);\n res.status(500).json({ error: 'Failed to get telemetry' });\n }\n});\n\n/**\n * GET /active-sessions - Get active sessions\n */\nrouter.get('/active-sessions', async (req, res) => {\n try {\n const collector = getObservabilityCollector();\n const sessions = collector.getActiveSessions();\n res.json(sessions);\n } catch (error) {\n console.error('Active sessions error:', error);\n res.status(500).json({ error: 'Failed to get active sessions' });\n }\n});\n\nexport default router;\n","/**\n * @almadar/server - Shared server infrastructure for Almadar applications\n *\n * This package provides:\n * - Database utilities (Firebase/Firestore)\n * - Event bus for cross-trait communication\n * - Express middleware (auth, error handling, validation)\n * - Data services (mock and production)\n * - Query filter utilities\n *\n * @packageDocumentation\n */\n\n// Lib exports\nexport { env } from './lib/env.js';\nexport { logger } from './lib/logger.js';\nexport { EventBus, getServerEventBus, resetServerEventBus, emitEntityEvent, type EventLogEntry } from './lib/eventBus.js';\nexport {\n DistributedEventBus,\n InMemoryTransport,\n RedisTransport,\n type IEventBusTransport,\n type TransportMessage,\n type TransportReceiver,\n type RedisTransportOptions,\n} from './lib/eventBusTransport.js';\nexport {\n EventPersistence,\n InMemoryEventStore,\n type PersistedEvent,\n type EventQuery,\n type EventPersistenceOptions,\n type IEventStore,\n} from './lib/eventPersistence.js';\nexport { debugEventsRouter } from './lib/debugRouter.js';\nexport { initializeFirebase, getFirestore, getAuth, admin, db } from './lib/db.js';\nexport {\n setupEventBroadcast,\n getWebSocketServer,\n closeWebSocketServer,\n getConnectedClientCount,\n} from './lib/websocket.js';\n\n// Middleware exports\nexport {\n errorHandler,\n notFoundHandler,\n asyncHandler,\n AppError,\n NotFoundError,\n ValidationError,\n UnauthorizedError,\n ForbiddenError,\n ConflictError,\n} from './middleware/errorHandler.js';\nexport { validateBody, validateQuery, validateParams } from './middleware/validation.js';\nexport { authenticateFirebase } from './middleware/authenticateFirebase.js';\n\n// Services exports\nexport {\n MockDataService,\n getMockDataService,\n resetMockDataService,\n type FieldSchema,\n type EntitySchema,\n} from './services/MockDataService.js';\nexport {\n getDataService,\n resetDataService,\n seedMockData,\n type DataService,\n type EntitySeedConfig,\n type PaginationOptions,\n type PaginatedResult,\n} from './services/DataService.js';\n\n// Compat re-exports — generated project code imports these constant names.\n// They are now lazy getters; usage like `dataService.getById(...)` works\n// because the function IS the getter (called at import time in a Proxy).\nimport { getMockDataService } from './services/MockDataService.js';\nimport { getDataService } from './services/DataService.js';\nimport { getServerEventBus } from './lib/eventBus.js';\n\n/** @deprecated Use getDataService() instead */\nexport const dataService = new Proxy({} as ReturnType<typeof getDataService>, {\n get(_target, prop, receiver) {\n return Reflect.get(getDataService(), prop, receiver);\n },\n});\n\n/** @deprecated Use getMockDataService() instead */\nexport const mockDataService = new Proxy({} as ReturnType<typeof getMockDataService>, {\n get(_target, prop, receiver) {\n return Reflect.get(getMockDataService(), prop, receiver);\n },\n});\n\n/** @deprecated Use getServerEventBus() instead */\nexport const serverEventBus = new Proxy({} as ReturnType<typeof getServerEventBus>, {\n get(_target, prop, receiver) {\n return Reflect.get(getServerEventBus(), prop, receiver);\n },\n});\n\n// Stores exports\nexport {\n toFirestoreFormat,\n fromFirestoreFormat,\n SchemaStore,\n SnapshotStore,\n ChangeSetStore,\n ValidationStore,\n SchemaProtectionService,\n} from './stores/index.js';\n\n// Utils exports\nexport {\n parseQueryFilters,\n applyFiltersToQuery,\n extractPaginationParams,\n type ParsedFilter,\n type FirestoreWhereFilterOp,\n type PaginationParams,\n} from './utils/queryFilters.js';\n\n// DeepAgent exports (GAP implementations)\nexport {\n getMemoryManager,\n resetMemoryManager,\n} from './deepagent/memory.js';\nexport {\n getSessionManager,\n resetSessionManager,\n} from './deepagent/session.js';\nexport {\n createServerSkillAgent,\n getMemoryManager as getAgentMemoryManager,\n getSessionManager as getAgentSessionManager,\n} from './deepagent/skill-agent.js';\n\n// Multi-user middleware exports\nexport {\n multiUserMiddleware,\n verifyFirebaseAuth,\n} from './middleware/multi-user.js';\n\n// WebSocket exports\nexport { setupStateSyncWebSocket } from './websocket/state-sync.js';\n\n// Service Discovery exports\nexport {\n ServiceDiscovery,\n InMemoryServiceRegistry,\n type ServiceRegistration,\n type ServiceRegistryOptions,\n type IServiceRegistry,\n} from './lib/serviceDiscovery.js';\n\n// Contract exports\nexport type {\n DataServiceActions,\n DataServiceContract,\n EventBusActions,\n EventBusServiceContract,\n ServiceDiscoveryActions,\n ServiceDiscoveryContract,\n ServerServiceContracts,\n} from './contracts.js';\n\n// Route exports\nexport { default as observabilityRouter } from './routes/observability.js';\n"]}
|