Agent pane: a subagent's own pane shows it read only, without the chat's composer, queue or PR bars
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 onsubagent:<id>(the app's reveal) setsownSubagentPane, and the bottom stack rendersSubagentPaneFooterinstead 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) andsubagents/subagents.css: the read-only line.Localizable.xcstrings: newsubagents.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 testfromwebviews/). The chat's pane keeps its composer, queue and PR bar. After thesubagent:a1reveal, 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.pyand 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.openTabrefuses the pane's own session). A restored subagent tab also comes back as a full chat, because thesubagent: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
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>setsownSubagentPane; the bottom stack rendersSubagentPaneFooterinstead 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.paneReadOnlylocalization 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.