Get started
Computer use plan
Status
Active campaign, started 2026-08-13. Owner-directed (steipete): build autonomously
end to end, live-test everything, ship fully. Tracker table below is the source of
truth and is updated as work lands. Derived from RFC 0025
(openclaw/rfcs rfcs/0025-default-pluggable-computer-use.md, RomneyDa) with the
owner rulings recorded under Decisions. Coordinate with RFC author before
each wave lands (check live PRs to avoid collisions with in-flight maintainer work).
Problem
OpenClaw's computer use is foreground-only everywhere: the macOS fulfiller drives
the shared cursor via embedded Peekaboo + CGEvent primitives, and the cua-computer
plugin uses only CUA's global desktop scope (scope:"desktop", no delivery_mode).
Both CUA and Peekaboo now have real background window-scoped input (no cursor move,
no focus steal, no Space switch), semantic observation (AX tree + screenshot +
element refs), and structured verification. None of that reaches the model. The
current CUA adapter maps 8 of 49 driver tools; Peekaboo's MCP surface (25 tools,
background-default clicks, see frame binding, verify_state) is not reachable
through computer.act at all.
Goals
- One typed
computer.actv2 contract (portable actions: window/element/browser targets,deliveryMode: background|foreground, verification envelope) carried over the existing node protocol. Cloud gateway + many paired desktop nodes works unchanged — provider processes live on the node. - Two first-class macOS providers behind one adapter seam in the app-owned
TypeScript node worker: CUA (
cua-driver serve --embedded, app-spawned, TCC via responsibility chain) and Peekaboo (peekaboo mcpor in-process PeekabooAutomationKit). Settings picker; exact capability advertisement per provider; no per-call fallback between them. - Windows/Linux via the same bundled plugin: CUA daemon + MCP proxy supervised by
the node host; Windows companion PR in
openclaw/openclaw-windows-node. - Model guidance (skill profile) teaching the background-first ladder:
observe window -> background element action -> background pixel -> foreground ->
desktop, driven by structured
effect/refusal results. - Live-tested at every stage; UI changes ship with screenshots/video.
Non-goals
- Raw provider MCP passthrough to the model (rejected in RFC 0025; breaks multi-node caching, arming, and skills).
- Reimplementing driver internals in TS/Swift.
- Recording/replay + browser-isolation parity for Peekaboo (optional capability families; CUA-only at first).
- Wayland-beyond-upstream, Windows elevated/UIAccess targets in v1.
Decisions (owner rulings, 2026-08-13)
- No backward compatibility. v2 replaces the v1
computer.actpayload in place under the same command names. Old node + new gateway (or reverse) gets a typedCOMPUTER_CONTRACT_MISMATCHrejection — a visible outcome, not silent degradation. No dual wire contract, no v1 preservation lane. (Supersedes RFC delivery rule "shipped v1 wire contract remains green".) - Production LOC is a hard constraint. The provider seam replaces the duplicate per-plugin command registration; the CUA plugin refactor deletes the desktop-scope-only branches it obsoletes; Peekaboo adapter reuses the same mapping core (frame binding, refusal codes, queueing) rather than forking it. Target: net-new production LOC bounded by deletions elsewhere; every wave reports its delta.
- Peekaboo is ours to change. Gaps close upstream in Peekaboo
(middle/triple click, hold/mouse-down/up,
get_cursor_position; browser tool shape may align toward the v2 browser family) instead of adapter warts. - Bundle CUA on macOS (38 MB universal binary, re-signed with our Developer ID inside OpenClaw.app Resources — upstream's recommended embedding shape; avoids Gatekeeper friction). Windows/Linux use digest-pinned managed download per RFC OC-10A.
- Both providers ship together on macOS with a Settings picker (CUA recommended / Peekaboo). Provider selection is node-local; switch ends the active execution and rotates provider generation.
invoke_menujoins the v2 action union (both providers support it; RFC omitted it). Recording + browser families are optional capability families — a provider without them is first-class, not degraded.
Architecture
Model ── one computer tool (typed v2 actions, capability-filtered) Gateway (cloud OK) ── node.invoke("computer.act") over node protocol Desktop node node-host provider seam (one registration for screen.snapshot + computer.act) ├─ CUA adapter ── cua-driver mcp ──socket── cua-driver serve --embedded │ (macOS: app-spawned, TCC responsibility chain; Win/Linux: node-host │ supervised, interactive session required) └─ Peekaboo adapter ── peekaboo mcp / PeekabooAutomationKit (macOS only)Key invariants (all existing, preserved): frame/observation binding
(displayFrameId -> v2 observationId+elementRef, generation-scoped), dangerous
command arming, pairing approval, serialized actions, model-only screenshots,
cancellation releases held input. TCC: OpenClaw.app probes and holds
Accessibility + Screen Recording at startup; app-spawned driver children inherit
via the macOS responsibility chain — no new permission UX.
Provider capability truth (verified in source, 2026-08-13):
- CUA 0.19.3: 49 MCP tools; background delivery per-call with typed refusals
(
background_unavailable,background_occluded,background_uipi_blocked,off_space_or_ax_unresolved); SkyLight per-pid posting on macOS, synthetic pointer injection on Windows, XTest/libei on Linux (Wayland cannot target background windows — capability-gated). Embedded host mode, inherited IPC (#2410, PR 2545) and the protected-consent adapter (#2411, PR 2578) are all contained in v0.13.1+ (verified via tag containment) — the pinned 0.19.3 needs no bump. - Peekaboo v4: 25 MCP tools; background-default clicks (AX-action-first,
pid-routed events, window-routed pointer);
see= screenshot + element map +reference_id(maps to observation binding);verify_statestructured predicates without focus; app/window/menu/dialog/space management; CDP browser tool into user Chrome with explicit connect consent. Missing vs v2: middle/ triple click, held input, cursor position, recording.
Workstreams and tracker
Waves follow RFC 0025's implementation plan, compressed by the no-compat ruling.
Status: todo | in-progress | pr | landed | blocked.
| ID | Work | Repo | Status | Notes |
|---|---|---|---|---|
| W0-FIX | Parity matrix + pinned fixtures: 49 CUA tools + 25 Peekaboo tools classified against the v2 union; recorded tools/list + result fixtures | openclaw | landed | landed #123469 (d9646ad): 58 CUA + 26 Peekaboo tools, +1059 test-only LOC |
| W0-PIN | Pick + pin CUA release with embedded/inherited-IPC support; dependency bump (needs Dependency Guard approval) | openclaw | landed | resolved: 0.19.3 already contains #2410+#2411 |
| W1-PROTO | v2 types: action union (+invoke_menu), target union, capability descriptor, result envelope, closed error codes; replaces v1 params in place |
openclaw | landed | landed #123544 (d19c755) |
| W1-TOOL | Built-in computer tool v2: capability-filtered schema, observation refs, result projection, no auto-retry | openclaw | landed | landed #123544: v1 651 / v2 742 tokens |
| W1-SEAM | Node-host provider seam: one registration, provider selection, generation, lifecycle close path; absorbs cua-computer's direct registration | openclaw | landed | landed #123509 (848a7e3): seam+contract, prod +348/-217 |
| W2-CUA | CUA plugin refactor onto seam: full v2 mapping (window/element/background), session-per-execution, deletes desktop-scope-only adapter | openclaw | landed | landed #123604 (2af5eca): full v2 adapter, prod +1129/-41 |
| W2-MAC | macOS app: bundle + re-sign driver, direct serve --embedded spawn, private socket handoff to worker, TCC restart handling |
openclaw | landed | landed #123635 (19ace68): app-owned daemon + picker + orphan reaping, live-proven |
| W2-PKB | Peekaboo adapter on the same seam (macOS): see/click/type/press/set_value/verify_state/app/window/menu mapping | openclaw | todo | new vs RFC (was v1-only) |
| W2-PKB-UP | Peekaboo upstream: middle/triple click, hold_key + mouse down/up in BackgroundInputDriver, get_cursor_position; optional browser-shape alignment | Peekaboo | todo | owner-approved |
| W2-UX | Settings -> Computer Use provider picker + readiness checklist (both apps: macOS now, Tauri Linux later) | openclaw | todo | RFC OC-10B slice; owns picker screenshots (W2-MAC shipped without them; app instance lock at /tmp/openclaw-UID-app-instances can block a fresh profile launch) |
| W3-GATE | Integration gate: live vertical on macOS (both providers) + Linux X11 (CUA): observe window -> background element click -> verify | openclaw | todo | RFC OC-8 |
| W3-SKILL | Version-pinned skill profile: background-first ladder, result precedence, no CLI/daemon instructions | openclaw | todo | RFC OC-9D |
| W4-BROWSER | CUA browser family (isolated profile first; existing-profile gated on consent adapter) | openclaw | todo | RFC OC-9B; optional family |
| W4-REC | CUA recording/resources family with node-owned roots | openclaw | todo | RFC OC-9C; optional family |
| W4-WIN | Windows companion CUA host PR | openclaw-windows-node | todo | RFC WIN-1; after W1-SEAM/W2-CUA |
| W4-ART | Managed artifacts: Win/Linux digest-pinned download, atomic update + rollback | openclaw | todo | RFC OC-10A |
| W5-SEC | Security closure: high-risk action classification, socket ownership audit, hostile-arg tests | openclaw | todo | RFC OC-10C |
| W5-ACC | Packaged cross-platform acceptance + default-provider rollout | openclaw | todo | RFC OC-11/12 |
Production LOC ledger (updated per landed PR): net target ≤ +1500 for the whole campaign excluding tests/fixtures, funded by deleting the v1-only branches, the duplicate registration path, and the eight-tool adapter.
Live testing matrix
Every wave carries live proof; unit fixtures alone never advance the tracker.
- macOS both providers: dev gateway (isolated
OPENCLAW_STATE_DIR, own port)- signed local OpenClaw.app build on one of the owner's Macs. Scenario:
background-click + type into a non-frontmost TextEdit window while frontmost app
keeps focus; assert frontmost app unchanged, cursor position unchanged,
verify_state/effectconfirms the edit. Video via screen recording for UX-visible changes.
- signed local OpenClaw.app build on one of the owner's Macs. Scenario:
background-click + type into a non-frontmost TextEdit window while frontmost app
keeps focus; assert frontmost app unchanged, cursor position unchanged,
- Linux CUA: Crabbox Xvfb host (recipe proven in PR #117205): node registers command pair, real screenshot + frame id, background window action against xterm/gtk test app; Wayland smoke on Sway only.
- Windows: openclaw-windows-node companion on a Windows box/VM (Parallels lab); Session 0 rejection probe over SSH.
- Multi-node: two paired Macs + cloud gateway; explicit
nodeselection, frame tokens do not cross nodes, provider generation rotates on app restart. - Skew probe (no-compat ruling): old app + new gateway must produce the typed contract-mismatch error in the tool result, not silence.
Risks
- CUA prerelease churn: everything pins to one accepted release + fixtures; version skew refuses closed.
- v2 union token cost: measured in W1-TOOL; split into tool family only if a provider cannot consume one discriminated union reliably.
- Private-socket embedding: owner-only dir, 0600, ownership validated, pre-existing path rejected; upgrade to inherited IPC when the pinned release supports it.
- Dependency Guard approvals (CUA bump, new Peekaboo dep surface) interrupt autonomy; batch them per wave.
- Collision with RFC author's in-flight work: check live PRs before each wave.