Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
0c55abd
feat(cua-driver): extend Project Centennial to Windows and Linux
f-trycua Aug 15, 2026
ff7e0ff
test(cua-driver): wait for Project Centennial daemon
f-trycua Aug 15, 2026
7b3d5e6
fix(cua-driver): tolerate Cargo progress in local Windows installer
f-trycua Aug 15, 2026
b51f1ae
fix(cua-driver): return successful local Windows install status
f-trycua Aug 15, 2026
84877a8
fix(cua-driver): isolate native history controls
f-trycua Aug 15, 2026
07f3baa
fix(cua-driver): validate Project Centennial desktop events
f-trycua Aug 15, 2026
d78e2b6
test(cua-driver): report Project Centennial lifecycle phases
f-trycua Aug 15, 2026
48460d6
fix(cua-driver): isolate Windows daemon stdio handles
f-trycua Aug 15, 2026
c760dd8
fix(cua-driver): launch Windows daemon without inherited handles
f-trycua Aug 15, 2026
e8afb18
test(cua-driver): wait for native frame settlement
f-trycua Aug 15, 2026
29cbaa2
fix(cua-driver): align Windows frame coordinate space
f-trycua Aug 15, 2026
0393270
test(cua-driver): probe Windows daemon without consuming pipe
f-trycua Aug 15, 2026
f262cdb
fix(cua-driver): exclude ambiguous Wayland titles from history
f-trycua Aug 15, 2026
c9ee6ed
fix(cua-driver): align cross-platform history relaunch authorization
f-trycua Aug 15, 2026
8dc939b
fix(cua-driver): make X11 frame requests decoration-stable
f-trycua Aug 15, 2026
2b2d6dc
ci(cua-driver): provision Wayland history key store
f-trycua Aug 16, 2026
83b250d
test(cua-driver): use supported Wayland history action
f-trycua Aug 16, 2026
48df01b
test(cua-driver): match primary click history capability
f-trycua Aug 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/ci-rust-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,11 @@ jobs:
- name: Run Windows app-name lookup tests
working-directory: libs/cua-driver/rust
run: "cargo test -p platform-windows launch_uwp::tests:: --lib --locked"
- name: Run Windows Computer History adapter tests
working-directory: libs/cua-driver/rust
run: "cargo test -p platform-windows history::tests:: --lib --locked"
- name: Validate Windows Computer History uninstall ordering
run: .\libs\cua-driver\scripts\tests\uninstall-windows-history-regression.ps1
- name: Prove unknown app launch stays bounded and responsive
working-directory: libs/cua-driver/rust
run: "cargo test -p cua-driver --test protocol_tools_call_test launch_unknown_app_is_bounded_and_keeps_mcp_session_responsive --locked -- --exact --nocapture"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e-rust-linux-wayland.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ jobs:
libwayland-dev libxkbcommon-dev libx11-dev libxi-dev libxtst-dev \
libxext-dev libdrm-dev libgbm-dev libwebkit2gtk-4.1-dev \
libssl-dev libxdo-dev libayatana-appindicator3-dev librsvg2-dev \
ffmpeg jq
ffmpeg jq gnome-keyring
- name: Install Nix for the custom compositor environment
if: inputs.environment == 'cua-compositor'
uses: cachix/install-nix-action@08dcb3a5e62fa31e2da3d490afc4176ef55ecd72 # v30
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/e2e-rust-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ jobs:
libgtk-3-dev clang pkg-config libdbus-1-dev libpipewire-0.3-dev \
libspa-0.2-dev libei-dev libx11-dev libxi-dev libxtst-dev libxext-dev \
libwebkit2gtk-4.1-dev libssl-dev libxdo-dev \
libayatana-appindicator3-dev librsvg2-dev ffmpeg
libayatana-appindicator3-dev librsvg2-dev ffmpeg gnome-keyring
- name: Run shared Rust behavior matrix
env:
CUA_E2E_INTERNAL_LANE: shared
run: |
xvfb-run -a --server-args="-screen 0 1920x1080x24" \
dbus-run-session -- bash -lc \
"openbox >/tmp/cua-openbox.log 2>&1 & picom --backend xrender --config /dev/null >/tmp/cua-picom.log 2>&1 & sleep 2; scripts/ci/linux/run-rust-e2e.sh"
"eval \"\$(printf test-password | gnome-keyring-daemon --unlock --components=secrets)\"; openbox >/tmp/cua-openbox.log 2>&1 & picom --backend xrender --config /dev/null >/tmp/cua-picom.log 2>&1 & sleep 2; scripts/ci/linux/run-rust-e2e.sh"
- name: Upload shared results
if: always()
uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4
Expand Down
82 changes: 59 additions & 23 deletions libs/cua-driver/docs/computer-history-preview.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,35 @@
# Try the Computer History macOS preview
# Try the Computer History desktop preview

This guide shows you how to enable Cua Driver's encrypted Computer History,
inspect it, let an authorized agent read it, and remove it. It applies to
nightly macOS builds that include the experimental preview.
nightly macOS, Windows, and Linux builds that include the experimental preview.

Computer History is off by default. The preview records metadata for actions
performed through Cua Driver. It does not watch unrelated desktop activity.

