Agent pane: a subagent's own pane shows it read only, without the chat's composer, queue or PR bars

Merged
TE
17d ago
+768-325

A subagent's own pane now shows the subagent read only. It no longer draws the chat's composer, queued prompts, pull request bars or agents pill. Leo's screenshot (2026-10-20) showed a reviewer subagent's pane with the chat's queued "this is a bit spammy" and its #663 bar. That pane is a tab on the chat's own acpmux session, so the bottom of the page was the chat's: a prompt typed there went to the chat. The pane now ends in one line, "Read only · messages go to ".

The same screenshot showed the subagent opening a pane by itself. Base doesn't do that since #22615 (Austin, default off), which landed after the build Leo was likely running. Every other path that opens a subagent pane is a click. This PR adds a behavior test for that default: a subagent the chat starts opens no pane, and with the switch on it opens exactly one.

Changes

  • App.tsx: a pane opened on subagent:<id> (the app's reveal) sets ownSubagentPane, and the bottom stack renders SubagentPaneFooter instead of the composer stack. A chat pane that shows a subagent in place (a host that opens no panes) keeps its composer.
  • subagents/SubagentPaneFooter.tsx (new) and subagents/subagents.css: the read-only line.
  • Localizable.xcstrings: new subagents.paneReadOnly, in 21 locales.
  • No change to the queue rows (ComposerQueue.tsx, which prompt-queue-edit owns) or to the composer's send mode (which steer-default is changing).

Testing

  • test/subagent-pane-own-state.test.ts (browser lane, bun test from webviews/). The chat's pane keeps its composer, queue and PR bar. After the subagent:a1 reveal, the pane has no composer, no queued row and no PR bar, and shows the read-only line. Expected red at e480620a481 (test only) and green at the head. CI's browser lane is the first run.
  • test/subagent-panes-auto-open.test.tsx: the default-off hook on a subagent that starts while the chat shows. It passes on base too: base already behaves this way, and this pins it.

Observed / Not run

  • Observed: prepush-gate.py and the pre-push web lint passed.
  • Not run locally: the tests and the gallery (no test runs on Leo's Mac).
  • Follow-up, not in this PR: a "Message parent" action in the footer needs a native action that focuses the chat's own tab, which base doesn't have (chat.openTab refuses the pane's own session). A restored subagent tab also comes back as a full chat, because the subagent: reveal isn't saved with the tab.

Changelog

  • Fixed: A subagent's pane no longer shows the chat's composer, queued prompts or pull request bars.

Agent session: cosmic-gray

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

A subagent's own pane now shows the subagent read only, without the chat's composer, queued prompts, or pull request bars.

Previously, a pane opened on subagent:<id> was a tab on the chat's session, so it drew the chat's composer, queue, and PR dock — and a prompt typed there went to the chat. The pane now ends in a single line, "Read only · messages go to ".

The read-only state applies only while the pane shows a subagent: once it shows a chat ("Subagent of", a branch pill, or another harness), that chat's composer, queue, and PR bars come back. While a subagent is shown, the header's PR chip and the summary's Sources + stay off.

Changes

  • A pane revealed via subagent:<id> sets ownSubagentPane; the bottom stack renders SubagentPaneFooter instead of the composer stack while it shows a subagent. A chat pane showing a subagent in place keeps its composer.
  • The header's pull request chip (pullRequestChip) and the Sources + attach button are disabled in the pane's read-only state.
  • Adds subagents.paneReadOnly localization in 21 locales.
  • Adds browser tests covering the pane's read-only state, the return of the chat's composer via "Subagent of", and the default-off behavior where a subagent the chat starts opens no pane of its own.