@markusylisiurunen/tau 0.3.82 → 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.
Files changed (147) hide show
  1. package/README.md +1 -3
  2. package/dist/core/agent/agent_runtime.js +6 -4
  3. package/dist/core/agent/agent_runtime.js.map +1 -1
  4. package/dist/core/cli.js +2 -2
  5. package/dist/core/cli.js.map +1 -1
  6. package/dist/core/code_mode/models.js +61 -22
  7. package/dist/core/code_mode/models.js.map +1 -1
  8. package/dist/core/history/cli.js +48 -0
  9. package/dist/core/history/cli.js.map +1 -1
  10. package/dist/core/history/history_manager.js +9 -3
  11. package/dist/core/history/history_manager.js.map +1 -1
  12. package/dist/core/history/local_history_store.js +9 -2
  13. package/dist/core/history/local_history_store.js.map +1 -1
  14. package/dist/core/history/remote_history_client.js +18 -3
  15. package/dist/core/history/remote_history_client.js.map +1 -1
  16. package/dist/core/models/openrouter.js +17 -5
  17. package/dist/core/models/openrouter.js.map +1 -1
  18. package/dist/core/models/openrouter_decisions.js +16 -1
  19. package/dist/core/models/openrouter_decisions.js.map +1 -1
  20. package/dist/core/static/tau_docs/client-tools.md +53 -53
  21. package/dist/core/static/tau_docs/config-reference.md +46 -43
  22. package/dist/core/static/tau_docs/configuration.md +40 -36
  23. package/dist/core/static/tau_docs/credentials.md +32 -31
  24. package/dist/core/static/tau_docs/getting-started.md +28 -28
  25. package/dist/core/static/tau_docs/history.md +114 -79
  26. package/dist/core/static/tau_docs/image-generation.md +20 -18
  27. package/dist/core/static/tau_docs/index.md +30 -31
  28. package/dist/core/static/tau_docs/manifest.json +1 -0
  29. package/dist/core/static/tau_docs/models.md +17 -17
  30. package/dist/core/static/tau_docs/node-sdk.md +69 -69
  31. package/dist/core/static/tau_docs/nook.md +75 -69
  32. package/dist/core/static/tau_docs/openrouter.md +28 -13
  33. package/dist/core/static/tau_docs/ownership-and-scope.md +21 -23
  34. package/dist/core/static/tau_docs/pdf-unpacking.md +6 -6
  35. package/dist/core/static/tau_docs/personas.md +29 -27
  36. package/dist/core/static/tau_docs/prompts-and-project-context.md +41 -39
  37. package/dist/core/static/tau_docs/remote-sessions.md +38 -38
  38. package/dist/core/static/tau_docs/sdk-diff-review.md +16 -12
  39. package/dist/core/static/tau_docs/security.md +72 -72
  40. package/dist/core/static/tau_docs/session-protocol-methods.md +45 -45
  41. package/dist/core/static/tau_docs/session-protocol.md +43 -43
  42. package/dist/core/static/tau_docs/sessions.md +99 -88
  43. package/dist/core/static/tau_docs/skills.md +25 -20
  44. package/dist/core/static/tau_docs/speech-generation.md +5 -5
  45. package/dist/core/static/tau_docs/subagents.md +42 -44
  46. package/dist/core/static/tau_docs/telegram-projects.md +142 -0
  47. package/dist/core/static/tau_docs/telegram.md +64 -181
  48. package/dist/core/static/tau_docs/tools.md +72 -80
  49. package/dist/core/static/tau_docs/troubleshooting.md +94 -149
  50. package/dist/core/static/tau_docs/tui.md +124 -80
  51. package/dist/core/tool/image_generate.js +5 -17
  52. package/dist/core/tool/image_generate.js.map +1 -1
  53. package/dist/core/tool/openrouter.js +21 -2
  54. package/dist/core/tool/openrouter.js.map +1 -1
  55. package/dist/core/utils/gemini_transcription.js +43 -13
  56. package/dist/core/utils/gemini_transcription.js.map +1 -1
  57. package/dist/core/utils/model_stream.js +17 -1
  58. package/dist/core/utils/model_stream.js.map +1 -1
  59. package/dist/core/version.js +2 -2
  60. package/dist/diff_tool/app/dist/assets/{angular-html-D20byCHL.js → angular-html-x29PkEoY.js} +1 -1
  61. package/dist/diff_tool/app/dist/assets/{angular-ts-CvVQslm2.js → angular-ts-CsWCqoCf.js} +1 -1
  62. package/dist/diff_tool/app/dist/assets/{apl-DNIxlYWe.js → apl-CEvdc7jl.js} +1 -1
  63. package/dist/diff_tool/app/dist/assets/{astro-DDOw4EUG.js → astro-Cgi6YxH2.js} +1 -1
  64. package/dist/diff_tool/app/dist/assets/{blade-DlhB-SLW.js → blade-B0pr7Zx6.js} +1 -1
  65. package/dist/diff_tool/app/dist/assets/{c-C1f4vhDm.js → c-DDVLgtVy.js} +1 -1
  66. package/dist/diff_tool/app/dist/assets/{chapel-Ctt8xOX1.js → chapel-Bk9M7Jej.js} +1 -1
  67. package/dist/diff_tool/app/dist/assets/{cobol-BXw71PAA.js → cobol-DyEvnPuC.js} +1 -1
  68. package/dist/diff_tool/app/dist/assets/{coffee-CRh_5Nmr.js → coffee-Di2-m3Jq.js} +1 -1
  69. package/dist/diff_tool/app/dist/assets/{cpp-IlI-zWOZ.js → cpp-CWpAaUgO.js} +1 -1
  70. package/dist/diff_tool/app/dist/assets/{crystal-CXeL28i7.js → crystal-CUker9Zt.js} +1 -1
  71. package/dist/diff_tool/app/dist/assets/{css-BfST9hFI.js → css-D4XpBIiJ.js} +1 -1
  72. package/dist/diff_tool/app/dist/assets/{edge--Q22k_ty.js → edge-CVxhhF7L.js} +1 -1
  73. package/dist/diff_tool/app/dist/assets/{elixir-CIfC_rQx.js → elixir-B_FS9APl.js} +1 -1
  74. package/dist/diff_tool/app/dist/assets/{elm-OkZ29XRO.js → elm-1KyefTkH.js} +1 -1
  75. package/dist/diff_tool/app/dist/assets/{erb-B8ZXgEqv.js → erb-CCgO9dRW.js} +1 -1
  76. package/dist/diff_tool/app/dist/assets/{git-rebase-CxkO_WGd.js → git-rebase-D0VYo_oY.js} +1 -1
  77. package/dist/diff_tool/app/dist/assets/{glimmer-js-BVadyIrr.js → glimmer-js-Ce07ngjZ.js} +1 -1
  78. package/dist/diff_tool/app/dist/assets/{glimmer-ts-D5J3Qb7n.js → glimmer-ts-BmOM4djO.js} +1 -1
  79. package/dist/diff_tool/app/dist/assets/{glsl-B6iy73-Y.js → glsl-D-jkLYJ8.js} +1 -1
  80. package/dist/diff_tool/app/dist/assets/{graphql-Dc3rUXf5.js → graphql-DZOwJE5e.js} +1 -1
  81. package/dist/diff_tool/app/dist/assets/{hack-q8Utf8Jp.js → hack-Cgvn19h8.js} +1 -1
  82. package/dist/diff_tool/app/dist/assets/{haml-mjMIlj_2.js → haml-JTmDSYQl.js} +1 -1
  83. package/dist/diff_tool/app/dist/assets/{handlebars-CA-BL8Ks.js → handlebars-CChh7Dy5.js} +1 -1
  84. package/dist/diff_tool/app/dist/assets/{html-BmPxhYCX.js → html-BKgzx_cb.js} +1 -1
  85. package/dist/diff_tool/app/dist/assets/{html-derivative-CvknIjuB.js → html-derivative-CdFl0BmX.js} +1 -1
  86. package/dist/diff_tool/app/dist/assets/{http-DNxLDRIi.js → http-DZeL7KvH.js} +1 -1
  87. package/dist/diff_tool/app/dist/assets/{hurl-kbd3Eq2V.js → hurl-CqKevOlQ.js} +1 -1
  88. package/dist/diff_tool/app/dist/assets/index-BXyr8GCM.js +341 -0
  89. package/dist/diff_tool/app/dist/assets/{java-BuZshgf1.js → java-Sq3MCkId.js} +1 -1
  90. package/dist/diff_tool/app/dist/assets/{javascript-DfL2oeFU.js → javascript-CHZB4Nse.js} +1 -1
  91. package/dist/diff_tool/app/dist/assets/{jinja-Bu0KQihU.js → jinja-C4ucJVla.js} +1 -1
  92. package/dist/diff_tool/app/dist/assets/{jison-Bqn7Mf3Q.js → jison-D3mprebA.js} +1 -1
  93. package/dist/diff_tool/app/dist/assets/{json-BuX5LKaB.js → json-DgPfCYJ1.js} +1 -1
  94. package/dist/diff_tool/app/dist/assets/{jsx-DdVJ-ZBp.js → jsx-BG-Tx0cw.js} +1 -1
  95. package/dist/diff_tool/app/dist/assets/{julia-CQeijOoQ.js → julia-B1GnFeUC.js} +1 -1
  96. package/dist/diff_tool/app/dist/assets/{just-vzAktFGR.js → just-_MZzo0MF.js} +1 -1
  97. package/dist/diff_tool/app/dist/assets/{latex-Dm60cg0k.js → latex-DI0kqjQy.js} +1 -1
  98. package/dist/diff_tool/app/dist/assets/{liquid-vxKzm2P8.js → liquid-BtMAPeHl.js} +1 -1
  99. package/dist/diff_tool/app/dist/assets/{lua-DIoqi4dd.js → lua-CFxaP0To.js} +1 -1
  100. package/dist/diff_tool/app/dist/assets/{marko-BTHgFKby.js → marko-BIJocuFI.js} +1 -1
  101. package/dist/diff_tool/app/dist/assets/{mdc-CEfz8gZ9.js → mdc-BAgrdjTH.js} +1 -1
  102. package/dist/diff_tool/app/dist/assets/{nginx-DNlFDEfJ.js → nginx-DE-3CsYn.js} +1 -1
  103. package/dist/diff_tool/app/dist/assets/{nim-DnvT_0lZ.js → nim-DOxeXLhb.js} +1 -1
  104. package/dist/diff_tool/app/dist/assets/{org-BbD-ElVf.js → org-KTfP0tHA.js} +1 -1
  105. package/dist/diff_tool/app/dist/assets/{perl-DTsbnAmK.js → perl-BH-NxpgK.js} +1 -1
  106. package/dist/diff_tool/app/dist/assets/{php-CwEsJe-W.js → php-vuiVEXZK.js} +1 -1
  107. package/dist/diff_tool/app/dist/assets/{pug-BOttMVH-.js → pug-VlIlTMUy.js} +1 -1
  108. package/dist/diff_tool/app/dist/assets/{qml-C8KkSItN.js → qml-k6wTtGG-.js} +1 -1
  109. package/dist/diff_tool/app/dist/assets/{r-K4ksJj_R.js → r-Ccjcb2zh.js} +1 -1
  110. package/dist/diff_tool/app/dist/assets/{razor-yuWRrrG6.js → razor-BNhYgSCv.js} +1 -1
  111. package/dist/diff_tool/app/dist/assets/{regexp-CV-jhnUz.js → regexp-C4LFejPu.js} +1 -1
  112. package/dist/diff_tool/app/dist/assets/{rst-CLA3Attc.js → rst-DXLxI-UJ.js} +1 -1
  113. package/dist/diff_tool/app/dist/assets/{ruby-DiHR2-DX.js → ruby-BPuL4jDV.js} +1 -1
  114. package/dist/diff_tool/app/dist/assets/{sas-DxIjbYJ5.js → sas-B3Yz8snb.js} +1 -1
  115. package/dist/diff_tool/app/dist/assets/{scss-CShwEaV4.js → scss-B2AJ5vpk.js} +1 -1
  116. package/dist/diff_tool/app/dist/assets/{shellscript-CeezOnrF.js → shellscript-zyDexxnC.js} +1 -1
  117. package/dist/diff_tool/app/dist/assets/{shellsession-CjSS2r7j.js → shellsession-C8b8xluk.js} +1 -1
  118. package/dist/diff_tool/app/dist/assets/{soy-CI_v23nJ.js → soy-DKWe_XML.js} +1 -1
  119. package/dist/diff_tool/app/dist/assets/{sql-D9GaB00A.js → sql-uEbz-Epf.js} +1 -1
  120. package/dist/diff_tool/app/dist/assets/{stata-hK92TPE_.js → stata-DieRPmHY.js} +1 -1
  121. package/dist/diff_tool/app/dist/assets/{surrealql-UO8LtPJG.js → surrealql-Dbk3Sp1P.js} +1 -1
  122. package/dist/diff_tool/app/dist/assets/{svelte-kIlaw_oh.js → svelte-CjPbRmkM.js} +1 -1
  123. package/dist/diff_tool/app/dist/assets/{templ-DFRz1JP6.js → templ-Do_f5vc4.js} +1 -1
  124. package/dist/diff_tool/app/dist/assets/{tex-CfxIXk_z.js → tex-UjLP4qUm.js} +1 -1
  125. package/dist/diff_tool/app/dist/assets/{ts-tags-BtUHl0ff.js → ts-tags-5L2FutA6.js} +1 -1
  126. package/dist/diff_tool/app/dist/assets/{tsx-Cd4SAe2C.js → tsx-B1pNtpUr.js} +1 -1
  127. package/dist/diff_tool/app/dist/assets/{twig-CWk4q5Y3.js → twig-O41Vg_IM.js} +1 -1
  128. package/dist/diff_tool/app/dist/assets/{typescript-BqxGJiP0.js → typescript-Bj9uwnnJ.js} +1 -1
  129. package/dist/diff_tool/app/dist/assets/{typst-D9nAun2p.js → typst-DsibO7oD.js} +1 -1
  130. package/dist/diff_tool/app/dist/assets/{vue-D6HYhg6_.js → vue-DPhaEurv.js} +1 -1
  131. package/dist/diff_tool/app/dist/assets/{vue-html-1VRlaENS.js → vue-html-DDV9NSy1.js} +1 -1
  132. package/dist/diff_tool/app/dist/assets/{vue-vine-BaH0We9y.js → vue-vine-Dh4jOifx.js} +1 -1
  133. package/dist/diff_tool/app/dist/assets/{xml-C4RWnUuj.js → xml-DtIulkQk.js} +1 -1
  134. package/dist/diff_tool/app/dist/assets/{xsl-D1iD38ga.js → xsl-DoWtb58Z.js} +1 -1
  135. package/dist/diff_tool/app/dist/assets/{yaml-yAb4W0G-.js → yaml-CZC-l1Dg.js} +1 -1
  136. package/dist/diff_tool/app/dist/index.html +1 -1
  137. package/dist/history/worker/index.js +87 -83
  138. package/dist/history/worker/index.js.map +1 -1
  139. package/dist/main.js +6 -7
  140. package/dist/main.js.map +1 -1
  141. package/dist/tui/session_chat_controller.js +14 -3
  142. package/dist/tui/session_chat_controller.js.map +1 -1
  143. package/dist/tui/ui/footer.js +2 -4
  144. package/dist/tui/ui/footer.js.map +1 -1
  145. package/package.json +9 -9
  146. package/dist/diff_tool/app/dist/assets/index-D8ZI_2RC.js +0 -340
  147. package/dist/nook/README.md +0 -123
