Repository navigation
release: v7.0.1 - #70
Conversation
Detect table blocks (runs of pipe rows whose second line is a delimiter row) in the markdown renderer and lay them out as box-drawing grids with per-column alignment parsed from the delimiter row, cell word-wrapping, and column fitting when the grid would overflow the available width. Left-align the user block with the assistant marker and pass the available width to the renderer. Export markdownRowCount so the viewport estimator can predict the rendered height of markdown rows. Adds test/markdown-table.test.tsx covering natural, wide, and overflow cases.
Add a backdrop scrim color to both themes (#000000B3 dark, #66 light) and paint it behind centered popups so the conversation dims while a picker is open. Give every popover a blank line between its content and its dim footer hint so the hint no longer crowds the list.
Record the active git branch on each saved session and compute the session file size when listing. The resume picker now shows a second, dim line per entry with the idle time, branch, and file size instead of the message count, and drops to six visible rows to fit the taller entries.
Esc previously aborted the running turn even when the composer held draft text. Clearing the draft (including paste chips) now consumes the Esc; only an Esc on an empty prompt reaches the agent as an interrupt, and a double Esc still opens the rewind picker.
file_write and multi_file_edit failed with a raw EISDIR when file_path was empty or named a directory. Return an isError result that names the problem instead: a missing path explains that the call arguments were likely truncated past the output limit, and a directory target says file_path must name a file.
Long fetched pages are cut to a token budget. A required prompt describing what the caller is looking for lets the backend return the most relevant sections instead of the top of the page; without it the fetch returns the beginning of the page.
Depend on string-width for grapheme-aware width measurement in the markdown table renderer, register the new markdown-table test in the test:ui script, and bump the package version to 7.0.1.
There was a problem hiding this comment.
🧪 PR Review is completed: Solid release PR: the new markdown table renderer (delimiter/alignment parsing, column fitting, cell wrapping) checks out against its tests, the session-picker metadata and Esc-to-interrupt flows are correct, and targetPathError gives the model recoverable errors. Two findings: the new popover backdrop is likely missing the shouldFill prop required for OpenTUI background painting, and markdownRowCount measures lines in code units instead of display width. Reviewed src/tools/executors/files.ts: no issues found. Reviewed src/ui/components/InputBox.tsx: no issues found. Reviewed src/ui/components/McpMigrationPicker.tsx: no issues found. Reviewed src/ui/components/McpPicker.tsx: no issues found. Reviewed src/ui/components/RewindPicker.tsx: no issues found. Reviewed src/ui/components/SessionPicker.tsx: no issues found. Reviewed src/ui/components/rows.tsx: no issues found. Reviewed test/files.test.ts: no issues found. Reviewed test/markdown-table.test.tsx: no issues found. Reviewed test/session-picker.test.tsx: no issues found. Reviewed test/ui-viewport.test.tsx: no issues found.
Skipped files
package-lock.json: Skipped file pattern
⬇️ Low Priority Suggestions (2)
src/ui/App.tsx (1 suggestion)
Location:
src/ui/App.tsx(Lines 2803-2803)🟠 UI Rendering
Issue: The fullscreen popover overlay sets
backgroundColor={theme.backdrop}but omitsshouldFill. Everywhere else in this codebase that paints a background pairs it withshouldFill—PopoverBox(whose doc comment says its background is "painted for every cell it owns" because of that prop) and the inner popover panel a few lines below (backgroundColor={theme.panel} shouldFill). WithoutshouldFill, the translucent scrim behind centered popovers most likely never renders, silently defeating the newtheme.backdropfeature added in this PR.Fix: Add
shouldFillto the overlay Box, matching the existing pattern used by PopoverBox and the popover panel.Impact: The backdrop scrim actually displays behind popovers in both dark and light themes.
- backgroundColor={theme.backdrop} + backgroundColor={theme.backdrop} + shouldFill
src/ui/markdown.tsx (1 suggestion)
Location:
src/ui/markdown.tsx(Lines 335-335)🔵 Estimate Accuracy
Issue:
markdownRowCountestimates wrapped rows usingblock.lines[0].length(UTF-16 code units), while the rendering path added in this PR is display-width aware —stringWidthdrives every table width/padding calculation and the terminal wraps on display columns. For CJK content one code unit renders as two columns, so the code-unit count underestimates the wrapped height and the viewport's row-height estimate can be shorter than what actually renders (risking clipped/jumping virtualized rows). For emoji-heavy text it overestimates.Fix: Measure the line with
stringWidth(already imported at the top of this file) so the estimate matches the display-width-aware renderer.Impact: Row-height estimates stay accurate for wide (CJK/emoji) assistant output, keeping the virtualized transcript scroll in sync with what is rendered.
- const length = block.lines[0].length + (index === 0 ? prefix : 0) + const length = stringWidth(block.lines[0]) + (index === 0 ? prefix : 0)
What's new
Release 7.0.1 — seven focused commits covering the 7.0.1 changes.
Changes
markdownRowCountfor viewport height estimation.backdropscrim color in both themes painted behind centered popups, plus a blank line between popover content and its dim footer hint.file_write/multi_file_editexplain missing-path and directory-target errors instead of surfacing raw EISDIR.promptlets the backend return the most relevant sections of a long page within the token budget.test:ui.Verification
npm run typecheck— cleannpm run test:ui/test:compaction— markdown-table, session-picker, ui-viewport, and files tests included