{"version":3,"file":"bedrock-converse.cjs","names":["generateToolUseId","flattenHeaders","getContext","getTestId","matchFixtureDiagnostic","recordMatchOptions","applyChaos","resolveStrictMode","strictNoMatchMessage","strictNoMatchLogLine","strictOverrideField","proxyAndRecord","resolveResponse","isErrorResponse","isContentWithToolCallsResponse","extractOverrides","resolveReasoningForModel","isTextResponse","isToolCallResponse","createInterruptionSignal","writeEventStream"],"sources":["../src/bedrock-converse.ts"],"sourcesContent":["/**\n * AWS Bedrock Converse API support.\n *\n * Translates incoming Converse and Converse-stream requests (Bedrock Converse\n * format) into the ChatCompletionRequest format used by the fixture router,\n * and converts fixture responses back into Converse API format — either a\n * single JSON response or an Event Stream binary stream.\n */\n\nimport type * as http from \"node:http\";\nimport type {\n  ChatCompletionRequest,\n  ChatMessage,\n  Fixture,\n  HandlerDefaults,\n  ResponseOverrides,\n  ToolCall,\n  ToolDefinition,\n} from \"./types.js\";\nimport {\n  generateToolUseId,\n  extractOverrides,\n  isTextResponse,\n  isToolCallResponse,\n  isContentWithToolCallsResponse,\n  isErrorResponse,\n  flattenHeaders,\n  getContext,\n  getTestId,\n  resolveResponse,\n  resolveReasoningForModel,\n  resolveStrictMode,\n  strictOverrideField,\n  strictNoMatchMessage,\n  strictNoMatchLogLine,\n} from \"./helpers.js\";\nimport { matchFixtureDiagnostic, recordMatchOptions } from \"./router.js\";\nimport { writeErrorResponse } from \"./sse-writer.js\";\nimport { writeEventStream } from \"./aws-event-stream.js\";\nimport { createInterruptionSignal } from \"./interruption.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\nimport { applyChaos } from \"./chaos.js\";\nimport { proxyAndRecord } from \"./recorder.js\";\n\n// ─── Converse request types ─────────────────────────────────────────────────\n\ninterface ConverseContentBlock {\n  text?: string;\n  toolUse?: { toolUseId: string; name: string; input: object };\n  toolResult?: { toolUseId: string; content: { text?: string }[] };\n}\n\ninterface ConverseMessage {\n  role: \"user\" | \"assistant\";\n  content: ConverseContentBlock[];\n}\n\ninterface ConverseToolSpec {\n  name: string;\n  description?: string;\n  inputSchema?: object;\n}\n\ninterface ConverseRequest {\n  messages: ConverseMessage[];\n  system?: { text: string }[];\n  inferenceConfig?: { maxTokens?: number; temperature?: number };\n  toolConfig?: { tools: { toolSpec: ConverseToolSpec }[] };\n}\n\n// ─── Converse stop_reason mapping ──────────────────────────────────────────\n\nfunction converseStopReason(\n  overrideFinishReason: string | undefined,\n  defaultReason: string,\n): string {\n  if (!overrideFinishReason) return defaultReason;\n  if (overrideFinishReason === \"stop\") return \"end_turn\";\n  if (overrideFinishReason === \"tool_calls\") return \"tool_use\";\n  if (overrideFinishReason === \"length\") return \"max_tokens\";\n  return overrideFinishReason;\n}\n\n/**\n * Build Converse-format usage from fixture overrides.\n *\n * When no overrides are provided (the common case for mocks), all token\n * counts default to zero.  This is intentional — aimock is a mock server\n * and does not perform real tokenisation.  Callers that need non-zero\n * usage should supply explicit `usage` overrides in their fixture.\n */\nfunction converseUsage(overrides?: ResponseOverrides): {\n  inputTokens: number;\n  outputTokens: number;\n  totalTokens: number;\n} {\n  if (!overrides?.usage) return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n  const inputTokens = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;\n  const outputTokens = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;\n  return { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens };\n}\n\nfunction parseConverseToolArgumentsForStream(toolCall: ToolCall, logger: Logger): string {\n  try {\n    const parsed = JSON.parse(toolCall.arguments || \"{}\");\n    return JSON.stringify(parsed);\n  } catch {\n    logger.warn(\n      `Malformed JSON in fixture tool call arguments for \"${toolCall.name}\": ${toolCall.arguments}`,\n    );\n    return \"{}\";\n  }\n}\n\nfunction buildBedrockStreamTextEvents(\n  content: string,\n  chunkSize: number,\n  reasoning?: string,\n  overrides?: ResponseOverrides,\n): Array<{ eventType: string; payload: object }> {\n  const events: Array<{ eventType: string; payload: object }> = [\n    { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n  ];\n\n  if (reasoning) {\n    const blockIndex = 0;\n    events.push({\n      eventType: \"contentBlockStart\",\n      payload: { contentBlockIndex: blockIndex, start: { reasoningContent: {} } },\n    });\n    for (let i = 0; i < reasoning.length; i += chunkSize) {\n      events.push({\n        eventType: \"contentBlockDelta\",\n        payload: {\n          contentBlockIndex: blockIndex,\n          delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n        },\n      });\n    }\n    events.push({\n      eventType: \"contentBlockStop\",\n      payload: { contentBlockIndex: blockIndex },\n    });\n  }\n\n  const textBlockIndex = reasoning ? 1 : 0;\n  events.push({\n    eventType: \"contentBlockStart\",\n    payload: { contentBlockIndex: textBlockIndex, start: {} },\n  });\n  for (let i = 0; i < content.length; i += chunkSize) {\n    events.push({\n      eventType: \"contentBlockDelta\",\n      payload: {\n        contentBlockIndex: textBlockIndex,\n        delta: { text: content.slice(i, i + chunkSize) },\n      },\n    });\n  }\n  events.push({\n    eventType: \"contentBlockStop\",\n    payload: { contentBlockIndex: textBlockIndex },\n  });\n  events.push({\n    eventType: \"messageStop\",\n    payload: { stopReason: converseStopReason(overrides?.finishReason, \"end_turn\") },\n  });\n  const usage = converseUsage(overrides);\n  events.push({\n    eventType: \"metadata\",\n    payload: { usage, metrics: { latencyMs: 0 } },\n  });\n  return events;\n}\n\nfunction buildBedrockStreamContentWithToolCallsEvents(\n  content: string,\n  toolCalls: ToolCall[],\n  chunkSize: number,\n  logger: Logger,\n  reasoning?: string,\n  overrides?: ResponseOverrides,\n): Array<{ eventType: string; payload: object }> {\n  const events = buildBedrockStreamTextEvents(content, chunkSize, reasoning, overrides);\n  // Remove trailing metadata + messageStop events — we re-emit them after tool blocks\n  for (let i = events.length - 1; i >= 0; i--) {\n    const et = (events[i] as { eventType: string }).eventType;\n    if (et === \"metadata\" || et === \"messageStop\") {\n      events.splice(i, 1);\n    }\n  }\n  let blockIndex = reasoning ? 2 : 1;\n\n  for (const tc of toolCalls) {\n    const toolUseId = tc.id || generateToolUseId();\n    events.push({\n      eventType: \"contentBlockStart\",\n      payload: {\n        contentBlockIndex: blockIndex,\n        start: { toolUse: { toolUseId, name: tc.name } },\n      },\n    });\n    const argsStr = parseConverseToolArgumentsForStream(tc, logger);\n    for (let i = 0; i < argsStr.length; i += chunkSize) {\n      events.push({\n        eventType: \"contentBlockDelta\",\n        payload: {\n          contentBlockIndex: blockIndex,\n          delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n        },\n      });\n    }\n    events.push({\n      eventType: \"contentBlockStop\",\n      payload: { contentBlockIndex: blockIndex },\n    });\n    blockIndex++;\n  }\n  events.push({\n    eventType: \"messageStop\",\n    payload: { stopReason: converseStopReason(overrides?.finishReason, \"tool_use\") },\n  });\n  const usage = converseUsage(overrides);\n  events.push({\n    eventType: \"metadata\",\n    payload: { usage, metrics: { latencyMs: 0 } },\n  });\n  return events;\n}\n\nfunction buildBedrockStreamToolCallEvents(\n  toolCalls: ToolCall[],\n  chunkSize: number,\n  logger: Logger,\n  reasoning?: string,\n  overrides?: ResponseOverrides,\n): Array<{ eventType: string; payload: object }> {\n  const events: Array<{ eventType: string; payload: object }> = [\n    { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n  ];\n\n  // A leading reasoning block occupies contentBlockIndex 0, shifting the\n  // toolUse blocks by +1 (mirrors the content+tool builder's sequencing).\n  if (reasoning) {\n    const reasoningBlockIndex = 0;\n    events.push({\n      eventType: \"contentBlockStart\",\n      payload: { contentBlockIndex: reasoningBlockIndex, start: { reasoningContent: {} } },\n    });\n    for (let i = 0; i < reasoning.length; i += chunkSize) {\n      events.push({\n        eventType: \"contentBlockDelta\",\n        payload: {\n          contentBlockIndex: reasoningBlockIndex,\n          delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n        },\n      });\n    }\n    events.push({\n      eventType: \"contentBlockStop\",\n      payload: { contentBlockIndex: reasoningBlockIndex },\n    });\n  }\n\n  const toolBlockOffset = reasoning ? 1 : 0;\n\n  for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {\n    const blockIndex = tcIdx + toolBlockOffset;\n    const tc = toolCalls[tcIdx];\n    const toolUseId = tc.id || generateToolUseId();\n    events.push({\n      eventType: \"contentBlockStart\",\n      payload: {\n        contentBlockIndex: blockIndex,\n        start: { toolUse: { toolUseId, name: tc.name } },\n      },\n    });\n    const argsStr = parseConverseToolArgumentsForStream(tc, logger);\n    for (let i = 0; i < argsStr.length; i += chunkSize) {\n      events.push({\n        eventType: \"contentBlockDelta\",\n        payload: {\n          contentBlockIndex: blockIndex,\n          delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n        },\n      });\n    }\n    events.push({\n      eventType: \"contentBlockStop\",\n      payload: { contentBlockIndex: blockIndex },\n    });\n  }\n  events.push({\n    eventType: \"messageStop\",\n    payload: { stopReason: converseStopReason(overrides?.finishReason, \"tool_use\") },\n  });\n  const usage = converseUsage(overrides);\n  events.push({\n    eventType: \"metadata\",\n    payload: { usage, metrics: { latencyMs: 0 } },\n  });\n  return events;\n}\n\n// ─── Input conversion: Converse → ChatCompletionRequest ─────────────────────\n\nexport function converseToCompletionRequest(\n  req: ConverseRequest,\n  modelId: string,\n  logger?: Logger,\n): ChatCompletionRequest {\n  const messages: ChatMessage[] = [];\n\n  // system field → system message\n  if (req.system && req.system.length > 0) {\n    const systemText = req.system.map((s) => s.text).join(\"\");\n    if (systemText) {\n      messages.push({ role: \"system\", content: systemText });\n    }\n  }\n\n  for (const msg of req.messages) {\n    if (msg.role === \"user\") {\n      // Check for toolResult blocks\n      const toolResults = msg.content.filter((b) => b.toolResult);\n      const textBlocks = msg.content.filter(\n        (b) => b.text !== undefined && b.text !== \"\" && !b.toolResult,\n      );\n      const unsupportedBlocks = msg.content.filter(\n        (b) => b.text === undefined && !b.toolResult && !b.toolUse,\n      );\n      if (unsupportedBlocks.length > 0 && logger) {\n        logger.warn(\n          `Converse user message contains unsupported content block types — these will be dropped during conversion`,\n        );\n      }\n\n      if (toolResults.length > 0) {\n        for (const block of toolResults) {\n          const tr = block.toolResult!;\n          const resultContent = tr.content.map((c) => c.text ?? \"\").join(\"\");\n          messages.push({\n            role: \"tool\",\n            content: resultContent,\n            tool_call_id: tr.toolUseId,\n          });\n        }\n        if (textBlocks.length > 0) {\n          messages.push({\n            role: \"user\",\n            content: textBlocks.map((b) => b.text ?? \"\").join(\"\"),\n          });\n        }\n        continue;\n      }\n\n      // Plain user message\n      const text = msg.content\n        .filter((b) => b.text !== undefined && b.text !== \"\")\n        .map((b) => b.text ?? \"\")\n        .join(\"\");\n      messages.push({ role: \"user\", content: text });\n    } else if (msg.role === \"assistant\") {\n      const toolUseBlocks = msg.content.filter((b) => b.toolUse);\n      const textContent = msg.content\n        .filter((b) => b.text !== undefined && b.text !== \"\")\n        .map((b) => b.text ?? \"\")\n        .join(\"\");\n\n      if (toolUseBlocks.length > 0) {\n        messages.push({\n          role: \"assistant\",\n          content: textContent || null,\n          tool_calls: toolUseBlocks.map((b) => ({\n            id: b.toolUse!.toolUseId,\n            type: \"function\" as const,\n            function: {\n              name: b.toolUse!.name,\n              arguments: JSON.stringify(b.toolUse!.input),\n            },\n          })),\n        });\n      } else {\n        messages.push({ role: \"assistant\", content: textContent || null });\n      }\n    } else {\n      const warnMsg = `Unexpected message role \"${msg.role}\" in Converse request — skipping`;\n      if (logger) {\n        logger.warn(warnMsg);\n      }\n    }\n  }\n\n  // Convert tools\n  let tools: ToolDefinition[] | undefined;\n  if (req.toolConfig?.tools && req.toolConfig.tools.length > 0) {\n    tools = req.toolConfig.tools.map((t) => ({\n      type: \"function\" as const,\n      function: {\n        name: t.toolSpec.name,\n        description: t.toolSpec.description,\n        parameters: (t.toolSpec.inputSchema && \"json\" in t.toolSpec.inputSchema\n          ? (t.toolSpec.inputSchema as Record<string, unknown>).json\n          : t.toolSpec.inputSchema) as object | undefined,\n      },\n    }));\n  }\n\n  return {\n    model: modelId,\n    messages,\n    stream: false,\n    temperature: req.inferenceConfig?.temperature,\n    max_tokens: req.inferenceConfig?.maxTokens,\n    tools,\n  };\n}\n\n// ─── Response builders ──────────────────────────────────────────────────────\n\nfunction buildConverseTextResponse(\n  content: string,\n  reasoning?: string,\n  overrides?: ResponseOverrides,\n): object {\n  const contentBlocks: object[] = [];\n  if (reasoning) {\n    contentBlocks.push({\n      reasoningContent: { reasoningText: { text: reasoning } },\n    });\n  }\n  contentBlocks.push({ text: content });\n\n  return {\n    output: {\n      message: {\n        role: \"assistant\",\n        content: contentBlocks,\n      },\n    },\n    stopReason: converseStopReason(overrides?.finishReason, \"end_turn\"),\n    usage: converseUsage(overrides),\n    metrics: { latencyMs: 0 },\n  };\n}\n\nfunction buildConverseToolCallResponse(\n  toolCalls: ToolCall[],\n  logger: Logger,\n  reasoning?: string,\n  overrides?: ResponseOverrides,\n): object {\n  const contentBlocks: object[] = [];\n  if (reasoning) {\n    contentBlocks.push({\n      reasoningContent: { reasoningText: { text: reasoning } },\n    });\n  }\n  for (const tc of toolCalls) {\n    let argsObj: unknown;\n    try {\n      argsObj = JSON.parse(tc.arguments || \"{}\");\n    } catch {\n      logger.warn(\n        `Malformed JSON in fixture tool call arguments for \"${tc.name}\": ${tc.arguments}`,\n      );\n      argsObj = {};\n    }\n    contentBlocks.push({\n      toolUse: {\n        toolUseId: tc.id || generateToolUseId(),\n        name: tc.name,\n        input: argsObj,\n      },\n    });\n  }\n\n  return {\n    output: {\n      message: {\n        role: \"assistant\",\n        content: contentBlocks,\n      },\n    },\n    stopReason: converseStopReason(overrides?.finishReason, \"tool_use\"),\n    usage: converseUsage(overrides),\n    metrics: { latencyMs: 0 },\n  };\n}\n\nfunction buildConverseContentWithToolCallsResponse(\n  content: string,\n  toolCalls: ToolCall[],\n  logger: Logger,\n  reasoning?: string,\n  overrides?: ResponseOverrides,\n): object {\n  const contentBlocks: object[] = [];\n  if (reasoning) {\n    contentBlocks.push({\n      reasoningContent: { reasoningText: { text: reasoning } },\n    });\n  }\n  contentBlocks.push({ text: content });\n  for (const tc of toolCalls) {\n    let argsObj: unknown;\n    try {\n      argsObj = JSON.parse(tc.arguments || \"{}\");\n    } catch {\n      logger.warn(\n        `Malformed JSON in fixture tool call arguments for \"${tc.name}\": ${tc.arguments}`,\n      );\n      argsObj = {};\n    }\n    contentBlocks.push({\n      toolUse: {\n        toolUseId: tc.id || generateToolUseId(),\n        name: tc.name,\n        input: argsObj,\n      },\n    });\n  }\n\n  return {\n    output: {\n      message: {\n        role: \"assistant\",\n        content: contentBlocks,\n      },\n    },\n    stopReason: converseStopReason(overrides?.finishReason, \"tool_use\"),\n    usage: converseUsage(overrides),\n    metrics: { latencyMs: 0 },\n  };\n}\n\n// ─── Request handlers ───────────────────────────────────────────────────────\n\nexport async function handleConverse(\n  req: http.IncomingMessage,\n  res: http.ServerResponse,\n  raw: string,\n  modelId: string,\n  fixtures: Fixture[],\n  journal: Journal,\n  defaults: HandlerDefaults,\n  setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n  const { logger } = defaults;\n  setCorsHeaders(res);\n\n  const urlPath = req.url ?? `/model/${modelId}/converse`;\n\n  let converseReq: ConverseRequest;\n  try {\n    converseReq = JSON.parse(raw) as ConverseRequest;\n  } catch (parseErr) {\n    const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\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        },\n      }),\n    );\n    return;\n  }\n\n  if (!converseReq.messages || !Array.isArray(converseReq.messages)) {\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\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: \"Invalid request: messages array is required\",\n          type: \"invalid_request_error\",\n        },\n      }),\n    );\n    return;\n  }\n\n  const completionReq = converseToCompletionRequest(converseReq, modelId, logger);\n  completionReq._endpointType = \"chat\";\n  completionReq._context = getContext(req);\n\n  const testId = getTestId(req);\n  const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(\n    fixtures,\n    completionReq,\n    journal.getFixtureMatchCountsForTest(testId),\n    defaults.requestTransform,\n    // Record mode proxies on a miss to capture a fresh turn (see record gate\n    // below), so keep turnIndex strict to prevent an earlier-turn fixture from\n    // shadowing a longer request and skipping the new turn's recording.\n    recordMatchOptions(!!defaults.record, defaults.logger),\n  );\n\n  if (fixture) {\n    logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);\n  } else {\n    logger.debug(`No fixture matched for request`);\n  }\n\n  if (fixture) {\n    journal.incrementFixtureMatchCount(fixture, fixtures, testId);\n  }\n\n  if (\n    applyChaos(\n      res,\n      fixture,\n      defaults.chaos,\n      req.headers,\n      journal,\n      {\n        method: req.method ?? \"POST\",\n        path: urlPath,\n        headers: flattenHeaders(req.headers),\n        body: completionReq,\n      },\n      fixture ? \"fixture\" : \"proxy\",\n      defaults.registry,\n      defaults.logger,\n    )\n  )\n    return;\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      logger.error(strictNoMatchLogLine(req.method ?? \"POST\", urlPath, skippedBySequenceOrTurn));\n      journal.add({\n        method: req.method ?? \"POST\",\n        path: urlPath,\n        headers: flattenHeaders(req.headers),\n        body: completionReq,\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          },\n        }),\n      );\n      return;\n    }\n    if (defaults.record) {\n      const outcome = await proxyAndRecord(\n        req,\n        res,\n        completionReq,\n        \"bedrock\",\n        urlPath,\n        fixtures,\n        defaults,\n        raw,\n      );\n      if (outcome === \"handled_by_hook\") return;\n      if (outcome !== \"not_configured\") {\n        journal.add({\n          method: req.method ?? \"POST\",\n          path: urlPath,\n          headers: flattenHeaders(req.headers),\n          body: completionReq,\n          response: { status: res.statusCode ?? 200, fixture: null, source: \"proxy\" },\n        });\n        return;\n      }\n    }\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\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        },\n      }),\n    );\n    return;\n  }\n\n  const response = await resolveResponse(fixture, completionReq);\n\n  // Error response\n  if (isErrorResponse(response)) {\n    const status = response.status ?? 500;\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status, fixture },\n    });\n    const errBody = {\n      type: \"error\",\n      error: {\n        type: response.error.type ?? \"invalid_request_error\",\n        message: response.error.message,\n      },\n    };\n    writeErrorResponse(res, status, JSON.stringify(errBody), {\n      retryAfter: response.retryAfter,\n    });\n    return;\n  }\n\n  // Content + tool calls response\n  if (isContentWithToolCallsResponse(response)) {\n    if (response.webSearches?.length) {\n      logger.warn(\n        \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      completionReq.model,\n      resolveStrictMode(defaults.strict, req.headers),\n      logger,\n    );\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status: 200, fixture },\n    });\n    const body = buildConverseContentWithToolCallsResponse(\n      response.content,\n      response.toolCalls,\n      logger,\n      effReasoning,\n      overrides,\n    );\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify(body));\n    return;\n  }\n\n  // Text response\n  if (isTextResponse(response)) {\n    if (response.webSearches?.length) {\n      logger.warn(\n        \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      completionReq.model,\n      resolveStrictMode(defaults.strict, req.headers),\n      logger,\n    );\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status: 200, fixture },\n    });\n    const body = buildConverseTextResponse(response.content, effReasoning, overrides);\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify(body));\n    return;\n  }\n\n  // Tool call response\n  if (isToolCallResponse(response)) {\n    if (response.webSearches?.length) {\n      logger.warn(\n        \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      completionReq.model,\n      resolveStrictMode(defaults.strict, req.headers),\n      logger,\n    );\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status: 200, fixture },\n    });\n    const body = buildConverseToolCallResponse(response.toolCalls, logger, effReasoning, overrides);\n    res.writeHead(200, { \"Content-Type\": \"application/json\" });\n    res.end(JSON.stringify(body));\n    return;\n  }\n\n  // Unknown response type\n  journal.add({\n    method: req.method ?? \"POST\",\n    path: urlPath,\n    headers: flattenHeaders(req.headers),\n    body: completionReq,\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 async function handleConverseStream(\n  req: http.IncomingMessage,\n  res: http.ServerResponse,\n  raw: string,\n  modelId: string,\n  fixtures: Fixture[],\n  journal: Journal,\n  defaults: HandlerDefaults,\n  setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n  const { logger } = defaults;\n  setCorsHeaders(res);\n\n  const urlPath = req.url ?? `/model/${modelId}/converse-stream`;\n\n  let converseReq: ConverseRequest;\n  try {\n    converseReq = JSON.parse(raw) as ConverseRequest;\n  } catch (parseErr) {\n    const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\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        },\n      }),\n    );\n    return;\n  }\n\n  if (!converseReq.messages || !Array.isArray(converseReq.messages)) {\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\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: \"Invalid request: messages array is required\",\n          type: \"invalid_request_error\",\n        },\n      }),\n    );\n    return;\n  }\n\n  const completionReq = converseToCompletionRequest(converseReq, modelId, logger);\n  completionReq.stream = true;\n  completionReq._endpointType = \"chat\";\n  completionReq._context = getContext(req);\n\n  const testId = getTestId(req);\n  const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(\n    fixtures,\n    completionReq,\n    journal.getFixtureMatchCountsForTest(testId),\n    defaults.requestTransform,\n    // Record mode proxies on a miss to capture a fresh turn (see record gate\n    // below), so keep turnIndex strict to prevent an earlier-turn fixture from\n    // shadowing a longer request and skipping the new turn's recording.\n    recordMatchOptions(!!defaults.record, defaults.logger),\n  );\n\n  if (fixture) {\n    logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);\n  } else {\n    logger.debug(`No fixture matched for request`);\n  }\n\n  if (fixture) {\n    journal.incrementFixtureMatchCount(fixture, fixtures, testId);\n  }\n\n  if (\n    applyChaos(\n      res,\n      fixture,\n      defaults.chaos,\n      req.headers,\n      journal,\n      {\n        method: req.method ?? \"POST\",\n        path: urlPath,\n        headers: flattenHeaders(req.headers),\n        body: completionReq,\n      },\n      fixture ? \"fixture\" : \"proxy\",\n      defaults.registry,\n      defaults.logger,\n    )\n  )\n    return;\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      logger.error(strictNoMatchLogLine(req.method ?? \"POST\", urlPath, skippedBySequenceOrTurn));\n      journal.add({\n        method: req.method ?? \"POST\",\n        path: urlPath,\n        headers: flattenHeaders(req.headers),\n        body: completionReq,\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          },\n        }),\n      );\n      return;\n    }\n    if (defaults.record) {\n      const outcome = await proxyAndRecord(\n        req,\n        res,\n        completionReq,\n        \"bedrock\",\n        urlPath,\n        fixtures,\n        defaults,\n        raw,\n      );\n      if (outcome === \"handled_by_hook\") return;\n      if (outcome !== \"not_configured\") {\n        journal.add({\n          method: req.method ?? \"POST\",\n          path: urlPath,\n          headers: flattenHeaders(req.headers),\n          body: completionReq,\n          response: { status: res.statusCode ?? 200, fixture: null, source: \"proxy\" },\n        });\n        return;\n      }\n    }\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\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        },\n      }),\n    );\n    return;\n  }\n\n  const response = await resolveResponse(fixture, completionReq);\n  const latency = fixture.latency ?? defaults.latency;\n  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);\n\n  // Error response\n  if (isErrorResponse(response)) {\n    const status = response.status ?? 500;\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status, fixture },\n    });\n    const errBody = {\n      type: \"error\",\n      error: {\n        type: response.error.type ?? \"invalid_request_error\",\n        message: response.error.message,\n      },\n    };\n    writeErrorResponse(res, status, JSON.stringify(errBody), {\n      retryAfter: response.retryAfter,\n    });\n    return;\n  }\n\n  // Content + tool calls response — stream as Event Stream\n  if (isContentWithToolCallsResponse(response)) {\n    if (response.webSearches?.length) {\n      logger.warn(\n        \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      completionReq.model,\n      resolveStrictMode(defaults.strict, req.headers),\n      logger,\n    );\n    const journalEntry = journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status: 200, fixture },\n    });\n    const events = buildBedrockStreamContentWithToolCallsEvents(\n      response.content,\n      response.toolCalls,\n      chunkSize,\n      logger,\n      effReasoning,\n      overrides,\n    );\n    const interruption = createInterruptionSignal(fixture);\n    const completed = await writeEventStream(res, events, {\n      latency,\n      streamingProfile: fixture.streamingProfile,\n      recordedTimings: fixture.recordedTimings,\n      replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n      signal: interruption?.signal,\n      onChunkSent: interruption?.tick,\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    return;\n  }\n\n  // Text response — stream as Event Stream\n  if (isTextResponse(response)) {\n    if (response.webSearches?.length) {\n      logger.warn(\n        \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      completionReq.model,\n      resolveStrictMode(defaults.strict, req.headers),\n      logger,\n    );\n    const journalEntry = journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status: 200, fixture },\n    });\n    const events = buildBedrockStreamTextEvents(\n      response.content,\n      chunkSize,\n      effReasoning,\n      overrides,\n    );\n    const interruption = createInterruptionSignal(fixture);\n    const completed = await writeEventStream(res, events, {\n      latency,\n      streamingProfile: fixture.streamingProfile,\n      recordedTimings: fixture.recordedTimings,\n      replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n      signal: interruption?.signal,\n      onChunkSent: interruption?.tick,\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    return;\n  }\n\n  // Tool call response — stream as Event Stream\n  if (isToolCallResponse(response)) {\n    if (response.webSearches?.length) {\n      logger.warn(\n        \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n      );\n    }\n    const overrides = extractOverrides(response);\n    const effReasoning = resolveReasoningForModel(\n      response.reasoning,\n      completionReq.model,\n      resolveStrictMode(defaults.strict, req.headers),\n      logger,\n    );\n    const journalEntry = journal.add({\n      method: req.method ?? \"POST\",\n      path: urlPath,\n      headers: flattenHeaders(req.headers),\n      body: completionReq,\n      response: { status: 200, fixture },\n    });\n    const events = buildBedrockStreamToolCallEvents(\n      response.toolCalls,\n      chunkSize,\n      logger,\n      effReasoning,\n      overrides,\n    );\n    const interruption = createInterruptionSignal(fixture);\n    const completed = await writeEventStream(res, events, {\n      latency,\n      streamingProfile: fixture.streamingProfile,\n      recordedTimings: fixture.recordedTimings,\n      replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n      signal: interruption?.signal,\n      onChunkSent: interruption?.tick,\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    return;\n  }\n\n  // Unknown response type\n  journal.add({\n    method: req.method ?? \"POST\",\n    path: urlPath,\n    headers: flattenHeaders(req.headers),\n    body: completionReq,\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"],"mappings":"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"}