{"version":3,"file":"rerank.cjs","names":["flattenHeaders","matchesPattern","generateId"],"sources":["../src/rerank.ts"],"sourcesContent":["/**\n * Reranking API support for LLMock.\n *\n * Handles POST /v2/rerank requests (Cohere rerank-compatible). Matches\n * fixtures by comparing the request `query` field against registered\n * patterns. First match wins; no match returns empty results.\n */\n\nimport type * as http from \"node:http\";\nimport { flattenHeaders, generateId, matchesPattern } from \"./helpers.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\n\n// ─── Rerank types ─────────────────────────────────────────────────────────\n\nexport interface RerankResult {\n  index: number;\n  relevance_score: number;\n}\n\nexport interface RerankFixture {\n  match: string | RegExp;\n  results: RerankResult[];\n}\n\n// ─── Request handler ──────────────────────────────────────────────────────\n\nexport async function handleRerank(\n  req: http.IncomingMessage,\n  res: http.ServerResponse,\n  raw: string,\n  fixtures: RerankFixture[],\n  journal: Journal,\n  defaults: { logger: Logger },\n  setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n  const { logger } = defaults;\n  setCorsHeaders(res);\n\n  let body: { query?: string; model?: string };\n  try {\n    body = JSON.parse(raw) as { query?: string; model?: string };\n  } catch (parseErr) {\n    const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n    journal.add({\n      method: req.method ?? \"POST\",\n      path: req.url ?? \"/v2/rerank\",\n      headers: flattenHeaders(req.headers),\n      body: null,\n      service: \"rerank\",\n      response: { status: 400, fixture: null },\n    });\n    res.writeHead(400, { \"Content-Type\": \"application/json\" });\n    res.end(\n      JSON.stringify({\n        error: {\n          message: `Malformed JSON: ${detail}`,\n          type: \"invalid_request_error\",\n          code: \"invalid_json\",\n        },\n      }),\n    );\n    return;\n  }\n\n  const query = body.query ?? \"\";\n\n  // Find first matching fixture\n  let matchedResults: RerankResult[] = [];\n  let matchedFixture: RerankFixture | null = null;\n\n  for (const fixture of fixtures) {\n    if (matchesPattern(query, fixture.match)) {\n      matchedFixture = fixture;\n      matchedResults = fixture.results;\n      break;\n    }\n  }\n\n  if (matchedFixture) {\n    logger.debug(`Rerank fixture matched for query \"${query.slice(0, 80)}\"`);\n  } else {\n    logger.debug(`No rerank fixture matched for query \"${query.slice(0, 80)}\" — returning empty`);\n  }\n\n  // Build response (Cohere rerank v2 format: index + relevance_score only)\n  const results = matchedResults.map((r) => ({\n    index: r.index,\n    relevance_score: r.relevance_score,\n  }));\n\n  journal.add({\n    method: req.method ?? \"POST\",\n    path: req.url ?? \"/v2/rerank\",\n    headers: flattenHeaders(req.headers),\n    body: null,\n    service: \"rerank\",\n    response: { status: 200, fixture: null },\n  });\n\n  res.writeHead(200, { \"Content-Type\": \"application/json\" });\n  res.end(\n    JSON.stringify({\n      id: generateId(\"rerank\"),\n      results,\n      meta: {\n        billed_units: { search_units: 0 },\n      },\n    }),\n  );\n}\n"],"mappings":";;;AA2BA,eAAsB,aACpB,KACA,KACA,KACA,UACA,SACA,UACA,gBACe;CACf,MAAM,EAAE,WAAW;AACnB,gBAAe,IAAI;CAEnB,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,IAAI;UACf,UAAU;EACjB,MAAM,SAAS,oBAAoB,QAAQ,SAAS,UAAU;AAC9D,UAAQ,IAAI;GACV,QAAQ,IAAI,UAAU;GACtB,MAAM,IAAI,OAAO;GACjB,SAASA,+BAAe,IAAI,QAAQ;GACpC,MAAM;GACN,SAAS;GACT,UAAU;IAAE,QAAQ;IAAK,SAAS;IAAM;GACzC,CAAC;AACF,MAAI,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,CAAC;AAC1D,MAAI,IACF,KAAK,UAAU,EACb,OAAO;GACL,SAAS,mBAAmB;GAC5B,MAAM;GACN,MAAM;GACP,EACF,CAAC,CACH;AACD;;CAGF,MAAM,QAAQ,KAAK,SAAS;CAG5B,IAAI,iBAAiC,EAAE;CACvC,IAAI,iBAAuC;AAE3C,MAAK,MAAM,WAAW,SACpB,KAAIC,+BAAe,OAAO,QAAQ,MAAM,EAAE;AACxC,mBAAiB;AACjB,mBAAiB,QAAQ;AACzB;;AAIJ,KAAI,eACF,QAAO,MAAM,qCAAqC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG;KAExE,QAAO,MAAM,wCAAwC,MAAM,MAAM,GAAG,GAAG,CAAC,qBAAqB;CAI/F,MAAM,UAAU,eAAe,KAAK,OAAO;EACzC,OAAO,EAAE;EACT,iBAAiB,EAAE;EACpB,EAAE;AAEH,SAAQ,IAAI;EACV,QAAQ,IAAI,UAAU;EACtB,MAAM,IAAI,OAAO;EACjB,SAASD,+BAAe,IAAI,QAAQ;EACpC,MAAM;EACN,SAAS;EACT,UAAU;GAAE,QAAQ;GAAK,SAAS;GAAM;EACzC,CAAC;AAEF,KAAI,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,CAAC;AAC1D,KAAI,IACF,KAAK,UAAU;EACb,IAAIE,2BAAW,SAAS;EACxB;EACA,MAAM,EACJ,cAAc,EAAE,cAAc,GAAG,EAClC;EACF,CAAC,CACH"}