From 6540084ddf22da4a84752bba00941ebf3c5a5ba7 Mon Sep 17 00:00:00 2001 From: Dotta Date: Wed, 11 Mar 2026 21:47:21 -0500 Subject: [PATCH] Add inbox live badge and timestamp Co-Authored-By: Paperclip --- ui/src/pages/Inbox.tsx | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/ui/src/pages/Inbox.tsx b/ui/src/pages/Inbox.tsx index 9abea715..a00cc9b8 100644 --- a/ui/src/pages/Inbox.tsx +++ b/ui/src/pages/Inbox.tsx @@ -16,6 +16,8 @@ import { EmptyState } from "../components/EmptyState"; import { PageSkeleton } from "../components/PageSkeleton"; import { ApprovalCard } from "../components/ApprovalCard"; import { IssueRow } from "../components/IssueRow"; +import { PriorityIcon } from "../components/PriorityIcon"; +import { StatusIcon } from "../components/StatusIcon"; import { StatusBadge } from "../components/StatusBadge"; import { timeAgo } from "../lib/timeAgo"; import { Button } from "@/components/ui/button"; @@ -349,6 +351,15 @@ export function Inbox() { () => getLatestFailedRunsByAgent(heartbeatRuns ?? []).filter((r) => !dismissed.has(`run:${r.id}`)), [heartbeatRuns, dismissed], ); + const liveIssueIds = useMemo(() => { + const ids = new Set(); + for (const run of heartbeatRuns ?? []) { + if (run.status !== "running" && run.status !== "queued") continue; + const issueId = readIssueIdFromRun(run); + if (issueId) ids.add(issueId); + } + return ids; + }, [heartbeatRuns]); const allApprovals = useMemo( () => @@ -808,6 +819,35 @@ export function Inbox() { key={issue.id} issue={issue} issueLinkState={issueLinkState} + desktopMetaLeading={( + <> + + + + + + + + {issue.identifier ?? issue.id.slice(0, 8)} + + {liveIssueIds.has(issue.id) && ( + + + + + + + Live + + + )} + + )} + mobileMeta={ + issue.lastExternalCommentAt + ? `commented ${timeAgo(issue.lastExternalCommentAt)}` + : `updated ${timeAgo(issue.updatedAt)}` + } unreadState={isUnread ? "visible" : isFading ? "fading" : "hidden"} onMarkRead={() => markReadMutation.mutate(issue.id)} trailingMeta={