import { z } from 'zod'; /** * Server-side environment. Loaded lazily so browser bundles never import it. * Secrets are never logged (see logger redaction) and never exposed to the client. */ const EnvSchema = z.object({ DATABASE_URL: z.string().default('postgres://localhost:5432/rareindex'), FIRECRAWL_API_KEY: z.string().optional(), SCRAPFLY_API_KEY: z.string().optional(), ANTHROPIC_API_KEY: z.string().optional(), OPENAI_API_KEY: z.string().optional(), LOCAL_LLM_BASE_URL: z.string().optional(), LOCAL_LLM_API_KEY: z.string().optional(), POKEMONTCG_API_KEY: z.string().optional(), NEXT_PUBLIC_SITE_URL: z.string().default('http://localhost:3000'), SESSION_SECRET: z.string().default('dev-only-session-secret-change-me-please'), ADMIN_TOKEN: z.string().optional(), API_PORT: z.coerce.number().default(8211), WEB_PORT: z.coerce.number().default(8210), WORKER_CONCURRENCY: z.coerce.number().default(4), LOG_LEVEL: z.string().default('info'), NODE_ENV: z.enum(['development', 'test', 'production']).default('development'), RI_DATA_DIR: z.string().default('./data'), }); export type Env = z.infer; let cached: Env | null = null; export function env(): Env { if (!cached) cached = EnvSchema.parse(process.env); return cached; } export function isProduction(): boolean { return env().NODE_ENV === 'production'; }