[Bug] Mouse click on plugin Button never fires onPress in fullscreen TUI

Status Fixed / completed
Reported on v2.1.291
Maintainer reply None cached
Activity 0 comments · opened Oct 6, 2026 · closed Oct 6, 2026

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

  1. claude --debug, load the mod above.
  2. Left-click [ click me (band) ] (plain click, no modifiers).
  3. 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

View original on GitHub ↗