Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
85c6f55
add agent-computer style usage to cua-cli, refactor pyautogui-like ha…
ddupont808 Feb 24, 2026
6222dcb
address CR comments, add auto-focus when zooming to windows on the host
ddupont808 Feb 24, 2026
a6e8c5b
Add cua-auto to pypi workflow
ddupont808 Feb 24, 2026
7b92214
Bump cua-cli requirements
ddupont808 Feb 24, 2026
4412958
default `cua do ls` to listing all sandboxes
ddupont808 Feb 24, 2026
bed3ea7
Fix linting error
ddupont808 Feb 25, 2026
f1f6c13
fix linting
ddupont808 Feb 25, 2026
cb7852b
Add trajectory recording to cua do CLI (#1110)
sarinali Feb 25, 2026
cf79125
Merge branch 'main' into ddupont/cua-cli-improvements
ddupont808 Feb 25, 2026
7de7701
Merge remote-tracking branch 'origin/main' into ddupont/cua-cli-impro…
ddupont808 Feb 25, 2026
a3d837f
add interactive terminal support
ddupont808 Feb 25, 2026
6ce3320
add try/except around imports that require X display server
ddupont808 Feb 25, 2026
1277c3a
address CR comments
ddupont808 Feb 25, 2026
f633af5
lint & isort
ddupont808 Feb 25, 2026
e97dc8f
bump cua-core dep
ddupont808 Feb 25, 2026
12d788b
add tests for windows
ddupont808 Feb 25, 2026
13ce139
fix cua do shell unknown command error
ddupont808 Feb 25, 2026
3a7540c
reorder imports
ddupont808 Feb 25, 2026
ada5c2d
add interactive shell to docs
ddupont808 Feb 25, 2026
94289fa
update computer sdk reference
ddupont808 Feb 25, 2026
0684e9e
lint windows tests
ddupont808 Feb 25, 2026
4ef07ee
fix external link checking lychee workflow checking internal links
ddupont808 Feb 25, 2026
61e30f4
attempt to fix lychee workflow again
ddupont808 Feb 25, 2026
feb2860
fix external links
ddupont808 Feb 25, 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: 4 additions & 1 deletion .github/workflows/ci-check-docs-links.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,13 @@ jobs:
--verbose
--no-progress
--accept 100..=399
--exclude '^file://'
--scheme https
--scheme http
--exclude 'localhost'
--exclude '127\.0\.0\.1'
--exclude 'example\.com'
--exclude 'cua\.ai'
--exclude 'platform\.openai\.com'
'./docs/content/**/*.mdx'
token: ${{ secrets.GITHUB_TOKEN }}
fail: true
1 change: 1 addition & 0 deletions .github/workflows/ci-test-python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ jobs:
- computer-server
- mcp-server
- som
- cua-auto

steps:
- name: Checkout code
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ lume run macos-sequoia-vanilla:latest

| Package | Description |
| --------------------------------------------------------------------- | ---------------------------------------------------------- |
| [cuabot](https://cua.ai/docs/cuabot/cuabot) | Multi-agent computer-use sandbox CLI |
| [cuabot](https://docs.trycua.com/cuabot/guide/getting-started/introduction) | Multi-agent computer-use sandbox CLI |
| [cua-agent](https://cua.ai/docs/cua/reference/agent-sdk) | AI agent framework for computer-use tasks |
| [cua-computer](https://cua.ai/docs/cua/reference/computer-sdk) | SDK for controlling desktop environments |
| [cua-computer-server](https://cua.ai/docs/cua/reference/computer-sdk) | Driver for UI interactions and code execution in sandboxes |
Expand Down
2 changes: 1 addition & 1 deletion blog/clawcon-multiplayer.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ _Published on February 6, 2026 by Francesco Bonacci and Dillon DuPont_

ClawCon brought over 700 attendees to Frontier Tower, with a waitlist that had people lining up down Market Street, and another 20k tuned into the livestream. It was the first community event for OpenClaw, and we had the 2nd demo session.

We're early OpenClaw contributors and sponsors (we documented [how to deploy OpenClaw to macOS sandboxes with Lume](https://docs.trycua.com/lume/guides/openclaw)), and we genuinely believe computer-use works best as a tool inside more general agentic systems like OpenClaw rather than as standalone screen-takeover agents.
We're early OpenClaw contributors and sponsors (we documented [how to deploy OpenClaw to macOS sandboxes with Lume](https://docs.trycua.com/lume/examples/openclaw)), and we genuinely believe computer-use works best as a tool inside more general agentic systems like OpenClaw rather than as standalone screen-takeover agents.

So we deferred our Hacker News launch to ship something big live on stage.

Expand Down
77 changes: 77 additions & 0 deletions docs/content/docs/cua/guide/advanced/interactive-shell.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
---
title: Interactive Shell
description: Open a live PTY session inside a sandbox or local machine from the CLI or Python SDK
---

The `cua do shell` command and `computer.pty` API give you an interactive terminal (PTY) session inside any sandbox or local machine — similar to SSH, but without any network setup.

## CLI

```bash
# Switch to a target first
cua do switch docker my-container
# or
cua do switch host

# Open an interactive shell (bash / PowerShell on host)
cua do shell

# Run a specific program interactively
cua do shell python3
cua do shell vim /etc/hosts

# Override terminal dimensions
cua do shell --cols 220 --rows 50
```

The shell is fully interactive — arrow keys, tab completion, and `Ctrl+C` all work. When stdin is piped (non-TTY), the command runs non-interactively and its output is printed normally.

## Python SDK

```python
from computer import Computer

async with Computer(provider_type="docker", name="my-container") as c:
handle = await c.pty.create(
command="bash",
cols=80,
rows=24,
on_data=lambda chunk: print(chunk.decode(errors="replace"), end="", flush=True),
)

await handle.send_stdin(b"echo hello\n")
await handle.send_stdin(b"exit\n")
code = await handle.wait()
print(f"exited {code}")
```

### PtyHandle methods

| Method | Description |
|---|---|
| `send_stdin(data: bytes)` | Write bytes to the terminal's stdin |
| `resize(cols, rows)` | Resize the terminal window |
| `kill()` | Kill the session process |
| `disconnect()` | Close the WebSocket without killing the process |
| `wait()` | Block until the session exits; returns the exit code |

### Reconnecting

```python
# Disconnect and reconnect later (process keeps running)
await handle.disconnect()

handle2 = await c.pty.connect(
handle.pid,
on_data=lambda chunk: print(chunk.decode(errors="replace"), end=""),
)
```

## How it works

The PTY stack has four layers:

1. **`cua-auto`** — spawns a real PTY process (`pty` on Unix, `pywinpty` on Windows)
2. **`computer-server`** — exposes `/pty` REST endpoints and a WebSocket for I/O
3. **`computer`** — Python client (`PtyInterface`) connecting over HTTP + WebSocket
4. **`cua do shell`** — sets your terminal to raw mode and proxies I/O through the WebSocket
1 change: 1 addition & 0 deletions docs/content/docs/cua/guide/advanced/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"custom-tools",
"sandboxed-python",
"local-computer-server",
"interactive-shell",
"human-in-the-loop",
"vnc-recorder",
"demonstration-guided-skills",
Expand Down
Loading
Loading