Files
pitchfast/lib/operational-readiness.ts

92 lines
2.6 KiB
TypeScript

export type IntegrationReadinessStatus = "configured" | "missing";
export type IntegrationReadinessDefinition = {
id:
| "local_business_data"
| "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: "local_business_data",
label: "Local Business Data",
requiredEnv: ["LOCAL_BUSINESS_DATA_API_KEY"],
errorSurface:
"Run-Events der Lead-Recherche zeigen Local-Business-Data-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:
"Convex-Run-Events der Audit-Generierung zeigen fehlende Keys, 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<string, string | undefined>,
): 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",
};
});
}