co call
Run one command on a remote agent from the shell, print the result. No LLM, no session — like a remote command line.
Quick Start
co call is the remote twin of co browser: what co browser take_screenshot does on this machine, co call <address> co browser take_screenshot does on a remote agent — same verbs, one extra address up front.
How It Works
The command is sent over the same authenticated WebSocket the Python connect() client uses (direct or via relay), executed on the remote through its direct-exec path, and the raw output comes straight back. Under the hood this is:
Gated by the Remote's Whitelist
The remote decides what may run: every co call is checked against that agent's .co/host.yaml permissions whitelist — the same list its own LLM uses to auto-run a command without asking. co ... commands (including co browser <verb>) are whitelisted by default; read-only shell commands too. Anything not on the list comes back as an error:
To expose more, edit the whitelist on the remote (.co/host.yaml), e.g. add "Bash(git status)".
Driving a Remote Browser
Browser control goes through co browser, which on the remote talks to its persistent browser daemon (a separate process that manages tabs and lifecycle itself):
A screenshot returns as base64; co call detects an image result and saves it — to --out PATH if given, else ./screenshot.png — then prints the path.
Options
Options go before the address; everything after the address is the remote command, verbatim (so it keeps its own flags — co call 0x.. ls -la works).
| Option | Default | Description |
|---|---|---|
| --out PATH | ./screenshot.png | Save an image result (screenshot) to PATH |
| --timeout SEC | 60 | Seconds to wait for the result |
| --relay URL | wss://oo.openonion.ai | Relay server |
Scripting
Clean stdout, standard exit codes — safe to pipe and branch on:
Exit codes: 0 ok · 1 failure (tool error / not whitelisted / connection) · 2 usage.
Identity
co call signs the request with your local identity (.co in the project, else ~/.co), which the remote needs if it runs at a strict trust level. For open / careful agents no keys are required — it works out of the box.
When to Use
- •co call — you know the exact command and want the result now (scripting, an agent driving another agent, remote-control steps).
- •Python
connect().input(prompt)— hand the remote agent an open-ended task and let its LLM decide the steps. See Multi-Agent Networking.
See Also
- • connect() and remote.call() — the Python API this CLI wraps
- • co browser — the local browser CLI this mirrors
- • host() — configure the whitelist that gates every call
ConnectOnion