import { type Keybinding, type KeybindingsConfig, type KeyId, KeybindingsManager as TuiKeybindingsManager } from "@gajae-code/tui"; /** * Application-level keybindings (coding agent specific). * Values are always `true` — used for declaration merging. */ interface AppKeybindings { "app.interrupt": true; "app.clear": true; "app.exit": true; "app.suspend": true; "app.thinking.cycle": true; "app.thinking.toggle": true; "app.commandPalette.open": true; "app.model.cycleForward": true; "app.model.cycleBackward": true; "app.model.select": true; "app.model.selectTemporary": true; "app.tools.expand": true; "app.tool.backgroundFold": true; "app.editor.external": true; "app.message.followUp": true; "app.message.queue": true; "app.message.dequeue": true; "app.clipboard.pasteImage": true; "app.clipboard.pasteText": true; "app.clipboard.copyLine": true; "app.clipboard.copyPrompt": true; "app.session.new": true; "app.session.tree": true; "app.session.fork": true; "app.session.resume": true; "app.session.observe": true; "app.session.dashboard": true; "app.jobs.open": true; "app.session.togglePath": true; "app.session.toggleSort": true; "app.session.rename": true; "app.session.delete": true; "app.session.deleteNoninvasive": true; "app.tree.foldOrUp": true; "app.tree.unfoldOrDown": true; "app.plan.toggle": true; "app.history.search": true; "app.stt.toggle": true; "app.irc.sidebar.toggle": true; "app.transcript.browse": true; "app.transcript.prevTurn": true; "app.transcript.nextTurn": true; "app.mode.cycle": true; "app.tasks.toggle": true; "app.queue.togglePane": true; "app.message.sendNow": true; } export type AppKeybinding = keyof AppKeybindings; declare module "@gajae-code/tui" { interface Keybindings extends AppKeybindings { } } export declare function defaultMessageQueueKeysForPlatform(platform?: NodeJS.Platform): KeyId; export declare function defaultClipboardPasteImageKeysForPlatform(platform?: NodeJS.Platform): KeyId[]; /** * All keybindings definitions: TUI + app-specific. */ export declare const KEYBINDINGS: { readonly "tui.editor.cursorUp": { readonly defaultKeys: "up"; readonly description: "Move cursor up"; }; readonly "tui.editor.cursorDown": { readonly defaultKeys: "down"; readonly description: "Move cursor down"; }; readonly "tui.editor.cursorLeft": { readonly defaultKeys: ["left", "ctrl+b"]; readonly description: "Move cursor left"; }; readonly "tui.editor.cursorRight": { readonly defaultKeys: ["right", "ctrl+f"]; readonly description: "Move cursor right"; }; readonly "tui.editor.cursorWordLeft": { readonly defaultKeys: ["alt+left", "ctrl+left", "alt+b"]; readonly description: "Move cursor word left"; }; readonly "tui.editor.cursorWordRight": { readonly defaultKeys: ["alt+right", "ctrl+right", "alt+f"]; readonly description: "Move cursor word right"; }; readonly "tui.editor.cursorLineStart": { readonly defaultKeys: ["home", "ctrl+a"]; readonly description: "Move to line start"; }; readonly "tui.editor.cursorLineEnd": { readonly defaultKeys: ["end", "ctrl+e"]; readonly description: "Move to line end"; }; readonly "tui.editor.jumpForward": { readonly defaultKeys: "ctrl+]"; readonly description: "Jump forward to character"; }; readonly "tui.editor.jumpBackward": { readonly defaultKeys: "ctrl+alt+]"; readonly description: "Jump backward to character"; }; readonly "tui.editor.pageUp": { readonly defaultKeys: "pageUp"; readonly description: "Page up"; }; readonly "tui.editor.pageDown": { readonly defaultKeys: "pageDown"; readonly description: "Page down"; }; readonly "tui.editor.deleteCharBackward": { readonly defaultKeys: "backspace"; readonly description: "Delete character backward"; }; readonly "tui.editor.deleteCharForward": { readonly defaultKeys: ["delete", "ctrl+d"]; readonly description: "Delete character forward"; }; readonly "tui.editor.deleteWordBackward": { readonly defaultKeys: ["ctrl+w", "alt+backspace", "ctrl+backspace"]; readonly description: "Delete word backward"; }; readonly "tui.editor.deleteWordForward": { readonly defaultKeys: ["alt+delete", "alt+d"]; readonly description: "Delete word forward"; }; readonly "tui.editor.deleteToLineStart": { readonly defaultKeys: "ctrl+u"; readonly description: "Delete to line start"; }; readonly "tui.editor.deleteToLineEnd": { readonly defaultKeys: "ctrl+k"; readonly description: "Delete to line end"; }; readonly "tui.editor.yank": { readonly defaultKeys: "ctrl+y"; readonly description: "Yank"; }; readonly "tui.editor.yankPop": { readonly defaultKeys: "alt+y"; readonly description: "Yank pop"; }; readonly "tui.editor.undo": { readonly defaultKeys: ["ctrl+-", "ctrl+_"]; readonly description: "Undo"; }; readonly "tui.input.newLine": { readonly defaultKeys: "shift+enter"; readonly description: "Insert newline"; }; readonly "tui.input.submit": { readonly defaultKeys: "enter"; readonly description: "Submit input"; }; readonly "tui.input.tab": { readonly defaultKeys: "tab"; readonly description: "Tab / autocomplete"; }; readonly "tui.input.copy": { readonly defaultKeys: "ctrl+c"; readonly description: "Copy selection"; }; readonly "tui.select.up": { readonly defaultKeys: "up"; readonly description: "Move selection up"; }; readonly "tui.select.down": { readonly defaultKeys: "down"; readonly description: "Move selection down"; }; readonly "tui.select.pageUp": { readonly defaultKeys: "pageUp"; readonly description: "Selection page up"; }; readonly "tui.select.pageDown": { readonly defaultKeys: "pageDown"; readonly description: "Selection page down"; }; readonly "tui.select.confirm": { readonly defaultKeys: "enter"; readonly description: "Confirm selection"; }; readonly "tui.select.cancel": { readonly defaultKeys: ["escape", "ctrl+c"]; readonly description: "Cancel selection"; }; readonly "tui.global.debug": { readonly defaultKeys: "shift+ctrl+d"; readonly description: "Toggle debug overlay"; }; readonly "app.interrupt": { readonly defaultKeys: "escape"; readonly description: "Interrupt current operation"; }; readonly "app.clear": { readonly defaultKeys: "ctrl+c"; readonly description: "Clear screen or cancel"; }; readonly "app.exit": { readonly defaultKeys: "ctrl+d"; readonly description: "Exit application"; }; readonly "app.suspend": { readonly defaultKeys: "ctrl+z"; readonly description: "Suspend application"; }; readonly "app.thinking.cycle": { readonly defaultKeys: "shift+tab"; readonly description: "Cycle thinking level"; }; readonly "app.thinking.toggle": { readonly defaultKeys: "ctrl+t"; readonly description: "Toggle thinking mode"; }; readonly "app.commandPalette.open": { readonly defaultKeys: "ctrl+p"; readonly description: "Open command palette"; }; readonly "app.model.cycleForward": { readonly defaultKeys: "alt+n"; readonly description: "Cycle to next model"; }; readonly "app.model.cycleBackward": { readonly defaultKeys: "alt+shift+n"; readonly description: "Cycle to previous model"; }; readonly "app.model.select": { readonly defaultKeys: "ctrl+l"; readonly description: "Select model"; }; readonly "app.model.selectTemporary": { readonly defaultKeys: "alt+p"; readonly description: "Select temporary model for current session"; }; readonly "app.tools.expand": { readonly defaultKeys: "ctrl+o"; readonly description: "Expand tools"; }; readonly "app.tool.backgroundFold": { readonly defaultKeys: "ctrl+b"; readonly description: "Fold/background supported foreground tool"; }; readonly "app.editor.external": { readonly defaultKeys: "ctrl+g"; readonly description: "Open external editor"; }; readonly "app.message.followUp": { readonly defaultKeys: []; readonly description: "Send follow-up message (no default; Ctrl+Enter submits)"; }; readonly "app.message.queue": { readonly defaultKeys: KeyId; readonly description: "Queue message for next turn"; }; readonly "app.message.dequeue": { readonly defaultKeys: ["alt+up", "alt+down"]; readonly description: "Select queued message to edit"; }; readonly "app.clipboard.pasteImage": { readonly defaultKeys: KeyId[]; readonly description: "Paste image from clipboard"; }; readonly "app.clipboard.pasteText": { readonly defaultKeys: []; readonly description: "Paste text from configured clipboard transport (command palette only; no default key to avoid colliding with image paste)"; }; readonly "app.clipboard.copyLine": { readonly defaultKeys: "alt+shift+l"; readonly description: "Copy current line"; }; readonly "app.clipboard.copyPrompt": { readonly defaultKeys: "alt+shift+c"; readonly description: "Copy prompt"; }; readonly "app.session.new": { readonly defaultKeys: "ctrl+n"; readonly description: "Start a new session"; }; readonly "app.session.tree": { readonly defaultKeys: []; readonly description: "Show session tree"; }; readonly "app.session.fork": { readonly defaultKeys: []; readonly description: "Branch from message"; }; readonly "app.session.resume": { readonly defaultKeys: []; readonly description: "Resume session"; }; readonly "app.session.observe": { readonly defaultKeys: "ctrl+s"; readonly description: "Observe subagent sessions"; }; readonly "app.session.dashboard": { readonly defaultKeys: []; readonly description: "Show all persisted sessions dashboard"; }; readonly "app.jobs.open": { readonly defaultKeys: "alt+j"; readonly description: "Open monitor/cron jobs overlay"; }; readonly "app.session.togglePath": { readonly defaultKeys: "ctrl+p"; readonly description: "Toggle session path display"; }; readonly "app.session.toggleSort": { readonly defaultKeys: "ctrl+s"; readonly description: "Toggle session sort order"; }; readonly "app.session.rename": { readonly defaultKeys: "ctrl+r"; readonly description: "Rename session"; }; readonly "app.session.delete": { readonly defaultKeys: "ctrl+d"; readonly description: "Delete current session transcript/artifacts"; }; readonly "app.session.deleteNoninvasive": { readonly defaultKeys: "ctrl+backspace"; readonly description: "Delete selected session transcript/artifacts (non-invasive)"; }; readonly "app.tree.foldOrUp": { readonly defaultKeys: ["ctrl+left", "alt+left"]; readonly description: "Fold or move up"; }; readonly "app.tree.unfoldOrDown": { readonly defaultKeys: ["ctrl+right", "alt+right"]; readonly description: "Unfold or move down"; }; readonly "app.plan.toggle": { readonly defaultKeys: "alt+shift+p"; readonly description: "Toggle plan mode"; }; readonly "app.history.search": { readonly defaultKeys: "ctrl+r"; readonly description: "Search history"; }; readonly "app.stt.toggle": { readonly defaultKeys: "alt+h"; readonly description: "Toggle speech-to-text"; }; readonly "app.irc.sidebar.toggle": { readonly defaultKeys: "alt+i"; readonly description: "Toggle IRC sidebar"; }; readonly "app.transcript.browse": { readonly defaultKeys: []; readonly description: "Browse the transcript"; }; readonly "app.transcript.prevTurn": { readonly defaultKeys: []; readonly description: "Jump to previous user turn"; }; readonly "app.transcript.nextTurn": { readonly defaultKeys: []; readonly description: "Jump to next user turn"; }; readonly "app.mode.cycle": { readonly defaultKeys: []; readonly description: "Cycle interaction mode"; }; readonly "app.tasks.toggle": { readonly defaultKeys: "alt+t"; readonly description: "Toggle tasks pane"; }; readonly "app.queue.togglePane": { readonly defaultKeys: []; readonly description: "Toggle message queue pane"; }; readonly "app.message.sendNow": { readonly defaultKeys: []; readonly description: "Send message immediately"; }; }; declare function migrateKeybindingsConfigFile(agentDir: string): void; /** * Manages all keybindings (app + TUI). * Extends the TUI KeybindingsManager with app-specific functionality. */ export declare class KeybindingsManager extends TuiKeybindingsManager { #private; constructor(userBindings?: KeybindingsConfig, configPath?: string); /** * Replace user bindings only after canonical grammar validation. */ setUserBindings(userBindings: KeybindingsConfig): void; /** * Create from config file at agentDir/keybindings.json. */ static create(agentDir?: string): KeybindingsManager; /** * Create an in-memory keybindings manager without file persistence. */ static inMemory(userBindings?: KeybindingsConfig): KeybindingsManager; /** * Set the default display context used by composed surfaces that do not * supply an explicit context. */ setDisplayContext(context: KeyDisplayContext): void; /** * Reload keybindings from the config file. */ reload(): void; /** * Get the effective resolved bindings (defaults + user overrides). */ getEffectiveConfig(): KeybindingsConfig; /** * Get display string for a keybinding (e.g., "ctrl+c/escape"). */ getDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string; /** * Get an accessibility-oriented display string for help surfaces. * Darwin chords include both the concise glyphs and expanded key names. */ getAccessibleDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string; /** * Format a fixed key chord using this manager's display context. */ formatKeyHint(key: string): string; /** * Format a fixed key chord for accessibility-oriented help surfaces. */ formatAccessibleKeyHint(key: string): string; } /** * Key hint formatting utilities for UI labels. */ export interface KeyDisplayContext { platform: NodeJS.Platform; } export declare function formatKeyHint(key: string, context?: KeyDisplayContext): string; export declare function formatAccessibleKeyHint(key: string, context?: KeyDisplayContext): string; export declare function formatKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string; export declare function formatAccessibleKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string; export type { Keybinding, KeybindingsConfig, KeyId }; export { migrateKeybindingsConfigFile };