export interface VercelIdentityTags { provider: string; repository: string; branch: string; version: string; identity: string; } export interface VercelMetadataIdentity { name: string; repository: string; branch: string; packageVersion: string; tags: VercelIdentityTags; } export interface VercelResidualMetadata { sandboxIds?: string[]; snapshotIds?: string[]; reason?: string; } export interface VercelDisplayCredentials { username: 'devbox'; password: string; rotating?: boolean; } export interface VercelCreateConfiguration { imageReference: string; sourceUrl: string; sourceRevision: string; requestedBranch: string; needsBranchSetup: boolean; persistent: true; keepLastSnapshots: 1; timeoutMs: number; vcpus?: number; } export interface VercelMetadataInput { teamId: string; projectId: string; identity?: VercelMetadataIdentity; sandboxId?: string; snapshotIds?: string[]; residual?: VercelResidualMetadata; configuration?: VercelCreateConfiguration; } export interface VercelMetadata extends VercelMetadataInput { schemaVersion: 1; provider: string; repoKeyHash: string; } export interface VercelScopeMetadataInput { teamId: string; projectId: string; } export interface VercelScopeMetadata extends VercelScopeMetadataInput { schemaVersion: 2; metadataKind: 'scope'; provider: string; repoKeyHash: string; } /** * A committed app-port selection. * * Bound to the exact remote revision, the candidate fingerprint, and the * detector version so a resume can re-apply the same public routes without * prompting, and a changed project re-prompts instead of silently reusing a * selection that no longer describes the checkout. */ export interface VercelAppPortSelection { /** App ports the user accepted; empty means the candidates were rejected. */ selected: number[]; /** The full port set applied to the Sandbox, including reserved noVNC. */ applied: number[]; fingerprint: string; detectorVersion: number; revision: string; } /** * A route update that has been decided but not yet confirmed committed. * * Written before the update call and cleared after it, so a crash between the * two always leaves the actual Sandbox route set reconcilable against a * recorded `previous`/`desired` pair rather than untracked. */ export interface VercelPendingAppPorts { previous: number[]; desired: number[]; selected: number[]; fingerprint: string; detectorVersion: number; revision: string; } export interface VercelBranchMetadataInput { identity?: VercelMetadataIdentity; sandboxId?: string; snapshotIds?: string[]; residual?: VercelResidualMetadata; configuration?: VercelCreateConfiguration; displayCredentials?: VercelDisplayCredentials; appPorts?: VercelAppPortSelection; pendingAppPorts?: VercelPendingAppPorts; } export interface VercelBranchMetadata extends VercelBranchMetadataInput { schemaVersion: 2; metadataKind: 'branch'; provider: string; repoKeyHash: string; } /** * Copy every optional branch field into a write input. * * Metadata `write` replaces the whole document; omitting a field clears it. * Features that patch one concern (display credentials, app ports) must start * from this helper so they cannot wipe another feature's durable state. */ export declare function toBranchMetadataInput(metadata: VercelBranchMetadata): VercelBranchMetadataInput; /** * Rebuild a branch write with explicit app-port fields. * * `undefined` clears that field (omit-on-write). Other branch fields are * preserved from `metadata` when present. */ export declare function withAppPortFields(metadata: VercelBranchMetadata | null, appPorts: VercelAppPortSelection | undefined, pendingAppPorts: VercelPendingAppPorts | undefined): VercelBranchMetadataInput; export declare function validateMetadataInput(value: unknown): VercelMetadataInput; export declare function parseStoredMetadata(value: unknown, expectedProvider: string, expectedRepoKeyHash: string): VercelMetadata; export declare function serializeMetadata(value: unknown, provider: string, repoKeyHash: string): string; export declare function validateScopeMetadataInput(value: unknown): VercelScopeMetadataInput; export declare function parseStoredScopeMetadata(value: unknown, expectedProvider: string, expectedRepoKeyHash: string): VercelScopeMetadata; export declare function serializeScopeMetadata(value: unknown, provider: string, repoKeyHash: string): string; export declare function validateBranchMetadataInput(value: unknown): VercelBranchMetadataInput; export declare function parseStoredBranchMetadata(value: unknown, expectedProvider: string, expectedRepoKeyHash: string): VercelBranchMetadata; export declare function serializeBranchMetadata(value: unknown, provider: string, repoKeyHash: string): string;