/**
 * KeybindingsManager — loads and merges keyboard shortcut configuration.
 *
 * Default bindings are hardcoded here. Users can override any binding by
 * creating ~/.goodvibes/goodvibes/keybindings.json.
 *
 * Config file format example:
 * {
 *   "search": { "key": "g", "ctrl": true },
 *   "block-copy": { "key": "c", "ctrl": true, "alt": true }
 * }
 *
 * Each value is a KeyCombo or an array of KeyCombos for multi-binding support.
 */
/** Identifies a specific key press with modifiers. */
export interface KeyCombo {
    /** Logical key name (single char like 'f', or named key like 'r', 'z', 'f2', etc.) */
    key: string;
    ctrl?: boolean;
    shift?: boolean;
    alt?: boolean;
}
/** All bindable action identifiers. */
export type KeyAction = 'copy-selection' | 'clear-cancel' | 'screen-clear' | 'panel-picker' | 'panel-close' | 'panel-close-all' | 'panel-tab-next' | 'panel-tab-prev' | 'history-search' | 'search' | 'block-copy' | 'bookmark' | 'block-save' | 'delete-word' | 'apply-diff-line-start' | 'next-error-line-end' | 'kill-line' | 'clear-prompt' | 'undo' | 'redo' | 'paste' | 'replay-panel';
/** Human-readable description for each action (used in /keybindings display). */
export declare const ACTION_DESCRIPTIONS: Record<KeyAction, string>;
/** Default key bindings for all actions. */
export declare const DEFAULT_KEYBINDINGS: Record<KeyAction, KeyCombo[]>;
export interface KeybindingsManagerOptions {
    readonly configPath?: string;
    readonly userRoot?: string;
    readonly homeDirectory?: string;
}
/**
 * KeybindingsManager — owns the resolved keybinding table.
 *
 * Call loadFromDisk() once at startup (in main.ts) to merge user config.
 * Then use matches() anywhere a key token is being evaluated.
 */
export declare class KeybindingsManager {
    private bindings;
    private configPath;
    constructor(options: KeybindingsManagerOptions);
    private cloneDefaults;
    /**
     * Load user overrides from disk and merge into the binding table.
     * Unknown actions are ignored with a debug log. Malformed entries are skipped.
     * Safe to call multiple times (reloads on each call).
     */
    loadFromDisk(): void;
    private validateCombos;
    /**
     * matches — Check whether a keyboard token matches the given action.
     *
     * @param action  The action to test.
     * @param token   The parsed keyboard token from InputTokenizer.
     *                Expects: { logicalName: string; ctrl?: boolean; shift?: boolean; alt?: boolean }
     */
    matches(action: KeyAction, token: {
        logicalName?: string;
        ctrl?: boolean;
        shift?: boolean;
        alt?: boolean;
    }): boolean;
    private comboMatches;
    /**
     * getAll — Return the full resolved binding table for display purposes.
     */
    getAll(): Array<{
        action: KeyAction;
        combos: KeyCombo[];
        description: string;
    }>;
    /**
     * getComboLabel — Return a human-readable label for the first combo of an action.
     * Example: { key: 'f', ctrl: true } → "Ctrl+F"
     */
    getComboLabel(action: KeyAction): string;
    /**
     * formatCombo — Format a KeyCombo as a human-readable string.
     */
    formatCombo(combo: KeyCombo): string;
    /** Return the config file path. */
    getConfigPath(): string;
}
//# sourceMappingURL=keybindings.d.ts.map