/**
 * Language-server catalog. Binaries are resolved from the project's
 * node_modules/.bin (walking up for monorepo hoisting), ggcoder's OWN install
 * (typescript-language-server + typescript ship as ggcoder dependencies, so
 * TS/JS diagnostics work for every user out of the box), and the user's PATH —
 * never auto-installed at runtime, never fetched over the network. A server
 * that can't be resolved silently degrades to "no diagnostics".
 *
 * Extension lists stay consistent with `core/language-detector.ts` MARKERS.
 */
export interface ResolvedCommand {
    command: string;
    args: string[];
    /** Server-specific LSP initializationOptions (e.g. explicit tsserver path). */
    initializationOptions?: unknown;
}
export interface LspServerSpec {
    id: string;
    /** File extensions (lowercase, with dot) this server covers. */
    extensions: readonly string[];
    /** Marker files that identify a project root, nearest-first walking up. */
    rootMarkers: readonly string[];
    /** LSP languageId for a given extension. */
    languageIdFor(extension: string): string;
    /** Resolve the server binary for a project root, or null when unavailable. */
    resolveCommand(projectRoot: string): ResolvedCommand | null;
}
/**
 * Find `name`, in priority order:
 *   1. <projectRoot>/node_modules/.bin walking up (project's own version wins)
 *   2. ggcoder's own node_modules/.bin walking up (bundled fallback — this is
 *      how typescript-language-server works for users who never installed it)
 *   3. PATH
 */
export declare function findExecutable(name: string, projectRoot: string): string | null;
export declare const LSP_SERVER_CATALOG: readonly LspServerSpec[];
/** Server spec for a file path, or null when no server covers its extension. */
export declare function serverForFile(filePath: string, catalog?: readonly LspServerSpec[]): LspServerSpec | null;
/**
 * Nearest directory containing one of `markers`, walking up from the file's
 * directory. The walk is capped at `ceiling` when the file lives under it.
 * Falls back to the file's own directory when no marker is found.
 */
export declare function findProjectRoot(filePath: string, markers: readonly string[], ceiling: string): string;
//# sourceMappingURL=servers.d.ts.map