/** * Bot vendor logos for admin screens, loaded from bundled plugin assets. * Known vendors use the uploaded brand marks; every other / generic LLM * falls back to assets/logos/ai.jpeg. */ const FALLBACK_LOGO_FILE = 'ai.jpeg'; /** Bot display names that have a dedicated bundled mark. */ const BOT_LOGO_FILES: Record = { ChatGPT: 'openai.jpeg', OpenAI: 'openai.jpeg', Claude: 'claude.jpeg', Gemini: 'gemini.png', Bing: 'microsoft.jpeg', Copilot: 'microsoft.jpeg', Perplexity: 'perplexity.jpeg', Llama: 'meta.jpeg', Mistral: 'mistral.jpeg', Grok: 'x.jpeg', DeepSeek: 'deepseek.jpeg', }; /** * Names previously served from img.logo.dev. Kept so getBotLogos() still * returns a stable key set for existing admin tables and filters. */ const KNOWN_BOT_NAMES: string[] = [ ...Object.keys(BOT_LOGO_FILES), 'Writesonic', 'Copy.ai', 'Nimble', 'iAsk', 'Aitastic', 'BNNgpt', 'Chat-GPT.org', 'Hugging Face', 'Applebot-Extended', 'Bytespider', 'CCBot', 'Amazonbot', 'Cohere', 'Other LLM', ]; type PluginUrlHolder = { pluginUrl?: string }; function pluginUrlFromWindow(): string { if (typeof window === 'undefined') { return ''; } const w = window as Window & { llmagnetDashboardData?: PluginUrlHolder; llmagnetAnalyticsData?: PluginUrlHolder; llmagnetBotAnalyticsData?: PluginUrlHolder; llmagnetPagesData?: PluginUrlHolder; llmagnetProductsData?: PluginUrlHolder; llmagnetReportsData?: PluginUrlHolder; llmagnetContentSettingsData?: PluginUrlHolder; llmagnetSchemaData?: PluginUrlHolder; llmagnetAgentReadyData?: PluginUrlHolder; llmagnetUcpData?: PluginUrlHolder; llmagnetConnectionsData?: PluginUrlHolder; llmagnetMcpData?: PluginUrlHolder; llmagnetSystemInfoData?: PluginUrlHolder; llmagnetWidgetData?: PluginUrlHolder; llmagnetElementorData?: PluginUrlHolder; }; const raw = w.llmagnetDashboardData?.pluginUrl || w.llmagnetAnalyticsData?.pluginUrl || w.llmagnetBotAnalyticsData?.pluginUrl || w.llmagnetPagesData?.pluginUrl || w.llmagnetProductsData?.pluginUrl || w.llmagnetReportsData?.pluginUrl || w.llmagnetContentSettingsData?.pluginUrl || w.llmagnetSchemaData?.pluginUrl || w.llmagnetAgentReadyData?.pluginUrl || w.llmagnetUcpData?.pluginUrl || w.llmagnetConnectionsData?.pluginUrl || w.llmagnetMcpData?.pluginUrl || w.llmagnetSystemInfoData?.pluginUrl || w.llmagnetWidgetData?.pluginUrl || w.llmagnetElementorData?.pluginUrl || ''; return raw.replace(/\/?$/, '/'); } function logoAssetUrl(fileName: string): string { return `${pluginUrlFromWindow()}assets/logos/${fileName}`; } export function botLogoUrl(botName: string): string { const file = BOT_LOGO_FILES[botName] || FALLBACK_LOGO_FILE; return logoAssetUrl(file); } export function getBotLogos(): Record { const logos: Record = {}; for (const name of KNOWN_BOT_NAMES) { logos[name] = botLogoUrl(name); } return logos; } export const DEFAULT_BOT_LOGO_NAME = 'Other LLM'; export function defaultBotLogo(): string { return logoAssetUrl(FALLBACK_LOGO_FILE); }