import type { RegistryEntry } from './registry';
import type { SiteResolver } from './site-resolver';
/** A launched site process, abstracted so tests can inject a fake. */
export declare interface SiteProcessHandle {
  pid: number
  exited: Promise<number | null>
  stop: (signal?: NodeJS.Signals) => void
}
/** A point-in-time view of one supervised site, for `rpx sites` / status. */
export declare interface SiteSnapshot {
  host: string
  dir: string
  status: 'starting' | 'ready' | 'failed'
  pid: number | null
  ports: Record<string, number>
  uptimeMs: number
  idleMs: number
  error?: string
}
export declare interface SiteSupervisorOptions {
  resolver: SiteResolver
  registryDir?: string
  rpxDir?: string
  verbose?: boolean
  startupTimeoutMs?: number
  pollIntervalMs?: number
  reapIntervalMs?: number
  restartDelayMs?: number
  killGraceMs?: number
  launcher?: SiteLauncher
  probePort?: (port: number) => Promise<boolean>
  pickPort?: (preferred: number) => Promise<number>
  isHostRoutable?: (host: string) => boolean
  onSiteActivating?: (host: string) => void
  now?: () => number
  writeEntry?: (entry: RegistryEntry, dir?: string, verbose?: boolean) => Promise<void>
  removeEntry?: (id: string, dir?: string, verbose?: boolean) => Promise<void>
}
/** Spawn a site's dev command. Injected for tests; default spawns a shell. */
export type SiteLauncher = (spec: {
  command: string
  cwd: string
  env: Record<string, string>
  logPath: string
}) => SiteProcessHandle;
export type SiteRequestStatus = | { kind: 'unknown' }
  | { kind: 'starting', host: string, sinceMs: number, source: 'config' | 'discovered', logTail: string }
  | { kind: 'ready', host: string }
  | { kind: 'failed', host: string, error: string, logTail: string }
export declare class SiteSupervisor {
  constructor(opts: SiteSupervisorOptions);
  onRequest(host: string): Promise<SiteRequestStatus>;
  stop(host: string): Promise<void>;
  list(): SiteSnapshot[];
  stopAll(): Promise<void>;
}
