feat(composer): label typing-fallback pills "is typing…" instead of "is working…"

- BotActivityBar.tsx: the generic decay label on a typing-fallback-only
  pill (working source "typing", no observer turn) now reads
  "<name> is typing…", matching the human typing indicator's vocabulary;
  observer-backed pills keep "<name> is working…"
- A fresh action headline still wins over both generic labels
- Both generic labels share the same ticker id, so a typing → observer
  source upgrade updates the text in place instead of playing the
  push-up swap

Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
This commit is contained in:
Taylor Ho
2026-08-05 16:41:56 -07:00
committed by Carl
parent ee7f183e26
commit fbdd4b2dcb
@@ -209,8 +209,11 @@ function BotActivityAgentPill({
);
const activeId = headline?.id ?? GENERIC_LABEL_ID;
// No fresh action headline (see deriveActivityPillLabel) — decay to the
// agent-named generic working label.
const activeLabel = headline?.label ?? `${agent.name} is working…`;
// agent-named generic label. Typing-fallback-only agents read
// "is typing…" (matching the human indicator's vocabulary); observer-backed
// agents read "is working…".
const activeLabel =
headline?.label ?? `${agent.name} is ${typingOnly ? "typing" : "working"}…`;
// The rendered label lags the derived one while the pill is moving: the
// push-up ticker plays after the slot settles (or immediately when idle).
// Keyed by transcript item id, not label text — a NEW action swaps, while
@@ -313,7 +316,7 @@ function BotActivityAgentPill({
<PopoverTrigger asChild>
<button
aria-label={`${agent.name} is working. View activity.`}
className="inline-flex h-7 min-w-0 max-w-49 items-center gap-1.5 rounded-full border border-border/60 bg-background px-2 text-xs font-semibold leading-none text-muted-foreground shadow-xs transition-colors hover:border-primary/30 hover:bg-primary/5 hover:text-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring data-[state=open]:border-primary/40 data-[state=open]:bg-primary/10 data-[state=open]:text-primary"
className="inline-flex h-7 min-w-0 max-w-50 items-center gap-1.5 rounded-full border border-border/60 bg-background px-2 text-xs font-semibold leading-none text-muted-foreground shadow-xs transition-colors hover:border-primary/30 hover:bg-primary/5 hover:text-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring data-[state=open]:border-primary/40 data-[state=open]:bg-primary/10 data-[state=open]:text-primary"
data-testid="bot-activity-composer-trigger"
onBlur={hover.scheduleClose}
onClick={(event) => {