{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-5RH2WYMW.cjs","../src/cost/costModelResolution.ts","../src/cost/resolveModelVendor.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACHO,SAAS,oBAAA,CAAqB,QAAA,EAA4B;AAC/D,EAAA,OAAO,iDAAA,QAA0B,EAAA,IAAM,YAAA;AACzC;AAEO,SAAS,eAAA,CAAgB,QAAA,EAA4B;AAC1D,EAAA,MAAM,EAAA,mBAAI,iDAAA,QAA0B,CAAA,UAAK,+CAAA,iBAAgB,QAAA,UAAY,IAAE,GAAA;AACvE,EAAA,OAAO,iCAAA,CAAgB,GAAA,CAAI,CAAC,CAAA;AAC9B;AAGO,SAAS,yBAAA,CACd,QAAA,EACA,aAAA,EACS;AACT,EAAA,GAAA,CAAI,iBAAC,QAAA,2BAAU,QAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,OAAO,KAAA;AAChD,EAAA,GAAA,CAAI,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,4BAA4B,CAAA,EAAG,OAAO,IAAA;AACxE,EAAA,OAAO,eAAA,CAAgB,aAAa,CAAA;AACtC;AAMO,SAAS,2BAAA,CACd,KAAA,EACA,YAAA,EACoB;AACpB,EAAA,MAAM,WAAA,EAAa,+CAAA,KAAqB,CAAA;AACxC,EAAA,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACtC,IAAA,GAAA,CAAI,CAAC,oBAAA,CAAqB,MAAM,CAAA,EAAG,OAAO,MAAA;AAAA,EAC5C;AACA,EAAA,GAAA,CAAI,aAAA,GAAgB,CAAC,oBAAA,CAAqB,YAAY,CAAA,EAAG;AACvD,IAAA,OAAO,iDAAA,YAA8B,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA,CAAA;AACT;AAiBO,SAAS,2BAAA,CACd,KAAA,EACA,QAAA,EACwB;AACxB,EAAA,MAAM,SAAA,EAAmC,CAAC,CAAA;AAC1C,EAAA,MAAM,KAAA,kBAAO,IAAI,GAAA,CAAY,CAAA;AAC7B,EAAA,MAAM,IAAA,EAAM,CAAC,CAAA,EAAW,CAAA,EAAA,GAAe;AACrC,IAAA,MAAM,IAAA,EAAM,CAAA,mBAAA;AACC,IAAA;AACD,IAAA;AACH,IAAA;AACX,EAAA;AAEW,EAAA;AAEL,EAAA;AACQ,EAAA;AACE,EAAA;AACX,EAAA;AACQ,IAAA;AACb,EAAA;AAEO,EAAA;AACT;AAEsB;AAKqB,EAAA;AACrC,EAAA;AAEO,EAAA;AACH,IAAA;AACC,IAAA;AACI,IAAA;AAEF,IAAA;AAIP,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAEgB;AAMF,EAAA;AAER,EAAA;AAEU,EAAA;AACL,IAAA;AACT,EAAA;AAEe,EAAA;AACD,sCAAA;AACZ,IAAA;AACF,EAAA;AACc,EAAA;AACL,IAAA;AACT,EAAA;AAEO,EAAA;AACT;ADpDiB;AACA;AElEK;AAKN,EAAA;AACH,EAAA;AAEL,EAAA;AACS,EAAA;AAEH,EAAA;AACE,IAAA;AACH,IAAA;AACX,EAAA;AAEM,EAAA;AACS,IAAA;AACd,EAAA;AACG,EAAA;AACK,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEa,EAAA;AACC,IAAA;AACH,IAAA;AACX,EAAA;AAEO,EAAA;AACT;AF2DiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-5RH2WYMW.cjs","sourcesContent":[null,"import type { AiModelsCatalogClient } from \"../catalog/AiModelsCatalogClient.js\";\nimport { LOCAL_PROVIDERS } from \"../sync/modelNameResolver/constants.js\";\nimport {\n  loadOpenRouterRoutingEnv,\n  shouldDefaultRouteViaOpenRouter,\n} from \"../sync/openRouterRoutingEnv.js\";\nimport { normalizeProvider, normalizeString } from \"../sync/modelNameResolver/normalize.js\";\nimport type {\n  ModelResolutionInput,\n  ModelResolutionResult,\n  ModelResolverOptions,\n} from \"../sync/modelNameResolver/types.js\";\nimport type { OpenRouterRoutingConfig } from \"../sync/openRouterRoutingEnv.js\";\n\nexport function isOpenRouterProvider(provider?: string): boolean {\n  return normalizeProvider(provider) === \"openrouter\";\n}\n\nexport function isLocalProvider(provider?: string): boolean {\n  const p = normalizeProvider(provider) ?? normalizeString(provider ?? \"\");\n  return LOCAL_PROVIDERS.has(p);\n}\n\n/** Catalog resolver returned success without a priced record (Ollama, LM Studio, …). */\nexport function isLocalProviderResolution(\n  resolved: ModelResolutionResult | null,\n  inputProvider?: string,\n): boolean {\n  if (!resolved?.found || resolved.record) return false;\n  if (resolved.resolvedVia.includes(\"local-provider-passthrough\")) return true;\n  return isLocalProvider(inputProvider);\n}\n\n/**\n * Vendor id for a model slug (`deepseek/deepseek-v3.2` → `deepseek`).\n * Ignores `openrouter` as a provider hint — it is a routing layer, not the model owner.\n */\nexport function underlyingProviderFromModel(\n  model: string,\n  providerHint?: string,\n): string | undefined {\n  const normalized = normalizeString(model);\n  if (normalized.includes(\"/\")) {\n    const prefix = normalized.split(\"/\")[0]!;\n    if (!isOpenRouterProvider(prefix)) return prefix;\n  }\n  if (providerHint && !isOpenRouterProvider(providerHint)) {\n    return normalizeProvider(providerHint);\n  }\n  return undefined;\n}\n\n/** Provider hint for ai-profiles index lookup (openrouter → underlying vendor). */\nexport function providerHintForProfiles(\n  model: string,\n  provider?: string,\n): string | undefined {\n  if (isOpenRouterProvider(provider)) {\n    return underlyingProviderFromModel(model, provider);\n  }\n  return normalizeProvider(provider);\n}\n\n/**\n * Catalog resolve attempts for direct API and OpenRouter usage.\n * Tries the caller hint, inferred vendor, no hint, and openrouter routing.\n */\nexport function buildCatalogResolveAttempts(\n  model: string,\n  provider?: string,\n): ModelResolutionInput[] {\n  const attempts: ModelResolutionInput[] = [];\n  const seen = new Set<string>();\n  const add = (m: string, p?: string) => {\n    const key = `${p ?? \"\"}\\0${normalizeString(m)}`;\n    if (seen.has(key)) return;\n    seen.add(key);\n    attempts.push({ model: m, provider: p });\n  };\n\n  add(model, provider);\n\n  const underlying = underlyingProviderFromModel(model, provider);\n  if (provider) add(model, undefined);\n  if (underlying) add(model, underlying);\n  if (!isOpenRouterProvider(provider)) {\n    add(model, \"openrouter\");\n  }\n\n  return attempts;\n}\n\nexport async function resolveFromCatalogAttempts(\n  catalog: AiModelsCatalogClient,\n  attempts: ModelResolutionInput[],\n  options?: ModelResolverOptions,\n): Promise<ModelResolutionResult | null> {\n  let last: ModelResolutionResult | null = null;\n  let localPassthrough: ModelResolutionResult | null = null;\n\n  for (const attempt of attempts) {\n    const result = await catalog.resolveModel(attempt, options);\n    last = result;\n    if (result.found && result.record) return result;\n    if (\n      result.found &&\n      !result.record &&\n      isLocalProviderResolution(result, attempt.provider)\n    ) {\n      localPassthrough = result;\n    }\n  }\n\n  return localPassthrough ?? last;\n}\n\nexport function resolveRoutedViaOpenRouter(\n  inputProvider: string | undefined,\n  resolved: ModelResolutionResult | null,\n  modelId?: string,\n  routingEnv?: OpenRouterRoutingConfig,\n): boolean {\n  const env = routingEnv ?? loadOpenRouterRoutingEnv();\n\n  if (isOpenRouterProvider(inputProvider)) return true;\n\n  if (resolved?.found) {\n    return resolved.routedViaOpenRouter;\n  }\n\n  const vendor = underlyingProviderFromModel(\n    modelId ?? (resolved?.found ? resolved.modelId : \"\") ?? \"\",\n    inputProvider,\n  );\n  if (vendor && shouldDefaultRouteViaOpenRouter(vendor, env)) {\n    return true;\n  }\n\n  return false;\n}\n","import type { AiModelsCatalogClient } from \"../catalog/AiModelsCatalogClient.js\";\nimport {\n  modelVendorRefFromIdentity,\n  modelVendorRefFromVendorAndSlug,\n  resolveModelVendorFromResolution,\n  resolveModelVendorLastResort,\n  type ModelVendorRef,\n  type ResolveModelVendorOptions,\n} from \"../sync/modelNameResolver/resolveModelVendor.js\";\nimport { matchModelInAiProfiles } from \"./aiProfilesMatch.js\";\nimport { buildCatalogResolveAttempts, resolveFromCatalogAttempts } from \"./costModelResolution.js\";\n\nexport type { ModelVendorRef, ResolveModelVendorOptions };\nexport {\n  resolveModelVendorFromResolution,\n  resolveModelVendorSync,\n  resolveModelVendorLastResort,\n  modelVendorRefFromIdentity,\n  modelVendorRefFromVendorAndSlug,\n} from \"../sync/modelNameResolver/resolveModelVendor.js\";\n\n/** Best-effort vendor lookup from a model name alone (catalog + ai-profiles). */\nexport async function resolveModelVendor(\n  model: string,\n  catalog: AiModelsCatalogClient,\n  options?: ResolveModelVendorOptions,\n): Promise<ModelVendorRef | null> {\n  const exact = modelVendorRefFromIdentity(model, options);\n  if (exact) return exact;\n\n  const attempts = buildCatalogResolveAttempts(model);\n  const result = await resolveFromCatalogAttempts(catalog, attempts, options);\n\n  if (result?.found) {\n    const ref = resolveModelVendorFromResolution(result, model, options);\n    if (ref) return ref;\n  }\n\n  const profileMatch = await matchModelInAiProfiles(model, undefined, {\n    catalogLane: options?.catalogLane,\n  });\n  if (profileMatch) {\n    return modelVendorRefFromVendorAndSlug(\n      profileMatch.provider,\n      profileMatch.modelId,\n      options,\n    );\n  }\n\n  if (!result?.found && result?.bestRejectedCandidate) {\n    const ref = resolveModelVendorFromResolution(result, model, options);\n    if (ref) return ref;\n  }\n\n  return resolveModelVendorLastResort(model, options);\n}\n"]}