/** Cookie que persiste el token del builder (particionada, contexto embebido). */ declare const VEO_BUILDER_COOKIE = "veo-builder"; /** Cookie que persiste el origen del dashboard de Veo. */ declare const VEO_BUILDER_ORIGIN_COOKIE = "veo-builder-origin"; /** Sesión de builder activa (la app está embebida por el editor de Veo). */ interface VeoBuilderContext { /** Token de correlación del handshake (idealmente firmado por el backend). */ token: string; /** Origen del dashboard que embebe, para `frame-ancestors`. */ origin: string | null; } interface CookieLike { name: string; value: string; path?: string; domain?: string; maxAge?: number; expires?: Date | number; httpOnly?: boolean; sameSite?: boolean | 'lax' | 'strict' | 'none'; secure?: boolean; partitioned?: boolean; priority?: 'low' | 'medium' | 'high'; } interface VeoBuilderRequest { nextUrl: { searchParams: URLSearchParams; }; cookies: { get(name: string): { value: string; } | undefined; }; } interface VeoBuilderResponse { headers: { set(name: string, value: string): void; delete(name: string): void; }; cookies: { set(cookie: CookieLike): void; getAll(): CookieLike[]; }; } interface VeoBuilderProxyOptions { /** * Orígenes autorizados a embeber la app (`frame-ancestors`), p.ej. * `['https://veo-dashboard-opal.vercel.app']`. Si se omite o queda vacío, se * usa el origen que envía el propio editor (`veoBuilderOrigin`). */ dashboardOrigins?: string[]; /** TTL de las cookies del modo builder, en segundos. Default 1800 (30 min). */ cookieMaxAge?: number; } /** * Lee el contexto de builder del request: del query param (`?veoBuilder`, primer * arranque dentro del iframe) o de la cookie (sobrevive navegaciones SPA y * requests RSC que ya no llevan el param). `null` si la app corre en modo normal. */ declare function readVeoBuilderContext(request: VeoBuilderRequest): VeoBuilderContext | null; /** Cliente de auth mínimo para la sesión de diseño. Compatible con `supabase.auth` * y cualquier auth con la misma forma (tipos estructurales, sin acoplar el SDK). */ interface DesignAuthClient { getUser(): Promise<{ data: { user: unknown; }; }>; signInWithPassword(credentials: { email: string; password: string; }): Promise; } interface DesignSessionOptions { /** Email del usuario demo. Default: env `VEO_BUILDER_DEMO_EMAIL`. */ email?: string; /** Password del usuario demo. Default: env `VEO_BUILDER_DEMO_PASSWORD`. */ password?: string; } /** * Establece la "sesión de diseño" cuando la app está embebida por el editor de * Veo y no hay login: entra como usuario DEMO (sin datos reales) para poder * navegar la app sin auth. No-op fuera de modo builder, si ya hay sesión, o si * faltan credenciales. Agnóstico del proveedor: funciona con `supabase.auth` y * cualquier cliente con `getUser` + `signInWithPassword`. * * @example * ```ts * await ensureVeoDesignSession(builder, supabase.auth); * ``` */ declare function ensureVeoDesignSession(builder: VeoBuilderContext | null, auth: DesignAuthClient, options?: DesignSessionOptions): Promise; /** * Envuelve tu middleware de Next para habilitar el modo diseño de Veo. Cuando la * app está embebida (`?veoBuilder` o cookie), DESPUÉS de correr tu handler: * - reescribe TODAS las cookies de la respuesta a `SameSite=None; Secure; * Partitioned` (así la sesión viaja en el iframe cross-site), * - persiste token + origen en cookies particionadas, * - setea `frame-ancestors` y saca `X-Frame-Options`. * * Tu handler recibe `{ builder }` para decidir la sesión de diseño (lo único * app-specific). Fuera de modo builder es un passthrough exacto (no toca nada). */ declare function veoBuilderProxy(handler: (request: Req, ctx: { builder: VeoBuilderContext | null; }) => Res | Promise, options?: VeoBuilderProxyOptions): (request: Req) => Promise; export { type DesignAuthClient, type DesignSessionOptions, VEO_BUILDER_COOKIE, VEO_BUILDER_ORIGIN_COOKIE, type VeoBuilderContext, type VeoBuilderProxyOptions, type VeoBuilderRequest, type VeoBuilderResponse, ensureVeoDesignSession, readVeoBuilderContext, veoBuilderProxy };