010c9925e3
The canonical Bot Chat is hidden from session lists by design, so profiles.list's last_session never advances when you message a bot there. PR #88690 moved the roster PREVIEW to preferred_session but left every activity signal on last_session — a bot you just messaged showed '6d ago', never pulsed, never badged, and sorted below stale bots. New botActivitySession(bot) helper returns the fresher of preferred_session (the pinned Bot Chat, resolved precisely by the backend) and last_session (newest visible conversation). All four activity sites key off it now: - row age label (relativeTime) - active-now pulse dot + activeBots strip - unread watermark + activity toast preview - roster recency sort (activityOf) Older gateways without the preferred_session resolver degrade to last_session exactly as before. Backend untouched. Tests: extracted the real helper into the vm harnesses (no stub drift), 5 new behavior tests; sabotage-verified they fail against the old code.