Skip to content

Latest commit

 

History

History
616 lines (344 loc) · 31.9 KB

File metadata and controls

616 lines (344 loc) · 31.9 KB

Changelog

[Unreleased]

[0.60.0] - 2026-03-18

Fixed

  • Fixed tmux xterm modifyOtherKeys matching for Backspace, Escape, and Space, and resolved raw \x08 backspace ambiguity by treating Windows Terminal sessions differently from legacy terminals (#2293)

[0.59.0] - 2026-03-17

[0.58.4] - 2026-03-16

[0.58.3] - 2026-03-15

[0.58.2] - 2026-03-15

Added

  • Added configurable SelectList primary column sizing via SelectListLayoutOptions, including custom primary-label truncation hooks (#2154 by @markusylisiurunen)

Fixed

  • Fixed stale scrollback remaining after full-screen redraws such as session switches by clearing the screen before wiping scrollback (#2155 by @Perlence)
  • Fixed trailing blank lines after markdown block elements when they are followed immediately by the next block or end of document (#2152 by @markusylisiurunen)

[0.58.1] - 2026-03-14

Fixed

  • Fixed Windows shell and path handling in autocomplete to properly handle drive letters and mixed path separators
  • Fixed editor paste to preserve literal content instead of normalizing newlines, preventing content corruption for text with embedded escape sequences (#2064)
  • Fixed tab completion to preserve ./ prefix when completing relative paths (#2087)
  • Fixed ctrl+backspace being indistinguishable from plain backspace on Windows Terminal. 0x08 is now recognized as ctrl+backspace instead of backspace, making ctrl+backspace bindable on terminals where it produces a distinct byte (#2139)

[0.58.0] - 2026-03-14

Added

  • Added paste marker atomic segment handling in editor, treating paste markers as indivisible units during word wrapping and cursor navigation (#2111 by @haoqixu)

Fixed

  • Fixed Input horizontal scrolling for wide Unicode text (CJK, fullwidth characters) to use visual column width and strict slice boundaries, preventing rendered line overflow and TUI crashes (#1982)
  • Fixed xterm modifyOtherKeys handling for Tab in matchesKey(), restoring shift+tab and other modified Tab bindings in tmux when extended-keys-format is left at the default xterm
  • Fixed editor scroll indicator rendering crash in narrow terminal widths (#2103 by @haoqixu)
  • Fixed tab characters in editor setText() and input paths not being normalized to spaces (#2027 by @haoqixu)
  • Fixed wordWrapLine overflow when wide characters (CJK, fullwidth) fall exactly at the wrap boundary (#2082 by @haoqixu)
  • Fixed tab characters in Input paste not being normalized to spaces (#1975 by @haoqixu)

[0.57.1] - 2026-03-07

Added

  • Added treeFoldOrUp and treeUnfoldOrDown editor actions with default bindings for Ctrl+←/Ctrl+→ and Alt+←/Alt+→ (#1724 by @Perlence)
  • Added digit keys (0-9) to the keybinding system, including Kitty CSI-u and xterm modifyOtherKeys support for bindings like ctrl+1 (#1905)

Fixed

  • Fixed autocomplete selection ignoring typed text: highlight now follows the first prefix match as the user types, and exact matches are always selected on Enter (#1931 by @aliou)
  • Fixed xterm modifyOtherKeys parsing in matchesKey() and parseKey(), restoring Ctrl-based keybindings and modified Enter keys in tmux when extended-keys-format is left at the default xterm (#1872)
  • Fixed slash-command Tab completion to immediately open argument completions when available (#1481 by @barapa)

[0.57.0] - 2026-03-07

Added

  • Added non-capturing overlays via OverlayOptions.nonCapturing and new OverlayHandle methods: focus(), unfocus(), and isFocused() for programmatic overlay focus control (#1916 by @nicobailon)

Changed

  • Overlay compositing order now uses focus order so focused overlays render on top while preserving stack semantics for show/hide behavior (#1916 by @nicobailon)

Fixed

  • Fixed automatic focus restoration to skip non-capturing overlays and fixed hideOverlay() to only reassign focus when the popped overlay had focus (#1916 by @nicobailon)

[0.56.3] - 2026-03-06

Added

  • Added xterm modifyOtherKeys mode 2 fallback when Kitty keyboard protocol is not available, enabling modified enter keys (Shift+Enter, Ctrl+Enter) inside tmux (#1872)

[0.56.2] - 2026-03-05

Added

  • Exported decodeKittyPrintable() from keys.ts for decoding Kitty CSI-u sequences into printable characters

Fixed

  • Fixed Input component not accepting typed characters when Kitty keyboard protocol is active (e.g., VS Code 1.110+), causing model selector filter to ignore keystrokes (#1857)
  • Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes (#1844 by @ghoulr).

[0.56.1] - 2026-03-05

Fixed

  • Fixed markdown blockquote rendering to isolate blockquote styling from default text style, preventing style leakage.

[0.56.0] - 2026-03-04

Fixed

  • Fixed TUI width calculation for regional indicator symbols (e.g. partial flag sequences like 🇨 during streaming) to prevent wrap drift and stale character artifacts in differential rendering.
  • Fixed Kitty CSI-u handling to ignore unsupported modifiers so modifier-only events do not insert stray printable characters (#1807)
  • Fixed single-line paste performance by inserting pasted text atomically instead of character-by-character, preventing repeated @ autocomplete scans during paste (#1812)
  • Fixed visibleWidth() to ignore generic OSC escape sequences (including OSC 133 semantic prompt markers), preventing width drift when terminals emit semantic zone markers (#1805)
  • Fixed markdown blockquotes dropping nested list content by rendering blockquote children as block-level tokens (#1787)

[0.55.4] - 2026-03-02

[0.55.3] - 2026-02-27

[0.55.2] - 2026-02-27

[0.55.1] - 2026-02-26

Fixed

  • Fixed Windows VT input initialization in ESM by loading koffi via createRequire, restoring VT input mode while keeping koffi externalized from compiled binaries (#1627 by @kaste)

[0.55.0] - 2026-02-24

[0.54.2] - 2026-02-23

[0.54.1] - 2026-02-22

Fixed

  • Changed koffi import from top-level to dynamic require in enableWindowsVTInput() to prevent bun from embedding all 18 platform .node files (~74MB) into every compiled binary. Koffi is only needed on Windows.

[0.54.0] - 2026-02-19

[0.53.1] - 2026-02-19

[0.53.0] - 2026-02-17

[0.52.12] - 2026-02-13

[0.52.11] - 2026-02-13

[0.52.10] - 2026-02-12

Added

  • Added terminal input listeners in TUI (addInputListener and removeInputListener) to let callers intercept, transform, or consume raw input before component handling.

Fixed

  • Fixed @ autocomplete fuzzy matching to score against path segments and prefixes, reducing irrelevant matches for nested paths (#1423)

[0.52.9] - 2026-02-08

[0.52.8] - 2026-02-07

Added

  • Added pasteToEditor to EditorComponent API for programmatic paste support (#1351 by @kaofelix)
  • Added kill ring (ctrl+k/ctrl+y/alt+y) and undo (ctrl+z) support to the Input component (#1373 by @Perlence)

[0.52.7] - 2026-02-06

[0.52.6] - 2026-02-05

[0.52.5] - 2026-02-05

[0.52.4] - 2026-02-05

[0.52.3] - 2026-02-05

[0.52.2] - 2026-02-05

[0.52.1] - 2026-02-05

[0.52.0] - 2026-02-05

[0.51.6] - 2026-02-04

Changed

  • Slash command menu now triggers on the first line even when other lines have content, allowing commands to be prepended to existing text (#1227 by @aliou)

Fixed

  • Fixed /settings crashing in narrow terminals by handling small widths in the settings list (#1246 by @haoqixu)

[0.51.5] - 2026-02-04

[0.51.4] - 2026-02-03

Fixed

  • Fixed input scrolling to avoid splitting emoji sequences (#1228 by @haoqixu)

[0.51.3] - 2026-02-03

[0.51.2] - 2026-02-03

Added

  • Added Terminal.drainInput() to drain stdin before exit (prevents Kitty key release events leaking over slow SSH)

Fixed

  • Fixed Kitty key release events leaking to parent shell over slow SSH connections by draining stdin for up to 1s (#1204)
  • Fixed legacy newline handling in the editor to preserve previous newline behavior
  • Fixed @ autocomplete to include hidden paths
  • Fixed submit fallback to honor configured keybindings

[0.51.1] - 2026-02-02

Added

  • Added PI_DEBUG_REDRAW=1 env var for debugging full redraws (logs triggers to ~/.pi/agent/pi-debug.log)

Changed

  • Terminal height changes no longer trigger full redraws, reducing flicker on resize
  • clearOnShrink now defaults to false (use PI_CLEAR_ON_SHRINK=1 or setClearOnShrink(true) to enable)

Fixed

  • Fixed emoji cursor positioning in Input component (#1183 by @haoqixu)

  • Fixed unnecessary full redraws when appending many lines after content had previously shrunk (viewport check now uses actual previous content size instead of stale maximum)

  • Fixed Ctrl+D exit closing the parent SSH session due to stdin buffer race condition (#1185)

[0.51.0] - 2026-02-01

[0.50.9] - 2026-02-01

[0.50.8] - 2026-02-01

Added

  • Added sticky column tracking for vertical cursor navigation so the editor restores the preferred column when moving across short lines. (#1120 by @Perlence)

Fixed

  • Fixed Kitty keyboard protocol base layout fallback so non-QWERTY layouts do not trigger wrong shortcuts (#1096 by @rytswd)

[0.50.7] - 2026-01-31

[0.50.6] - 2026-01-30

Changed

  • Optimized isImageLine() with startsWith short-circuit for faster image line detection

Fixed

  • Fixed empty rows appearing below footer when content shrinks (e.g., closing /tree, clearing multi-line editor) (#1095 by @marckrenn)
  • Fixed terminal cursor remaining hidden after exiting TUI via stop() when a render was pending (#1099 by @haoqixu)

[0.50.5] - 2026-01-30

Fixed

  • Fixed isImageLine() to check for image escape sequences anywhere in a line, not just at the start. This prevents TUI crashes when rendering lines containing image data. (#1091 by @zedrdave)

[0.50.4] - 2026-01-30

Added

  • Added Ctrl+B and Ctrl+F as alternative keybindings for cursor word left/right navigation (#1053 by @ninlds)
  • Added character jump navigation: Ctrl+] jumps forward to next character, Ctrl+Alt+] jumps backward (#1074 by @Perlence)
  • Editor now jumps to line start when pressing Up at first visual line, and line end when pressing Down at last visual line (#1050 by @4h9fbZ)

Changed

  • Optimized image line detection and box rendering cache for better performance (#1084 by @can1357)

Fixed

  • Fixed autocomplete for paths with spaces by supporting quoted path tokens (#1077)
  • Fixed quoted path completions to avoid duplicating closing quotes during autocomplete (#1077)

[0.50.3] - 2026-01-29

[0.50.2] - 2026-01-29

Added

  • Added autocompleteMaxVisible option to EditorOptions with getter/setter methods for configurable autocomplete dropdown height (#972 by @masonc15)
  • Added alt+b and alt+f as alternative keybindings for word navigation (cursorWordLeft, cursorWordRight) and ctrl+d for deleteCharForward (#1043 by @jasonish)
  • Editor auto-applies single suggestion when force file autocomplete triggers with exactly one match (#993 by @Perlence)

Changed

  • Improved extractCursorPosition performance: scans lines in reverse order, early-outs when cursor is above viewport, and limits scan to bottom terminal height (#1004 by @can1357)
  • Autocomplete improvements: better handling of partial matches and edge cases (#1024 by @Perlence)

Fixed

  • Fixed backslash input buffering causing delayed character display in editor and input components (#1037 by @Perlence)
  • Fixed markdown table rendering with proper row dividers and minimum column width (#997 by @tmustier)

[0.50.1] - 2026-01-26

[0.50.0] - 2026-01-26

Added

  • Added fullRedraws readonly property to TUI class for tracking full screen redraws
  • Added PI_TUI_WRITE_LOG environment variable to capture raw ANSI output for debugging

Fixed

  • Fixed appended lines not being committed to scrollback, causing earlier content to be overwritten when viewport fills (#954)
  • Slash command menu now only triggers when the editor input is otherwise empty (#904)
  • Center-anchored overlays now stay vertically centered when resizing the terminal taller after a shrink (#950 by @nicobailon)
  • Fixed editor multi-line insertion handling and lastAction tracking (#945 by @Perlence)
  • Fixed editor word wrapping to reserve a cursor column (#934 by @Perlence)
  • Fixed editor word wrapping to use single-pass backtracking for whitespace handling (#924 by @Perlence)
  • Fixed Kitty image ID allocation and cleanup to prevent image ID collisions between modules

[0.49.3] - 2026-01-22

Added

  • codeBlockIndent property on MarkdownTheme to customize code block content indentation (default: 2 spaces) (#855 by @terrorobe)
  • Added Alt+Delete as hotkey for delete word forwards (#878 by @Perlence)

Changed

  • Fuzzy matching now scores consecutive matches higher and penalizes gaps more heavily for better relevance (#860 by @mitsuhiko)

Fixed

  • Autolinked emails no longer display redundant (mailto:...) suffix in markdown output (#888 by @terrorobe)
  • Fixed viewport tracking and cursor positioning for overlays and content shrink scenarios
  • Autocomplete now allows searches with / characters (e.g., folder1/folder2) (#882 by @richardgill)
  • Directory completions for @ file attachments no longer add trailing space, allowing continued autocomplete into subdirectories

[0.49.2] - 2026-01-19

[0.49.1] - 2026-01-18

Added

  • Added undo support to Editor with Ctrl+- hotkey. Undo coalesces consecutive word characters into one unit (fish-style). (#831 by @Perlence)
  • Added legacy terminal support for Ctrl+symbol keys (Ctrl+, Ctrl+], Ctrl+-) and their Ctrl+Alt variants. (#831 by @Perlence)

[0.49.0] - 2026-01-17

Added

  • Added showHardwareCursor getter and setter to control cursor visibility while keeping IME positioning active. (#800 by @ghoulr)
  • Added Emacs-style kill ring editing with yank and yank-pop keybindings. (#810 by @Perlence)
  • Added legacy Alt+letter handling and Alt+D delete word forward support in the editor keymap. (#810 by @Perlence)

[0.48.0] - 2026-01-16

Added

  • EditorOptions with optional paddingX for horizontal content padding, plus getPaddingX()/setPaddingX() methods (#791 by @ferologics)

Changed

  • Hardware cursor is now disabled by default for better terminal compatibility. Set PI_HARDWARE_CURSOR=1 to enable (replaces PI_NO_HARDWARE_CURSOR=1 which disabled it).

Fixed

  • Decode Kitty CSI-u printable sequences in the editor so shifted symbol keys (e.g., @, ?) work in terminals that enable Kitty keyboard protocol (#779 by @iamd3vil)

[0.47.0] - 2026-01-16

Breaking Changes

  • Editor constructor now requires TUI as first parameter: new Editor(tui, theme). This enables automatic vertical scrolling when content exceeds terminal height. (#732)

Added

  • Hardware cursor positioning for IME support in Editor and Input components. The terminal cursor now follows the text cursor position, enabling proper IME candidate window placement for CJK input. (#719)
  • Focusable interface for components that need hardware cursor positioning. Implement focused: boolean and emit CURSOR_MARKER in render output when focused.
  • CURSOR_MARKER constant and isFocusable() type guard exported from the package
  • Editor now supports Page Up/Down keys (Fn+Up/Down on MacBook) for scrolling through large content (#732)
  • Expanded keymap coverage for terminal compatibility: added support for Home/End keys in tmux, additional modifier combinations, and improved key sequence parsing (#752 by @richardgill)

Fixed

  • Editor no longer corrupts terminal display when text exceeds screen height. Content now scrolls vertically with indicators showing lines above/below the viewport. Max height is 30% of terminal (minimum 5 lines). (#732)
  • visibleWidth() and extractAnsiCode() now handle APC escape sequences (ESC _ ... BEL), fixing width calculation and string slicing for strings containing cursor markers
  • SelectList now handles multi-line descriptions by replacing newlines with spaces (#728 by @richardgill)

[0.46.0] - 2026-01-15

Fixed

  • Keyboard shortcuts (Ctrl+C, Ctrl+D, etc.) now work on non-Latin keyboard layouts (Russian, Ukrainian, Bulgarian, etc.) in terminals supporting Kitty keyboard protocol with alternate key reporting (#718 by @dannote)

[0.45.7] - 2026-01-13

[0.45.6] - 2026-01-13

Added

  • OverlayOptions API for overlay positioning and sizing with CSS-like values: width, maxHeight, row, col accept numbers (absolute) or percentage strings (e.g., "50%"). Also supports minWidth, anchor, offsetX, offsetY, margin. (#667 by @nicobailon)
  • OverlayOptions.visible callback for responsive overlays - receives terminal dimensions, return false to hide (#667 by @nicobailon)
  • showOverlay() now returns OverlayHandle with hide(), setHidden(boolean), isHidden() for programmatic visibility control (#667 by @nicobailon)
  • New exported types: OverlayAnchor, OverlayHandle, OverlayMargin, OverlayOptions, SizeValue (#667 by @nicobailon)
  • truncateToWidth() now accepts optional pad parameter to pad result with spaces to exactly maxWidth (#667 by @nicobailon)

Fixed

  • Overlay compositing crash when rendered lines exceed terminal width due to complex ANSI/OSC sequences (e.g., hyperlinks in subagent output) (#667 by @nicobailon)

[0.45.5] - 2026-01-13

[0.45.4] - 2026-01-13

[0.45.3] - 2026-01-13

[0.45.2] - 2026-01-13

[0.45.1] - 2026-01-13

[0.45.0] - 2026-01-13

[0.44.0] - 2026-01-12

Added

  • SettingsListOptions with enableSearch for fuzzy filtering in SettingsList (#643 by @ninlds)
  • pageUp and pageDown key support with selectPageUp/selectPageDown editor actions (#662 by @aliou)

Fixed

  • Numbered list items showing "1." for all items when code blocks break list continuity (#660 by @ogulcancelik)

[0.43.0] - 2026-01-11

Added

  • fuzzyFilter() and fuzzyMatch() utilities for fuzzy text matching
  • Slash command autocomplete now uses fuzzy matching instead of prefix matching

Fixed

  • Cursor now moves to end of content on exit, preventing status line from being overwritten (#629 by @tallshort)
  • Reset ANSI styles after each rendered line to prevent style leakage

[0.42.5] - 2026-01-11

Fixed

  • Reduced flicker by only re-rendering changed lines (#617 by @ogulcancelik)
  • Cursor position tracking when content shrinks with unchanged remaining lines
  • TUI renders with wrong dimensions after suspend/resume if terminal was resized while suspended (#599)
  • Pasted content containing Kitty key release patterns (e.g., :3F in MAC addresses) was incorrectly filtered out (#623 by @ogulcancelik)

[0.42.4] - 2026-01-10

[0.42.3] - 2026-01-10

[0.42.2] - 2026-01-10

[0.42.1] - 2026-01-09

[0.42.0] - 2026-01-09

[0.41.0] - 2026-01-09

[0.40.1] - 2026-01-09

[0.40.0] - 2026-01-08

[0.39.1] - 2026-01-08

[0.39.0] - 2026-01-08

Added

  • Experimental: Overlay compositing for ctx.ui.custom() with { overlay: true } option (#558 by @nicobailon)

[0.38.0] - 2026-01-08

Added

  • EditorComponent interface for custom editor implementations
  • StdinBuffer class to split batched stdin into individual sequences (adapted from OpenTUI, MIT license)

Fixed

  • Key presses no longer dropped when batched with other events over SSH (#538)

[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)