Typing group becomes a slot sibling of the working-agent pills:
- BotActivityBar.tsx: BotActivityComposerAction gains a `typingIndicator`
prop rendered as the strip's trailing AnimatedPillSlot, so the typing
group shares the scroller, edge fades, and layout/enter/exit animations
with the pills; lone-item shrink logic now counts the typing slot
- ChannelComposerActivityRow.tsx: the row renders ONE strip hosting both
groups instead of a pill strip beside a standalone TypingIndicatorRow
- ChannelPane.tsx / MessageThreadPanel.tsx: thread panel mirrors the same
structure — ChannelPane builds the strip (thread typers included) and the
panel's activity row just mounts it; `threadTypingPubkeys` prop removed
from MessageThreadPanel; row height fixed at h-8.5 to match the channel
row so the bottom-anchored composer never bumps
- TypingIndicatorRow.tsx: drop the now-unused "activity" variant — the
strip's slot owns sizing/spacing, so only the default variant remains
- composer.css: corner-mask offset 2.5rem -> 2.625rem to match the fixed
h-8.5 activity row below the composer in both surfaces
- channels.spec.ts: new e2e covering the typing group rendering inside the
strip, trailing the pills, and scrolling under the edge fades
Align the "is working" pill with the "is typing" indicator:
- Remove the pill's border, background, shadow, and horizontal padding —
hover/open states signal through text color only
- Match label typography (text-xs font-medium, was font-semibold) and the
typing label's translate-y-px optical nudge; avatar-to-label gap-2
- Drop the labelClassName="font-semibold" overrides that compensated for
the pill's old heavier weight (channel row + thread strip)
Also document in AGENTS.md that e2e reruns need `pnpm run build:e2e` — a
plain build omits the mock-bridge module and every spec fails at boot.
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>