authorgravatar for maria@kuuro.netmaria <maria@kuuro.net> 2026-10-15 03:32:02+00:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-10-15 03:32:02+00:00
loge536bfd33bc3c351997141d93790df75eeded7b9
tree0d0a7fa2429b1eba67e12f8a8fd49943db857327
parent21bedfb175b9eec8652adc35d7882bdc3c3c9d59
signature Signed by PGP key B5690EEEBB952194

feat(web,mobile): waiting status shows a dot-dashed icon and a timer (#19617)


3 files changed, 12 insertions(+), 2 deletions(-)

apps/mobile/src/components/AppSymbol.tsx+1
......@@ -175,6 +175,7 @@ const ANDROID_ICON_BY_SF_SYMBOL = {
175175 circle: IconCircle,
176176 "circle.dashed": IconCircleDashed,
177177 "circle.inset.filled": IconCircleDot,
178 "circle.dashed.inset.filled": IconCircleDot,
178179 clock: IconClock,
179180 timer: IconClock,
180181 ticket: IconTicket,
apps/mobile/src/features/threads/thread-list-v2-items.tsx+1-1
......@@ -92,7 +92,7 @@ const STATUS_LABEL_BY_STATUS: Partial<Record<ThreadListV2Status, StatusLabel>> =
9292 },
9393 waiting: {
9494 label: "Waiting",
95 icon: "clock",
95 icon: "circle.dashed.inset.filled",
9696 className: "text-foreground-muted",
9797 iconTintClassName: "accent-foreground-muted",
9898 },
apps/web/src/components/Sidebar.tsx+10-1
......@@ -72,6 +72,7 @@ import {
7272 CircleAlertIcon,
7373 CircleCheckIcon,
7474 CircleDashedIcon,
75 CircleDotDashedIcon,
7576 ClockIcon,
7677 EyeIcon,
7778 FolderIcon,
......@@ -1313,7 +1314,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: {
13131314 // Waiting is calm background presence (post-settle background
13141315 // roster), not active progress, so the label keeps full strength.
13151316 label: "Waiting",
1316 icon: null,
1317 icon: "waiting" as const,
13171318 className: "text-muted-foreground",
13181319 }
13191320 : status === "approval"
......@@ -2061,6 +2062,8 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: {
20612062 >
20622063 {topStatus.icon === "working" ? (
20632064 <CircleDashedIcon aria-hidden className="size-4 shrink-0" />
2065 ) : topStatus.icon === "waiting" ? (
2066 <CircleDotDashedIcon aria-hidden className="size-4 shrink-0" />
20642067 ) : topStatus.icon === "input" ? (
20652068 <MessageCircleQuestionIcon aria-hidden className="size-4 shrink-0" />
20662069 ) : topStatus.icon === "approval" ? (
......@@ -2078,6 +2081,12 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: {
20782081 <span aria-hidden>
20792082 <WorkingDuration startedAt={resolveWorkingStartedAt(thread)} />
20802083 </span>
2084 ) : status === "waiting" ? (
2085 // Waiting starts when the turn ends and background
2086 // work keeps the thread held.
2087 <span aria-hidden>
2088 <WorkingDuration startedAt={thread.latestRun?.completedAt ?? null} />
2089 </span>
20812090 ) : null}
20822091 </span>
20832092 )