function requiredEnv(name: string): string { const value = process.env[name]; if (!value) { throw new Error(`${name} is required`); } return value; } // Environment-only knobs. Per-storyboard tuning (aspect, fps, bitrate, // voice, prompts, brand…) lives on the Storyboard object itself. See // src/storyboard.ts. export const APP_URL = requiredEnv('APP_URL'); export const DASHBOARD_PATH = '/dashboard'; // Per-target storage state. render.sh sets AUTH_STATE_FILE to auth.local.json // or auth.prod.json so a stale local token can't be reused against prod. export const AUTH_STATE_PATH = process.env.AUTH_STATE_FILE ?? 'auth.json'; export const OUTPUT_DIR = 'output'; // Frames of head-room kept in front of sceneStart when trimming. Shared by // the video trim and the narration manifest so cue offsets line up with the // trimmed timeline. Not tuned per storyboard: same lead-in for any cut. export const LEAD_IN_S = 0.12;