@@ -15,24 +15,24 @@ The command requires `pdftoppm` from Poppler on `PATH`. On macOS, install it wit
15
15
 
16
16
  ## Input and examples
17
17
 
18
- Supply one readable local PDF path, resolved from the command's current working directory. Quote paths containing spaces:
18
+ Give one local PDF path, relative to the current directory. Quote paths containing spaces:
19
19
 
20
20
  ```bash
21
21
  tau tool pdf-unpack './docs/design review.pdf'
22
22
  ```
23
23
 
24
- The command uploads the PDF to Mistral for OCR and renders page-image patches locally. Do not use it for a sensitive document unless sending it to Mistral and retaining derived local artifacts are both permitted.
24
+ The command uploads the PDF to Mistral for OCR and renders page images locally. Use it for a sensitive document only if you may send it to Mistral and keep the extracted files locally.
25
25
 
26
26
  ## Outputs and recovery
27
27
 
28
- On success, stdout reports the persistent temporary output directory and a complete artifact list. The directory contains:
28
+ On success, stdout prints the output directory, which is temporary but not deleted automatically, and lists every file. The directory contains:
29
29
 
30
30
  - `document.md`: the complete OCR document with recognized tables inlined.
31
31
  - `pages/page-0001.md` and later numbered files: one Markdown file per PDF page.
