export interface SelectOption<T = string> {
    value: T;
    label: string;
    /** Optional short description appended after the label (dim). */
    hint?: string;
}
export interface SelectMenuOptions<T = string> {
    title: string;
    options: SelectOption<T>[];
    /** Value of the currently-active option, for the `← currently active` marker. */
    active?: T;
    /** Initial cursor position. Defaults to the active row or 0. */
    initialIndex?: number;
}
/**
 * Show the menu, await user input, return the selected value (or null on ESC).
 *
 * In non-TTY contexts (CI, piped), prints the menu once and returns
 * `options[initialIndex].value` without blocking — keeps scripts working.
 */
export declare function selectOne<T = string>(opts: SelectMenuOptions<T>): Promise<T | null>;
export declare function renderMenu<T>(title: string, options: SelectOption<T>[], cursor: number, active: T | undefined, width?: number): string;
/**
 * Single-keypress numbered choice prompt (no Enter needed).
 * Uses raw mode like selectOne, so no readline.createInterface interference.
 */
export declare function numberedChoice(question: string, choices: {
    key: string;
    label: string;
}[]): Promise<string | null>;
