const API_BASE = process.env.NEXT_PUBLIC_API_URL ?? 'http://localhost:4000'; export async function apiFetch(path: string, init: RequestInit = {}): Promise { const res = await fetch(`${API_BASE}${path}`, { credentials: 'include', cache: 'no-store', ...init, headers: { 'Content-Type': 'application/json', ...(init.headers ?? {}), }, }); if (!res.ok) { let detail: unknown = undefined; try { detail = await res.json(); } catch {} const err = new Error(`api_error_${res.status}`); (err as unknown as { detail?: unknown }).detail = detail; (err as unknown as { status?: number }).status = res.status; throw err; } return (await res.json()) as T; } /** Absolute API URL for a path — use for full-page navigations (OAuth redirects). */ export function apiUrl(path: string): string { return `${API_BASE}${path}`; } export function apiWebSocketURL(path: string): string { const httpBase = API_BASE; const wsBase = httpBase.replace(/^http/, 'ws'); return `${wsBase}${path}`; }