export interface PreviewCreated { scopeId: string; hostname: string; url: string; versionId: string; reused: boolean; } export interface PreviewRow { scopeId: string; tag: string | null; versionId: string | null; forkedFrom: string | null; expiresAt: string | null; hostname: string | null; url: string | null; } /** * Create (or update) a preview. Idempotent on the tag: a second call with the same tag — * what a PR *synchronize* triggers — rebinds the new version onto the SAME fork so the * PR's successive pushes roll their migrations forward on one copy (§4). `refresh` forces * a clean fork from prod instead. */ export declare function createPreview(opts: { controlPlaneUrl: string; header: Record; slug: string; tag: string; versionId: string; sourceScopeId?: string; empty?: boolean; ttlHours?: number | null; surface?: string; refresh?: boolean; }): Promise; /** Reap a preview by tag. Idempotent: an already-gone preview is a no-op success, so a * PR-close job never fails because the preview was already removed. */ export declare function deletePreview(opts: { controlPlaneUrl: string; header: Record; slug: string; tag: string; }): Promise<{ deleted: string | null; }>; export declare function listPreviews(opts: { controlPlaneUrl: string; header: Record; slug: string; }): Promise; /** Render previews as an aligned table (the `substrat preview ls` output). */ export declare function formatPreviews(rows: PreviewRow[]): string; /** * Parse a `--ttl` value like `72h`, `3d`, or a bare number of hours → hours. The literal * `none`/`pinned` returns `null` — a preview kept alive until it is deliberately deleted * (a long-lived `--tag dev` environment), distinct from `undefined` = the 72h default. */ export declare function parseTtlHours(raw: string | undefined): number | null | undefined; //# sourceMappingURL=preview.d.ts.map