import { z } from "zod"; const envSchema = z.object({ DATABASE_URL: z.string().min(1), REDIS_URL: z.string().min(1).optional(), ORCHESTRATOR_DRY_RUN: z .enum(["0", "1", "true", "false", ""]) .optional() .transform((value) => value === "1" || value === "true"), ORCHESTRATOR_POLL_MS: z .string() .optional() .transform((value) => { const parsed = Number(value ?? "5000"); return Number.isFinite(parsed) && parsed > 0 ? parsed : 5_000; }), ORCHESTRATOR_STALL_MINUTES: z .string() .optional() .transform((value) => { const parsed = Number(value ?? "120"); return Number.isFinite(parsed) && parsed > 0 ? parsed : 120; }), ORCHESTRATOR_MAX_IMPLEMENTERS: z .string() .optional() .transform((value) => { const parsed = Number(value ?? "2"); return Number.isFinite(parsed) && parsed > 0 ? parsed : 2; }), }); export type OrchestratorEnv = z.infer; export function loadEnv(): OrchestratorEnv { const parsed = envSchema.safeParse(process.env); if (!parsed.success) { console.error("[orchestrator] Invalid environment:", parsed.error.flatten().fieldErrors); process.exit(1); } return parsed.data; }