32
32
  - `images/page-0001/patch-0001.png` and later numbered patches: images for visual verification.
33
33
 
34
- OCR text can contain recognition mistakes. Embedded visuals that are not represented in Markdown are marked with placeholders pointing to the corresponding page patches. Read `document.md` for the whole document, use `pages/` for page-level work, and inspect `images/` before trusting or correcting uncertain OCR.
34
+ OCR text can contain mistakes. Images and figures that are not captured in Markdown are marked with placeholders that point to the matching page patches. Read `document.md` for the whole document, use `pages/` for page-level work, and inspect `images/` before trusting or correcting uncertain OCR.
35
35
 
36
- The command attempts to delete the remote upload after OCR. A deletion failure is reported in the command output. Successful local artifacts remain on disk for follow-up use; delete them when they are no longer needed. If processing fails, Tau attempts to remove the partial local output directory. The error identifies the failed stage and reports whether partial output was removed or cleanup failed. Partial output is not a complete result. Failures after the OCR request starts warn that another OCR request may incur another charge.
36
+ After OCR, the command tries to delete the uploaded file from Mistral and reports if that fails. The local output stays on disk; delete it when you no longer need it. If processing fails, Tau tries to remove the partial output directory. The error names the step that failed and says whether the partial output was removed. Partial output is never a complete result. If the failure happens after the OCR request started, the error warns that running the command again may be charged again.
37
37
 
