export interface HostAdapter { id: string; label: string; /** True when this host is usable in the current environment. */ detect: () => boolean; } export declare class HostRegistry { private hosts; register(a: HostAdapter): this; get(id: string): HostAdapter | undefined; all(): HostAdapter[]; /** Hosts present in this environment (detect() true, swallowing errors). */ available(): HostAdapter[]; } /** True if `bin --version` runs. Used by the built-in adapters' detect(). */ export declare function commandExists(bin: string): boolean; /** The built-in hosts. Detection is injectable per-adapter for tests. */ export declare function defaultHostRegistry(): HostRegistry; /** Run `fn` for each host (sequentially, isolated), collecting per-host results. */ export declare function fanOutHosts(hosts: HostAdapter[], fn: (h: HostAdapter) => Promise | T): Promise>; export declare const LAYER_LEVELS: readonly ["global", "language", "framework", "repo"]; /** All ancestor prefixes of a layer path, shallowest first. */ export declare function ancestorsOf(layer: string): string[]; /** True if `a` is an ancestor of (or equal to) `b` at a path boundary. */ export declare function isAncestorOrEqual(a: string, b: string): boolean; export declare function layerDepth(layer: string): number; /** * Pick the most-specific champion applicable to an install's layer: the deepest * manifest whose layer is an ancestor-or-equal of `installLayer`. Layers the * install can't clear fall back to the parent (return the next-deepest). Null if * none applies. */ export declare function selectChampionForLayer(manifests: M[], installLayer: string): M | null; //# sourceMappingURL=harness-hosts.d.ts.map