Commit Graph
27 Commits
Author SHA1 Message Date
Sviatoslav Abakumov 4ca7bbe450 Fix tree selector focus behavior (#1142)
* fix(coding-agent): tree selector focuses nearest visible ancestor

When the selected entry is not visible (filtered out by mode change or a
metadata entry like model_change), walk up the parent chain to find the
nearest visible ancestor instead of jumping to the last item.

Fixes selection behavior for:

- Initial selection when currentLeafId is a metadata entry
- Filter switching, e.g. Ctrl+U for user-only mode

* fix(coding-agent): tree selector preserves selection through empty filters

When switching to a filter with no results, e.g. labeled-only with no
labels and back, the cursor would reset to the first message instead of
the original selection.

Track lastSelectedId as a class member and only update it when
filteredNodes is non-empty, preserving the selection across empty filter
results.

* test(coding-agent): add tree selector filter and selection tests

- Test metadata entry handling (model_change, thinking_level_change)
- Test filter switching with parent traversal (default ↔ user-only)
- Test empty filter preservation (labeled-only with no labels)
2026-02-01 13:23:52 +01:00
Sviatoslav Abakumov d075291b08 feat(tui): add sticky column for vertical cursor navigation (#1120)
When moving up/down through lines of varying lengths, the editor now
remembers the original column position and restores it when reaching a
line long enough to accommodate it.

Example: cursor at column 10, move up to a shorter line (cursor clamps
to end), move up again to a longer line - cursor returns to column 10.

Implementation:

- Add preferredVisualCol instance property (nullable)
- Set it when moving to a shorter line during vertical navigation
- Clear it when arriving at a line that fits the preferred column
- Clear it on any horizontal movement or editing via setCursorCol()
- Detect line rewrap by checking if cursor is in middle of line
- When pressing right at end of prompt, set preferredVisualCol so
  subsequent up/down navigation uses that column position
2026-01-31 22:52:47 +01:00
Sviatoslav Abakumov c5d16fe456 feat(tui): add character jump navigation (Ctrl+], Ctrl+Alt+]) (#1074)
Add Bash/Readline-style character search:

- Ctrl+] enters forward jump mode, awaits next character, jumps to it
- Ctrl+Alt+] does the same but searches backward
- Multi-line search
- Case-sensitive matching
- Pressing the hotkey again cancels; control chars cancel and fall
  through
