omk-tui 0.98.2 → 0.98.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,993 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ ## [0.98.4] - 2026-09-10
6
+
7
+ ### Added
8
+
9
+ - Added host-controlled Markdown link/file-link resolution hooks, preserving plain-text fallback when links are unavailable and refusing control characters in hyperlink destinations.
10
+
11
+ ## [0.98.3] - 2026-09-06
12
+
13
+ ## [0.98.2] - 2026-09-02
14
+
15
+ ## [0.98.1] - 2026-08-30
16
+
17
+ ## [0.98.0] - 2026-08-28
18
+
19
+ ### Fixed
20
+
21
+ - Clearing redraws repaint the visible screen in place instead of emitting `\x1b[2J`. conpty/Windows Terminal implement Erase All by shifting the whole viewport into scrollback ([microsoft/terminal#5683](https://github.com/microsoft/terminal/pull/5683)), so on WSL every resize, viewport jump, or repair redraw buried a copy of the live frame — prompt box, footer, loader — in the user's history; scrolling back through a finished answer kept hitting stale prompt boxes that chopped it apart. The repaint now homes the cursor, erases each row as it rewrites it, and erases what a taller previous frame left behind.
22
+ - Bounded the repair repaint for content that changes above the viewport. One changed row re-emitted every row from there to the end of the transcript, and because each re-emitted row evicts an older row from the terminal's finite scrollback, a late tool result or a re-rendered earlier prompt box pushed the beginning of a long report out of scrollback — the report looked truncated when scrolling back. The repaint now reaches at most four viewport screens above the tail; rows older than that keep their existing copy instead of costing the transcript.
23
+
24
+ ## [0.97.0] - 2026-08-24
25
+
26
+ ### Fixed
27
+
28
+ - Fixed above-viewport content changes never reaching the terminal: clearing redraws repainted only the visible tail, so a row that had already scrolled into scrollback kept its stale content forever (clipped assistant answers, phantom loaders when scrolling). Clearing redraws triggered by content changes now reprint from the first changed row; resize/viewport jumps keep the tail-only behavior that prevents TV-wall stacking.
29
+
30
+ ## [0.96.2] - 2026-08-21
31
+
32
+ ### Fixed
33
+
34
+ - Clearing redraws repaint only the visible tail, preventing duplicate history from accumulating in scrollback during terminal resize cycles.
35
+
36
+ ## [0.96.1] - 2026-08-20
37
+
38
+ ### Notes
39
+
40
+ - Version lockstep with `open-multi-agent-kit@0.96.1`; no functional changes in this package.
41
+
42
+ ## [0.96.0] - 2026-08-16
43
+
44
+ ## [0.95.2] - 2026-08-15
45
+
46
+ ## [0.95.1] - 2026-08-01
47
+
48
+ ## [0.95.0] - 2026-07-31
49
+
50
+ ## [0.94.1] - 2026-07-27
51
+
52
+ ## [0.94.0] - 2026-07-27
53
+
54
+ ## [0.93.0] - 2026-07-26
55
+
56
+ ## [0.92.0] - 2026-07-23
57
+
58
+ ## [0.91.0] - 2026-07-21
59
+
60
+ ### Notes
61
+
62
+ - Version lockstep with `open-multi-agent-kit@0.91.0`; no functional changes in this package.
63
+
64
+ ## [0.90.8] - 2026-07-13
65
+
66
+ ## [0.90.7] - 2026-07-11
67
+
68
+ ### Added
69
+
70
+ - Bare first-token skill autocomplete: typing a skill name at the start of the message (without `!` or `/`) shows the skill launcher list and inserts `!skill:name` on select.
71
+ - Mid-message `/` skill autocomplete: typing `/skill…` after whitespace lists skills (short names, not only `skill:`), and selecting rewrites the message to start with `!skill:name` so submit expands the skill. Leading `/` also matches short skill names (e.g. `/frontend` → `/skill:frontend`).
72
+
73
+ ### Fixed
74
+
75
+ - Fixed vertical cursor movement to track display cells instead of UTF-16 offsets, so wrapped lines containing wide CJK (e.g. Korean) text no longer drift the cursor column on up/down navigation.
76
+ - Fixed `wordWrapLine` to keep an indivisible wide grapheme whole when it exceeds the wrap width (e.g. a CJK character at width 1) instead of recursing until stack overflow.
77
+ - Fixed npm trusted-publishing identity after the GitHub repository rename by aligning package metadata with `dmae97/omk`.
78
+
79
+ ## [0.90.6] - 2026-07-09
80
+
81
+ ## [0.90.5] - 2026-07-07
82
+
83
+ ## [0.90.4] - 2026-07-04
84
+
85
+ ### Added
86
+
87
+ - Added an `!omk` entry to bang autocomplete when the OMK hub skill index (`omk-skills`) is available, routing operators toward OMK role hubs from the TUI.
88
+
89
+ ## [0.90.3] - 2026-07-02
90
+
91
+ ## [0.90.2] - 2026-07-02
92
+
93
+ ### Added
94
+
95
+ - Added `!` skill autocomplete insertion for `!skill:name` launcher suggestions.
96
+
97
+ ## [0.90.1] - 2026-06-28
98
+
99
+ ### Changed
100
+
101
+ - Changed package metadata and lockstep release documentation to the standalone `omk-tui` package line used by OMK releases.
102
+
103
+ ## [0.80.8] - 2026-06-27
104
+
105
+ ### Breaking Changes
106
+
107
+ - Renamed the npm package from `@earendil-works/pi-tui` to `omk-tui` and updated package metadata to the OMK repository.
108
+
109
+ ### Changed
110
+
111
+ - Changed release metadata to lockstep OMK publishable packages at v0.80.8.
112
+
113
+ ### Fixed
114
+
115
+ - Fixed tab width accounting in column slicing and overlay compositing so tab-containing output cannot exceed the terminal width ([#5218](https://github.com/earendil-works/pi/issues/5218)).
116
+
117
+ ## [0.78.0] - 2026-05-29
118
+
119
+ ### Fixed
120
+
121
+ - Fixed ANSI text wrapping to avoid stack overflows on very long wrapped lines ([#5185](https://github.com/earendil-works/pi-mono/issues/5185)).
122
+ - Clarified the IME hardware cursor docs to state that cursor visibility remains opt-in ([#5200](https://github.com/earendil-works/pi-mono/issues/5200)).
123
+ - Fixed OSC 8 hyperlinks to pass through tmux when the client supports them ([#5189](https://github.com/earendil-works/pi-mono/pull/5189) by [@mpazik](https://github.com/mpazik)).
124
+
125
+ ## [0.77.0] - 2026-05-28
126
+
127
+ ### Fixed
128
+
129
+ - Fixed keyboard protocol negotiation to ignore mismatched or delayed terminal responses, avoiding false Kitty keyboard protocol detection ([#5091](https://github.com/earendil-works/pi/pull/5091) by [@mitsuhiko](https://github.com/mitsuhiko)).
130
+
131
+ ## [0.76.0] - 2026-05-27
132
+
133
+ ### Added
134
+
135
+ - Added an opt-in Markdown renderer option to preserve source ordered-list markers for transcript rendering ([#5013](https://github.com/earendil-works/pi/issues/5013)).
136
+
137
+ ### Fixed
138
+
139
+ - Fixed `Shift+Enter` in Apple Terminal by detecting local macOS modifier state when Terminal.app sends plain Return.
140
+ - Fixed Windows Terminal capability detection to enable OSC 8 hyperlinks, preserving clickable long URLs across wrapped lines ([#4923](https://github.com/earendil-works/pi/issues/4923)).
141
+ - Fixed JetBrains terminal capability detection to enable truecolor while disabling unsupported OSC 8 hyperlinks ([#5037](https://github.com/earendil-works/pi-mono/pull/5037) by [@Perlence](https://github.com/Perlence)).
142
+ - Fixed editor and input word navigation/deletion to use Unicode word boundaries while preserving ASCII punctuation boundaries ([#5022](https://github.com/earendil-works/pi-mono/pull/5022) by [@haoqixu](https://github.com/haoqixu), [#5067](https://github.com/earendil-works/pi-mono/pull/5067) by [@haoqixu](https://github.com/haoqixu), [#5068](https://github.com/earendil-works/pi-mono/pull/5068) by [@haoqixu](https://github.com/haoqixu)).
143
+
144
+ ## [0.75.5] - 2026-05-23
145
+
146
+ ### Changed
147
+
148
+ - Replaced the optional `koffi` dependency for Windows VT input with a tiny vendored native helper, reducing install size while preserving Shift+Tab handling ([#4480](https://github.com/earendil-works/pi/issues/4480)).
149
+
150
+ ## [0.75.4] - 2026-05-20
151
+
152
+ ### Changed
153
+
154
+ - Removed the package-level development watch script now that the root TypeScript check validates strip-only-compatible sources.
155
+
156
+ ### Fixed
157
+
158
+ - Fixed loader initialization so indicator startup cannot run before frames are initialized.
159
+ - Fixed truecolor capability detection to align terminal image rendering with the interactive theme detector.
160
+
161
+ ## [0.75.3] - 2026-05-18
162
+
163
+ ## [0.75.2] - 2026-05-18
164
+
165
+ ## [0.75.1] - 2026-05-18
166
+
167
+ ## [0.75.0] - 2026-05-17
168
+
169
+ ### Breaking Changes
170
+
171
+ - Raised the minimum supported Node.js version to 22.19.0.
172
+
173
+ ## [0.74.1] - 2026-05-16
174
+
175
+ ### Added
176
+
177
+ - Added markdown list-item wrapping that preserves indentation for wrapped continuation lines ([#4327](https://github.com/earendil-works/pi-mono/pull/4327) by [@Perlence](https://github.com/Perlence)).
178
+
179
+ ### Fixed
180
+
181
+ - Fixed markdown task-list checkbox rendering ([#4379](https://github.com/earendil-works/pi-mono/pull/4379) by [@Perlence](https://github.com/Perlence)).
182
+ - Fixed markdown rendering robustness for very large markdown files ([#4463](https://github.com/earendil-works/pi-mono/pull/4463) by [@ndanielherrera](https://github.com/ndanielherrera)).
183
+ - Fixed Kitty image placement when the viewport is shorter than the rendered image ([#4461](https://github.com/earendil-works/pi-mono/pull/4461) by [@xu0o0](https://github.com/xu0o0)).
184
+ - Fixed WezTerm Kitty keyboard protocol edge cases so escape handling remains correct ([#4482](https://github.com/earendil-works/pi-mono/pull/4482) by [@Felixoid](https://github.com/Felixoid)).
185
+ - Fixed inline image rendering to cap portrait images by height instead of always scaling them to the configured maximum width.
186
+
187
+ ## [0.74.0] - 2026-05-07
188
+
189
+ ## [0.73.1] - 2026-05-07
190
+
191
+ ### Fixed
192
+
193
+ - Fixed wrapped OSC 8 hyperlinks to preserve BEL terminators so OAuth login URLs remain clickable on every wrapped line.
194
+ - Fixed Kitty inline image redraws to stay within TUI-owned terminal regions and avoid writing below the active viewport.
195
+ - Fixed Kitty inline image rendering by letting the terminal allocate image ids and bounding parsed image ids to valid values.
196
+ - Fixed inline image capability detection to disable inline images in cmux terminals.
197
+
198
+ ## [0.73.0] - 2026-05-04
199
+
200
+ ### Fixed
201
+
202
+ - Fixed fuzzy ranking to prioritize exact matches in selector and autocomplete results.
203
+
204
+ ## [0.72.1] - 2026-05-02
205
+
206
+ ## [0.72.0] - 2026-05-01
207
+
208
+ ## [0.71.1] - 2026-05-01
209
+
210
+ ## [0.71.0] - 2026-04-30
211
+
212
+ ### Fixed
213
+
214
+ - Fixed `ProcessTerminal` to fall back to `COLUMNS` and `LINES` before defaulting to 80x24 dimensions ([#4004](https://github.com/badlogic/pi-mono/issues/4004))
215
+ - Fixed editor rendering artifacts for Thai Sara Am and Lao AM vowel characters ([#3904](https://github.com/badlogic/pi-mono/issues/3904))
216
+
217
+ ## [0.70.6] - 2026-04-28
218
+
219
+ ## [0.70.5] - 2026-04-27
220
+
221
+ ## [0.70.4] - 2026-04-27
222
+
223
+ ## [0.70.3] - 2026-04-27
224
+
225
+ ### Fixed
226
+
227
+ - Fixed duplicate printable characters from Kitty keyboard protocol CSI-u plus raw character input on layouts such as Italian ([#3780](https://github.com/badlogic/pi-mono/issues/3780))
228
+
229
+ ## [0.70.2] - 2026-04-24
230
+
231
+ ## [0.70.1] - 2026-04-24
232
+
233
+ ### Fixed
234
+
235
+ - Fixed CSI-u Ctrl+letter decoding inside bracketed paste, so pasted modified-key escape sequences no longer become literal editor text ([#3623](https://github.com/badlogic/pi-mono/pull/3623) by [@Exrun94](https://github.com/Exrun94))
236
+
237
+ ## [0.70.0] - 2026-04-23
238
+
239
+ ### Fixed
240
+
241
+ - Kept OSC 9;4 terminal progress alive with periodic updates so Ghostty does not clear the indicator during long-running agent work ([#3610](https://github.com/badlogic/pi-mono/issues/3610))
242
+
243
+ ## [0.69.0] - 2026-04-22
244
+
245
+ ### Added
246
+
247
+ - Added `setProgress(active: boolean)` to the `Terminal` interface for OSC 9;4 progress indicator support
248
+ - Added generic stacked autocomplete support for extension wrappers via `AutocompleteProvider.shouldTriggerFileCompletion?()` and `#` as a natural autocomplete trigger alongside `@` ([#2983](https://github.com/badlogic/pi-mono/issues/2983))
249
+
250
+ ## [0.68.1] - 2026-04-22
251
+
252
+ ### Fixed
253
+
254
+ - Fixed `@` autocomplete fuzzy search to follow symlinked directories and include symlinked paths in results ([#3507](https://github.com/badlogic/pi-mono/issues/3507))
255
+
256
+ ## [0.68.0] - 2026-04-20
257
+
258
+ ### Added
259
+
260
+ - Added `LoaderIndicatorOptions` and `Loader.setIndicator()` support for custom loader frames and animation intervals, allowing TUI consumers to use animated, static, or hidden loader indicators ([#3413](https://github.com/badlogic/pi-mono/issues/3413))
261
+
262
+ ### Fixed
263
+
264
+ - Fixed `@` autocomplete fuzzy search to stop matching against the full base path for plain queries, so worktree or cwd paths containing the query text no longer crowd out real results such as `@plan` suggestions ([#2778](https://github.com/badlogic/pi-mono/issues/2778))
265
+ - Fixed xterm `modifyOtherKeys` printable input so shifted uppercase letters insert correctly in the editor and shifted letter bindings parse and match consistently ([#3436](https://github.com/badlogic/pi-mono/issues/3436))
266
+
267
+ ## [0.67.68] - 2026-04-17
268
+
269
+ ## [0.67.67] - 2026-04-17
270
+
271
+ ## [0.67.6] - 2026-04-16
272
+
273
+ ### Added
274
+
275
+ - Added OSC 8 hyperlink rendering for markdown links when the terminal advertises support. Introduces a public `hyperlink(text, url)` helper and a `setCapabilities()` test override in `packages/tui` ([#3248](https://github.com/badlogic/pi-mono/pull/3248) by [@ofa1](https://github.com/ofa1)).
276
+ - Added `argumentHint` to `SlashCommand` interface, displayed before the description in the autocomplete dropdown ([#2780](https://github.com/badlogic/pi-mono/pull/2780) by [@andresvi94](https://github.com/andresvi94))
277
+
278
+ ### Changed
279
+
280
+ - Tightened `detectCapabilities()` to default `hyperlinks: false` for unknown terminals and to force `hyperlinks: false` under tmux/screen (including nested sessions where the outer terminal would otherwise advertise OSC 8). Prevents markdown link URLs from disappearing on terminals that silently swallow OSC 8 sequences ([#3248](https://github.com/badlogic/pi-mono/pull/3248)).
281
+
282
+ ## [0.67.5] - 2026-04-16
283
+
284
+ ### Fixed
285
+
286
+ - Fixed Zellij `Shift+Enter` regressions by reverting the Zellij-specific Kitty keyboard query bypass and restoring the previous keyboard negotiation behavior ([#3259](https://github.com/badlogic/pi-mono/issues/3259))
287
+
288
+ ## [0.67.4] - 2026-04-16
289
+
290
+ ### Fixed
291
+
292
+ - Fixed markdown strikethrough parsing to require strict double-tilde delimiters (`~~text~~`) with non-whitespace boundaries, preventing accidental strikethrough from loose tilde usage.
293
+
294
+ ## [0.67.2] - 2026-04-14
295
+
296
+ ### Added
297
+
298
+ - Added full helper support for Kitty `super`-modified shortcuts, including combinations such as `super+k`, `super+enter`, and `ctrl+super+k` ([#2979](https://github.com/badlogic/pi-mono/issues/2979))
299
+
300
+ ### Fixed
301
+
302
+ - Fixed Ctrl+Alt letter key matching in tmux by falling through from legacy ESC-prefixed handling to CSI-u and xterm `modifyOtherKeys` parsing when the legacy form does not match ([#2989](https://github.com/badlogic/pi-mono/pull/2989) by [@kaofelix](https://github.com/kaofelix))
303
+
304
+ ## [0.67.1] - 2026-04-13
305
+
306
+ ## [0.67.0] - 2026-04-13
307
+
308
+ ### Fixed
309
+
310
+ - Fixed `Container.render()` stack overflow on long sessions by replacing `Array.push(...spread)` with a loop-based push, preventing `RangeError: Maximum call stack size exceeded` when child output exceeds the V8 call stack argument limit ([#2651](https://github.com/badlogic/pi-mono/issues/2651))
311
+ - Fixed editor sticky-column tracking around paste markers so vertical cursor navigation restores the column from before the cursor entered a paste marker instead of jumping inside or past pasted content ([#3092](https://github.com/badlogic/pi-mono/pull/3092) by [@Perlence](https://github.com/Perlence))
312
+ - Fixed TUI test suite failures caused by render throttle scheduling: added `VirtualTerminal.waitForRender()` helper that waits for the 16ms throttled render pipeline to settle before asserting viewport state ([#3076](https://github.com/badlogic/pi-mono/pull/3076) by [@aliou](https://github.com/aliou))
313
+
314
+ ## [0.66.1] - 2026-04-08
315
+
316
+ ## [0.66.0] - 2026-04-08
317
+
318
+ ## [0.65.2] - 2026-04-06
319
+
320
+ ### Fixed
321
+
322
+ - Fixed render scheduling under heavy streaming output by coalescing `requestRender()` calls to a 16ms frame budget while preserving immediate `requestRender(true)` behavior.
323
+
324
+ ## [0.65.1] - 2026-04-05
325
+
326
+ ## [0.65.0] - 2026-04-03
327
+
328
+ ### Fixed
329
+
330
+ - Fixed markdown H1 headings ending with inline code from leaking underline styling into trailing line padding
331
+ - Fixed slash-command argument autocomplete to await async `getArgumentCompletions()` results and ignore invalid return values, preventing crashes when extension commands provide asynchronous completions ([#2719](https://github.com/badlogic/pi-mono/issues/2719))
332
+ - Fixed non-capturing overlay padding from inflating scrollback and corrupting the viewport on terminal widen ([#2758](https://github.com/badlogic/pi-mono/pull/2758) by [@dotBeeps](https://github.com/dotBeeps))
333
+
334
+ ## [0.64.0] - 2026-03-29
335
+
336
+ ### Fixed
337
+
338
+ - Fixed TUI cell size response handling to consume only exact `CSI 6 ; height ; width t` replies, so bare `Escape` is no longer swallowed while waiting for terminal image metadata ([#2661](https://github.com/badlogic/pi-mono/issues/2661))
339
+ - Fixed Kitty keyboard protocol keypad functional keys to normalize to logical digits, symbols, and navigation keys, so numpad input in terminals such as iTerm2 no longer inserts Private Use Area gibberish or gets ignored ([#2650](https://github.com/badlogic/pi-mono/issues/2650))
340
+
341
+ ## [0.63.2] - 2026-03-29
342
+
343
+ ## [0.63.1] - 2026-03-27
344
+
345
+ ## [0.63.0] - 2026-03-27
346
+
347
+ ### Added
348
+
349
+ - Added support for `PI_TUI_WRITE_LOG` directory paths, creating a unique log file (`tui-<timestamp>-<pid>.log`) per instance for easier debugging of multiple pi sessions ([#2508](https://github.com/badlogic/pi-mono/pull/2508) by [@mrexodia](https://github.com/mrexodia))
350
+
351
+ ### Fixed
352
+
353
+ - Fixed blockquote text color breaking after inline links (and other inline elements) due to missing style restoration prefix
354
+ - Fixed slash-command Tab completion from immediately chaining into argument autocomplete after completing the command name, restoring flows like `/model` that submit into a selector dialog ([#2577](https://github.com/badlogic/pi-mono/issues/2577))
355
+ - Fixed stale content and incorrect viewport tracking after TUI content shrinks or transient components inflate the working area ([#2126](https://github.com/badlogic/pi-mono/pull/2126) by [@Perlence](https://github.com/Perlence))
356
+ - Fixed `@` autocomplete to debounce editor-triggered searches, cancel in-flight `fd` lookups cleanly, and keep suggestions visible while results refresh ([#1278](https://github.com/badlogic/pi-mono/issues/1278))
357
+
358
+ ## [0.62.0] - 2026-03-23
359
+
360
+ ### Fixed
361
+
362
+ - Fixed `truncateToWidth()` to stream truncation for very large strings, keep contiguous prefixes, and always terminate truncated SGR styling safely ([#2447](https://github.com/badlogic/pi-mono/issues/2447))
363
+ - Fixed markdown heading styling being lost after inline code spans within headings
364
+
365
+ ## [0.61.1] - 2026-03-20
366
+
367
+ ### Fixed
368
+
369
+ - Fixed shared keybinding resolution to stop user overrides from evicting unrelated default shortcuts such as selector confirm and editor cursor keys ([#2455](https://github.com/badlogic/pi-mono/issues/2455))
370
+ - Fixed Termux software keyboard height changes from forcing full-screen redraws and replaying TUI history on every toggle ([#2467](https://github.com/badlogic/pi-mono/issues/2467))
371
+
372
+ ## [0.61.0] - 2026-03-20
373
+
374
+ ### Breaking Changes
375
+
376
+ - Replaced the editor-only keybinding store with a single global keybindings manager in `@mariozechner/pi-tui`. TUI keybinding ids are now namespaced: `cursorUp` -> `tui.editor.cursorUp`, `cursorDown` -> `tui.editor.cursorDown`, `cursorLeft` -> `tui.editor.cursorLeft`, `cursorRight` -> `tui.editor.cursorRight`, `cursorWordLeft` -> `tui.editor.cursorWordLeft`, `cursorWordRight` -> `tui.editor.cursorWordRight`, `cursorLineStart` -> `tui.editor.cursorLineStart`, `cursorLineEnd` -> `tui.editor.cursorLineEnd`, `jumpForward` -> `tui.editor.jumpForward`, `jumpBackward` -> `tui.editor.jumpBackward`, `pageUp` -> `tui.editor.pageUp`, `pageDown` -> `tui.editor.pageDown`, `deleteCharBackward` -> `tui.editor.deleteCharBackward`, `deleteCharForward` -> `tui.editor.deleteCharForward`, `deleteWordBackward` -> `tui.editor.deleteWordBackward`, `deleteWordForward` -> `tui.editor.deleteWordForward`, `deleteToLineStart` -> `tui.editor.deleteToLineStart`, `deleteToLineEnd` -> `tui.editor.deleteToLineEnd`, `yank` -> `tui.editor.yank`, `yankPop` -> `tui.editor.yankPop`, `undo` -> `tui.editor.undo`, `newLine` -> `tui.input.newLine`, `submit` -> `tui.input.submit`, `tab` -> `tui.input.tab`, `copy` -> `tui.input.copy`, `selectUp` -> `tui.select.up`, `selectDown` -> `tui.select.down`, `selectPageUp` -> `tui.select.pageUp`, `selectPageDown` -> `tui.select.pageDown`, `selectConfirm` -> `tui.select.confirm`, `selectCancel` -> `tui.select.cancel`. `keybindings.json` stays backward compatible because each keybinding definition maps the new internal id back to the existing public config key. Apps extend `interface Keybindings` via declaration merging, create one manager with both TUI and app definitions, then install it with `setKeybindings(...)` ([#2391](https://github.com/badlogic/pi-mono/issues/2391))
377
+
378
+ ### Fixed
379
+
380
+ - Fixed user-defined keybindings to shadow conflicting default bindings across the shared registry, so app-level defaults no longer stay active when the same key is explicitly reassigned ([#2391](https://github.com/badlogic/pi-mono/issues/2391))
381
+
382
+ ## [0.60.0] - 2026-03-18
383
+
384
+ ### Fixed
385
+
386
+ - 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](https://github.com/badlogic/pi-mono/issues/2293))
387
+
388
+ ## [0.59.0] - 2026-03-17
389
+
390
+ ## [0.58.4] - 2026-03-16
391
+
392
+ ## [0.58.3] - 2026-03-15
393
+
394
+ ## [0.58.2] - 2026-03-15
395
+
396
+ ### Added
397
+
398
+ - Added configurable `SelectList` primary column sizing via `SelectListLayoutOptions`, including custom primary-label truncation hooks ([#2154](https://github.com/badlogic/pi-mono/pull/2154) by [@markusylisiurunen](https://github.com/markusylisiurunen))
399
+
400
+ ### Fixed
401
+
402
+ - Fixed stale scrollback remaining after full-screen redraws such as session switches by clearing the screen before wiping scrollback ([#2155](https://github.com/badlogic/pi-mono/pull/2155) by [@Perlence](https://github.com/Perlence))
403
+ - Fixed trailing blank lines after markdown block elements when they are followed immediately by the next block or end of document ([#2152](https://github.com/badlogic/pi-mono/pull/2152) by [@markusylisiurunen](https://github.com/markusylisiurunen))
404
+
405
+ ## [0.58.1] - 2026-03-14
406
+
407
+ ### Fixed
408
+
409
+ - Fixed Windows shell and path handling in autocomplete to properly handle drive letters and mixed path separators
410
+ - Fixed editor paste to preserve literal content instead of normalizing newlines, preventing content corruption for text with embedded escape sequences ([#2064](https://github.com/badlogic/pi-mono/issues/2064))
411
+ - Fixed tab completion to preserve `./` prefix when completing relative paths ([#2087](https://github.com/badlogic/pi-mono/issues/2087))
412
+ - 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](https://github.com/badlogic/pi-mono/issues/2139))
413
+
414
+ ## [0.58.0] - 2026-03-14
415
+
416
+ ### Added
417
+
418
+ - Added paste marker atomic segment handling in editor, treating paste markers as indivisible units during word wrapping and cursor navigation ([#2111](https://github.com/badlogic/pi-mono/pull/2111) by [@haoqixu](https://github.com/haoqixu))
419
+
420
+ ### Fixed
421
+
422
+ - 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](https://github.com/badlogic/pi-mono/issues/1982))
423
+ - 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`
424
+ - Fixed editor scroll indicator rendering crash in narrow terminal widths ([#2103](https://github.com/badlogic/pi-mono/pull/2103) by [@haoqixu](https://github.com/haoqixu))
425
+ - Fixed tab characters in editor `setText()` and input paths not being normalized to spaces ([#2027](https://github.com/badlogic/pi-mono/pull/2027) by [@haoqixu](https://github.com/haoqixu))
426
+ - Fixed `wordWrapLine` overflow when wide characters (CJK, fullwidth) fall exactly at the wrap boundary ([#2082](https://github.com/badlogic/pi-mono/pull/2082) by [@haoqixu](https://github.com/haoqixu))
427
+ - Fixed tab characters in `Input` paste not being normalized to spaces ([#1975](https://github.com/badlogic/pi-mono/pull/1975) by [@haoqixu](https://github.com/haoqixu))
428
+
429
+ ## [0.57.1] - 2026-03-07
430
+
431
+ ### Added
432
+
433
+ - Added `treeFoldOrUp` and `treeUnfoldOrDown` editor actions with default bindings for `Ctrl+←`/`Ctrl+→` and `Alt+←`/`Alt+→` ([#1724](https://github.com/badlogic/pi-mono/pull/1724) by [@Perlence](https://github.com/Perlence))
434
+ - Added digit keys (`0-9`) to the keybinding system, including Kitty CSI-u and xterm `modifyOtherKeys` support for bindings like `ctrl+1` ([#1905](https://github.com/badlogic/pi-mono/issues/1905))
435
+
436
+ ### Fixed
437
+
438
+ - 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](https://github.com/badlogic/pi-mono/pull/1931) by [@aliou](https://github.com/aliou))
439
+ - 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](https://github.com/badlogic/pi-mono/issues/1872))
440
+ - Fixed slash-command Tab completion to immediately open argument completions when available ([#1481](https://github.com/badlogic/pi-mono/pull/1481) by [@barapa](https://github.com/barapa))
441
+
442
+ ## [0.57.0] - 2026-03-07
443
+
444
+ ### Added
445
+
446
+ - Added non-capturing overlays via `OverlayOptions.nonCapturing` and new `OverlayHandle` methods: `focus()`, `unfocus()`, and `isFocused()` for programmatic overlay focus control ([#1916](https://github.com/badlogic/pi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
447
+
448
+ ### Changed
449
+
450
+ - Overlay compositing order now uses focus order so focused overlays render on top while preserving stack semantics for show/hide behavior ([#1916](https://github.com/badlogic/pi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
451
+
452
+ ### Fixed
453
+
454
+ - Fixed automatic focus restoration to skip non-capturing overlays and fixed `hideOverlay()` to only reassign focus when the popped overlay had focus ([#1916](https://github.com/badlogic/pi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
455
+
456
+ ## [0.56.3] - 2026-03-06
457
+
458
+ ### Added
459
+
460
+ - Added xterm modifyOtherKeys mode 2 fallback when Kitty keyboard protocol is not available, enabling modified enter keys (Shift+Enter, Ctrl+Enter) inside tmux ([#1872](https://github.com/badlogic/pi-mono/issues/1872))
461
+
462
+ ## [0.56.2] - 2026-03-05
463
+
464
+ ### Added
465
+
466
+ - Exported `decodeKittyPrintable()` from `keys.ts` for decoding Kitty CSI-u sequences into printable characters
467
+
468
+ ### Fixed
469
+
470
+ - 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](https://github.com/badlogic/pi-mono/issues/1857))
471
+ - Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/badlogic/pi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)).
472
+
473
+ ## [0.56.1] - 2026-03-05
474
+
475
+ ### Fixed
476
+
477
+ - Fixed markdown blockquote rendering to isolate blockquote styling from default text style, preventing style leakage.
478
+
479
+ ## [0.56.0] - 2026-03-04
480
+
481
+ ### Fixed
482
+
483
+ - 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.
484
+ - Fixed Kitty CSI-u handling to ignore unsupported modifiers so modifier-only events do not insert stray printable characters ([#1807](https://github.com/badlogic/pi-mono/issues/1807))
485
+ - Fixed single-line paste performance by inserting pasted text atomically instead of character-by-character, preventing repeated `@` autocomplete scans during paste ([#1812](https://github.com/badlogic/pi-mono/issues/1812))
486
+ - Fixed `visibleWidth()` to ignore generic OSC escape sequences (including OSC 133 semantic prompt markers), preventing width drift when terminals emit semantic zone markers ([#1805](https://github.com/badlogic/pi-mono/issues/1805))
487
+ - Fixed markdown blockquotes dropping nested list content by rendering blockquote children as block-level tokens ([#1787](https://github.com/badlogic/pi-mono/issues/1787))
488
+
489
+ ## [0.55.4] - 2026-03-02
490
+
491
+ ## [0.55.3] - 2026-02-27
492
+
493
+ ## [0.55.2] - 2026-02-27
494
+
495
+ ## [0.55.1] - 2026-02-26
496
+
497
+ ### Fixed
498
+
499
+ - Fixed Windows VT input initialization in ESM by loading `koffi` via `createRequire`, restoring VT input mode while keeping `koffi` externalized from compiled binaries ([#1627](https://github.com/badlogic/pi-mono/pull/1627) by [@kaste](https://github.com/kaste))
500
+
501
+ ## [0.55.0] - 2026-02-24
502
+
503
+ ## [0.54.2] - 2026-02-23
504
+
505
+ ## [0.54.1] - 2026-02-22
506
+
507
+ ### Fixed
508
+
509
+ - 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.
510
+
511
+ ## [0.54.0] - 2026-02-19
512
+
513
+ ## [0.53.1] - 2026-02-19
514
+
515
+ ## [0.53.0] - 2026-02-17
516
+
517
+ ## [0.52.12] - 2026-02-13
518
+
519
+ ## [0.52.11] - 2026-02-13
520
+
521
+ ## [0.52.10] - 2026-02-12
522
+
523
+ ### Added
524
+
525
+ - Added terminal input listeners in `TUI` (`addInputListener` and `removeInputListener`) to let callers intercept, transform, or consume raw input before component handling.
526
+
527
+ ### Fixed
528
+
529
+ - Fixed `@` autocomplete fuzzy matching to score against path segments and prefixes, reducing irrelevant matches for nested paths ([#1423](https://github.com/badlogic/pi-mono/issues/1423))
530
+
531
+ ## [0.52.9] - 2026-02-08
532
+
533
+ ## [0.52.8] - 2026-02-07
534
+
535
+ ### Added
536
+
537
+ - Added `pasteToEditor` to `EditorComponent` API for programmatic paste support ([#1351](https://github.com/badlogic/pi-mono/pull/1351) by [@kaofelix](https://github.com/kaofelix))
538
+ - Added kill ring (ctrl+k/ctrl+y/alt+y) and undo (ctrl+z) support to the Input component ([#1373](https://github.com/badlogic/pi-mono/pull/1373) by [@Perlence](https://github.com/Perlence))
539
+
540
+ ## [0.52.7] - 2026-02-06
541
+
542
+ ## [0.52.6] - 2026-02-05
543
+
544
+ ## [0.52.5] - 2026-02-05
545
+
546
+ ## [0.52.4] - 2026-02-05
547
+
548
+ ## [0.52.3] - 2026-02-05
549
+
550
+ ## [0.52.2] - 2026-02-05
551
+
552
+ ## [0.52.1] - 2026-02-05
553
+
554
+ ## [0.52.0] - 2026-02-05
555
+
556
+ ## [0.51.6] - 2026-02-04
557
+
558
+ ### Changed
559
+
560
+ - Slash command menu now triggers on the first line even when other lines have content, allowing commands to be prepended to existing text ([#1227](https://github.com/badlogic/pi-mono/pull/1227) by [@aliou](https://github.com/aliou))
561
+
562
+ ### Fixed
563
+
564
+ - Fixed `/settings` crashing in narrow terminals by handling small widths in the settings list ([#1246](https://github.com/badlogic/pi-mono/pull/1246) by [@haoqixu](https://github.com/haoqixu))
565
+
566
+ ## [0.51.5] - 2026-02-04
567
+
568
+ ## [0.51.4] - 2026-02-03
569
+
570
+ ### Fixed
571
+
572
+ - Fixed input scrolling to avoid splitting emoji sequences ([#1228](https://github.com/badlogic/pi-mono/pull/1228) by [@haoqixu](https://github.com/haoqixu))
573
+
574
+ ## [0.51.3] - 2026-02-03
575
+
576
+ ## [0.51.2] - 2026-02-03
577
+
578
+ ### Added
579
+
580
+ - Added `Terminal.drainInput()` to drain stdin before exit (prevents Kitty key release events leaking over slow SSH)
581
+
582
+ ### Fixed
583
+
584
+ - Fixed Kitty key release events leaking to parent shell over slow SSH connections by draining stdin for up to 1s ([#1204](https://github.com/badlogic/pi-mono/issues/1204))
585
+ - Fixed legacy newline handling in the editor to preserve previous newline behavior
586
+ - Fixed @ autocomplete to include hidden paths
587
+ - Fixed submit fallback to honor configured keybindings
588
+
589
+ ## [0.51.1] - 2026-02-02
590
+
591
+ ### Added
592
+
593
+ - Added `PI_DEBUG_REDRAW=1` env var for debugging full redraws (logs triggers to `~/.pi/agent/pi-debug.log`)
594
+
595
+ ### Changed
596
+
597
+ - Terminal height changes no longer trigger full redraws, reducing flicker on resize
598
+ - `clearOnShrink` now defaults to `false` (use `PI_CLEAR_ON_SHRINK=1` or `setClearOnShrink(true)` to enable)
599
+
600
+ ### Fixed
601
+
602
+ - Fixed emoji cursor positioning in Input component ([#1183](https://github.com/badlogic/pi-mono/pull/1183) by [@haoqixu](https://github.com/haoqixu))
603
+
604
+ - 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)
605
+ - Fixed Ctrl+D exit closing the parent SSH session due to stdin buffer race condition ([#1185](https://github.com/badlogic/pi-mono/issues/1185))
606
+
607
+ ## [0.51.0] - 2026-02-01
608
+
609
+ ## [0.50.9] - 2026-02-01
610
+
611
+ ## [0.50.8] - 2026-02-01
612
+
613
+ ### Added
614
+
615
+ - Added sticky column tracking for vertical cursor navigation so the editor restores the preferred column when moving across short lines. ([#1120](https://github.com/badlogic/pi-mono/pull/1120) by [@Perlence](https://github.com/Perlence))
616
+
617
+ ### Fixed
618
+
619
+ - Fixed Kitty keyboard protocol base layout fallback so non-QWERTY layouts do not trigger wrong shortcuts ([#1096](https://github.com/badlogic/pi-mono/pull/1096) by [@rytswd](https://github.com/rytswd))
620
+
621
+ ## [0.50.7] - 2026-01-31
622
+
623
+ ## [0.50.6] - 2026-01-30
624
+
625
+ ### Changed
626
+
627
+ - Optimized `isImageLine()` with `startsWith` short-circuit for faster image line detection
628
+
629
+ ### Fixed
630
+
631
+ - Fixed empty rows appearing below footer when content shrinks (e.g., closing `/tree`, clearing multi-line editor) ([#1095](https://github.com/badlogic/pi-mono/pull/1095) by [@marckrenn](https://github.com/marckrenn))
632
+ - Fixed terminal cursor remaining hidden after exiting TUI via `stop()` when a render was pending ([#1099](https://github.com/badlogic/pi-mono/pull/1099) by [@haoqixu](https://github.com/haoqixu))
633
+
634
+ ## [0.50.5] - 2026-01-30
635
+
636
+ ### Fixed
637
+
638
+ - 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](https://github.com/badlogic/pi-mono/pull/1091) by [@zedrdave](https://github.com/zedrdave))
639
+
640
+ ## [0.50.4] - 2026-01-30
641
+
642
+ ### Added
643
+
644
+ - Added Ctrl+B and Ctrl+F as alternative keybindings for cursor word left/right navigation ([#1053](https://github.com/badlogic/pi-mono/pull/1053) by [@ninlds](https://github.com/ninlds))
645
+ - Added character jump navigation: Ctrl+] jumps forward to next character, Ctrl+Alt+] jumps backward ([#1074](https://github.com/badlogic/pi-mono/pull/1074) by [@Perlence](https://github.com/Perlence))
646
+ - Editor now jumps to line start when pressing Up at first visual line, and line end when pressing Down at last visual line ([#1050](https://github.com/badlogic/pi-mono/pull/1050) by [@4h9fbZ](https://github.com/4h9fbZ))
647
+
648
+ ### Changed
649
+
650
+ - Optimized image line detection and box rendering cache for better performance ([#1084](https://github.com/badlogic/pi-mono/pull/1084) by [@can1357](https://github.com/can1357))
651
+
652
+ ### Fixed
653
+
654
+ - Fixed autocomplete for paths with spaces by supporting quoted path tokens ([#1077](https://github.com/badlogic/pi-mono/issues/1077))
655
+ - Fixed quoted path completions to avoid duplicating closing quotes during autocomplete ([#1077](https://github.com/badlogic/pi-mono/issues/1077))
656
+
657
+ ## [0.50.3] - 2026-01-29
658
+
659
+ ## [0.50.2] - 2026-01-29
660
+
661
+ ### Added
662
+
663
+ - Added `autocompleteMaxVisible` option to `EditorOptions` with getter/setter methods for configurable autocomplete dropdown height ([#972](https://github.com/badlogic/pi-mono/pull/972) by [@masonc15](https://github.com/masonc15))
664
+ - Added `alt+b` and `alt+f` as alternative keybindings for word navigation (`cursorWordLeft`, `cursorWordRight`) and `ctrl+d` for `deleteCharForward` ([#1043](https://github.com/badlogic/pi-mono/issues/1043) by [@jasonish](https://github.com/jasonish))
665
+ - Editor auto-applies single suggestion when force file autocomplete triggers with exactly one match ([#993](https://github.com/badlogic/pi-mono/pull/993) by [@Perlence](https://github.com/Perlence))
666
+
667
+ ### Changed
668
+
669
+ - Improved `extractCursorPosition` performance: scans lines in reverse order, early-outs when cursor is above viewport, and limits scan to bottom terminal height ([#1004](https://github.com/badlogic/pi-mono/pull/1004) by [@can1357](https://github.com/can1357))
670
+ - Autocomplete improvements: better handling of partial matches and edge cases ([#1024](https://github.com/badlogic/pi-mono/pull/1024) by [@Perlence](https://github.com/Perlence))
671
+
672
+ ### Fixed
673
+
674
+ - Fixed backslash input buffering causing delayed character display in editor and input components ([#1037](https://github.com/badlogic/pi-mono/pull/1037) by [@Perlence](https://github.com/Perlence))
675
+ - Fixed markdown table rendering with proper row dividers and minimum column width ([#997](https://github.com/badlogic/pi-mono/pull/997) by [@tmustier](https://github.com/tmustier))
676
+
677
+ ## [0.50.1] - 2026-01-26
678
+
679
+ ## [0.50.0] - 2026-01-26
680
+
681
+ ### Added
682
+
683
+ - Added `fullRedraws` readonly property to TUI class for tracking full screen redraws
684
+ - Added `PI_TUI_WRITE_LOG` environment variable to capture raw ANSI output for debugging
685
+
686
+ ### Fixed
687
+
688
+ - Fixed appended lines not being committed to scrollback, causing earlier content to be overwritten when viewport fills ([#954](https://github.com/badlogic/pi-mono/issues/954))
689
+ - Slash command menu now only triggers when the editor input is otherwise empty ([#904](https://github.com/badlogic/pi-mono/issues/904))
690
+ - Center-anchored overlays now stay vertically centered when resizing the terminal taller after a shrink ([#950](https://github.com/badlogic/pi-mono/pull/950) by [@nicobailon](https://github.com/nicobailon))
691
+ - Fixed editor multi-line insertion handling and lastAction tracking ([#945](https://github.com/badlogic/pi-mono/pull/945) by [@Perlence](https://github.com/Perlence))
692
+ - Fixed editor word wrapping to reserve a cursor column ([#934](https://github.com/badlogic/pi-mono/pull/934) by [@Perlence](https://github.com/Perlence))
693
+ - Fixed editor word wrapping to use single-pass backtracking for whitespace handling ([#924](https://github.com/badlogic/pi-mono/pull/924) by [@Perlence](https://github.com/Perlence))
694
+ - Fixed Kitty image ID allocation and cleanup to prevent image ID collisions between modules
695
+
696
+ ## [0.49.3] - 2026-01-22
697
+
698
+ ### Added
699
+
700
+ - `codeBlockIndent` property on `MarkdownTheme` to customize code block content indentation (default: 2 spaces) ([#855](https://github.com/badlogic/pi-mono/pull/855) by [@terrorobe](https://github.com/terrorobe))
701
+ - Added Alt+Delete as hotkey for delete word forwards ([#878](https://github.com/badlogic/pi-mono/pull/878) by [@Perlence](https://github.com/Perlence))
702
+
703
+ ### Changed
704
+
705
+ - Fuzzy matching now scores consecutive matches higher and penalizes gaps more heavily for better relevance ([#860](https://github.com/badlogic/pi-mono/pull/860) by [@mitsuhiko](https://github.com/mitsuhiko))
706
+
707
+ ### Fixed
708
+
709
+ - Autolinked emails no longer display redundant `(mailto:...)` suffix in markdown output ([#888](https://github.com/badlogic/pi-mono/pull/888) by [@terrorobe](https://github.com/terrorobe))
710
+ - Fixed viewport tracking and cursor positioning for overlays and content shrink scenarios
711
+ - Autocomplete now allows searches with `/` characters (e.g., `folder1/folder2`) ([#882](https://github.com/badlogic/pi-mono/pull/882) by [@richardgill](https://github.com/richardgill))
712
+ - Directory completions for `@` file attachments no longer add trailing space, allowing continued autocomplete into subdirectories
713
+
714
+ ## [0.49.2] - 2026-01-19
715
+
716
+ ## [0.49.1] - 2026-01-18
717
+
718
+ ### Added
719
+
720
+ - Added undo support to Editor with Ctrl+- hotkey. Undo coalesces consecutive word characters into one unit (fish-style). ([#831](https://github.com/badlogic/pi-mono/pull/831) by [@Perlence](https://github.com/Perlence))
721
+ - Added legacy terminal support for Ctrl+symbol keys (Ctrl+\, Ctrl+], Ctrl+-) and their Ctrl+Alt variants. ([#831](https://github.com/badlogic/pi-mono/pull/831) by [@Perlence](https://github.com/Perlence))
722
+
723
+ ## [0.49.0] - 2026-01-17
724
+
725
+ ### Added
726
+
727
+ - Added `showHardwareCursor` getter and setter to control cursor visibility while keeping IME positioning active. ([#800](https://github.com/badlogic/pi-mono/pull/800) by [@ghoulr](https://github.com/ghoulr))
728
+ - Added Emacs-style kill ring editing with yank and yank-pop keybindings. ([#810](https://github.com/badlogic/pi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
729
+ - Added legacy Alt+letter handling and Alt+D delete word forward support in the editor keymap. ([#810](https://github.com/badlogic/pi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
730
+
731
+ ## [0.48.0] - 2026-01-16
732
+
733
+ ### Added
734
+
735
+ - `EditorOptions` with optional `paddingX` for horizontal content padding, plus `getPaddingX()`/`setPaddingX()` methods ([#791](https://github.com/badlogic/pi-mono/pull/791) by [@ferologics](https://github.com/ferologics))
736
+
737
+ ### Changed
738
+
739
+ - 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).
740
+
741
+ ### Fixed
742
+
743
+ - Decode Kitty CSI-u printable sequences in the editor so shifted symbol keys (e.g., `@`, `?`) work in terminals that enable Kitty keyboard protocol ([#779](https://github.com/badlogic/pi-mono/pull/779) by [@iamd3vil](https://github.com/iamd3vil))
744
+
745
+ ## [0.47.0] - 2026-01-16
746
+
747
+ ### Breaking Changes
748
+
749
+ - `Editor` constructor now requires `TUI` as first parameter: `new Editor(tui, theme)`. This enables automatic vertical scrolling when content exceeds terminal height. ([#732](https://github.com/badlogic/pi-mono/issues/732))
750
+
751
+ ### Added
752
+
753
+ - 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](https://github.com/badlogic/pi-mono/pull/719))
754
+ - `Focusable` interface for components that need hardware cursor positioning. Implement `focused: boolean` and emit `CURSOR_MARKER` in render output when focused.
755
+ - `CURSOR_MARKER` constant and `isFocusable()` type guard exported from the package
756
+ - Editor now supports Page Up/Down keys (Fn+Up/Down on MacBook) for scrolling through large content ([#732](https://github.com/badlogic/pi-mono/issues/732))
757
+ - Expanded keymap coverage for terminal compatibility: added support for Home/End keys in tmux, additional modifier combinations, and improved key sequence parsing ([#752](https://github.com/badlogic/pi-mono/pull/752) by [@richardgill](https://github.com/richardgill))
758
+
759
+ ### Fixed
760
+
761
+ - 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](https://github.com/badlogic/pi-mono/issues/732))
762
+ - `visibleWidth()` and `extractAnsiCode()` now handle APC escape sequences (`ESC _ ... BEL`), fixing width calculation and string slicing for strings containing cursor markers
763
+ - SelectList now handles multi-line descriptions by replacing newlines with spaces ([#728](https://github.com/badlogic/pi-mono/pull/728) by [@richardgill](https://github.com/richardgill))
764
+
765
+ ## [0.46.0] - 2026-01-15
766
+
767
+ ### Fixed
768
+
769
+ - 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](https://github.com/badlogic/pi-mono/pull/718) by [@dannote](https://github.com/dannote))
770
+
771
+ ## [0.45.7] - 2026-01-13
772
+
773
+ ## [0.45.6] - 2026-01-13
774
+
775
+ ### Added
776
+
777
+ - `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](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
778
+ - `OverlayOptions.visible` callback for responsive overlays - receives terminal dimensions, return false to hide ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
779
+ - `showOverlay()` now returns `OverlayHandle` with `hide()`, `setHidden(boolean)`, `isHidden()` for programmatic visibility control ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
780
+ - New exported types: `OverlayAnchor`, `OverlayHandle`, `OverlayMargin`, `OverlayOptions`, `SizeValue` ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
781
+ - `truncateToWidth()` now accepts optional `pad` parameter to pad result with spaces to exactly `maxWidth` ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
782
+
783
+ ### Fixed
784
+
785
+ - Overlay compositing crash when rendered lines exceed terminal width due to complex ANSI/OSC sequences (e.g., hyperlinks in subagent output) ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
786
+
787
+ ## [0.45.5] - 2026-01-13
788
+
789
+ ## [0.45.4] - 2026-01-13
790
+
791
+ ## [0.45.3] - 2026-01-13
792
+
793
+ ## [0.45.2] - 2026-01-13
794
+
795
+ ## [0.45.1] - 2026-01-13
796
+
797
+ ## [0.45.0] - 2026-01-13
798
+
799
+ ## [0.44.0] - 2026-01-12
800
+
801
+ ### Added
802
+
803
+ - `SettingsListOptions` with `enableSearch` for fuzzy filtering in `SettingsList` ([#643](https://github.com/badlogic/pi-mono/pull/643) by [@ninlds](https://github.com/ninlds))
804
+ - `pageUp` and `pageDown` key support with `selectPageUp`/`selectPageDown` editor actions ([#662](https://github.com/badlogic/pi-mono/pull/662) by [@aliou](https://github.com/aliou))
805
+
806
+ ### Fixed
807
+
808
+ - Numbered list items showing "1." for all items when code blocks break list continuity ([#660](https://github.com/badlogic/pi-mono/pull/660) by [@ogulcancelik](https://github.com/ogulcancelik))
809
+
810
+ ## [0.43.0] - 2026-01-11
811
+
812
+ ### Added
813
+
814
+ - `fuzzyFilter()` and `fuzzyMatch()` utilities for fuzzy text matching
815
+ - Slash command autocomplete now uses fuzzy matching instead of prefix matching
816
+
817
+ ### Fixed
818
+
819
+ - Cursor now moves to end of content on exit, preventing status line from being overwritten ([#629](https://github.com/badlogic/pi-mono/pull/629) by [@tallshort](https://github.com/tallshort))
820
+ - Reset ANSI styles after each rendered line to prevent style leakage
821
+
822
+ ## [0.42.5] - 2026-01-11
823
+
824
+ ### Fixed
825
+
826
+ - Reduced flicker by only re-rendering changed lines ([#617](https://github.com/badlogic/pi-mono/pull/617) by [@ogulcancelik](https://github.com/ogulcancelik))
827
+ - Cursor position tracking when content shrinks with unchanged remaining lines
828
+ - TUI renders with wrong dimensions after suspend/resume if terminal was resized while suspended ([#599](https://github.com/badlogic/pi-mono/issues/599))
829
+ - Pasted content containing Kitty key release patterns (e.g., `:3F` in MAC addresses) was incorrectly filtered out ([#623](https://github.com/badlogic/pi-mono/pull/623) by [@ogulcancelik](https://github.com/ogulcancelik))
830
+
831
+ ## [0.42.4] - 2026-01-10
832
+
833
+ ## [0.42.3] - 2026-01-10
834
+
835
+ ## [0.42.2] - 2026-01-10
836
+
837
+ ## [0.42.1] - 2026-01-09
838
+
839
+ ## [0.42.0] - 2026-01-09
840
+
841
+ ## [0.41.0] - 2026-01-09
842
+
843
+ ## [0.40.1] - 2026-01-09
844
+
845
+ ## [0.40.0] - 2026-01-08
846
+
847
+ ## [0.39.1] - 2026-01-08
848
+
849
+ ## [0.39.0] - 2026-01-08
850
+
851
+ ### Added
852
+
853
+ - **Experimental:** Overlay compositing for `ctx.ui.custom()` with `{ overlay: true }` option ([#558](https://github.com/badlogic/pi-mono/pull/558) by [@nicobailon](https://github.com/nicobailon))
854
+
855
+ ## [0.38.0] - 2026-01-08
856
+
857
+ ### Added
858
+
859
+ - `EditorComponent` interface for custom editor implementations
860
+ - `StdinBuffer` class to split batched stdin into individual sequences (adapted from [OpenTUI](https://github.com/anomalyco/opentui), MIT license)
861
+
862
+ ### Fixed
863
+
864
+ - Key presses no longer dropped when batched with other events over SSH ([#538](https://github.com/badlogic/pi-mono/pull/538))
865
+
866
+ ## [0.37.8] - 2026-01-07
867
+
868
+ ### Added
869
+
870
+ - `Component.wantsKeyRelease` property to opt-in to key release events (default false)
871
+
872
+ ### Fixed
873
+
874
+ - TUI now filters out key release events by default, preventing double-processing of keys in editors and other components
875
+
876
+ ## [0.37.7] - 2026-01-07
877
+
878
+ ### Fixed
879
+
880
+ - `matchesKey()` now correctly matches Kitty protocol sequences for unmodified letter keys (needed for key release events)
881
+
882
+ ## [0.37.6] - 2026-01-06
883
+
884
+ ### Added
885
+
886
+ - 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.
887
+
888
+ ## [0.37.5] - 2026-01-06
889
+
890
+ ## [0.37.4] - 2026-01-06
891
+
892
+ ## [0.37.3] - 2026-01-06
893
+
894
+ ## [0.37.2] - 2026-01-05
895
+
896
+ ## [0.37.1] - 2026-01-05
897
+
898
+ ## [0.37.0] - 2026-01-05
899
+
900
+ ### Fixed
901
+
902
+ - Crash when pasting text with trailing whitespace exceeding terminal width through Markdown rendering ([#457](https://github.com/badlogic/pi-mono/pull/457) by [@robinwander](https://github.com/robinwander))
903
+
904
+ ## [0.36.0] - 2026-01-05
905
+
906
+ ## [0.35.0] - 2026-01-05
907
+
908
+ ## [0.34.2] - 2026-01-04
909
+
910
+ ## [0.34.1] - 2026-01-04
911
+
912
+ ### Added
913
+
914
+ - 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](https://github.com/badlogic/pi-mono/pull/450) by [@kaofelix](https://github.com/kaofelix))
915
+
916
+ ## [0.34.0] - 2026-01-04
917
+
918
+ ### Added
919
+
920
+ - `Editor.getExpandedText()` method that returns text with paste markers expanded to their actual content ([#444](https://github.com/badlogic/pi-mono/pull/444) by [@aliou](https://github.com/aliou))
921
+
922
+ ## [0.33.0] - 2026-01-04
923
+
924
+ ### Breaking Changes
925
+
926
+ - **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](https://github.com/badlogic/pi-mono/pull/405))
927
+
928
+ ### Added
929
+
930
+ - `Editor.insertTextAtCursor(text)` method for programmatic text insertion ([#419](https://github.com/badlogic/pi-mono/issues/419))
931
+ - `EditorKeybindingsManager` for configurable editor keybindings. Components now use `matchesKey()` and keybindings manager instead of individual `isXxx()` functions. ([#405](https://github.com/badlogic/pi-mono/pull/405) by [@hjanuschka](https://github.com/hjanuschka))
932
+
933
+ ### Changed
934
+
935
+ - Key detection refactored: consolidated `is*()` functions into generic `matchesKey(data, keyId)` function that accepts key identifiers like `"ctrl+c"`, `"shift+enter"`, `"alt+left"`, etc.
936
+
937
+ ## [0.32.3] - 2026-01-03
938
+
939
+ ## [0.32.2] - 2026-01-03
940
+
941
+ ### Fixed
942
+
943
+ - Slash command autocomplete now triggers for commands starting with `.`, `-`, or `_` (e.g., `/.land`, `/-foo`) ([#422](https://github.com/badlogic/pi-mono/issues/422))
944
+
945
+ ## [0.32.1] - 2026-01-03
946
+
947
+ ## [0.32.0] - 2026-01-03
948
+
949
+ ### Changed
950
+
951
+ - Editor component now uses word wrapping instead of character-level wrapping for better readability ([#382](https://github.com/badlogic/pi-mono/pull/382) by [@nickseelert](https://github.com/nickseelert))
952
+
953
+ ### Fixed
954
+
955
+ - Shift+Space, Shift+Backspace, and Shift+Delete now work correctly in Kitty-protocol terminals (Kitty, WezTerm, etc.) instead of being silently ignored ([#411](https://github.com/badlogic/pi-mono/pull/411) by [@nathyong](https://github.com/nathyong))
956
+
957
+ ## [0.31.1] - 2026-01-02
958
+
959
+ ### Fixed
960
+
961
+ - `visibleWidth()` now strips OSC 8 hyperlink sequences, fixing text wrapping for clickable links ([#396](https://github.com/badlogic/pi-mono/pull/396) by [@Cursivez](https://github.com/Cursivez))
962
+
963
+ ## [0.31.0] - 2026-01-02
964
+
965
+ ### Added
966
+
967
+ - `isShiftCtrlO()` key detection function for Shift+Ctrl+O (Kitty protocol)
968
+ - `isShiftCtrlD()` key detection function for Shift+Ctrl+D (Kitty protocol)
969
+ - `TUI.onDebug` callback for global debug key handling (Shift+Ctrl+D)
970
+ - `wrapTextWithAnsi()` utility now exported (wraps text to width, preserving ANSI codes)
971
+
972
+ ### Changed
973
+
974
+ - README.md completely rewritten with accurate component documentation, theme interfaces, and examples
975
+ - `visibleWidth()` reimplemented with grapheme-based width calculation, 10x faster on Bun and ~15% faster on Node ([#369](https://github.com/badlogic/pi-mono/pull/369) by [@nathyong](https://github.com/nathyong))
976
+
977
+ ### Fixed
978
+
979
+ - Markdown component now renders HTML tags as plain text instead of silently dropping them ([#359](https://github.com/badlogic/pi-mono/issues/359))
980
+ - Crash in `visibleWidth()` and grapheme iteration when encountering undefined code points ([#372](https://github.com/badlogic/pi-mono/pull/372) by [@HACKE-RC](https://github.com/HACKE-RC))
981
+ - ZWJ emoji sequences (rainbow flag, family, etc.) now render with correct width instead of being split into multiple characters ([#369](https://github.com/badlogic/pi-mono/pull/369) by [@nathyong](https://github.com/nathyong))
982
+
983
+ ## [0.29.0] - 2025-12-25
984
+
985
+ ### Added
986
+
987
+ - **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](https://github.com/badlogic/pi-mono/pull/307) by [@mitsuhiko](https://github.com/mitsuhiko))
988
+ - **Word navigation for Input component**: Added Ctrl+Left/Right and Alt+Left/Right support for word-by-word cursor movement. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0))
989
+ - **Full Unicode input**: Input component now accepts Unicode characters beyond ASCII. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0))
990
+
991
+ ### Fixed
992
+
993
+ - **Readline-style Ctrl+W**: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0))