{"version":3,"sources":["../../src/bootstrap/main.ts"],"sourcesContent":["import type { NetlifyAPI } from '@netlify/api'\n\nexport interface AIGatewayContext {\n  token: string\n  url: string\n}\n\nexport interface AIGatewayConfig {\n  api: NetlifyAPI\n  env: Record<string, { sources: string[]; value: string }>\n  siteID?: string | undefined\n  siteURL?: string | undefined\n  accountID?: string | undefined\n  /** Whether the site has a published deploy. When false, site-scoped tokens are skipped. */\n  siteHasDeploy?: boolean | undefined\n}\n\nexport interface AIProviderEnvVar {\n  key: string\n  url: string\n}\n\nexport interface AIGatewayTokenResponse {\n  token: string\n  url: string\n  envVars?: AIProviderEnvVar[]\n}\n\nexport const fetchAIProviders = async ({ api }: { api: NetlifyAPI }): Promise<AIProviderEnvVar[]> => {\n  try {\n    if (!api.accessToken) {\n      return []\n    }\n\n    const data = await api.getAIGatewayProviders()\n\n    if (!data.providers) {\n      return []\n    }\n\n    const envVars: AIProviderEnvVar[] = []\n\n    for (const provider of Object.values(data.providers)) {\n      if (provider.token_env_var && provider.url_env_var) {\n        envVars.push({\n          key: provider.token_env_var,\n          url: provider.url_env_var,\n        })\n      }\n    }\n\n    return envVars\n  } catch (error) {\n    console.warn(`Failed to fetch AI providers: ${error instanceof Error ? error.message : String(error)}`)\n    return []\n  }\n}\n\nexport const fetchAIGatewayToken = async ({\n  api,\n  siteId,\n}: {\n  api: NetlifyAPI\n  siteId: string\n}): Promise<AIGatewayTokenResponse | null> => {\n  try {\n    if (!api.accessToken) {\n      return null\n    }\n\n    const data = await api.getAIGatewayToken({ site_id: siteId })\n\n    if (!data.token || !data.url) {\n      return null\n    }\n\n    return {\n      token: data.token,\n      url: data.url,\n    }\n  } catch (error) {\n    console.warn(\n      `Failed to fetch AI Gateway token for site ${siteId}: ${error instanceof Error ? error.message : String(error)}`,\n    )\n    return null\n  }\n}\n\nexport const fetchAccountAIGatewayToken = async ({\n  api,\n  accountId,\n}: {\n  api: NetlifyAPI\n  accountId: string\n}): Promise<AIGatewayTokenResponse | null> => {\n  try {\n    if (!api.accessToken) {\n      return null\n    }\n\n    const data = await api.getAccountAIGatewayToken({ account_id: accountId })\n\n    if (!data.token || !data.url) {\n      return null\n    }\n\n    return {\n      token: data.token,\n      url: data.url,\n    }\n  } catch (error) {\n    console.warn(\n      `Failed to fetch AI Gateway token for account ${accountId}: ${error instanceof Error ? error.message : String(error)}`,\n    )\n    return null\n  }\n}\n\nexport const setupAIGateway = async (config: AIGatewayConfig): Promise<void> => {\n  const { api, env, siteID, siteURL, accountID, siteHasDeploy = true } = config\n\n  let aiGatewayToken: AIGatewayTokenResponse | null = null\n  let gatewayUrl: string | null = null\n\n  const providersPromise = fetchAIProviders({ api })\n\n  if (siteID && siteID !== 'unlinked' && siteURL && siteHasDeploy) {\n    aiGatewayToken = await fetchAIGatewayToken({ api, siteId: siteID })\n    if (aiGatewayToken) gatewayUrl = `${siteURL}/.netlify/ai`\n  }\n\n  if (!aiGatewayToken && accountID) {\n    aiGatewayToken = await fetchAccountAIGatewayToken({ api, accountId: accountID })\n    if (aiGatewayToken) gatewayUrl = aiGatewayToken.url\n  }\n\n  if (aiGatewayToken && gatewayUrl) {\n    const envVars = await providersPromise\n    const aiGatewayContext = JSON.stringify({\n      token: aiGatewayToken.token,\n      url: gatewayUrl,\n      envVars,\n    })\n    const base64Context = Buffer.from(aiGatewayContext).toString('base64')\n    env.AI_GATEWAY = { sources: ['internal'], value: base64Context }\n  }\n}\n\nexport const parseAIGatewayContext = (aiGatewayValue?: string): AIGatewayTokenResponse | undefined => {\n  try {\n    if (aiGatewayValue) {\n      const decodedContext = Buffer.from(aiGatewayValue, 'base64').toString('utf8')\n      const aiGatewayContext = JSON.parse(decodedContext) as AIGatewayTokenResponse\n      return aiGatewayContext\n    }\n  } catch {\n    // Ignore parsing errors - AI Gateway is optional\n  }\n  return undefined\n}\n"],"mappings":"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","names":[]}