38
- See [command-line tools](tools.md) for command discovery and execution ownership.
38
+ See [command-line tools](tools.md) for the other tools and where commands run.
@@ -1,12 +1,12 @@
1
1
  # Personas
2
2
 
3
- A persona is Tau's complete model-facing working profile. It chooses a provider and model, supplies the base system prompt, sets reasoning and service behavior, and selects tools. Changing persona changes how future turns run without creating a new session.
3
+ A persona defines how the agent works. It chooses a provider and model, supplies the base system prompt, sets reasoning and service tier, and selects tools. Switching persona changes how later turns run, in the same session.
4
4
 
5
- Tau ships generated built-in personas and discovers custom persona Markdown from the execution environment. The effective list is version-specific and scope-specific, so inspect the current catalog rather than relying on a memorized list of names.
5
+ Tau ships built-in personas and loads custom persona files from the execution environment. The available list depends on the Tau version and on where the session runs, so check the current list instead of relying on remembered names.
6
6
 
7
7
  ## Built-in and effective personas
8
8
 
9
- Built-in personas are generated from Tau's current model catalog. Most model families have separate chat and coder variants; some families expose only the variants Tau supports. Built-ins carry Tau-maintained prompts, defaults, tool selections and subagent supervision tools.
9
+ Built-in personas are generated from Tau's current model catalog. Most model families have separate chat and coder variants, and some have only the variants Tau supports. Built-ins come with Tau's own prompts, defaults, tool selections, and subagent tools.
10
10
 
11
11
  The Opus 5.5 chat and coder personas are available only when `anthropic/claude-opus-5-5` is present in the effective model catalog. The Sonnet 5.5 variants (`sonnet-5.5-chat` and `sonnet-5.5-coder`) likewise require `anthropic/claude-sonnet-5-5`.
12
12
 
@@ -16,18 +16,18 @@ All built-in personas default to medium reasoning. The startup default is `sonne
16
16
 
17
17
  After a remote catalog refresh, `/reload` adopts the updated catalog for an existing session.
18
18
 
19
- Built-in personas are always included in the catalog. Custom personas can replace a built-in by using the same ID.
19
+ Built-in personas are always included. A custom persona replaces a built-in by using the same ID.
20
20
 
21
- Use one of these to inspect the current effective list:
21
+ To see the current list:
22
22
 
23
23
  ```sh
24
24
  tau --help
25
25
  tau --debug
26
26
  ```
27
27
 
28
- `tau --debug` also prints full effective prompts and project context. Use it only where that output is appropriate.
28
+ `tau --debug` also prints the full prompts and project context, so be careful where you share its output.
29
29
 
30
- If no personas remain, session creation fails. Reload also fails rather than leaving a running session without a persona.
30
+ If no personas are left, session creation fails. Reload also fails, so a running session never ends up without a persona.
31
31
 
32
32
  ## Discovery and precedence
33
33
 
@@ -36,15 +36,15 @@ Custom persona files are loaded from:
36
36
  - `~/.config/tau/personas/<id>.md` when the session `cwd` is inside the execution environment's home;
37
37
  - every ancestor `.tau/personas/<id>.md` from the broadest project level to the nearest.
38
38
 
39
- Personas are keyed case-insensitively for overlay precedence. Built-ins form the base, global custom personas override them, and the nearest project definition wins. The `id` inside each file must still exactly match its case-sensitive filename without `.md`.
39
+ Built-ins come first, global custom personas override them, and the nearest project definition wins. IDs are compared case-insensitively when deciding which definition overrides which. The `id` inside a file must still match its filename without `.md` exactly, including case.
40
40
 
41
41
  For a session in `~/code/ledger/apps/api`, a project file at `~/code/ledger/apps/.tau/personas/release-coder.md` overrides the same ID from `~/code/ledger/.tau/personas/` or `~/.config/tau/personas/`.
42
42
 
43
- These locations belong to the execution environment. An attached TUI does not contribute persona files to a remote session. See [configuration](configuration.md) and [ownership and scope](ownership-and-scope.md).
43
+ These locations are on the execution environment. An attached TUI does not add persona files to a remote session. See [configuration](configuration.md) and [ownership and scope](ownership-and-scope.md).
44
44
 
45
45
  ## Persona file contract
46
46
 
47
- A persona is Markdown with YAML frontmatter. `id`, `provider`, and `model` are required. A non-empty Markdown body is required and supplies the persona's own base system prompt.
47
+ A persona is a Markdown file with YAML frontmatter. `id`, `provider`, and `model` are required. The Markdown body is required, must not be empty, and becomes the persona's base system prompt.
48
48
 
49
49
  ```markdown
50
50
  ---
@@ -70,7 +70,7 @@ tools:
70
70
  Work as a release engineer. Inspect repository policy before changing release state.
71
71
  ```
72
72
 
73
- The frontmatter must be a YAML object between valid delimiters. Unknown fields are discarded.
73
+ The frontmatter must be a YAML object between `---` lines. Unknown fields are ignored.
74
74
 
75
75
  ### Required fields
76
76
 
@@ -78,9 +78,9 @@ The frontmatter must be a YAML object between valid delimiters. Unknown fields a
78
78
  | --- | --- |
79
79
  | `id` | Non-empty persona ID. It must exactly match the filename without `.md`. |
80
80
  | `provider` | Non-empty provider ID from the installed [model catalog](models.md). |
81
- | `model` | Non-empty model ID for that provider. The ID may be unbundled when the provider is known. |
81
+ | `model` | Non-empty model ID for that provider. It may be an ID missing from the catalog, as long as the provider is known. |
82
82
 
83
- Each custom persona is self-contained: it supplies its provider, model, prompt, and optional settings.
83
+ Each custom persona is complete on its own. It does not inherit a provider, model, prompt, or settings from another persona.
84
84
 
85
85
  ### Optional fields
86
86
 
@@ -89,18 +89,20 @@ Each custom persona is self-contained: it supplies its provider, model, prompt,
89
89
  | `label` | Display label. A blank or omitted label falls back to `custom`. |
90
90
  | `description` | Short catalog description. |
91
91
  | `reasoning` | Default effort: `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, or `max`. |
92
- | `serviceTier` | `priority` or `flex`. Currently meaningful for `openai` and `openai-codex`. |
92
+ | `serviceTier` | `priority` or `flex`. Used only by `openai` and `openai-codex`. |
93
93
  | `allowedReasoningLevels` | Array of reasoning efforts offered by the TUI selector. |
94
- | `tools` | Explicit list of persona-controlled tools. |
94
+ | `tools` | List of persona-selectable tools. |
95
95
 
96
- Every persona exposes all discovered skills. If a custom persona omits `tools`, Tau enables the ordinary host tools plus subagent supervision tools. An explicit `tools` list without `spawn_agent` prevents subagent launches. See [skills](skills.md) and [subagents](subagents.md) for those contracts.
96
+ Every persona can use all discovered skills. If a custom persona omits `tools`, Tau enables the standard tools and the subagent tools. A `tools` list without `spawn_agent` prevents the agent from starting subagents. See [skills](skills.md) and [subagents](subagents.md) for those contracts.
97
97
 
98
- The persona-controlled tool names are:
98
+ The selectable tool names are:
99
99
 
100
100
  - `bash`, `write`, `edit`, `view_image`, `web`, `nook`, `history`, `mcp`, and `models`;
101
101
  - `spawn_agent`, `send_input_to_agent`, `wait_for_agents`, `list_agents`, and `interrupt_agent`.
102
102
 
103
- The service selectors enable capabilities within `code`; `bash` also enables `tau.bash`. The `code` tool is assembled automatically from selected eligible capabilities. An explicit `tools` array replaces defaults. Names are normalized to lowercase, duplicates are removed, and unknown names reject the persona. `tools: []` leaves the persona without these persona-controlled tools. Intrinsic `tau_docs` is supplied independently of this list. Listing `nook` does not make it usable without effective Nook configuration. Listing `mcp` requires enabled MCP servers configured on the host. [Tools](tools.md) explains eligibility and ownership.
103
+ Names such as `web`, `nook`, `history`, `mcp`, and `models` enable capabilities inside the `code` tool, and `bash` also enables `tau.bash`. Tau builds the `code` tool from whichever of these capabilities are selected and usable.
104
+
105
+ A `tools` list replaces the defaults. Names are lowercased and duplicates removed. An unknown name makes the persona invalid. `tools: []` gives the persona none of these tools. The built-in `tau_docs` tool is always available, independent of this list. `nook` works only when Nook is configured, and `mcp` only when the host has enabled MCP servers. [Tools](tools.md) explains eligibility and ownership.
104
106
 
105
107
  ## Selecting a persona
106
108
 
@@ -112,7 +114,7 @@ The service selectors enable capabilities within `code`; `bash` also enables `ta
112
114
  }
113
115
  ```
114
116
 
115
- The most specific configured `defaultPersona` wins. Startup references are exact and case-sensitive. An unknown configured default produces a warning and Tau falls back to the first effective persona.
117
+ The most specific `defaultPersona` wins. The ID must match exactly, including case. An unknown default produces a warning, and Tau uses the first available persona.
116
118
 
117
119
  Override the default for one TUI launch:
118
120
 
@@ -128,25 +130,25 @@ Inside the TUI, switch while idle with:
128
130
  /persona:release-coder
129
131
  ```
130
132
 
131
- The TUI resolves that command against the session catalog case-insensitively. `Ctrl+P` cycles effective personas. A persona switch reloads runtime content from the execution environment, selects the requested definition, rebuilds project and skill context, updates the tool registry, and persists the new session settings. The TUI refuses to switch while a turn is running.
133
+ This command matches the ID case-insensitively. `Ctrl+P` cycles through the available personas. A switch reloads configuration and content from the execution environment, applies the new persona, rebuilds project and skill context and the tool set, and saves the new session settings. The TUI refuses to switch while a turn is running.
132
134
 
133
135
  ## Reasoning and service tier
134
136
 
135
- `reasoning` is the persona's default effort. A startup suffix, the session reasoning command, or `Shift+Tab` can override it. Reasoning changes are allowed while a turn is running, but the active logical turn keeps the complete model and tool specification captured when it began. The new effort applies to the next independently submitted or queued turn.
137
+ `reasoning` is the persona's default effort. A startup suffix, the session reasoning command, or `Shift+Tab` can override it. You can change reasoning while a turn is running, but the running turn keeps the model and tool settings it started with. The new effort applies from the next submitted or queued turn.
136
138
 
137
- `allowedReasoningLevels` controls which values the TUI cycles for that persona. It is a presentation allowlist, not a protocol-level prohibition. When omitted, the TUI offers the standard reasoning enum for a reasoning-capable model. For a model whose catalog entry says `reasoning: false`, the selector resolves to `none`.
139
+ `allowedReasoningLevels` sets which values the TUI cycles through for the persona. It limits only the TUI selector; protocol clients can still set other levels. When it is omitted, the TUI offers all standard levels for a model that supports reasoning. For a model whose catalog entry says `reasoning: false`, the selector shows only `none`.
138
140
 
139
141
  An empty `allowedReasoningLevels` does not create an empty selector. The TUI uses its normal model-aware choices.
140
142
 
141
- `serviceTier` is passed with supported OpenAI and OpenAI Codex requests. `priority` requests the provider's priority service and `flex` requests flex service. Availability, billing, and rejection behavior remain provider-account concerns. Other providers do not currently use this setting.
143
+ `serviceTier` is sent with OpenAI and OpenAI Codex requests. `priority` requests the provider's priority service, and `flex` requests flex service. Whether the tier is available, how it is billed, and whether requests are rejected depend on your provider account. Other providers ignore this setting.
142
144
 
143
145
  ## Reloading changes
144
146
 
145
- Run `/reload` while the TUI session is idle after editing personas, skills, or project context. Reload re-discovers the effective catalog and rebuilds the current session prompt and tools.
147
+ After editing personas, skills, or project context, run `/reload` while the session is idle. Reload finds personas again and rebuilds the session's prompt and tools.
146
148
 
147
- If the current persona ID still exists, Tau applies its newly loaded definition. This can reset runtime settings such as reasoning or service tier to the definition's values. If the ID disappeared, Tau selects the first effective persona. Existing session messages remain; changing a persona does not rewrite prior model-facing history.
149
+ If the current persona ID still exists, Tau applies its newly loaded definition. This can reset settings such as reasoning or service tier to the definition's values. If the ID is gone, Tau selects the first available persona. Existing messages stay as they are; a persona change never rewrites earlier history.
148
150
 
149
- A reload does not alter a turn already in progress, and the TUI refuses the operation while one is running. Existing live subagent threads retain the runtime with which they were created; newly spawned subagents inherit the reloaded persona. See [subagents](subagents.md).
151
+ The TUI refuses to reload while a turn is running. Subagents that are already running keep the setup they started with. Subagents started after the reload use the reloaded persona. See [subagents](subagents.md).
150
152
 
151
153
  ## Validation and common mistakes
152
154
 
@@ -159,4 +161,4 @@ An invalid persona is skipped and reported as a configuration warning. Other val
159
161
  - an invalid reasoning effort or service tier;
160
162
  - an unknown persona tool.
161
163
 
162
- `/reload` surfaces warning paths directly in the transcript. For a new local TUI session, `tau --debug --persona <id>` shows the selected model, settings, skills, subagents, tools, and complete effective prompt. If a remote edit appears to have no effect, confirm the session execution environment and `cwd` before changing another copy of the file. [Troubleshooting](troubleshooting.md) covers that check in more detail.
164
+ `/reload` shows warnings, with file paths, in the transcript. For a new local session, `tau --debug --persona <id>` shows the selected model, settings, skills, subagents, tools, and the complete prompt. If an edit seems to have no effect in a remote session, confirm the session's execution environment and `cwd` before editing another copy of the file. [Troubleshooting](troubleshooting.md) covers that check in more detail.
@@ -1,12 +1,16 @@
1
1
  # Prompts and project context
2
2
 
3
- Tau has several ways to provide instructions or reusable text, and they enter a session at different points. Prompt templates fill the editor on demand. `AGENTS.md` files provide standing project instructions. Leading hidden system blocks attach model-facing instructions to one user message.
3
+ Tau has three ways to add instructions or reusable text to a session, and each enters at a different point:
4
4
 
5
- These mechanisms do not choose models or tool access. [Personas](personas.md) own the base system prompt, model settings and tool allowlist. Model-specific system notices are configured separately in the [configuration reference](config-reference.md).
5
+ - Prompt templates fill the editor when you ask for them.
6
+ - `AGENTS.md` files give standing project instructions.
7
+ - Hidden system blocks at the start of a user message add instructions for that one message.
8
+
9
+ None of these choose models or tools. [Personas](personas.md) set the base system prompt, model settings, and tools. Model-specific system notices are configured separately in the [configuration reference](config-reference.md).
6
10
 
7
11
  ## Prompt templates fill the editor
8
12
 
9
- A prompt template is saved Markdown that Tau inserts into the TUI editor for review and submission. It is not added to the system prompt and does not run automatically.
13
+ A prompt template is saved Markdown that Tau inserts into the TUI editor, where you can review and send it. It is never added to the system prompt and never runs by itself.
10
14
 
11
15
  Tau discovers prompt files from:
12
16
 
@@ -15,9 +19,9 @@ Tau discovers prompt files from:
15
19
  | Global | `~/.config/tau/prompts/<id>.md` |
16
20
  | Project | `<level>/.tau/prompts/<id>.md` |
17
21
 
18
- The global location is in scope only when the execution-environment working directory is inside its home directory. Tau walks project levels from the working directory toward home, or toward the filesystem root when outside home. The nearest project definition wins over parent and global definitions. Prompt IDs are compared case-insensitively for precedence and lookup.
22
+ The global location applies only when the session's working directory is inside the execution environment's home directory. Tau searches project levels from the working directory up to home, or up to the filesystem root when outside home. The nearest project definition wins over parent and global ones. Prompt IDs are compared case-insensitively, both for precedence and for lookup.
19
23
 
20
- A prompt's ID is its filename without `.md`. Each file requires YAML frontmatter with a non-empty display `label`. For example, `release-summary.md`:
24
+ A prompt's ID is its filename without `.md`. Each file needs YAML frontmatter with a non-empty `label`. For example, `release-summary.md`:
21
25
 
22
26
  ```markdown
23
27
  ---
@@ -27,9 +31,9 @@ label: release summary
27
31
  Summarize the changes since the previous release. Separate user-visible changes from internal maintenance, and call out any migration steps.
28
32
  ```
29
33
 
30
- The required `label` appears in TUI autocomplete and the Telegram prompt picker. Unknown frontmatter fields are discarded. The Markdown body is the text inserted into the editor.
34
+ The `label` appears in TUI autocomplete and in the Telegram prompt picker. Unknown frontmatter fields are ignored. The Markdown body is the text inserted into the editor.
31
35
 
32
- Only files ending in lowercase `.md` are discovered. Invalid YAML, non-object frontmatter, or a missing or invalid label causes Tau to skip the file and report a warning.
36
+ Only files ending in lowercase `.md` are found. Tau skips a file with a warning if its YAML is invalid, its frontmatter is not an object, or its label is missing or invalid.
33
37
 
34
38
  ### Invoke a prompt
35
39
 
@@ -39,42 +43,42 @@ In the TUI, invoke a prompt by ID:
39
43
  /prompt:release-summary
40
44
  ```
41
45
 
42
- Tau replaces the current editor text with the template body. It does not submit the text, so it can be edited before sending. Prompt lookup is case-insensitive.
46
+ Tau replaces the editor text with the template body. It does not send the text, so you can edit it first. Lookup is case-insensitive.
43
47
 
44
- The session catalog stores only prompt metadata. Tau loads the body lazily from the execution environment when `/prompt:<id>` runs. This has two practical effects:
48
+ The session stores only each prompt's ID and label. Tau reads the body from the execution environment each time `/prompt:<id>` runs. As a result:
45
49
 
46
- - Editing the body of an already-cataloged prompt can affect its next invocation without embedding that body in the session snapshot.
47
- - Adding, removing, renaming, or changing the metadata of a prompt requires `/reload` before the TUI catalog and autocomplete reflect it.
50
+ - An edit to the body of a known prompt takes effect on its next use, without `/reload`.
51
+ - After adding, removing, or renaming a prompt, or changing its label, run `/reload` before autocomplete shows the change.
48
52
 
49
- If the file is missing or invalid when Tau resolves it, invocation fails instead of using a stale body. Remote clients ask the host to resolve the prompt from the session's execution environment; they do not read a same-named file on the client machine.
53
+ If the file is missing or invalid when Tau reads it, the command fails. Tau never falls back to an older copy of the body. An attached client always gets the prompt from the session's execution environment, never from a file with the same name on the client machine.
50
54
 
51
55
  ### Telegram prompt picker
52
56
 
53
- In [Telegram](telegram.md), `/prompt` lists the active session’s saved prompts, with pages for larger catalogs. Selecting a prompt resolves its current body through the session and records it as a committed user message. Selection is allowed only while the session is idle; otherwise wait for Tau to finish or use `/interrupt` first.
57
+ In [Telegram](telegram.md), `/prompt` lists the active session's saved prompts, split into pages when there are many. Selecting one reads its current body and adds it to the session as a user message, without starting a turn. You can select a prompt only while the session is idle. Otherwise, wait for Tau to finish or use `/interrupt` first.
54
58
 
55
- After recording succeeds, the picker becomes non-actionable and shows the prompt text, continued in additional messages when needed. Send a normal message (for example, details or “go”) to start the next turn with the prompt in context. In groups, that message must mention the bot as usual. Selecting another prompt appends another message rather than replacing the previous one. Recorded prompts survive session recovery.
59
+ After a prompt is added, the picker's buttons stop working and it shows the prompt text, split across more messages if needed. Send a normal message, such as details or “go”, to start the next turn with the prompt in context. In groups, that message must mention the bot as usual. Selecting another prompt adds another message; it does not replace the first. Added prompts survive session recovery.
56
60
 
57
- Only the newest picker in a chat is active. Pickers are bound to the session that opened them and expire after selection, session replacement, or runner restart. Duplicate taps do not record the same picker twice. Prompt selection does not consume pending attachments or group context.
61
+ Only the newest picker in a chat works. A picker belongs to the session that opened it and expires after a selection, when the session is replaced, or when the runner restarts. Tapping twice does not add the prompt twice. Selecting a prompt does not use up pending attachments or group context.
58
62
 
59
63
  ## `AGENTS.md` provides standing context
60
64
 
61
- `AGENTS.md` is project context injected into the effective system prompt. It is suitable for repository conventions, architectural boundaries, verification commands, and instructions that should apply to every relevant request.
65
+ `AGENTS.md` files are added to the system prompt as project context. Use them for repository conventions, architecture boundaries, verification commands, and other instructions that apply to every request in the project.
62
66
 
63
- Tau resolves `AGENTS.md` through the execution environment. Client and host filesystem access is not used as a shortcut, even for a local session.
67
+ Tau always reads `AGENTS.md` from the execution environment, also in a local session.
64
68
 
65
69
  ### Ancestor files are included in full
66
70
 
67
71
  Starting at the session working directory, Tau checks each ancestor for `AGENTS.md`. When the working directory is inside home, the walk stops at home and includes home itself. Otherwise it stops at the filesystem root.
68
72
 
69
- Existing eligible files are included in full. The nearest file is injected first, followed by its ancestors. This lets the agent see both local and broader instructions; when instructions conflict, the active instruction hierarchy and the more specific project guidance determine behavior.
73
+ Each file found is included in full, nearest first, followed by those in parent directories. The agent sees both local and broader instructions. When they conflict, the more specific project guidance takes priority, within the agent's overall instruction hierarchy.
70
74
 
71
- A candidate must resolve to a real file whose basename is exactly `AGENTS.md`. Its directory must be either an ancestor or a descendant of the current working directory. When the working directory is inside home, the canonical file must also remain inside home. These checks prevent a symlink from silently importing unrelated context outside the session's path boundary.
75
+ A file is included only if it resolves to a real file named exactly `AGENTS.md`, in a directory that is a parent or a subdirectory of the working directory. When the working directory is inside home, the resolved file must also be inside home. These checks stop a symlink from pulling in unrelated instructions from outside the session's directories.
72
76
 
73
77
  ### Descendant files are listed by path
74
78
 
75
- Tau also scans below the current working directory for nested `AGENTS.md` files. Their contents are not injected automatically. Tau includes only their paths so the agent knows that more specific instructions exist and can read the relevant file before working in that subtree.
79
+ Tau also looks below the working directory for nested `AGENTS.md` files. Their contents are not added automatically. Tau lists only their paths, so the agent knows more specific instructions exist and can read the right file before working in that subdirectory.
76
80
 
77
- The scan is breadth-first, visits at most 8,192 directories, and descends at most 16 levels below the working directory. It follows only directory paths that canonically remain under that directory and avoids symlink cycles.
81
+ The scan is breadth-first, visits at most 8,192 directories, and goes at most 16 levels deep. It follows only directories whose resolved path stays under the working directory, and it does not loop on symlink cycles.
78
82
 
