Skip to content

Agent

Connect to an agent, run a task, share a live session, or start from a template. Access is governed and sessions are recorded.

An agent doesn't have to work alone. Attach to its session, see what it's doing in real time, type alongside it. The whole exchange is captured for replay later.

Run or connect

There are two ways to work with an agent:

  • Run fires a run in the background. Watch it live if you want, or read the session after.
  • Connect opens a live terminal into the agent. You see every step and can type alongside it.

Connect to a Session

The Agents page listing agents across connected deployments with status and runtime
Agents across your connected deployments. Connect opens a recorded shell into the agent; Run fires a background run.

Connect to the agent

In the Platform, open Agents and select the agent you want to work with. In its sidebar, select Open terminal. When the runtime is ready, type your message to begin.

The Agents page with the cosmic-heron sidebar open, showing its connected status, runtime, and Open terminal button.
Select Open terminal in the agent sidebar to start an interactive session.
An agent session in the Platform with Terminal selected and the Claude Code runtime open.
After connecting, the terminal opens with your agent's configured runtime, shown here with Claude Code.

Using CLI

Connect by deployment/namespace/name. By default the CLI routes through the control plane (no kubeconfig needed) and records the session:

terminal· bash
exo agent connect staging/production/triage-bot

The terminal goes raw. Keystrokes flow straight to the runtime CLI (claude, codex, opencode, …).

Access-gated
You only see agents you've been granted access to.

A live session is not a private window. The session panel shows everyone watching, Share copies a link that drops a teammate into the same session, and control can be requested and handed over rather than fought over. A session can also be branched: start a copy of the session, try something on it, and bring it back into the original if it works.

Running an agent

exo agent run fires a run in the background. By default, the CLI follows the run output:

terminal· bash
exo agent run production/triage-bot
exo agent run triage-bot --goal "Triage only P1 issues today"
exo agent run triage-bot --json
exo agent run triage-bot --reason "manual rerun"

Connecting to an agent gives you a shell you drive. A run is the other mode: the agent works on its goal by itself and you watch. Runs are addressed by URL, so a refresh, a closed tab, or a colleague opening the same link all land on the same live output.

Start a run

Run appears on the agents list, the deployment page, and an agent's detail page. Clicking it dispatches immediately and takes you to the run page. Agents that opt into user context get one extra step first: a box for free-text instructions for this run only — the ticket you are chasing, the branch to look at — which the agent receives alongside its goal.

Runs need a runnable agent
An agent with running disabled has no Run button, and a paused agent will not fire. See capability flags. Runs also start from webhooks and schedules — same pod, same recording, same run page.

The run page

The terminal is the run's real output, not pod logs: the same byte stream the session recorder persists. Joining late is fine — the stream replays its backlog on attach, so you see what already happened before catching up to live.

The header carries the run's session id and a status chip: starting while the pod comes up, running while it works, and a terminal state when it is over. If the socket drops, a Reconnect button re-attaches without losing the transcript.

Leaving without losing it

Minimize — or simply navigating away — docks the run as a tab at the bottom of the screen. The tab spins while the run executes, pulses when the agent is blocked waiting for input, and flips to a done or failed flag when it finishes. Clicking the tab returns to the run page. Dismissing the tab never cancels the run; it only stops showing it. See the terminal dock.

Cancelling

Cancel run asks for confirmation, then stops the run for real: the operator kills the run's process tree in the pod, including its background session, and the run is marked terminated. This is a genuine stop, not a UI dismissal — use it on a run that is looping or working from a wrong premise.

Cancel vs terminate
Cancelling a run kills the work. Terminating a session from the sessions list only closes the record the dashboard is showing and leaves the pod alone. They read similarly and do very different things.

After it ends

A finished run keeps its page, plus two links: Replay plays the recorded terminal back at speed, and Timeline shows the parsed event stream — prompts, tool calls, results — merged with the audit record. Both live under Sessions, where every run is searchable after the fact.

From the CLI

terminal· bash
exo agent run prod/adaptive/triage-bot --reason "nightly triage"
exo agent connect prod/adaptive/triage-bot

exo agent run waits while the pod is pending, then streams the live output the same way the dashboard does; add -v for the status block.

Recording

Connects routed through the control plane are recorded as an asciicast and land in the deployment's sessions, with an agent.connected event noting who attached to which agent and when. Terminal output is redacted before storage.

Shared agent sessions

Share and join

Use Share in an agent shell to copy its session URL. A teammate joins as a viewer after the usual tenant, agent access, and required MFA checks. The URL itself grants no access. Sharing applies to agent shells; tool and bastion shells remain solo.

The operator must advertise shared-shell support. An older operator returns 409 shared_shell_unsupported. Ended sessions return 410 with a recording reference.

Host, controller, and viewer

  • Host: starts the session, keeps keyboard input, sets terminal size, grants or revokes control, and ends the session.
  • Controller: can type and answer prompts alongside the host. There is at most one controller.
  • Viewer: watches output and can request control.

Granting control adds a second keyboard; it does not take the host's keyboard away. The host remains the host after disconnecting. An existing controller may continue, but new control grants wait for the host to return. A dropped controller connection retains its role for a five-minute grace period; an explicit leave releases it.

Fork and merge context

For Claude Code, participants can fork a live conversation into a branch they host. Its transcript starts from the parent's checkpoint. The branch uses the same pod and filesystem, so simultaneous edits can conflict; it is not an isolated worktree.

Merge previews an editable summary that becomes context in the parent conversation. If the requester is not the parent host, that host approves or declines. A busy parent queues the merge until it can accept input. Merging does not merge Git changes or end the branch; its host ends it separately.

Agent templates

Choose a template

Open Agents → Templates. Browse the built-in library by business function, expand a template to read its playbook and expected tools, then select Use to prefill the create-agent form. Workspace templates appear alongside the built-ins.

bash
exo agent search incident
exo agent search postgres approval --category SRE
exo agent search --archetype Analyst --json

Review the resulting agent

Select the deployment, provider, model, and available tools or MCP servers before creating the agent. A template's requirements describe the intended toolchain; they do not create credentials or prove the agent has access. Verify the resulting bindings and policies, then run a small task and inspect its session.

Built-in templates are read-only and ship with the backend, so upgrading changes the catalog. An API request can pass the template's template_id; template values fill fields the request leaves unset. See Agents for the full runtime configuration.