import { z } from "zod"; const envSchema = z.object({ DATABASE_URL: z.string().min(1), REDIS_URL: z.string().min(1).optional(), WORKER_DRY_RUN: z .enum(["0", "1", "true", "false", ""]) .optional() .transform((value) => value === "1" || value === "true"), WORKER_BLPOP_TIMEOUT_S: z .string() .optional() .transform((value) => { const parsed = Number(value ?? "5"); return Number.isFinite(parsed) && parsed > 0 ? parsed : 5; }), WORKER_MAX_TOOL_STEPS: z .string() .optional() .transform((value) => { const parsed = Number(value ?? "12"); return Number.isFinite(parsed) && parsed > 0 ? parsed : 12; }), WORKER_REPO_ROOT: z.string().optional(), WORKER_WORKTREE_BASE: z .string() .optional() .transform((value) => value?.trim() || "/tmp/echodo-worker-worktrees"), }); export type WorkerEnv = z.infer; export function loadEnv(): WorkerEnv { const parsed = envSchema.safeParse(process.env); if (!parsed.success) { console.error("[worker] Invalid environment:", parsed.error.flatten().fieldErrors); process.exit(1); } return parsed.data; }