docs/desktop-control.md

Native computer use

Clankie uses Peekaboo as his general macOS computer-use provider. His existing machine-authorized shell calls the CLI; his existing image-capable file reader shows screenshots to his model. Clankie interprets the interface and chooses the next action. Peekaboo supplies capture, accessibility inspection, clicks, typing, keys, scrolling, dragging, and menus. There is no additional agent/model or app-specific automation engine in this path.

The desktop-control skill is the agent-facing workflow. Use browser tools for web pages and purpose-built APIs when they directly cover a task.

Execution and authority

The authority plan controls machine access. Social turns do not acquire a shell. UI content remains untrusted data. A model choice does not grant desktop capabilities or macOS permissions.

CLI plus image-file reading uses the existing captain tools and needs no MCP adapter changes. The current generic MCP host projects text results only, so direct image-returning MCP integration requires image preservation before it can replace this path. peekaboo agent and --analyze are not needed: Clankie already supplies the reasoning loop.

Installed provider

The official Peekaboo 4.3.0 universal CLI archive is installed intact, with its Swift compatibility library and MIT license.

ItemValue
Command~/.local/bin/peekaboo
Distribution~/.local/share/peekaboo/cli/4.3.0/
Source44eff916c3330739108cc1d73683338d4250503a
Archive SHA-256fec965e4bd6371b8fb017fb582e8d31c6a59628f77e266878f45cf1d4844836f
Signing identityDeveloper ID Application: OpenClaw Foundation (FWJYW4S8P8)

Strict signature and notarization verification pass for this release. The installation guide and release describe supported installation. Preserve the signed executable and adjacent libraries. No permission, quarantine, signing, or ownership bypass is part of integration.

peekaboo --version --json
peekaboo permissions status --all-sources --json
peekaboo window list --app "$APP" --json

APP is the requested application; choose WINDOW_ID from current inventory. Use a verified absolute executable path if the service's PATH omits it. A permission result applies to its reported host, not every possible caller.

General observation and action loop

Assign IMAGE_PATH to a temporary PNG path and capture the exact target:

peekaboo see --app "$APP" --window-id "$WINDOW_ID" --path "$IMAGE_PATH" --json

Read the receipt, then the actual screenshot using Clankie's read tool. Use accessibility element IDs when present and screenshots when AX is sparse. For text-only inspection use --tree --no-screenshot; increase depth to 48 only when traversal depth explains the missing content. A partial application fallback is not an exact-window action target.

Choose an authorized primitive such as click, type, press, scroll, drag, set-value, or action. Element actions require a fresh reusable snapshot and actual element IDs. Coordinate actions require screenshot-backed coordinate mapping and a valid live producer receipt. After each action, observe again and verify the intended effect before continuing. See the automation guide and installed command help for each primitive.

Normal CLI observations use an on-demand host that owns snapshots in memory. Keep an explicitly selected Bridge socket consistent across observation and action. A short-lived --no-remote CLI process cannot hand a reusable snapshot to a later process. Matching filenames, titles, or IDs do not replace ownership.

Observation does not request foreground focus. Preserve task restrictions: --web-focus can change keyboard focus and input commands can require explicit --foreground. Neither is an automatic fallback for a refused background operation. Do not infer a no-focus guarantee for an untested interaction.

Current capture readiness

Default and explicit classic capture through the installed 4.3.0 remote host refuse before dispatch with an ownership-capability error despite granted permissions. Upstream #684 is merged but is not in the latest published 4.3.0 release. It separates implemented support from startup readiness and restores proven same-host classic recovery. The current remote refusal is not evidence that the selected host is old or that another application actually captured the screen.

Peekaboo's documented caller-local classic capture works for read-only pixels:

peekaboo see --app "$APP" --window-id "$WINDOW_ID" --no-elements \
  --no-remote --capture-engine classic --path "$IMAGE_PATH" --json

The operator-shell receipt identifies the CGWindowList engine and a real exact-window PNG. Clankie's existing file reader emits that PNG as an image attachment; the selected model must support image input. This path does not enter ScreenCaptureKit and requires the caller's own existing permission. It does not change the remote host or its safety checks. Its returned snapshot expires with the local process, so this observation does not qualify subsequent coordinate input from another CLI invocation.

The live TUI path verifies Clankie discovering a window, invoking capture, reading the PNG as an image attachment, and describing its visible contents. However, two classic captures returned identical PNG bytes despite different window titles. Pixel freshness remains unverified; a new capture receipt does not establish that the app has repainted its contents.

Persistent action-host interaction still requires live proof. No completed menu operation or no-focus parity is claimed from read-only evidence.