import * as net from 'node:net';
export interface RunnerManifest {
    tenant: string;
    pid: number;
    pgid: number;
    token: string;
    controlPort: number;
    socksPort: number;
    ports: number[];
    startedAt: string;
}
export interface ControlResponse {
    token: string;
    tenant: string;
    pid: number;
    socksPort: number;
    listening: number[];
    bindErrors: Record<string, string>;
}
export declare function mintRunnerToken(): string;
export declare function readRunnerManifest(file: string): RunnerManifest | null;
export declare function writeRunnerManifest(file: string, manifest: RunnerManifest): void;
export declare function clearRunnerManifest(file: string, token?: string): void;
export declare function getProcessGroupId(pid: number): number | null;
export declare function parseRunnerPidsFromPs(psOutput: string, tenant: string, exclude?: number): number[];
export declare function discoverRunnerPids(tenant: string, exclude?: number): number[];
export declare function startControlServer(payload: () => ControlResponse): Promise<{
    server: net.Server;
    port: number;
}>;
export declare function queryControl(port: number, timeoutMs?: number): Promise<ControlResponse | null>;
export interface OwnershipCheck {
    ok: boolean;
    reason: string;
    resp?: ControlResponse;
}
export declare function verifyRunnerOwnership(args: {
    manifest: RunnerManifest | null;
    expectedSocksPort: number;
    expectedPorts: number[];
    isPidAlive?: (pid: number) => boolean;
    query?: (port: number) => Promise<ControlResponse | null>;
}): Promise<OwnershipCheck>;
export declare function pollOwnership(check: () => Promise<OwnershipCheck>, deadlineMs: number): Promise<OwnershipCheck>;
export declare function describePortOwner(port: number): string | null;
export interface SquattedPort {
    port: number;
    owner: string | null;
}
export declare function findSquattedPorts(ports: number[], accepts: (port: number) => Promise<boolean>): Promise<SquattedPort[]>;
export declare function buildSquatterError(tenant: string, squatted: SquattedPort[], detail?: string): string;
