{"version":3,"sources":["../src/types.ts","../src/express.ts"],"names":[],"mappings":"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","file":"express.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 * Express Adapter\n *\n * Express.js middleware for UI Bridge server.\n */\n\nimport type { Router, Request, Response, NextFunction } from 'express';\nimport type {\n  UIBridgeServerConfig,\n  UIBridgeServerHandlers,\n  APIResponse,\n  RouteDefinition,\n  CORSOptions,\n} from './types';\nimport { UI_BRIDGE_ROUTES } from './types';\nimport { mapInternalErrorCode } from './error-mapper';\n\n/**\n * Express-specific configuration\n */\nexport interface ExpressAdapterConfig extends UIBridgeServerConfig {\n  /** Use JSON body parser (if not already configured) */\n  useBodyParser?: boolean;\n}\n\n/**\n * Create CORS middleware\n */\nfunction createCORSMiddleware(options: CORSOptions | boolean) {\n  const corsOptions: CORSOptions =\n    typeof options === 'boolean'\n      ? { origin: options, methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'] }\n      : options;\n\n  return (req: Request, res: Response, next: NextFunction) => {\n    // Origin\n    if (corsOptions.origin === true) {\n      res.setHeader('Access-Control-Allow-Origin', '*');\n    } else if (typeof corsOptions.origin === 'string') {\n      res.setHeader('Access-Control-Allow-Origin', corsOptions.origin);\n    } else if (Array.isArray(corsOptions.origin)) {\n      const origin = req.headers.origin;\n      if (origin && corsOptions.origin.includes(origin)) {\n        res.setHeader('Access-Control-Allow-Origin', origin);\n      }\n    }\n\n    // Methods\n    if (corsOptions.methods) {\n      res.setHeader('Access-Control-Allow-Methods', corsOptions.methods.join(', '));\n    }\n\n    // Headers\n    if (corsOptions.headers) {\n      res.setHeader('Access-Control-Allow-Headers', corsOptions.headers.join(', '));\n    } else {\n      res.setHeader(\n        'Access-Control-Allow-Headers',\n        'Content-Type, Authorization, X-Requested-With'\n      );\n    }\n\n    // Credentials\n    if (corsOptions.credentials) {\n      res.setHeader('Access-Control-Allow-Credentials', 'true');\n    }\n\n    // Max age\n    if (corsOptions.maxAge) {\n      res.setHeader('Access-Control-Max-Age', String(corsOptions.maxAge));\n    }\n\n    // Handle preflight\n    if (req.method === 'OPTIONS') {\n      res.status(204).end();\n      return;\n    }\n\n    next();\n  };\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 * Create Express router with UI Bridge routes\n */\nexport function createExpressRouter(\n  handlers: UIBridgeServerHandlers,\n  config: ExpressAdapterConfig = {}\n): Router {\n  // Dynamic import to avoid bundling Express if not used\n\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const express = require('express');\n  const router: Router = express.Router();\n\n  // Add CORS middleware if configured\n  if (config.cors) {\n    router.use(createCORSMiddleware(config.cors));\n  }\n\n  // Add body parser if requested.\n  //\n  // Item B (iter-4 manual-test remediation): `express.json()` (body-parser\n  // strict mode in newer versions) returns HTTP 400 \"Unexpected end of JSON\n  // input\" / \"EOF\" when a POST arrives with `Content-Type: application/json`\n  // but a zero-byte body. Routes like `/control/page-health` take no\n  // parameters, so callers naturally send `curl -X POST -H 'Content-Type:\n  // application/json' .../page-health` without a payload. Normalize an\n  // empty body to `{}` BEFORE the JSON parser sees it so the request reaches\n  // the handler instead of dying at the middleware layer.\n  if (config.useBodyParser) {\n    router.use((req: Request, _res: Response, next: NextFunction) => {\n      const contentLength = req.headers['content-length'];\n      const isEmpty = contentLength === '0' || contentLength === undefined;\n      const isJson = (req.headers['content-type'] || '').includes('application/json');\n      if (req.method === 'POST' && isEmpty && isJson) {\n        // Mark body as already-parsed so express.json() short-circuits.\n        // Cast through `unknown` because Request typings consider req.body\n        // an unknown value, not a tagged shape.\n        (req as unknown as { body: unknown; _body: boolean })._body = true;\n        (req as unknown as { body: unknown }).body = {};\n      }\n      next();\n    });\n    router.use(express.json());\n    // Catch any residual body-parser errors (malformed JSON with non-zero\n    // content-length): downgrade to a structured 400 response carrying the\n    // canonical `BODY_PARSE_ERROR` code rather than express's default HTML.\n    router.use((err: Error & { type?: string }, _req: Request, res: Response, next: NextFunction) => {\n      if (err && err.type === 'entity.parse.failed') {\n        res.status(400).json(wrapError(err.message || 'Invalid JSON body', 'BODY_PARSE_ERROR'));\n        return;\n      }\n      next(err);\n    });\n  }\n\n  // Add authentication middleware if configured\n  if (config.authenticate) {\n    router.use(async (req: Request, res: Response, next: NextFunction) => {\n      try {\n        const authenticated = await config.authenticate!(req);\n        if (!authenticated) {\n          res.status(401).json(wrapError('Unauthorized', 'UNAUTHORIZED'));\n          return;\n        }\n        next();\n      } catch (error) {\n        res.status(500).json(wrapError(error as Error, 'AUTH_ERROR'));\n      }\n    });\n  }\n\n  // P2.2 — Endpoint discovery. Returns every (method, path) pair sorted by\n  // path so SDKs and tests can introspect what the server exposes without\n  // grepping the source. Mirrors the `/ui-bridge/_routes` endpoint on the\n  // runner.\n  router.get('/_routes', (_req: Request, res: Response) => {\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    res.json({\n      success: true,\n      data: { routes, count: routes.length },\n      timestamp: Date.now(),\n    });\n  });\n\n  // Register routes\n  for (const route of UI_BRIDGE_ROUTES) {\n    const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch';\n    const path = route.path;\n    const handlerName = route.handler as keyof UIBridgeServerHandlers;\n    const handler = handlers[handlerName];\n\n    if (!handler) {\n      console.warn(`Handler not found for route: ${route.method} ${route.path}`);\n      continue;\n    }\n\n    router[method](\n      path,\n      createRouteHandler(route, handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)\n    );\n  }\n\n  return router;\n}\n\n/**\n * Create a route handler from a route definition\n */\nfunction createRouteHandler(\n  route: RouteDefinition,\n  handler: (...args: unknown[]) => Promise<APIResponse<unknown>>\n) {\n  return async (req: Request, res: Response) => {\n    const start = performance.now();\n    try {\n      // Extract params\n      const args: unknown[] = [];\n\n      if (route.params) {\n        for (const param of route.params) {\n          args.push(req.params[param]);\n        }\n      }\n\n      // Add body if required. Defensive normalization (iter-4): an\n      // upstream proxy or a body-parser bypass can leave `req.body`\n      // undefined even for a POST. Handlers expect an object (e.g.\n      // `pageHealth()` takes no args but the route is POST). Coerce to\n      // `{}` so destructuring + key-access inside handlers doesn't crash.\n      if (route.bodyRequired || route.method === 'POST') {\n        args.push(req.body ?? {});\n      }\n\n      // Add query params for GET requests\n      if (route.method === 'GET' && Object.keys(req.query).length > 0) {\n        args.push(req.query);\n      }\n\n      const result = await handler(...args);\n      const durationMs = Math.round(performance.now() - start);\n      res.setHeader('X-Response-Time', `${durationMs}ms`);\n      res.json({ ...result, durationMs });\n    } catch (error) {\n      const durationMs = Math.round(performance.now() - start);\n      res.setHeader('X-Response-Time', `${durationMs}ms`);\n      res.status(500).json({ ...wrapError(error as Error, 'INTERNAL_ERROR'), durationMs });\n    }\n  };\n}\n\n/**\n * Create Express app with UI Bridge routes\n *\n * Convenience function that creates a complete Express app with UI Bridge.\n */\nexport function createExpressApp(\n  handlers: UIBridgeServerHandlers,\n  config: ExpressAdapterConfig = {}\n): unknown {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const express = require('express');\n  const app = express();\n\n  app.use(express.json());\n\n  const basePath = config.basePath || '/ui-bridge';\n  const router = createExpressRouter(handlers, { ...config, useBodyParser: false });\n\n  app.use(basePath, router);\n\n  // Health check\n  app.get('/health', (_req: Request, res: Response) => {\n    res.json({ status: 'ok', timestamp: Date.now() });\n  });\n\n  return app;\n}\n\n/**\n * Express middleware that adds UI Bridge to an existing app\n */\nexport function uiBridgeMiddleware(\n  handlers: UIBridgeServerHandlers,\n  config: ExpressAdapterConfig = {}\n): Router {\n  return createExpressRouter(handlers, config);\n}\n"]}