{"version":3,"sources":["../src/types.ts","../src/websocket-handler.ts","../src/standalone.ts"],"names":[],"mappings":"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","file":"standalone.mjs","sourcesContent":["/**\n * UI Bridge Server Types\n *\n * Shared types for server adapters.\n */\n\nimport type { UIBridgeConfig, ElementHistoryOptions } from '@qontinui/ui-bridge/core';\nimport type { UiBridgeErrorCode } from '@qontinui/ui-bridge/diagnostics';\nimport type {\n  ControlActionRequest,\n  ControlActionResponse,\n  ComponentActionRequest,\n  ComponentActionResponse,\n  FindRequest,\n  FindResponse,\n  ControlSnapshot,\n  WorkflowRunRequest,\n  WorkflowRunResponse,\n} from '@qontinui/ui-bridge/control';\nimport type { RenderLogEntry, RenderLogEntryType } from '@qontinui/ui-bridge/render-log';\nimport type {\n  SearchCriteria,\n  SearchResponse,\n  NLActionRequest,\n  NLActionResponse,\n  AssertionRequest,\n  AssertionResult,\n  BatchAssertionRequest,\n  BatchAssertionResult,\n  SemanticSnapshot,\n  SemanticDiff,\n  SemanticSearchCriteria,\n  SemanticSearchResponse,\n  ScreenAnalysis,\n} from '@qontinui/ui-bridge/ai';\nimport type { PageHealthReport } from './page-health';\n\n/**\n * Server configuration\n */\nexport interface UIBridgeServerConfig extends UIBridgeConfig {\n  /** Base path for API routes */\n  basePath?: string;\n  /** Enable CORS */\n  cors?: boolean | CORSOptions;\n  /** Authentication middleware */\n  authenticate?: (req: unknown) => boolean | Promise<boolean>;\n  /** Rate limiting */\n  rateLimit?: RateLimitOptions;\n}\n\n/**\n * CORS options\n */\nexport interface CORSOptions {\n  /** Allowed origins */\n  origin?: string | string[] | boolean;\n  /** Allowed methods */\n  methods?: string[];\n  /** Allowed headers */\n  headers?: string[];\n  /** Expose headers */\n  exposeHeaders?: string[];\n  /** Allow credentials */\n  credentials?: boolean;\n  /** Max age for preflight cache */\n  maxAge?: number;\n}\n\n/**\n * Rate limit options\n */\nexport interface RateLimitOptions {\n  /** Time window in milliseconds */\n  windowMs?: number;\n  /** Max requests per window */\n  max?: number;\n  /** Message when rate limited */\n  message?: string;\n}\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n  /** Whether the request succeeded */\n  success: boolean;\n  /** Response data */\n  data?: T;\n  /** Error message if failed (human-readable, dual-audience — plan goal #3) */\n  error?: string;\n  /**\n   * Stable machine-readable diagnostic code. Populated on every\n   * `success: false` response (plan Phase 1 — required on failure;\n   * optional at the type level only because successful responses omit it).\n   * Always a canonical `UiBridgeErrorCode` (mapped from internal/legacy\n   * codes via `error-mapper.ts`).\n   */\n  code?: UiBridgeErrorCode;\n  /** Request timestamp */\n  timestamp: number;\n  /** Response time in milliseconds (set by server) */\n  durationMs?: number;\n}\n\n/**\n * Render log query parameters\n */\nexport interface RenderLogQuery {\n  /** Filter by entry type */\n  type?: RenderLogEntryType;\n  /** Filter entries since timestamp */\n  since?: number;\n  /** Filter entries until timestamp */\n  until?: number;\n  /** Limit number of results */\n  limit?: number;\n}\n\n/**\n * Server handler interface\n *\n * Implementations provide these handlers for different frameworks.\n */\nexport interface UIBridgeServerHandlers {\n  // Render log endpoints\n  getRenderLog: (query?: RenderLogQuery) => Promise<APIResponse<RenderLogEntry[]>>;\n  clearRenderLog: () => Promise<APIResponse<void>>;\n  captureSnapshot: () => Promise<APIResponse<unknown>>;\n  getRenderLogPath: () => Promise<APIResponse<{ path: string }>>;\n\n  // Control endpoints\n  getElements: () => Promise<APIResponse<ControlSnapshot['elements']>>;\n  getElement: (id: string) => Promise<APIResponse<ControlSnapshot['elements'][0]>>;\n  getElementState: (id: string) => Promise<APIResponse<unknown>>;\n  executeElementAction: (\n    id: string,\n    request: ControlActionRequest\n  ) => Promise<APIResponse<ControlActionResponse>>;\n\n  // Component endpoints\n  getComponents: () => Promise<APIResponse<ControlSnapshot['components']>>;\n  getComponent: (id: string) => Promise<APIResponse<ControlSnapshot['components'][0]>>;\n  getComponentState: (id: string) => Promise<\n    APIResponse<{\n      state: Record<string, unknown>;\n      computed: Record<string, unknown>;\n      timestamp: number;\n    }>\n  >;\n  executeComponentAction: (\n    id: string,\n    request: ComponentActionRequest\n  ) => Promise<APIResponse<ComponentActionResponse>>;\n\n  // Find endpoints\n  find: (request?: FindRequest) => Promise<APIResponse<FindResponse>>;\n  /**\n   * @deprecated Use find() instead\n   */\n  discover: (request?: FindRequest) => Promise<APIResponse<FindResponse>>;\n  getControlSnapshot: () => Promise<APIResponse<ControlSnapshot>>;\n\n  // Workflow endpoints\n  getWorkflows: () => Promise<APIResponse<ControlSnapshot['workflows']>>;\n  runWorkflow: (\n    id: string,\n    request?: WorkflowRunRequest\n  ) => Promise<APIResponse<WorkflowRunResponse>>;\n  getWorkflowStatus: (runId: string) => Promise<APIResponse<WorkflowRunResponse>>;\n\n  // Debug endpoints\n  getActionHistory: (limit?: number) => Promise<APIResponse<unknown[]>>;\n  getMetrics: () => Promise<APIResponse<unknown>>;\n  highlightElement: (id: string) => Promise<APIResponse<void>>;\n  getElementTree: () => Promise<APIResponse<unknown>>;\n\n  // AI-native endpoints\n  aiSearch: (criteria: SearchCriteria) => Promise<APIResponse<SearchResponse>>;\n  aiExecute: (request: NLActionRequest) => Promise<APIResponse<NLActionResponse>>;\n  aiAssert: (request: AssertionRequest) => Promise<APIResponse<AssertionResult>>;\n  aiAssertBatch: (request: BatchAssertionRequest) => Promise<APIResponse<BatchAssertionResult>>;\n  getSemanticSnapshot: () => Promise<APIResponse<SemanticSnapshot>>;\n  getSemanticDiff: (since?: number) => Promise<APIResponse<SemanticDiff | null>>;\n  getPageSummary: () => Promise<APIResponse<string>>;\n\n  // Screen analysis\n  getScreenAnalysis: () => Promise<APIResponse<ScreenAnalysis>>;\n\n  // Semantic search (embedding-based)\n  aiSemanticSearch: (\n    criteria: SemanticSearchCriteria\n  ) => Promise<APIResponse<SemanticSearchResponse>>;\n\n  // Element event log\n  getElementHistory: (\n    elementId: string,\n    options?: ElementHistoryOptions\n  ) => Promise<APIResponse<unknown[]>>;\n\n  // Performance diagnostics\n  getPerformanceEntries: () => Promise<APIResponse<unknown>>;\n  clearPerformanceEntries: () => Promise<APIResponse<{ cleared: boolean }>>;\n  getBrowserEvents: (params?: {\n    type?: string;\n    since?: number;\n    limit?: number;\n  }) => Promise<APIResponse<{ events: unknown[]; count: number }>>;\n\n  // Page health diagnostics\n  pageHealth?: () => Promise<APIResponse<PageHealthReport>>;\n\n  // Enhanced discovery endpoints\n  query: (request: {\n    selector: string;\n    limit?: number;\n    includeState?: boolean;\n  }) => Promise<APIResponse<{ elements: unknown[]; count: number }>>;\n\n  waitForElement: (request: {\n    selector?: string;\n    elementId?: string;\n    timeout?: number;\n    pollInterval?: number;\n  }) => Promise<APIResponse<{ found: boolean; element?: unknown; waitedMs: number }>>;\n\n  // App-agnostic convenience endpoints\n  clickByText: (request: {\n    text: string;\n    tag?: string;\n    exact?: boolean;\n  }) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n  clickBySelector: (request: {\n    selector: string;\n    index?: number;\n  }) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n  typeInto: (request: {\n    selector?: string;\n    label?: string;\n    text: string;\n    clear?: boolean;\n  }) => Promise<APIResponse<{ typed: boolean; element?: unknown }>>;\n\n  readValue: (request: {\n    selector: string;\n    index?: number;\n  }) => Promise<APIResponse<{ value: string | null; length: number }>>;\n\n  findByText: (request: { text: string; tag?: string; exact?: boolean }) => Promise<\n    APIResponse<\n      Array<{\n        index: number;\n        tag: string;\n        text: string;\n        rect: { x: number; y: number; width: number; height: number };\n        disabled: boolean;\n        visible: boolean;\n      }>\n    >\n  >;\n\n  // Diagnostics endpoint (SDK runtime state — pre-existing)\n  getDiagnostics: () => Promise<APIResponse<unknown>>;\n\n  /**\n   * Diagnostic catalog endpoints (plan Phase 2). Read-only, backed by the\n   * single source `diagnostics/codes.json` (via the generated\n   * `@qontinui/ui-bridge/diagnostics` catalog). `getDiagnosticsCatalog`\n   * returns every code (agent bootstrap); `getDiagnosticCode` returns one\n   * code's entry, 404 + canonical `UiBridgeErrorCode` on an unknown code.\n   */\n  getDiagnosticsCatalog: () => Promise<APIResponse<unknown>>;\n  getDiagnosticCode: (code: string) => Promise<APIResponse<unknown>>;\n\n  // Navigation adapter endpoints\n  getRoutes: () => Promise<APIResponse<Array<{ name: string; path: string }>>>;\n  navigateByAdapter: (request: {\n    page: string;\n  }) => Promise<APIResponse<{ navigated: boolean; route: { name: string; path: string } }>>;\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n  path: string;\n  handler: string; // Key in UIBridgeServerHandlers\n  params?: string[]; // URL params to extract\n  bodyRequired?: boolean;\n}\n\n/**\n * All UI Bridge routes\n */\nexport const UI_BRIDGE_ROUTES: RouteDefinition[] = [\n  // Render log\n  { method: 'GET', path: '/render-log', handler: 'getRenderLog' },\n  { method: 'GET', path: '/control/render-log', handler: 'getRenderLog' }, // Alias under /control/\n  { method: 'DELETE', path: '/render-log', handler: 'clearRenderLog' },\n  { method: 'POST', path: '/render-log/snapshot', handler: 'captureSnapshot' },\n  { method: 'GET', path: '/render-log/path', handler: 'getRenderLogPath' },\n\n  // Control - Elements\n  { method: 'GET', path: '/control/elements', handler: 'getElements' },\n  { method: 'GET', path: '/control/element/:id', handler: 'getElement', params: ['id'] },\n  { method: 'GET', path: '/control/element/:id/state', handler: 'getElementState', params: ['id'] },\n  {\n    method: 'POST',\n    path: '/control/element/:id/action',\n    handler: 'executeElementAction',\n    params: ['id'],\n    bodyRequired: true,\n  },\n\n  // Control - Components\n  { method: 'GET', path: '/control/components', handler: 'getComponents' },\n  { method: 'GET', path: '/control/component/:id', handler: 'getComponent', params: ['id'] },\n  {\n    method: 'GET',\n    path: '/control/component/:id/state',\n    handler: 'getComponentState',\n    params: ['id'],\n  },\n  {\n    method: 'POST',\n    path: '/control/component/:id/action/:actionId',\n    handler: 'executeComponentAction',\n    params: ['id', 'actionId'],\n    bodyRequired: true,\n  },\n\n  // Find (formerly Discovery)\n  { method: 'POST', path: '/control/find', handler: 'find' },\n  { method: 'POST', path: '/control/discover', handler: 'discover' }, // @deprecated Use /control/find\n  { method: 'GET', path: '/control/snapshot', handler: 'getControlSnapshot' },\n  {\n    method: 'POST',\n    path: '/control/viewport-constraints',\n    handler: 'setViewportConstraints',\n    bodyRequired: true,\n  },\n\n  // Workflows\n  { method: 'GET', path: '/control/workflows', handler: 'getWorkflows' },\n  { method: 'POST', path: '/control/workflow/:id/run', handler: 'runWorkflow', params: ['id'] },\n  {\n    method: 'GET',\n    path: '/control/workflow/:runId/status',\n    handler: 'getWorkflowStatus',\n    params: ['runId'],\n  },\n\n  // Element event log\n  {\n    method: 'GET',\n    path: '/debug/element-history/:id',\n    handler: 'getElementHistory',\n    params: ['id'],\n  },\n\n  // Debug\n  { method: 'GET', path: '/debug/action-history', handler: 'getActionHistory' },\n  { method: 'GET', path: '/debug/metrics', handler: 'getMetrics' },\n  { method: 'POST', path: '/debug/highlight/:id', handler: 'highlightElement', params: ['id'] },\n  { method: 'GET', path: '/debug/element-tree', handler: 'getElementTree' },\n\n  // AI-native endpoints\n  { method: 'POST', path: '/ai/search', handler: 'aiSearch', bodyRequired: true },\n  { method: 'POST', path: '/ai/execute', handler: 'aiExecute', bodyRequired: true },\n  { method: 'POST', path: '/ai/assert', handler: 'aiAssert', bodyRequired: true },\n  { method: 'POST', path: '/ai/assert/batch', handler: 'aiAssertBatch', bodyRequired: true },\n  { method: 'GET', path: '/ai/snapshot', handler: 'getSemanticSnapshot' },\n  { method: 'GET', path: '/ai/diff', handler: 'getSemanticDiff' },\n  { method: 'GET', path: '/ai/summary', handler: 'getPageSummary' },\n  { method: 'GET', path: '/ai/analyze', handler: 'getScreenAnalysis' },\n  { method: 'POST', path: '/ai/semantic-search', handler: 'aiSemanticSearch', bodyRequired: true },\n\n  // Performance diagnostics\n  { method: 'GET', path: '/control/performance-entries', handler: 'getPerformanceEntries' },\n  {\n    method: 'POST',\n    path: '/control/performance-entries/clear',\n    handler: 'clearPerformanceEntries',\n  },\n  { method: 'GET', path: '/control/browser-events', handler: 'getBrowserEvents' },\n\n  // Page health diagnostics\n  { method: 'POST', path: '/control/page-health', handler: 'pageHealth' },\n\n  // Enhanced discovery & navigation\n  { method: 'POST', path: '/control/query', handler: 'query', bodyRequired: true },\n  {\n    method: 'POST',\n    path: '/control/waitForElement',\n    handler: 'waitForElement',\n    bodyRequired: true,\n  },\n\n  // App-agnostic convenience endpoints\n  {\n    method: 'POST',\n    path: '/control/page/click-by-text',\n    handler: 'clickByText',\n    bodyRequired: true,\n  },\n  {\n    method: 'POST',\n    path: '/control/page/click-by-selector',\n    handler: 'clickBySelector',\n    bodyRequired: true,\n  },\n  { method: 'POST', path: '/control/page/type-into', handler: 'typeInto', bodyRequired: true },\n  { method: 'POST', path: '/control/page/read-value', handler: 'readValue', bodyRequired: true },\n  { method: 'POST', path: '/control/page/find-by-text', handler: 'findByText', bodyRequired: true },\n\n  // Diagnostics — SDK runtime state (pre-existing)\n  { method: 'GET', path: '/diagnostics', handler: 'getDiagnostics' },\n\n  // Diagnostic catalog (plan Phase 2 — read-only, codes.json-backed).\n  // `/diagnostics/catalog` is registered before `/diagnostics/:code` so the\n  // literal segment is not captured as a `:code` param (matters for both the\n  // express Router and the standalone first-match router).\n  { method: 'GET', path: '/diagnostics/catalog', handler: 'getDiagnosticsCatalog' },\n  {\n    method: 'GET',\n    path: '/diagnostics/:code',\n    handler: 'getDiagnosticCode',\n    params: ['code'],\n  },\n\n  // Navigation adapter\n  { method: 'GET', path: '/control/page/routes', handler: 'getRoutes' },\n  {\n    method: 'POST',\n    path: '/control/page/navigate-to',\n    handler: 'navigateByAdapter',\n    bodyRequired: true,\n  },\n];\n\n/**\n * WebSocket message types\n */\nexport type WebSocketMessageType =\n  | 'subscribe'\n  | 'unsubscribe'\n  | 'event'\n  | 'snapshot'\n  | 'action'\n  | 'error';\n\n/**\n * WebSocket message\n */\nexport interface WebSocketMessage<T = unknown> {\n  type: WebSocketMessageType;\n  channel?: string;\n  data?: T;\n  error?: string;\n  timestamp: number;\n}\n","/**\n * WebSocket Handler for UI Bridge Server\n *\n * Handles WebSocket connections and message routing.\n */\n\nimport type { UIBridgeServerHandlers } from './types';\nimport type {\n  BridgeEvent,\n  BridgeEventType,\n  WSClientMessage,\n  WSServerMessage,\n  WSWelcomeMessage,\n  WSPongMessage,\n  WSSubscribedMessage,\n  WSUnsubscribedMessage,\n  WSEventMessage,\n  WSResponseMessage,\n  WSErrorMessage,\n} from '@qontinui/ui-bridge';\n\n/**\n * WebSocket-like interface for compatibility\n */\nexport interface WebSocketLike {\n  send(data: string): void;\n  close(): void;\n  readyState: number;\n  onmessage?: ((event: { data: string }) => void) | null;\n  onclose?: (() => void) | null;\n  onerror?: ((error: unknown) => void) | null;\n}\n\n/**\n * Client subscription state\n */\ninterface ClientSubscription {\n  events: Set<BridgeEventType>;\n  elementIds: Set<string>;\n  componentIds: Set<string>;\n}\n\n/**\n * Connected client info\n */\ninterface ConnectedClient {\n  id: string;\n  ws: WebSocketLike;\n  subscription: ClientSubscription;\n  connectedAt: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n  return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * UI Bridge server version\n */\nconst VERSION = '0.1.0';\n\n/**\n * WebSocket handler for UI Bridge server\n */\nexport class UIBridgeWSHandler {\n  private handlers: UIBridgeServerHandlers;\n  private clients = new Map<string, ConnectedClient>();\n  private verbose: boolean;\n  private log: (message: string) => void;\n\n  constructor(\n    handlers: UIBridgeServerHandlers,\n    options: { verbose?: boolean; log?: (message: string) => void } = {}\n  ) {\n    this.handlers = handlers;\n    this.verbose = options.verbose ?? false;\n    this.log = options.log ?? console.log;\n  }\n\n  /**\n   * Handle new WebSocket connection\n   */\n  handleConnection(ws: WebSocketLike, preferredId?: string): string {\n    // Resume under a client-supplied stable id (e.g. persisted `__uiBridge_tabId`,\n    // forwarded from the upgrade request's `?tabId=`) so a tab keeps its\n    // server-side identity across reconnects instead of churning ids.\n    const clientId = preferredId && preferredId.trim() ? preferredId.trim() : generateId();\n\n    const existing = this.clients.get(clientId);\n    if (existing && existing.ws !== ws) {\n      try {\n        existing.ws.close?.();\n      } catch {\n        /* best-effort */\n      }\n    }\n\n    const client: ConnectedClient = {\n      id: clientId,\n      ws,\n      subscription: existing?.subscription ?? {\n        events: new Set(),\n        elementIds: new Set(),\n        componentIds: new Set(),\n      },\n      connectedAt: Date.now(),\n    };\n\n    this.clients.set(clientId, client);\n\n    if (this.verbose) {\n      this.log(`[WS] Client ${existing ? 'resumed' : 'connected'}: ${clientId}`);\n    }\n\n    // Set up message handler\n    ws.onmessage = (event: { data: string }) => {\n      this.handleMessage(clientId, event.data);\n    };\n\n    // Set up close handler. Capture THIS ws so a stale socket's delayed close\n    // cannot evict a newer resumed client registered under the same id.\n    ws.onclose = () => {\n      this.handleDisconnect(clientId, ws);\n    };\n\n    // Send welcome message\n    this.sendToClient(clientId, {\n      id: generateId(),\n      type: 'welcome',\n      timestamp: Date.now(),\n      payload: {\n        version: VERSION,\n        features: {\n          renderLog: true,\n          control: true,\n          debug: true,\n        },\n        clientId,\n      },\n    } as WSWelcomeMessage);\n\n    return clientId;\n  }\n\n  /**\n   * Handle client disconnect\n   */\n  handleDisconnect(clientId: string, ws?: WebSocketLike): void {\n    if (ws) {\n      const current = this.clients.get(clientId);\n      if (current && current.ws !== ws) {\n        // A newer socket already resumed this id — leave it intact.\n        return;\n      }\n    }\n    this.clients.delete(clientId);\n\n    if (this.verbose) {\n      this.log(`[WS] Client disconnected: ${clientId}`);\n    }\n  }\n\n  /**\n   * Handle incoming message\n   */\n  private async handleMessage(clientId: string, data: string): Promise<void> {\n    const client = this.clients.get(clientId);\n    if (!client) return;\n\n    let message: WSClientMessage;\n    try {\n      message = JSON.parse(data) as WSClientMessage;\n    } catch (_error) {\n      this.sendError(clientId, undefined, 'PARSE_ERROR', 'Invalid JSON message');\n      return;\n    }\n\n    if (this.verbose) {\n      this.log(`[WS] ${clientId} -> ${message.type}`);\n    }\n\n    try {\n      switch (message.type) {\n        case 'ping':\n          this.handlePing(clientId, message.id);\n          break;\n\n        case 'subscribe':\n          await this.handleSubscribe(clientId, message);\n          break;\n\n        case 'unsubscribe':\n          await this.handleUnsubscribe(clientId, message);\n          break;\n\n        case 'find':\n          await this.handleFind(clientId, message);\n          break;\n\n        case 'discover':\n          // @deprecated Use 'find' instead\n          await this.handleFind(clientId, message as unknown as WSClientMessage & { type: 'find' });\n          break;\n\n        case 'getElement':\n          await this.handleGetElement(clientId, message);\n          break;\n\n        case 'getSnapshot':\n          await this.handleGetSnapshot(clientId, message);\n          break;\n\n        case 'executeAction':\n          await this.handleExecuteAction(clientId, message);\n          break;\n\n        case 'executeComponentAction':\n          await this.handleExecuteComponentAction(clientId, message);\n          break;\n\n        case 'executeWorkflow':\n          await this.handleExecuteWorkflow(clientId, message);\n          break;\n\n        case 'getElementHistory':\n          await this.handleGetElementHistory(clientId, message);\n          break;\n\n        default:\n          this.sendError(\n            clientId,\n            (message as WSClientMessage).id,\n            'UNKNOWN_MESSAGE',\n            `Unknown message type: ${(message as WSClientMessage).type}`\n          );\n      }\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n      this.sendError(clientId, message.id, 'HANDLER_ERROR', err.message);\n    }\n  }\n\n  /**\n   * Handle ping message\n   */\n  private handlePing(clientId: string, _requestId: string): void {\n    this.sendToClient(clientId, {\n      id: generateId(),\n      type: 'pong',\n      timestamp: Date.now(),\n    } as WSPongMessage);\n  }\n\n  /**\n   * Handle subscribe message\n   */\n  private async handleSubscribe(\n    clientId: string,\n    message: WSClientMessage & { type: 'subscribe' }\n  ): Promise<void> {\n    const client = this.clients.get(clientId);\n    if (!client) return;\n\n    const { events, elementIds, componentIds } = message.payload;\n\n    // Add to subscriptions\n    if (events?.length) {\n      for (const event of events) {\n        client.subscription.events.add(event);\n      }\n    }\n    if (elementIds?.length) {\n      for (const id of elementIds) {\n        client.subscription.elementIds.add(id);\n      }\n    }\n    if (componentIds?.length) {\n      for (const id of componentIds) {\n        client.subscription.componentIds.add(id);\n      }\n    }\n\n    this.sendToClient(clientId, {\n      id: generateId(),\n      type: 'subscribed',\n      timestamp: Date.now(),\n      payload: {\n        events: Array.from(client.subscription.events),\n      },\n    } as WSSubscribedMessage);\n  }\n\n  /**\n   * Handle unsubscribe message\n   */\n  private async handleUnsubscribe(\n    clientId: string,\n    message: WSClientMessage & { type: 'unsubscribe' }\n  ): Promise<void> {\n    const client = this.clients.get(clientId);\n    if (!client) return;\n\n    const { events } = message.payload;\n\n    let removedEvents: BridgeEventType[];\n    if (events?.length) {\n      removedEvents = events.filter((e: BridgeEventType) => client.subscription.events.has(e));\n      for (const event of events) {\n        client.subscription.events.delete(event);\n      }\n    } else {\n      removedEvents = Array.from(client.subscription.events);\n      client.subscription.events.clear();\n      client.subscription.elementIds.clear();\n      client.subscription.componentIds.clear();\n    }\n\n    this.sendToClient(clientId, {\n      id: generateId(),\n      type: 'unsubscribed',\n      timestamp: Date.now(),\n      payload: {\n        events: removedEvents,\n      },\n    } as WSUnsubscribedMessage);\n  }\n\n  /**\n   * Handle find message\n   */\n  private async handleFind(\n    clientId: string,\n    message: WSClientMessage & { type: 'find' }\n  ): Promise<void> {\n    const result = await this.handlers.find(message.payload || {});\n\n    if (result.success && result.data) {\n      this.sendResponse(clientId, message.id, true, { elements: result.data.elements });\n    } else {\n      this.sendResponse(clientId, message.id, false, undefined, result.error);\n    }\n  }\n\n  /**\n   * Handle getElement message\n   */\n  private async handleGetElement(\n    clientId: string,\n    message: WSClientMessage & { type: 'getElement' }\n  ): Promise<void> {\n    const { elementId } = message.payload;\n    const result = await this.handlers.getElement(elementId);\n\n    if (result.success) {\n      this.sendResponse(clientId, message.id, true, { element: result.data });\n    } else {\n      this.sendResponse(clientId, message.id, false, undefined, result.error);\n    }\n  }\n\n  /**\n   * Handle getSnapshot message\n   */\n  private async handleGetSnapshot(\n    clientId: string,\n    message: WSClientMessage & { type: 'getSnapshot' }\n  ): Promise<void> {\n    const result = await this.handlers.getControlSnapshot();\n\n    if (result.success) {\n      this.sendResponse(clientId, message.id, true, result.data);\n    } else {\n      this.sendResponse(clientId, message.id, false, undefined, result.error);\n    }\n  }\n\n  /**\n   * Handle executeAction message\n   */\n  private async handleExecuteAction(\n    clientId: string,\n    message: WSClientMessage & { type: 'executeAction' }\n  ): Promise<void> {\n    const { elementId, action } = message.payload;\n    const result = await this.handlers.executeElementAction(elementId, action);\n\n    this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n  }\n\n  /**\n   * Handle executeComponentAction message\n   */\n  private async handleExecuteComponentAction(\n    clientId: string,\n    message: WSClientMessage & { type: 'executeComponentAction' }\n  ): Promise<void> {\n    const { componentId, action, params } = message.payload;\n    const result = await this.handlers.executeComponentAction(componentId, { action, params });\n\n    this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n  }\n\n  /**\n   * Handle executeWorkflow message\n   */\n  private async handleExecuteWorkflow(\n    clientId: string,\n    message: WSClientMessage & { type: 'executeWorkflow' }\n  ): Promise<void> {\n    const { workflowId, params } = message.payload;\n\n    // Note: Progress streaming would need to be added to the handlers interface\n    // For now, we just run the workflow without progress callbacks\n    const result = await this.handlers.runWorkflow(workflowId, { params });\n\n    this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n  }\n\n  /**\n   * Handle getElementHistory message\n   */\n  private async handleGetElementHistory(\n    clientId: string,\n    message: WSClientMessage & { type: 'getElementHistory' }\n  ): Promise<void> {\n    const { elementId, options } = message.payload;\n    const result = await this.handlers.getElementHistory(elementId, options);\n\n    if (result.success) {\n      this.sendResponse(clientId, message.id, true, { entries: result.data });\n    } else {\n      this.sendResponse(clientId, message.id, false, undefined, result.error);\n    }\n  }\n\n  /**\n   * Broadcast event to all subscribed clients\n   */\n  broadcastEvent(event: BridgeEvent): void {\n    for (const [clientId, client] of this.clients) {\n      // Check if client is subscribed to this event type\n      if (client.subscription.events.size === 0 || client.subscription.events.has(event.type)) {\n        // Check element/component filters if applicable\n        const eventData = event.data as { elementId?: string; componentId?: string };\n\n        if (\n          eventData.elementId &&\n          client.subscription.elementIds.size > 0 &&\n          !client.subscription.elementIds.has(eventData.elementId)\n        ) {\n          continue;\n        }\n\n        if (\n          eventData.componentId &&\n          client.subscription.componentIds.size > 0 &&\n          !client.subscription.componentIds.has(eventData.componentId)\n        ) {\n          continue;\n        }\n\n        this.sendToClient(clientId, {\n          id: generateId(),\n          type: 'event',\n          timestamp: Date.now(),\n          payload: event,\n        } as WSEventMessage);\n      }\n    }\n  }\n\n  /**\n   * Send message to specific client\n   */\n  private sendToClient(clientId: string, message: WSServerMessage): void {\n    const client = this.clients.get(clientId);\n    if (!client || client.ws.readyState !== 1) return;\n\n    try {\n      client.ws.send(JSON.stringify(message));\n\n      if (this.verbose && message.type !== 'pong') {\n        this.log(`[WS] ${clientId} <- ${message.type}`);\n      }\n    } catch (error) {\n      console.error(`Failed to send message to ${clientId}:`, error);\n    }\n  }\n\n  /**\n   * Send response message\n   */\n  private sendResponse<T>(\n    clientId: string,\n    requestId: string,\n    success: boolean,\n    data?: T,\n    error?: string\n  ): void {\n    this.sendToClient(clientId, {\n      id: generateId(),\n      type: 'response',\n      timestamp: Date.now(),\n      requestId,\n      payload: {\n        success,\n        data,\n        error,\n      },\n    } as WSResponseMessage<T>);\n  }\n\n  /**\n   * Send error message\n   */\n  private sendError(\n    clientId: string,\n    requestId: string | undefined,\n    code: string,\n    message: string\n  ): void {\n    this.sendToClient(clientId, {\n      id: generateId(),\n      type: 'error',\n      timestamp: Date.now(),\n      requestId,\n      payload: {\n        code,\n        message,\n      },\n    } as WSErrorMessage);\n  }\n\n  /**\n   * Get connected client count\n   */\n  get clientCount(): number {\n    return this.clients.size;\n  }\n\n  /**\n   * Get all connected client IDs\n   */\n  get clientIds(): string[] {\n    return Array.from(this.clients.keys());\n  }\n\n  /**\n   * Disconnect all clients\n   */\n  disconnectAll(): void {\n    for (const [_clientId, client] of this.clients) {\n      try {\n        client.ws.close();\n      } catch {\n        // Ignore close errors\n      }\n    }\n    this.clients.clear();\n  }\n}\n","/**\n * Standalone Server\n *\n * Standalone HTTP server for UI Bridge that can run independently.\n * Supports both HTTP and WebSocket connections.\n */\n\nimport type {\n  UIBridgeServerConfig,\n  UIBridgeServerHandlers,\n  APIResponse,\n  WebSocketMessage,\n} from './types';\nimport { UI_BRIDGE_ROUTES } from './types';\nimport { mapInternalErrorCode } from './error-mapper';\nimport { UIBridgeWSHandler, type WebSocketLike } from './websocket-handler';\nimport type { BridgeEvent } from '@qontinui/ui-bridge';\n\n/**\n * Standalone server configuration\n */\nexport interface StandaloneServerConfig extends UIBridgeServerConfig {\n  /** Host to bind to */\n  host?: string;\n  /** Port to listen on */\n  port?: number;\n  /** Enable WebSocket support */\n  websocket?: boolean;\n  /** WebSocket port (defaults to port) */\n  websocketPort?: number;\n  /** Logging function */\n  log?: (message: string) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<\n  Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n> = {\n  host: 'localhost',\n  port: 9876,\n  websocket: false,\n  websocketPort: 9876,\n  log: console.log,\n};\n\n/**\n * Wrap error in API format\n */\nfunction wrapError(error: Error | string, code?: string): APIResponse<never> {\n  const message = typeof error === 'string' ? error : error.message;\n  return {\n    success: false,\n    error: message,\n    code: mapInternalErrorCode(code, message),\n    timestamp: Date.now(),\n  };\n}\n\n/**\n * Simple HTTP server implementation using Node.js built-in http module\n * with optional WebSocket support.\n */\nexport class StandaloneServer {\n  private server: import('http').Server | null = null;\n  private wsServer: unknown = null; // WebSocket.Server from 'ws' package\n  private config: Required<\n    Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n  > &\n    StandaloneServerConfig;\n  private handlers: UIBridgeServerHandlers;\n  private wsHandler: UIBridgeWSHandler | null = null;\n  private wsConnections: Set<WebSocketLike> = new Set();\n\n  constructor(handlers: UIBridgeServerHandlers, config: StandaloneServerConfig = {}) {\n    this.handlers = handlers;\n    this.config = { ...DEFAULT_CONFIG, ...config };\n\n    // Create WebSocket handler if enabled\n    if (this.config.websocket) {\n      this.wsHandler = new UIBridgeWSHandler(handlers, {\n        verbose: true,\n        log: this.config.log,\n      });\n    }\n  }\n\n  /**\n   * Start the server\n   */\n  async start(): Promise<void> {\n    const http = await import('http');\n\n    this.server = http.createServer(async (req, res) => {\n      await this.handleRequest(req, res);\n    });\n\n    // Start WebSocket server if enabled\n    if (this.config.websocket && this.wsHandler) {\n      await this.startWebSocketServer();\n    }\n\n    return new Promise((resolve, reject) => {\n      this.server!.listen(this.config.port, this.config.host, () => {\n        this.config.log(\n          `UI Bridge server listening on http://${this.config.host}:${this.config.port}`\n        );\n        if (this.config.websocket) {\n          const wsPort = this.config.websocketPort || this.config.port;\n          this.config.log(\n            `UI Bridge WebSocket server listening on ws://${this.config.host}:${wsPort}`\n          );\n        }\n        resolve();\n      });\n\n      this.server!.on('error', reject);\n    });\n  }\n\n  /**\n   * Start WebSocket server\n   */\n  private async startWebSocketServer(): Promise<void> {\n    try {\n      // Dynamically import ws package\n      const { WebSocketServer } = await import('ws');\n\n      const wsPort = this.config.websocketPort || this.config.port;\n      const useSamePort = wsPort === this.config.port;\n\n      if (useSamePort && this.server) {\n        // Attach to same HTTP server (upgrade handling)\n        this.wsServer = new WebSocketServer({ server: this.server });\n      } else {\n        // Create separate WebSocket server\n        this.wsServer = new WebSocketServer({\n          host: this.config.host,\n          port: wsPort,\n        });\n      }\n\n      const wss = this.wsServer as {\n        on(\n          event: 'connection',\n          callback: (ws: WebSocketLike, request?: { url?: string }) => void\n        ): void;\n        on(event: 'error', callback: (error: Error) => void): void;\n        close(): void;\n      };\n\n      wss.on('connection', (ws, request) => {\n        this.wsConnections.add(ws);\n        // Forward the persisted tab id (?tabId=) so the client resumes its\n        // server-side identity across reconnects instead of churning ids.\n        let preferredId: string | undefined;\n        const rawUrl = request?.url;\n        if (rawUrl) {\n          try {\n            preferredId = new URL(rawUrl, 'http://localhost').searchParams.get('tabId') ?? undefined;\n          } catch {\n            /* malformed url — fall back to generated id */\n          }\n        }\n        this.wsHandler!.handleConnection(ws, preferredId);\n\n        ws.onclose = () => {\n          this.wsConnections.delete(ws);\n        };\n      });\n\n      wss.on('error', (error) => {\n        this.config.log(`WebSocket server error: ${error.message}`);\n      });\n    } catch (_error) {\n      // ws package not installed - WebSocket support disabled\n      this.config.log(\n        'Warning: WebSocket support requires the \"ws\" package. Install it with: npm install ws'\n      );\n      this.wsHandler = null;\n    }\n  }\n\n  /**\n   * Stop the server\n   */\n  async stop(): Promise<void> {\n    // Close WebSocket handler\n    if (this.wsHandler) {\n      this.wsHandler.disconnectAll();\n    }\n\n    // Close WebSocket server\n    if (this.wsServer) {\n      const wss = this.wsServer as { close(): void };\n      wss.close();\n      this.wsServer = null;\n    }\n\n    // Close WebSocket connections\n    for (const ws of this.wsConnections) {\n      ws.close();\n    }\n    this.wsConnections.clear();\n\n    return new Promise((resolve, reject) => {\n      if (!this.server) {\n        resolve();\n        return;\n      }\n\n      this.server.close((err) => {\n        if (err) reject(err);\n        else resolve();\n      });\n    });\n  }\n\n  /**\n   * Handle an HTTP request\n   */\n  private async handleRequest(\n    req: import('http').IncomingMessage,\n    res: import('http').ServerResponse\n  ): Promise<void> {\n    const url = new URL(req.url || '/', `http://${req.headers.host}`);\n    const method = req.method || 'GET';\n    const basePath = this.config.basePath || '/ui-bridge';\n\n    // Add CORS headers\n    if (this.config.cors) {\n      res.setHeader('Access-Control-Allow-Origin', '*');\n      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n      res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n    }\n\n    // Handle preflight\n    if (method === 'OPTIONS') {\n      res.writeHead(204);\n      res.end();\n      return;\n    }\n\n    // Health check\n    if (url.pathname === '/health') {\n      this.sendJSON(res, { status: 'ok', timestamp: Date.now() });\n      return;\n    }\n\n    // Remove base path\n    let path = url.pathname;\n    if (path.startsWith(basePath)) {\n      path = path.slice(basePath.length) || '/';\n    }\n\n    // P2.2 — Endpoint discovery. Served before route matching so it works\n    // even if no UIBridgeServerHandlers entry registers it.\n    if (method === 'GET' && path === '/_routes') {\n      const routes = UI_BRIDGE_ROUTES.map((r) => ({ method: r.method, path: r.path })).sort(\n        (a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method)\n      );\n      this.sendJSON(res, {\n        success: true,\n        data: { routes, count: routes.length },\n        timestamp: Date.now(),\n      });\n      return;\n    }\n\n    // Find matching route\n    const route = this.findRoute(path, method);\n    if (!route) {\n      this.sendJSON(res, wrapError('Not found', 'NOT_FOUND'), 404);\n      return;\n    }\n\n    try {\n      // Parse body for POST requests\n      let body: unknown = {};\n      if (method === 'POST') {\n        body = await this.parseBody(req);\n      }\n\n      // Extract params\n      const params = this.extractParams(path, route.path);\n\n      // Get handler\n      const handlerName = route.handler as keyof UIBridgeServerHandlers;\n      const handler = this.handlers[handlerName];\n\n      if (!handler) {\n        this.sendJSON(res, wrapError('Not implemented', 'NOT_IMPLEMENTED'), 501);\n        return;\n      }\n\n      // Build arguments\n      const args: unknown[] = [];\n\n      if (route.params) {\n        for (const param of route.params) {\n          args.push(params[param]);\n        }\n      }\n\n      if (method === 'POST') {\n        args.push(body);\n      }\n\n      if (method === 'GET') {\n        const query = Object.fromEntries(url.searchParams);\n        if (Object.keys(query).length > 0) {\n          args.push(query);\n        }\n      }\n\n      // Call handler\n      const result = await (handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)(\n        ...args\n      );\n      this.sendJSON(res, result);\n    } catch (error) {\n      this.config.log(`Error handling ${method} ${path}: ${error}`);\n      this.sendJSON(res, wrapError(error as Error, 'INTERNAL_ERROR'), 500);\n    }\n  }\n\n  /**\n   * Find a matching route\n   */\n  private findRoute(path: string, method: string): (typeof UI_BRIDGE_ROUTES)[0] | null {\n    for (const route of UI_BRIDGE_ROUTES) {\n      if (route.method !== method) continue;\n\n      const routeRegex = route.path.replace(/:[^/]+/g, '([^/]+)').replace(/\\//g, '\\\\/');\n\n      const regex = new RegExp(`^${routeRegex}$`);\n      if (regex.test(path)) {\n        return route;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Extract params from path\n   */\n  private extractParams(path: string, routePath: string): Record<string, string> {\n    const params: Record<string, string> = {};\n    const routeParts = routePath.split('/');\n    const pathParts = path.split('/');\n\n    for (let i = 0; i < routeParts.length; i++) {\n      if (routeParts[i].startsWith(':')) {\n        params[routeParts[i].slice(1)] = pathParts[i];\n      }\n    }\n\n    return params;\n  }\n\n  /**\n   * Parse request body\n   */\n  private parseBody(req: import('http').IncomingMessage): Promise<unknown> {\n    return new Promise((resolve, reject) => {\n      let data = '';\n      req.on('data', (chunk) => (data += chunk));\n      req.on('end', () => {\n        try {\n          resolve(data ? JSON.parse(data) : {});\n        } catch {\n          resolve({});\n        }\n      });\n      req.on('error', reject);\n    });\n  }\n\n  /**\n   * Send JSON response\n   */\n  private sendJSON(res: import('http').ServerResponse, data: unknown, status = 200): void {\n    res.writeHead(status, { 'Content-Type': 'application/json' });\n    res.end(JSON.stringify(data));\n  }\n\n  /**\n   * Broadcast a message to all WebSocket connections (legacy)\n   */\n  broadcast(message: WebSocketMessage): void {\n    const data = JSON.stringify(message);\n    for (const ws of this.wsConnections) {\n      if (ws.readyState === 1) {\n        // OPEN\n        ws.send(data);\n      }\n    }\n  }\n\n  /**\n   * Broadcast an event to all subscribed WebSocket clients\n   */\n  broadcastEvent(event: BridgeEvent): void {\n    if (this.wsHandler) {\n      this.wsHandler.broadcastEvent(event);\n    }\n  }\n\n  /**\n   * Get WebSocket handler for direct access\n   */\n  getWSHandler(): UIBridgeWSHandler | null {\n    return this.wsHandler;\n  }\n\n  /**\n   * Get number of connected WebSocket clients\n   */\n  get wsClientCount(): number {\n    return this.wsHandler?.clientCount ?? 0;\n  }\n\n  /**\n   * Get the server address\n   */\n  getAddress(): { host: string; port: number } | null {\n    const address = this.server?.address();\n    if (!address || typeof address === 'string') return null;\n    return { host: this.config.host, port: address.port };\n  }\n}\n\n/**\n * Create and start a standalone server\n */\nexport async function createStandaloneServer(\n  handlers: UIBridgeServerHandlers,\n  config?: StandaloneServerConfig\n): Promise<StandaloneServer> {\n  const server = new StandaloneServer(handlers, config);\n  await server.start();\n  return server;\n}\n\n/**\n * CLI entry point\n */\nexport async function startCLI(\n  handlers: UIBridgeServerHandlers,\n  args: string[] = process.argv.slice(2)\n): Promise<void> {\n  const config: StandaloneServerConfig = {};\n\n  // Parse CLI args\n  for (let i = 0; i < args.length; i++) {\n    const arg = args[i];\n    const nextArg = args[i + 1];\n\n    if (arg === '--port' || arg === '-p') {\n      config.port = parseInt(nextArg);\n      i++;\n    } else if (arg === '--host' || arg === '-h') {\n      config.host = nextArg;\n      i++;\n    } else if (arg === '--cors') {\n      config.cors = true;\n    }\n  }\n\n  const server = await createStandaloneServer(handlers, config);\n\n  // Handle shutdown\n  process.on('SIGINT', async () => {\n    console.log('\\nShutting down...');\n    await server.stop();\n    process.exit(0);\n  });\n\n  process.on('SIGTERM', async () => {\n    await server.stop();\n    process.exit(0);\n  });\n}\n"]}