diff --git a/desktop/src/features/channels/ui/BotActivityBar.tsx b/desktop/src/features/channels/ui/BotActivityBar.tsx
index 238624cf7..dd116c29b 100644
--- a/desktop/src/features/channels/ui/BotActivityBar.tsx
+++ b/desktop/src/features/channels/ui/BotActivityBar.tsx
@@ -2,7 +2,6 @@ import * as React from "react";
import { Loader2 } from "lucide-react";
import { AnimatePresence, motion, useReducedMotion } from "motion/react";
-import { useAgentWorking } from "@/features/agents/agentWorkingSignal";
import {
getAgentTranscript,
subscribeAgentObserverStore,
@@ -163,10 +162,9 @@ function useStripHoverPopover(): StripHoverPopover {
* `composerLiveActivity` preview flag off, the hover popover keeps the
* legacy "View activity" item instead.
*
- * Typing-fallback-only agents (working source "typing", no observer turn)
- * render a passive, borderless, width-uncapped status instead: no hover
- * card, no click-through, not focusable — there is no transcript or session
- * behind the signal to open.
+ * Only observer-backed agents reach this pill: typing-fallback-only agents
+ * are diverted into the combined typing indicator group by
+ * ChannelComposerActivityRow before the strip renders.
*/
function BotActivityAgentPill({
agent,
@@ -197,10 +195,6 @@ function BotActivityAgentPill({
const pillKey = agent.pubkey.toLowerCase();
const open = hover.activePubkey === pillKey;
const shouldReduceMotion = useReducedMotion();
- // Typing-fallback-only agents (no observer turn) render borderless and
- // uncapped — the basic "is typing" presentation.
- const typingOnly =
- useAgentWorking(agent.pubkey, channelId).source === "typing";
const transcript = useAgentTranscript(true, agent.pubkey);
const now = useNow(PILL_LABEL_TICK_MS);
const headline = React.useMemo(
@@ -209,11 +203,8 @@ function BotActivityAgentPill({
);
const activeId = headline?.id ?? GENERIC_LABEL_ID;
// No fresh action headline (see deriveActivityPillLabel) — decay to the
- // 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"}…`;
+ // agent-named generic working label.
+ const activeLabel = headline?.label ?? `${agent.name} is 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
@@ -261,7 +252,7 @@ function BotActivityAgentPill({
<>
@@ -288,20 +279,6 @@ function BotActivityAgentPill({
>
);
- // Typing-fallback-only: a passive status readout — no hover card, no
- // click-through, not focusable. There is no observer turn (and so no
- // transcript or session) behind it to open.
- if (typingOnly) {
- return (
-