- Added a fullscreen /copy tree of recent assistant messages with nested code blocks and a live preview pane.
- Removed the /copy last|code|all|cmd subcommands in favor of tree selection.
- Extracted copy-target assembly into a testable util.
- Dimmed models whose context window is smaller than current usage.
- Skipped disabled entries during navigation and selection.
- Showed context-limit suffix and warning for unselectable models.
- Repainted only the active-grid tail row relative to the tracked hardware cursor so a scrolled reader's history stays intact.
- Let bottom-anchored spinner/status chrome advance while the real scrollback mutation stays deferred.
- Deferred completely instead of repainting when there is no direct input or eager streaming.
- Treated an unknown viewport position as at-bottom so zero-byte frames no longer froze the spinner/footer.
- Repainted for liveness while keeping native scrollback dirty; known-scrolled readers stay deferred.
- Dropped the redundant deferredMutation branch in the append path.
- Stopped expanding the volatile tool block so a >100-line code arg no longer overflows the viewport.
- Kept streaming and resolved render shapes consistent at codeMaxLines.
- Padded direct-input shrink frames to clear stale popup rows without re-exposing committed scrollback.
- Repainted live viewport when offscreen edits shift rows above the viewport top.
- Prevented diff-append from duplicating the prefix at the scrollback seam on transient UI growth.
- Added scroll-buffer assertions to the autocomplete viewport test.
- Wrapped selector and overlay list windows in ScrollView for proportional right-edge scrollbars.
- Dropped numeric position/count footers in favor of the scrollbar.
- Simplified SelectList status line to search hints only.
- Added ED3-risk autocomplete repaint test for POSIX terminals.
- Added tui-core-renderer.md covering yank/corruption/flash/width faults.
- Linked the new doc from runtime internals and the tui.ts header.
- Refreshed runtime-internals to match current boot and render-intent flow.
- Permitted autocomplete/IME frames to repaint the live viewport in place.
- Prevented stale autocomplete rows from lingering until next checkpoint.
- Kept full deferral when neither direct input nor eager streaming is active.
- Added timeout pause/resume control ops and helper to suspend idle timers during bridge work.
- Fixed TimeoutError on long delegated agent()/llm() calls by pausing timeout while silent.
- Updated IdleTimeout with reference-counted pauses, ignored checks while paused, and resumed fresh.
- Replaced heartbeat keepalives with timeout-control events in bridge paths and status routing.
- Raised the timeout on four `sdk-async-job-manager-singleton` session tests to 60000ms to reduce flakes in parallel runs.
- Adjusted the asynchronous singleton cases to avoid timeout races between long session startup and teardown.
- Recorded the timeout stabilization in the package changelog entry.
renderAgentResult and the live-progress sibling cast
extractedToolData?.yield to Array<{ data }> and called ?.map without
checking the actual runtime shape. Optional chaining only short-circuits
on null/undefined, so any stray non-array value (a single yield object
landing in the slot) made .map undefined and threw
TypeError: completeData?.map is not a function — taking down every
`review` task render.
Both sites now route through a new normalizeYieldData helper (next to
normalizeReportFindings) that returns an array of yield records: it
preserves arrays unchanged, wraps a single object as a 1-element array
so the verdict still renders, and drops primitives. Added a regression
test exercising the result branch, the progress branch, the primitive
fall-through, and the canonical array shape — all of the failing-branch
ones reproduce the crash on the pre-fix renderer.
Fixes#1987
`TtsrManager` previously ignored the `ttsr.enabled: false` toggle:
- `addRule()` still registered rules, so `bucketRules` demoted them
to the TTSR bucket and dropped the rulebook/alwaysApply fallback
- `hasRules()` still returned true, so `AgentSession` entered the
TTSR matching path on every message_update
- `checkDelta` / `checkSnapshot` (via `#matchBuffer`) still matched
patterns and could abort the stream and inject system reminders
Gate all three public-ish entry points on `#settings.enabled` so
disabling TTSR short-circuits the whole path. Condition rules fall
through to the rulebook bucket in `bucketRules` instead of being
silently swallowed.
Closes#1767
The Ctrl+Q follow-up fallback should only be removed when a recognized
keybinding action claims that chord. Unknown or stale config entries are
ignored by the keybinding manager and should not suppress a working
follow-up default.
Addresses code review on #1905.
The slash-autocomplete-viewport test's settle() slept only 120ms after
each keystroke — 20ms over Editor's 100ms autocomplete debounce. The
post-debounce flow is debounce timer + microtask + a 16ms throttled
render before the new (filtered) list lands, leaving ~4ms of headroom
once the debounce fires. macOS setTimeout jitter reliably consumed that
margin, so the stale unfiltered menu was still being painted at
getViewport() time and pushed the live editor row out of the 6-row
viewport, surfacing 'Expected to contain: "/m"' against the rendered
menu.
Sleep 250ms instead and document the budget so a future trim doesn't
quietly regress the slack.
Fixes#1979
Returned the current workspace folder list when a server queried workspace/workspaceFolders after initialization so advertising the capability no longer left late requests answered with -32601.
Ensured rust-analyzer textDocument/didOpen ran before workspace readiness polling so the server could discover the file's Cargo workspace, and skipped the readiness wait entirely for standalone .rs files outside any Cargo workspace ancestor.
Continued rust-analyzer workspace readiness polling across transient analyzerStatus request timeouts while preserving early exit for unsupported methods and server failures.
Advertised workspace folder support during LSP initialization and waited for rust-analyzer to finish loading Cargo workspaces before opening project-indexed files.
Fixes#1976
Inside tmux (and other multiplexers) a long streamed assistant reply
lost its scrolled-off head from pane history and the persistent chrome
got pushed in alongside it, producing 'repeating chunks and missing
sections' when the user scrolled back through tmux pane history.
The foreground-streaming cap-to-viewport branch added in 15.9.2 for
ED3-risk hosts that can checkpoint-rebuild later also activated inside
multiplexers, where checkpoint reconcile is a no-op
(`refreshNativeScrollbackIfDirty` short-circuits because `CSI 3 J`
cannot erase pane history). Every streaming frame clipped `lines` to
the visible tail and reset `#scrollbackHighWater` to 0, so any row that
scrolled above the viewport top was committed nowhere.
Meanwhile `#planLiveRegionPinnedRender` was explicitly disabled for
multiplexers, but its `#emitLiveRegionPinnedRepaint` is built from the
exact primitives tmux accepts (relative cursor moves, per-line
`CSI 2 K`, `\r\n` to scroll the sealed prefix past the viewport bottom)
and never emits `CSI 2 J`/`CSI 3 J`. Enable the pinned planner inside
multiplexers and exempt them from the cap so the sealed prefix of an
append-only live block commits to pane history incrementally while the
actively-mutating live tail stays in the viewport only.
Fixes#1974
Route identifierless Responses function_call_arguments.done events through open function calls in item order so local llama.cpp streams keep each parallel tool's final arguments.
Fixes#1970
Extended the dirty-scrollback ED3-risk focused-input suppression to the visible-overlay branch so overlay selectors (session observer, model picker, etc.) do not trigger CSI 3 J plus full transcript replay on each Up/Down keypress. Non-ED3-risk POSIX terminals still honor direct-input/IME/autocomplete unknown-viewport opt-ins.
Fixes#1962
Prevented focused input frames on ED3-risk unknown-viewport terminals from using stale native scrollback dirtiness as permission to emit CSI 3 J and replay the whole transcript. Added an issue #1962 regression covering Up/Down selector movement after foreground streaming dirties scrollback.
Fixes#1962
Aligned the runtime header parser with the formal grammar's no-`#`-in-filename rule: any `#` left in the path body after detecting the trailing `#XXXX` tag means the header is malformed (short `#1A2`, non-hex `#1A2G`, over-long `#1A2B5`, stale-tag copy-paste, line-suffixed tags), not a path with an embedded hash. Mirrored the same rule on the apply_patch recovery path.
Added strict and recovery regression coverage for the three malformed-tag shapes the reviewer named.
Rejected headers such as ¶src/file.ts#1A2B:42 as malformed headers instead of treating the whole tail as a hashless path and failing later in body parsing.
Added strict and apply_patch-recovery regression coverage for line-suffixed snapshot tags.
Tightened the relaxed header parser so a 4-hex token sitting before whitespace + more content (e.g. `¶src/a.ts#1A2B copied from read`) still raises the focused "must be ¶PATH or ¶PATH#TAG" diagnostic instead of being silently re-interpreted as a hashless path.
Also stopped rejecting hashless paths whose last five characters look like #TAG with a non-hex digit, and mirrored the same anti-junk rule in the apply_patch recovery parser.