{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-ONLOEZJ3.cjs","../src/sync/OpenRouterSyncProvider.ts","../src/sync/modelNameResolver.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACMA,SAAS,iBAAA,CAAkB,MAAA,EAAyC;AAClE,EAAA,MAAM,QAAA,EAAkC,EAAE,MAAA,EAAQ,mBAAmB,CAAA;AACrE,EAAA,GAAA,iBAAI,MAAA,2BAAQ,IAAA,mBAAK,GAAA,EAAG,OAAA,CAAQ,cAAA,EAAgB,CAAA,OAAA,EAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAA;AAC5D,EAAA;AACT;AAEgF;AACpB,EAAA;AACX,EAAA;AACD,EAAA;AACuB,IAAA;AACrE,EAAA;AACoB,EAAA;AACtB;AAEoC;AACjB,EAAA;AACA,EAAA;AACA,EAAA;AAEwC,EAAA;AACjC,IAAA;AACY,IAAA;AACuB,IAAA;AAC3D,EAAA;AAAA;AAAA;AAAA;AAAA;AAM8C,EAAA;AACO,IAAA;AAC/C,IAAA;AAEA,IAAA;AAC4D,MAAA;AAChD,IAAA;AACwC,MAAA;AACxD,IAAA;AAEwD,IAAA;AAC5C,MAAA;AACR,QAAA;AAEI,QAAA;AAEN,MAAA;AACF,IAAA;AAEkB,IAAA;AACiC,MAAA;AACvC,MAAA;AACR,QAAA;AAC6D,QAAA;AAC/D,MAAA;AACF,IAAA;AAEkC,IAAA;AACM,IAAA;AACuB,IAAA;AACjE,EAAA;AAAA;AAGuB,EAAA;AACyB,IAAA;AAChD,EAAA;AACF;ADfsE;AACA;AE/BjD;AAC0B,EAAA;AAC/C;AAOwB;AACuB,EAAA;AACa,EAAA;AACd,EAAA;AACrC,EAAA;AACgB,IAAA;AACF,IAAA;AACS,IAAA;AAC9B,EAAA;AACF;AAMW;AAC6B,EAAA;AACY,EAAA;AACW,EAAA;AAC/D;AFsBsE;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-ONLOEZJ3.cjs","sourcesContent":[null,"import { SyncError } from \"../errors.js\";\nimport { normalizeOpenRouterModel } from \"../models/normalizeOpenRouterModel.js\";\nimport type { AiModelRecord } from \"../models/types.js\";\nimport type {\n  OpenRouterModelsQuery,\n  OpenRouterModelsResponse,\n} from \"../models/openrouter.types.js\";\n\nexport type OpenRouterSyncProviderOptions = {\n  /** Optional — public GET /models needs no key. */\n  apiKey?: string;\n  baseUrl?: string;\n  /** Query params passed to OpenRouter (default: all modalities). */\n  query?: OpenRouterModelsQuery;\n};\n\nfunction buildFetchHeaders(apiKey?: string): Record<string, string> {\n  const headers: Record<string, string> = { Accept: \"application/json\" };\n  if (apiKey?.trim()) headers.Authorization = `Bearer ${apiKey.trim()}`;\n  return headers;\n}\n\nfunction buildModelsUrl(baseUrl: string, query?: OpenRouterModelsQuery): string {\n  const url = new URL(`${baseUrl.replace(/\\/$/, \"\")}/models`);\n  const q = { output_modalities: \"all\", ...query };\n  for (const [key, value] of Object.entries(q)) {\n    if (value !== undefined && value !== \"\") url.searchParams.set(key, value);\n  }\n  return url.toString();\n}\n\nexport class OpenRouterSyncProvider {\n  private readonly apiKey?: string;\n  private readonly baseUrl: string;\n  private readonly query?: OpenRouterModelsQuery;\n\n  constructor(options: OpenRouterSyncProviderOptions = {}) {\n    this.apiKey = options.apiKey;\n    this.baseUrl = options.baseUrl ?? \"https://openrouter.ai/api/v1\";\n    this.query = options.query ?? { output_modalities: \"all\" };\n  }\n\n  /**\n   * Fetches the full OpenRouter model catalog (public, no API key required).\n   * @see https://openrouter.ai/api/v1/models\n   */\n  async fetchModels(): Promise<AiModelRecord[]> {\n    const url = buildModelsUrl(this.baseUrl, this.query);\n    let response: Response;\n\n    try {\n      response = await fetch(url, { headers: buildFetchHeaders(this.apiKey) });\n    } catch (cause) {\n      throw new SyncError(\"OPENROUTER_MODELS_FETCH_FAILED\", `Failed to fetch OpenRouter models from ${url}`, cause);\n    }\n\n    if (response.status === 401 || response.status === 403) {\n      throw new SyncError(\n        \"OPENROUTER_AUTH_FAILED\",\n        this.apiKey\n          ? \"OpenRouter API key is invalid or unauthorized.\"\n          : \"OpenRouter returned unauthorized — remove OPENROUTER_API_KEY to use the public models endpoint.\",\n      );\n    }\n\n    if (!response.ok) {\n      const body = await response.text().catch(() => \"\");\n      throw new SyncError(\n        \"OPENROUTER_MODELS_FETCH_FAILED\",\n        `OpenRouter models fetch failed (${response.status}): ${body.slice(0, 200)}`,\n      );\n    }\n\n    const json = (await response.json()) as OpenRouterModelsResponse;\n    const syncedAt = new Date().toISOString();\n    return (json.data ?? []).map((row) => normalizeOpenRouterModel(row, syncedAt));\n  }\n\n  /** Build the URL used for the last fetch pattern (for debugging). */\n  getModelsUrl(): string {\n    return buildModelsUrl(this.baseUrl, this.query);\n  }\n}\n","import type { AiModelRecord } from \"../models/types.js\";\nimport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nimport type {\n  ModelResolutionInput,\n  ModelResolutionResult,\n  ModelResolutionSuccess,\n  ModelResolverOptions,\n  ResolvedModel,\n} from \"./modelNameResolver/types.js\";\n\nexport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nexport { buildCatalogIndexes } from \"./modelNameResolver/catalogIndexes.js\";\nexport * from \"./modelNameResolver/types.js\";\nexport {\n  loadOpenRouterRoutingEnv,\n  shouldDefaultRouteViaOpenRouter,\n  isEffectiveOpenRouterTransport,\n  providerIdToEnvKeyPrefix,\n  vendorApiKeyEnvName,\n} from \"./openRouterRoutingEnv.js\";\nexport type { OpenRouterRoutingConfig } from \"./openRouterRoutingEnv.js\";\nexport { normalizeString, normalizeProvider } from \"./modelNameResolver/normalize.js\";\nexport {\n  resolveModelVendorSync,\n  resolveModelVendorFromResolution,\n  resolveModelVendorLastResort,\n  modelVendorRefFromIdentity,\n  modelVendorRefFromVendorAndSlug,\n} from \"./modelNameResolver/resolveModelVendor.js\";\nexport type {\n  ModelVendorRef,\n  ResolveModelVendorOptions,\n} from \"./modelNameResolver/resolveModelVendor.js\";\n\nexport function createModelNameResolver(\n  catalog: Map<string, AiModelRecord>,\n  options?: ModelResolverOptions,\n): ModelNameResolver {\n  return new ModelNameResolver(catalog, options);\n}\n\n/** Resolve a model string; returns catalog record only (no resolution metadata). */\nexport function resolveModel(\n  input: string,\n  models: Map<string, AiModelRecord>,\n  provider?: string,\n): ResolvedModel | null {\n  const resolver = new ModelNameResolver(models);\n  const result = resolver.resolve({ model: input, provider });\n  if (!result.found || !result.record) return null;\n  return {\n    catalogModel: result.record,\n    matchedKey: result.modelId,\n    routedViaOpenRouter: result.routedViaOpenRouter,\n  };\n}\n\nexport function isRoutedViaOpenRouter(\n  provider: string | undefined,\n  model: AiModelRecord,\n  matchedKey: string,\n): boolean {\n  if (provider === \"openrouter\") return true;\n  if (provider && provider !== \"openrouter\") return false;\n  return model.modelId.includes(\"/\") && matchedKey.includes(\"/\");\n}\n\nexport type {\n  ModelResolutionInput,\n  ModelResolutionResult,\n  ModelResolutionSuccess,\n  ModelResolverOptions,\n};\n"]}