export type IntegrationReadinessStatus = "configured" | "missing"; export type IntegrationReadinessDefinition = { id: | "google" | "pagespeed" | "openrouter" | "screenshotone" | "smtp" | "convex_jobs" | "rybbit" | "jina"; label: string; requiredEnv: string[]; errorSurface: string; }; export type IntegrationReadinessRow = IntegrationReadinessDefinition & { status: IntegrationReadinessStatus; missingEnv: string[]; }; export const integrationReadinessDefinitions: IntegrationReadinessDefinition[] = [ { id: "google", label: "Google", requiredEnv: ["GOOGLE_GEOCODING_API_KEY", "GOOGLE_PLACES_API_KEY"], errorSurface: "Run-Events der Lead-Recherche zeigen Google-Fehler.", }, { id: "pagespeed", label: "PageSpeed", requiredEnv: ["PAGESPEED_API_KEY", "PAGESPEED_TIMEOUT_MS"], errorSurface: "PageSpeed-Run-Events und Audit-Quellen zeigen Fehlerdetails.", }, { id: "openrouter", label: "OpenRouter", requiredEnv: ["OPENROUTER_API_KEY"], errorSurface: "Audit-Generierungsruns zeigen Modell- und Guard-Fehler.", }, { id: "screenshotone", label: "ScreenshotOne", requiredEnv: ["SCREENSHOTONE_API_KEY"], errorSurface: "Screenshot-Erfassung zeigt API-, Quota- und Rendering-Fehler.", }, { id: "smtp", label: "SMTP", requiredEnv: ["SMTP_HOST", "SMTP_USER", "SMTP_PASSWORD", "SMTP_FROM"], errorSurface: "Outreach-Sendeversuche zeigen SMTP-Fehler ohne Credentials.", }, { id: "convex_jobs", label: "Convex Jobs", requiredEnv: ["NEXT_PUBLIC_CONVEX_URL", "CONVEX_DEPLOYMENT"], errorSurface: "Kampagnen-Run-Logs und Lifecycle-Runs zeigen Job-Status.", }, { id: "rybbit", label: "Rybbit", requiredEnv: ["RYBBIT_API_URL", "RYBBIT_API_KEY", "NEXT_PUBLIC_RYBBIT_SITE_ID"], errorSurface: "Analytics zeigt API-Fehler als nicht blockierende Meldung.", }, { id: "jina", label: "Jina", requiredEnv: [], errorSurface: "Optionaler Fetch-/Reader-Fallback zeigt Fehler im Audit-Quellenkontext.", }, ]; export function getIntegrationReadiness( env: Record, ): IntegrationReadinessRow[] { return integrationReadinessDefinitions.map((definition) => { const missingEnv = definition.requiredEnv.filter((key) => { const value = env[key]; return !value || value.trim().length === 0; }); return { ...definition, missingEnv, status: missingEnv.length === 0 ? "configured" : "missing", }; }); }