[Bug] Mouse click on plugin Button never fires onPress in fullscreen TUI
Bug Description
Plugin Button onPress never fires on mouse click (fullscreen TUI); keyboard works
Version: Claude Code 2.1.291 (native), macOS 26.6.2 arm64
Terminals: Ghostty 1.3.1 and Warp v0.2026.09.16.08.27.02 (same result)
Settings: "tui": "fullscreen". No tmux/screen/SSH. Reproduced with and
without Remote Control (fresh session, --settings
'{"remoteControlAtStartup":false}').
Summary
A Button drawn by a hooks-module plugin (ui.render) never runs its onPress
when clicked with the mouse. The same Button pressed via keyboard
(ctrl+x tab, then Enter) works. The types for 2.1.291 say a click raises
ui.press in the fullscreen terminal.
Minimal repro (dev mod, hot reloading enabled)
on('ui.render', { component: 'AbovePrompt' }, ($, e, next) => {
if (e.props.hasSurvey) return next(e)
const { Box, Button, Text } = $.ui.resolve(e)
return (
<Box>
<Text>click-test band: </Text>
<Button key="band" variant="primary" label="click me (band)"
onPress={press => {
$.ui.log(band pressed (${press.component}, ${press.surface}),
{ to: 'debug' })
$.ui.toast('click-test: band OK')
}} />
</Box>
)
})
Steps
- claude --debug, load the mod above.
- Left-click [ click me (band) ] (plain click, no modifiers).
- Then press ctrl+x, tab, Enter.
Expected: both raise ui.press and show the toast.
Actual:
- Mouse click: nothing. No ui.press / $.ui.log / toast line in the debug
log. No refused / threw / does-not-validate line.
- Keyboard: works. Log shows
"[click-test] $.ui.log (to debug): band pressed (AbovePrompt, terminal)".
Also affects transcript buttons
The prismantis plugin (github.com/NahumLitvin/prismantis) draws copy
Buttons in AssistantMessage / CommandOutput rows. Clicking them does
nothing either: no "$.ui.copy (prismantis)" or "clipboard: setClipboard"
line is logged. Its own test suite (claude plugin test, 122/122 pass)
presses those buttons fine through the engine, and calling $.ui.copy from
a slash command works and logs "path native, OSC 52 written; copied".
There is no keyboard path to buttons inside transcript rows
("ctrl+x tab" is bound to abovePrompt:focus), so there they can't be
pressed at all.
Debug log facts
- Terminal capabilities: mousePixels=yes (DECRPM 1016 status=2),
kittyKeyboard=yes, terminal ghostty 1.3.1
- fullscreen boot canary: healthy
- The plugin re-renders while the pointer moves over the rows, so mouse
events reach the app; only the press is lost.
Related: https://github.com/NahumLitvin/prismantis/issues/28
Environment Info
- Platform: darwin
- Terminal: ghostty
- Version: 2.1.291
- Feedback ID: 850aebfe-18ba-4955-978c-79d44d1ac376