| Computer Use is an independent persistent JavaScript REPL. Use cua_repl directly; | |
| Code Mode is not required. Variables and bound objects survive calls and Turns within | |
| the current Host process. A fresh REPL after restart has no variables from history; | |
| follow the current Computer Use state supplied with the model request. | |
| `cua.computer.target` identifies the selected desktop platform (`mac`, `linux`, `windows`). | |
| In WSL it defaults to the Windows host; shell commands may still run in Linux. | |
| A fresh REPL has no bound targets. The entry points below emit API documentation | |
| and inventory or initial target state. Browser IDs come only from | |
| configured providers; when none are configured, use native browser windows through | |
| getApp. The API does not expose driver administration such as start_session. | |
| Entry points (selection emits initial state): | |
| - `await cua.getState({emit?})`: app and configured browser inventory, including inventory errors. | |
| - `await cua.listApps({emit?})`, `await cua.listWindows({emit?})`. | |
| - `const app = await cua.getApp("Name / bundle ID / app path")` or `getApp({windowId})`. | |
| macOS launches a missing app. Windows getApp selects an already open window; | |
| use `await cua.computer.launch_app({app: appId})` with an ID from cua.listApps(), | |
| then refresh inventory and select its exact window. Launch revalidates the ID | |
| against native inventory; arbitrary executable paths are not accepted. | |
| Select an exact window when names are ambiguous. Linux requires the app to be open already. | |
| - `await cua.listBrowsers({emit?})`, `await cua.listTabs({browser?, emit?})`. | |
| - `const browser = await cua.getBrowser({id? , url?})`: select without opening a tab. | |
| - `const tab = await cua.getTab("tab ID", {browser?})` or `getTab({url}, {browser?})`. | |
| - `await cua.createBrowserTab(browserId, url?)`: open in the configured profile. | |
| Unavailable providers, tab mentions and unsupported creation options throw. | |
| App and Tab observations: | |
| - `getAXState({emit?, disableDiffing?})` returns text. Tabs and macOS apps use a diff by default; | |
| Windows and Linux apps return the complete state. | |
| - `getScreenshot({emit?})` returns Uint8Array and emits the image. | |
| - `getAXStateAndScreenshot(options?)` returns `{state, screenshot}` and emits both. | |
| Discovery, selection and observations emit automatically. Call them directly; | |
| wrapping `getScreenshot()` in `nodeRepl.emitImage()` or `getAXState()` in | |
| `nodeRepl.write()` is redundant. Use `{emit:false}` when processing the result | |
| yourself; inventory errors still appear. Identical images emitted within one call | |
| are delivered once. A later call may emit the same image again. | |
| Observations include a bounded settling window for brief UI updates (200 ms for | |
| tabs, 400 ms for apps). This does not wait for arbitrary asynchronous work; | |
| continuous animation does not extend the window. Refresh to observe later updates. | |
| Screenshot-only observation clears accessibility indices. | |
| If a native AX observation fails while an app is busy, refresh the same bound object | |
| when the app responds again. Failed observations invalidate old indices and coordinates. | |
| App and Tab actions: | |
| - `moveCursor(index | [x,y])` indicates an observed location using a synthetic cursor. | |
| Coordinates use the same current screenshot as `click`; this does not consume it. | |
| The returned visibility is display feedback, not evidence of an input effect. | |
| - `click(index | [x,y], {mouseButton?, clickCount?})`, `drag([x,y], [x,y])`. | |
| - `scroll(index | [x,y], "up" | "down" | "left" | "right", pages?)`. | |
| - `setValue(index, string)`. | |
| - `selectText(index, text, {prefix?, suffix?, selectionType?})` where selectionType is | |
| `text`, `cursor_before` or `cursor_after`. Native selection is macOS-only. | |
| `text_not_found` means the text or supplied context is absent; read the current | |
| state again. `ambiguous_text` requires a more specific prefix/suffix. | |
| - `performSecondaryAction(index, action)`: use an exact action listed in the native | |
| AX observation. CDP does not expose secondary actions and rejects this method. | |
| App input: `typeText(text)`, `paste(text, {format?})`, `pressKey(key)`. | |
| Tab input: `typeText(index|null, text)`, `paste(index|null, text, {format?})`, | |
| `pressKey(index|null, key)`. A supplied index focuses the observed field first. | |
| Use `null` for current focus. Key examples: `Return`, `Tab`, `super+a`, `shift+Left`. | |
| Paste formats: `text` (default), `md` (Markdown source as plain text), and `html`. | |
| Native HTML paste is macOS-only and needs a readable editable value and selection. It temporarily | |
| activates the exact window, preserves its selection, and restores the prior clipboard | |
| unless the user copied something newer. An unchanged value is reported as uncertain. | |
| Browser HTML paste requires an observed contenteditable element. | |
| Tab navigation: `goto(url)`, `back()`, `forward()`, `reload()`, `close()`. | |
| Navigation supports HTTP(S) and about:blank and waits for an observable document. | |
| The main CDP target is covered; cross-process iframe accessibility is not complete. | |
| Native scrolling accepts page counts. macOS and CDP scrolling also accept | |
| `{pixels:500}` as input deltas; applications may clamp, animate or transform them. | |
| Windows/Linux native adapters currently refuse pixel-unit input. macOS/Windows | |
| indexed scrolling preserves the selected accessibility target. Native indexed clicks support one semantic | |
| click; use screenshot coordinates for multiple clicks when needed. | |
| A successful input dispatch does not establish the resulting application state. | |
| Coordinates belong to the latest screenshot. Moving/resizing, navigation, scrolling | |
| or any action consumes/invalidates the mapping; capture again before another point. | |
| Native semantic actions use retained accessibility elements. Application menus | |
| are scoped to their owning process and the exact bound window; closed menu | |
| contents are omitted until the menu is opened. Menu interaction may activate the | |
| bound window and keeps it active while the menu is open. | |
| macOS/Windows coordinate and keyboard input use the exact window's foreground | |
| route; macOS restores the prior application after delivery where supported. | |
| Linux keeps background delivery. Coordinate input can move the system pointer. | |
| Unverified input effects are reported in the call output. There is no public | |
| `delivery_mode` option or automatic replay. | |
| `nodeRepl.write(value)` emits text/JSON. `await nodeRepl.emitImage(bytes | dataUrl | | |
| {bytes, mimeType})` emits an image. File/HTTP image URLs, Node, arbitrary filesystem | |
| and network APIs are unavailable. `cua.rewriteDocumentation()` reprints this reference. | |
| Every operation uses current Host permissions; JS objects retain no grants. | |
| In Ask mode, Computer Use approval happens before the REPL execution timeout starts. | |
| Native macOS operations report `desktop_locked` while the screen is locked; connected | |
| CDP providers and pure REPL computations remain independently available. | |
| Each Session has its own Maka cursor. Input actions show it automatically; call | |
| `moveCursor` only to point without acting. `cua.cursor.configure({label?, color?, | |
| enabled?, reducedMotion?})` changes this Session's display. Colors are `blue`, `mint`, | |
| `violet`, `amber`, `rose`, `cyan`; labels allow up to 48 characters. `cua.cursor.getState()` | |
| reports settings and native/browser visibility. A native renderer in `idle` state starts | |
| on the first native indication; `unavailable` reports a missing/failed display host. | |
| Configure again to retry a failed renderer. Idle cursors remain until disabled or cleaned up. | |
| Cursors share no input authority and do not move the system pointer. Multiple cursors | |
| do not isolate the physical keyboard, application focus or input method. | |
| Cancelled, timed-out or heap-exhausted REPLs require `cua_reset`, then target rebinding. Admitted | |
| native work settles before returning; reset does not undo dispatched input. | |
| Reset clears only this Session's REPL and bindings, leaving user apps and tabs open. |