Agent pane: a message's sender chip opens that chat beside this one, its tooltip naming the machine

Merged
TE
13d ago
+26356-25991

What

Leo, about the sender chip on another agent's message in the agent pane (Leo-ask: ask-7325396234):

I THINK I WANNA BE ABLE TO CLICK ON THESE TO ACTUALLY GO TO THEM

Before: clicking a lane's chip (chief-ui, coord-deputy) did nothing. The chip already sent chat.offer.open, but the app opens that only for this chat's own family (#23159) and refused every other chat. A lane on a peer host also never resolved: acpmux lists it as huge-blue/chief-ui, while its message is signed with the bare name chief-ui.

After: clicking the chip opens the sender's acpmux chat in the pane to the right. If a tab already shows that chat, the click focuses it instead. This works for lanes on this Mac and on peers. The tooltip reads "Open chief-ui (huge-blue)", the session name plus its host (the gallery fixture uses the neutral host name studio-mac); for a chat on this Mac it reads "Open coord-deputy". Hover uses the theme accent ring over glass with cursor:pointer, and no orange.

Takes back #23159: nothing is reverted. AgentPaneRequest.offerOpen(String) becomes offerOpen(String, sender: Bool) so a message's sender chip can open its chat; #23159's family-only rule still holds for every other chat.offer.open caller.

How

  • Page (App.tsx): the chip's click goes through the existing chat.offer.open bridge call with sender: true. It is a separate openSenderChat, so sub-session cards and the Subagents summary keep the family-only rule. The queued-message line (ComposerQueue.tsx) uses the same path through Subsessions.openSender.
  • App (AgentPaneOfferOpen): sender lets the call open any session the pane's daemon lists. This grants nothing new, because the page can already show any of those sessions in its own tab. Never the chat itself, and never from a New Tab page. No new native API: it reuses showSession/openSide from #23159.
  • subsessions.ts (useSenderChat): a peer's chat is also found by its bare name, and the store records each chat's host (cloudHost) for the tooltip.
  • New string subagents.openOnHost ("Open {name} ({host})") is translated in all 21 locales the agent-pane catalog ships.

Screenshots

Gallery entry agent-pane.incoming-message, variant sender-hover (Playwright on huge-blue, pointer over the chip):

DarkLight
sender chip hover darksender chip hover light

No capture: the Swift change only adds a request flag and draws nothing new. The chip's hover and tooltip are webview, captured from the gallery above.

Tests

  • webviews/test/incoming-sender-chip.test.tsx covers four cases. A peer lane found by its bare name opens by its id, with tooltip "Open chief-ui (huge-blue)". A local chat opens by its message's id and its tooltip names no host. An unknown sender is not a button. A queued message's chip calls openSender, not the family-only open.
  • AgentPaneOfferOpenTests.aMessagesSenderOpensBesideTheChat covers the app side. With sender, a non-family chat opens beside the chat, and a second click focuses its tab. Without sender it is still refused, and the chat itself is never opened.
  • Run on huge-blue: the new test and queue-agent-message, subsessions and incomingMessage tests pass, bun run typecheck is clean, and so is prepush-gate.py. The Swift test runs on CI.

Agent session: Air-Blue

🤖 Generated with Claude Code