## Before you start

- Use macOS.
- Use macOS, Windows, or Linux in an interactive desktop session.
- Install a Cua Driver nightly that includes Computer History.
- Grant Cua Driver its usual macOS permissions.
- Grant Cua Driver the usual permissions required for the actions you want it
to perform. Computer History does not add permission to perform an action.
- On Linux, run a desktop Secret Service implementation such as GNOME
Keyring. The preview fails closed if no unlocked Secret Service is available.

## Install or switch to the nightly channel

For a fresh installation, run:
For a fresh macOS or Linux installation, run:

```bash
/bin/bash -c "$(curl -fsSL https://cua.ai/driver/install.sh)" -- --channel nightly
```

For a fresh Windows installation, run in PowerShell:

```powershell
& ([scriptblock]::Create((irm https://cua.ai/driver/install.ps1))) -Channel nightly
```

To switch an existing installation, run:

```bash
Expand All @@ -42,11 +51,11 @@ Run:
cua-driver history enable
```

The command admits the experimental feature, initializes its macOS Keychain
key, verifies an encrypted write and read, and then enables capture. If the
installed daemon must restart, Cua Driver preserves its existing permission
mode, capability manifest, approval flags, compatibility mode, and launch
grants.
The command admits the experimental feature, initializes its device-local
native credential, verifies an encrypted write and read, and then enables
capture. If the installed daemon must restart, Cua Driver preserves its
existing permission mode, capability manifest, approval flags, compatibility
mode, and launch grants.

Check the result:

Expand Down Expand Up @@ -118,7 +127,7 @@ These commands preserve existing encrypted history.

## Delete Computer History

Delete the encrypted store and destroy its exact namespace Keychain key:
Delete the encrypted store and destroy its exact namespace native key:

```bash
cua-driver history delete --yes
Expand All @@ -128,10 +137,23 @@ This is cryptographic deletion. Cua Driver does not claim physical erasure from
APFS snapshots, backups, copied ciphertext, SSD wear leveling, or memory that a
process already decrypted.

To purge history while uninstalling, run the uninstaller as your login user
with `--purge`. Do not prefix the uninstaller with `sudo`: the script elevates
only protected app removal, while Keychain and history cleanup must remain in
the login user's context.
To purge history while uninstalling on macOS or Linux, run:

```bash
/bin/bash -c "$(curl -fsSL https://cua.ai/driver/uninstall.sh)" -- --purge
```

On Windows, run:

```powershell
$env:CUA_DRIVER_RS_UNINSTALL_FORCE = '1'
$env:CUA_DRIVER_RS_UNINSTALL_PURGE = '1'
irm https://cua.ai/driver/uninstall.ps1 | iex
```

Run the uninstaller as the interactive login user. Do not prefix the Unix
uninstaller with `sudo`: native credential and history cleanup must remain in
that user's context.

## Return to the stable channel

Expand All @@ -153,7 +175,7 @@ The encrypted event allowlist contains:
- time and monotonic sequence;
- opaque session and action identifiers;
- a fixed Cua capability;
- an optional application bundle identifier and display name;
- an optional fixed-field platform application identifier and display name;
- fixed action outcome, delivery, route, evidence, and escalation categories;
- lifecycle, access-audit, and writer-health events.

Expand All @@ -163,13 +185,25 @@ paths, window titles, URLs, or free-form diagnostics.

Files use the Cua History Profile: a CBOR Sequence of COSE_Encrypt0 records with
CloudEvents JSON inside each encrypted payload. ChaCha20-Poly1305 authenticates
each record. A macOS Keychain-protected namespace key and per-chunk HKDF keys
protect data at rest. There is no plaintext fallback and history performs no
network I/O.
each record. A namespace root key protected by macOS Keychain, Windows
Credential Manager, or Linux Secret Service and per-chunk HKDF keys protect
data at rest. There is no plaintext fallback and history performs no network
I/O.

The filesystem can still reveal that a history directory exists, its total
size, and file modification times. The Keychain key is device-bound, so copying
only the encrypted files to another Mac does not provide recovery.
size, and file modification times. The native key is bound to the current
user's credential store, so copying only the encrypted files to another
machine does not provide recovery.

Default encrypted-store locations are:

- macOS: `~/Library/Application Support/cua-driver/computer-history`;
- Windows: `%LOCALAPPDATA%\cua-driver\computer-history`;
- Linux: `$XDG_STATE_HOME/cua-driver/computer-history`, or
`~/.local/state/cua-driver/computer-history` when `XDG_STATE_HOME` is unset.

Local-development installs use `cua-driver-local` instead of `cua-driver` in
both filesystem and native-key namespaces.

## Troubleshooting

Expand All @@ -182,8 +216,10 @@ relaunch automatically.

**`history_key_locked` or `history_key_unavailable`**

Unlock the macOS login session and Keychain, then retry. Capture stays disabled
and Cua Driver does not create plaintext files.
Unlock the login session and its native credential store (Keychain, Credential
Manager, or Secret Service), then retry. On Linux, also confirm that a Secret
Service implementation is running. Capture stays disabled and Cua Driver does
not create plaintext files.

**`history_quota_reached`**

Expand Down
Loading
Loading