01Two ways to drive a VM
Nucleic can let an agent see and operate a macOS VM's screen through the mac_vm_computer tool. There are two paths, and they stack — the semantic path is an add-on to the default, not a replacement.
| Path | What it is |
|---|---|
| Host-side (default) |
Screenshots are captured from the VM's virtual display and input is injected into its virtual keyboard and mouse — all host-side, in the Virtualization framework. No software runs inside the guest and no permissions are granted. This is computer use for macOS VMs, and it needs no setup. |
| Semantic AX (this guide) |
An in-guest agent (NucleicVMAgent) exposes the guest's accessibility tree — every control's role, title, value, and frame — so an agent can act on an element by identity. It also captures screenshots from inside the guest. This is the only path that needs the guest to grant permissions, which provisioning handles automatically on macOS 27. |
02When you actually need this
The default host-side path is enough for most GUI work. Reach for the semantic agent when one of these applies:
- You want robust, semantic control. Instead of guessing pixel coordinates and clicking blind, the agent reads the accessibility tree and acts on a control by its identity — the way professional macOS UI automation works. It's far less fragile than pixel targeting.
- You're debugging a Mac or iOS app's UI and want the full accessibility tree — roles, values, focus state — the way a developer expects to inspect it.
03What gets installed
Enabling the semantic agent adds one component to the golden base image: a small, signed app bundle called NucleicVMAgent. Inside each VM it runs as a per-user login agent in the guest's desktop session and listens on a private vsock channel for commands from your Mac. It drives the guest through three native macOS APIs:
- Accessibility API — reads the accessibility tree and performs actions on elements (press a button, set a field's value, move focus).
- ScreenCaptureKit — captures screenshots from inside the guest.
- CGEvent — synthesizes raw mouse, keyboard, and scroll input.
Because those APIs are privacy-sensitive, the guest account must grant the agent three permissions — Accessibility, Screen Recording, and input (post-event) rights. On macOS 27, Nucleic writes these grants for you automatically during the one-click base build — there's nothing to do by hand.
04Before you start
Make sure the basics are in place first:
- Apple silicon Mac running macOS 27 or later. Running macOS guests requires Apple silicon.
- The macOS VM service is on. In Settings ▸ Virtual Machines, turn on Enable macOS VM service. See the overview for requirements and disk space.
- Computer use is on. In the same section, turn on Enable computer use (screen + mouse/keyboard). The semantic-agent toggle only appears once computer use is enabled.
05Turn it on and build the base
-
Enable the semantic agent
In Settings ▸ Virtual Machines, with computer use already on, turn on Semantic AX agent (advanced).
-
Build (or rebuild) the base image
Click Build base image — or Rebuild / re-provision base image if you already have one. This installs macOS into the golden base, provisions the dev toolchain, and — because the agent is now enabled — installs
NucleicVMAgentand attempts to write its permission grants. See Building the base image for the full walkthrough. -
Check readiness
When the build finishes, the base-image status reads Ready — builds + computer use + semantic AX. and you're done — the permission grants landed automatically during the build. Head to Verify.
06Verify it's working
The base-image status line is the quickest signal:
- Ready — builds + computer use + semantic AX. — the agent is installed and fully granted. You're set.
- Ready — builds + computer use. — builds and host-side computer use work, but the semantic agent isn't ready yet. Rebuild the base with the semantic agent toggle on.
If an agent gets blank screenshots or clicks that don't register once it's running, the usual causes are:
- Grants didn't land. Rebuild the base with the semantic agent enabled so provisioning can write them.
- The guest isn't logged in. The agent runs in the desktop session, so the guest account must be logged in (not sitting at the login window). The base is configured to auto-log-in, so this normally just works.
07How an agent uses it
Once the semantic agent is present, the mac_vm_computer tool advertises both pixel actions (screenshot, click, type, key, scroll) and semantic ones. The typical loop is dump the tree, then act by identity:
# read the frontmost app's accessibility tree
ax_dump → { role:"AXButton", title:"Build", ref:"e17", … }
# act on that element directly — no pixel guessing
ax_press ref=e17
Guidance the agent follows:
- Prefer
ax_dump+ act-by-ref for robust control — acting on an element by identity is far less fragile than targeting pixels. - Fall back to screenshot + pixel click when a control has no accessibility action or isn't in the tree.
- Either path works — semantic is more robust, screenshot-first is simpler.
You don't drive any of this by hand — this is what the agent does through the tool. Enabling the semantic path just makes the reliable, by-identity actions available to it.