2026-01-30 01:42:14 +01:00
Sviatoslav Abakumov b54d689ec1 A couple of autocomplete improvements (#1024)
* fix(tui): keep file suggestions open when typing in Tab-triggered mode

Previously, pressing Tab on an empty prompt or after a space would show
file suggestions, but typing a letter would dismiss them because the
text didn't look like a path pattern. Now the editor tracks whether
autocomplete was triggered via Tab (force mode) or naturally (regular
mode), and uses the appropriate suggestion method when updating.

* fix(tui): hide autocomplete when backspacing slash command to empty

Previously, typing / showed slash command suggestions, but pressing
Backspace to delete it showed file suggestions instead of hiding all
suggestions.
2026-01-29 02:48:09 +01:00
Sviatoslav Abakumov d57a26c88b fix(tui): remove backslash input buffering (#1037)
Instead of buffering `\` and waiting for the next key, let it be
inserted immediately. On Enter, check if preceded by `\` and treat as
newline.

Removed backslash handling from the Input component entirely.
2026-01-29 02:47:15 +01:00
Sviatoslav Abakumov c67b582fc4 fix(coding-agent): hide provider in footer when terminal is narrow (#981) 2026-01-28 02:15:27 +01:00
Sviatoslav Abakumov 1224b31135 feat(tui): auto-apply single suggestion in force file autocomplete (#993)
When Tab triggers file autocomplete and there's exactly one matching
suggestion, apply it immediately without showing the menu. This makes
path completion faster by eliminating the extra Tab press to confirm.
2026-01-28 02:12:18 +01:00
Sviatoslav Abakumov 3ae0cbe384 fix(coding-agent): Title Case extension hotkeys in /hotkeys output (#969) 2026-01-26 21:50:51 +01:00
Sviatoslav Abakumov 27b27d9441 fix(coding-agent): restore the correct editor after /reload (#949)
This issue occurs when extension uses setEditorComponent. The
restoreEditor() callback was capturing this.editor AFTER
resetExtensionUI() (which restores defaultEditor), then adding that
captured editor back to the container - ignoring any new editor created
by extensions during session_start.

On success, use this.editor (may be custom editor from extension).
On failure, restore the fallback editor (safe defaultEditor state).

Rename restoreEditor to dismissLoader to reflect its actual purpose.
2026-01-25 20:11:09 +01:00
Sviatoslav Abakumov f1b1d54955 fix(coding-agent): delegate extension shortcuts instead of copying (#947)
Extension shortcuts registered via registerShortcut() were not firing
when the extension also used setEditorComponent(). This happened because
setEditorComponent() copied onExtensionShortcut from defaultEditor at
creation time, capturing undefined if setupExtensionShortcuts() hadn't
run yet.

The fix is to delegate to defaultEditor.onExtensionShortcut at call
time.
2026-01-25 19:20:51 +01:00
Sviatoslav Abakumov beb1455cab fix(tui): move lastAction handling out of setTextInternal()
The caller is responsible for doing that.
2026-01-25 17:50:55 +04:00
Sviatoslav Abakumov 609095b0b6 fix(tui): refactor the multi-line insertion handling 2026-01-25 17:50:50 +04:00
Sviatoslav Abakumov 7d2d170c1b fix(tui): handle multi-line text in insertTextAtCursor()
Add insertTextAtCursorInternal() to properly handle newlines by splitting
lines at the cursor position.

- Normalize line endings (CRLF/CR to LF)
- Handle single-line and multi-line insertion
- Position cursor at end of inserted text
- Call onChange only once at the end

Refactor handlePaste() to use insertTextAtCursorInternal() for
multi-line pastes, while retaining character-by-character insertion for
single-line pastes to preserve autocomplete triggering.
2026-01-25 17:28:54 +04:00
Sviatoslav Abakumov 2bbc255237 fix(coding-agent): propagate paddingX to custom editors
setCustomEditorComponent() was not copying the paddingX setting from
the default editor to extension-provided editors. Also propagate live
changes from the settings callback.
2026-01-24 21:00:14 +04:00
Sviatoslav Abakumov b5ab90f837 fix(tui): reserve 1 column for cursor in word wrap width 2026-01-24 17:41:10 +04:00
Sviatoslav Abakumov a8f1ff09e5 docs(coding-agent): use Alt+ instead of Option+ for consistency 2026-01-24 13:42:36 +04:00
Sviatoslav Abakumov 7b0244a5ed docs(coding-agent): document missing hotkeys in README and /hotkeys
- Add Ctrl+L (Open model selector) to /hotkeys command
- Add Alt+Enter (Queue follow-up message) to keyboard shortcuts table
- Add PageUp/PageDown (Scroll by page) to all documentation sections
2026-01-24 13:33:49 +04:00
Sviatoslav Abakumov 9090268b7d fix(tui): rewrite word wrap as single-pass with backtracking 2026-01-23 22:31:41 +04:00
Sviatoslav Abakumov 07e2444b9b feat(coding-agent): add --verbose CLI flag to override quietStartup setting 2026-01-22 17:32:47 +04:00
Sviatoslav Abakumov 698aea34bd feat(tui): add Alt+Delete as hotkey for Delete word forwards (#878)
* feat(tui): add Alt+Delete as hotkey for delete word forwards

* docs(coding-agent): update keybindings table with Alt+Delete
2026-01-20 23:03:44 +01:00
Sviatoslav Abakumov 236285b390 fix(coding-agent): fall back to 256color in Terminal.app (#869) 2026-01-20 14:49:57 +01:00
Sviatoslav Abakumov fb1242829d feat(tui): add legacy terminal support for Ctrl+symbol keys
Ctrl+\ sends ASCII 28 (File Separator) in legacy terminals. This is
commonly used as SIGQUIT in Unix.

Ctrl+] sends ASCII 29 (Group Separator) in legacy terminals. This is
commonly used as the telnet escape character.

Ctrl+_ sends ASCII 31 (Unit Separator) in legacy terminals. On US
keyboards, - and _ are on the same physical key, so this also functions
as an alias for Ctrl+-.
2026-01-19 00:18:47 +01:00
Sviatoslav Abakumov 6bde679a5f fix(tui): use the non-null assertion operator instead of assert() 2026-01-19 00:18:47 +01:00
Sviatoslav Abakumov bacf334bc4 feat(tui): add undo support to Editor with the Ctrl+- hotkey
Undo snapshots are captured for all edit operations:

- Word insertion, backspace, forward delete
- Word/line deletion (Ctrl+W, Ctrl+U, Ctrl+K, Alt+D)
- Yank/yank-pop, paste, autocomplete completion
- Cursor movement starts a new undo unit
- setText() pushes snapshot when content changes

Additionally, history browsing captures the undo state on first entry.
2026-01-19 00:18:47 +01:00
Sviatoslav Abakumov 505894f4ea feat(tui): add Alt+D to delete word forward (kill)
Adds deleteWordForward action bound to Alt+D, which deletes from cursor
to the end of the current word and saves to kill ring for later yanking.
Consecutive forward kills append to the same kill ring entry.
2026-01-17 21:11:20 +01:00
Sviatoslav Abakumov 9fb7434a06 feat(tui): implement Emacs-style kill ring for Editor
Add kill ring functionality with:

- Ctrl+W/U/K save deleted text to kill ring
- Ctrl+Y yanks (pastes) most recent deletion
- Alt+Y cycles through kill ring (after Ctrl+Y)
- Consecutive deletions accumulate into single entry
2026-01-17 21:11:20 +01:00
Sviatoslav Abakumov bafddc27ed feat(tui): add legacy Alt+letter key sequence support
In legacy terminal mode (non-Kitty protocol), Alt+key is sent as ESC
followed by the key character. This was only supported for specific keys
(space, backspace, arrows) but not for regular letters.

Add support for Alt+letter sequences to enable keybindings like Alt+Y.
2026-01-17 21:11:20 +01:00