You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
emrg: the TUI renders a message's clock past the last column, so no time is visible #2668
The TUI chat area renders no time on any message. The daemon does write a moment and the frames do carry it, so the value exists everywhere except on screen: a live user message, a live assistant reply and a message rebuilt by /resume or /rewind all show no clock.
What is observed
Rendered at a terminal width of 60 with the moment 2026-11-02T14:04:07, a user row is 67 columns wide:
span
length
"> " role prefix
2
markdown content, padded by Rich to the render width
58
" 14:04" clock
7
The clock is appended after the content has already been padded out to the full width, so it starts past the last column and the terminal clips it. An assistant row behaves the same way: StreamingMarkdown renders its markdown at ctx.width and then appends the clock to the first line.
The existing test only asks whether "09:25" appears anywhere in the joined span text, which an overflowing tail satisfies — so the guard is green while nothing is visible.
Where
emrg/client/python_tui/widgets/markdown.py — UserMarkdown.render (renders at ctx.width - len(prefix)) and StreamingMarkdown.render (renders at ctx.width); both append the clock to lines[0] after the fact.
emrg/client/python_tui/widgets/chat_row.py — ChatRow.render does the same.
What the fix must satisfy
The clock lives inside the terminal width. Every rendered line is at most the terminal width, and the clock is part of that line rather than an overflowing tail. The width the clock occupies is part of the budget the content is wrapped to.
One value and one format across the three paths — a live user message, a live assistant reply, and a replay through /resume or /rewind. The moment stays the daemon's; no client-side clock.
A record with no readable moment renders nothing — no (), no Invalid Date, no None.
A test asserts, for every rendered line, that its width is at most the terminal width — at widths 60, 80, 100 and 120 — and that the clock is on that line, covering the three paths above.
Mutation-checked in both directions: dropping the clock's width from the render budget must redden the test, and putting the trailing padding back ahead of the clock must redden it too.
GitHub CI green on all three platforms.
Acceptance
The four widths pass with the clock present and every line within the width; both mutations redden; CI green.
Activity
argszero commentedon Nov 2, 2026
Handled by #2669