Skip to content

chore(cua-driver): release 0.34.1 - #4895

Merged
f-trycua merged 8 commits into
release/cua-driver-0.34.xfrom
chore/cua-driver-0.34.1
Oct 9, 2026
Merged

f-trycua merged 8 commits into
release/cua-driver-0.34.xfrom
chore/cua-driver-0.34.1

Conversation

@f-trycua

@f-trycua f-trycua commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Why

T3 Code pins Cua Driver 0.34.0 by asset size and SHA-256, and only takes fixes from published releases. It still ships a local Linux patch of 0.34.0 (pingdotgg/t3code#16975). The fixes from that patch are now on main, but only reach users with 0.35.0 (#4738), which is on hold and changes the UniFFI ABI.

This PR prepares 0.34.1 on a release line cut from cua-driver-rs-v0.34.0 (b0968e1). It carries only those fixes and keeps the contract and UniFFI surface of 0.34.0, so T3's 0.34.0 JS/TS bindings keep working and T3 only updates its checksums and pin.

Base is release/cua-driver-0.34.x, not main. Nothing here merges into main, and main's .release-please-manifest.json stays at 0.34.0, so the nightly ancestry check is unaffected.

What

Backported from main (each commit cites its source):

PR main commit Backport
#4877 Wayland env var pass-through for embedded hosts 07cbc6c clean; THIRD_PARTY_NOTICES keeps the 0.34.0 table plus the T3 Code row
#4880 libei waits for the EIS acknowledgement 9487b0f clean
#4879 persistent session-bus transport for the GNOME helper 48cc491 clean
#4882 GNOME per-window capture, WinRects v10, installers never downgrade 78212ad clean except the notices row (full T3 Code row, as on main)
#4881 display_only on get_window_state (macOS, Windows, Linux) 4cbd096 reworked; see below

Release metadata, chore(cua-driver): release 0.34.1: every version site in release-please-config.json, the driver Cargo.lock, the three cua-spacesd lockfiles, this branch's manifest, and the reference-doc versions (sync_driver_release_docs.py). It touches the same 39 files the 0.34.0 release commit did, plus a CHANGELOG entry crediting T3 Code (MIT, Copyright (c) 2026 T3 Tools Inc.). validate_release_versions.py --product driver passes.

CI: smoke-cua-driver-live.yml (main's live smoke, #4769) did not exist at 0.34.0. It is added here, cut down to the 0.34 surface: act by element_token, and 8 display_only reads followed by a click with the pre-preview token. The lean-read, since, run_actions and combo checks exercise 0.35 changes, so they are left out.

#4881 on 0.34

  • main keeps the helper in cua_driver_core::window_state_view, which does not exist on 0.34. Here it is cua_driver_core::display_only, with the same strings and functions. Each backend adds the property to its own schema, routes display_only into the existing _observation_only path, and marks the response. macOS also skips the background_input probe.
  • The contract matches T3's patch word for word: the schema property T3 feature-detects, the refusal display_only requires include_accessibility_tree:false, and the display_only / frame_note fields.
  • Not backported: plain screenshot-only reads refreshing the snapshot in place on Windows and Linux (refresh_screenshot_for_session is 0.35 snapshot-store code). On 0.34.1 a plain screenshot-only read behaves as it did in 0.34.0. display_only is the side-effect-free read.
  • No tool-description or skill-text changes. cli-specs and the generated reference page gain the property; macOS was regenerated from the native dump, and the docs --check passes on macOS.

Not included (0.35 only): the lean get_window_state default, since/tree_format, the UniFFI/ABI changes from #4743 and #4767, and anything else on main after 0.34.0.

ABI / UniFFI

No contract, UniFFI or ABI change against 0.34.0, checked three ways (macOS arm64):

  1. Source: nothing under cua-driver-contract, cua-driver-bindgen, include/, or the generated TS/Python bindings changed since the tag. The only cua-driver-sdk change is one pub(crate) allowlist entry (fix(cua-driver): pass CUA_DRIVER_RS_ENABLE_WAYLAND through to embedded hosts #4877) plus its test. There are no UDL files (proc-macro UniFFI).
  2. Generated bindings: node scripts/generate-uniffi-bindings.mjs --check against this branch's libcua_driver_sdk.dylib reports "UniFFI bindings are up to date", so it regenerates byte-identical TS and Python bindings to the committed 0.34.0 ones.
  3. T3's bindings load: the published @trycua/[email protected] from npm, with its libcua_driver_sdk.dylib swapped for this branch's build, imports, passes UniFFI's contract-version and per-function checksum checks, and serves a native call (currentMacOsPermissionStatus). A negative control (one expected checksum altered) fails with ApiChecksumMismatch, so the check really runs. The exported uniffi_* symbol sets of the published 0.34.0 dylib and this build are identical (512 symbols).

Testing

  • cargo test -p cua-driver-core display_only and -p platform-macos get_window_state pass locally (macOS). Linux and Windows run in CI, along with the live smoke on ubuntu-latest and windows-latest.
  • Docs: runner.ts --library cua-driver --check passes on macOS.
  • CI: all green, including the live smoke on ubuntu-latest and windows-latest, except Docs: Driver first-run Linux smoke / first-run, which is red by design until publish. It runs because feat(cua-driver): capture GNOME windows from their own actor (WinRects v10) #4882 touches _install-rust.sh, and it refuses whenever the source version (0.34.1) differs from the installer's baked release (0.34.0): "Source and baked release differ; review the intended release before running". The baked pin only advances after 0.34.1 is published. main ran this smoke green on feat(cua-driver): capture GNOME windows from their own actor (WinRects v10) #4882 at 0.34.0.
  • Label no-release: the release is cut by tag, not by Release Please reading this title, so the squash-title check is exempted. release-on-merge.yml also skips on this label, so merging dispatches nothing.

Publishing

Nothing is tagged, released or published by this PR. Publishing waits for Francesco's explicit "publish"; the runbook is in the maintainer's automation notes. Merging this PR into release/cua-driver-0.34.x builds and publishes nothing: no workflow listens to pushes on that branch, and release-on-merge.yml skips on no-release. The tag cua-driver-rs-v0.34.1 is what starts the release pipeline.

Credit

The Linux fixes and the display_only contract are ported from T3 Code's patch to Cua Driver 0.34.0 (pingdotgg/t3code#16975). T3 Code is MIT-licensed, Copyright (c) 2026 T3 Tools Inc.; credited in libs/cua-driver/rust/THIRD_PARTY_NOTICES.md and the CHANGELOG.

Linear: CUA-1239

🤖 Generated with Claude Code

f-trycua and others added 7 commits October 8, 2026 16:28
…d hosts (#4877)

The embedded host builds the daemon environment from an allowlist, and
CUA_DRIVER_RS_ENABLE_WAYLAND was not on it. A host such as an Electron
app could never turn on the native Wayland backend: the opt-in was
dropped silently. Allow it, and test inheritance, an explicit host
opt-in, and an explicit opt-out winning over an inherited opt-in.

Ported from T3 Code's Linux patch to Cua Driver 0.34.0
(pingdotgg/t3code#16975, MIT, Copyright (c) 2026 T3 Tools Inc.);
credited in THIRD_PARTY_NOTICES.md.

Backported to the 0.34 release line from main (cherry picked from commit 07cbc6c).

Conflict: THIRD_PARTY_NOTICES.md keeps the 0.34.0 table and adds only the T3 Code row (the QuickJS/rquickjs rows and trope-cua wording belong to 0.35 changes not in this line).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ing (#4880)

The libei worker replied as soon as input requests were flushed to the
socket. A flush is not delivery: the caller's focus guard could restore
the user's window while the compositor still had the input queued, and
the input then landed in the wrong app.

After each input command, send ei_connection.sync and reply only when
EIS answers its callback, which it does after processing every earlier
request. If no answer comes within 5 s, fail with "delivery is unknown"
instead of reporting success. WaitReady and failed commands reply
immediately as before.

Ported from T3 Code's Linux patch to Cua Driver 0.34.0
(pingdotgg/t3code#16975, MIT, Copyright (c) 2026 T3 Tools Inc.).

Backported to the 0.34 release line from main (cherry picked from commit 9487b0f).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…er (#4879)

* perf(cua-driver): reuse one session-bus connection for the GNOME helper

Every WinRects call spawned a gdbus subprocess, and owner attestation
alone makes three D-Bus calls before the real one. A live preview pays
that on every frame. Replace the subprocess with one zbus connection on
a dedicated single-thread Tokio runtime, so callers inside or outside
Tokio can block on it without nesting runtimes.

Bodies are typed on the wire, and replies keep the textual shape the
existing parsers read (GetRects now arrives as raw JSON, which also
avoids gdbus quoting). A timeout or transport error drops the
connection and the next call reconnects; a mutation is never replayed.
An error reply, such as no helper on the bus, keeps the connection.

T3 Code measured window capture going from 381 ms to 58 ms with this
transport. Ported from their Linux patch to Cua Driver 0.34.0
(pingdotgg/t3code#16975, MIT, Copyright (c) 2026 T3 Tools Inc.); the
reply-versus-transport split is new here.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* test(cua-driver): cover GetRects titles gdbus would have escaped

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(cua-driver): strict GetRects parsing and run the bus test in Nix

Parse the typed GetRects reply as raw JSON instead of slicing a bracket
span, and reuse that parser for focus. Salvaged from #4809, including
the malformed-snapshot fixtures and the Nix dbus check input.

Co-authored-by: injaneity <[email protected]>

* test(cua-driver): start the private test bus from its own config

dbus-daemon --session needs the system session.conf, which the Nix
build sandbox lacks; the daemon then exits without an address. Write a
minimal session config listening in a temp dir instead.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Backported to the 0.34 release line from main (cherry picked from commit 48cc491).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…s v10) (#4882)

* feat(cua-driver): capture GNOME windows from their own actor (WinRects v10)

On GNOME Wayland, window screenshots were crops of the Shell stage.
GetRects proves a window's geometry, not that nothing covers it, so a
covered window's screenshot showed the app on top.

The WinRects helper gains two additive methods:

- CaptureWindow(id, pid), API 9: snapshot the window's own actor with
  paint_to_content. Covered windows keep their content, nothing is
  activated, and a 1x1 transparent clone keeps Mutter painting a fully
  covered window for 4 s after the last capture. Refused while locked,
  for minimized windows, and above 32 MiB.
- CaptureWindowPreview(id, pid, max), API 10: the same capture,
  downscaled on the GPU, returning the full-size dimensions too.

The driver uses CaptureWindow whenever the attested helper reports
API 9 or newer, and then never falls back to a stage crop. Older
helpers keep the stage crop, so users who have not reinstalled the
helper keep window screenshots. A screenshot-only get_window_state
with a size cap uses CaptureWindowPreview (falling back to the full
capture on older helpers), and GNOME's per-capture Creation Time PNG
chunk is removed so unchanged preview frames compare equal.
list_windows asks a verified GNOME helper first instead of probing
other compositor protocols.

Versioning: the UUID stays winrects@cua. One UUID means one installed
copy per user; two UUIDs would race for org.cua.WinRects. API numbers
9 and 10 match T3 Code's bundled helper exactly, so either copy serves
both drivers. install.sh and both cua-driver installers no longer
downgrade a newer installed helper (install.sh --force still does).
The helper README documents the rules and the version table.

Ported from T3 Code's Linux patch to Cua Driver 0.34.0
(pingdotgg/t3code#16975, MIT, Copyright (c) 2026 T3 Tools Inc.). The
stage-crop fallback for older helpers and the no-downgrade installers
are new here.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* docs(cua-driver): credit every T3 Code Linux port in THIRD_PARTY_NOTICES

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Backported to the 0.34 release line from main (cherry picked from commit 78212ad).

Conflict: THIRD_PARTY_NOTICES.md keeps the 0.34.0 table; the T3 Code row now lists every ported file, as on main.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ews (#4881)

Backport of #4881 to the 0.34 release line, reworked for the 0.34.0 code.

`display_only:true` on get_window_state (with
include_accessibility_tree:false) returns the window's pixels and metadata
but publishes, refreshes and removes no snapshot and registers no action
capture, so a preview polling the window several times a second (T3 Code's
picture-in-picture) no longer stales the agent's element tokens or pixel
frame. It maps onto the existing internal observation-only read on macOS,
Windows and Linux; on macOS it also skips the background_input probe.

The contract matches T3 Code's Linux patch to Cua Driver 0.34.0
(pingdotgg/t3code#16975, MIT, Copyright (c) 2026 T3 Tools Inc.) word for
word: the schema property T3 feature-detects, the refusal
`display_only requires include_accessibility_tree:false`, and the
`display_only` / `frame_note` result fields. The typed contract
(cua-driver-contract) and the UniFFI surface are unchanged.

Differences from main's #4881:
- main keeps the helper in cua_driver_core::window_state_view, which does
  not exist on 0.34; here it is cua_driver_core::display_only with the same
  strings and functions, and each backend adds the property to its own
  schema.
- Not backported: plain screenshot-only reads refreshing the current
  snapshot in place on Windows and Linux (refresh_screenshot_for_session is
  0.35 snapshot-store code). On 0.34.x a plain screenshot-only read behaves
  as in 0.34.0; display_only is the side-effect-free read.
- No tool-description or skill text changes; the property's description
  carries the contract. cli-specs and the generated reference page gain the
  property (macOS regenerated from the native dump).

(cherry picked from commit 4cbd096, with conflicts reworked)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Adds main's live smoke (#4769, extended in #4881) to the 0.34 line so the
patch release runs the same real-window check on windows-latest (WinForms)
and ubuntu-latest (GTK3 on Xvfb). It keeps the harness and fixtures as on
main and is cut down to the 0.34 surface: act by element_token with a fresh
snapshot, and display_only previews (8 reads, then a click with the token
from before the previews must still land; a tree walk with display_only is
refused).

Left out, because they exercise 0.35 changes: the lean default read,
full_output, since diffs, run_actions, combo-box set_value, pid-less
element_tokens, and the plain screenshot-only token check.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bumps every Cua Driver version site listed in release-please-config.json
(VERSION, the workspace Cargo.toml, the Python and TypeScript packages,
SKILL.md and the cua-spacesd lockfiles), the driver Cargo.lock and this
branch's .release-please-manifest.json to 0.34.1, and syncs the generated
reference-doc versions with sync_driver_release_docs.py. The same 39 files
the 0.34.0 release commit changed, plus the CHANGELOG entry.

The CHANGELOG entry credits T3 Code (MIT, Copyright (c) 2026 T3 Tools Inc.)
for the Linux fixes and the display_only contract.

main's manifest stays at 0.34.0; this commit lives only on the
release/cua-driver-0.34.x line.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@f-trycua f-trycua added the no-release Skip auto-release on merge label Oct 8, 2026
The release attribution step requires the version's changelog section to
reference the pull request that lands the release commits.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@f-trycua
f-trycua merged commit 0c69d9a into release/cua-driver-0.34.x Oct 9, 2026
122 of 123 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 9, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

no-release Skip auto-release on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants