@markusylisiurunen/tau 0.3.81 → 0.3.83
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/README.md +1 -3
- package/dist/core/agent/agent_runtime.js +6 -4
- package/dist/core/agent/agent_runtime.js.map +1 -1
- package/dist/core/cli.js +2 -2
- package/dist/core/cli.js.map +1 -1
- package/dist/core/code_mode/models.js +61 -22
- package/dist/core/code_mode/models.js.map +1 -1
- package/dist/core/commands/registry.js +0 -22
- package/dist/core/commands/registry.js.map +1 -1
- package/dist/core/history/cli.js +48 -0
- package/dist/core/history/cli.js.map +1 -1
- package/dist/core/history/history_manager.js +9 -3
- package/dist/core/history/history_manager.js.map +1 -1
- package/dist/core/history/local_history_store.js +9 -2
- package/dist/core/history/local_history_store.js.map +1 -1
- package/dist/core/history/remote_history_client.js +18 -3
- package/dist/core/history/remote_history_client.js.map +1 -1
- package/dist/core/models/openrouter.js +17 -5
- package/dist/core/models/openrouter.js.map +1 -1
- package/dist/core/models/openrouter_decisions.js +16 -1
- package/dist/core/models/openrouter_decisions.js.map +1 -1
- package/dist/core/runtime/chat_runtime.js +2 -13
- package/dist/core/runtime/chat_runtime.js.map +1 -1
- package/dist/core/static/tau_docs/client-tools.md +53 -53
- package/dist/core/static/tau_docs/config-reference.md +46 -43
- package/dist/core/static/tau_docs/configuration.md +40 -36
- package/dist/core/static/tau_docs/credentials.md +32 -31
- package/dist/core/static/tau_docs/getting-started.md +28 -28
- package/dist/core/static/tau_docs/history.md +114 -79
- package/dist/core/static/tau_docs/image-generation.md +20 -18
- package/dist/core/static/tau_docs/index.md +30 -31
- package/dist/core/static/tau_docs/manifest.json +1 -0
- package/dist/core/static/tau_docs/models.md +17 -17
- package/dist/core/static/tau_docs/node-sdk.md +69 -72
- package/dist/core/static/tau_docs/nook.md +75 -69
- package/dist/core/static/tau_docs/openrouter.md +28 -13
- package/dist/core/static/tau_docs/ownership-and-scope.md +21 -23
- package/dist/core/static/tau_docs/pdf-unpacking.md +6 -6
- package/dist/core/static/tau_docs/personas.md +29 -27
- package/dist/core/static/tau_docs/prompts-and-project-context.md +41 -39
- package/dist/core/static/tau_docs/remote-sessions.md +38 -38
- package/dist/core/static/tau_docs/sdk-diff-review.md +16 -12
- package/dist/core/static/tau_docs/security.md +72 -72
- package/dist/core/static/tau_docs/session-protocol-methods.md +46 -91
- package/dist/core/static/tau_docs/session-protocol.md +54 -54
- package/dist/core/static/tau_docs/sessions.md +97 -107
- package/dist/core/static/tau_docs/skills.md +25 -20
- package/dist/core/static/tau_docs/speech-generation.md +5 -5
- package/dist/core/static/tau_docs/subagents.md +42 -44
- package/dist/core/static/tau_docs/telegram-projects.md +142 -0
- package/dist/core/static/tau_docs/telegram.md +65 -182
- package/dist/core/static/tau_docs/tools.md +72 -91
- package/dist/core/static/tau_docs/troubleshooting.md +94 -149
- package/dist/core/static/tau_docs/tui.md +124 -81
- package/dist/core/telegram/adapter.js +1 -6
- package/dist/core/telegram/adapter.js.map +1 -1
- package/dist/core/tool/image_generate.js +5 -17
- package/dist/core/tool/image_generate.js.map +1 -1
- package/dist/core/tool/openrouter.js +21 -2
- package/dist/core/tool/openrouter.js.map +1 -1
- package/dist/core/tools/catalog.js +0 -11
- package/dist/core/tools/catalog.js.map +1 -1
- package/dist/core/tools/tool_names.js +0 -6
- package/dist/core/tools/tool_names.js.map +1 -1
- package/dist/core/utils/gemini_transcription.js +103 -28
- package/dist/core/utils/gemini_transcription.js.map +1 -1
- package/dist/core/utils/model_stream.js +17 -1
- package/dist/core/utils/model_stream.js.map +1 -1
- package/dist/core/utils/user_metadata.js +0 -14
- package/dist/core/utils/user_metadata.js.map +1 -1
- package/dist/core/version.js +2 -2
- package/dist/diff_tool/app/dist/assets/{angular-html-BbLgbIhq.js → angular-html-x29PkEoY.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{angular-ts-DXk17TRM.js → angular-ts-CsWCqoCf.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{apl-BsvksCXR.js → apl-CEvdc7jl.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{astro-DH775E4V.js → astro-Cgi6YxH2.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{blade-Ck99Rm59.js → blade-B0pr7Zx6.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{c-DJpHqu5J.js → c-DDVLgtVy.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{chapel-Owff0Csy.js → chapel-Bk9M7Jej.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{cobol-Cv2gZuhO.js → cobol-DyEvnPuC.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{coffee-Bji0YCf_.js → coffee-Di2-m3Jq.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{cpp-DTjA_yFF.js → cpp-CWpAaUgO.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{crystal-Dd00NOeb.js → crystal-CUker9Zt.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{css-D44TN1V6.js → css-D4XpBIiJ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{edge-CVmGSi2m.js → edge-CVxhhF7L.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{elixir-B8Mq7no2.js → elixir-B_FS9APl.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{elm-CXS0I3Z2.js → elm-1KyefTkH.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{erb-B9oDKaUo.js → erb-CCgO9dRW.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{git-rebase-DT-YFebH.js → git-rebase-D0VYo_oY.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glimmer-js-s0DXlNjq.js → glimmer-js-Ce07ngjZ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glimmer-ts-QgEB5S2z.js → glimmer-ts-BmOM4djO.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glsl-NA0icwbY.js → glsl-D-jkLYJ8.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{graphql-0_dOlfV0.js → graphql-DZOwJE5e.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{hack-D-mr7l1l.js → hack-Cgvn19h8.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{haml-B0-oQmz7.js → haml-JTmDSYQl.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{handlebars-Yq9bXpWN.js → handlebars-CChh7Dy5.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{html-B8bMmdRK.js → html-BKgzx_cb.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{html-derivative-BpxSlQb_.js → html-derivative-CdFl0BmX.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{http-hS_53mxt.js → http-DZeL7KvH.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{hurl-B2ST1kwl.js → hurl-CqKevOlQ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/index-BXyr8GCM.js +341 -0
- package/dist/diff_tool/app/dist/assets/{java-D4mj0lZJ.js → java-Sq3MCkId.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{javascript-wC7rrKiV.js → javascript-CHZB4Nse.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jinja-DbQ3o87F.js → jinja-C4ucJVla.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jison-CrE9FdvP.js → jison-D3mprebA.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{json-xjicDyWN.js → json-DgPfCYJ1.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jsx-m28lXojQ.js → jsx-BG-Tx0cw.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{julia-19xkOmop.js → julia-B1GnFeUC.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{just-Cf7OorTr.js → just-_MZzo0MF.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{latex-DDb7GQOy.js → latex-DI0kqjQy.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{liquid-DHOuQ0rf.js → liquid-BtMAPeHl.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{lua-BGyIvonw.js → lua-CFxaP0To.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{marko-DB5OqI1C.js → marko-BIJocuFI.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{mdc-DTyNMupO.js → mdc-BAgrdjTH.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{nginx-DfF0fMYD.js → nginx-DE-3CsYn.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{nim-BbwsXuZD.js → nim-DOxeXLhb.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{org-BkOBBl1f.js → org-KTfP0tHA.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{perl-BTXTOl4K.js → perl-BH-NxpgK.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{php-DIMVQWiA.js → php-vuiVEXZK.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{pug-B_nrb4dJ.js → pug-VlIlTMUy.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{qml-1PXi8G8Z.js → qml-k6wTtGG-.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{r-CJrAkc2Z.js → r-Ccjcb2zh.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{razor-DgPUftNd.js → razor-BNhYgSCv.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{regexp-C2hS8XvL.js → regexp-C4LFejPu.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{rst-CDouhKnc.js → rst-DXLxI-UJ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{ruby-CAjKW1uO.js → ruby-BPuL4jDV.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{sas-qAHkHLc1.js → sas-B3Yz8snb.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{scss-Bfx2Ydid.js → scss-B2AJ5vpk.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{shellscript-Bu76R8y2.js → shellscript-zyDexxnC.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{shellsession-BU8BL0oL.js → shellsession-C8b8xluk.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{soy-FRl8ozP-.js → soy-DKWe_XML.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{sql-BacQgsEs.js → sql-uEbz-Epf.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{stata-B9kkG-ET.js → stata-DieRPmHY.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{surrealql-qvETr7iY.js → surrealql-Dbk3Sp1P.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{svelte-B0z1MgHc.js → svelte-CjPbRmkM.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{templ-DTnPshKb.js → templ-Do_f5vc4.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{tex-Cosab9_H.js → tex-UjLP4qUm.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{ts-tags-DNYvLFUH.js → ts-tags-5L2FutA6.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{tsx-Dstq6j1a.js → tsx-B1pNtpUr.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{twig-BzqZdwaX.js → twig-O41Vg_IM.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{typescript-YOQ_oE25.js → typescript-Bj9uwnnJ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{typst-DTffwfpc.js → typst-DsibO7oD.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-D4OMj_C5.js → vue-DPhaEurv.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-html-kT4WrHGK.js → vue-html-DDV9NSy1.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-vine-CxeapeMO.js → vue-vine-Dh4jOifx.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{xml-DWVpuurg.js → xml-DtIulkQk.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{xsl-C0ciup5a.js → xsl-DoWtb58Z.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{yaml-98Fvyfpc.js → yaml-CZC-l1Dg.js} +1 -1
- package/dist/diff_tool/app/dist/index.html +1 -1
- package/dist/history/worker/index.js +87 -83
- package/dist/history/worker/index.js.map +1 -1
- package/dist/host/local_session_host.js +24 -318
- 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 +0 -98
- package/dist/host/session_protocol_handler.js.map +1 -1
- package/dist/main.js +6 -7
- package/dist/main.js.map +1 -1
- package/dist/protocol/index.d.ts +1 -1
- package/dist/protocol/index.js.map +1 -1
- package/dist/protocol/session_protocol.d.ts +3 -28
- package/dist/protocol/session_protocol.js +1 -56
- package/dist/protocol/session_protocol.js.map +1 -1
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/session.js +0 -20
- package/dist/sdk/session.js.map +1 -1
- package/dist/sdk/types.d.ts +1 -7
- package/dist/store/session_snapshot_migrations.js +72 -1
- package/dist/store/session_snapshot_migrations.js.map +1 -1
- package/dist/tui/session_chat_controller.js +14 -30
- package/dist/tui/session_chat_controller.js.map +1 -1
- package/dist/tui/ui/footer.js +4 -9
- package/dist/tui/ui/footer.js.map +1 -1
- package/package.json +9 -9
- package/dist/core/session/goal.js +0 -54
- package/dist/core/session/goal.js.map +0 -1
- package/dist/core/tools/goal.js +0 -167
- package/dist/core/tools/goal.js.map +0 -1
- package/dist/diff_tool/app/dist/assets/index-CBT_sNIz.js +0 -340
- package/dist/nook/README.md +0 -123
|
@@ -1,54 +1,54 @@
|
|
|
1
1
|
# Security
|
|
2
2
|
|
|
3
|
-
Tau gives an agent real tools
|
|
3
|
+
Tau gives an agent real tools that change files, run processes, and call configured services. A tool runs as soon as the model calls it. Tau adds no confirmation dialog, no restriction to the repository, and no general sandbox.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
So before starting a session, decide which machine the agent may change, which credentials that machine may hold, and which project content you trust. The [ownership and scope](ownership-and-scope.md) page defines the client, host, execution environment, and Telegram runner used below.
|
|
6
6
|
|
|
7
7
|
## Direct execution and operating-system authority
|
|
8
8
|
|
|
9
|
-
Host tools such as `bash`, `write`, and `edit` act
|
|
9
|
+
Host tools such as `bash`, `write`, and `edit` act in the session's execution environment. They have that environment's operating-system permissions and are not limited to the repository. Absolute paths work wherever the operating system allows. Changes to files and processes remain even if the tool output is truncated, the turn is interrupted, or the model request fails.
|
|
10
10
|
|
|
11
|
-
Client tools
|
|
11
|
+
Client tools have separate permissions. A command client tool runs as the client's user, with the client process's current directory and environment. It can also ask to run commands in the execution environment. In a remote session, one turn can therefore act with the permissions of two different machines.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Give each part only the access it needs:
|
|
14
14
|
|
|
15
15
|
- Run Tau and its execution environment as a dedicated, unprivileged user when the workspace does not need access to a personal home directory.
|
|
16
|
-
- Use a container, virtual machine, or
|
|
16
|
+
- Use a container, virtual machine, or separate hosted environment when work should be isolated from the host. Tau respects that isolation, but not every execution environment type is a security sandbox.
|
|
17
17
|
- Mount or copy only the repositories and files the task needs. Do not point an execution environment at a broad home directory for convenience.
|
|
18
18
|
- Give the host only the provider and service credentials needed for its sessions. Give client-tool processes only the client-local credentials they need.
|
|
19
|
-
- Use a persona with a
|
|
19
|
+
- Use a persona with a shorter `tools` list for work that should not change files or call external services. The built-in `tau_docs` tool is always available regardless of that list.
|
|
20
20
|
|
|
21
|
-
Interruption, timeouts, output limits, and process-group termination
|
|
21
|
+
Interruption, timeouts, output limits, and process-group termination limit how long and how much a command runs. They do not ask for approval and cannot undo anything already done. Review destructive commands, and use Tau's normal session operations instead of asking an agent to change Tau's internal files.
|
|
22
22
|
|
|
23
23
|
## Treat project content as executable policy
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Tau loads more than source files from the execution environment. It reads project `.tau/config.json`, personas, prompts, skills, `.agents/skills`, and `AGENTS.md` from the working directory and its parents. This content can choose models and tools, add instructions, define workflows, and change which of your global client tools are offered.
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
Trusting a repository therefore means trusting this content. Before using a repository with valuable credentials or write access, read its `.tau/`, `.agents/`, and `AGENTS.md` content, including nested levels. Look especially at:
|
|
28
28
|
|
|
29
29
|
- persona system prompts, tool lists, and model launch allowlists;
|
|
30
30
|
- skill instructions and any scripts they direct the agent to run;
|
|
31
|
-
- project configuration that
|
|
32
|
-
- `enabledClientTools`, which can
|
|
31
|
+
- project configuration that sets Nook targets, model notices, or hosted-environment connections;
|
|
32
|
+
- `enabledClientTools`, which can turn on commands from your global configuration; and
|
|
33
33
|
- provision scripts or other repository automation used by integrations such as Telegram.
|
|
34
34
|
|
|
35
|
-
Project configuration cannot define
|
|
35
|
+
Project configuration cannot define client tool commands. It can only select commands defined in global configuration. A repository therefore cannot add a new process to your machine, but a selected command can still do anything it was written to do.
|
|
36
36
|
|
|
37
|
-
`--no-agent-context-files`
|
|
37
|
+
`--no-agent-context-files` turns off `AGENTS.md` loading and the list of nested `AGENTS.md` files. Project configuration, personas, skills, and tools still load. `--no-client-tools` turns off TUI client tools, not host tools. Neither flag is a general safe mode.
|
|
38
38
|
|
|
39
|
-
Prompt templates are inserted into the editor for review
|
|
39
|
+
Prompt templates are inserted into the editor for you to review; they are never sent automatically. Leading `<system>` blocks, persona prompts, model notices, and session messages are sent to the model and may be saved in the session. Never put secrets in instructions, prompts, or model notices.
|
|
40
40
|
|
|
41
41
|
## Trust remote model metadata as routing configuration
|
|
42
42
|
|
|
43
|
-
A
|
|
43
|
+
A Tau host that runs models refreshes compatible provider catalogs from `pi.dev` and caches them in `~/.config/tau/models-store.json`. Treat this like a software update channel. A remote model record can change the model's API adapter, endpoint, headers, compatibility settings, limits, and pricing. If that service were compromised or misconfigured, it could redirect provider requests, along with their credentials. Set `TAU_OFFLINE` to turn off automatic catalog requests.
|
|
44
44
|
|
|
45
45
|
## Keep secrets with the process that needs them
|
|
46
46
|
|
|
47
|
-
Most model and service credentials belong
|
|
47
|
+
Most model and service credentials belong on the host, because the host makes model calls, web searches, history replication, and Nook requests for the session tool. TUI speech credentials and command client tool credentials belong on the client. Telegram bot, transcription, and voice credentials belong to the Telegram runner. Credentials for hosted execution environments belong in the host's startup configuration.
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
When attached to a remote host, a credential exported on the laptop does not reach the host. Putting a host credential into the execution environment's shell would needlessly expose it to every process there. See [credentials](credentials.md) for which source wins.
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
For personal secrets, prefer host environment variables or global configuration over project files. Some integrations accept a field that names an environment variable, which keeps the secret out of JSON. Telegram stores each bot token in the runner's configuration file, so protect that file like any other secret.
|
|
52
52
|
|
|
53
53
|
Never put credentials in:
|
|
54
54
|
|
|
@@ -58,35 +58,35 @@ Never put credentials in:
|
|
|
58
58
|
- tool results, session messages, issue comments, or debug output; or
|
|
59
59
|
- Nook static assets or browser KV.
|
|
60
60
|
|
|
61
|
-
Do not
|
|
61
|
+
Do not debug authentication by printing an environment, a configuration file, `auth.json`, or a service response that includes headers. Check that the expected source is set up for the right process, then run a small operation that uses it. `tau auth list` shows Codex account identities and status without showing tokens.
|
|
62
62
|
|
|
63
|
-
If a credential appears in a session, log, shell history, repository, Nook deployment, Telegram message, or
|
|
63
|
+
If a credential appears in a session, log, shell history, repository, Nook deployment, Telegram message, or history, treat it as exposed. First revoke or rotate it at the provider. Then replace the stored value through configuration or the auth command, restart the process that uses it if needed, and delete the exposed copy where retention rules allow. Redacting the copy does not replace rotation.
|
|
64
64
|
|
|
65
65
|
## Understand environment sanitization
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
Commands in a local execution environment start from a filtered copy of the Tau process environment. Tau removes inherited variables whose names end in `_KEY`, `_SECRET`, `_TOKEN`, or `_PASSWORD`, and the exact name `API_KEY`. This reduces accidental leaks from a local host into the agent's Bash commands.
|
|
68
68
|
|
|
69
|
-
The filter
|
|
69
|
+
The filter has clear limits:
|
|
70
70
|
|
|
71
71
|
- It is name-based, so a secret under another name is not recognized.
|
|
72
|
-
-
|
|
73
|
-
- Hosted execution
|
|
72
|
+
- Variables set explicitly for the execution environment are applied after filtering and can add a secret back.
|
|
73
|
+
- Hosted execution environments start from their own environment.
|
|
74
74
|
- Command client tools inherit the client process environment unchanged.
|
|
75
|
-
-
|
|
75
|
+
- Tau's own model and service code on the host uses the host credentials it needs.
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
The filter is neither a secret store nor an access control. Avoid printing whole environments, and keep secrets out of every process that does not need them.
|
|
78
78
|
|
|
79
79
|
## Keep login shells automation-safe
|
|
80
80
|
|
|
81
|
-
Tau command
|
|
81
|
+
Tau runs each command in a fresh non-interactive login Bash. The execution environment's `HOME` decides which startup files are read. Bash can read `/etc/profile`, the first user login file it finds, and `BASH_ENV`, and a login file may also source `.bashrc`.
|
|
82
82
|
|
|
83
|
-
These files
|
|
83
|
+
These files run with the same permissions as every tool command. A compromised or careless startup file can change `PATH`, run commands, leak data, exit the shell, or print unexpected output. Review the startup files in each execution environment, especially ones created from shared images or existing user homes.
|
|
84
84
|
|
|
85
|
-
Startup files must not print banners, prompt
|
|
85
|
+
Startup files must not print banners, prompt, read stdin, require a TTY, open an editor, or exit the shell. Tau does not suppress their output. There is no TTY and the agent's Bash calls have no stdin, so interactive logins and terminal prompts fail or hang until the timeout. Set up Git, SSH, package managers, and cloud CLIs to work without prompts.
|
|
86
86
|
|
|
87
87
|
## Trust command client tools as local programs
|
|
88
88
|
|
|
89
|
-
Command client tools are defined only in
|
|
89
|
+
Command client tools are defined only in your global configuration, and projects can only select them. Tau starts the executable directly, without a shell, and validates the model's arguments against the configured schema. The command still runs as trusted local code, with the client's full environment and file permissions.
|
|
90
90
|
|
|
91
91
|
Before enabling one:
|
|
92
92
|
|
|
@@ -95,98 +95,98 @@ Before enabling one:
|
|
|
95
95
|
3. Avoid building shell source from model-provided strings. Prefer fixed commands and argument arrays.
|
|
96
96
|
4. Honor cancellation and set a bounded execution timeout.
|
|
97
97
|
5. Return only the data the model needs, with diagnostics on stderr.
|
|
98
|
-
6.
|
|
98
|
+
6. Run commands in the execution environment only for work that really belongs on the session machine.
|
|
99
99
|
|
|
100
|
-
A project `enabledClientTools`
|
|
100
|
+
A project's `enabledClientTools` can only select definitions you already trust globally. Unknown names are ignored without an error, so check which tools are actually offered after a change. Start an untrusted project with `--no-client-tools` until you have reviewed its selection.
|
|
101
101
|
|
|
102
|
-
The TUI's built-in diff review tool
|
|
102
|
+
The TUI's built-in diff review tool also runs as a process on the client machine.
|
|
103
103
|
|
|
104
104
|
## Use code mode as a capability boundary
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
JavaScript written by the model for `code` and code-mode client tools runs in a restricted sandbox. It receives only the declared capabilities, `docs`, `printText`, the async `printImage`, the `truncate` and `truncateLines` helpers, the real `Date`, and `Math.random()`. It has no imports, processes, environment variables, credentials, timers, fetch, files, or network access of its own. When Bash is selected, `tau.bash` runs commands with the same permissions as the Bash tool, and the sandbox does not limit what those commands do.
|
|
107
107
|
|
|
108
|
-
API
|
|
108
|
+
The API behind each capability runs outside the sandbox, with whatever access the tool gives it. The sandbox limits the model's code to the declared capabilities, but a capability that is too powerful is still dangerous. Tool authors should validate every argument, offer narrow operations, keep credentials outside the sandbox, honor cancellation, and never return secrets.
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
`tau.models` sends only the inputs given in each request to OpenRouter. File attachments are read from the session machine, and inline media is checked against its bytes. Provider credentials stay outside the sandbox. Reported model costs are recorded even if the program fails later.
|
|
111
111
|
|
|
112
|
-
The `history`
|
|
112
|
+
The `history` API is read-only, but it can see transcripts from every repository and execution environment in the configured collection. The agent uses it only when the user or active instructions directly ask. That rule is no substitute for access control on the history service.
|
|
113
113
|
|
|
114
114
|
## Trust MCP servers
|
|
115
115
|
|
|
116
|
-
MCP
|
|
116
|
+
MCP servers come from the global and project configuration of the directory where the host was launched. Launching a host inside a repository lets that repository's configuration start commands on the host and use host credentials, with no approval step. MCP is available to every session on that host whose persona allows `mcp`, and to their subagents. It is not separated per repository or client. Configuration in a session's execution environment cannot add servers.
|
|
117
117
|
|
|
118
|
-
A stdio MCP server is trusted host
|
|
118
|
+
A stdio MCP server is trusted code on the host. It runs outside the code-mode sandbox with the host account's file and process permissions and its full environment, including credentials. Review the executable and arguments before configuring a server. HTTP servers receive the configured headers and the arguments sent to their tools. Use HTTPS for remote servers and give them only the access they need.
|
|
119
119
|
|
|
120
|
-
MCP
|
|
120
|
+
MCP has no confirmation step. Tools can change external systems or host resources immediately. Interrupting a call cannot undo what already happened, and when the outcome is unknown, retrying a change is not safe. Treat server descriptions, instructions, annotations, and results as untrusted data. Annotations such as `readOnlyHint` are not enforced.
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
How a stdio server shuts down depends on the MCP transport. Child processes that ignore `SIGTERM` can outlive the server, so do not rely on shutdown to stop untrusted server processes.
|
|
123
123
|
|
|
124
|
-
The execution environment does not
|
|
124
|
+
The execution environment does not contain an MCP server that runs on the host. A server that exposes host files or commands gives the agent access to the host, even when Bash runs in a remote sandbox. If that access is not acceptable, remove `mcp` from the persona or disable the server. Connections and credentials stay outside the model's JavaScript, but the server decides what its tools return.
|
|
125
125
|
|
|
126
126
|
## Protect remote session transports
|
|
127
127
|
|
|
128
|
-
`tau serve`
|
|
128
|
+
`tau serve` listens on loopback by default. Keep it that way unless you need remote network access. Without `--auth-token` or `TAU_WS_AUTH_TOKEN`, the WebSocket server has no authentication, and any client that connects can observe and change hosted sessions.
|
|
129
129
|
|
|
130
|
-
The
|
|
130
|
+
The token gives full access to all sessions. Tau sends it in the WebSocket URL as the `tau_token` query parameter. Use a strong random value, avoid typing it on command lines that end up in shell history, and make sure reverse proxies and access logs do not record it.
|
|
131
131
|
|
|
132
|
-
Tau
|
|
132
|
+
Tau serves plain WebSocket and has no TLS settings. Across an untrusted network, use one of these setups:
|
|
133
133
|
|
|
134
134
|
- bind Tau to loopback and forward it through SSH;
|
|
135
135
|
- place it behind a trusted TLS reverse proxy and connect with `wss://`; or
|
|
136
136
|
- keep it on a private network whose access controls and confidentiality are understood.
|
|
137
137
|
|
|
138
|
-
A reverse proxy must
|
|
138
|
+
A reverse proxy must pass through the WebSocket upgrade and the query string, and keep both protected. Limit who can reach the server even when a token is set. Every attached client has full control: it can submit, steer, interrupt, rewind, and offer client tools. See [remote sessions](remote-sessions.md).
|
|
139
139
|
|
|
140
140
|
## Secure Telegram access and workspaces
|
|
141
141
|
|
|
142
|
-
A Telegram runner is both a network
|
|
142
|
+
A Telegram runner is both a client exposed to the network and a local Tau host. Its bot configuration decides who can start turns that run tools in the configured workspaces.
|
|
143
143
|
|
|
144
|
-
Set `allowedUserIds` for
|
|
144
|
+
Set `allowedUserIds` for allowed senders and `allowedChatIds` for allowed chats. Without `allowedUserIds`, any user can message the bot in a private chat, and without `allowedChatIds`, any private chat is allowed. Group chats are ignored unless their chat id is in `allowedChatIds`, and a group turn starts only when the bot is mentioned. Messages, attachments, audio transcripts, and errors from an allowed group can become context for a later turn, so group membership and history are part of what you trust.
|
|
145
145
|
|
|
146
|
-
Each bot's `allowedProjectIds` should
|
|
146
|
+
Each bot's `allowedProjectIds` should list only the intended projects. Telegram sessions are separate per bot and chat, but a persistent-directory project uses the same directory for all of its sessions. Work in one session is visible to later sessions and to other allowed chats that select the same project. Never use a personal home, a credential directory, or an unrelated shared directory as a persistent project.
|
|
147
147
|
|
|
148
|
-
Repository and composite projects use managed workspaces and persistent bare caches. New or reconstructed repositories may
|
|
148
|
+
Repository and composite projects use managed workspaces and persistent bare repository caches. New or reconstructed repositories may run an executable `.tau/scripts/provision` in the background. Review that script like any other trusted project automation. Persistent-directory projects are never provisioned and never deleted by Tau.
|
|
149
149
|
|
|
150
|
-
Protect the runner configuration,
|
|
150
|
+
Protect the runner configuration, session state, project-preference state, managed workspace root, and temporary attachment storage with a suitable OS account and file permissions. Never run two Telegram runners on the same state. Operational details are in [Telegram](telegram.md) and [Telegram projects and workspaces](telegram-projects.md).
|
|
151
151
|
|
|
152
152
|
## Know what history retains
|
|
153
153
|
|
|
154
|
-
Tau
|
|
154
|
+
Tau keeps a flat transcript history in the host user's home, separate from saved sessions. It contains user messages, intermediate system instructions, assistant text, and completed tool calls. The initial persona prompt is not included. Compaction does not remove entries. Rewind removes entries after the rewind point. Apart from that, entries stay; history is not a temporary cache.
|
|
155
155
|
|
|
156
|
-
Without remote history
|
|
156
|
+
Without remote history, it stays in a SQLite database on the host. The `tau.history` capability can search all of it, within the persona's tools and the agent's usage rules. Protect the host account and database as you would the transcripts themselves.
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
With global `history` configuration, entries are still written to local SQLite first, and a persistent outbox copies them to the configured service in the background. Remote entries are limited in size, with large content truncated in the middle, but they can still contain source code, tool output, instructions, and personal data. The service also summarizes transcript content with its configured Cloudflare AI service.
|
|
159
159
|
|
|
160
|
-
Before
|
|
160
|
+
Before turning on remote history, confirm who runs the service, its retention policy and region, who holds access keys, and which projects may be sent. One service key can search the whole shared collection. Rotate it if exposed. Removing the configuration does not delete data that was already copied. See [history](history.md) for storage and service behavior.
|
|
161
161
|
|
|
162
162
|
## Treat Nook output as published content
|
|
163
163
|
|
|
164
|
-
Nook deploys static files to
|
|
164
|
+
Nook deploys static files to HTTPS URLs. Deployments are private by default, and `--public` makes a site's files reachable by anyone. Review the built output, not just the source, before deploying. Static files must never contain provider keys, source maps with secrets, private configuration, or data that should stay on the execution environment.
|
|
165
165
|
|
|
166
|
-
Each site has
|
|
166
|
+
Each site has a JSON KV store for the browser that survives redeploys. On a public site, anyone can read and write it. On a private site, it requires a Cloudflare Access identity, but it is still application data that every allowed user and the site's code can read. It is not a place for credentials.
|
|
167
167
|
|
|
168
|
-
Cloudflare Access should protect only the
|
|
168
|
+
Cloudflare Access should protect only the `/__nook/*` control plane at the root. Public site paths must stay reachable without Access, while private sites sign in through `/__nook/auth`. The Nook Worker validates Access JWTs; service-token headers only get a request past Access. Follow the exact Access application, audience, cookie, and service token setup in [Nook](nook.md).
|
|
169
169
|
|
|
170
|
-
The
|
|
170
|
+
The Nook session tool and the `tau nook` CLI can deploy, delete, copy, and change KV without asking for confirmation. The model's JavaScript never receives Access credentials, but Tau uses them for the Nook API calls the program makes.
|
|
171
171
|
|
|
172
172
|
## Edit configuration without widening authority accidentally
|
|
173
173
|
|
|
174
|
-
|
|
174
|
+
A configuration change can redirect network traffic, expose tools, or send credentials somewhere new. Follow these steps:
|
|
175
175
|
|
|
176
|
-
1.
|
|
177
|
-
2. Read the
|
|
178
|
-
3.
|
|
179
|
-
4. Back up only the
|
|
180
|
-
5. Make the smallest edit at the narrowest
|
|
181
|
-
6. Validate JSON or frontmatter without printing the whole file into a shared transcript.
|
|
182
|
-
7. For a local startup,
|
|
183
|
-
8.
|
|
176
|
+
1. Find out what reads the setting, and its machine, `cwd`, home, and Tau version.
|
|
177
|
+
2. Read the field's entry in [configuration](configuration.md) and the [configuration reference](config-reference.md).
|
|
178
|
+
3. Check nearer configuration levels that may replace or merge the field.
|
|
179
|
+
4. Back up only the file you are changing, with permissions no broader than the original.
|
|
180
|
+
5. Make the smallest edit at the narrowest level that works. Keep secrets out of project files.
|
|
181
|
+
6. Validate the JSON or frontmatter without printing the whole file into a shared transcript.
|
|
182
|
+
7. For a local startup, run `tau --debug` from the relevant directory, if its prompt output can stay private. For a running session, run `/reload` while idle and read every warning.
|
|
183
|
+
8. If the setting is read at startup, restart the client, host, or runner. Test one small operation before continuing.
|
|
184
184
|
|
|
185
|
-
Unknown
|
|
185
|
+
Unknown fields are removed without a warning, so valid JSON can still have no effect. An invalid nearer value may be skipped, leaving a broader value in effect. Check the behavior instead of assuming your edit applied.
|
|
186
186
|
|
|
187
187
|
## Do not edit durable internals
|
|
188
188
|
|
|
189
|
-
Tau's
|
|
189
|
+
Tau's internal files hold the state it needs to recover. They are not configuration. Do not edit or casually delete:
|
|
190
190
|
|
|
191
191
|
- `~/.config/tau/auth.json`;
|
|
192
192
|
- `~/.config/tau/models-store.json`;
|
|
@@ -197,4 +197,4 @@ Tau's durable files are implementation-owned recovery state, not configuration s
|
|
|
197
197
|
- code-mode or compaction temporary files as if they were durable state; or
|
|
198
198
|
- Nook R2 or Durable Object records outside supported Nook operations.
|
|
199
199
|
|
|
200
|
-
Use `tau auth` for Codex accounts, session protocol
|
|
200
|
+
Use `tau auth` for Codex accounts, TUI or session protocol operations for sessions, configuration for behavior, and the documented commands for history and Nook. If recovery reports corruption, keep the original data, stop any other process writing to it, write down the exact error and Tau version, and investigate through normal recovery before trying any repair that deletes data.
|