{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-2TNX6GM4.cjs","../src/sync/modelNameResolver/resolveModelVendor.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACVA;AACE;AACA;AACA;AACA;AACA;AAAA,+CACK;AAaP,SAAS,oBAAA,CAAqB,QAAA,EAA4B;AACxD,EAAA,OAAO,iDAAA,QAA0B,EAAA,IAAM,YAAA;AACzC;AAEA,SAAS,0BAAA,CAA2B,KAAA,EAAuC;AACzE,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;AACS,EAAA;AACP,IAAA;AACD,IAAA;AACQ,MAAA;AACb,IAAA;AACF,EAAA;AAEW,EAAA;AACJ,EAAA;AACT;AAYS;AACE,EAAA;AACX;AAES;AAKD,EAAA;AACO,EAAA;AACJ,IAAA;AACM,uBAAA;AACT,QAAA;AACS,QAAA;AACX,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAES;AAIM,EAAA;AACJ,IAAA;AACT,EAAA;AACa,EAAA;AACJ,IAAA;AACK,MAAA;AACH,MAAA;AACT,IAAA;AACF,EAAA;AACS,EAAA;AACX;AAES;AAIH,EAAA;AACI,IAAA;AACJ,MAAA;AACD,IAAA;AACK,IAAA;AACA,IAAA;AACO,IAAA;AACP,MAAA;AACA,MAAA;AACK,QAAA;AACL,UAAA;AACO,UAAA;AACT,QAAA;AACF,MAAA;AACF,IAAA;AACY,IAAA;AACL,IAAA;AACK,MAAA;AACH,MAAA;AAGT,IAAA;AACM,EAAA;AACC,IAAA;AACT,EAAA;AACF;AAQgB;AAIR,EAAA;AACQ,EAAA;AAEV,EAAA;AACK,IAAA;AACT,EAAA;AAEM,EAAA;AACJ,IAAA;AACD,EAAA;AACa,EAAA;AAEP,EAAA;AACT;AAGgB;AAKP,EAAA;AACT;AAES;AAID,EAAA;AACS,IAAA;AACV,IAAA;AACL,EAAA;AACa,EAAA;AACC,IAAA;AACd,EAAA;AACO,EAAA;AACT;AAES;AAKK,EAAA;AACJ,IAAA;AACF,IAAA;AACN,EAAA;AAEM,EAAA;AACS,EAAA;AACP,IAAA;AACD,IAAA;AACI,MAAA;AACT,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAES;AAKM,EAAA;AACF,EAAA;AACJ,EAAA;AACT;AAGgB;AAIV,EAAA;AACS,EAAA;AACF,EAAA;AACJ,EAAA;AACT;AAGgB;AAKH,EAAA;AACG,IAAA;AACH,IAAA;AACX,EAAA;AAEY,EAAA;AACE,IAAA;AACH,IAAA;AACX,EAAA;AAEO,EAAA;AACT;AAGgB;AAKA,EAAA;AACH,EAAA;AAEL,EAAA;AACA,EAAA;AACmC,EAAA;AAE9B,EAAA;AACH,IAAA;AACC,IAAA;AACI,IAAA;AACH,MAAA;AACG,MAAA;AACX,IAAA;AACF,EAAA;AAEO,EAAA;AACG,qBAAA;AACC,MAAA;AACE,MAAA;AACD,MAAA;AACR,MAAA;AACQ,MAAA;AACV,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;ADvFiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-2TNX6GM4.cjs","sourcesContent":[null,"import {\n  buildModelInvocation,\n  buildOpenRouterModelId,\n  isKnownProfileInput,\n  resolveBundledInput,\n  resolveModelIdentity,\n} from \"@x12i/ai-profiles\";\nimport type { ModelInvocationEndpoint } from \"@x12i/ai-profiles\";\nimport { TEXT_CATALOG_LANE } from \"../../profiles/catalogLane.js\";\nimport type { AiModelRecord } from \"../../models/types.js\";\nimport { ModelNameResolver } from \"./ModelNameResolver.js\";\nimport { PROVIDER_INFERENCE_MAP } from \"./constants.js\";\nimport { normalizeProvider, normalizeString } from \"./normalize.js\";\nimport type {\n  ModelResolutionInput,\n  ModelResolutionResult,\n  ModelResolverOptions,\n} from \"./types.js\";\n\nfunction isOpenRouterProvider(provider?: string): boolean {\n  return normalizeProvider(provider) === \"openrouter\";\n}\n\nfunction buildVendorResolveAttempts(model: string): 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, undefined);\n\n  const normalised = normalizeString(model);\n  if (normalised.includes(\"/\")) {\n    const prefix = normalised.split(\"/\")[0]!;\n    if (!isOpenRouterProvider(prefix)) {\n      add(model, normalizeProvider(prefix));\n    }\n  }\n\n  add(model, \"openrouter\");\n  return attempts;\n}\n\nexport type ModelVendorRef = {\n  provider: string;\n  model: string;\n};\n\nexport type ResolveModelVendorOptions = ModelResolverOptions & {\n  /** Return OpenRouter transport shape: provider `openrouter`, model `vendor/slug`. */\n  asOpenRouter?: boolean;\n};\n\nfunction endpointToRef(endpoint: ModelInvocationEndpoint): ModelVendorRef {\n  return { provider: endpoint.provider, model: endpoint.modelId };\n}\n\nfunction invocationToRef(\n  providerHint: string,\n  modelId: string,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef {\n  const invocation = buildModelInvocation(providerHint, normalizeString(modelId));\n  if (options?.asOpenRouter) {\n    return endpointToRef(\n      invocation.openrouter ?? {\n        provider: \"openrouter\",\n        modelId: buildOpenRouterModelId(providerHint, modelId),\n      },\n    );\n  }\n  return endpointToRef(invocation.direct);\n}\n\nfunction fromAiProfilesIdentity(\n  ref: NonNullable<ReturnType<typeof resolveModelIdentity>>,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef {\n  if (options?.asOpenRouter && ref.invocation?.openrouter) {\n    return endpointToRef(ref.invocation.openrouter);\n  }\n  if (options?.asOpenRouter) {\n    return {\n      provider: \"openrouter\",\n      model: buildOpenRouterModelId(ref.provider, ref.modelId),\n    };\n  }\n  return { provider: ref.provider, model: ref.modelId };\n}\n\nfunction modelVendorRefFromProfile(\n  model: string,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef | null {\n  try {\n    const resolved = resolveBundledInput(model.trim(), {\n      catalogLane: options?.catalogLane ?? TEXT_CATALOG_LANE,\n    });\n    const direct = resolved.invocation?.direct;\n    const openrouter = resolved.invocation?.openrouter;\n    if (options?.asOpenRouter) {\n      if (openrouter) return endpointToRef(openrouter);\n      if (direct) {\n        return {\n          provider: \"openrouter\",\n          model: buildOpenRouterModelId(direct.provider, direct.modelId),\n        };\n      }\n    }\n    if (direct) return endpointToRef(direct);\n    return {\n      provider: resolved.provider,\n      model: resolved.modelId.includes(\"/\")\n        ? resolved.modelId.slice(resolved.modelId.indexOf(\"/\") + 1)\n        : resolved.modelId,\n    };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Exact registry / bundled-catalog lookup via @x12i/ai-profiles.\n *\n * Order: known profile/choice → resolveModelIdentity. Does not invent vendor\n * refs from arbitrary `prefix/rest` strings (that would mis-handle profiles).\n */\nexport function modelVendorRefFromIdentity(\n  model: string,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef | null {\n  const trimmed = model.trim();\n  if (!trimmed) return null;\n\n  if (isKnownProfileInput(trimmed)) {\n    return modelVendorRefFromProfile(trimmed, options);\n  }\n\n  const identity = resolveModelIdentity(trimmed, {\n    asOpenRouter: options?.asOpenRouter,\n  });\n  if (identity) return fromAiProfilesIdentity(identity, options);\n\n  return null;\n}\n\n/** Build `{ provider, model }` using @x12i/ai-profiles transport mapping. */\nexport function modelVendorRefFromVendorAndSlug(\n  providerHint: string,\n  modelId: string,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef {\n  return invocationToRef(providerHint, modelId, options);\n}\n\nfunction inferProviderFromSlug(\n  slug: string,\n  options?: ResolveModelVendorOptions,\n): string | undefined {\n  const patterns = [\n    ...(options?.additionalProviderPatterns ?? []),\n    ...PROVIDER_INFERENCE_MAP,\n  ];\n  for (const { pattern, provider } of patterns) {\n    if (pattern.test(slug)) return provider;\n  }\n  return undefined;\n}\n\nfunction providerHintForModelId(\n  modelId: string,\n  record: AiModelRecord | null | undefined,\n  options?: ResolveModelVendorOptions,\n): string | undefined {\n  if (record?.providerId) {\n    const vendor = normalizeProvider(record.providerId);\n    if (vendor && !isOpenRouterProvider(vendor)) return vendor;\n  }\n\n  const normalised = normalizeString(modelId);\n  if (normalised.includes(\"/\")) {\n    const prefix = normalised.split(\"/\")[0]!;\n    if (!isOpenRouterProvider(prefix)) {\n      return normalizeProvider(prefix) ?? prefix;\n    }\n  }\n\n  return inferProviderFromSlug(normalised, options);\n}\n\nfunction formatModelVendorRef(\n  modelId: string,\n  record: AiModelRecord | null | undefined,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef | null {\n  const hint = providerHintForModelId(modelId, record, options);\n  if (!hint) return null;\n  return invocationToRef(hint, modelId, options);\n}\n\n/** Pattern inference when registry and catalog both miss. */\nexport function resolveModelVendorLastResort(\n  model: string,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef | null {\n  if (isKnownProfileInput(model.trim())) return null;\n  const hint = providerHintForModelId(model, null, options);\n  if (!hint) return null;\n  return invocationToRef(hint, model, options);\n}\n\n/** Map a fuzzy catalog resolution result to `{ provider, model }`. */\nexport function resolveModelVendorFromResolution(\n  result: ModelResolutionResult,\n  inputModel: string,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef | null {\n  if (result.found) {\n    const ref = formatModelVendorRef(result.modelId, result.record, options);\n    if (ref) return ref;\n  }\n\n  if (!result.found && result.bestRejectedCandidate) {\n    const ref = formatModelVendorRef(result.bestRejectedCandidate.modelId, null, options);\n    if (ref) return ref;\n  }\n\n  return resolveModelVendorLastResort(inputModel, options);\n}\n\n/** Best-effort vendor lookup from a model name alone (sync, catalog map only). */\nexport function resolveModelVendorSync(\n  model: string,\n  catalog: Map<string, AiModelRecord>,\n  options?: ResolveModelVendorOptions,\n): ModelVendorRef | null {\n  const exact = modelVendorRefFromIdentity(model, options);\n  if (exact) return exact;\n\n  const resolver = new ModelNameResolver(catalog, options);\n  const attempts = buildVendorResolveAttempts(model);\n  let last: ModelResolutionResult | null = null;\n\n  for (const attempt of attempts) {\n    const result = resolver.resolve(attempt);\n    last = result;\n    if (result.found) {\n      const ref = resolveModelVendorFromResolution(result, model, options);\n      if (ref) return ref;\n    }\n  }\n\n  return resolveModelVendorFromResolution(\n    last ?? {\n      found: false,\n      modelId: null,\n      record: null,\n      attemptedStrategies: [],\n      reason: \"Model not found in catalog\",\n    },\n    model,\n    options,\n  );\n}\n"]}