79
83
  Tau skips these directory names at every level:
80
84
 
@@ -84,14 +88,14 @@ Tau skips these directory names at every level:
84
88
  target vendor venv
85
89
  ```
86
90
 
87
- When scanning directly from the execution home, Tau also skips direct children managed by common tools:
91
+ When the scan starts at the home directory itself, Tau also skips these tool-managed directories directly under home:
88
92
 
89
93
  ```text
90
94
  .bun .cargo .config .deno .gradle .local .m2 .npm .nvm
91
95
  .pnpm-store .rustup .sdkman .yarn
92
96
  ```
93
97
 
94
- It additionally skips the direct `Library` child on macOS and `snap` on Linux. A project directory with one of these names is still scanned when it is not a direct child of home.
98
+ It also skips `Library` directly under home on macOS, and `snap` on Linux. A directory with one of these names elsewhere is still scanned.
95
99
 
96
100
  ## Disable project context
97
101
 
@@ -101,45 +105,43 @@ Start Tau with:
101
105
  tau --no-agent-context-files
102
106
  ```
103
107
 
104
- This disables ancestor `AGENTS.md` injection and the descendant paths-only scan. It does not disable personas, prompt templates, or [skills](skills.md).
108
+ This turns off both the included `AGENTS.md` files and the list of nested ones. Personas, prompt templates, and [skills](skills.md) still work.
105
109
 
106
- The option applies to local TUI sessions and to hosts started with `tau serve`. For the Node SDK, `noAgentContextFiles: true` provides the same host-level behavior. An attached client cannot retroactively change how an existing remote host session was created.
110
+ The option works for local TUI sessions and for hosts started with `tau serve`. In the Node SDK, `noAgentContextFiles: true` does the same for the host. An attached client cannot change this for a session that already exists on a remote host.
107
111
 
108
112
  ## Alternate subagent working directories
109
113
 
110
- A subagent normally inherits the parent session's working directory and composed context. When `spawn_agent` specifies a different `workingDirectory`, Tau rebuilds the subagent's target-dependent context from that directory.
111
-
112
- The alternate directory controls:
114
+ A subagent normally uses the parent session's working directory and context. When `spawn_agent` sets a different `workingDirectory`, Tau rebuilds the parts of the context that depend on the directory:
113
115
 
114
- - target environment and repository metadata,
115
- - target applicable `AGENTS.md`,
116
- - all target-discovered skills.
116
+ - environment and repository details
117
+ - the applicable `AGENTS.md` files
118
+ - the skills found from that directory
117
119
 
118
- The parent session remains the source of truth for the selected persona, model catalog, model settings, and tool policy. It does not replace the source persona with a persona found in the target directory. See [subagents](subagents.md) for the full launch contract.
120
+ The persona, model catalog, model settings, and tool policy still come from the parent session. A persona file in the other directory is not used. See [subagents](subagents.md) for details.
119
121
 
120
122
  ## Leading hidden system blocks
121
123
 
122
- Tau recognizes one or more exact `<system>...</system>` blocks only when they begin a user message and each closing tag is followed by a newline:
124
+ Tau recognizes one or more `<system>...</system>` blocks only when they start a user message and each closing tag is followed by a newline:
123
125
 
124
126
  ```text
125
127
  <system>Use the deployment checklist for this response.</system>
126
128
  Prepare the staging release.
127
129
  ```
128
130
 
129
- The complete raw message is persisted and remains model-visible, while Tau's user-message display omits the recognized leading blocks and shows the remaining text. A block elsewhere in the message, a malformed block, or a closing tag without the required newline is ordinary visible text.
131
+ The whole message is saved and sent to the model. When Tau displays the message, it hides the recognized blocks and shows the rest. A block anywhere else in the message, a malformed block, or a closing tag without the newline is shown as ordinary text.
130
132
 
131
- This mechanism is useful for integrations that need per-message model instructions without presenting them as user prose. It is not a secret channel or a substitute for access control: the content is durable session data and is sent to the model. Project-wide guidance belongs in `AGENTS.md`; stable persona behavior belongs in the persona system prompt.
133
+ Integrations can use this to give the model instructions for one message without showing them as the user's words. The blocks are not secret and do not control access: they are saved in the session and sent to the model. Put project-wide guidance in `AGENTS.md` and lasting persona behavior in the persona's system prompt.
132
134
 
133
135
  ## Reload and verify context
134
136
 
135
- Run `/reload` in an idle TUI session after changing prompts, skills, personas, configuration, or project context files. Reload re-resolves content and rebuilds the active persona's system context. It reports configuration warnings and the resulting counts. Reload is refused while a session turn is active.
137
+ Run `/reload` in an idle session after changing prompts, skills, personas, configuration, or project context files. Reload reads everything again and rebuilds the system prompt for the active persona. It reports configuration warnings and how much content it loaded. Reload is refused while a turn is running.
136
138
 
137
- For a new local TUI session, debug mode prints discovered content, loaded context-file paths, tool schemas, and the effective system prompt, then exits:
139
+ For a new local session, debug mode prints the discovered content, the paths of loaded context files, tool schemas, and the system prompt, then exits:
138
140
 
139
141
  ```bash
140
142
  tau --debug --persona release-coder
141
143
  ```
142
144
 
143
- Add `--no-agent-context-files` to verify the context-free variant. Debug mode is TUI startup functionality and is not available with `tau serve`.
145
+ Add `--no-agent-context-files` to see the result without project context. Debug mode works only for TUI startup, not with `tau serve`.
144
146
 
145
- If expected context is missing, verify the execution-environment `cwd` and `home`, not just the attached client's current directory. Then check exact filenames, canonical path eligibility, scan exclusions, and reload warnings. See [troubleshooting](troubleshooting.md) for broader diagnostics.
147
+ If expected context is missing, check the `cwd` and `home` of the execution environment, not the attached client's current directory. Then check exact filenames, the path rules above, scan exclusions, and reload warnings. See [troubleshooting](troubleshooting.md) for broader diagnostics.