@copilotkit/aimock 1.37.0 → 1.37.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/agui-recorder.cjs +62 -0
- package/dist/agui-recorder.cjs.map +1 -1
- package/dist/agui-recorder.d.cts +23 -1
- package/dist/agui-recorder.d.cts.map +1 -1
- package/dist/agui-recorder.d.ts +23 -1
- package/dist/agui-recorder.d.ts.map +1 -1
- package/dist/agui-recorder.js +60 -1
- package/dist/agui-recorder.js.map +1 -1
- package/dist/agui-types.d.cts +13 -0
- package/dist/agui-types.d.ts +13 -0
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/index.cjs +5 -0
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/journal.cjs +35 -1
- package/dist/journal.cjs.map +1 -1
- package/dist/journal.d.cts.map +1 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +35 -1
- package/dist/journal.js.map +1 -1
- package/dist/recorder.cjs +12 -4
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.d.cts.map +1 -1
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +12 -4
- package/dist/recorder.js.map +1 -1
- package/dist/router.cjs +53 -25
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts +20 -0
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts +20 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +53 -25
- package/dist/router.js.map +1 -1
- package/dist/server.cjs +4 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +4 -1
- package/dist/server.js.map +1 -1
- package/dist/stream-collapse.cjs +120 -27
- package/dist/stream-collapse.cjs.map +1 -1
- package/dist/stream-collapse.d.cts +31 -8
- package/dist/stream-collapse.d.cts.map +1 -1
- package/dist/stream-collapse.d.ts +31 -8
- package/dist/stream-collapse.d.ts.map +1 -1
- package/dist/stream-collapse.js +119 -28
- package/dist/stream-collapse.js.map +1 -1
- package/dist/ws-gemini-live.d.cts +2 -2
- package/dist/ws-realtime.d.cts +2 -2
- package/package.json +1 -1
package/dist/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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","VeoVideoJobMap","GrokVideoJobMap","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","GROK_VIDEO_SUBMIT_PATH","handleGrokVideoCreate","handleVideoCreate","GROK_VIDEO_STATUS_RE","handleGrokVideoStatus","VEO_PREDICT_LRO_RE","handleVeoVideoCreate","VEO_OPERATION_RE","handleVeoVideoStatus","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, 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 { handleVeoVideoCreate, handleVeoVideoStatus, VeoVideoJobMap } from \"./veo-video.js\";\nimport { handleGrokVideoCreate, handleGrokVideoStatus, GrokVideoJobMap } from \"./grok-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 OPENROUTER_VIDEO_CONTENT_RE,\n OPENROUTER_VIDEO_STATUS_RE,\n VEO_PREDICT_LRO_RE,\n VEO_OPERATION_RE,\n GROK_VIDEO_SUBMIT_PATH,\n GROK_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 veoVideoJobs: VeoVideoJobMap;\n grokVideoJobs: GrokVideoJobMap;\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 veoVideoJobs: VeoVideoJobMap,\n grokVideoJobs: GrokVideoJobMap,\n defaults: HandlerDefaults,\n): void {\n fixtures.length = 0;\n journal.clear();\n videoStates.clear();\n openRouterVideoJobs.clear();\n veoVideoJobs.clear();\n grokVideoJobs.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 veoVideoJobs: VeoVideoJobMap,\n grokVideoJobs: GrokVideoJobMap,\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(\n fixtures,\n journal,\n videoStates,\n openRouterVideoJobs,\n veoVideoJobs,\n grokVideoJobs,\n defaults,\n );\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(\n fixtures,\n journal,\n videoStates,\n openRouterVideoJobs,\n veoVideoJobs,\n grokVideoJobs,\n defaults,\n );\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 response.blocks,\n );\n // Build usage chunk for stream_options.include_usage\n const completionText =\n (response.content ?? \"\") +\n (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 get veoVideo() {\n return serverOptions.veoVideo;\n },\n get grokVideo() {\n return serverOptions.grokVideo;\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 { name: \"veoVideo\", config: options?.veoVideo },\n { name: \"grokVideo\", config: options?.grokVideo },\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 const veoVideoJobs = new VeoVideoJobMap();\n const grokVideoJobs = new GrokVideoJobMap();\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 veoVideoJobs,\n grokVideoJobs,\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/generations — xAI Grok Imagine video submit. A distinct\n // exact path from Sora's POST /v1/videos (no collision). Must precede the\n // Sora GET status RE which would otherwise parse `generations` as an id on\n // a GET — but this is a POST, so the guard is method-level here and\n // `id !== \"generations\"` in the GET block below. (T0: stub filled in T2.)\n if (pathname === GROK_VIDEO_SUBMIT_PATH && req.method === \"POST\") {\n setCorsHeaders(res);\n try {\n const raw = await readBody(req);\n await handleGrokVideoCreate(\n req,\n res,\n raw,\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n grokVideoJobs,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`grok-video submit: ${msg}`);\n if (!res.headersSent) {\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 `grok-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 // 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} — Grok-first video status check. Grok Imagine and\n // Sora share this path: handleGrokVideoStatus does a job-map-first lookup\n // and falls through to the UNCHANGED Sora handleVideoStatus on a Grok miss\n // (disjoint id namespaces → unambiguous). The `id !== \"generations\"` guard\n // keeps the Grok submit literal out of the status RE. (T0: the Grok job map\n // is always empty, so every GET delegates to Sora — behavior-preserving.)\n const grokVideoStatusMatch = pathname.match(GROK_VIDEO_STATUS_RE);\n if (grokVideoStatusMatch && grokVideoStatusMatch[1] !== \"generations\" && req.method === \"GET\") {\n try {\n await handleGrokVideoStatus(\n req,\n res,\n grokVideoStatusMatch[1],\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n grokVideoJobs,\n videoStates,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`grok-video status: ${msg}`);\n if (!res.headersSent) {\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 `grok-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 /v1beta/models/{model}:predictLongRunning — Google Veo video submit.\n // Anchored on `:predictLongRunning`, so it never collides with the Gemini\n // `:predict` Imagen route below. (T0: handler is a stub filled in T1.)\n const veoPredictMatch = pathname.match(VEO_PREDICT_LRO_RE);\n if (veoPredictMatch && req.method === \"POST\") {\n setCorsHeaders(res);\n try {\n const raw = await readBody(req);\n await handleVeoVideoCreate(\n req,\n res,\n raw,\n veoPredictMatch[1],\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n veoVideoJobs,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`veo-video submit: ${msg}`);\n if (!res.headersSent) {\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 `veo-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 // GET /v1beta/operations/{name} — Google Veo video status poll.\n // (T0: handler is a stub filled in T1.)\n const veoOperationMatch = pathname.match(VEO_OPERATION_RE);\n if (veoOperationMatch && req.method === \"GET\") {\n try {\n await handleVeoVideoStatus(\n req,\n res,\n veoOperationMatch[1],\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n veoVideoJobs,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`veo-video status: ${msg}`);\n if (!res.headersSent) {\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 `veo-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 /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 veoVideoJobs.clear();\n grokVideoJobs.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({\n server,\n journal,\n url,\n defaults,\n videoStates,\n openRouterVideoJobs,\n veoVideoJobs,\n grokVideoJobs,\n });\n });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"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","VeoVideoJobMap","GrokVideoJobMap","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","GROK_VIDEO_SUBMIT_PATH","handleGrokVideoCreate","handleVideoCreate","GROK_VIDEO_STATUS_RE","handleGrokVideoStatus","VEO_PREDICT_LRO_RE","handleVeoVideoCreate","VEO_OPERATION_RE","handleVeoVideoStatus","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, 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 { handleVeoVideoCreate, handleVeoVideoStatus, VeoVideoJobMap } from \"./veo-video.js\";\nimport { handleGrokVideoCreate, handleGrokVideoStatus, GrokVideoJobMap } from \"./grok-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 OPENROUTER_VIDEO_CONTENT_RE,\n OPENROUTER_VIDEO_STATUS_RE,\n VEO_PREDICT_LRO_RE,\n VEO_OPERATION_RE,\n GROK_VIDEO_SUBMIT_PATH,\n GROK_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 veoVideoJobs: VeoVideoJobMap;\n grokVideoJobs: GrokVideoJobMap;\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 veoVideoJobs: VeoVideoJobMap,\n grokVideoJobs: GrokVideoJobMap,\n defaults: HandlerDefaults,\n): void {\n fixtures.length = 0;\n journal.clear();\n videoStates.clear();\n openRouterVideoJobs.clear();\n veoVideoJobs.clear();\n grokVideoJobs.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 veoVideoJobs: VeoVideoJobMap,\n grokVideoJobs: GrokVideoJobMap,\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(\n fixtures,\n journal,\n videoStates,\n openRouterVideoJobs,\n veoVideoJobs,\n grokVideoJobs,\n defaults,\n );\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(\n fixtures,\n journal,\n videoStates,\n openRouterVideoJobs,\n veoVideoJobs,\n grokVideoJobs,\n defaults,\n );\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 response.blocks,\n );\n // Build usage chunk for stream_options.include_usage\n const completionText =\n (response.content ?? \"\") +\n (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 get veoVideo() {\n return serverOptions.veoVideo;\n },\n get grokVideo() {\n return serverOptions.grokVideo;\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 { name: \"veoVideo\", config: options?.veoVideo },\n { name: \"grokVideo\", config: options?.grokVideo },\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 const veoVideoJobs = new VeoVideoJobMap();\n const grokVideoJobs = new GrokVideoJobMap();\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 const stack = err instanceof Error ? (err.stack ?? msg) : msg;\n const method = req.method ?? \"?\";\n const url = req.url ?? \"?\";\n defaults.logger.warn(`Unhandled request error on ${method} ${url}: ${msg}\\n${stack}`);\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 veoVideoJobs,\n grokVideoJobs,\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/generations — xAI Grok Imagine video submit. A distinct\n // exact path from Sora's POST /v1/videos (no collision). Must precede the\n // Sora GET status RE which would otherwise parse `generations` as an id on\n // a GET — but this is a POST, so the guard is method-level here and\n // `id !== \"generations\"` in the GET block below. (T0: stub filled in T2.)\n if (pathname === GROK_VIDEO_SUBMIT_PATH && req.method === \"POST\") {\n setCorsHeaders(res);\n try {\n const raw = await readBody(req);\n await handleGrokVideoCreate(\n req,\n res,\n raw,\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n grokVideoJobs,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`grok-video submit: ${msg}`);\n if (!res.headersSent) {\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 `grok-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 // 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} — Grok-first video status check. Grok Imagine and\n // Sora share this path: handleGrokVideoStatus does a job-map-first lookup\n // and falls through to the UNCHANGED Sora handleVideoStatus on a Grok miss\n // (disjoint id namespaces → unambiguous). The `id !== \"generations\"` guard\n // keeps the Grok submit literal out of the status RE. (T0: the Grok job map\n // is always empty, so every GET delegates to Sora — behavior-preserving.)\n const grokVideoStatusMatch = pathname.match(GROK_VIDEO_STATUS_RE);\n if (grokVideoStatusMatch && grokVideoStatusMatch[1] !== \"generations\" && req.method === \"GET\") {\n try {\n await handleGrokVideoStatus(\n req,\n res,\n grokVideoStatusMatch[1],\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n grokVideoJobs,\n videoStates,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`grok-video status: ${msg}`);\n if (!res.headersSent) {\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 `grok-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 /v1beta/models/{model}:predictLongRunning — Google Veo video submit.\n // Anchored on `:predictLongRunning`, so it never collides with the Gemini\n // `:predict` Imagen route below. (T0: handler is a stub filled in T1.)\n const veoPredictMatch = pathname.match(VEO_PREDICT_LRO_RE);\n if (veoPredictMatch && req.method === \"POST\") {\n setCorsHeaders(res);\n try {\n const raw = await readBody(req);\n await handleVeoVideoCreate(\n req,\n res,\n raw,\n veoPredictMatch[1],\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n veoVideoJobs,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`veo-video submit: ${msg}`);\n if (!res.headersSent) {\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 `veo-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 // GET /v1beta/operations/{name} — Google Veo video status poll.\n // (T0: handler is a stub filled in T1.)\n const veoOperationMatch = pathname.match(VEO_OPERATION_RE);\n if (veoOperationMatch && req.method === \"GET\") {\n try {\n await handleVeoVideoStatus(\n req,\n res,\n veoOperationMatch[1],\n fixtures,\n journal,\n defaults,\n setCorsHeaders,\n veoVideoJobs,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n defaults.logger.error(`veo-video status: ${msg}`);\n if (!res.headersSent) {\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 `veo-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 /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 veoVideoJobs.clear();\n grokVideoJobs.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({\n server,\n journal,\n url,\n defaults,\n videoStates,\n openRouterVideoJobs,\n veoVideoJobs,\n grokVideoJobs,\n });\n });\n });\n}\n"],"mappings":"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"}
|