import { type LspServerSpec } from "./servers.js";
export interface LspManagerOptions {
    /** Server catalog override — tests inject a fake-server spec here. */
    catalog?: readonly LspServerSpec[];
    /** Hard diagnostics budget once a client has served at least one file. */
    warmBudgetMs?: number;
    /** Hard budget for a client's very first file (spawn + init + indexing). */
    firstBudgetMs?: number;
}
/**
 * Lazily spawns and pools language servers keyed by (serverId, projectRoot).
 * Nothing runs until the first edit/write of a matching file. Every failure
 * path degrades to an empty string — diagnostics are an enhancement, never a
 * tool-breaking dependency. A failed spawn/init marks the (server, root) pair
 * broken for the session so a missing binary costs one attempt, not one per
 * edit.
 */
export declare class LspManager {
    private readonly cwd;
    private readonly catalog;
    private readonly warmBudgetMs;
    private readonly firstBudgetMs;
    /** (serverId\0root) → in-flight or settled client; null = broken for session. */
    private readonly clients;
    /** Keys that have completed at least one diagnostics pass (warm). */
    private readonly warmKeys;
    private shutDown;
    constructor(cwd: string, options?: LspManagerOptions);
    /**
     * Diagnostics for `filePath` after its content became `content` on disk.
     * Returns a formatted informational block, or "" when the file is clean,
     * unsupported, or anything at all goes wrong (silent graceful degradation).
     */
    diagnosticsAfterWrite(filePath: string, content: string): Promise<string>;
    /** Shut down every pooled server. Safe in process exit handlers. */
    shutdownAll(): void;
    private collect;
    private ensureClient;
}
//# sourceMappingURL=manager.d.ts.map