@markusylisiurunen/tau 0.3.50 → 0.3.51
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 +26 -14
- package/dist/code_mode/command.js.map +1 -1
- package/dist/code_mode/index.d.ts +2 -1
- package/dist/code_mode/index.js +1 -0
- package/dist/code_mode/index.js.map +1 -1
- package/dist/core/cli.js +0 -11
- package/dist/core/cli.js.map +1 -1
- package/dist/core/client_tools/command_client_tools.js +236 -151
- package/dist/core/client_tools/command_client_tools.js.map +1 -1
- package/dist/core/modes/index.js +0 -1
- package/dist/core/modes/index.js.map +1 -1
- package/dist/core/static/tau_docs/client-tools.md +212 -12
- package/dist/core/static/tau_docs/configuration.md +1 -1
- package/dist/core/static/tau_docs/credentials.md +4 -4
- package/dist/core/static/tau_docs/history.md +1 -1
- package/dist/core/static/tau_docs/index.md +1 -1
- package/dist/core/static/tau_docs/node-sdk.md +33 -26
- package/dist/core/static/tau_docs/ownership-and-scope.md +3 -4
- package/dist/core/static/tau_docs/prompts-and-project-context.md +2 -2
- package/dist/core/static/tau_docs/remote-sessions.md +4 -47
- package/dist/core/static/tau_docs/security.md +2 -6
- package/dist/core/static/tau_docs/session-protocol-methods.md +48 -7
- package/dist/core/static/tau_docs/session-protocol.md +18 -18
- package/dist/core/static/tau_docs/sessions.md +6 -5
- package/dist/core/static/tau_docs/telegram.md +8 -4
- package/dist/core/static/tau_docs/troubleshooting.md +3 -5
- package/dist/core/static/tau_docs/tui.md +4 -6
- package/dist/core/telegram/adapter.js +226 -18
- package/dist/core/telegram/adapter.js.map +1 -1
- package/dist/core/telegram/config.js +1 -1
- package/dist/core/telegram/config.js.map +1 -1
- package/dist/core/telegram/project_preferences.js +42 -12
- package/dist/core/telegram/project_preferences.js.map +1 -1
- package/dist/core/telegram/runtime.js +6 -1
- package/dist/core/telegram/runtime.js.map +1 -1
- package/dist/core/telegram/session_manager.js +50 -4
- package/dist/core/telegram/session_manager.js.map +1 -1
- package/dist/core/telegram/tts.js +137 -0
- package/dist/core/telegram/tts.js.map +1 -0
- package/dist/core/tools/presentation.js +55 -17
- package/dist/core/tools/presentation.js.map +1 -1
- package/dist/core/utils/gemini_speech.js +122 -41
- package/dist/core/utils/gemini_speech.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/host/client_tool_broker.js +71 -17
- package/dist/host/client_tool_broker.js.map +1 -1
- package/dist/host/local_session_host.js +2 -2
- package/dist/host/local_session_host.js.map +1 -1
- package/dist/host/session_host.js.map +1 -1
- package/dist/host/session_protocol_handler.js +17 -6
- package/dist/host/session_protocol_handler.js.map +1 -1
- package/dist/main.js +18 -92
- package/dist/main.js.map +1 -1
- package/dist/protocol/session_protocol.d.ts +22 -2
- package/dist/protocol/session_protocol.js +47 -3
- package/dist/protocol/session_protocol.js.map +1 -1
- package/dist/sdk/client_tool_command.d.ts +41 -13
- package/dist/sdk/client_tool_command.js +157 -39
- package/dist/sdk/client_tool_command.js.map +1 -1
- package/dist/sdk/client_tool_presentation.d.ts +17 -0
- package/dist/sdk/client_tool_presentation.js +9 -0
- package/dist/sdk/client_tool_presentation.js.map +1 -0
- package/dist/sdk/code_mode.js +10 -1
- package/dist/sdk/code_mode.js.map +1 -1
- package/dist/sdk/index.d.ts +5 -4
- package/dist/sdk/index.js +2 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/session.js +28 -9
- package/dist/sdk/session.js.map +1 -1
- package/dist/sdk/types.d.ts +11 -1
- package/dist/transport/errors.d.ts +0 -11
- package/dist/transport/errors.js +0 -12
- package/dist/transport/errors.js.map +1 -1
- package/dist/transport/index.d.ts +1 -3
- package/dist/transport/index.js +1 -2
- package/dist/transport/index.js.map +1 -1
- package/dist/tui/session_chat_app.js +28 -15
- package/dist/tui/session_chat_app.js.map +1 -1
- package/dist/tui/session_chat_controller.js +0 -51
- package/dist/tui/session_chat_controller.js.map +1 -1
- package/dist/tui/speech_playback.js +3 -3
- package/dist/tui/speech_playback.js.map +1 -1
- package/package.json +2 -2
- package/dist/core/modes/rpc_server.js +0 -105
- package/dist/core/modes/rpc_server.js.map +0 -1
- package/dist/transport/stdio_session_transport.d.ts +0 -48
- package/dist/transport/stdio_session_transport.js +0 -338
- package/dist/transport/stdio_session_transport.js.map +0 -1
|
@@ -41,7 +41,7 @@ Prompt templates are inserted into the editor for review rather than submitted a
|
|
|
41
41
|
|
|
42
42
|
## Keep secrets with the process that needs them
|
|
43
43
|
|
|
44
|
-
Most model and service credentials belong to the host because the host performs model calls, web search, history replication, and host-tool Nook requests. TUI speech credentials and command client-tool credentials belong to the client. Telegram bot and
|
|
44
|
+
Most model and service credentials belong to the host because the host performs model calls, web search, history replication, and host-tool Nook requests. TUI speech credentials and command client-tool credentials belong to the client. Telegram bot, transcription, and voice-response credentials belong to the Telegram runner. Hosted-environment bridge and API credentials belong to host startup.
|
|
45
45
|
|
|
46
46
|
In a remote attachment, a credential exported on the laptop does not authenticate the remote host. Conversely, putting a host credential into the execution target's shell environment unnecessarily exposes it to target processes. Follow [credentials](credentials.md) for exact resolution precedence.
|
|
47
47
|
|
|
@@ -77,12 +77,10 @@ Do not rely on sanitization as a secret store or authorization boundary. Avoid b
|
|
|
77
77
|
|
|
78
78
|
Tau command execution uses a fresh non-interactive login Bash. The execution environment's `HOME` controls login startup discovery. Bash can read `/etc/profile`, the first available user login file, and `BASH_ENV`; a login file may also source `.bashrc`.
|
|
79
79
|
|
|
80
|
-
These files execute with the same operating-system authority as every tool command. A compromised or overly broad startup file can change `PATH`, run commands, disclose data, terminate the shell, or
|
|
80
|
+
These files execute with the same operating-system authority as every tool command. A compromised or overly broad startup file can change `PATH`, run commands, disclose data, terminate the shell, or produce unexpected output. Review startup files in each execution environment, especially targets created from shared images or user homes.
|
|
81
81
|
|
|
82
82
|
Startup files must not print banners, prompt for input, read stdin, require a TTY, launch an editor, or exit the shell unexpectedly. Tau does not suppress their output. There is no TTY, and ordinary agent Bash calls have no stdin, so interactive authentication and terminal prompts fail or wait until timeout. Configure Git, SSH, package managers, and cloud CLIs for deliberate noninteractive use.
|
|
83
83
|
|
|
84
|
-
`tau rpc` has an additional constraint: stdout is the NDJSON protocol. Shell banners and wrapper diagnostics on stdout break the transport. Send diagnostics to stderr.
|
|
85
|
-
|
|
86
84
|
## Trust command client tools as local programs
|
|
87
85
|
|
|
88
86
|
Command client tools are defined only in user-owned global configuration, then selected for a project. Tau starts the configured executable directly, without a shell, and validates model arguments against its configured object schema. The command still runs as trusted local code with the client's full inherited environment and filesystem permissions.
|
|
@@ -124,8 +122,6 @@ Tau's listener is plain WebSocket and has no certificate configuration. Across a
|
|
|
124
122
|
|
|
125
123
|
A reverse proxy must preserve WebSocket upgrade behavior and the request query string while protecting both. Restrict who can reach the listener even when a token is configured. Multiple observers are active participants, not read-only viewers: they can submit, steer, interrupt, rewind, and advertise client tools. See [remote sessions](remote-sessions.md).
|
|
126
124
|
|
|
127
|
-
Stdio attachment relies on the security of the launched command, commonly SSH. Closing that transport also closes its one-shot host. Use a long-running authenticated WebSocket host when work must survive client disconnects.
|
|
128
|
-
|
|
129
125
|
## Secure Telegram access and workspaces
|
|
130
126
|
|
|
131
127
|
A Telegram runner is both a network-facing client and a local Tau host. Its bot configuration determines who can create turns that may execute tools in configured workspaces.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Session protocol method reference
|
|
2
2
|
|
|
3
|
-
This page defines every request method in protocol version
|
|
3
|
+
This page defines every request method in protocol version 13. It is the compact wire reference for clients that already understand connection, observation, and delta application from the [session protocol](session-protocol.md).
|
|
4
4
|
|
|
5
5
|
Every request uses `{ version, type: "request", id, method, params }`. Every successful response uses `{ version, type: "response", id, ok: true, result }`. `params` is required even when empty, and unknown object fields are stripped.
|
|
6
6
|
|
|
@@ -47,7 +47,7 @@ params: {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
result: {
|
|
50
|
-
protocolVersion:
|
|
50
|
+
protocolVersion: 13;
|
|
51
51
|
methods: string[];
|
|
52
52
|
alreadyInitialized: boolean;
|
|
53
53
|
}
|
|
@@ -557,21 +557,62 @@ Acknowledges a `session.clientTool.call` before its deadline.
|
|
|
557
557
|
params: {
|
|
558
558
|
sessionId: string;
|
|
559
559
|
callId: string;
|
|
560
|
+
presentation?: {
|
|
561
|
+
subject?: string;
|
|
562
|
+
subjectWrap?: "word" | "character";
|
|
563
|
+
details?: Array<{
|
|
564
|
+
text: string;
|
|
565
|
+
tone?: "added" | "removed";
|
|
566
|
+
wrap?: "word" | "character";
|
|
567
|
+
}>;
|
|
568
|
+
metadata?: string[];
|
|
569
|
+
};
|
|
560
570
|
}
|
|
561
571
|
result: {
|
|
562
572
|
accepted: boolean;
|
|
563
573
|
}
|
|
564
574
|
```
|
|
565
575
|
|
|
576
|
+
The optional presentation is a partial running-state override. When present, `subject` must be non-empty and may contain line feeds but not carriage returns. Each detail text and metadata value is one line. Presentation objects are limited to 1 MiB; subjects and detail values to 256 KiB each; metadata values to 16 KiB each; and detail and metadata collections to 1,024 entries each.
|
|
577
|
+
|
|
578
|
+
The host preserves explicit fields within those safety limits and supplies canonical display-truncated defaults for omitted fields. It owns the action and operation and records the resolved presentation. Empty detail or metadata arrays suppress those default fields. An accepted acknowledgement authorizes the client to begin execution.
|
|
579
|
+
|
|
566
580
|
### `session.clientTool.result`
|
|
567
581
|
|
|
568
|
-
Completes
|
|
582
|
+
Completes a call with model-visible content or an error.
|
|
569
583
|
|
|
570
584
|
```ts
|
|
585
|
+
type PresentationOverride = {
|
|
586
|
+
subject?: string;
|
|
587
|
+
subjectWrap?: "word" | "character";
|
|
588
|
+
details?: Array<{
|
|
589
|
+
text: string;
|
|
590
|
+
tone?: "added" | "removed";
|
|
591
|
+
wrap?: "word" | "character";
|
|
592
|
+
}>;
|
|
593
|
+
metadata?: string[];
|
|
594
|
+
};
|
|
595
|
+
|
|
571
596
|
params:
|
|
572
|
-
| {
|
|
573
|
-
|
|
574
|
-
|
|
597
|
+
| {
|
|
598
|
+
sessionId: string;
|
|
599
|
+
callId: string;
|
|
600
|
+
ok: true;
|
|
601
|
+
content: string;
|
|
602
|
+
presentation?: PresentationOverride;
|
|
603
|
+
}
|
|
604
|
+
| {
|
|
605
|
+
sessionId: string;
|
|
606
|
+
callId: string;
|
|
607
|
+
ok: false;
|
|
608
|
+
error: string;
|
|
609
|
+
presentation?: PresentationOverride;
|
|
610
|
+
};
|
|
611
|
+
result: { accepted: boolean };
|
|
575
612
|
```
|
|
576
613
|
|
|
577
|
-
|
|
614
|
+
The optional result presentation applies only to the reported terminal state and is resolved independently from the running presentation. The host preserves explicit fields unchanged after safety validation and supplies canonical display-truncated defaults for omitted fields. If no client result arrives, the host uses a complete fallback for timeout, cancellation, detach, or another terminal outcome.
|
|
615
|
+
|
|
616
|
+
A successful result is accepted only after the host has accepted the acknowledgement. An error sent before acknowledgement records a preparation failure, such as an error from `describe`, without authorizing execution. An error sent afterward records an execution failure.
|
|
617
|
+
|
|
618
|
+
`accepted: false` means the successful call was not yet authorized, or the call was cancelled, timed out, detached, unknown, or already completed. Do not retry or send additional results for that call.
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
# Session protocol
|
|
2
2
|
|
|
3
|
-
Tau's session protocol is the public wire contract for clients that create, observe, and control hosted sessions
|
|
3
|
+
Tau's session protocol is the public wire contract for clients that create, observe, and control hosted sessions through `tau serve`. Node applications can usually use the typed [Node SDK](node-sdk.md) instead.
|
|
4
4
|
|
|
5
|
-
The protocol
|
|
5
|
+
The protocol is transport-neutral and request and response based, with separate server messages for observed state, pending input, subagent activity, ephemeral feedback, and delegated client tools. Tau currently exposes it over WebSocket. The complete method surface is in the [session protocol method reference](session-protocol-methods.md).
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Connect over WebSocket
|
|
8
8
|
|
|
9
|
-
`tau
|
|
9
|
+
`tau serve` uses one UTF-8 JSON object per text WebSocket message. Binary messages are not supported. Authentication, TLS, listener setup, SSH tunneling, and host lifetime belong to [remote sessions](remote-sessions.md).
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Both transports expose one host. Starting either server does not create or select a session. A client lists, creates, or observes sessions explicitly.
|
|
11
|
+
The server exposes one host. Starting it does not create or select a session. A client lists, creates, or observes sessions explicitly.
|
|
14
12
|
|
|
15
13
|
The client, host, and execution environment remain separate logical machines even when they share a process or filesystem. Session paths and commands belong to the execution environment. Persistence, credentials, model work, and protocol coordination belong to the host. Client tools and local UI belong to the connected client. See [ownership and scope](ownership-and-scope.md) before passing paths or credentials across this boundary.
|
|
16
14
|
|
|
@@ -20,7 +18,7 @@ The server sends `ready` as its first message:
|
|
|
20
18
|
|
|
21
19
|
```json
|
|
22
20
|
{
|
|
23
|
-
"version":
|
|
21
|
+
"version": 13,
|
|
24
22
|
"type": "ready",
|
|
25
23
|
"methods": ["initialize", "session.create", "session.list"]
|
|
26
24
|
}
|
|
@@ -32,7 +30,7 @@ After `ready`, send `initialize` with non-empty client metadata:
|
|
|
32
30
|
|
|
33
31
|
```json
|
|
34
32
|
{
|
|
35
|
-
"version":
|
|
33
|
+
"version": 13,
|
|
36
34
|
"type": "request",
|
|
37
35
|
"id": "init-1",
|
|
38
36
|
"method": "initialize",
|
|
@@ -52,7 +50,7 @@ Every request has the same envelope:
|
|
|
52
50
|
|
|
53
51
|
```json
|
|
54
52
|
{
|
|
55
|
-
"version":
|
|
53
|
+
"version": 13,
|
|
56
54
|
"type": "request",
|
|
57
55
|
"id": "req-42",
|
|
58
56
|
"method": "session.snapshot",
|
|
@@ -66,7 +64,7 @@ Successful responses echo the request id:
|
|
|
66
64
|
|
|
67
65
|
```json
|
|
68
66
|
{
|
|
69
|
-
"version":
|
|
67
|
+
"version": 13,
|
|
70
68
|
"type": "response",
|
|
71
69
|
"id": "req-42",
|
|
72
70
|
"ok": true,
|
|
@@ -126,7 +124,7 @@ Observed snapshot changes arrive as `session.delta`:
|
|
|
126
124
|
|
|
127
125
|
```json
|
|
128
126
|
{
|
|
129
|
-
"version":
|
|
127
|
+
"version": 13,
|
|
130
128
|
"type": "session.delta",
|
|
131
129
|
"sessionId": "0195d6e4-4cf9-7f44-a2d8-f8f7f49ee9d3",
|
|
132
130
|
"fromRevision": 8,
|
|
@@ -164,7 +162,7 @@ Not all observed state belongs in the recoverable snapshot. Each live channel ha
|
|
|
164
162
|
|
|
165
163
|
```json
|
|
166
164
|
{
|
|
167
|
-
"version":
|
|
165
|
+
"version": 13,
|
|
168
166
|
"type": "session.pendingUserMessages",
|
|
169
167
|
"sessionId": "...",
|
|
170
168
|
"state": {
|
|
@@ -201,7 +199,7 @@ An initialized client that advertised a tool can receive:
|
|
|
201
199
|
|
|
202
200
|
```json
|
|
203
201
|
{
|
|
204
|
-
"version":
|
|
202
|
+
"version": 13,
|
|
205
203
|
"type": "session.clientTool.call",
|
|
206
204
|
"sessionId": "...",
|
|
207
205
|
"agentId": "main",
|
|
@@ -213,9 +211,11 @@ An initialized client that advertised a tool can receive:
|
|
|
213
211
|
}
|
|
214
212
|
```
|
|
215
213
|
|
|
216
|
-
Acknowledge promptly with `session.clientTool.ack`, then send exactly one `session.clientTool.result` with either `{ ok: true, content }` or `{ ok: false, error }
|
|
214
|
+
Acknowledge promptly with `session.clientTool.ack`, optionally including a bounded partial running presentation. Begin execution only after the acknowledgement returns `{ accepted: true }`, then send exactly one `session.clientTool.result` with either `{ ok: true, content }` or `{ ok: false, error }` and an optional independent terminal presentation. Both presentation objects may contain `subject`, `subjectWrap`, `details`, and `metadata`; the host owns action and operation and supplies every omitted field. Explicit fields are preserved unchanged after protocol safety validation, while generated defaults use Tau's canonical display truncation. Empty detail or metadata arrays suppress those defaults.
|
|
215
|
+
|
|
216
|
+
A successful result is rejected until acknowledgement has completed. If preparation itself fails, send an error result before acknowledgement; the host records it as a preparation failure without authorizing execution. If no result arrives because of timeout, cancellation, detach, or another failure, the host renders a complete fallback terminal presentation. The result method returns `{ accepted: boolean }`; `false` means the message is invalid for the call's current state or the call is no longer waiting for it.
|
|
217
217
|
|
|
218
|
-
`session.clientTool.cancel` names the session and call with reason `aborted`, `timeout`, or `
|
|
218
|
+
`session.clientTool.cancel` names the session and call with reason `aborted`, `timeout`, `client-detached`, or `host-failed`. Abort local work and do not send a late result. The SDK implements this lifecycle automatically. Tool execution authority and the execution-environment facade are covered in [client tools](client-tools.md).
|
|
219
219
|
|
|
220
220
|
## Handle errors and terminal transport failure
|
|
221
221
|
|
|
@@ -223,7 +223,7 @@ Error responses use `ok: false`:
|
|
|
223
223
|
|
|
224
224
|
```json
|
|
225
225
|
{
|
|
226
|
-
"version":
|
|
226
|
+
"version": 13,
|
|
227
227
|
"type": "response",
|
|
228
228
|
"id": "req-42",
|
|
229
229
|
"ok": false,
|
|
@@ -249,7 +249,7 @@ The supported codes are:
|
|
|
249
249
|
|
|
250
250
|
When no valid request id can be recovered, an error response uses `id: null`. Error `message` and optional `data` are diagnostic. Branch on `code`, not message text.
|
|
251
251
|
|
|
252
|
-
A
|
|
252
|
+
A WebSocket close, malformed server payload, unsupported version, or other terminal transport failure rejects all outstanding requests. Stop sending, cancel client-local delegated tools, and reconnect or create a new transport deliberately. A WebSocket disconnect detaches from the long-running host.
|
|
253
253
|
|
|
254
254
|
## Coordinate concurrent work
|
|
255
255
|
|
|
@@ -48,7 +48,7 @@ Retry runs another assistant turn from the current session history. It does not
|
|
|
48
48
|
|
|
49
49
|
Retry is unavailable when there is no prior user turn. It is also unavailable for goal-controlled turns because a blocked goal has an explicit resume operation.
|
|
50
50
|
|
|
51
|
-
Detaching is not the same as interrupting. Closing one observer of a long-running host leaves the hosted turn running. By contrast, a local TUI owns its in-process host,
|
|
51
|
+
Detaching is not the same as interrupting. Closing one observer of a long-running host leaves the hosted turn running. By contrast, a local TUI owns its in-process host, so closing it causes that host to shut down and interrupt active work. See [remote sessions](remote-sessions.md).
|
|
52
52
|
|
|
53
53
|
## Change persona and reasoning safely
|
|
54
54
|
|
|
@@ -189,14 +189,14 @@ Filters can be combined:
|
|
|
189
189
|
tau usage --since 2026-08-01 --provider openai-codex --group-by model
|
|
190
190
|
```
|
|
191
191
|
|
|
192
|
-
There is no `--until`, `--session`, or `--agent` filter. For a remote session, run `tau usage` on the host under the same user as `tau serve
|
|
192
|
+
There is no `--until`, `--session`, or `--agent` filter. For a remote session, run `tau usage` on the host under the same user as `tau serve`; running it on an attaching client reads that client user’s logs instead. The command is read-only, but the raw files still reveal timestamps, session identifiers, model choices, token volume, and cost activity. Prefer the filtered aggregate output over copying raw JSONL into a shared transcript, and treat Tau-recorded costs as operational estimates rather than a provider invoice.
|
|
193
193
|
|
|
194
194
|
## What survives each boundary
|
|
195
195
|
|
|
196
196
|
| Event | Durable session state | Pending input | Active turns and subagents | Client-local state |
|
|
197
197
|
| --- | --- | --- | --- | --- |
|
|
198
198
|
| Another client detaches from a live WebSocket host | Preserved | Preserved in host memory | Continue | Detached client tools, themes, drafts, and local tasks are lost |
|
|
199
|
-
| Local TUI
|
|
199
|
+
| Local TUI exits | Persisted by owned-host shutdown | Cancelled | Interrupted and settled where possible | Lost |
|
|
200
200
|
| WebSocket host restarts | Recovered from storage | Lost | Returns idle; subagents are not restored | Each client reconnects separately |
|
|
201
201
|
| TUI restarts while host stays live | Preserved | Preserved in host memory | Continue | Reloaded from the new client process |
|
|
202
202
|
| `/new` | Old session remains stored | Not copied | New idle session | Same TUI process continues |
|
|
@@ -214,10 +214,11 @@ Use normal Tau operations rather than opening or editing session files.
|
|
|
214
214
|
5. Run non-contextual environment checks with `!!`, for example `!!pwd` and `!!git status --short`.
|
|
215
215
|
6. Submit a small read-only request before resuming destructive work.
|
|
216
216
|
|
|
217
|
-
For a local stored session, a
|
|
217
|
+
For a local stored session, start a WebSocket host under the same user and attach from another terminal:
|
|
218
218
|
|
|
219
219
|
```sh
|
|
220
|
-
tau
|
|
220
|
+
tau serve
|
|
221
|
+
tau attach --session 0195d6e4-4cf9-7f44-a2d8-f8f7f49ee9d3 ws://127.0.0.1:8787
|
|
221
222
|
```
|
|
222
223
|
|
|
223
224
|
If recovery fails, verify the host version, execution-environment resolver configuration, target availability, and credentials before assuming the stored session is damaged. [Remote sessions](remote-sessions.md) covers those checks.
|
|
@@ -58,7 +58,7 @@ Unknown object fields are stripped, so a misspelled field can have no effect wit
|
|
|
58
58
|
| `maxSessions` | No | Positive integer cap on active sessions across the whole runner. |
|
|
59
59
|
| `systemMessage` | No | Non-empty model-facing instruction prepended to every Telegram turn. |
|
|
60
60
|
|
|
61
|
-
A relative top-level `workspaceRoot` resolves from the Telegram config file's directory. Tau persists runner session records at `<workspaceRoot>-sessions.json` and per-chat
|
|
61
|
+
A relative top-level `workspaceRoot` resolves from the Telegram config file's directory. Tau persists runner session records at `<workspaceRoot>-sessions.json` and per-chat preferences at `<workspaceRoot>-project-preferences.json`. These are runner-owned state files, not operator editing surfaces. Session snapshots remain in the normal host store under the runner user's Tau home.
|
|
62
62
|
|
|
63
63
|
`maxSessions` counts queued, preparing, running, and waiting sessions across all configured bots. Failed records do not consume the active cap, but they remain visible to their owning chat until replaced or closed.
|
|
64
64
|
|
|
@@ -83,7 +83,7 @@ Use both lists for a private bot. `allowedUserIds` controls who can trigger work
|
|
|
83
83
|
|
|
84
84
|
A bot sees only `allowedProjectIds`. If that field is omitted, it sees every configured project. A sole allowed project is selected automatically; otherwise a chat needs `defaultProjectId` or an explicit `/use_<project>` preference before `/new`.
|
|
85
85
|
|
|
86
|
-
Tau registers
|
|
86
|
+
Tau registers ten built-in commands plus one `/use_<projectId>` command per visible project. A bot may expose at most 90 projects under Telegram's 100-command limit.
|
|
87
87
|
|
|
88
88
|
## Project IDs and common fields
|
|
89
89
|
|
|
@@ -236,8 +236,10 @@ The runner's speech-to-text provider is loaded from normal Tau config at runner
|
|
|
236
236
|
| `/effort_xhigh` | Selects xhigh reasoning for later independent turns. |
|
|
237
237
|
| `/compact` | Runs summary-only manual compaction while the session is idle. |
|
|
238
238
|
| `/interrupt` | Interrupts the active Tau turn. |
|
|
239
|
+
| `/tts_on` | Enables a Gemini-generated voice note after each final assistant response. |
|
|
240
|
+
| `/tts_off` | Disables voice responses. |
|
|
239
241
|
|
|
240
|
-
|
|
242
|
+
Preferences are scoped to one bot and chat and survive restarts, projects, and sessions. A new project choice does not switch the active session; `/status` reports the difference.
|
|
241
243
|
|
|
242
244
|
In groups, commands must explicitly mention the bot. Accepted forms include:
|
|
243
245
|
|
|
@@ -284,6 +286,8 @@ Mistral is the default provider. Configure credentials in the runner's normal Ta
|
|
|
284
286
|
|
|
285
287
|
The environment variable wins for each speech provider. Audio without a usable key produces a user-facing error instead of entering a turn. See [credentials](credentials.md).
|
|
286
288
|
|
|
289
|
+
`/tts_on` uses `gemini-3.6-flash`, `gemini-3.1-flash-tts-preview`, Despina, the Google key, and runner `ffmpeg` with Opus. Source and rewritten text each allow 10,000 Unicode characters; audio allows 32 MiB. Rewrite and job timeouts are one and five minutes. Jobs are ephemeral. Failure sends `voice response failed. please try again.` without affecting text; details stay in logs.
|
|
290
|
+
|
|
287
291
|
## Command client tools
|
|
288
292
|
|
|
289
293
|
Each Telegram session advertises the configured command client tools selected by normal Tau configuration for its prepared workspace. Global `clientTools` definitions provide executable behavior, while the workspace's most-specific `enabledClientTools` value selects an exact subset. An empty list disables all configured client tools for that workspace.
|
|
@@ -300,7 +304,7 @@ If a referenced repository workspace is missing, Tau reconstructs it from the ca
|
|
|
300
304
|
|
|
301
305
|
If the connection is lost after Telegram submits a message, startup checks whether Tau accepted and completed it. Running work remains interruptible until it settles. A confirmed unaccepted message prompts the user to resend it; failed or blocked outcomes remain queued until delivery succeeds.
|
|
302
306
|
|
|
303
|
-
|
|
307
|
+
Restart does not replay responses. It clears voice jobs and short-lived retries, but pending notifications remain.
|
|
304
308
|
|
|
305
309
|
If a failed session still has unresolved submitted work, Tau can reconnect to determine the outcome. Other failed sessions remain visible with their original diagnostic until the owning chat replaces or closes them. Do not edit runner state files to force recovery.
|
|
306
310
|
|
|
@@ -189,8 +189,6 @@ Every Tau command uses a fresh non-interactive login Bash in the execution envir
|
|
|
189
189
|
|
|
190
190
|
Use automation-safe command flags. Configure credentials before invocation, set Git and SSH up for noninteractive access, and avoid editors or tools that require terminal control. Shell aliases, variables, `cd`, and functions do not persist between calls, so pass `workingDirectory` or use a complete command each time.
|
|
191
191
|
|
|
192
|
-
For stdio or SSH attachment, stdout from `tau rpc` is protocol-only. A login banner or wrapper message on stdout can look like malformed JSON, an unsupported message, or a timeout waiting for the ready message. Remove it or send diagnostics to stderr. Running the remote command directly can reveal startup diagnostics, but do not copy protocol output or secrets into reports.
|
|
193
|
-
|
|
194
192
|
Local command sanitization removes inherited credential-shaped variable names. If a target command needs authentication, use the tool's own secure noninteractive credential mechanism rather than broad environment forwarding. Hosted targets use their own environment.
|
|
195
193
|
|
|
196
194
|
## WebSocket attachment is unauthorized or unsafe
|
|
@@ -219,15 +217,13 @@ Changing a resolver definition or credential requires a host restart. `/reload`
|
|
|
219
217
|
|
|
220
218
|
Without `--session` or `--new`, attach needs a TTY for its selector. In automation, pass one explicitly. Normal local startup `--persona` flags are not attach options; choose the host default for new sessions or switch the attached session with `/persona:<id>` while idle.
|
|
221
219
|
|
|
222
|
-
If an SSH attach closes when the TUI exits, that is expected: the attachment owns its one-shot `tau rpc` host. Use `tau serve` when work must continue after disconnect. See [remote sessions](remote-sessions.md).
|
|
223
|
-
|
|
224
220
|
## A session is missing, interrupted, or will not recover
|
|
225
221
|
|
|
226
222
|
A selector shows only sessions this host can load and restore. Confirm its machine, OS user, home, Tau version, resolver configuration, and target still match the creator. Another user's `~/.config/tau/sessions` is a different store. Restore missing bridge/API definitions, credentials, local directory, sandbox, or Sprite. Never edit session JSON to substitute a target or `cwd`.
|
|
227
223
|
|
|
228
224
|
Recovery returns idle, aborts unfinished turns, cancels running maintenance, removes live subagents, and blocks an active goal. Review the last assistant and tools, then safely check `!!pwd` and `!!git status --short`. Resume a goal only after understanding the stop. Retry continues current history without rerunning completed tools automatically.
|
|
229
225
|
|
|
230
|
-
A WebSocket client disconnect does not interrupt the long-running host; server shutdown does. Closing a local TUI
|
|
226
|
+
A WebSocket client disconnect does not interrupt the long-running host; server shutdown does. Closing a local TUI shuts down its owned host, so interrupted recovery is expected.
|
|
231
227
|
|
|
232
228
|
A newer storage version requires that Tau version or later. For invalid JSON, snapshot, or ID errors, preserve the file and exact error, stop competing hosts, and investigate normal recovery. Do not edit or delete it first. Newer Tau migrates supported older documents automatically.
|
|
233
229
|
|
|
@@ -283,6 +279,8 @@ Distinguish download, materialization, format, and transcription errors. The rep
|
|
|
283
279
|
|
|
284
280
|
Successful audio turns echo `transcribed: …` before submission. In groups, non-triggering audio can be buffered for later mentioned context. If that is inappropriate for the chat, narrow `allowedChatIds` or avoid enabling the group.
|
|
285
281
|
|
|
282
|
+
Outgoing `/tts_on` voice responses always need `GEMINI_API_KEY` or `apiKeys.google`, even when incoming audio uses Mistral. They also require runner-side `ffmpeg` with Opus support. A generation or delivery failure sends `voice response failed. please try again.` while detailed diagnostics remain in runner logs. The original text response remains delivered.
|
|
283
|
+
|
|
286
284
|
## Telegram replies or notifications are delayed or missing
|
|
287
285
|
|
|
288
286
|
Each outbound chunk has a deadline and retries retryable failures twice. Telegram `retry_after` is honored, and per-chat ordering holds later notifications. Large replies are split, so only a later chunk may have failed.
|
|
@@ -17,7 +17,7 @@ Tau creates a local execution environment rooted at that directory. A startup pe
|
|
|
17
17
|
tau --persona gpt-5.6-sol-coder:high
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
`-p` is the short form. `--no-agent-context-files` omits `AGENTS.md` and explicitly configured context files, and `--no-client-tools` prevents the TUI from advertising its built-in and configured [client tools](client-tools.md).
|
|
20
|
+
`-p` is the short form. `--no-agent-context-files` omits `AGENTS.md` and explicitly configured context files, and `--no-client-tools` prevents the TUI from advertising its built-in and configured [client tools](client-tools.md).
|
|
21
21
|
|
|
22
22
|
Piped stdin becomes the first message in a local TUI session:
|
|
23
23
|
|
|
@@ -191,7 +191,7 @@ The session host supplies ephemeral review agents, while the local tool owns its
|
|
|
191
191
|
|
|
192
192
|
The TUI also advertises diff review as a client tool unless `--no-client-tools` is set. Manual `/diff` remains a TUI command even when model-facing client tools are disabled. See [client tools](client-tools.md) for attachment and multiple-client implications.
|
|
193
193
|
|
|
194
|
-
## Use speech
|
|
194
|
+
## Use speech
|
|
195
195
|
|
|
196
196
|
`/listen` and Ctrl+Y are currently macOS-only. Recording uses local `ffmpeg` with the AVFoundation audio input and stops when Ctrl+Y is pressed again, when Escape is pressed, or after five minutes. The transcript is inserted at the cursor for review and is not submitted automatically.
|
|
197
197
|
|
|
@@ -203,9 +203,7 @@ brew install ffmpeg
|
|
|
203
203
|
|
|
204
204
|
Mistral is the default and needs `MISTRAL_API_KEY` or `apiKeys.mistral`. Set `speechToText.provider` to `gemini` to use `GEMINI_API_KEY` or `apiKeys.google` instead. These settings and credentials are read by the TUI process, including during remote attachment.
|
|
205
205
|
|
|
206
|
-
`/speak` is also macOS-only. It rewrites the last assistant response for speech, generates audio with Gemini, and plays it through the local `afplay` command. It requires `GEMINI_API_KEY` or `apiKeys.google`, runs only while the session is idle, and can be stopped with Escape.
|
|
207
|
-
|
|
208
|
-
`tau --caffeinated` keeps macOS awake only during active assistant turns in that local TUI. It does not keep a remote host awake, and it is not accepted by `tau attach`.
|
|
206
|
+
`/speak` is also macOS-only. It rewrites the last assistant response for speech, generates audio with Gemini, and plays it through the local `afplay` command. It requires `GEMINI_API_KEY` or `apiKeys.google`, runs only while the session is idle, and can be stopped with Escape. Speech source and rewritten text are limited to 10,000 Unicode characters, and generation stops after 32 MiB of raw audio.
|
|
209
207
|
|
|
210
208
|
## Reload the right component
|
|
211
209
|
|
|
@@ -221,4 +219,4 @@ Restart the TUI instead after changing client-owned themes, the diff launcher, s
|
|
|
221
219
|
- `/prompt:<id>` fills the editor but does not submit it.
|
|
222
220
|
- `/diff` records returned feedback but does not automatically ask the assistant to act on it.
|
|
223
221
|
- `/reload` does not reload client themes or client tools.
|
|
224
|
-
- Exiting a WebSocket attachment does not delete or necessarily stop the hosted session. Exiting a local TUI
|
|
222
|
+
- Exiting a WebSocket attachment does not delete or necessarily stop the hosted session. Exiting a local TUI shuts down its owned host, so active work is interrupted and persisted before recovery where possible.
|