Desktop app draws a mod's AbovePrompt band in only one chat at a time
Environment
- Claude desktop app 1.40609.1.0 (Windows, MSIX install), Code tab, two chats open side by side
- Claude Code 2.1.286
Summary
A mod's AbovePrompt band is only drawn in one chat at a time. With two chats open side by side, both run the mod, but the desktop app only ever asks one of them for the band. The other chat gets nothing above its prompt.
Mods that put live information in the band (usage, timers, status) need it in every open chat, not just one.
Evidence
The mod (trek-band) is loaded in every chat via CLAUDE_CODE_PLUGIN_DIRS and draws both a SessionMode footer item and an AbovePrompt band. A diagnostic in the mod logged session.start and every ui.render call for AbovePrompt, per session:
- Left chat:
AbovePromptwas requested about once a second (surface=desktop hasSurvey=false requestId=above-prompt), and the band showed. - Right chat:
session.startran, and itsSessionModefooter item rendered and updated. ButAbovePromptwas never requested, not once, so no band appeared.
Where it happens
In the desktop renderer, the band component only renders for an active, local, unshared session:
Band:_(function(e){ ... let {sessionRef:n,isPanelActive:r}=e, i=Ye(n), a=n?.type==="local"&&i&&r?n:null; ... a===null?null:E(Rm,{sessionId:a.id,component:"AbovePrompt",instanceId:"above-prompt", ...})
isPanelActive is false for every panel except one, so only that panel's session is asked for AbovePrompt. The plugin types describe the band as "one instance".
Ask
Draw each open chat's own AbovePrompt band, the way SessionMode is already drawn per chat. Or give mods a per-chat band site that shows whether or not the panel is active.
Related: #99211 (the desktop redraws every mod site on any state change).
9 Comments
Same issue on macOS, with one more symptom: in some chats the band is never drawn, even when that chat is the active panel.
Environment: Claude desktop app 2.19675.0 on macOS 27.0.1, Code tab, several chats open. Claude Code 2.1.286. The mod is an installed plugin that draws both a
SessionModefooter item and anAbovePromptband.What we see:
AbovePromptis never requested.SessionModeitem renders and updates normally./reload-pluginsCmd+R(window reload)Where it seems to happen: in the renderer bundle, the band is gated on three conditions:
Xereads the session's meta query and returnsmeta?.isShared === false, falling back tofalsewhen there is no data.fetchMetabuilds that meta withisSharedhard-coded to false.refetchOnMountoff for local sessions. Focus and interval refetch apply only to remote and bridge sessions.Our reading is that in the affected chats the meta query came back empty once and is never fetched again, so
istays false. We could not observe that first empty fetch directly, so this part is inferred from the code.Ask:
Related: #99211. The rebuild on every
ui_invalidateis what made our band's buttons lose clicks until we removed every per-second state write.+1
Same on Windows with Claude desktop 2.19675.1 and Claude Code 2.1.288/2.1.289, five chats in split view. The band follows the leftmost pane, not keyboard focus: with the focused chat in pane 4, only pane 1 drew it. Moving a chat into the leftmost pane gave it the band, and moving one out took it away (two chats, both directions). The mod was live in every chat: its 60 s
session.starttimer ran in every session's process.Same here on Windows, with a measurement that points at the split view's left pane rather than the focused pane.
Environment: Claude desktop app 2.19675.1.0 (Windows, MSIX), Code tab, main window split into two panes side by side. Claude Code 2.1.286. The mod is loaded in every chat via
CLAUDE_CODE_PLUGIN_DIRSand draws anAbovePromptband. A temporary counter in the mod recorded everyui.rendercall forAbovePromptper session.What we measured:
session.startran, its slash command answered, its data was ready), butAbovePromptwas requested 0 times over about 20 minutes. That stayed 0 after typing/reload-pluginsand the mod's command directly into that pane.AbovePromptrequests started within seconds (surface=desktop,hasSurvey=false) and the band showed. The chat that took the right pane lost its band.So in our case the gate behaves like "left (first) pane only": typing into the right pane did not make it ask for the band, while moving it to the left did.
Still happening on the latest builds: Claude desktop 2.26454.2 on macOS 27.0.1, Claude Code 2.1.293.
Two chats side by side in split view, same plugin loaded in both. The left pane's band draws and updates every second; the right pane never gets one. I added a temporary command to the plugin that reports what its last AbovePrompt render did: in the left chat it said the band was drawn, in the right chat AbovePrompt had never been called at all, even after that chat finished a turn.
Opening the same chat in its own window brings the band straight back.
So it's tied to the pane, not the session or the plugin. Each pane should get its own band, the same as it does when the chat has a window to itself.
Adding a detail on Claude desktop 2.26454.2 (macOS), Claude Code 2.1.295: it is not only the AbovePrompt band. A plugin Pane opened with $.ui.open (here by a /pages command the plugin registers) also collapses as soon as its chat is moved out of the leftmost split-view pane, and comes back when the chat is dragged back to the leftmost pane. The plugin's status line ($.ui.status) behaves the same way. So every plugin surface follows the leftmost pane, not the chat it belongs to.
Same here on Windows 11: Claude desktop 2.26454.2, Claude Code 2.1.293. The session in the right split pane never gets a
ui.rendercall forAbovePrompt. A diagnostic counter stayed at 0 for about 8 minutes, even though the mod calls$.ui.invalidate('ui.render')every 30 s and$.session.surfaces()returns['desktop']. A few points that might help:$.ui.open({ id })from a command in the right pane returns{ isPlaced: true }, but no pane appears.Linux data point, and one result that differs from the status line comment above.
Environment: Claude desktop app 2.26454.2 on Linux (Wayland), Code tab, Claude Code 2.1.293. Two sessions side by side. The mod is loaded in every session via
CLAUDE_CODE_PLUGIN_DIRS.Band: same as the reports above.
AbovePromptdraws in the left pane only. Moving the same session into the left pane makes the band appear, and focus does not matter. The mod has no pane or session logic.Status line:
$.ui.statusis drawn in the right pane here. A new session in the right pane shows the mod's line in its composer footer and no band above the prompt. The line reads ctx 15% · 5h 65% · wk 90%. An earlier comment says the status line follows the leftmost pane too. On this build it does not.<img width="2000" height="225" alt="Image" src="https://github.com/user-attachments/assets/04a6d05f-afa5-4bb0-b8d8-e36206a64bb2" />
Screenshot, cropped to the composers: the left pane draws the band, the right pane draws no band and shows the status line in its footer. The left session started before I added the status line to the mod, so its footer has none.
I use the status line as a workaround for a per-pane usage readout. It also needs
CLAUDE_CODE_PLUGIN_DIR_WATCH=1in the settingsenvblock to reload on save in desktop sessions.Still happening on Claude desktop 2.31226.1.0 (Windows 11, MSIX), Claude Code 2.1.295 — newer than every build reported above. Three mods from one marketplace (two
AbovePromptbands plus a third band and aPane), two chats in split view. The right-pane chat had all mods live (one of them writes a per-turn cost record for that session, and it kept growing), yet none of its bands was drawn, also while it was the focused pane. Swapping the panes moved all bands with the session; the same session opened in a pop-out window drew all of them at once. So the gate is still the leftmost pane, not focus or the session.