- Implemented tiered search strategy using synchronous literal matching for immediate results and debounced asynchronous fuzzy matching to prevent input blocking.
- Cached session search data and introduced an indexed `FuzzyText` structure to reduce redundant string processing.
- Added comprehensive test suite verifying search convergence, stale task orphaning, and selection stability.
- Enhanced `tui` fuzzy matching utilities to support prebuilt search indexes for improved multi-match performance.
- Replaced the legacy model selector with a full-screen Model Hub, introducing mouse support and a fuzzy-searchable browser.
- Integrated comprehensive model management, including role assignment, thinking-level visualization, and manual provider discovery.
- Implemented a cancellable OAuth login flow and integrated it directly into the Model Hub for provider authentication.
- Centralized model logic and migrated existing tests to support the new component architecture.
- Implement `midPromptSkillTokenMatches` to restrict when mid-prompt slash tokens trigger skill completions, ensuring stray prose does not keep the popup active.
- Require skill tokens to be a prefix of the `skill:` namespace, an explicit `skill:` fuzzy query, or a prefix of the bare skill name.
- Update the editor to use this shared logic for filtering suggestions and guarding stale autocomplete acceptances.
- Introduced a grid-based rendering engine to support complex LaTeX environments like matrices, cases, and arrays.
- Added advanced layout capabilities including stretched delimiters, multi-line radicals, and limits-based stacking for operators.
- Implemented logic to propagate color scopes and font styles across box boundaries.
- Exported math font commands and structural glyph painting to facilitate consistent rendering in 2-D contexts.
- Asserted the terminal [DONE] sentinel frame in raw SSE capture since onSseEvent observers receive every wire frame as it arrives.
- Included updatedAtMs in credential block persistence expectations per the broker snapshot contract from issue #4980.
- Taught VirtualTerminal the no-ED2 destructive paint bytes: ED3 history clears now invalidate the offset-keyed text cache instead of bypassing emulation, keeping legacy full-clear recreation only for the WASM trap workaround.
- Refreshed the advisor parity comment for UUIDv7 provider session ids.
Replayed destructive full paints from home without issuing ED2 before the transcript rows, so resume and resize settles do not expose a blank viewport on terminals without synchronized output.
Kept ED3 as the single native-history clear path and updated renderer regression coverage for the new byte contract.
Fixes#5028
- Added auto-sealing logic to `FinalizableBlock` to finalize displaceable snapshots when they enter the scrollback area.
- Updated TUI frame emission to publish committed rows and clamp them to segment bounds, ensuring accurate component updates.
- Introduced component tracking and cleanup in event controller tests to prevent resource leaks during finalization.
- Validated state transitions and post-emit synchronization through comprehensive new test suites for transcript and TUI components.
The mode 2048 in-band resize spec permits `:`-separated subparameters
on any field and requires clients to ignore them. The parser rejected
such reports outright (and the split-reassembly prefix pattern dropped
fragmented ones as garbage), so the grow-back report after an iOS soft
keyboard dismissal under tmux-over-SSH never applied: rows stayed
pinned at the keyboard-present height, with no accompanying OS resize
event to reconcile the cached in-band geometry.
Capture the leading digits of each field and skip the subparameter
tail; accept `:` in the reassembly prefix so split reports complete
instead of leaking their tails into the editor as keystrokes.
Fixes#4748
ProcessTerminal.start() can parse the startup OSC 11 response before
InteractiveMode.init() registers its onAppearanceChange callback (init
awaits hooks/mode/draft restore between ui.start() and subscribing).
The dedup in #handleOsc11Response then suppresses the value forever and
theme auto-detection stays on the dark fallback despite a light
terminal. Replay the already-detected appearance to subscribers that
register after detection.
Adopted from PR #4883; hardened the test to stop the terminal before
asserting so a failure cannot leak a live terminal into later tests.
Fixes#4731
Treated whitespace-only slash command arguments like empty arguments so no-arg commands stay closed after repeated spaces.
Added provider coverage for the whitespace-only no-arg command path.
Prevented no-argument slash commands from falling through to empty-prefix file suggestions immediately after Tab completion.
Added an editor regression covering /quit Tab completion with files present in the project root.
Fixes#4808
- Fell back to an ASCII cursor when legacy selector themes omit the symbols map.
- Added a SelectList regression test for rendering with a runtime legacy theme.
Fixes#4745
Stopped new-session and session-switch UI paths from detaching active loader/render components without running their disposal hooks.
Added container and loader coverage for disposing children before destructive transcript/status replacement.
Fixes#4686
- Moved emergency terminal restore registration to the TUI terminal initialization logic.
- Ensured terminal restoration triggers correctly on fatal exits by moving registration out of a side-effect-heavy barrel module.
- Added a registration guard to prevent redundant postmortem handler attachments.
- Added fallback to file-path completion when a leading-slash token does not match a registered command.
- Updated autocomplete application logic to distinguish between path insertions and slash-command command-style completion.
- Prevented accidental submission when pressing Enter on an absolute-path suggestion.
- Added comprehensive test suites for path resolution and interaction behavior in the autocomplete provider and editor component.
The staleness guard previously accepted any clean trailing slash token, so
the 100 ms debounce window let a bare-`/` skill popup rewrite a
subsequently typed `/tmp` to `/skill:…`. Score the live token against
the selected skill's value and reject the branch when it would no longer
surface — Tab then falls through to file completion.
Fixes#4619
- Matched trailing slash skill prefixes during autocomplete staleness checks so Tab and Enter apply the highlighted skill token.
- Cancelled mid-prompt skill autocomplete immediately when Backspace removes the triggering slash.
- Added regression coverage for Tab, Enter, and Backspace behavior.
Fixes#4619