/**
 * Try to acquire a semaphore slot. Non-blocking — returns `{ acquired:
 * false, queue_position: N }` when the cap is hit. The caller marks the
 * install as `queued`.
 *
 * @param {{ projectDir: string, max: number, taskId: string, ecosystem: string }} opts
 * @returns {{ acquired: boolean, released_by: (() => void) | null, queue_position: number, live_count: number }}
 */
export function acquireInstallSlot({ projectDir, max, taskId, ecosystem }: {
    projectDir: string;
    max: number;
    taskId: string;
    ecosystem: string;
}): {
    acquired: boolean;
    released_by: (() => void) | null;
    queue_position: number;
    live_count: number;
};
/**
 * Release a slot by taskId+ecosystem. Idempotent — unlink-or-ignore.
 *
 * @param {{ projectDir: string, taskId: string, ecosystem: string }} opts
 * @returns {{ released: boolean }}
 */
export function releaseInstallSlot({ projectDir, taskId, ecosystem }: {
    projectDir: string;
    taskId: string;
    ecosystem: string;
}): {
    released: boolean;
};
/**
 * Current live-install count (dead slots swept). Useful for the statusline
 * chip and for R10 executor preflight polling.
 *
 * @param {string} projectDir
 * @returns {number}
 */
export function liveInstallCount(projectDir: string): number;
//# sourceMappingURL=install-semaphore.d.mts.map