36 KiB
Changelog
[Unreleased]
[15.0.1] - 2026-05-14
Breaking Changes
- Increased the minimum required Bun version for the TUI package from >=1.3.7 to >=1.3.14
[14.9.8] - 2026-05-12
Added
- Added
Terminal.setProgress(active)to emit OSC 9;4 progress sequences with a ~1s keepalive interval so Ghostty does not clear the indicator during long-running work (ports pi-monoa900d251+76bc605a) - Added optional
argumentHint?: stringtoSlashCommand; rendered before the description in the autocomplete dropdown (ports pi-monoaa25726e) - Added
VirtualTerminal.waitForRender()test helper for the throttled render pipeline (ports pi-mono41377ee8)
Changed
ProcessTerminalcolumns/rowsgetters consultBun.env.COLUMNS/Bun.env.LINESbefore falling back to 80×24, so piped/non-TTY runs honour environment-provided dimensions (ports pi-mono32f7fc6a)requestRender()non-force calls are coalesced to a ~16ms frame budget;requestRender(true)still flushes immediately viaprocess.nextTick(ports pi-mono6f5f37f8)KNOWN_TERMINALS.base/KNOWN_TERMINALS.trueColordefaulthyperlinks: false; tmux and screen (TMUXenv orTERMstarts withtmux/screen) forcehyperlinks: falseeven when the outer terminal would advertise OSC 8 (adapts pi-mono30a8a41f)SlashCommand.getArgumentCompletions()may return aPromise; results are now awaited and non-array returns are ignored (ports pi-monoa1e10789)- Fuzzy
@autocomplete now follows symlinked directories viaScanOptions.follow_linksplumbed through the native walker (ports pi-mono780d5367) - Plain
@<query>(no slash) fuzzy matches by basename only, so@planno longer surfaces every file whose ancestor directories containplan(ports pi-mono968430f6)
Fixed
-
Fixed editor corruption on Thai Sara Am (U+0E33) and Lao AM (U+0EB3) vowels by normalizing to their compatibility decompositions on the terminal-write path while keeping editor content logically unchanged (ports pi-mono
bc668826+338ce3a3+20ca45d5) -
Fixed cell-size detection (
CSI 6;h;w tresponse) to consume only exact replies, so a bareEscapekeystroke is no longer swallowed while waiting for terminal image metadata (ports pi-mono49c0d860) -
Fixed Kitty CSI-u printable input duplicating on layouts (e.g. Italian) where the terminal also emits the raw character: the immediately-following matching codepoint is now suppressed (ports pi-mono
bdb416cb) -
Fixed bracketed-paste CSI-u
Ctrl+<letter>re-encoding (tmux popup withextended-keys-format=csi-u) leaking literal[<code>;5uinto the editor; control bytes are decoded back to their literal byte before per-char filtering (ports pi-monod06db09a) -
Fixed xterm
modifyOtherKeysshifted printable input so uppercase letters inserted viaCSI 27;mod;codepoint~reach the editor correctly (ports pi-mono6b55d685) -
Fixed
super-modified Kitty shortcuts (super+k,ctrl+super+enter, …) to parse and match via the newKITTY_MOD_SUPERmask (ports pi-monoddb8454c+5ed46003) -
Fixed
ctrl+alt+<letter>in tmux falling through to CSI-u /modifyOtherKeyswhen the legacyESC<ctrl-char>form does not match (ports pi-mono6cf5098f) -
Fixed Markdown strikethrough requiring strict
~~text~~delimiters with non-whitespace boundaries; single tildes no longer render strikethrough (ports pi-monodb5274b4) -
Allowed
SlashCommand.getArgumentCompletionsto return asynchronous results by accepting Promise-based completions -
Added
argumentHintsupport to slash command definitions and displayed it in command suggestion descriptions -
Added support for xterm
modifyOtherKeysprintable key sequences by decodingCSI 27;mod;key~into text input
Changed
- Changed slash-command autocomplete list rendering to combine command hint and description in a single displayed suggestion text
- Changed render scheduling to throttle
requestRendercalls to roughly 60fps by batching updates - Changed terminal input handling to process complete cell-size responses without buffering partial input
- Changed
KeyIdto accept super-modifier combinations and improve typed key-id validation
Fixed
- Normalized line output during rendering to correct Thai/Lao AM glyph composition for displayed text
- Fixed duplicated Kitty key input emissions by dropping the matching unmodified follow-up sequence after a Kitty CSI-u printable-key event
[14.9.5] - 2026-05-12
Fixed
- Fixed rapidly blinking cursor artifact during task execution by consolidating cursor control sequences into the synchronized output buffer (#992)
[14.5.7] - 2026-04-29
Fixed
- Fixed editor Ctrl+Enter handling to recognize NumLock and keypad Enter variants.
[14.3.0] - 2026-04-25
Fixed
- Fixed shared Markdown Mermaid fenced-block rendering to resolve diagrams from fenced source text instead of external prerender state
[14.1.1] - 2026-04-14
Breaking Changes
- Removed the
searchDbconstructor argument fromCombinedAutocompleteProvider, requiring callers to use the built-in search behavior
Changed
- Changed truncation debug logging to run only when
debugRedrawis enabled
Fixed
- Fixed viewport jumping during streaming and session swap by tracking actual content height instead of high-water mark
[14.0.5] - 2026-04-11
Changed
- Updated hash computation to use
Bun.hash()instead ofBun.hash.xxHash64(), which may returnnumberin addition tobigint - Simplified cache key computation in Box component by removing intermediate hash updates and consolidating hash operations
- Wrapped native text utility functions (
sliceWithWidth,truncateToWidth,wrapTextWithAnsi,extractSegments) to automatically pass the current default tab width, simplifying the API for consumers - Added
getIndentationNoescapewrapper that usesprocess.cwd()as the project root for relative file paths - Re-export
getDefaultTabWidth,getIndentation, andsetDefaultTabWidthfrom@oh-my-pi/pi-utils; native text helpers still receive tab width via wrappers that read the JS default
[13.16.1] - 2026-03-27
Added
- Support for optional SearchDb parameter in CombinedAutocompleteProvider constructor for improved fuzzy search performance
- Fuzzy matching filter for autocomplete suggestions to improve relevance of results
Changed
- Fuzzy discovery now applies fuzzy matching filter to results for improved relevance of autocomplete suggestions
- Autocomplete fuzzy discovery now accepts optional SearchDb instance for faster searches
[13.16.0] - 2026-03-27
Changed
- Updated tab replacement in editor text sanitization to respect configured tab width setting
[13.15.0] - 2026-03-23
Added
- Added
renderInlineMarkdown()function to render inline markdown (bold, italic, code, links, strikethrough) to styled strings
Fixed
- Fixed editor consuming user-rebound copy keys, preventing custom keybindings from working in the editor
[13.14.1] - 2026-03-21
Added
- Added Ctrl+_ as an additional default shortcut for undo
Fixed
- Ensured undo functionality respects user-configured keybindings
[13.12.0] - 2026-03-14
Added
- Added
moveToMessageStart()andmoveToMessageEnd()methods to move cursor to the beginning and end of the entire message
Fixed
- Fixed autocomplete to preserve
./prefix when completing relative file and directory paths - Fixed paste marker expansion to handle special regex replacement tokens ($1, $2,
&,$, $`, $') literally in pasted content
[13.11.0] - 2026-03-12
Fixed
- Fixed OSC 11 background color detection to correctly handle partial escape sequences that arrive mid-buffer, preventing user input from being swallowed
- Fixed race condition where overlapping OSC 11 queries would be incorrectly cancelled by DA1 sentinels from previous queries
[13.7.5] - 2026-03-04
Changed
- Extracted word navigation logic into reusable
moveWordLeftandmoveWordRightutility functions for consistent cursor movement across components
[13.6.2] - 2026-03-03
Fixed
- Fixed cursor positioning when content shrinks to empty without clearOnShrink enabled
[13.5.4] - 2026-03-01
Fixed
- Fixed viewport repaint scrollback accounting during resize oscillation to avoid double-scrolling on height shrink and added exact-row scrollback assertions in overlay regression coverage (#228, #234)
[13.5.3] - 2026-03-01
Fixed
- Fixed append rendering logic to correctly handle offscreen header changes during content overflow growth, preserving scroll history integrity
- Fixed visible tail line updates when appending new content during viewport overflow conditions
- Fixed cursor positioning instability when appending content under external cursor relocation by using absolute screen addressing instead of relative cursor movement
[13.5.2] - 2026-03-01
Breaking Changes
- Removed
getMermaidImagecallback from MarkdownTheme; replaced withgetMermaidAsciithat accepts ASCII string instead of image data - Removed mermaid module exports (
renderMermaidToPng,extractMermaidBlocks,prerenderMermaidBlocks,MermaidImageinterface)
Changed
- Mermaid diagrams now render as ASCII text instead of terminal graphics protocol images
[13.5.1] - 2026-03-01
Fixed
- Fixed viewport shift handling to prevent stale content when mixed updates remap screen rows
[13.5.0] - 2026-03-01
Breaking Changes
- Removed
PI_TUI_RESIZE_CLEAR_STRATEGY; resize behavior is no longer configurable between viewport/scrollback modes. The renderer now uses fixed semantics: width changes perform a hard reset (3J+ full content rewrite), while height changes and diff fallbacks use viewport-scoped repainting.
Added
- Added a new terminal regression suite in
packages/tui/test/render-regressions.test.tscovering no-op render stability, targeted middle-line diffs, shrink cleanup, width-resize truncation without ghost rows, shrink/grow viewport tail anchoring, scrollback deduplication across forced redraws, overlay restore behavior, and rapid mutation convergence. - Expanded
packages/tui/test/overlay-scroll.test.tswith stress coverage for overflow shrink/regrow cycles, resize oscillation, overlay toggle churn, no-op render loops, and hardware-cursor-only updates while bounding scrollback growth and blank-run artifacts.
Changed
- Refactored render orchestration to explicit
hardResetandviewportRepaintpaths, with targeted fallbacks for offscreen diff ranges and unsafe row deltas. - Switched startup to
requestRender(true)so the first frame always initializes renderer state with a forced full path. - Replaced legacy viewport bookkeeping (
previousViewportTop) withviewportTopRowtracking and consistent screen-relative cursor calculations. - Updated stop-sequence cursor placement to target the visible working area and clamp to terminal bounds before final newline emission.
- Documented the intentional performance policy of not forcing full repaint on every viewport-top shift, relying on narrower safety guards instead.
Fixed
- Fixed stale/duplicated terminal cursor dedup state by synchronizing
#lastCursorSequencein all render write paths (hard reset, viewport repaint, deleted-lines clear path, append fast path, and differential path). - Fixed scroll overshoot on
stop()when content fills the viewport by clamping target row movement to valid screen rows.
[13.4.0] - 2026-03-01
Added
- Added
PI_TUI_RESIZE_CLEAR_STRATEGYenvironment variable to control terminal behavior on resize:viewport(default) clears/redraws the viewport while preserving scrollback, orscrollbackclears all history
Changed
- Changed resize redraw behavior to use configurable clear semantics (
viewportvsscrollback) while keeping full content rendering for scrollback navigation
Fixed
- Fixed loader component rendering lines wider than terminal width, preventing text overflow and display artifacts
[13.3.11] - 2026-02-28
Fixed
- Restored terminal image protocol override and fallback detection for image rendering, including
PI_FORCE_IMAGE_PROTOCOLsupport and Kitty fallback for screen/tmux/ghostty-style TERM environments.
[13.3.8] - 2026-02-28
Breaking Changes
- Changed mermaid hash type from string to bigint in
getMermaidImagecallback andextractMermaidBlocksreturn type - Removed
mime-typesand@types/mime-typesfrom dependencies - Removed
@xterm/xtermfrom dependencies
Changed
- Updated mermaid hash computation to use
Bun.hash.xxHash64()instead ofBun.hash().toString(16)
[12.19.0] - 2026-02-22
Added
- Added
getTopBorderAvailableWidth()method to calculate available width for top border content accounting for border characters and padding
Fixed
- Fixed stale viewport rows appearing when terminal height increases by triggering full re-render on height changes
[12.18.0] - 2026-02-21
Fixed
- Fixed viewport synchronization issue by clearing scrollback when terminal state becomes desynced during full re-renders
[12.12.2] - 2026-02-19
Fixed
- Fixed non-forced full re-renders clearing terminal scrollback history during streaming updates by limiting scrollback clears to explicit forced re-renders.
[12.12.0] - 2026-02-19
Added
- Added PageUp/PageDown navigation for editor content and autocomplete selection to jump across long wrapped inputs faster.
Fixed
- Fixed history-entry navigation anchoring (Up opens at top, Down opens at bottom) and preserved editor scroll context when max-height changes to keep cursor movement visible in long prompts (#99).
[12.11.3] - 2026-02-19
Fixed
- Fixed differential deleted-line rendering when content shrinks to empty so stale first-row content is cleared reliably.
- Fixed incremental stale-row clearing to use erase-below semantics in synchronized output, reducing leftover-line artifacts after shrink operations.
[12.9.0] - 2026-02-17
Added
- Exported
getTerminalId()function to get a stable identifier for the current terminal, with support for TTY device paths and terminal multiplexers - Exported
getTtyPath()function to resolve the TTY device path for stdin via POSIXttyname(3)
[12.5.0] - 2026-02-15
Added
- Added
cursorOverrideandcursorOverrideWidthproperties to customize the end-of-text cursor glyph with ANSI-styled strings - Added
getUseTerminalCursor()method to query the terminal cursor mode setting
[11.10.0] - 2026-02-10
Added
- Added
hintproperty to autocomplete items to display dim ghost text after cursor when item is selected - Added
getInlineHint()method toSlashCommandinterface for providing inline hint text based on argument state - Added
getInlineHint()method toAutocompleteProviderinterface for displaying dim ghost text after cursor - Added
hintStyletheme option to customize styling of inline hint/ghost text in editor
Changed
- Updated editor to render inline hint text as dim ghost text after cursor when autocomplete suggestions are active or provider supplies hints
[11.8.0] - 2026-02-10
Added
- Added Alt+Y keybinding to cycle through kill ring entries (yank-pop)
- Added undo support to Input component with Ctrl+Z keybinding
- Added kill ring support to Input component for Emacs-style kill/yank operations
- Added yank (Ctrl+Y) and yank-pop (Alt+Y) support to Input component
Changed
- Changed Editor kill ring implementation to use dedicated KillRing class for better state management
- Changed Editor undo stack to use generic UndoStack class with automatic state cloning
- Changed kill/yank behavior to properly accumulate consecutive kill operations
- Changed Input component deletion methods to record killed text in kill ring
- Changed undo coalescing in Input component to group consecutive word typing into single undo units
[11.4.1] - 2026-02-06
Fixed
- Fixed terminal scrolling when displaying overlays after rendering large content, preventing hundreds of blank lines from being output
[11.3.0] - 2026-02-06
Breaking Changes
- Removed
getCursorPosition()method from Component interface and implementations, eliminating hardware cursor positioning support
Added
- Added sticky column behavior for vertical cursor movement, preserving target column when navigating through lines of varying lengths
- Added
drainInput()method to Terminal interface to prevent Kitty key release events from leaking to parent shell over slow SSH connections - Added
setClearOnShrink()method to control whether full re-render occurs when content shrinks below working area - Added support for hidden paths (e.g.,
.pi,.github) in autocomplete while excluding.gitdirectories
Changed
- Changed default value of
PI_HARDWARE_CURSORenvironment variable from implicit true to explicit"1"for clarity - Changed default value of
PI_CLEAR_ON_SHRINKenvironment variable from implicit false to explicit"0"for clarity - Changed TUI to clear screen on startup to prevent shell prompts and status messages from bleeding into the first rendered frame
- Refactored full-render logic into reusable helper function to reduce code duplication across multiple render paths
- Changed autocomplete to include hidden paths but filter out
.gitand its contents - Changed Input component to properly handle surrogate pairs in Unicode text, preventing cursor display corruption with emoji and multi-byte characters
- Changed Editor to use
setCursorCol()for all cursor column updates, enabling sticky column tracking - Changed Editor's vertical navigation to implement sticky column logic via
moveToVisualLine()andcomputeVerticalMoveColumn() - Changed Editor's Enter key handling to extract submit logic into
submitValue()method for better code organization - Changed SettingsList to truncate long lines to viewport width, preventing text overflow
- Changed Terminal's
stop()method to drain stdin before restoring raw mode, fixing race condition where Ctrl+D could close parent shell over SSH - Changed TUI rendering to add
clearOnShrinkoption (controlled byPI_CLEAR_ON_SHRINKenv var) for reducing redraws on slower terminals - Changed TUI rendering to detect when extra lines exceed viewport height and trigger full re-render instead of incremental updates
Fixed
- Fixed rendering of extra blank lines when content shrinks by improving cursor positioning logic during line deletion
- Fixed cursor display position in Input component when scrolling horizontally through long text
- Fixed Kitty keyboard protocol disable sequence to use safe write method, preventing potential output buffering issues
- Fixed unnecessary full-screen redraws when changes occur in out-of-view components (e.g., spinners), reducing terminal scroll events and improving performance on slower connections
- Fixed scrollback clearing behavior to only clear screen instead of scrollback when resizing or shrinking content, preventing loss of terminal history
- Fixed
.gitdirectory appearing in autocomplete suggestions when filtering by prefix - Fixed cursor position corruption in Input component when displaying text with emoji and combining characters
- Fixed
.gitdirectory appearing in autocomplete suggestions - Fixed race condition where Kitty key release events could leak to parent shell after TUI exit over slow SSH connections
- Fixed Editor's word movement (Ctrl+Left/Right) to properly reset sticky column for subsequent vertical navigation
- Fixed Editor's undo operation to reset sticky column state when restoring cursor position
- Fixed Editor's right arrow key at end of last line to set sticky column for subsequent up/down navigation
- Fixed TUI rendering to correctly detect viewport changes and avoid false full-redraws after content shrinks
- Fixed Kitty protocol key parsing to prefer codepoint over base layout for Latin letters and symbols, fixing keyboard layout issues (e.g., Dvorak)
[11.0.0] - 2026-02-05
Added
- Introduced
terminal-capabilities.tsmodule consolidating terminal detection and image protocol support - Added
TerminalInfoclass with methods for detecting image lines and formatting notifications - Added
NotifyProtocolenum supporting Bell, OSC 99, and OSC 9 notification protocols - Added
isNotificationSuppressed()function to checkOMP_NOTIFICATIONSenvironment variable - Added
TERMINALconstant providing detected terminal capabilities at runtime
Changed
- Changed notification suppression environment variable from
OMP_NOTIFICATIONStoPI_NOTIFICATIONS - Changed TUI write log environment variable from
OMP_TUI_WRITE_LOGtoPI_TUI_WRITE_LOG - Changed hardware cursor environment variable from
OMP_HARDWARE_CURSORtoPI_HARDWARE_CURSOR - Updated environment variable access to use
getEnv()utility function from@oh-my-pi/pi-utilsfor consistent handling - Renamed
TERMINAL_INFOexport toTERMINALfor clearer API semantics - Reorganized terminal image exports from
terminal-imagetoterminal-capabilitiesmodule - Updated all internal references to use
TERMINALinstead ofTERMINAL_INFO
Removed
- Removed
terminal-imagemodule exports from public API (functionality migrated toterminal-capabilities)
[10.5.0] - 2026-02-04
Fixed
- Treated inline image lines with cursor-move prefixes as image sequences to prevent width overflow crashes
[9.8.0] - 2026-02-01
Changed
- Moved
wrapTextWithAnsiexport to@oh-my-pi/pi-nativespackage
Fixed
- Improved Kitty terminal key sequence parsing to correctly handle text field codepoints in CSI-u sequences
- Fixed handling of private use Unicode codepoints (U+E000 to U+F8FF) in Kitty key decoding to prevent invalid character interpretation
[9.7.0] - 2026-02-01
Breaking Changes
- Removed
Keyhelper object from public API; use string literals like"ctrl+c"instead ofKey.ctrl("c") - Removed
KeyEventTypeexport from public API
Changed
- Migrated key parsing and matching logic to native implementation for improved performance
- Simplified
isKeyRelease()andisKeyRepeat()to use regex pattern matching instead of string inclusion checks
[9.6.2] - 2026-02-01
Changed
- Renamed
EllipsisKindenum toEllipsisfor clearer API naming - Changed hardcoded ellipsis character from theme-configurable to literal "…" in editor truncation
- Refactored
visibleWidthfunction to use caching wrapper around newvisibleWidthRawimplementation for improved performance
Removed
- Removed
truncateToWidth,sliceWithWidth, andextractSegmentsfunctions from public API (now re-exported directly from @oh-my-pi/pi-natives) - Removed
ellipsisproperty fromSymbolThemeinterface - Removed
extractAnsiCodefunction from public API
[9.6.1] - 2026-02-01
Changed
- Improved performance of key ID parsing with optimized cache lookup strategy
- Simplified
visibleWidthcalculation to use consistent Bun.stringWidth approach for all string lengths
Removed
- Removed
visibleWidthbenchmark file in favor of Kitty sequence benchmarking
[9.5.0] - 2026-02-01
Changed
- Improved fuzzy file search performance by using native implementation instead of spawning external process
- Replaced external
fdbinary with native fuzzy path search for@-prefixed autocomplete
[9.4.0] - 2026-01-31
Added
- Exported
paddingutility function for creating space-padded strings efficiently
Changed
- Optimized padding operations across all components to use pre-allocated space buffer for better performance
[9.2.2] - 2026-01-31
Added
- Added setAutocompleteMaxVisible() configuration (3-20 items)
- Added image detection to terminal capabilities (containsImage method)
- Added stdin monitoring to detect stalled input events and log warnings
Changed
- Improved blockquote rendering with text wrapping in Markdown component
- Restructured terminal capabilities from interface-based to class-based model
- Improved table column width calculation with word-aware wrapping
- Refactored text utilities to use native WASM implementations for strings >256 chars with JS fast path
Fixed
- Simplified terminal write error handling to mark terminal as dead on any write failure
- Fixed multi-line strings in renderOutputBlock causing width overflow
- Fixed slash command autocomplete applying stale completion when typing quickly
Removed
- Removed TUI layout engine exports from public API (BoxNode, ColumnNode, LayoutNode, etc.)
[8.12.7] - 2026-01-29
Fixed
- Fixed slash command autocomplete applying stale completion when typing quickly
[8.4.1] - 2026-01-25
Added
- Added fuzzy match function for autocomplete suggestions
[8.4.0] - 2026-01-25
Changed
- Added Ctrl+Backspace as a delete-word-backward keybinding and improved modified backspace matching
Fixed
- Terminal gracefully handles write failures by marking dead instead of exiting the process
- Reserved cursor space for zero padding and corrected end-of-line cursor rendering to prevent wrap glitches
- Corrected editor end-of-line cursor rendering assertion to use includes() instead of endsWith()
[8.2.0] - 2026-01-24
Added
- Added mermaid diagram rendering engine (renderMermaidToPng) with mmdc CLI integration
- Added terminal graphics encoding (iTerm2/Kitty) for mermaid diagrams with automatic width scaling
- Added mermaid block extraction and deduplication utilities (extractMermaidBlocks)
Changed
- Updated TypeScript configuration for better publish-time configuration handling with tsconfig.publish.json
- Migrated file system operations from synchronous to asynchronous APIs in autocomplete provider for non-blocking I/O
- Migrated node module imports from named to namespace imports across all packages for consistency with project guidelines
Fixed
- Fixed crash when terminal becomes unavailable (EIO errors) by exiting gracefully instead of throwing
- Fixed potential errors during emergency terminal restore when terminal is already dead
- Fixed autocomplete race condition by tracking request ID to prevent stale suggestion results
[6.8.3] - 2026-01-21
Added
- Added undo support in the editor via
Ctrl+- - Added
Alt+Deleteas a delete-word-forward shortcut - Added configurable code block indentation for Markdown rendering
- Added undo support in the editor via
Ctrl+-. - Added configurable code block indentation for Markdown rendering.
- Added
Alt+Deleteas a delete-word-forward shortcut.
Changed
- Improved fuzzy matching to handle alphanumeric swaps
- Normalized keybinding definitions to lowercase internally
- Improved fuzzy matching to handle alphanumeric swaps.
- Normalized keybinding definitions to lowercase internally.
Fixed
- Added legacy terminal support for
Ctrl+symbol key combinations - Added legacy terminal support for
Ctrl+symbol key combinations.
[6.8.1] - 2026-01-20
Fixed
- Fixed viewport tracking after partial renders to prevent autocomplete list artifacts
[5.6.7] - 2026-01-18
Added
- Added configurable editor padding via
editorPaddingXtheme option - Added
setMaxHeight()method to limit editor height with scrolling - Added Emacs-style kill ring for text deletion operations
- Added
Alt+Dkeybinding to delete words forward - Added
Ctrl+Ykeybinding to yank from kill ring - Added
waitForRender()method to await pending renders - Added Focusable interface and hardware cursor marker support for IME positioning
- Added support for shifted symbol keys in keybindings
Changed
- Updated tab bar rendering to wrap text across multiple lines when content exceeds available width
- Expanded Kitty keyboard protocol coverage for non-Latin layouts and legacy Alt sequences
- Improved cursor positioning with safer bounds checking
- Updated editor layout to respect configurable padding
- Refactored scrolling logic for better viewport management
Fixed
- Fixed key detection for shifted symbol characters
- Fixed backspace handling with additional codepoint support
- Fixed Alt+letter key combinations for better recognition
[5.3.1] - 2026-01-15
Fixed
- Fixed rendering issues on Windows by preventing re-entrant renders
[5.1.0] - 2026-01-14
Added
- Added
pageUpandpageDownkey support withselectPageUp/selectPageDowneditor actions - Added
isPageUp()andisPageDown()helper functions - Added
SizeValuetype for CSS-like overlay sizing (absolute or percentage strings like"50%") - Added
OverlayHandleinterface withhide(),setHidden(),isHidden()methods for overlay visibility control - Added
visiblecallback toOverlayOptionsfor dynamic visibility based on terminal dimensions - Added
padparameter totruncateToWidth()for padding result with spaces to exact width
Changed
- Changed
OverlayOptionsto useSizeValuetype forwidth,maxHeight,row, andcolproperties - Changed
showOverlay()to returnOverlayHandlefor controlling overlay visibility - Removed
widthPercent,maxHeightPercent,rowPercent,colPercentfromOverlayOptions(use percentage strings instead)
Fixed
- Fixed numbered list items showing "1." for all items when code blocks break list continuity
- Fixed width overflow protection in overlay compositing to prevent TUI crashes
[4.7.0] - 2026-01-12
Fixed
- Remove trailing space padding from Text, Markdown, and TruncatedText components when no background color is set (fixes copied text including unwanted whitespace)
[4.6.0] - 2026-01-12
Added
- Add fuzzy matching module (
fuzzyMatch,fuzzyFilter) for command autocomplete - Add
getExpandedText()to editor for expanding paste markers - Add backslash+enter newline fallback for terminals without Kitty protocol
Fixed
- Remove Kitty protocol query timeout that caused shift+enter delays
- Add bracketed paste check to prevent false key release/repeat detection
- Rendering optimizations: only re-render changed lines
- Refactor input component to use keybindings manager
[4.4.4] - 2026-01-11
Fixed
- Fixed Ctrl+Enter sequences to insert new lines in the editor
[4.2.1] - 2026-01-11
Changed
- Improved file autocomplete to show directory listing when typing
@with no query, and fall back to prefix matching when fuzzy search returns no results
Fixed
- Fixed editor redraw glitch when canceling autocomplete suggestions
- Fixed
fdtool detection to automatically findfdorfdfindin PATH when not explicitly configured
[4.1.0] - 2026-01-10
Added
- Added persistent prompt history storage support via
setHistoryStorage()method, allowing history to be saved and restored across sessions
[4.0.0] - 2026-01-10
Added
EditorComponentinterface for custom editor implementationsStdinBufferclass to split batched stdin into individual sequences- Overlay compositing via
TUI.showOverlay()andTUI.hideOverlay()forctx.ui.custom()with{ overlay: true } - Kitty keyboard protocol flag 2 support for key release events (
isKeyRelease(),isKeyRepeat(),KeyEventType) setKittyProtocolActive(),isKittyProtocolActive()for Kitty protocol state managementkittyProtocolActiveproperty on Terminal interface to query Kitty protocol stateComponent.wantsKeyReleaseproperty to opt-in to key release events (default false)- Input component
onEscapecallback for handling escape key presses
Changed
- Terminal startup now queries Kitty protocol support before enabling event reporting
- Default editor
newLinebinding now usesshift+enteronly
Fixed
- Key presses no longer dropped when batched with other events over SSH
- TUI now filters out key release events by default, preventing double-processing of keys
matchesKey()now correctly matches Kitty protocol sequences for unmodified letter keys- Crash when pasting text with trailing whitespace exceeding terminal width through Markdown rendering
[3.32.0] - 2026-01-08
Fixed
- Fixed text wrapping allowing long whitespace tokens to exceed line width
[3.20.0] - 2026-01-06
Added
- Added
isCapsLockhelper function for detecting Caps Lock key press via Kitty protocol - Added
isCtrlYhelper function for detecting Ctrl+Y keyboard input - Added configurable editor keybindings with typed key identifiers and action matching
- Added word-wrapped editor rendering for long lines
Changed
- Settings list descriptions now wrap to the available width instead of truncating
Fixed
- Fixed Shift+Enter detection in legacy terminals that send ESC+CR sequence
[3.15.1] - 2026-01-05
Fixed
- Fixed editor cursor blinking by allowing terminal cursor positioning when enabled.
[3.15.0] - 2026-01-05
Added
- Added
inputCursorsymbol for customizing the text input cursor character - Added
symbolsproperty toEditorTheme,MarkdownTheme, andSelectListThemeinterfaces for component-level symbol customization - Added
SymbolThemeinterface for customizing UI symbols including cursors, borders, spinners, and box-drawing characters - Added support for custom spinner frames in the Loader component
[3.9.1337] - 2026-01-04
Added
- Added
setTopBorder()method to Editor component for displaying custom status content in the top border - Added
getWidth()method to TUI class for retrieving terminal width - Added rounded corner box-drawing characters to Editor component borders
Changed
- Changed Editor component to use proper box borders with vertical side borders instead of horizontal-only borders
- Changed cursor style from block to thin blinking bar (▏) at end of line
[1.500.0] - 2026-01-03
Added
- Added
getText()method to Text component for retrieving current text content
[1.337.1] - 2026-01-02
Added
- TabBar component for horizontal tab navigation
- Emergency terminal restore to prevent corrupted state on crashes
- Overhauled UI with welcome screen and powerline footer
- Theme-configurable HTML export colors
ctx.ui.themegetter for styling status text with theme colors
Changed
- Forked to @oh-my-pi scope with unified versioning across all packages
Fixed
- Strip OSC 8 hyperlink sequences in
visibleWidth() - Crash on Unicode format characters in
visibleWidth() - Markdown code block syntax highlighting
[1.337.0] - 2026-01-02
Initial release under @oh-my-pi scope. See previous releases at badlogic/pi-mono.
[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.onDebugcallback 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)