import type { ResolvedDeploymentTarget } from './deployment'; export type DeploymentTopologyRole = 'relay' | 'standby' | 'member'; export type DeploymentTopologyTransport = 'private-lan' | 'cloudflare-warp'; export interface DeploymentTopologyPlacement { computeReference: string; /** Stable non-secret node identity generated by the control plane. */ nodeIdentity: string; slot: number; metalHostname: string; privateAddress: string; /** Exact non-overlapping private subnet owned by this admitted Metal. */ siteCidr: string; } export interface DeploymentTopologyAssignment extends DeploymentTopologyPlacement { role: DeploymentTopologyRole; transport: DeploymentTopologyTransport; localRelayReference: string; localRelayAddress: string; /** Same-metal peers; ordinary members receive only the active relay. */ localPeerAddresses: readonly string[]; localPeerIdentities: readonly string[]; remoteRelayAddresses: readonly string[]; remoteRelayIdentities: readonly string[]; /** Exact deployment members at other Metal sites; used for host firewall authority. */ remoteMemberAddresses: readonly string[]; remoteSiteCidrs: readonly string[]; memberIdentities: readonly string[]; healthPort: number; routedTcpPorts: readonly number[]; /** Only relay and standby computes may carry the cross-metal WARP connector. */ warpRequired: boolean; generation: string; } export declare class DeploymentTopologyError extends Error { constructor(message: string); } /** * Deterministically elect one relay per admitted Metal site. Auto transport * keeps one- and two-metal deployments on their private addresses and uses * WARP only after a third Metal site is admitted. Network-specific deploy * steps still own readiness probes; a failed private route must stop the * release, never silently broaden authority by installing WARP. */ export declare function planDeploymentTopology(args: { target: Pick; placements: readonly DeploymentTopologyPlacement[]; generation: string; }): DeploymentTopologyAssignment[];