Two things this release does that the last one did not: it installs what it is
missing, and it clicks.
Clicks were never clicking
click was registered against _click_context, the helper that describes what
sits under a point — it had been inserted between @server.tool("click", ...)
and the function that decorator was meant to bind, so the server bound the
diagnostic as the handler and tool_click was never registered at all.
The failure was silent and convincing. _click_context takes (x, y), exactly
what the schema sends, and returns on "Firefox" (firefox). Every click
reported the window it would have hit, and none of them pressed a button. Only
a screenshot afterwards would have contradicted the text.
Fixed, and confirmed against the registry rather than by eye:
server.tools["click"].handler is tool_click again.
Missing dependencies now explain themselves, then install
Before: a tool that failed for want of an installation said so in the language
of whatever failed — a Wayland interface name, an errno on /dev/uinput — and
the setup tool could only finish the parts needing no root, because it ran
setup.sh --no-sudo. Everything else came back as commands to paste.
Now every tool with a dependency is wrapped by _needs(component). When one
fails it asks whether a missing component is the reason, and if so the failure
carries the original error plus what to tell you, what is about to be
installed, and whether a password dialog is coming:
InputError: /dev/uinput: Permission denied
mouse and keyboard control is not available on this desktop yet: /dev/uinput
is not writable, so mouse and keyboard control is unavailable.
The extension can install this itself. Before calling anything, tell the user,
in your own words:
mouse and keyboard control is not set up on this machine yet. I will
install what is missing - your desktop will ask for your password, and
that prompt is this installation.
The check runs after the attempt, not before it. The setup report is
deliberately conservative — it calls input unavailable whenever /dev/uinput
is unwritable, even on an X11 session where xdotool would have served
perfectly well — so refusing up front on that basis would have broken working
desktops. Reacting to a failure that actually happened cannot.
Root steps happen, through the desktop's own prompt
provision.apply() runs setup.sh --gui-sudo, which reaches root through
pkexec. That is the only route available: the server has no controlling
terminal, so sudo has nowhere to ask for a password, while pkexec hands the
prompt to the session's polkit agent.
An unexplained polkit dialog raised by a background process is
indistinguishable from malware, so nothing runs until you have been told twice
— once by Claude, from the text the failure handed it, and once by a desktop
notification posted immediately before the run. Declining is a normal outcome
rather than an error: the command lands in manual_steps for you to run
yourself. The new Install missing dependencies automatically setting
(LCU_ALLOW_INSTALL) turns the path off entirely, leaving the server to report
and explain and never install.
Packages go through the new scripts/install-packages.sh in a single root
invocation — pkexec raises a separate dialog per command, so installing five
packages one at a time would have meant five dialogs. It keeps the old
best-effort behaviour: a batch install first, then one at a time so a package
name that does not exist on your release cannot take the rest down with it.
Two bugs only pkexec exposed
install-uinput-rule.sh derived its target from ${SUDO_USER:-$USER}. Under
pkexec there is no SUDO_USER and USER is already root, so it would have
added root to the input group and left the real user without access. It
now takes the user as an argument, falls back to PKEXEC_UID, and refuses to
configure root.
apply() passed the server's stdin — the JSON-RPC stream — to setup.sh,
where a password prompt would have consumed the client's messages. It is now
/dev/null.
GNOME: listing works, control needs the extension
Mutter implements ext_foreign_toplevel_list_v1, so a GNOME Wayland session
resolves to the foreign-toplevel backend and lists windows without the helper
extension. That protocol carries no requests, and it had taken the install
instructions off the path that needs them most: every GNOME user is in exactly
this state between running setup.sh and logging back in.
activate, close, set_state, and move_resize now check up front and
raise the helper's install steps instead of a bare protocol error. Every other
route into Mutter is closed — the Shell's Eval endpoint has been disabled
since GNOME 41, and Introspect.GetWindows is restricted to an allowlist of
XDG portals.
scripts/test-gnome-messaging.py covers this from KDE or X11, where it is
otherwise unreachable.
Also
status()is cached for 30 seconds and hands out copies; it is now on the
path of every tool call with a dependency, and re-runninggdbusand
gsettingsbefore each click would cost more than the click.- A desktop notification at startup names what is unavailable, so an incomplete
install is not something you first learn about mid-task.
Install
Download linux-computer-use-1.2.0.mcpb and drag it onto Claude Desktop's
Settings → Extensions pane. Then ask Claude to check its setup.