{"version":3,"file":"server.cjs","names":["readBody","entryToFixture","validateFixtures","flattenHeaders","getContext","getTestId","matchFixtureDiagnostic","recordMatchOptions","evaluateChaos","resolveStrictMode","strictNoMatchMessage","strictNoMatchLogLine","strictOverrideField","proxyAndRecord","resolveResponse","isErrorResponse","serializeErrorResponse","isAudioResponse","isContentWithToolCallsResponse","extractOverrides","resolveReasoningForModel","buildContentWithToolCallsCompletion","buildContentWithToolCallsChunks","buildUsageChunk","estimatePromptTokens","estimateTokens","createInterruptionSignal","writeSSEStream","isTextResponse","buildTextCompletion","buildTextChunks","isToolCallResponse","buildToolCallCompletion","buildToolCallChunks","Logger","createMetricsRegistry","OPENROUTER_VIDEO_DEFAULT_MAX_CONTENT_BYTES","Journal","VideoStateMap","OpenRouterVideoJobMap","http","normalizePathLabel","handleOllama","handleOllamaGenerate","handleOllamaEmbeddings","OPENROUTER_VIDEO_CONTENT_RE","handleOpenRouterVideoContent","handleOpenRouterVideoModels","OPENROUTER_VIDEO_STATUS_RE","handleOpenRouterVideoStatus","handleOpenRouterVideoCreate","handleResponses","handleMessages","handleCohere","handleCohereEmbed","handleEmbeddings","handleImages","handleImageEdit","handleImageVariations","handleSpeech","handleTranscription","handleVideoCreate","OPENAI_VIDEO_STATUS_RE","handleGeminiInteractions","handleGeminiEmbedContent","handleGemini","handleBedrock","handleBedrockStream","handleConverse","handleConverseStream","handleSearch","handleRerank","handleModeration","handleElevenLabsAudio","handleElevenLabsTTS","handleFal","handleFalQueue","upgradeToWebSocket"],"sources":["../src/server.ts"],"sourcesContent":["import * as http from \"node:http\";\nimport type {\n  Fixture,\n  FixtureFileEntry,\n  ChatCompletionRequest,\n  HandlerDefaults,\n  MockServerOptions,\n  Mountable,\n  RecordProviderKey,\n} from \"./types.js\";\nimport { Journal } from \"./journal.js\";\nimport { matchFixtureDiagnostic, recordMatchOptions } from \"./router.js\";\nimport { validateFixtures, entryToFixture } from \"./fixture-loader.js\";\nimport { writeSSEStream, writeErrorResponse } from \"./sse-writer.js\";\nimport { createInterruptionSignal } from \"./interruption.js\";\nimport {\n  buildTextChunks,\n  buildToolCallChunks,\n  buildTextCompletion,\n  buildToolCallCompletion,\n  buildContentWithToolCallsChunks,\n  buildContentWithToolCallsCompletion,\n  buildUsageChunk,\n  estimateTokens,\n  estimatePromptTokens,\n  extractOverrides,\n  isTextResponse,\n  isToolCallResponse,\n  isContentWithToolCallsResponse,\n  isErrorResponse,\n  serializeErrorResponse,\n  isAudioResponse,\n  flattenHeaders,\n  getTestId,\n  readBody,\n  resolveResponse,\n  resolveStrictMode,\n  resolveReasoningForModel,\n  strictOverrideField,\n  strictNoMatchMessage,\n  strictNoMatchLogLine,\n  getContext,\n} from \"./helpers.js\";\nimport { handleResponses } from \"./responses.js\";\nimport { handleMessages } from \"./messages.js\";\nimport { handleGemini } from \"./gemini.js\";\nimport { handleGeminiEmbedContent } from \"./gemini-embeddings.js\";\nimport { handleBedrock, handleBedrockStream } from \"./bedrock.js\";\nimport { handleConverse, handleConverseStream } from \"./bedrock-converse.js\";\nimport {\n  handleGeminiInteractions,\n  resetInteractionCounter,\n  resetEventIdCounter,\n} from \"./gemini-interactions.js\";\nimport { handleEmbeddings } from \"./embeddings.js\";\nimport { handleImages, handleImageEdit, handleImageVariations } from \"./images.js\";\nimport { handleSpeech } from \"./speech.js\";\nimport { handleTranscription } from \"./transcription.js\";\nimport { handleVideoCreate, handleVideoStatus, VideoStateMap } from \"./video.js\";\nimport {\n  handleOpenRouterVideoCreate,\n  handleOpenRouterVideoStatus,\n  handleOpenRouterVideoContent,\n  handleOpenRouterVideoModels,\n  OpenRouterVideoJobMap,\n  OPENROUTER_VIDEO_DEFAULT_MAX_CONTENT_BYTES,\n} from \"./openrouter-video.js\";\nimport { handleElevenLabsAudio, handleElevenLabsTTS } from \"./elevenlabs-audio.js\";\nimport { handleFalQueue, falJobs } from \"./fal-audio.js\";\nimport { handleFal, falQueueStates } from \"./fal.js\";\nimport { handleOllama, handleOllamaGenerate, handleOllamaEmbeddings } from \"./ollama.js\";\nimport { handleCohere, handleCohereEmbed } from \"./cohere.js\";\nimport { handleSearch, type SearchFixture } from \"./search.js\";\nimport { handleRerank, type RerankFixture } from \"./rerank.js\";\nimport { handleModeration, type ModerationFixture } from \"./moderation.js\";\nimport { upgradeToWebSocket, type WebSocketConnection } from \"./ws-framing.js\";\nimport { handleWebSocketResponses } from \"./ws-responses.js\";\nimport { handleWebSocketRealtime } from \"./ws-realtime.js\";\nimport { handleWebSocketGeminiLive } from \"./ws-gemini-live.js\";\nimport { Logger } from \"./logger.js\";\nimport { applyChaosAction, evaluateChaos } from \"./chaos.js\";\nimport {\n  createMetricsRegistry,\n  normalizePathLabel,\n  OPENAI_VIDEO_STATUS_RE,\n  OPENROUTER_VIDEO_CONTENT_RE,\n  OPENROUTER_VIDEO_STATUS_RE,\n} from \"./metrics.js\";\nimport { proxyAndRecord } from \"./recorder.js\";\n\nexport interface ServerInstance {\n  server: http.Server;\n  journal: Journal;\n  url: string;\n  defaults: HandlerDefaults;\n  videoStates: VideoStateMap;\n  openRouterVideoJobs: OpenRouterVideoJobMap;\n}\n\nconst COMPLETIONS_PATH = \"/v1/chat/completions\";\nconst RESPONSES_PATH = \"/v1/responses\";\nconst REALTIME_PATH = \"/v1/realtime\";\nconst GEMINI_LIVE_PATH =\n  \"/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent\";\nconst MESSAGES_PATH = \"/v1/messages\";\nconst EMBEDDINGS_PATH = \"/v1/embeddings\";\nconst COHERE_CHAT_PATH = \"/v2/chat\";\nconst COHERE_EMBED_PATH = \"/v2/embed\";\nconst SEARCH_PATH = \"/search\";\nconst RERANK_PATH = \"/v2/rerank\";\nconst MODERATIONS_PATH = \"/v1/moderations\";\nconst IMAGES_PATH = \"/v1/images/generations\";\nconst IMAGES_EDIT_PATH = \"/v1/images/edits\";\nconst IMAGES_VARIATIONS_PATH = \"/v1/images/variations\";\nconst SPEECH_PATH = \"/v1/audio/speech\";\nconst TRANSCRIPTIONS_PATH = \"/v1/audio/transcriptions\";\nconst TRANSLATIONS_PATH = \"/v1/audio/translations\";\nconst VIDEOS_PATH = \"/v1/videos\";\nconst GEMINI_PREDICT_RE = /^\\/v1beta\\/models\\/([^:]+):predict$/;\nconst ELEVENLABS_SOUND_GENERATION_PATH = \"/v1/sound-generation\";\nconst ELEVENLABS_TTS_RE = /^\\/v1\\/text-to-speech\\/([^/]+)$/;\nconst ELEVENLABS_MUSIC_RE = /^\\/v1\\/music(?:\\/(.+))?$/;\nconst FAL_QUEUE_SUBMIT_RE = /^\\/fal\\/queue\\/submit\\/(.+)$/;\nconst FAL_QUEUE_REQUESTS_RE = /^\\/fal\\/queue\\/requests\\/(.+)$/;\nconst FAL_RUN_RE = /^\\/fal\\/run\\/(.+)$/;\nconst FAL_PREFIX_RE = /^\\/fal(?:\\/.*)?$/;\nconst DEFAULT_CHUNK_SIZE = 20;\n\n// OpenAI-compatible endpoint suffixes for path prefix normalization.\n// Providers like BigModel (/v4/) use non-standard base URL prefixes.\n// Only includes endpoints that third-party OpenAI-compatible providers are\n// likely to serve — excludes provider-specific paths (/messages, /realtime)\n// and endpoints unlikely to appear behind non-standard prefixes\n// (/moderations, /videos, /models).\nconst COMPAT_SUFFIXES = [\n  \"/chat/completions\",\n  \"/embeddings\",\n  \"/responses\",\n  \"/audio/speech\",\n  \"/audio/transcriptions\",\n  \"/audio/translations\",\n  \"/images/generations\",\n  \"/images/edits\",\n  \"/images/variations\",\n];\n\n/**\n * Normalize OpenAI-compatible paths with arbitrary prefixes.\n * Strips /openai/ prefix and rewrites paths ending in known suffixes to /v1/<suffix>.\n * Skips /v1/ (already standard) and /v2/ (Cohere convention).\n */\nfunction normalizeCompatPath(pathname: string, logger?: Logger): string {\n  // Strip /openai/ prefix (Groq/OpenAI-compat alias)\n  if (pathname.startsWith(\"/openai/\")) {\n    pathname = pathname.slice(\"/openai\".length);\n  }\n\n  // Normalize arbitrary prefixes to /v1/\n  if (!pathname.startsWith(\"/v1/\") && !pathname.startsWith(\"/v2/\")) {\n    for (const suffix of COMPAT_SUFFIXES) {\n      if (pathname.endsWith(suffix)) {\n        if (logger) logger.debug(`Path normalized: ${pathname} → /v1${suffix}`);\n        pathname = \"/v1\" + suffix;\n        break;\n      }\n    }\n  }\n\n  return pathname;\n}\n\nconst GEMINI_INTERACTIONS_PATH = \"/v1beta/interactions\";\nconst GEMINI_PATH_RE = /^\\/v1beta\\/models\\/([^:]+):(generateContent|streamGenerateContent)$/;\nconst GEMINI_EMBED_RE = /^\\/v1beta\\/models\\/([^:]+):embedContent$/;\nconst AZURE_DEPLOYMENT_RE = /^\\/openai\\/deployments\\/([^/]+)\\/(chat\\/completions|embeddings)$/;\nconst BEDROCK_INVOKE_RE = /^\\/model\\/([^/]+)\\/invoke$/;\nconst BEDROCK_STREAM_RE = /^\\/model\\/([^/]+)\\/invoke-with-response-stream$/;\nconst BEDROCK_CONVERSE_RE = /^\\/model\\/([^/]+)\\/converse$/;\nconst BEDROCK_CONVERSE_STREAM_RE = /^\\/model\\/([^/]+)\\/converse-stream$/;\nconst VERTEX_AI_RE =\n  /^\\/v1\\/projects\\/[^/]+\\/locations\\/[^/]+\\/publishers\\/google\\/models\\/([^/:]+):(generateContent|streamGenerateContent)$/;\n\nconst OLLAMA_CHAT_PATH = \"/api/chat\";\nconst OLLAMA_GENERATE_PATH = \"/api/generate\";\nconst OLLAMA_EMBEDDINGS_PATH = \"/api/embeddings\";\nconst OLLAMA_EMBED_PATH = \"/api/embed\";\nconst OLLAMA_TAGS_PATH = \"/api/tags\";\n\n// OpenRouter async video lifecycle (/api/v1/videos). Dispatch order matters:\n// content RE → models exact → status RE → submit exact. The status RE's\n// `[^/]+` segment would otherwise swallow the `models` listing path. The\n// content/status REs are shared with metrics.ts path-label normalization\n// (imported above).\nconst OPENROUTER_VIDEOS_PATH = \"/api/v1/videos\";\nconst OPENROUTER_VIDEO_MODELS_PATH = \"/api/v1/videos/models\";\n\nconst HEALTH_PATH = \"/health\";\nconst READY_PATH = \"/ready\";\nconst MODELS_PATH = \"/v1/models\";\nconst REQUESTS_PATH = \"/v1/_requests\";\n\nconst DEFAULT_MODELS = [\n  \"gpt-4\",\n  \"gpt-4o\",\n  \"claude-3-5-sonnet-20241022\",\n  \"gemini-2.0-flash\",\n  \"text-embedding-3-small\",\n];\n\nconst CORS_HEADERS: Record<string, string> = {\n  \"Access-Control-Allow-Origin\": \"*\",\n  \"Access-Control-Allow-Methods\": \"GET, POST, DELETE, OPTIONS\",\n  \"Access-Control-Allow-Headers\": \"*\",\n};\n\nfunction setCorsHeaders(res: http.ServerResponse): void {\n  for (const [key, value] of Object.entries(CORS_HEADERS)) {\n    res.setHeader(key, value);\n  }\n}\n\nfunction handleOptions(res: http.ServerResponse): void {\n  setCorsHeaders(res);\n  res.writeHead(204);\n  res.end();\n}\n\nfunction handleNotFound(res: http.ServerResponse, message: string): void {\n  setCorsHeaders(res);\n  writeErrorResponse(res, 404, JSON.stringify({ error: { message, type: \"not_found\" } }));\n}\n\n// ---------------------------------------------------------------------------\n// /__aimock/* control API — used by aimock-pytest and other test harnesses\n// to manage fixtures, journal, and error injection without restarting the\n// server.\n// ---------------------------------------------------------------------------\n\nconst CONTROL_PREFIX = \"/__aimock\";\n\n/**\n * Perform a full fixtures reset: clear the fixtures array, journal, video/fal\n * generation state, and the interaction/event-id counters, then zero the\n * `aimock_fixtures_loaded` gauge. Shared by `/reset/fixtures` and the\n * deprecated `/reset` alias.\n */\nfunction performFixturesReset(\n  fixtures: Fixture[],\n  journal: Journal,\n  videoStates: VideoStateMap,\n  openRouterVideoJobs: OpenRouterVideoJobMap,\n  defaults: HandlerDefaults,\n): void {\n  fixtures.length = 0;\n  journal.clear();\n  videoStates.clear();\n  openRouterVideoJobs.clear();\n  falJobs.clear();\n  falQueueStates.clear();\n  resetInteractionCounter();\n  resetEventIdCounter();\n  if (defaults.registry) {\n    defaults.registry.setGauge(\"aimock_fixtures_loaded\", {}, fixtures.length);\n  }\n}\n\n/**\n * Handle requests under `/__aimock/`. Returns `true` if the request was\n * handled, `false` if the path doesn't match the control prefix.\n */\nasync function handleControlAPI(\n  req: http.IncomingMessage,\n  res: http.ServerResponse,\n  pathname: string,\n  fixtures: Fixture[],\n  journal: Journal,\n  videoStates: VideoStateMap,\n  openRouterVideoJobs: OpenRouterVideoJobMap,\n  defaults: HandlerDefaults,\n): Promise<boolean> {\n  if (!pathname.startsWith(CONTROL_PREFIX)) return false;\n\n  const subPath = pathname.slice(CONTROL_PREFIX.length);\n  setCorsHeaders(res);\n\n  // GET /__aimock/health\n  if (subPath === \"/health\" && req.method === \"GET\") {\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify({ status: \"ok\" }));\n    return true;\n  }\n\n  // GET /__aimock/journal\n  if (subPath === \"/journal\" && req.method === \"GET\") {\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify(journal.getAll()));\n    return true;\n  }\n\n  // POST /__aimock/fixtures — add fixtures dynamically\n  if (subPath === \"/fixtures\" && req.method === \"POST\") {\n    let raw: string;\n    try {\n      raw = await readBody(req);\n    } catch (err) {\n      const msg = err instanceof Error ? err.message : String(err);\n      defaults.logger.error(`POST /__aimock/fixtures: failed to read body: ${msg}`);\n      res.writeHead(400, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ error: `Failed to read request body: ${msg}` }));\n      return true;\n    }\n\n    let parsed: { fixtures?: FixtureFileEntry[] };\n    try {\n      parsed = JSON.parse(raw) as { fixtures?: FixtureFileEntry[] };\n    } catch (err) {\n      const msg = err instanceof Error ? err.message : String(err);\n      defaults.logger.error(`POST /__aimock/fixtures: invalid JSON: ${msg}`);\n      res.writeHead(400, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ error: `Invalid JSON: ${msg}` }));\n      return true;\n    }\n\n    if (!Array.isArray(parsed.fixtures)) {\n      res.writeHead(400, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ error: 'Missing or invalid \"fixtures\" array' }));\n      return true;\n    }\n\n    const converted = parsed.fixtures.map((e) => entryToFixture(e));\n    const issues = validateFixtures(converted);\n    const errors = issues.filter((i) => i.severity === \"error\");\n    if (errors.length > 0) {\n      res.writeHead(400, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ error: \"Validation failed\", details: errors }));\n      return true;\n    }\n\n    fixtures.push(...converted);\n    if (defaults.registry) {\n      defaults.registry.setGauge(\"aimock_fixtures_loaded\", {}, fixtures.length);\n    }\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify({ added: converted.length }));\n    return true;\n  }\n\n  // DELETE /__aimock/fixtures — clear all fixtures\n  if (subPath === \"/fixtures\" && req.method === \"DELETE\") {\n    fixtures.length = 0;\n    if (defaults.registry) {\n      defaults.registry.setGauge(\"aimock_fixtures_loaded\", {}, fixtures.length);\n    }\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify({ cleared: true }));\n    return true;\n  }\n\n  // POST /__aimock/reset/fixtures — full reset (fixtures + journal + match counts)\n  if (subPath === \"/reset/fixtures\" && req.method === \"POST\") {\n    performFixturesReset(fixtures, journal, videoStates, openRouterVideoJobs, defaults);\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify({ reset: true }));\n    return true;\n  }\n\n  // POST /__aimock/reset/journal — clear only the request journal entries,\n  // preserving fixture match-counts (sequencing state stays intact)\n  if (subPath === \"/reset/journal\" && req.method === \"POST\") {\n    journal.clearEntries();\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify({ reset: true }));\n    return true;\n  }\n\n  // POST /__aimock/reset — DEPRECATED alias for /reset/fixtures (full reset)\n  if (subPath === \"/reset\" && req.method === \"POST\") {\n    performFixturesReset(fixtures, journal, videoStates, openRouterVideoJobs, defaults);\n    const deprecation =\n      \"POST /__aimock/reset is deprecated; use POST /__aimock/reset/fixtures (full reset) or POST /__aimock/reset/journal (journal only)\";\n    defaults.logger.warn(\n      \"POST /__aimock/reset is deprecated; use /__aimock/reset/fixtures or /__aimock/reset/journal\",\n    );\n    res.writeHead(200, { \"Content-Type\": \"application/json\", Deprecation: \"true\" });\n    res.end(JSON.stringify({ reset: true, deprecated: true, deprecation }));\n    return true;\n  }\n\n  // POST /__aimock/error — queue a one-shot error\n  if (subPath === \"/error\" && req.method === \"POST\") {\n    let raw: string;\n    try {\n      raw = await readBody(req);\n    } catch (err) {\n      const msg = err instanceof Error ? err.message : String(err);\n      defaults.logger.error(`POST /__aimock/error: failed to read body: ${msg}`);\n      res.writeHead(400, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ error: `Failed to read request body: ${msg}` }));\n      return true;\n    }\n\n    let parsed: { status?: number; body?: { message?: string; type?: string; code?: string } };\n    try {\n      parsed = JSON.parse(raw) as typeof parsed;\n    } catch (err) {\n      const msg = err instanceof Error ? err.message : String(err);\n      defaults.logger.error(`POST /__aimock/error: invalid JSON: ${msg}`);\n      res.writeHead(400, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ error: `Invalid JSON: ${msg}` }));\n      return true;\n    }\n\n    const status = parsed.status ?? 500;\n    const errorBody = parsed.body;\n    const errorFixture: Fixture = {\n      match: { predicate: () => true },\n      response: {\n        error: {\n          message: errorBody?.message ?? \"Injected error\",\n          type: errorBody?.type ?? \"server_error\",\n          code: errorBody?.code,\n        },\n        status,\n      },\n    };\n    // Insert at front so it matches before everything else\n    fixtures.unshift(errorFixture);\n    // One-shot: match once then self-remove.  We use a `consumed` flag to\n    // prevent double-matching from concurrent requests and defer the actual\n    // splice via queueMicrotask so it never mutates the fixtures array while\n    // matchFixture is iterating over it.\n    let consumed = false;\n    const original = errorFixture.match.predicate!;\n    errorFixture.match.predicate = (req) => {\n      if (consumed) return false;\n      const result = original(req);\n      if (result) {\n        consumed = true;\n        queueMicrotask(() => {\n          const idx = fixtures.indexOf(errorFixture);\n          if (idx !== -1) fixtures.splice(idx, 1);\n        });\n      }\n      return result;\n    };\n\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify({ queued: true }));\n    return true;\n  }\n\n  // Unknown control path\n  handleNotFound(res, `Unknown control endpoint: ${pathname}`);\n  return true;\n}\n\nasync function handleCompletions(\n  req: http.IncomingMessage,\n  res: http.ServerResponse,\n  fixtures: Fixture[],\n  journal: Journal,\n  defaults: HandlerDefaults,\n  modelFallback?: string,\n  providerKey?: RecordProviderKey,\n): Promise<void> {\n  setCorsHeaders(res);\n\n  // Read request body\n  let raw: string;\n  try {\n    raw = await readBody(req);\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : \"Failed to read request body\";\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body: null,\n      response: { status: 500, fixture: null },\n    });\n    writeErrorResponse(\n      res,\n      500,\n      JSON.stringify({\n        error: {\n          message: `Request body read failed: ${msg}`,\n          type: \"server_error\",\n        },\n      }),\n    );\n    return;\n  }\n\n  // Parse JSON body\n  let body: ChatCompletionRequest;\n  try {\n    body = JSON.parse(raw) as ChatCompletionRequest;\n    // Azure deployments may omit model from body — use deployment ID as fallback\n    if (modelFallback && !body.model) {\n      body.model = modelFallback;\n    }\n  } catch (parseErr: unknown) {\n    const detail = parseErr instanceof Error ? parseErr.message : \"unknown parse error\";\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body: null,\n      response: { status: 400, fixture: null },\n    });\n    writeErrorResponse(\n      res,\n      400,\n      JSON.stringify({\n        error: {\n          message: `Malformed JSON: ${detail}`,\n          type: \"invalid_request_error\",\n          param: null,\n          code: \"invalid_json\",\n        },\n      }),\n    );\n    return;\n  }\n\n  // Validate messages array\n  if (!Array.isArray(body.messages)) {\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body: null,\n      response: { status: 400, fixture: null },\n    });\n    writeErrorResponse(\n      res,\n      400,\n      JSON.stringify({\n        error: {\n          message: \"Missing required parameter: 'messages'\",\n          type: \"invalid_request_error\",\n          param: null,\n          code: null,\n        },\n      }),\n    );\n    return;\n  }\n\n  const method = req.method ?? \"POST\";\n  const path = req.url ?? COMPLETIONS_PATH;\n  const flatHeaders = flattenHeaders(req.headers);\n\n  // Set endpoint type once early so router/recorder and journal see it\n  body._endpointType = \"chat\";\n  body._context = getContext(req);\n\n  // Match fixture first — chaos resolution depends on fixture-level overrides\n  // (headers > fixture.chaos > server defaults), so the fixture has to be\n  // known before we can roll with the right config.\n  const testId = getTestId(req);\n  const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(\n    fixtures,\n    body,\n    journal.getFixtureMatchCountsForTest(testId),\n    defaults.requestTransform,\n    // In record mode a miss proxies upstream to capture a fresh turn, so an\n    // earlier-turn capture must not shadow a longer request via the relaxed\n    // turnIndex disambiguator — keep turnIndex a strict gate while recording.\n    // This handler's record gate (below) is `defaults.record && providerKey`.\n    recordMatchOptions(!!(defaults.record && providerKey), defaults.logger),\n  );\n\n  if (fixture) {\n    journal.incrementFixtureMatchCount(fixture, fixtures, testId);\n    defaults.logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);\n  } else {\n    const lastUserMsg = body.messages.filter((m) => m.role === \"user\").pop();\n    const snippet =\n      typeof lastUserMsg?.content === \"string\" ? lastUserMsg.content.slice(0, 80) : \"\";\n    defaults.logger.debug(\n      `No fixture matched for request (model=${body.model ?? \"?\"}, msg=\"${snippet}\")`,\n    );\n  }\n\n  // Roll chaos once per request. Dispatch by action + path:\n  //   drop / disconnect → apply immediately; upstream is never called and no\n  //                       response body is produced.\n  //   malformed, fixture path → write invalid JSON instead of the fixture.\n  //   malformed, proxy path  → proxy to upstream, then swap body via the\n  //                            beforeWriteResponse hook (passed only when the\n  //                            action is malformed, so the hook doesn't need\n  //                            to re-check the action).\n  const chaosAction = evaluateChaos(fixture, defaults.chaos, req.headers, defaults.logger);\n  const chaosContext = { method, path, headers: flatHeaders, body };\n\n  if (chaosAction === \"drop\" || chaosAction === \"disconnect\") {\n    applyChaosAction(\n      chaosAction,\n      res,\n      fixture,\n      journal,\n      chaosContext,\n      fixture ? \"fixture\" : \"proxy\",\n      defaults.registry,\n    );\n    return;\n  }\n\n  if (fixture && chaosAction === \"malformed\") {\n    applyChaosAction(\n      chaosAction,\n      res,\n      fixture,\n      journal,\n      chaosContext,\n      \"fixture\",\n      defaults.registry,\n    );\n    return;\n  }\n\n  if (!fixture) {\n    const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);\n    if (effectiveStrict) {\n      const strictStatus = 503;\n      const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);\n      defaults.logger.error(\n        strictNoMatchLogLine(\n          req.method ?? \"POST\",\n          req.url ?? COMPLETIONS_PATH,\n          skippedBySequenceOrTurn,\n        ),\n      );\n      journal.add({\n        method: req.method ?? \"POST\",\n        path: req.url ?? COMPLETIONS_PATH,\n        headers: flattenHeaders(req.headers),\n        body,\n        response: {\n          status: strictStatus,\n          fixture: null,\n          ...strictOverrideField(defaults.strict, req.headers),\n        },\n      });\n      writeErrorResponse(\n        res,\n        strictStatus,\n        JSON.stringify({\n          error: {\n            message: strictMessage,\n            type: \"invalid_request_error\",\n            param: null,\n            code: \"no_fixture_match\",\n          },\n        }),\n      );\n      return;\n    }\n\n    // Try record-and-replay proxy if configured\n    if (defaults.record && providerKey) {\n      // Hook is only passed when chaos wants to mutate the response. When\n      // it's passed, it unconditionally applies malformed + journals + tells\n      // proxyAndRecord to skip its default relay. The hook has no branching\n      // logic — that decision is made here, at the call site.\n      const hookOptions =\n        chaosAction === \"malformed\"\n          ? {\n              // Malformed is emitted as a hardcoded invalid-JSON body, so the\n              // captured upstream response isn't used here (the parameter is\n              // intentionally omitted rather than declared-and-ignored).\n              // Future dispatch (phase 3: non-JSON / streaming) will accept\n              // the response and branch on contentType.\n              beforeWriteResponse: () => {\n                applyChaosAction(\n                  chaosAction,\n                  res,\n                  null,\n                  journal,\n                  chaosContext,\n                  \"proxy\",\n                  defaults.registry,\n                );\n                return true;\n              },\n              // Streaming responses can't be mutated post-facto (bytes already\n              // on the wire). Record the bypass so the rolled action isn't\n              // invisible in logs / Prometheus.\n              onHookBypassed: (reason: \"sse_streamed\" | \"ndjson_streamed\" | \"binary_streamed\") => {\n                defaults.logger.warn(\n                  `[chaos] malformed bypassed on proxy: upstream returned streaming response (${reason})`,\n                );\n                defaults.registry?.incrementCounter(\"aimock_chaos_bypassed_total\", {\n                  action: \"malformed\",\n                  source: \"proxy\",\n                  reason,\n                });\n              },\n            }\n          : undefined;\n\n      const outcome = await proxyAndRecord(\n        req,\n        res,\n        body,\n        providerKey,\n        req.url ?? COMPLETIONS_PATH,\n        fixtures,\n        defaults,\n        raw,\n        hookOptions,\n      );\n      if (outcome === \"handled_by_hook\") return;\n      if (outcome !== \"not_configured\") {\n        journal.add({\n          method: req.method ?? \"POST\",\n          path: req.url ?? COMPLETIONS_PATH,\n          headers: flattenHeaders(req.headers),\n          body,\n          response: { status: res.statusCode ?? 200, fixture: null, source: \"proxy\" },\n        });\n        return;\n      }\n      // outcome === \"not_configured\" — fall through to 404\n    }\n\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body,\n      response: {\n        status: 404,\n        fixture: null,\n        ...strictOverrideField(defaults.strict, req.headers),\n      },\n    });\n    writeErrorResponse(\n      res,\n      404,\n      JSON.stringify({\n        error: {\n          message: \"No fixture matched\",\n          type: \"invalid_request_error\",\n          param: null,\n          code: \"no_fixture_match\",\n        },\n      }),\n    );\n    return;\n  }\n\n  const response = await resolveResponse(fixture, body);\n  const latency = fixture.latency ?? defaults.latency;\n  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);\n  const includeUsage = body.stream === true && body.stream_options?.include_usage === true;\n\n  // Error response\n  if (isErrorResponse(response)) {\n    const status = response.status ?? 500;\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body,\n      response: { status, fixture },\n    });\n    writeErrorResponse(res, status, serializeErrorResponse(response), {\n      retryAfter: response.retryAfter,\n    });\n    return;\n  }\n\n  // Audio responses are not supported on the chat completions endpoint\n  if (isAudioResponse(response)) {\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body,\n      response: { status: 422, fixture },\n    });\n    writeErrorResponse(\n      res,\n      422,\n      JSON.stringify({\n        error: {\n          message:\n            \"Audio responses are not supported on the chat completions endpoint. Use Gemini generateContent or a dedicated audio endpoint.\",\n          type: \"invalid_request_error\",\n        },\n      }),\n    );\n    return;\n  }\n\n  // Content + tool calls response\n  if (isContentWithToolCallsResponse(response)) {\n    if (response.webSearches?.length) {\n      defaults.logger.warn(\n        \"webSearches in fixture response are not supported for Chat Completions API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      body.model,\n      effectiveStrict,\n      defaults.logger,\n    );\n    const journalEntry = journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body,\n      response: { status: 200, fixture },\n    });\n    if (body.stream !== true) {\n      const completion = buildContentWithToolCallsCompletion(\n        response.content,\n        response.toolCalls,\n        body.model,\n        effReasoning,\n        overrides,\n        body.messages,\n      );\n      res.writeHead(200, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify(completion));\n    } else {\n      const chunks = buildContentWithToolCallsChunks(\n        response.content,\n        response.toolCalls,\n        body.model,\n        chunkSize,\n        effReasoning,\n        overrides,\n      );\n      // Build usage chunk for stream_options.include_usage\n      const completionText =\n        response.content + response.toolCalls.map((tc) => tc.name + tc.arguments).join(\"\");\n      const usageChunk = includeUsage\n        ? buildUsageChunk(\n            chunks[0]?.id ?? \"chatcmpl-unknown\",\n            overrides?.model ?? body.model,\n            chunks[0]?.created ?? Math.floor(Date.now() / 1000),\n            overrides?.usage\n              ? {\n                  prompt_tokens: overrides.usage.prompt_tokens ?? 0,\n                  completion_tokens: overrides.usage.completion_tokens ?? 0,\n                  total_tokens:\n                    overrides.usage.total_tokens ??\n                    (overrides.usage.prompt_tokens ?? 0) + (overrides.usage.completion_tokens ?? 0),\n                }\n              : {\n                  prompt_tokens: estimatePromptTokens(body.messages),\n                  completion_tokens: estimateTokens(completionText),\n                  total_tokens:\n                    estimatePromptTokens(body.messages) + estimateTokens(completionText),\n                },\n            overrides?.systemFingerprint,\n          )\n        : undefined;\n      const interruption = createInterruptionSignal(fixture);\n      const completed = await writeSSEStream(res, chunks, {\n        latency,\n        streamingProfile: fixture.streamingProfile,\n        signal: interruption?.signal,\n        onChunkSent: interruption?.tick,\n        usageChunk,\n        recordedTimings: fixture.recordedTimings,\n        replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n      });\n      if (!completed) {\n        if (!res.writableEnded) res.destroy();\n        journalEntry.response.interrupted = true;\n        journalEntry.response.interruptReason = interruption?.reason();\n      }\n      interruption?.cleanup();\n    }\n    return;\n  }\n\n  // Text response\n  if (isTextResponse(response)) {\n    if (response.webSearches?.length) {\n      defaults.logger.warn(\n        \"webSearches in fixture response are not supported for Chat Completions API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      body.model,\n      effectiveStrict,\n      defaults.logger,\n    );\n    const journalEntry = journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body,\n      response: { status: 200, fixture },\n    });\n    if (body.stream !== true) {\n      const completion = buildTextCompletion(\n        response.content,\n        body.model,\n        effReasoning,\n        overrides,\n        body.messages,\n      );\n      res.writeHead(200, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify(completion));\n    } else {\n      const chunks = buildTextChunks(\n        response.content,\n        body.model,\n        chunkSize,\n        effReasoning,\n        overrides,\n      );\n      const usageChunk = includeUsage\n        ? buildUsageChunk(\n            chunks[0]?.id ?? \"chatcmpl-unknown\",\n            overrides?.model ?? body.model,\n            chunks[0]?.created ?? Math.floor(Date.now() / 1000),\n            overrides?.usage\n              ? {\n                  prompt_tokens: overrides.usage.prompt_tokens ?? 0,\n                  completion_tokens: overrides.usage.completion_tokens ?? 0,\n                  total_tokens:\n                    overrides.usage.total_tokens ??\n                    (overrides.usage.prompt_tokens ?? 0) + (overrides.usage.completion_tokens ?? 0),\n                }\n              : {\n                  prompt_tokens: estimatePromptTokens(body.messages),\n                  completion_tokens: estimateTokens(response.content),\n                  total_tokens:\n                    estimatePromptTokens(body.messages) + estimateTokens(response.content),\n                },\n            overrides?.systemFingerprint,\n          )\n        : undefined;\n      const interruption = createInterruptionSignal(fixture);\n      const completed = await writeSSEStream(res, chunks, {\n        latency,\n        streamingProfile: fixture.streamingProfile,\n        signal: interruption?.signal,\n        onChunkSent: interruption?.tick,\n        usageChunk,\n        recordedTimings: fixture.recordedTimings,\n        replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n      });\n      if (!completed) {\n        if (!res.writableEnded) res.destroy();\n        journalEntry.response.interrupted = true;\n        journalEntry.response.interruptReason = interruption?.reason();\n      }\n      interruption?.cleanup();\n    }\n    return;\n  }\n\n  // Tool call response\n  if (isToolCallResponse(response)) {\n    if (response.webSearches?.length) {\n      defaults.logger.warn(\n        \"webSearches in fixture response are not supported for Chat Completions API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      body.model,\n      effectiveStrict,\n      defaults.logger,\n    );\n    const journalEntry = journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? COMPLETIONS_PATH,\n      headers: flattenHeaders(req.headers),\n      body,\n      response: { status: 200, fixture },\n    });\n    if (body.stream !== true) {\n      const completion = buildToolCallCompletion(\n        response.toolCalls,\n        body.model,\n        effReasoning,\n        overrides,\n        body.messages,\n      );\n      res.writeHead(200, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify(completion));\n    } else {\n      const chunks = buildToolCallChunks(\n        response.toolCalls,\n        body.model,\n        chunkSize,\n        effReasoning,\n        overrides,\n      );\n      const completionText = response.toolCalls.map((tc) => tc.name + tc.arguments).join(\"\");\n      const usageChunk = includeUsage\n        ? buildUsageChunk(\n            chunks[0]?.id ?? \"chatcmpl-unknown\",\n            overrides?.model ?? body.model,\n            chunks[0]?.created ?? Math.floor(Date.now() / 1000),\n            overrides?.usage\n              ? {\n                  prompt_tokens: overrides.usage.prompt_tokens ?? 0,\n                  completion_tokens: overrides.usage.completion_tokens ?? 0,\n                  total_tokens:\n                    overrides.usage.total_tokens ??\n                    (overrides.usage.prompt_tokens ?? 0) + (overrides.usage.completion_tokens ?? 0),\n                }\n              : {\n                  prompt_tokens: estimatePromptTokens(body.messages),\n                  completion_tokens: estimateTokens(completionText),\n                  total_tokens:\n                    estimatePromptTokens(body.messages) + estimateTokens(completionText),\n                },\n            overrides?.systemFingerprint,\n          )\n        : undefined;\n      const interruption = createInterruptionSignal(fixture);\n      const completed = await writeSSEStream(res, chunks, {\n        latency,\n        streamingProfile: fixture.streamingProfile,\n        signal: interruption?.signal,\n        onChunkSent: interruption?.tick,\n        usageChunk,\n        recordedTimings: fixture.recordedTimings,\n        replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n      });\n      if (!completed) {\n        if (!res.writableEnded) res.destroy();\n        journalEntry.response.interrupted = true;\n        journalEntry.response.interruptReason = interruption?.reason();\n      }\n      interruption?.cleanup();\n    }\n    return;\n  }\n\n  // Fixture response matched no known type — guard against silent hang\n  journal.add({\n    method: req.method ?? \"POST\",\n    path: req.url ?? COMPLETIONS_PATH,\n    headers: flattenHeaders(req.headers),\n    body,\n    response: { status: 500, fixture },\n  });\n  writeErrorResponse(\n    res,\n    500,\n    JSON.stringify({\n      error: {\n        message: \"Fixture response did not match any known type\",\n        type: \"server_error\",\n      },\n    }),\n  );\n}\n\nexport interface ServiceFixtures {\n  search: SearchFixture[];\n  rerank: RerankFixture[];\n  moderation: ModerationFixture[];\n}\n\n// NOTE: The fixtures array is read by reference on each request. Callers\n// (e.g. LLMock) may mutate it after the server starts and changes will\n// be visible immediately. This is intentional — do not copy the array.\nexport async function createServer(\n  fixtures: Fixture[],\n  options?: MockServerOptions,\n  mounts?: Array<{ path: string; handler: Mountable }>,\n  serviceFixtures?: ServiceFixtures,\n): Promise<ServerInstance> {\n  const host = options?.host ?? \"127.0.0.1\";\n  const port = options?.port ?? 0;\n  const logger = new Logger(options?.logLevel ?? \"silent\");\n  const registry = options?.metrics ? createMetricsRegistry() : undefined;\n  const serverOptions = options ?? {};\n  const defaults = {\n    latency: serverOptions.latency ?? 0,\n    chunkSize: Math.max(1, serverOptions.chunkSize ?? DEFAULT_CHUNK_SIZE),\n    replaySpeed: serverOptions.replaySpeed ?? 1.0,\n    logger,\n    get chaos() {\n      return serverOptions.chaos;\n    },\n    registry,\n    get record() {\n      return serverOptions.record;\n    },\n    get strict() {\n      return serverOptions.strict;\n    },\n    get requestTransform() {\n      return serverOptions.requestTransform;\n    },\n    get falQueue() {\n      return serverOptions.falQueue;\n    },\n    get openRouterVideo() {\n      return serverOptions.openRouterVideo;\n    },\n  };\n\n  // Validate chaos config rates\n  if (options?.chaos) {\n    const chaosRates = [\n      { name: \"dropRate\", value: options.chaos.dropRate },\n      { name: \"malformedRate\", value: options.chaos.malformedRate },\n      { name: \"disconnectRate\", value: options.chaos.disconnectRate },\n    ];\n    for (const { name, value } of chaosRates) {\n      if (value !== undefined && (value < 0 || value > 1)) {\n        logger.warn(`Chaos ${name} (${value}) is outside 0-1 range — will be clamped at runtime`);\n      }\n    }\n  }\n\n  // Validate poll-progression thresholds (resolveProgression treats\n  // non-finite values as unset and floors/clamps the rest to >= 0 integers)\n  for (const { name, config } of [\n    { name: \"falQueue\", config: options?.falQueue },\n    { name: \"openRouterVideo\", config: options?.openRouterVideo },\n  ]) {\n    if (!config) continue;\n    for (const field of [\"pollsBeforeInProgress\", \"pollsBeforeCompleted\"] as const) {\n      const value = config[field];\n      if (value === undefined) continue;\n      if (!Number.isFinite(value)) {\n        logger.warn(`${name}.${field} (${value}) is not a finite number — treating as unset`);\n      } else if (!Number.isInteger(value) || value < 0) {\n        logger.warn(\n          `${name}.${field} (${value}) is not a non-negative integer — flooring/clamping to a non-negative integer`,\n        );\n      }\n    }\n  }\n\n  // Validate the recorded-b64 cap: the capture path treats a negative or\n  // non-integer record.openRouterVideo.maxContentBytes as the default rather\n  // than letting `cap > 0` checks misbehave on negatives or NaN.\n  {\n    const cap = options?.record?.openRouterVideo?.maxContentBytes;\n    if (cap !== undefined && (!Number.isInteger(cap) || cap < 0)) {\n      logger.warn(\n        `record.openRouterVideo.maxContentBytes (${cap}) is not a non-negative integer — using the default cap (${OPENROUTER_VIDEO_DEFAULT_MAX_CONTENT_BYTES})`,\n      );\n    }\n  }\n\n  // Programmatic default: finite caps so long-running embedders don't inherit\n  // an unbounded journal / fixture-count map. Callers that need unbounded\n  // retention (e.g. short-lived test harnesses) can opt in by passing 0.\n  const journal = new Journal({\n    maxEntries: options?.journalMaxEntries ?? 1000,\n    fixtureCountsMaxTestIds: options?.fixtureCountsMaxTestIds ?? 500,\n  });\n  const videoStates = new VideoStateMap();\n  const openRouterVideoJobs = new OpenRouterVideoJobMap();\n\n  // Share journal and metrics registry with mounted services\n  if (mounts) {\n    for (const { handler } of mounts) {\n      if (handler.setJournal) handler.setJournal(journal);\n      if (registry && handler.setRegistry) handler.setRegistry(registry);\n    }\n  }\n\n  // Set initial fixtures-loaded gauge\n  if (registry) {\n    registry.setGauge(\"aimock_fixtures_loaded\", {}, fixtures.length);\n  }\n\n  const server = http.createServer((req: http.IncomingMessage, res: http.ServerResponse) => {\n    // Delegate to async handler — catch unhandled rejections to prevent Node.js crashes\n    handleHttpRequest(req, res).catch((err: unknown) => {\n      const msg = err instanceof Error ? err.message : \"Internal error\";\n      defaults.logger.warn(`Unhandled request error: ${msg}`);\n      if (!res.headersSent) {\n        res.writeHead(500, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify({ error: { message: msg, type: \"server_error\" } }));\n      } else if (!res.writableEnded) {\n        res.end();\n      }\n    });\n  });\n\n  async function handleHttpRequest(\n    req: http.IncomingMessage,\n    res: http.ServerResponse,\n  ): Promise<void> {\n    // OPTIONS preflight\n    if (req.method === \"OPTIONS\") {\n      handleOptions(res);\n      return;\n    }\n\n    // Record start time for metrics\n    const startTime = registry ? process.hrtime.bigint() : 0n;\n\n    // Parse the URL pathname (strip query string)\n    const parsedUrl = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n    let pathname = parsedUrl.pathname;\n\n    // Instrument response completion for metrics. The finish callback reads\n    // pathname via closure after normalizeCompatPath has rewritten it, so\n    // metrics record the canonical /v1/... path.\n    if (registry) {\n      res.on(\"finish\", () => {\n        try {\n          const normalizedPath = normalizePathLabel(pathname);\n          const method = req.method ?? \"UNKNOWN\";\n          const status = String(res.statusCode);\n          registry.incrementCounter(\"aimock_requests_total\", {\n            method,\n            path: normalizedPath,\n            status,\n          });\n          const elapsed = Number(process.hrtime.bigint() - startTime) / 1e9;\n          registry.observeHistogram(\n            \"aimock_request_duration_seconds\",\n            { method, path: normalizedPath },\n            elapsed,\n          );\n        } catch (err) {\n          defaults.logger.warn(\"metrics instrumentation error\", err);\n        }\n      });\n    }\n\n    // Control API — must be checked before mounts and path rewrites\n    if (pathname.startsWith(CONTROL_PREFIX)) {\n      await handleControlAPI(\n        req,\n        res,\n        pathname,\n        fixtures,\n        journal,\n        videoStates,\n        openRouterVideoJobs,\n        defaults,\n      );\n      return;\n    }\n\n    // Dispatch to mounted services before any path rewrites\n    if (mounts) {\n      for (const { path: mountPath, handler } of mounts) {\n        if (pathname === mountPath || pathname.startsWith(mountPath + \"/\")) {\n          const subPath = pathname.slice(mountPath.length) || \"/\";\n          const handled = await handler.handleRequest(req, res, subPath);\n          if (handled) return;\n        }\n      }\n    }\n\n    // Ollama /api/* routes must be dispatched BEFORE normalizeCompatPath, which\n    // rewrites any path ending in /embeddings to /v1/embeddings.  The /api/chat,\n    // /api/generate, and /api/embed paths are unaffected (their suffixes aren't\n    // in COMPAT_SUFFIXES), but /api/embeddings would collide with the OpenAI\n    // handler.  /api/embed is the current Ollama endpoint\n    // (https://github.com/ollama/ollama/blob/main/docs/api.md); /api/embeddings\n    // is the legacy path kept for backwards-compatibility.  Both route to the\n    // same handler.\n    if (pathname === OLLAMA_CHAT_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleOllama(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    if (pathname === OLLAMA_GENERATE_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleOllamaGenerate(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    if (\n      (pathname === OLLAMA_EMBEDDINGS_PATH || pathname === OLLAMA_EMBED_PATH) &&\n      req.method === \"POST\"\n    ) {\n      try {\n        const raw = await readBody(req);\n        await handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    if (pathname === OLLAMA_TAGS_PATH && req.method === \"GET\") {\n      setCorsHeaders(res);\n      const modelIds = new Set<string>();\n      for (const f of fixtures) {\n        if (f.match.model && typeof f.match.model === \"string\") {\n          modelIds.add(f.match.model);\n        }\n      }\n      const ids = modelIds.size > 0 ? [...modelIds] : DEFAULT_MODELS;\n      const models = ids.map((name) => ({\n        name,\n        model: name,\n        modified_at: new Date().toISOString(),\n        size: 0,\n        digest: \"\",\n        details: {},\n      }));\n      res.writeHead(200, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ models }));\n      return;\n    }\n\n    // OpenRouter async video lifecycle (/api/v1/videos). Like the Ollama\n    // /api/* routes above, dispatched before normalizeCompatPath. Order:\n    // content RE → models exact → status RE → submit exact (the status RE's\n    // `[^/]+` segment would otherwise swallow the `models` listing path; the\n    // content path's extra `/content` segment can never match it).\n\n    // GET /api/v1/videos/{jobId}/content — download the generated bytes\n    const openRouterVideoContentMatch = pathname.match(OPENROUTER_VIDEO_CONTENT_RE);\n    if (openRouterVideoContentMatch && req.method === \"GET\") {\n      try {\n        await handleOpenRouterVideoContent(\n          req,\n          res,\n          openRouterVideoContentMatch[1],\n          journal,\n          defaults,\n          setCorsHeaders,\n          openRouterVideoJobs,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        defaults.logger.error(`openrouter-video content: ${msg}`);\n        if (!res.headersSent) {\n          // Journal the failed request so it isn't invisible to consumers —\n          // guarded on headersSent so a throw after a successful journal +\n          // response does not double-journal. Wrapped so journaling can\n          // never mask the 500 write below.\n          try {\n            journal.add({\n              method: req.method ?? \"GET\",\n              path: req.url ?? pathname,\n              headers: flattenHeaders(req.headers),\n              body: null,\n              response: { status: 500, fixture: null },\n            });\n          } catch (jErr) {\n            defaults.logger.warn(\n              `openrouter-video content: journal write failed after handler error: ${jErr instanceof Error ? jErr.message : String(jErr)}`,\n            );\n          }\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // GET /api/v1/videos/models — video model listing (must precede the\n    // status RE, whose [^/]+ segment would otherwise capture \"models\")\n    if (pathname === OPENROUTER_VIDEO_MODELS_PATH && req.method === \"GET\") {\n      try {\n        await handleOpenRouterVideoModels(req, res, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        defaults.logger.error(`openrouter-video models: ${msg}`);\n        if (!res.headersSent) {\n          // Journal the failed request so it isn't invisible to consumers —\n          // guarded on headersSent so a throw after a successful journal +\n          // response does not double-journal. Wrapped so journaling can\n          // never mask the 500 write below.\n          try {\n            journal.add({\n              method: req.method ?? \"GET\",\n              path: req.url ?? pathname,\n              headers: flattenHeaders(req.headers),\n              body: null,\n              response: { status: 500, fixture: null },\n            });\n          } catch (jErr) {\n            defaults.logger.warn(\n              `openrouter-video models: journal write failed after handler error: ${jErr instanceof Error ? jErr.message : String(jErr)}`,\n            );\n          }\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // GET /api/v1/videos/{jobId} — poll job status\n    const openRouterVideoStatusMatch = pathname.match(OPENROUTER_VIDEO_STATUS_RE);\n    if (openRouterVideoStatusMatch && req.method === \"GET\") {\n      try {\n        await handleOpenRouterVideoStatus(\n          req,\n          res,\n          openRouterVideoStatusMatch[1],\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n          openRouterVideoJobs,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        defaults.logger.error(`openrouter-video status: ${msg}`);\n        if (!res.headersSent) {\n          // Journal the failed request so it isn't invisible to consumers —\n          // guarded on headersSent so a throw after a successful journal +\n          // response does not double-journal. Wrapped so journaling can\n          // never mask the 500 write below.\n          try {\n            journal.add({\n              method: req.method ?? \"GET\",\n              path: req.url ?? pathname,\n              headers: flattenHeaders(req.headers),\n              body: null,\n              response: { status: 500, fixture: null },\n            });\n          } catch (jErr) {\n            defaults.logger.warn(\n              `openrouter-video status: journal write failed after handler error: ${jErr instanceof Error ? jErr.message : String(jErr)}`,\n            );\n          }\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /api/v1/videos — submit a video generation job\n    if (pathname === OPENROUTER_VIDEOS_PATH && req.method === \"POST\") {\n      // CORS headers before the body is read: a readBody throw (e.g. the\n      // body-size cap) lands in the catch below, which must not write a 500\n      // that is opaque to browser clients. The handler re-applies the same\n      // headers (setHeader is idempotent).\n      setCorsHeaders(res);\n      try {\n        const raw = await readBody(req);\n        await handleOpenRouterVideoCreate(\n          req,\n          res,\n          raw,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n          openRouterVideoJobs,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        defaults.logger.error(`openrouter-video submit: ${msg}`);\n        if (!res.headersSent) {\n          // Journal the failed request so it isn't invisible to consumers —\n          // on submit a throw may have already consumed a fixture-sequence\n          // slot, which would otherwise leave no trace. Guarded on\n          // headersSent so a throw after a successful journal + response\n          // does not double-journal (the guard only covers post-write\n          // throws — a throw between the handler's journal.add and its\n          // writeHead would still double-journal, though that window is\n          // effectively throw-free today). Wrapped so journaling can never\n          // mask the 500 write below.\n          try {\n            journal.add({\n              method: req.method ?? \"POST\",\n              path: req.url ?? pathname,\n              headers: flattenHeaders(req.headers),\n              body: null,\n              response: { status: 500, fixture: null },\n            });\n          } catch (jErr) {\n            defaults.logger.warn(\n              `openrouter-video submit: journal write failed after handler error: ${jErr instanceof Error ? jErr.message : String(jErr)}`,\n            );\n          }\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // Azure OpenAI: /openai/deployments/{id}/{operation} → /v1/{operation} (chat/completions, embeddings)\n    // Must be checked BEFORE the generic /openai/ prefix strip\n    let azureDeploymentId: string | undefined;\n    const azureMatch = pathname.match(AZURE_DEPLOYMENT_RE);\n    if (azureMatch && req.method === \"POST\") {\n      azureDeploymentId = azureMatch[1];\n      const operation = azureMatch[2];\n      pathname = `/v1/${operation}`;\n    }\n\n    // Normalize OpenAI-compatible paths (strip /openai/ prefix + rewrite arbitrary prefixes)\n    if (!azureDeploymentId) {\n      pathname = normalizeCompatPath(pathname, logger);\n    }\n\n    // Health / readiness probes\n    if (pathname === HEALTH_PATH && req.method === \"GET\") {\n      setCorsHeaders(res);\n      if (mounts && mounts.length > 0) {\n        const services: Record<string, unknown> = {\n          llm: { status: \"ok\", fixtures: fixtures.length },\n        };\n        for (const { path: mountPath, handler } of mounts) {\n          if (handler.health) {\n            const name = mountPath.replace(/^\\//, \"\");\n            services[name] = handler.health();\n          }\n        }\n        res.writeHead(200, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify({ status: \"ok\", services }));\n      } else {\n        res.writeHead(200, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify({ status: \"ok\" }));\n      }\n      return;\n    }\n\n    if (pathname === READY_PATH && req.method === \"GET\") {\n      setCorsHeaders(res);\n      res.writeHead(200, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ status: \"ready\" }));\n      return;\n    }\n\n    // Prometheus metrics\n    if (pathname === \"/metrics\" && req.method === \"GET\") {\n      if (!registry) {\n        handleNotFound(res, \"Not found\");\n        return;\n      }\n      setCorsHeaders(res);\n      res.writeHead(200, { \"Content-Type\": \"text/plain; version=0.0.4; charset=utf-8\" });\n      res.end(registry.serialize());\n      return;\n    }\n\n    // Models listing\n    if (pathname === MODELS_PATH && req.method === \"GET\") {\n      setCorsHeaders(res);\n      const modelIds = new Set<string>();\n      for (const f of fixtures) {\n        if (f.match.model && typeof f.match.model === \"string\") {\n          modelIds.add(f.match.model);\n        }\n      }\n      const ids = modelIds.size > 0 ? [...modelIds] : DEFAULT_MODELS;\n      const data = ids.map((id) => ({\n        id,\n        object: \"model\" as const,\n        created: 1686935002,\n        owned_by: \"aimock\",\n      }));\n      res.writeHead(200, { \"Content-Type\": \"application/json\" });\n      res.end(JSON.stringify({ object: \"list\", data }));\n      return;\n    }\n\n    // Journal inspection endpoints\n    if (pathname === REQUESTS_PATH) {\n      setCorsHeaders(res);\n      if (req.method === \"GET\") {\n        const limitParam = parsedUrl.searchParams.get(\"limit\");\n        let opts: { limit: number } | undefined;\n        if (limitParam) {\n          const limit = parseInt(limitParam, 10);\n          if (Number.isNaN(limit) || limit <= 0) {\n            writeErrorResponse(\n              res,\n              400,\n              JSON.stringify({\n                error: {\n                  message: `Invalid limit parameter: \"${limitParam}\"`,\n                  type: \"invalid_request_error\",\n                },\n              }),\n            );\n            return;\n          }\n          opts = { limit };\n        }\n        const entries = journal.getAll(opts);\n        res.writeHead(200, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify(entries));\n        return;\n      }\n      if (req.method === \"DELETE\") {\n        // Clear only the request journal entries, preserving fixture\n        // match-counts (sequencing state). Clearing the request log must not\n        // silently rewind sequenced fixtures. For a full reset (entries +\n        // match-counts), use POST /__aimock/reset/fixtures.\n        journal.clearEntries();\n        res.writeHead(204);\n        res.end();\n        return;\n      }\n      handleNotFound(res, \"Not found\");\n      return;\n    }\n\n    // POST /v1/responses — OpenAI Responses API\n    if (pathname === RESPONSES_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleResponses(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          try {\n            res.write(`event: error\\ndata: ${JSON.stringify({ error: { message: msg } })}\\n\\n`);\n            res.end();\n          } catch (writeErr) {\n            logger.debug(\"Failed to write error recovery response:\", writeErr);\n          }\n        }\n      }\n      return;\n    }\n\n    // POST /v1/messages — Anthropic Claude Messages API\n    if (pathname === MESSAGES_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleMessages(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          try {\n            res.write(`event: error\\ndata: ${JSON.stringify({ error: { message: msg } })}\\n\\n`);\n            res.end();\n          } catch (writeErr) {\n            logger.debug(\"Failed to write error recovery response:\", writeErr);\n          }\n        }\n      }\n      return;\n    }\n\n    // POST /v2/chat — Cohere v2 Chat API\n    if (pathname === COHERE_CHAT_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleCohere(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          try {\n            res.write(`event: error\\ndata: ${JSON.stringify({ error: { message: msg } })}\\n\\n`);\n            res.end();\n          } catch (writeErr) {\n            logger.debug(\"Failed to write error recovery response:\", writeErr);\n          }\n        }\n      }\n      return;\n    }\n\n    // POST /v2/embed — Cohere v2 Embed API\n    if (pathname === COHERE_EMBED_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleCohereEmbed(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/embeddings — OpenAI Embeddings API\n    if (pathname === EMBEDDINGS_PATH && req.method === \"POST\") {\n      try {\n        const deploymentId = azureDeploymentId;\n        const embeddingsProvider: RecordProviderKey = azureDeploymentId ? \"azure\" : \"openai\";\n        let raw = await readBody(req);\n        // Azure deployments may omit model from body — use deployment ID as fallback\n        if (deploymentId) {\n          try {\n            const parsed = JSON.parse(raw) as Record<string, unknown>;\n            if (!parsed.model) {\n              parsed.model = deploymentId;\n              raw = JSON.stringify(parsed);\n            }\n          } catch (err) {\n            if (!(err instanceof SyntaxError)) {\n              defaults.logger.error(\n                `Unexpected error in Azure model injection: ${err instanceof Error ? err.message : String(err)}`,\n              );\n            }\n            // Fall through for parse errors — let handleEmbeddings report them\n          }\n        }\n        await handleEmbeddings(\n          req,\n          res,\n          raw,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n          embeddingsProvider,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/images/generations — OpenAI Image Generation API\n    if (pathname === IMAGES_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleImages(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/images/edits — OpenAI Image Edit API (multipart/form-data)\n    if (pathname === IMAGES_EDIT_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleImageEdit(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/images/variations — OpenAI Image Variations API (multipart/form-data)\n    if (pathname === IMAGES_VARIATIONS_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleImageVariations(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/audio/speech — OpenAI TTS API\n    if (pathname === SPEECH_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleSpeech(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/audio/transcriptions — OpenAI Transcription API\n    if (pathname === TRANSCRIPTIONS_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleTranscription(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/audio/translations — OpenAI Translation API\n    if (pathname === TRANSLATIONS_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleTranscription(\n          req,\n          res,\n          raw,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n          \"translation\",\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/videos — Video Generation API\n    if (pathname === VIDEOS_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleVideoCreate(\n          req,\n          res,\n          raw,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n          videoStates,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // GET /v1/videos/{id} — Video Status Check\n    const videoStatusMatch = pathname.match(OPENAI_VIDEO_STATUS_RE);\n    if (videoStatusMatch && req.method === \"GET\") {\n      const videoId = videoStatusMatch[1];\n      handleVideoStatus(req, res, videoId, journal, defaults, setCorsHeaders, videoStates);\n      return;\n    }\n\n    // POST /v1beta/models/{model}:predict — Gemini Imagen API\n    const geminiPredictMatch = pathname.match(GEMINI_PREDICT_RE);\n    if (geminiPredictMatch && req.method === \"POST\") {\n      const predictModel = geminiPredictMatch[1];\n      try {\n        const raw = await readBody(req);\n        await handleImages(\n          req,\n          res,\n          raw,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n          \"gemini\",\n          predictModel,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1beta/interactions — Google Gemini Interactions API\n    if (pathname === GEMINI_INTERACTIONS_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleGeminiInteractions(req, res, raw, fixtures, journal, defaults, setCorsHeaders);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          try {\n            res.write(`data: ${JSON.stringify({ error: { message: msg } })}\\n\\n`);\n            res.end();\n          } catch (writeErr) {\n            logger.debug(\"Failed to write error recovery response:\", writeErr);\n          }\n        }\n      }\n      return;\n    }\n\n    // POST /v1beta/models/{model}:embedContent — Google Gemini Embedding\n    const geminiEmbedMatch = pathname.match(GEMINI_EMBED_RE);\n    if (geminiEmbedMatch && req.method === \"POST\") {\n      const embedModel = geminiEmbedMatch[1];\n      try {\n        const raw = await readBody(req);\n        await handleGeminiEmbedContent(\n          req,\n          res,\n          raw,\n          embedModel,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1beta/models/{model}:(generateContent|streamGenerateContent) — Google Gemini\n    const geminiMatch = pathname.match(GEMINI_PATH_RE);\n    if (geminiMatch && req.method === \"POST\") {\n      const geminiModel = geminiMatch[1];\n      const streaming = geminiMatch[2] === \"streamGenerateContent\";\n      try {\n        const raw = await readBody(req);\n        await handleGemini(\n          req,\n          res,\n          raw,\n          geminiModel,\n          streaming,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          try {\n            res.write(`data: ${JSON.stringify({ error: { message: msg } })}\\n\\n`);\n            res.end();\n          } catch (writeErr) {\n            logger.debug(\"Failed to write error recovery response:\", writeErr);\n          }\n        }\n      }\n      return;\n    }\n\n    // POST /v1/projects/{project}/locations/{location}/publishers/google/models/{model}:(generateContent|streamGenerateContent) — Vertex AI\n    const vertexMatch = pathname.match(VERTEX_AI_RE);\n    if (vertexMatch && req.method === \"POST\") {\n      const vertexModel = vertexMatch[1];\n      const streaming = vertexMatch[2] === \"streamGenerateContent\";\n      try {\n        const raw = await readBody(req);\n        await handleGemini(\n          req,\n          res,\n          raw,\n          vertexModel,\n          streaming,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n          \"vertexai\",\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          try {\n            res.write(`data: ${JSON.stringify({ error: { message: msg } })}\\n\\n`);\n            res.end();\n          } catch (writeErr) {\n            logger.debug(\"Failed to write error recovery response:\", writeErr);\n          }\n        }\n      }\n      return;\n    }\n\n    // POST /model/{modelId}/invoke — AWS Bedrock Claude API\n    const bedrockMatch = pathname.match(BEDROCK_INVOKE_RE);\n    if (bedrockMatch && req.method === \"POST\") {\n      const bedrockModelId = bedrockMatch[1];\n      try {\n        const raw = await readBody(req);\n        await handleBedrock(\n          req,\n          res,\n          raw,\n          bedrockModelId,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /model/{modelId}/invoke-with-response-stream — AWS Bedrock Claude streaming\n    const bedrockStreamMatch = pathname.match(BEDROCK_STREAM_RE);\n    if (bedrockStreamMatch && req.method === \"POST\") {\n      const bedrockModelId = bedrockStreamMatch[1];\n      try {\n        const raw = await readBody(req);\n        await handleBedrockStream(\n          req,\n          res,\n          raw,\n          bedrockModelId,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /model/{modelId}/converse — AWS Bedrock Converse API\n    const converseMatch = pathname.match(BEDROCK_CONVERSE_RE);\n    if (converseMatch && req.method === \"POST\") {\n      const converseModelId = converseMatch[1];\n      try {\n        const raw = await readBody(req);\n        await handleConverse(\n          req,\n          res,\n          raw,\n          converseModelId,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /model/{modelId}/converse-stream — AWS Bedrock Converse streaming API\n    const converseStreamMatch = pathname.match(BEDROCK_CONVERSE_STREAM_RE);\n    if (converseStreamMatch && req.method === \"POST\") {\n      const converseStreamModelId = converseStreamMatch[1];\n      try {\n        const raw = await readBody(req);\n        await handleConverseStream(\n          req,\n          res,\n          raw,\n          converseStreamModelId,\n          fixtures,\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /search — Web Search API (Tavily-compatible)\n    if (pathname === SEARCH_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleSearch(\n          req,\n          res,\n          raw,\n          serviceFixtures?.search ?? [],\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v2/rerank — Reranking API (Cohere rerank-compatible)\n    if (pathname === RERANK_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleRerank(\n          req,\n          res,\n          raw,\n          serviceFixtures?.rerank ?? [],\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/moderations — Moderation API (OpenAI-compatible)\n    if (pathname === MODERATIONS_PATH && req.method === \"POST\") {\n      try {\n        const raw = await readBody(req);\n        await handleModeration(\n          req,\n          res,\n          raw,\n          serviceFixtures?.moderation ?? [],\n          journal,\n          defaults,\n          setCorsHeaders,\n        );\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/sound-generation — ElevenLabs Sound Generation API\n    if (pathname === ELEVENLABS_SOUND_GENERATION_PATH && req.method === \"POST\") {\n      setCorsHeaders(res);\n      try {\n        const raw = await readBody(req);\n        await handleElevenLabsAudio(req, res, raw, fixtures, defaults, journal, \"sound-generation\");\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/text-to-speech/{voice_id} — ElevenLabs TTS API\n    const elevenLabsTTSMatch = pathname.match(ELEVENLABS_TTS_RE);\n    if (elevenLabsTTSMatch && req.method === \"POST\") {\n      setCorsHeaders(res);\n      const voiceId = elevenLabsTTSMatch[1];\n      try {\n        const raw = await readBody(req);\n        await handleElevenLabsTTS(req, res, raw, fixtures, defaults, journal, voiceId);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/music/(generation|variation|remix|extend) — ElevenLabs Music API\n    const musicMatch = pathname.match(ELEVENLABS_MUSIC_RE);\n    if (musicMatch && req.method === \"POST\") {\n      setCorsHeaders(res);\n      const musicSubType = musicMatch[1] ?? \"music\";\n      try {\n        const raw = await readBody(req);\n        await handleElevenLabsAudio(req, res, raw, fixtures, defaults, journal, musicSubType);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // Body read by the general fal handler; preserved so legacy fal-audio\n    // routes below don't double-consume the stream on passthrough.\n    let falBody: string | undefined;\n\n    // /fal/* with `x-fal-target-host` header — general fal.ai routing\n    // (queue.fal.run, fal.run, rest.fal.ai, rest.alpha.fal.ai).\n    // Matches the requestMiddleware path-mirror convention used by\n    // @fal-ai/client when proxyUrl can't be honoured server-side.\n    if (FAL_PREFIX_RE.test(pathname) && req.headers[\"x-fal-target-host\"]) {\n      setCorsHeaders(res);\n      try {\n        falBody = req.method === \"POST\" || req.method === \"PUT\" ? await readBody(req) : \"\";\n        const raw = falBody;\n        const chaosAction = evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);\n        if (chaosAction) {\n          applyChaosAction(\n            chaosAction,\n            res,\n            null,\n            journal,\n            {\n              method: req.method ?? \"GET\",\n              path: pathname,\n              headers: flattenHeaders(req.headers),\n              body: { model: \"\", messages: [] },\n            },\n            \"fixture\",\n            defaults.registry,\n          );\n          return;\n        }\n        const outcome = await handleFal(req, res, raw, pathname, fixtures, defaults, journal);\n        if (outcome === \"handled\") return;\n        // passthrough: fall through to legacy fal-audio routes below\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n        return;\n      }\n    }\n\n    // POST /fal/queue/submit/{model} — fal.ai Queue Submit\n    const falQueueSubmitMatch = pathname.match(FAL_QUEUE_SUBMIT_RE);\n    if (falQueueSubmitMatch && req.method === \"POST\") {\n      setCorsHeaders(res);\n      try {\n        const raw = falBody ?? (await readBody(req));\n        await handleFalQueue(req, res, raw, pathname, fixtures, defaults, journal);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // GET /fal/queue/requests/{requestId} — fal.ai Queue Status/Result\n    const falQueueRequestsMatch = pathname.match(FAL_QUEUE_REQUESTS_RE);\n    if (\n      falQueueRequestsMatch &&\n      (req.method === \"GET\" || req.method === \"POST\" || req.method === \"PUT\")\n    ) {\n      setCorsHeaders(res);\n      try {\n        const raw =\n          req.method === \"POST\" || req.method === \"PUT\" ? (falBody ?? (await readBody(req))) : \"{}\";\n        const chaosAction = evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);\n        if (chaosAction) {\n          applyChaosAction(\n            chaosAction,\n            res,\n            null,\n            journal,\n            {\n              method: req.method ?? \"GET\",\n              path: pathname,\n              headers: flattenHeaders(req.headers),\n              body: { model: \"\", messages: [] },\n            },\n            \"fixture\",\n            defaults.registry,\n          );\n          return;\n        }\n        await handleFalQueue(req, res, raw, pathname, fixtures, defaults, journal);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /fal/run/{model} — fal.ai Synchronous Run\n    const falRunMatch = pathname.match(FAL_RUN_RE);\n    if (falRunMatch && req.method === \"POST\") {\n      setCorsHeaders(res);\n      try {\n        const raw = falBody ?? (await readBody(req));\n        await handleFalQueue(req, res, raw, pathname, fixtures, defaults, journal);\n      } catch (err: unknown) {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        if (!res.headersSent) {\n          writeErrorResponse(\n            res,\n            500,\n            JSON.stringify({ error: { message: msg, type: \"server_error\" } }),\n          );\n        } else if (!res.writableEnded) {\n          res.destroy();\n        }\n      }\n      return;\n    }\n\n    // POST /v1/chat/completions — Chat Completions API\n    if (pathname !== COMPLETIONS_PATH) {\n      handleNotFound(res, \"Not found\");\n      return;\n    }\n    if (req.method !== \"POST\") {\n      handleNotFound(res, \"Not found\");\n      return;\n    }\n\n    const completionsProvider: RecordProviderKey = azureDeploymentId ? \"azure\" : \"openai\";\n    try {\n      await handleCompletions(\n        req,\n        res,\n        fixtures,\n        journal,\n        defaults,\n        azureDeploymentId,\n        completionsProvider,\n      );\n    } catch (err: unknown) {\n      const msg = err instanceof Error ? err.message : \"Internal error\";\n      if (!res.headersSent) {\n        writeErrorResponse(\n          res,\n          500,\n          JSON.stringify({\n            error: {\n              message: msg,\n              type: \"server_error\",\n            },\n          }),\n        );\n      } else if (!res.writableEnded) {\n        // Headers already sent (SSE stream in progress) — write error event then close\n        try {\n          res.write(\n            `data: ${JSON.stringify({ error: { message: msg, type: \"server_error\" } })}\\n\\n`,\n          );\n          res.end();\n        } catch (writeErr) {\n          logger.debug(\"Failed to write error recovery response:\", writeErr);\n        }\n      }\n    }\n  }\n\n  // ─── WebSocket upgrade handling ──────────────────────────────────────────\n\n  const activeConnections = new Set<WebSocketConnection>();\n\n  server.on(\n    \"upgrade\",\n    (req: http.IncomingMessage, socket: import(\"node:net\").Socket, head: Buffer) => {\n      handleUpgradeRequest(req, socket, head).catch((err: unknown) => {\n        const msg = err instanceof Error ? err.message : \"Internal error\";\n        defaults.logger.warn(`Unhandled upgrade error: ${msg}`);\n        if (!socket.destroyed) socket.destroy();\n      });\n    },\n  );\n\n  async function handleUpgradeRequest(\n    req: http.IncomingMessage,\n    socket: import(\"node:net\").Socket,\n    head: Buffer,\n  ): Promise<void> {\n    const parsedUrl = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n    let pathname = parsedUrl.pathname;\n\n    // Dispatch to mounted services before any path rewrites\n    if (mounts) {\n      for (const { path: mountPath, handler } of mounts) {\n        if (\n          (pathname === mountPath || pathname.startsWith(mountPath + \"/\")) &&\n          handler.handleUpgrade\n        ) {\n          const subPath = pathname.slice(mountPath.length) || \"/\";\n          if (await handler.handleUpgrade(socket, head, subPath)) return;\n        }\n      }\n    }\n\n    // Normalize OpenAI-compatible paths (strip /openai/ prefix + rewrite arbitrary prefixes)\n    // Skip Azure deployment paths — they have their own rewrite in the HTTP handler\n    if (!pathname.match(AZURE_DEPLOYMENT_RE)) {\n      pathname = normalizeCompatPath(pathname, logger);\n    }\n\n    if (\n      pathname !== RESPONSES_PATH &&\n      pathname !== REALTIME_PATH &&\n      pathname !== GEMINI_LIVE_PATH\n    ) {\n      socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n      socket.destroy();\n      return;\n    }\n\n    // Push any buffered data back before upgrading\n    if (head.length > 0) {\n      socket.unshift(head);\n    }\n\n    let ws: WebSocketConnection;\n    try {\n      ws = upgradeToWebSocket(req, socket);\n    } catch (err: unknown) {\n      const msg = err instanceof Error ? err.message : \"WebSocket upgrade failed\";\n      logger.error(`WebSocket upgrade error: ${msg}`);\n      if (!socket.destroyed) socket.destroy();\n      return;\n    }\n\n    activeConnections.add(ws);\n\n    ws.on(\"error\", (err: Error) => {\n      logger.error(`WebSocket error: ${err.message}`);\n      activeConnections.delete(ws);\n    });\n\n    ws.on(\"close\", () => {\n      activeConnections.delete(ws);\n    });\n\n    // Route to handler\n    const wsTestId = getTestId(req);\n    if (pathname === RESPONSES_PATH) {\n      handleWebSocketResponses(ws, fixtures, journal, {\n        ...defaults,\n        model: \"gpt-4\",\n        testId: wsTestId,\n        upgradeHeaders: req.headers,\n      });\n    } else if (pathname === REALTIME_PATH) {\n      const model = parsedUrl.searchParams.get(\"model\") ?? \"gpt-realtime-2\";\n      handleWebSocketRealtime(ws, fixtures, journal, {\n        ...defaults,\n        model,\n        testId: wsTestId,\n        upgradeHeaders: req.headers,\n      });\n    } else if (pathname === GEMINI_LIVE_PATH) {\n      handleWebSocketGeminiLive(ws, fixtures, journal, {\n        ...defaults,\n        model: \"gemini-2.0-flash\",\n        testId: wsTestId,\n        upgradeHeaders: req.headers,\n      });\n    }\n  }\n\n  // Close active WS connections when server shuts down\n  const originalClose = server.close.bind(server);\n  server.close = function (this: http.Server, callback?: (err?: Error) => void) {\n    for (const ws of activeConnections) {\n      ws.close(1001, \"Server shutting down\");\n    }\n    activeConnections.clear();\n    videoStates.clear();\n    openRouterVideoJobs.clear();\n    originalClose(callback);\n    return this;\n  } as typeof server.close;\n\n  return new Promise<ServerInstance>((resolve, reject) => {\n    server.on(\"error\", reject);\n    server.listen(port, host, () => {\n      const addr = server.address();\n      if (!addr || typeof addr === \"string\") {\n        reject(new Error(\"Unexpected address format\"));\n        return;\n      }\n      const url = `http://${addr.address}:${addr.port}`;\n\n      // Set base URL on mounted services that support it\n      if (mounts) {\n        for (const { path: mountPath, handler } of mounts) {\n          if (handler.setBaseUrl) handler.setBaseUrl(url + mountPath);\n        }\n      }\n\n      resolve({ server, journal, url, defaults, videoStates, openRouterVideoJobs });\n    });\n  });\n}\n"],"mappings":"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"}