Sub-agents
A sub-agent is a helper that an agent starts during its own turn, using the provider's own sub-agent or task feature: a search through the code base, a review of one file, a side job with another model. It works on a part of the task and hands a result back to the agent. OAR shows each one in the transcript and keeps what it did, so you can see how the agent got its answer.
This is not the same as an agent session.
A sub-agent lives inside one turn of one conversation and has no conversation
of its own. An agent session is a separate conversation in your list that an
agent starts with relay_.
In the transcript #
While the turn runs, every sub-agent has a bubble inside the turn's live bubble. A sub-agent that starts another one shows it nested inside its own bubble. The bubble's header shows:
| Part | What it is |
|---|---|
| Name | The sub-agent's name or description, as the provider reports it |
| Latest step | One line, shown while the bubble is folded: the number of steps and the newest one, as in 3 steps · 🛠️ Tool (Read): index., or the end of its text if it has taken no step yet. File paths are cut to the file name |
| State | ● Running while it works, then the way it ended: Completed, Failed or, for a sub-agent you stopped, Cancelled |
| Stop | Stops this sub-agent. It goes away once the sub-agent has ended. See Stopping a sub-agent |
Added in 0.9.6 A bubble starts folded to this header, so a turn with many sub-agents stays short to scroll. Click or tap anywhere on the header to open it and see the sub-agent's thoughts, steps and text, and click again to fold it. What you chose by hand stays, for as long as the bubble lives.
When the turn is done, the bubbles give way to the finished reply. Under it, the reply lists the turn's sub-agents as rows, in the order they started. Sub-agents that another sub-agent started are not listed there; you find them inside their parent's record. A row shows:
- the sub-agent's name, which opens its record,
- its state: Running, Starting, ✓ Completed, ✗ Failed or ■ Stopped, with in the background and record cut where they apply,
- its model, its type (such as
Explore, or Subagent when none is given), the tokens it used and how long it ran.
Only Claude and DeepSeek report model, type and tokens. On the other providers the row shows Subagent and leaves out model and tokens. The row says ■ Stopped for a sub-agent that the live bubble called Cancelled; both mean the same.
The sub-agent viewer #
Added in 0.9.10 The viewer shows one sub-agent's whole record: what it thought, which tools it called with what input and what came back, the text it wrote, and the sub-agents it started itself, in the order they happened.
Opening it #
Click the sub-agent's name:
- in the row under a finished reply,
- in the task panel above the composer, for a Claude or DeepSeek sub-agent that works in the background (see Background tasks),
- on a child row inside another sub-agent's record.
The bubble of a sub-agent inside the live turn does not open the viewer. Use the task panel, if a Claude or DeepSeek sub-agent is listed there, or wait for the finished reply to list it.
Added in 0.9.11 In a read-only shared view a sub-agent's row opens its record too, read only, without Stop, and with the relay host's paths filtered like the rest of the share. In 0.9.10 the names there were plain text.
What it shows #
The header holds the name, a Stop button while the sub-agent runs, and a line with its model, type, state, background where it applies, tokens and time. Below it the record runs from the top:
| Entry | How it reads |
|---|---|
| 💭 Thought | Its first line. A thought still being written is open and reads Thinking… until text comes |
| Tool call | An icon, the tool's name and a one-line summary such as the command or the file. Click it to see the full input, where there is more than the summary |
| Result | Result or Error, its size, and cut from the original size when it was cut (see Limits). Click it to read the text |
| Reply text | The sub-agent's own text, as formatted Markdown. Writing… while it comes |
| Child agent | A row like those under a reply. Click its name to open it |
| Note | A line of the relay's own, such as the one that says the record was cut |
A record that is still running grows live and follows its end. If you scroll up, the viewer stays where you are and a New entries ↓ button takes you back down. A finished record opens at the top. A fold you opened stays open while the entry changes.
Only a page that has the viewer open receives the record as it grows. If a batch is missed on a slow connection, or the connection drops, the viewer fetches what is missing by itself.
If nothing is recorded yet, it says Nothing recorded yet. Entries appear as the agent works. For a finished sub-agent with no record it says Nothing was recorded for this agent. A record the relay could not load shows This agent's record could not be loaded.
Moving between sub-agents and closing #
A child row opens in place. A button at the top left, such as ‹ Review agent, names the parent and takes you back to it. Closing the viewer, by any means below, returns to the conversation, not to the parent.
To close it, press the ×, press Escape, click outside the window or use the browser's or phone's back. On a phone it fills the screen.
Limits #
| What | Limit |
|---|---|
| A tool result | The first 4 KB are kept. The entry says how large the original was |
| Entries in one record | 2000. The record then ends with a note and the header says record cut at its limit |
| Older records | Records made before the viewer existed are rebuilt from what was saved and say recorded before the full record existed. They are shorter |
A Claude session that was already running when you updated to 0.9.10 records no full sub-agent record until its worker restarts. ☠️ Kill session on an idle session is enough; the next message starts a new worker.
How long tool output is kept #
Added in 0.9.10 A sub-agent's tool inputs and results can be large, so the relay removes them from old records. A record is never deleted and the sub-agent stays listed.
Settings → General → Keep sub-agent tool output sets how long the inputs and results stay. The choices are 7 days, 14 days, 30 days, 90 days and Always. The default is 90 days. See also Settings.
Shortly after the relay starts, and then once a day, it goes through the tool calls and tool results that were last written more than that many days ago, in sub-agents that are no longer running:
- a tool call keeps its one-line summary and reads Input removed after 90 days (with the number you chose); its full input is gone,
- a tool result, or an error, keeps its size and reads, for example, Result · 3.2 KB · output removed after 90 days; its text is gone,
- thoughts, the sub-agent's text, notes and child agents stay as they were.
A sub-agent that is still running keeps everything, however old. Always turns the clean-up off. Saving the setting starts a clean-up about five seconds later. A removed input or result does not come back when you raise the number.
In the background #
A sub-agent can run in the background, so that it goes on after the agent has
answered. It then also appears as a row in the task panel above the composer,
with a Stop button of its own. On Claude and DeepSeek the panel's name for
it opens the viewer. A background agent on Copilot's SDK engine is only in the panel and has
no record. How the panel works, what ends a background task and the timeout are on
Background tasks. A Claude or DeepSeek sub-agent's row shows in
the background, and the viewer's header background. Its record keeps
growing between turns. Added in 0.9.12 A sub-agent's row in the task panel
counts its steps (tool calls), such as 22 steps, as its folded bubble does,
on Claude, DeepSeek and Copilot's SDK engine.
Stopping a sub-agent #
There are two places for Stop: on the sub-agent's bubble while the turn runs, and in the viewer's header. Both show it for any running sub-agent, on every provider, whether or not stopping that one is possible. A background sub-agent can also be stopped from the task panel.
What can be stopped on its own:
- A background sub-agent on Claude or DeepSeek, and a background agent on Copilot's SDK engine (from the task panel).
- Nothing else is confirmed. A sub-agent that runs inside the turn on Claude or DeepSeek cannot be stopped on its own, and neither can any sub-agent on Claude Cloud, Cursor or Grok.
When a sub-agent cannot be stopped, the click ends as a refusal. The bubble's button changes to Stop unavailable, and a line starting System note: Could not stop this subagent appears among the sub-agent's steps. In the viewer the button reads Stopping… for up to 15 seconds and then returns to Stop; it does not change to Stop unavailable. Use Stop on the whole turn instead; see While a turn runs.
When a stop works, the sub-agent then reads Stopped in rows and the viewer, Cancelled in the live bubble.
By provider #
| Provider | What the viewer holds | Stop one sub-agent |
|---|---|---|
| Claude | Everything: thoughts, every tool call with its input and result, the text, child agents, model, type and tokens | Background ones |
| DeepSeek Added in 0.9.17 | As Claude. The model shown is the DeepSeek model the sub-agent ran on, the chat's model, or DeepSeek Flash for one asked for as haiku; see DeepSeek |
Background ones |
| GitHub Copilot and OpenAI, SDK engine | Sub-agents that run inside the turn: thoughts, steps and text, one level (no child agents), no model or tokens. Background agents have no record, only a task panel row | Background agents, from the task panel |
| GitHub Copilot and OpenAI, extension engine | What the extension reports; the record can have gaps | Not confirmed |
| Claude Cloud | Thoughts and steps, with child agents. The sub-agent's own text is not published | No |
| Cursor | Thoughts, steps and text, one level (no child agents). Tool results are not reported | No |
| Grok | Only that the sub-agent started and how it ended. The viewer has nothing of its own to show | No |
| OpenAI Image | Does not apply | Does not apply |
The full capability table is on Providers at a glance.