@markusylisiurunen/tau 0.3.94 → 0.3.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/code_mode/command.js +3 -1
- package/dist/code_mode/command.js.map +1 -1
- package/dist/code_mode/output.d.ts +3 -0
- package/dist/code_mode/output.js +8 -2
- package/dist/code_mode/output.js.map +1 -1
- package/dist/code_mode/runtime.d.ts +7 -1
- package/dist/code_mode/runtime.js +18 -14
- package/dist/code_mode/runtime.js.map +1 -1
- package/dist/core/code_mode/agents.js +434 -0
- package/dist/core/code_mode/agents.js.map +1 -0
- package/dist/core/code_mode/bash.js +14 -17
- package/dist/core/code_mode/bash.js.map +1 -1
- package/dist/core/code_mode/history.js +1 -0
- package/dist/core/code_mode/history.js.map +1 -1
- package/dist/core/code_mode/models.js +27 -4
- package/dist/core/code_mode/models.js.map +1 -1
- package/dist/core/code_mode/sdk.js +6 -0
- package/dist/core/code_mode/sdk.js.map +1 -1
- package/dist/core/config/content_loader.js +3 -13
- package/dist/core/config/content_loader.js.map +1 -1
- package/dist/core/debug.js +2 -2
- package/dist/core/debug.js.map +1 -1
- package/dist/core/history/history_manager.js +7 -4
- package/dist/core/history/history_manager.js.map +1 -1
- package/dist/core/index.js +0 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/mcp/manager.js +7 -0
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/models/openrouter.js +25 -1
- package/dist/core/models/openrouter.js.map +1 -1
- package/dist/core/personas.js +3 -11
- package/dist/core/personas.js.map +1 -1
- package/dist/core/runtime/chat_runtime.js +11 -10
- package/dist/core/runtime/chat_runtime.js.map +1 -1
- package/dist/core/runtime/session_prompt_composer.js +9 -8
- package/dist/core/runtime/session_prompt_composer.js.map +1 -1
- package/dist/core/static/code_mode/history/documentation.md +2 -1
- package/dist/core/static/code_mode/sandbox_runner.mjs +4 -0
- package/dist/core/static/index.js +18 -5
- package/dist/core/static/index.js.map +1 -1
- package/dist/core/static/prompts/subagent-prefix.md +17 -0
- package/dist/core/static/tau_docs/client-tools.md +4 -0
- package/dist/core/static/tau_docs/code-mode.md +77 -0
- package/dist/core/static/tau_docs/config-reference.md +4 -2
- package/dist/core/static/tau_docs/history.md +5 -3
- package/dist/core/static/tau_docs/index.md +2 -1
- package/dist/core/static/tau_docs/manifest.json +1 -0
- package/dist/core/static/tau_docs/node-sdk.md +2 -0
- package/dist/core/static/tau_docs/openrouter.md +2 -0
- package/dist/core/static/tau_docs/pdf-unpacking.md +1 -1
- package/dist/core/static/tau_docs/personas.md +4 -5
- package/dist/core/static/tau_docs/prompts-and-project-context.md +1 -1
- package/dist/core/static/tau_docs/security.md +1 -1
- package/dist/core/static/tau_docs/sessions.md +1 -1
- package/dist/core/static/tau_docs/subagents.md +106 -27
- package/dist/core/static/tau_docs/tools.md +32 -62
- package/dist/core/static/tau_docs/troubleshooting.md +2 -2
- package/dist/core/subagents/agent_supervisor.js +185 -339
- package/dist/core/subagents/agent_supervisor.js.map +1 -1
- package/dist/core/subagents/claude_code_protocol.js +4 -0
- package/dist/core/subagents/claude_code_protocol.js.map +1 -1
- package/dist/core/subagents/claude_code_runner.js +134 -11
- package/dist/core/subagents/claude_code_runner.js.map +1 -1
- package/dist/core/subagents/claude_code_runner.mjs +80 -77
- package/dist/core/subagents/claude_code_runtime.js +250 -9
- package/dist/core/subagents/claude_code_runtime.js.map +1 -1
- package/dist/core/subagents/errors.js +18 -0
- package/dist/core/subagents/errors.js.map +1 -0
- package/dist/core/subagents/events.js +25 -0
- package/dist/core/subagents/events.js.map +1 -0
- package/dist/core/subagents/format.js +2 -98
- package/dist/core/subagents/format.js.map +1 -1
- package/dist/core/subagents/native_subagent_runtime.js +270 -0
- package/dist/core/subagents/native_subagent_runtime.js.map +1 -0
- package/dist/core/subagents/prompt.js +3 -5
- package/dist/core/subagents/prompt.js.map +1 -1
- package/dist/core/subagents/registry.js +5 -3
- package/dist/core/subagents/registry.js.map +1 -1
- package/dist/core/subagents/runtime.js +13 -0
- package/dist/core/subagents/runtime.js.map +1 -0
- package/dist/core/subagents/trace.js +149 -0
- package/dist/core/subagents/trace.js.map +1 -0
- package/dist/core/tools/agent_jobs.js +51 -0
- package/dist/core/tools/agent_jobs.js.map +1 -0
- package/dist/core/tools/background_jobs.js +205 -0
- package/dist/core/tools/background_jobs.js.map +1 -0
- package/dist/core/tools/bash.js +11 -45
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/bash_jobs.js +44 -238
- package/dist/core/tools/bash_jobs.js.map +1 -1
- package/dist/core/tools/catalog.js +37 -72
- package/dist/core/tools/catalog.js.map +1 -1
- package/dist/core/tools/code.js +177 -54
- package/dist/core/tools/code.js.map +1 -1
- package/dist/core/tools/code_jobs.js +128 -0
- package/dist/core/tools/code_jobs.js.map +1 -0
- package/dist/core/tools/code_mode.js +88 -101
- package/dist/core/tools/code_mode.js.map +1 -1
- package/dist/core/tools/code_mode_worker.js +13 -7
- package/dist/core/tools/code_mode_worker.js.map +1 -1
- package/dist/core/tools/job_output.js +53 -0
- package/dist/core/tools/job_output.js.map +1 -0
- package/dist/core/tools/output_file.js +38 -0
- package/dist/core/tools/output_file.js.map +1 -0
- package/dist/core/tools/presentation.js +19 -9
- package/dist/core/tools/presentation.js.map +1 -1
- package/dist/core/tools/tool_names.js +8 -6
- package/dist/core/tools/tool_names.js.map +1 -1
- package/dist/core/tools/wait_for_agents.js +41 -33
- package/dist/core/tools/wait_for_agents.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/diff_tool/app/dist/assets/{core-33fyIuI3.js → core-NkxL1yZC.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{highlights-BZwSBtSw.js → highlights-Coi8xHW0.js} +1 -1
- package/dist/diff_tool/app/dist/assets/index-Jt-l2Q96.js +205 -0
- package/dist/diff_tool/app/dist/assets/langs-qJAo26KT.js +1 -0
- package/dist/diff_tool/app/dist/assets/{shiki-CC72VX9t.js → shiki-B8l9Ufae.js} +2 -2
- package/dist/diff_tool/app/dist/assets/{stream-tokenizer-C6SDg59j.js → stream-tokenizer-h1lwRQEk.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{themes-2vjCbM1J.js → themes-D3P9yN9_.js} +2 -2
- package/dist/diff_tool/app/dist/index.html +1 -1
- package/dist/host/hosted_ephemeral_agent_session.js +13 -3
- package/dist/host/hosted_ephemeral_agent_session.js.map +1 -1
- package/dist/host/local_session_host.js +5 -5
- package/dist/host/local_session_host.js.map +1 -1
- package/dist/sdk/code_mode.js +2 -2
- package/dist/sdk/code_mode.js.map +1 -1
- package/dist/store/session_snapshot_migrations.js +27 -1
- package/dist/store/session_snapshot_migrations.js.map +1 -1
- package/package.json +5 -5
- package/dist/core/static/prompts/subagent-wrapper.md +0 -20
- package/dist/core/tools/interrupt_agent.js +0 -142
- package/dist/core/tools/interrupt_agent.js.map +0 -1
- package/dist/core/tools/list_agents.js +0 -85
- package/dist/core/tools/list_agents.js.map +0 -1
- package/dist/core/tools/send_input_to_agent.js +0 -177
- package/dist/core/tools/send_input_to_agent.js.map +0 -1
- package/dist/core/tools/spawn_agent.js +0 -275
- package/dist/core/tools/spawn_agent.js.map +0 -1
- package/dist/diff_tool/app/dist/assets/index-Bv8JVYFD.js +0 -202
- package/dist/diff_tool/app/dist/assets/langs-DnGrwrZ-.js +0 -1
|
@@ -6,13 +6,13 @@ Subagents are background agents that the main agent starts and the host supervis
|
|
|
6
6
|
|
|
7
7
|
Subagents are general-purpose workers. There are no named types. Several can run at once, each with its own task and conversation.
|
|
8
8
|
|
|
9
|
-
A native Tau subagent
|
|
9
|
+
A native Tau subagent works like a main agent of the active persona in the subagent's working directory. Its system prompt is the one a main agent would get there, with the same persona prompt, skills, project instructions, and environment context. Tau adds a short section in front that explains the subagent's role: work headless on the part of the main agent's task given in the assignment, treat later messages as coming from the main agent, wait for background work its answer depends on, never start other agents, leave contact with the user to the main agent, and return a self-contained result. The section also gives the parent session's ID. This section cannot be configured. Put task-specific instructions in the launch prompt.
|
|
10
10
|
|
|
11
|
-
Whether the agent can start subagents depends on the main persona's tool list. Built-in personas, and custom personas that omit `tools`,
|
|
11
|
+
Whether the agent can start subagents depends on the main persona's tool list. The `agents` tool name enables `tau.agents` in the `code` tool and the `wait_for_agents` tool. Built-in personas, and custom personas that omit `tools`, include it. A custom persona with a `tools` list that lacks `agents` cannot start or manage subagents. There is no other setting to turn subagents on or off. See [personas](personas.md).
|
|
12
12
|
|
|
13
13
|
## Trigger sensitivity
|
|
14
14
|
|
|
15
|
-
The main agent starts subagents only when the user or active instructions explicitly ask for delegation. Ask in ordinary language; no special tag is needed. The request itself does not create a subagent: the main agent still has to call `
|
|
15
|
+
The main agent starts subagents only when the user or active instructions explicitly ask for delegation. Ask in ordinary language; no special tag is needed. The request itself does not create a subagent: the main agent still has to call `tau.agents.spawn`.
|
|
16
16
|
|
|
17
17
|
The agent follows this rule itself. Tau checks that a launch is valid, but it does not judge whether the request really asked for delegation.
|
|
18
18
|
|
|
@@ -29,9 +29,11 @@ A native Tau subagent can receive these tools. [Claude Code subagents](#claude-c
|
|
|
29
29
|
- `mcp`, when the host has enabled MCP servers
|
|
30
30
|
- `models`
|
|
31
31
|
|
|
32
|
-
A subagent gets each of these that the main persona also has. For example, a main persona with `bash`, `edit`, `history`, and `
|
|
32
|
+
A subagent gets each of these that the main persona also has. For example, a main persona with `bash`, `edit`, `history`, and `agents` gives its subagents `bash`, `edit`, and `history`. Names such as `web` and `history` enable the matching capability in the subagent's `code` tool. MCP uses the host's existing connections, whatever the subagent's working directory. There is no separate tool list for subagents.
|
|
33
33
|
|
|
34
|
-
Every native Tau subagent also gets the built-in `tau_docs` tool, and a persona's `tools` list cannot remove it. Subagents never get
|
|
34
|
+
Every native Tau subagent also gets the built-in `tau_docs` tool, and a persona's `tools` list cannot remove it. Subagents never get `agents`: their `code` tool has no `tau.agents`, and they have no `wait_for_agents`. A subagent cannot start or manage other agents.
|
|
35
|
+
|
|
36
|
+
Subagents also never get [client tools](client-tools.md), such as the TUI's tools or a Telegram runner's file delivery tools. Only the main agent uses tools that attached clients offer. See [tools](tools.md) for how tool availability works in general.
|
|
35
37
|
|
|
36
38
|
## Models and settings
|
|
37
39
|
|
|
@@ -45,7 +47,7 @@ A model override uses this exact form:
|
|
|
45
47
|
|
|
46
48
|
The provider is lowercased. The model ID is kept exactly as written and is case-sensitive. Effort is one of `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, or `max`.
|
|
47
49
|
|
|
48
|
-
The configured list of launch models is an allowlist. It does not choose a default. The main agent should normally omit the `model`
|
|
50
|
+
The configured list of launch models is an allowlist. It does not choose a default. The main agent should normally omit the `model` option of `tau.agents.spawn`, and the subagent then uses the active persona's model and reasoning. When `model` is given, it must exactly match an allowlist entry after normalization. For native Tau subagents, the override changes the provider, model, and reasoning, and keeps the other settings.
|
|
49
51
|
|
|
50
52
|
A model ID may be missing from the catalog if its provider is known (see [models](models.md)). An entry with an invalid provider, model, effort, or format makes the configuration field invalid. Duplicate entries are removed.
|
|
51
53
|
|
|
@@ -64,13 +66,13 @@ Configure the allowlist with `subagents.launchModels` in `config.json`:
|
|
|
64
66
|
}
|
|
65
67
|
```
|
|
66
68
|
|
|
67
|
-
The nearest `launchModels` list replaces broader ones; lists are not combined. The resulting list applies to every persona that has `
|
|
69
|
+
The nearest `launchModels` list replaces broader ones; lists are not combined. The resulting list applies to every persona that has `agents`.
|
|
68
70
|
|
|
69
71
|
## Claude Code subagents
|
|
70
72
|
|
|
71
|
-
The `claude-code` launch provider runs Claude Code through Anthropic's Agent SDK. The main agent
|
|
73
|
+
The `claude-code` launch provider runs Claude Code through Anthropic's Agent SDK. The main agent manages these workers with the same `tau.agents` methods and `wait_for_agents` tool as native Tau subagents. Claude Code models are available only as explicit subagent launch overrides.
|
|
72
74
|
|
|
73
|
-
Install Claude Code on the session's execution environment, put `claude` on its login-shell `PATH`, and sign in there with a Claude subscription. A login on the host or attached laptop does not reach a separate execution environment. Tau includes Agent SDK 0.3.
|
|
75
|
+
Install Claude Code on the session's execution environment, put `claude` on its login-shell `PATH`, and sign in there with a Claude subscription. A login on the host or attached laptop does not reach a separate execution environment. Tau includes Agent SDK 0.3.312, so no separate SDK installation is needed.
|
|
74
76
|
|
|
75
77
|
Add the desired model/effort combinations to the launch allowlist:
|
|
76
78
|
|
|
@@ -90,7 +92,7 @@ These are the three supported model IDs. Effort may be `low`, `medium`, `high`,
|
|
|
90
92
|
|
|
91
93
|
Claude Code manages its conversation, retries, and compaction. Each run allows up to 1,024 agentic turns. Tau passes the selected model, effort, working directory, and task. Other Tau model settings, such as service tier, do not apply. Follow-ups resume the same Claude session.
|
|
92
94
|
|
|
93
|
-
The worker uses Claude Code's native system prompt with a short addition: complete the task autonomously, preserve other agents' work, and return a self-contained result. It cannot ask the parent or user for clarification. Tau does not copy the parent conversation, persona prompt, project instructions, or skill descriptions. The worker is instructed to follow applicable project instructions itself.
|
|
95
|
+
The worker uses Claude Code's native system prompt with a short addition: complete the task autonomously, treat later messages as coming from the parent agent, preserve other agents' work, and return a self-contained result. It cannot ask the parent or user for clarification. Tau does not copy the parent conversation, persona prompt, project instructions, or skill descriptions. The worker is instructed to follow applicable project instructions itself.
|
|
94
96
|
|
|
95
97
|
Claude Code loads its user, project, and local settings and discovers its own instructions and skills. The `Skill` tool is always available. Other native tools follow the parent persona's selection:
|
|
96
98
|
|
|
@@ -106,15 +108,17 @@ Workers receive no Tau `code` capabilities, host MCP connections, `tau_docs`, or
|
|
|
106
108
|
|
|
107
109
|
Selected tools use `bypassPermissions`, with Claude Code's sandbox disabled. They run with the execution environment's operating-system authority, like Tau's tools. Review the local Claude settings, skills, and MCP configuration before enabling these workers.
|
|
108
110
|
|
|
109
|
-
Tau displays short assistant updates and tool completion summaries.
|
|
111
|
+
Tau displays short assistant updates and tool completion summaries. It also records the worker's assistant text, tool calls, and tool results in the worker's [trace](#conversation-traces), using Claude Code's own tool names, such as `Bash` and `Read`. Tau records SDK-reported assistant token usage as it arrives, so interruption preserves counts already received. Repeated message blocks and resumed messages are counted once. Final SDK totals reconcile these counts and supply cost estimates, including earlier usage when a session resumes. Cost from an interrupted run remains unavailable until the SDK reports it. The latest assistant usage supplies a context-token estimate; after a successful run, the SDK's context summary supplies the window size and a fuller measurement.
|
|
110
112
|
|
|
111
113
|
Before sending the task, Tau checks that the SDK reports a subscription login without API-key authentication. Claude Code keeps its own credentials. Tau removes API and cloud-provider routing overrides from the child environment and provides no API fallback. Fast mode is disabled. Account-level extra usage can still incur charges; disable it in Claude to use only the included subscription allowance. The SDK's dollar estimates do not report subscription charges.
|
|
112
114
|
|
|
115
|
+
Steering messages go to Claude Code through the Agent SDK's streaming input while the worker is busy. Claude Code decides when to read them, typically between tool rounds, and a tool that is already running may continue. A steering message that Claude Code has not read when its turn ends is handled in another turn. Queued messages wait until Claude Code reports that its turn is finished.
|
|
116
|
+
|
|
113
117
|
Claude workers share the eight-worker limit and the usual subagent lifetime. Interrupting a worker terminates its process group. A follow-up can resume its Claude session while the parent session remains alive. Host restart, session disposal, and rewind remove workers under the same rules as native Tau subagents. Claude's transcript files remain on disk, but Tau does not use them to restore workers after a restart.
|
|
114
118
|
|
|
115
119
|
## Working directory
|
|
116
120
|
|
|
117
|
-
`
|
|
121
|
+
`tau.agents.spawn` normally runs the subagent in the main session's `cwd`. The optional `workingDirectory` may be absolute or relative to that `cwd`. Tau resolves it to an absolute path on the execution environment.
|
|
118
122
|
|
|
119
123
|
For native Tau subagents, when that path differs from the parent's `cwd`, Tau rebuilds the subagent's context for the new directory. It detects the platform and repository there, reads the applicable `AGENTS.md` files, and discovers that directory's skills.
|
|
120
124
|
|
|
@@ -124,43 +128,118 @@ For native Tau subagents, the new directory does not change the persona, model c
|
|
|
124
128
|
|
|
125
129
|
A native Tau launch fails if Tau cannot build context for the directory, if the directory is invalid for the environment, or if the environment cannot resolve working directories. A path that resolves to the parent's `cwd`, such as `.`, reuses the parent's context. Claude Code workers load context themselves in the selected directory; an invalid directory fails when the worker starts.
|
|
126
130
|
|
|
127
|
-
##
|
|
131
|
+
## Managing subagents
|
|
132
|
+
|
|
133
|
+
The main agent manages subagents with `tau.agents` inside the [`code` tool](code-mode.md), and waits for them with the `wait_for_agents` tool. Each subagent has an ID that the host generates, and one conversation that grows with each input.
|
|
128
134
|
|
|
129
|
-
|
|
135
|
+
| Method | Purpose |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| `spawn({ title, prompt, model?, workingDirectory? })` | Start a subagent. |
|
|
138
|
+
| `list()` | State of every subagent, plus the number running and the limit. |
|
|
139
|
+
| `read({ id })` | State of one subagent. |
|
|
140
|
+
| `sendInput({ id, message, mode })` | Queue or steer more input. |
|
|
141
|
+
| `interrupt({ id, wait? })` | Stop the current turn and discard pending input. |
|
|
142
|
+
| `waitUntilIdle({ id })` | Wait inside a program until the subagent is idle. |
|
|
143
|
+
| `trace({ id, kinds?, toolName?, limit?, cursor? })` | Read a page of the subagent's conversation. |
|
|
144
|
+
| `readText({ id, seq, maxChars? })` | Read the text of one assistant message or tool result. |
|
|
145
|
+
| `readContent({ id, ref, cursor? })` | Page through large or non-text content. |
|
|
146
|
+
|
|
147
|
+
The agent reads the complete reference, with types and examples, by printing `await tau.docs("agents")` in `code`. A program reads conversation data into JavaScript variables. Only what the program prints reaches the main agent's conversation, so the agent can select the part of a long trace it needs.
|
|
130
148
|
|
|
131
149
|
### Spawn
|
|
132
150
|
|
|
133
|
-
`
|
|
151
|
+
`spawn` takes a single-line title of at most 512 characters, a prompt of at most 262,144 characters, an optional model, and an optional working directory. The prompt is the subagent's first message, and the subagent does not see the parent conversation, so the prompt should be self-contained. The call returns right away with the subagent's state, and the subagent keeps working in the background.
|
|
152
|
+
|
|
153
|
+
When the main persona has `history`, a native Tau subagent may read the parent session's transcript as a last resort, when missing context would stop the work or force an important assumption. It reads with `tau.history.read` and `source: "local"`, so the read uses the host's local history even when a remote collection is configured. Local recording is best-effort, so the newest parent entries can occasionally be missing.
|
|
154
|
+
|
|
155
|
+
At most eight subagents can be working at once in one main session. Idle subagents do not count toward this limit.
|
|
156
|
+
|
|
157
|
+
### State and waiting
|
|
158
|
+
|
|
159
|
+
A subagent's state has its ID, title, model and reasoning, working directory, status, counts of pending queued and steering input, token usage, context size, and cost. The status is one of:
|
|
160
|
+
|
|
161
|
+
- `working`: the subagent is handling input.
|
|
162
|
+
- `stopping`: an interrupt was requested and the turn has not ended yet.
|
|
163
|
+
- `idle`: no turn is running and no input is pending. `reason` tells how the latest turn ended: `completed`, `interrupted`, or `failed`, with an error code and message for a failure.
|
|
164
|
+
|
|
165
|
+
`completed` means the turn ended normally. It does not mean the task succeeded, so the main agent reads the subagent's answer before relying on it. Background Bash and code jobs that a subagent started do not keep it working. A subagent that needs a job's result must wait for the job before it answers.
|
|
166
|
+
|
|
167
|
+
`wait_for_agents` takes one or more IDs. It returns as soon as at least one of them is idle, with a text block for every requested subagent:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
id: 0b6c2f1e-7d4a-4c1b-9a53-2e8f0d9c4b71
|
|
171
|
+
title: "review authentication"
|
|
172
|
+
status: idle
|
|
173
|
+
reason: completed
|
|
174
|
+
pending: queue=0 steer=0
|
|
175
|
+
response_seq: 42
|
|
176
|
+
response_complete: true
|
|
177
|
+
response_partial: false
|
|
178
|
+
|
|
179
|
+
--- response ---
|
|
180
|
+
No problems found in the session expiry checks.
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
A subagent that is still working or stopping gets only its ID, title, status, and pending counts. An idle subagent also gets `reason`, an `error` line with the code and message after a failed turn, and the last assistant message from its latest turn:
|
|
134
184
|
|
|
135
|
-
|
|
185
|
+
- `response_seq` is the message's `seq` in the trace. `readText({ id, seq, maxChars })` in `code` reads more retained text. For messages beyond its limit, use `trace` to get the content reference and page through it with `readContent`.
|
|
186
|
+
- `response_complete` is `false` when the text was shortened to fit the budget, or when some of it is unavailable or was removed from the trace. Shortened text keeps its beginning and end, with a marker in the middle.
|
|
187
|
+
- `response_partial` is `true` when the turn failed or was interrupted, so the message may be an unfinished answer.
|
|
188
|
+
- `response: none` replaces these lines when the latest turn produced no assistant message. A message from an earlier turn is never returned.
|
|
136
189
|
|
|
137
|
-
|
|
190
|
+
The response text of all requested subagents shares a budget of 8,192 estimated tokens, split evenly between them, working ones included. The optional `maxOutputTokens` sets a different budget, from 1 to 65,536.
|
|
138
191
|
|
|
139
|
-
`
|
|
192
|
+
Inside a program, `waitUntilIdle` waits for one subagent with the same meaning of idle and returns its state without the response. Neither wait returns until queued input has been handled too. Cancelling a wait, or stopping the program that waits, does not interrupt the subagent.
|
|
140
193
|
|
|
141
|
-
|
|
194
|
+
The host also sends live subagent activity to attached clients for display. It is a summary for display. The subagent's messages and tool results are in its trace.
|
|
142
195
|
|
|
143
|
-
|
|
196
|
+
### Send more input
|
|
144
197
|
|
|
145
|
-
|
|
198
|
+
`sendInput` requires a `mode`:
|
|
146
199
|
|
|
147
|
-
`
|
|
200
|
+
- `queue`: the subagent finishes its current work, then handles the message as a separate turn. Queued messages run in the order they were sent.
|
|
201
|
+
- `steer`: the subagent takes the message into account as soon as possible during its current turn. A native Tau subagent applies it at the next safe point, never in the middle of a model response or tool call, as in the [main session](sessions.md#submit-queue-and-steer). [Claude Code subagents](#claude-code-subagents) follow Claude Code's own streaming-input behavior.
|
|
148
202
|
|
|
149
|
-
|
|
203
|
+
Either mode starts a new turn right away on an idle subagent. The call returns once the input is accepted, before the subagent reads it. The subagent keeps its conversation, model, settings, tools, and working directory. Earlier messages stay readable in its trace.
|
|
204
|
+
|
|
205
|
+
Sending input fails while the subagent is stopping, when 64 inputs are already pending, or when the subagent is idle and eight subagents are already working. Follow-up input does not pick up a changed persona definition or a reloaded allowlist.
|
|
150
206
|
|
|
151
207
|
### Interrupt
|
|
152
208
|
|
|
153
|
-
`
|
|
209
|
+
`interrupt` stops the current turn and discards all pending input, so the subagent does not continue with queued work. By default the call waits until the turn has ended. With `wait: false` it returns right away, and the status may still be `stopping`. Interrupting an idle subagent only returns its state. Background jobs that the subagent started keep running, and the subagent stays available for more input.
|
|
154
210
|
|
|
155
211
|
In the TUI, `Ctrl+G` interrupts the selected running subagent. Interrupting the main session does not interrupt subagents, and interrupting a subagent does not interrupt the main session.
|
|
156
212
|
|
|
213
|
+
### Conversation traces
|
|
214
|
+
|
|
215
|
+
Each subagent has a trace: an ordered record of what it was told, what it said, and what its tools returned. Native Tau and Claude Code subagents produce the same kinds of entries:
|
|
216
|
+
|
|
217
|
+
| Kind | Contents |
|
|
218
|
+
| --- | --- |
|
|
219
|
+
| `input` | Each message the subagent was sent, with its mode: `initial`, `queue`, or `steer`. Recorded when the message is accepted. |
|
|
220
|
+
| `assistant` | The subagent's message text. |
|
|
221
|
+
| `tool_call` | The tool name, call ID, and arguments as JSON. |
|
|
222
|
+
| `tool_result` | The tool name, call ID, outcome, and the result exactly as the subagent received it. |
|
|
223
|
+
| `notice` | An event with a machine-readable code, such as `input.discarded` after an interrupt or `compaction.compacted`. A failed turn adds a notice with the failure code. |
|
|
224
|
+
| `status` | The subagent started working, began stopping, or became idle. |
|
|
225
|
+
|
|
226
|
+
Traces do not contain reasoning or system prompts. A tool result that the tool itself shortened stays shortened, and the trace cannot recover the missing output.
|
|
227
|
+
|
|
228
|
+
Each entry has a sequence number `seq` and a timestamp. A `trace` call returns the newest matching entries in chronological order, 20 by default and at most 50. It can filter by entry kinds and by tool name. Its `nextCursor` leads to older entries. A cursor keeps its starting point, so new activity does not shift the pages.
|
|
229
|
+
|
|
230
|
+
Content of at most 4,096 bytes as JSON, without images, is inline in the entry. Larger content and all images are references. `readText` returns the text of one assistant message or tool result, up to 30,000 UTF-16 code units by default and at most 100,000. Its `complete` field is `false` when the text was cut or some content is unavailable. It does not detect output that the tool itself shortened. Content with JSON or images needs `readContent`, which returns one block per page. Text arrives in chunks of at most 16,384 UTF-16 code units that join to the exact text.
|
|
231
|
+
|
|
232
|
+
A trace keeps the newest 4,096 entries, up to 64 MiB, for each subagent. When older entries are removed, trace pages report `historyEvicted: true`, and reading a removed entry or reference fails. A single content value larger than 6 MiB is replaced by a block that marks it unavailable. Traces last as long as the subagent and do not survive a host restart.
|
|
233
|
+
|
|
234
|
+
A failed call throws an error with a `code` and a `message`. The codes are `invalid_arguments`, `unknown_agent`, `invalid_cursor`, `expired_content`, `content_type`, `operation_failed`, and `cancelled`. A subagent's own failure is part of its state and trace, not a failed call.
|
|
235
|
+
|
|
157
236
|
## Detach, rewind, and recovery
|
|
158
237
|
|
|
159
238
|
Subagents belong to the running session on the host, not to an attached TUI. Detaching a client, or losing the connection, does not stop them while the session stays alive. Another client can attach to the session and see their current state.
|
|
160
239
|
|
|
161
240
|
Subagents do not survive the end of a session on the host or a host restart. Their status may be saved while the session is live, but recovery removes those records, because their runtimes no longer exist. A recovered session cannot send input to an old subagent ID.
|
|
162
241
|
|
|
163
|
-
Rewind also removes subagents that were started by an assistant message the rewind removed. Host shutdown or session disposal interrupts and removes all subagents.
|
|
242
|
+
Rewind also removes subagents that were started by an assistant message the rewind removed. A subagent started from a `code` program belongs to the assistant message that ran the program, including a program running as a background job. Host shutdown or session disposal interrupts and removes all subagents.
|
|
164
243
|
|
|
165
244
|
Plan long work with this in mind. Important results should reach the main agent and end up in the session history or in project files before the session on the host goes away. [Sessions](sessions.md) covers saving and recovery in general.
|
|
166
245
|
|
|
@@ -170,6 +249,6 @@ Changes to persona tools or to the launch allowlist apply after `/reload` in an
|
|
|
170
249
|
|
|
171
250
|
`subagents.launchModels` must be an array of valid `<provider>/<model>:<effort>` strings. Unknown providers, invalid efforts, and malformed entries produce configuration warnings.
|
|
172
251
|
|
|
173
|
-
A launch can fail because of invalid arguments, a model outside the allowlist, the concurrency limit, a prompt that cannot be built, or a working directory whose context cannot be built.
|
|
252
|
+
A launch can fail because of invalid arguments, a model outside the allowlist, the concurrency limit, a prompt that cannot be built, or a working directory whose context cannot be built. Calls with an unknown subagent ID fail. Sending input also fails under the conditions in [send more input](#send-more-input).
|
|
174
253
|
|
|
175
|
-
Before starting a local TUI, `tau --debug --persona <id>` shows which tools are available, the model and settings subagents inherit, and the subagents' tool list. In a running session, `/reload` reports file warnings and `
|
|
254
|
+
Before starting a local TUI, `tau --debug --persona <id>` shows which tools are available, the model and settings subagents inherit, and the subagents' tool list. In a running session, `/reload` reports file warnings and `tau.agents.list()` shows live subagent state.
|
|
@@ -40,16 +40,12 @@ web
|
|
|
40
40
|
history
|
|
41
41
|
mcp
|
|
42
42
|
models
|
|
43
|
-
|
|
44
|
-
send_input_to_agent
|
|
45
|
-
wait_for_agents
|
|
46
|
-
list_agents
|
|
47
|
-
interrupt_agent
|
|
43
|
+
agents
|
|
48
44
|
```
|
|
49
45
|
|
|
50
|
-
A custom persona that omits `tools` gets
|
|
46
|
+
A custom persona that omits `tools` gets all of these names. Built-in personas get the same set.
|
|
51
47
|
|
|
52
|
-
`web`, `history`, `mcp`, and `models` are not separate tools. Each enables a namespace inside the single `code` tool. `bash` enables both the Bash tools and `tau.bash` inside `code`. Tau adds `code` whenever at least one usable capability is selected; `code` itself cannot be listed. A namespace the persona does not select is missing from the `code` API and its documentation.
|
|
48
|
+
`web`, `history`, `mcp`, and `models` are not separate tools. Each enables a namespace inside the single `code` tool. `bash` enables both the Bash tools and `tau.bash` inside `code`. `agents` enables `tau.agents` inside `code` and the `wait_for_agents` tool, which together start and manage [subagents](subagents.md). Tau adds `code` and its [job tools](code-mode.md#background-code-jobs) whenever at least one usable capability is selected; `code` itself cannot be listed. A namespace the persona does not select is missing from the `code` API and its documentation.
|
|
53
49
|
|
|
54
50
|
An empty list turns off every selectable tool:
|
|
55
51
|
|
|
@@ -89,7 +85,7 @@ Agents are told to choose the mode that avoids needless waiting. Background mode
|
|
|
89
85
|
|
|
90
86
|
Background mode also fits a service that must keep running, or work that must survive turns and interruptions. Starting several independent jobs and then waiting for them is a valid way to run work in parallel. This is guidance for the agent; Tau does not enforce it.
|
|
91
87
|
|
|
92
|
-
The default foreground timeout is 60 seconds. Tau captures at most
|
|
88
|
+
The default foreground timeout is 60 seconds. Tau captures at most 24 MiB of combined stdout and stderr, and keeps the end when there is more. By default the result the model sees is limited to about 8,192 estimated tokens. Longer output is replaced by a preview of about 2,048 tokens that keeps the beginning and end, with a notice. The command has still run in full, with all its side effects.
|
|
93
89
|
|
|
94
90
|
A narrower command is better than a higher limit. When more output is really needed, the agent can set `maxOutputTokens` between 8,192 and 16,384 on its own. Values above 16,384, up to 65,536, require an explicit user request. When output is truncated, Tau may save it to a temporary file in the execution environment and report the path.
|
|
95
91
|
|
|
@@ -97,21 +93,40 @@ In a local execution environment, Tau removes inherited environment variables wh
|
|
|
97
93
|
|
|
98
94
|
The TUI commands `!<command>` and `!!<command>` run the same way, in a fresh login shell. `!` adds the result to the model's context and `!!` does not. They allow more output into context than an agent's tool call, but capture is still limited.
|
|
99
95
|
|
|
100
|
-
With `background: true`, `bash` starts the command and returns a job ID
|
|
96
|
+
With `background: true`, `bash` starts the command and returns a job ID right away, without waiting for it to exit. Background jobs have no time limit, and combining `background: true` with `timeout` or `maxOutputTokens` is invalid. Jobs keep running across turns and interruptions.
|
|
101
97
|
|
|
102
|
-
|
|
98
|
+
Each job belongs to the agent that started it, and only that agent can list, read, wait for, or stop it. The main agent, each subagent, and each ephemeral thread have separate jobs. A subagent keeps its jobs across follow-up messages. An ephemeral thread, including a fork, starts with no jobs.
|
|
103
99
|
|
|
104
|
-
`read_bash_job`, `stop_bash_job`, and `wait_for_bash_jobs
|
|
100
|
+
Enabling `bash` also enables `list_bash_jobs`, `read_bash_job`, `stop_bash_job`, and `wait_for_bash_jobs`. These cannot be listed separately in a persona. Each job appears as a block of labeled lines: `id`, `status`, `command`, `cwd`, and, once the command has exited, `exit_code` and any terminating `signal`. Read, stop, and wait add the job's output after an `--- output ---` line. List never includes output. For example:
|
|
105
101
|
|
|
106
|
-
|
|
102
|
+
```text
|
|
103
|
+
id: <job id>
|
|
104
|
+
status: running
|
|
105
|
+
command: "npm test"
|
|
106
|
+
cwd: "/work/app"
|
|
107
|
+
output: truncated; showing beginning and end
|
|
108
|
+
|
|
109
|
+
--- output ---
|
|
110
|
+
<beginning and end of output>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Stop terminates the job's process group, kills it if it has not exited after a grace period, and waits until it has stopped. Tau keeps up to 64 job records for each agent and drops the oldest finished one when needed. Starting a job fails if all 64 are still running.
|
|
114
|
+
|
|
115
|
+
Each job keeps the last 24 MiB of combined output. Read, stop, and wait return that output within a budget of 8,192 estimated tokens for the whole response by default, divided evenly among the requested jobs. `maxOutputTokens` sets this budget, from 1 to 65,536. When a job's output exceeds its share, the result shows the beginning and the end. The `output: truncated` line means only that this response shows part of the output. A separate `capture: truncated` line means the job produced more than 24 MiB, so its earliest output is lost.
|
|
116
|
+
|
|
117
|
+
When a job with output finishes, Tau writes all of its retained text to a temporary file in the execution environment. Later results that include output give the file's path as `text_log`, so the agent can read or search it instead of raising the budget or running the command again. A running job has no text log. If the file cannot be written, the result shows `text_log: unavailable`.
|
|
118
|
+
|
|
119
|
+
`read_bash_job`, `stop_bash_job`, and `wait_for_bash_jobs` accept `includeOutput`, which defaults to `true`. With `false`, the result has only the labeled job lines. It leaves out output, truncation lines, the text log, and execution error messages.
|
|
120
|
+
|
|
121
|
+
In the TUI, job tool cards have headings such as `reading bash <id>` and `listed bash jobs`, and show a seven-line preview from the middle of the result. A background start shows `started background <command>`.
|
|
107
122
|
|
|
108
123
|
Background launch and job-tool footers show the tool call's duration, estimated tokens, and line count. Counts cover the exact text returned to the model after output limits, before the card preview is shortened. With `includeOutput: false`, only returned job information counts. The launch footer also includes the working directory. A `◆` marker means included command output was truncated; shortening the card preview alone does not add it. A wait that reaches its timeout appends `timed out` without making the card an error. Durations measure the tool call, not the job's lifetime, and cards remain snapshots of that call.
|
|
109
124
|
|
|
110
125
|
When a job tool call is invalid or fails, the TUI card shows a short diagnostic as well as the model's result. A normal cancellation shows no details.
|
|
111
126
|
|
|
112
|
-
`wait_for_bash_jobs({ids, timeout?, includeOutput?})` returns when any of the jobs exits or the wait times out. Jobs that already finished return immediately. The timeout is a positive integer in milliseconds, defaults to 60,000, and can be at most 300,000. A timeout counts as a successful result
|
|
127
|
+
`wait_for_bash_jobs({ids, timeout?, includeOutput?, maxOutputTokens?})` returns when any of the jobs exits or the wait times out. Jobs that already finished return immediately. The timeout is a positive integer in milliseconds, defaults to 60,000, and can be at most 300,000. A timeout counts as a successful result. It starts with a note that the jobs are still running, followed by their current blocks, and does not stop the jobs. Interrupting the wait leaves them running too. A job finishing never starts an agent turn by itself.
|
|
113
128
|
|
|
114
|
-
Jobs survive client disconnects while the host is running, and keep an idle session from being unloaded until they finish. Closing the session normally or shutting down the host stops
|
|
129
|
+
Jobs survive client disconnects while the host is running, and keep an idle session from being unloaded until they finish. Closing the session normally or shutting down the host stops the jobs of every agent in the session. Job records are not saved or recovered, and an old ID fails with a clear error. An unknown ID does not mean the command never ran, that its side effects were undone, or that it has stopped. Agents are told to check running processes and output before starting such a command again. Cleanup does not cover processes that daemonize themselves, tmux sessions, or processes left behind by a host crash or forced kill.
|
|
115
130
|
|
|
116
131
|
### Write and edit
|
|
117
132
|
|
|
@@ -142,56 +157,11 @@ Each guide covers setup, input, examples, outputs, and failures. Run `tau tool -
|
|
|
142
157
|
|
|
143
158
|
## Code-mode composition
|
|
144
159
|
|
|
145
|
-
`code` runs a
|
|
146
|
-
|
|
147
|
-
### Documentation and output
|
|
148
|
-
|
|
149
|
-
If the agent has not yet seen the runtime guide, it first runs a program that only prints it:
|
|
150
|
-
|
|
151
|
-
```js
|
|
152
|
-
printText(docs);
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
The guide covers runtime rules, capabilities, and examples. The agent reads each capability's reference it has not seen yet in a separate call that only prints documentation:
|
|
156
|
-
|
|
157
|
-
```js
|
|
158
|
-
printText(await tau.docs("web"));
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
The agent does not re-read documentation it has already seen. MCP tool descriptions are read separately. Programs do not need to print intermediate results.
|
|
162
|
-
|
|
163
|
-
`printText` accepts only strings; objects and arrays throw a `TypeError`. The agent selects relevant fields and explicitly formats concise plain text to save tokens. `JSON.stringify` is reserved for cases where the structure matters or machine-readable JSON is requested, with fields selected first instead of dumping whole responses.
|
|
164
|
-
|
|
165
|
-
Only `printText(string)` and awaited `printImage({ data, mimeType })` produce output, in the order they are called. Return values are ignored. Text is truncated in the middle to `maxOutputTokens` (default 8,192; range 1–65,536). The agent leaves it unset unless needed, and may raise it to 16,384 on its own. Higher values require an explicit user request. When text from the built-in `code` tool is truncated, Tau saves it to a temporary file in the execution environment when possible and reports the path. The agent reads that file instead of running the program again with its side effects. The file does not contain images or text lost to capture limits.
|
|
166
|
-
|
|
167
|
-
JPEG, PNG, and WebP images are validated outside the sandbox and fitted to 4,096 pixels per dimension and 3.5 MiB each. Source images can be at most 40 megapixels, and a program can emit at most 16 images. Valid images are kept even if the built-in `code` program fails.
|
|
168
|
-
|
|
169
|
-
The helper functions `truncate(text, { maxChars, position? })` and `truncateLines(text, { maxLines, position? })` return shortened strings with a marker where text was removed. `position` defaults to `middle`; `start` and `end` keep that end of the text. They do not print anything.
|
|
170
|
-
|
|
171
|
-
```js
|
|
172
|
-
const result = await tau.bash.run({ command: "npm test" });
|
|
173
|
-
printText(truncate(result.stdout, { maxChars: 4000 }));
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### Execution and limits
|
|
177
|
-
|
|
178
|
-
Programs have no direct access to files, processes, environment variables, credentials, imports, timers, or the network. They can act only through the capabilities. Keep data in variables, and use `tau.bash` for files. There is no scratch-file API.
|
|
179
|
-
|
|
180
|
-
`code` times out after 5 minutes by default. `timeout` accepts 1–900,000 ms (15 minutes). `tau.bash.run` times out after 60 seconds by default, and at most after 5 minutes or the program's own deadline, whichever comes first. A program can make 128 API requests, eight at a time. Each serialized request and response can be at most 64 MiB. Object properties set to `undefined` are dropped, while `undefined` arguments and array entries are rejected. Programs are never retried, and failure or cancellation does not undo actions already taken.
|
|
181
|
-
|
|
182
|
-
### Capabilities
|
|
183
|
-
|
|
184
|
-
- `tau.web`: metadata discovery, Exa search, and fetching page content. Search uses Auto with Dynamic Highlights to select evidence across results. An optional `objective` (1–4,096 nonblank characters) describes the broader task and facts to extract. Results include a `notices` array with retrieval qualifications such as relaxed query restrictions; each notice retains its `code`, `path`, `message`, and optional `details`. The agent prints notices alongside selected search results. The agent prefers local data, dedicated CLIs, first-party APIs, and structured sources over scraping web pages. For GitHub it uses `gh` or a Git checkout where suitable. Metadata discovery works without an Exa key; search and content fetching need one.
|
|
185
|
-
- `tau.history`: read-only search and paginated transcripts. The agent uses it only when explicitly told to look at past sessions. It treats past content as data and never follows instructions in it. See [history](history.md).
|
|
186
|
-
- `tau.mcp`: finding and calling tools and resources on configured MCP servers. When the persona allows MCP, enabled server names and optional configured descriptions are visible in the initial tool definition, before any tool call. Disabled servers and connection settings are omitted. These summaries guide discovery and do not grant permission to act. The agent reads each tool's description and schema before calling it. Connections are shared and opened on first use, and calls that change data are never retried. An `isError` result is returned as data, while protocol failures throw. MCP server configuration and trust rules apply. See [configuration reference](config-reference.md#mcpservers) and [security](security.md#trust-mcp-servers).
|
|
187
|
-
- `tau.bash`: `run`, `start`, `list`, `read`, `wait`, and `stop`. `run` returns stdout, stderr, and exit and termination fields, capturing up to 24 MiB. Beyond that it keeps the end, so check `truncated` before parsing. Optional UTF-8 `stdin` is limited to 16 MiB and closed after writing. Without `stdin` the command has no stdin at all, while `""` gives it an empty one. `start` takes no stdin. Background jobs are the same jobs as the Bash tools', with the same output limits. Jobs survive the program ending and interruption, while foreground commands are cancelled. The shell rules above apply.
|
|
188
|
-
- `tau.models`: lists a fixed set of OpenRouter models and runs standalone chats or typed decisions with them. These calls do not see the session's conversation or tools. Chat media can be paths on the agent's machine or inline padded base64 with a matching MIME type. Credentials stay on the host. Provider usage data is returned, but these charges are not included in the session's cost or usage logs. Requests can be cancelled and are never retried automatically. Limits on input, models, media, responses, and requests are the same as in [OpenRouter](openrouter.md). Check whether a response completed or was refused instead of assuming it is a full answer.
|
|
189
|
-
|
|
190
|
-
SDK and command client tools built on code mode use the same sandbox functions and output rules, with their own declared APIs. Their programs time out after 60 seconds unless configured otherwise.
|
|
160
|
+
`code` runs a JavaScript program, inline or from a saved file, that combines the enabled capabilities. It can also run the program as a background job. See [code mode](code-mode.md) for input, output, limits, background code jobs, and each capability.
|
|
191
161
|
|
|
192
162
|
## Subagent tools
|
|
193
163
|
|
|
194
|
-
A subagent gets each of `bash`, `write`, `edit`, `view_image`, `web`, `history`, `mcp`, and `models` that the main persona also has, plus `tau_docs`. It never gets
|
|
164
|
+
A subagent gets each of `bash`, `write`, `edit`, `view_image`, `web`, `history`, `mcp`, and `models` that the main persona also has, plus `tau_docs`. It never gets `agents` or client tools. Its Bash and file tools start in the subagent's working directory. [Subagents](subagents.md#tools) has the details.
|
|
195
165
|
|
|
196
166
|
## Client-owned tools
|
|
197
167
|
|
|
@@ -223,7 +193,7 @@ The runner holds the upload credentials, and the recipient is always the session
|
|
|
223
193
|
First work out where the tool should come from:
|
|
224
194
|
|
|
225
195
|
- For a host tool, check the active persona's `tools`, the host configuration, and service credentials.
|
|
226
|
-
- For a subagent
|
|
196
|
+
- For a tool inside a subagent, check the main persona's `tools` against the list of tools subagents can receive.
|
|
227
197
|
- For a client tool, confirm that an attached, observing client offers it and that client tools are not disabled.
|
|
228
198
|
- If `tau_docs` is missing, something is wrong with the Tau installation or version; no persona setting removes it.
|
|
229
199
|
|
|
@@ -117,11 +117,11 @@ For a host tool, check the active persona's `tools` list. A list replaces the de
|
|
|
117
117
|
|
|
118
118
|
For subagents, check three things:
|
|
119
119
|
|
|
120
|
-
1. The main persona has `
|
|
120
|
+
1. The main persona has `agents`.
|
|
121
121
|
2. A requested model exactly matches an entry in the launch allowlist.
|
|
122
122
|
3. Fewer than eight subagents are running.
|
|
123
123
|
|
|
124
|
-
A running subagent keeps its model, tools, and working directory after a reload. Recovery does not restore subagents, so old IDs cannot receive follow-ups after a host restart. Use `
|
|
124
|
+
A running subagent keeps its model, tools, and working directory after a reload. Recovery does not restore subagents, so old IDs cannot receive follow-ups after a host restart. Use `tau.agents.list()` in `code` to see live subagents. See [subagents](subagents.md).
|
|
125
125
|
|
|
126
126
|
If `tau_docs` is missing, the problem is the host's installation or version, not a persona. Check the host package and restart it.
|
|
127
127
|
|