Repository navigation
feat(agents): show a timestamp on each activity feed entry - #1443
Conversation
Render every transcript item's own time beside it, and hydrate Codex item times from the rollout's item_completed records instead of the turn start. Items without a rollout record keep the turn time. Signed-off-by: Will Pfleger <wpfleger@block.xyz>
Signed-off-by: Will Pfleger <wpfleger@block.xyz>
…times Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…ed time formats Codex history can record a finish with no start, which was dropped. Entry stamps built two Intl formatters per render and their hover text drifted from the shared full timestamp, which includes the time zone. Signed-off-by: Hayt <211b96e6a2b7f45fd4047988976c7bbbeeda0c15f3ae7b32eec20834b5a55118@buzz.block.builderlab.xyz>
…rmat The heading built a locale formatter on every render and showed the browser's default date. An unknown start now omits the date instead of showing 1970 or throwing from the cached formatter. Signed-off-by: Hayt <211b96e6a2b7f45fd4047988976c7bbbeeda0c15f3ae7b32eec20834b5a55118@buzz.block.builderlab.xyz>
…finish A recorded finish without a start was paired with the turn start, so the feed showed time since the turn began as the tool's duration. Move an existing app-server duration back from the finish instead, or leave the finish unset. Signed-off-by: Hayt <211b96e6a2b7f45fd4047988976c7bbbeeda0c15f3ae7b32eec20834b5a55118@buzz.block.builderlab.xyz>
A rebuilt exec/wait call with a missing or invalid timestamp starts at the turn-start fallback; pairing it with a real output time showed a fabricated duration. Signed-off-by: Hayt <211b96e6a2b7f45fd4047988976c7bbbeeda0c15f3ae7b32eec20834b5a55118@buzz.block.builderlab.xyz>
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Re-reviewed at 8af844d. The shared cached date formatters fix the per-render Intl cost, and recorded Codex times no longer invent durations: a lone finish moves the app-server duration back, and an undated restored call gets no finish. Focused vitest and tsc pass.
| "Turn", | ||
| new Date(turn.startedAt).toLocaleString(), | ||
| known(turn.startedAt) && | ||
| formatItemTimestamp(turn.startedAt / 1000, { withTime: true }), |
There was a problem hiding this comment.
🤖 [P3, non-blocking] Relative turn heading can go stale after midnight
The heading now uses the relative formatItemTimestamp ("2:34 PM" for today, "Yesterday at 2:34 PM" before that), but Turn doesn't subscribe to useLocalDay() the way MessageTimestamp and DayDivider do. A transcript left idle overnight keeps showing a bare "2:34 PM" for yesterday's turn until something else re-renders it. The live feed re-renders often, so the effect is small. Fix: call useLocalDay() once in Turn.
* origin/main: (56 commits) Polish huddle portraits and thread layout (block#1406) fix(goose): keep long model names inside the Settings model row (block#1432) feat(agents): show a timestamp on each activity feed entry (block#1443) feat(agents): add buttons to compact and start new session (block#1434) feat(activity): request and show Claude Code and Codex thinking (block#1452) add inline renaming for Solo sidebar chats (block#1345) fix(goose): say why the profile has no model to choose (block#1445) Add Marketplace tab and shared agent profile panels (block#1411) fix: publish scoped typing indicators from conversation composers (block#1435) feat: add configurable composer and pane focus shortcuts (block#1418) perf(messages): reuse captured video opening frames on remount (block#1437) FOR OCT 22: let agents clone and push their channel's repository (block#1324) perf(relay): keep row profile map identity while new authors load (block#1431) perf: avoid redundant relay channel derivation (block#1412) Normalize dialog sizing, headers, spacing, and motion (block#1403) Polish agent activity pills and popover actions (block#1429) feat(agents): ask to resume claude and codex turns stopped by reload or quit (block#1235) test(sign-out): join listed paths with / so the tests pass on Windows (block#1247) fix(deps): remove distrusted emsign certificate roots (block#1436) fix(plugins): distinguish usage and costs from agent activity (block#1392) ... Signed-off-by: Nikolaj Goodger <ngoodger@squareup.com>
Every activity feed entry (tool calls, thinking, messages, plans, status) now shows its own time, matching old Buzz's transcript row timestamps.
ActivityTranscript.tsx: each entry's existingatrenders under it as a small, muted, left-aligned<time>(hour and minute), with the full date, time and time zone on hover. Both use the cached formatters inshared/datetime.ts(formatTime,formatFullTimestamp), so the hover text matches message timestamps. The turn heading above each turn uses the sharedformatItemTimestampformat ("3:04 PM", "Yesterday at 3:04 PM", "Jun 20, 2025 at 3:04 PM"). The prompt entry has no time of its own; the turn heading already dates it. Calls nested inside a CodeMode script get their own time inside the expanded details. An entry or turn whose time is unknown (zero, non-finite, or an invalid date) shows no time.restoreRecordedToolsalready reads the rollout; it now sets each item'satfromitem_completed.started_at_ms, and a tool'scompletedAtfromcompleted_at_ms. A tool's duration is never invented: when only the start is recorded, an existing app-server duration is shifted onto it; when only the finish is recorded, an existing duration is moved back from that finish, and a tool with no duration keeps none. A zero in either field means unknown. A rebuilt CodeModeexec/waitcall whose own record has no valid timestamp gets no finish from its output. Items with no rollout record keep the turn time.