co-mono/packages/tui/CHANGELOG.md
Mario Zechner 09471ebc7d feat(coding-agent): add ctx.ui.setEditorComponent() extension API
- Add setEditorComponent() to ctx.ui for custom editor components
- Add CustomEditor base class for extensions (handles app keybindings)
- Add keybindings parameter to ctx.ui.custom() factory (breaking change)
- Add modal-editor.ts example (vim-like modes)
- Add rainbow-editor.ts example (animated text highlighting)
- Update docs: extensions.md, tui.md Pattern 7
- Clean up terminal on TUI render errors
2026-01-07 16:11:49 +01:00

6 KiB

Changelog

[Unreleased]

Added

  • EditorComponent interface for custom editor implementations

[0.37.8] - 2026-01-07

Added

  • Component.wantsKeyRelease property to opt-in to key release events (default false)

Fixed

  • TUI now filters out key release events by default, preventing double-processing of keys in editors and other components

[0.37.7] - 2026-01-07

Fixed

  • matchesKey() now correctly matches Kitty protocol sequences for unmodified letter keys (needed for key release events)

[0.37.6] - 2026-01-06

Added

  • Kitty keyboard protocol flag 2 support for key release events. New exports: isKeyRelease(data), isKeyRepeat(data), KeyEventType type. Terminals supporting Kitty protocol (Kitty, Ghostty, WezTerm) now send proper key-up events.

[0.37.5] - 2026-01-06

[0.37.4] - 2026-01-06

[0.37.3] - 2026-01-06

[0.37.2] - 2026-01-05

[0.37.1] - 2026-01-05

[0.37.0] - 2026-01-05

Fixed

  • Crash when pasting text with trailing whitespace exceeding terminal width through Markdown rendering (#457 by @robinwander)

[0.36.0] - 2026-01-05

[0.35.0] - 2026-01-05

[0.34.2] - 2026-01-04

[0.34.1] - 2026-01-04

Added

  • Symbol key support in keybinding system: SymbolKey type with 32 symbol keys, Key constants (e.g., Key.backtick, Key.comma), updated matchesKey() and parseKey() to handle symbol input (#450 by @kaofelix)

[0.34.0] - 2026-01-04

Added

  • Editor.getExpandedText() method that returns text with paste markers expanded to their actual content (#444 by @aliou)

[0.33.0] - 2026-01-04

Breaking Changes

  • Key detection functions removed: All isXxx() key detection functions (isEnter(), isEscape(), isCtrlC(), etc.) have been removed. Use matchesKey(data, keyId) instead (e.g., matchesKey(data, "enter"), matchesKey(data, "ctrl+c")). This affects hooks and custom tools that use ctx.ui.custom() with keyboard input handling. (#405)

Added

  • Editor.insertTextAtCursor(text) method for programmatic text insertion (#419)
  • EditorKeybindingsManager for configurable editor keybindings. Components now use matchesKey() and keybindings manager instead of individual isXxx() functions. (#405 by @hjanuschka)

Changed

  • Key detection refactored: consolidated is*() functions into generic matchesKey(data, keyId) function that accepts key identifiers like "ctrl+c", "shift+enter", "alt+left", etc.

[0.32.3] - 2026-01-03

[0.32.2] - 2026-01-03

Fixed

  • Slash command autocomplete now triggers for commands starting with ., -, or _ (e.g., /.land, /-foo) (#422)

[0.32.1] - 2026-01-03

[0.32.0] - 2026-01-03

Changed

  • Editor component now uses word wrapping instead of character-level wrapping for better readability (#382 by @nickseelert)

Fixed

  • Shift+Space, Shift+Backspace, and Shift+Delete now work correctly in Kitty-protocol terminals (Kitty, WezTerm, etc.) instead of being silently ignored (#411 by @nathyong)

[0.31.1] - 2026-01-02

Fixed

  • visibleWidth() now strips OSC 8 hyperlink sequences, fixing text wrapping for clickable links (#396 by @Cursivez)

[0.31.0] - 2026-01-02

Added

  • isShiftCtrlO() key detection function for Shift+Ctrl+O (Kitty protocol)
  • isShiftCtrlD() key detection function for Shift+Ctrl+D (Kitty protocol)
  • TUI.onDebug callback for global debug key handling (Shift+Ctrl+D)
  • wrapTextWithAnsi() utility now exported (wraps text to width, preserving ANSI codes)

Changed

  • README.md completely rewritten with accurate component documentation, theme interfaces, and examples
  • visibleWidth() reimplemented with grapheme-based width calculation, 10x faster on Bun and ~15% faster on Node (#369 by @nathyong)

Fixed

  • Markdown component now renders HTML tags as plain text instead of silently dropping them (#359)
  • Crash in visibleWidth() and grapheme iteration when encountering undefined code points (#372 by @HACKE-RC)
  • ZWJ emoji sequences (rainbow flag, family, etc.) now render with correct width instead of being split into multiple characters (#369 by @nathyong)

[0.29.0] - 2025-12-25

Added

  • Auto-space before pasted file paths: When pasting a file path (starting with /, ~, or .) and the cursor is after a word character, a space is automatically prepended for better readability. Useful when dragging screenshots from macOS. (#307 by @mitsuhiko)
  • Word navigation for Input component: Added Ctrl+Left/Right and Alt+Left/Right support for word-by-word cursor movement. (#306 by @kim0)
  • Full Unicode input: Input component now accepts Unicode characters beyond ASCII. (#306 by @kim0)

Fixed

  • Readline-style Ctrl+W: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. (#306 by @kim0)