@markusylisiurunen/tau 0.3.80 → 0.3.82
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 +4 -16
- package/dist/code_mode/command.js.map +1 -1
- package/dist/code_mode/images.js +5 -6
- package/dist/code_mode/images.js.map +1 -1
- package/dist/code_mode/index.d.ts +1 -3
- package/dist/code_mode/index.js +1 -2
- package/dist/code_mode/index.js.map +1 -1
- package/dist/code_mode/runtime.d.ts +8 -4
- package/dist/code_mode/runtime.js +52 -63
- package/dist/code_mode/runtime.js.map +1 -1
- package/dist/core/code_mode/bash.js +269 -0
- package/dist/core/code_mode/bash.js.map +1 -0
- package/dist/core/code_mode/capability.js +2 -0
- package/dist/core/code_mode/capability.js.map +1 -0
- package/dist/core/code_mode/history.js +62 -0
- package/dist/core/code_mode/history.js.map +1 -0
- package/dist/core/code_mode/mcp.js +121 -0
- package/dist/core/code_mode/mcp.js.map +1 -0
- package/dist/core/code_mode/models.js +256 -0
- package/dist/core/code_mode/models.js.map +1 -0
- package/dist/core/{tools → code_mode}/nook.js +13 -77
- package/dist/core/code_mode/nook.js.map +1 -0
- package/dist/core/code_mode/sdk.js +97 -0
- package/dist/core/code_mode/sdk.js.map +1 -0
- package/dist/core/{tools → code_mode}/web.js +31 -90
- package/dist/core/code_mode/web.js.map +1 -0
- package/dist/core/commands/registry.js +0 -22
- package/dist/core/commands/registry.js.map +1 -1
- package/dist/core/config/content_loader.js +3 -1
- package/dist/core/config/content_loader.js.map +1 -1
- package/dist/core/debug.js +1 -1
- package/dist/core/debug.js.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/models/openrouter.js +171 -0
- package/dist/core/models/openrouter.js.map +1 -0
- package/dist/core/{tool → models}/openrouter_decisions.js +6 -7
- package/dist/core/models/openrouter_decisions.js.map +1 -0
- package/dist/core/models/openrouter_media.js +128 -0
- package/dist/core/models/openrouter_media.js.map +1 -0
- package/dist/core/personas.js +2 -1
- package/dist/core/personas.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/session/compaction.js +5 -3
- package/dist/core/session/compaction.js.map +1 -1
- package/dist/core/static/code_mode/history/documentation.md +95 -167
- package/dist/core/static/code_mode/mcp/documentation.md +144 -67
- package/dist/core/static/code_mode/nook/documentation.md +108 -169
- package/dist/core/static/code_mode/sandbox_runner.mjs +37 -20
- package/dist/core/static/code_mode/web/documentation.md +115 -213
- package/dist/core/static/tau_docs/client-tools.md +4 -4
- package/dist/core/static/tau_docs/history.md +2 -2
- package/dist/core/static/tau_docs/index.md +1 -1
- package/dist/core/static/tau_docs/node-sdk.md +6 -7
- package/dist/core/static/tau_docs/nook.md +2 -2
- package/dist/core/static/tau_docs/personas.md +2 -2
- package/dist/core/static/tau_docs/remote-sessions.md +2 -2
- package/dist/core/static/tau_docs/security.md +4 -4
- package/dist/core/static/tau_docs/session-protocol-methods.md +1 -46
- package/dist/core/static/tau_docs/session-protocol.md +11 -11
- package/dist/core/static/tau_docs/sessions.md +6 -25
- package/dist/core/static/tau_docs/subagents.md +3 -2
- package/dist/core/static/tau_docs/telegram.md +1 -1
- package/dist/core/static/tau_docs/tools.md +40 -48
- package/dist/core/static/tau_docs/troubleshooting.md +2 -2
- package/dist/core/static/tau_docs/tui.md +8 -7
- package/dist/core/subagents/registry.js +2 -1
- package/dist/core/subagents/registry.js.map +1 -1
- package/dist/core/subagents/types.js +2 -1
- package/dist/core/subagents/types.js.map +1 -1
- package/dist/core/telegram/adapter.js +1 -6
- package/dist/core/telegram/adapter.js.map +1 -1
- package/dist/core/tool/image_generate.js +2 -1
- package/dist/core/tool/image_generate.js.map +1 -1
- package/dist/core/tool/media.js +1 -49
- package/dist/core/tool/media.js.map +1 -1
- package/dist/core/tool/openrouter.js +24 -156
- package/dist/core/tool/openrouter.js.map +1 -1
- package/dist/core/tool/openrouter_input.js +77 -0
- package/dist/core/tool/openrouter_input.js.map +1 -0
- package/dist/core/tool/speech_generate.js +2 -1
- package/dist/core/tool/speech_generate.js.map +1 -1
- package/dist/core/tools/bash.js +2 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/bash_jobs.js +34 -5
- package/dist/core/tools/bash_jobs.js.map +1 -1
- package/dist/core/tools/catalog.js +18 -44
- package/dist/core/tools/catalog.js.map +1 -1
- package/dist/core/tools/code.js +100 -0
- package/dist/core/tools/code.js.map +1 -0
- package/dist/core/tools/code_mode.js +9 -30
- package/dist/core/tools/code_mode.js.map +1 -1
- package/dist/core/tools/code_mode_worker.js +2 -2
- package/dist/core/tools/presentation.js +2 -1
- package/dist/core/tools/presentation.js.map +1 -1
- package/dist/core/tools/tool_names.js +5 -7
- package/dist/core/tools/tool_names.js.map +1 -1
- package/dist/core/utils/gemini_transcription.js +81 -37
- package/dist/core/utils/gemini_transcription.js.map +1 -1
- package/dist/core/utils/media_validation.js +50 -0
- package/dist/core/utils/media_validation.js.map +1 -0
- 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-D20byCHL.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{angular-ts-DXk17TRM.js → angular-ts-CvVQslm2.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{apl-BsvksCXR.js → apl-DNIxlYWe.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{astro-DH775E4V.js → astro-DDOw4EUG.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{blade-Ck99Rm59.js → blade-DlhB-SLW.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{c-DJpHqu5J.js → c-C1f4vhDm.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{chapel-Owff0Csy.js → chapel-Ctt8xOX1.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{cobol-Cv2gZuhO.js → cobol-BXw71PAA.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{coffee-Bji0YCf_.js → coffee-CRh_5Nmr.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{cpp-DTjA_yFF.js → cpp-IlI-zWOZ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{crystal-Dd00NOeb.js → crystal-CXeL28i7.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{css-D44TN1V6.js → css-BfST9hFI.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{edge-CVmGSi2m.js → edge--Q22k_ty.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{elixir-B8Mq7no2.js → elixir-CIfC_rQx.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{elm-CXS0I3Z2.js → elm-OkZ29XRO.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{erb-B9oDKaUo.js → erb-B8ZXgEqv.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{git-rebase-DT-YFebH.js → git-rebase-CxkO_WGd.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glimmer-js-s0DXlNjq.js → glimmer-js-BVadyIrr.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glimmer-ts-QgEB5S2z.js → glimmer-ts-D5J3Qb7n.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glsl-NA0icwbY.js → glsl-B6iy73-Y.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{graphql-0_dOlfV0.js → graphql-Dc3rUXf5.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{hack-D-mr7l1l.js → hack-q8Utf8Jp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{haml-B0-oQmz7.js → haml-mjMIlj_2.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{handlebars-Yq9bXpWN.js → handlebars-CA-BL8Ks.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{html-B8bMmdRK.js → html-BmPxhYCX.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{html-derivative-BpxSlQb_.js → html-derivative-CvknIjuB.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{http-hS_53mxt.js → http-DNxLDRIi.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{hurl-B2ST1kwl.js → hurl-kbd3Eq2V.js} +1 -1
- package/dist/diff_tool/app/dist/assets/index-D8ZI_2RC.js +340 -0
- package/dist/diff_tool/app/dist/assets/{java-D4mj0lZJ.js → java-BuZshgf1.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{javascript-wC7rrKiV.js → javascript-DfL2oeFU.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jinja-DbQ3o87F.js → jinja-Bu0KQihU.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jison-CrE9FdvP.js → jison-Bqn7Mf3Q.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{json-xjicDyWN.js → json-BuX5LKaB.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jsx-m28lXojQ.js → jsx-DdVJ-ZBp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{julia-19xkOmop.js → julia-CQeijOoQ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{just-Cf7OorTr.js → just-vzAktFGR.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{latex-DDb7GQOy.js → latex-Dm60cg0k.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{liquid-DHOuQ0rf.js → liquid-vxKzm2P8.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{lua-BGyIvonw.js → lua-DIoqi4dd.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{marko-DB5OqI1C.js → marko-BTHgFKby.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{mdc-DTyNMupO.js → mdc-CEfz8gZ9.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{nginx-DfF0fMYD.js → nginx-DNlFDEfJ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{nim-BbwsXuZD.js → nim-DnvT_0lZ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{org-BkOBBl1f.js → org-BbD-ElVf.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{perl-BTXTOl4K.js → perl-DTsbnAmK.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{php-DIMVQWiA.js → php-CwEsJe-W.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{pug-B_nrb4dJ.js → pug-BOttMVH-.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{qml-1PXi8G8Z.js → qml-C8KkSItN.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{r-CJrAkc2Z.js → r-K4ksJj_R.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{razor-DgPUftNd.js → razor-yuWRrrG6.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{regexp-C2hS8XvL.js → regexp-CV-jhnUz.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{rst-CDouhKnc.js → rst-CLA3Attc.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{ruby-CAjKW1uO.js → ruby-DiHR2-DX.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{sas-qAHkHLc1.js → sas-DxIjbYJ5.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{scss-Bfx2Ydid.js → scss-CShwEaV4.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{shellscript-Bu76R8y2.js → shellscript-CeezOnrF.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{shellsession-BU8BL0oL.js → shellsession-CjSS2r7j.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{soy-FRl8ozP-.js → soy-CI_v23nJ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{sql-BacQgsEs.js → sql-D9GaB00A.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{stata-B9kkG-ET.js → stata-hK92TPE_.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{surrealql-qvETr7iY.js → surrealql-UO8LtPJG.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{svelte-B0z1MgHc.js → svelte-kIlaw_oh.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{templ-DTnPshKb.js → templ-DFRz1JP6.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{tex-Cosab9_H.js → tex-CfxIXk_z.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{ts-tags-DNYvLFUH.js → ts-tags-BtUHl0ff.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{tsx-Dstq6j1a.js → tsx-Cd4SAe2C.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{twig-BzqZdwaX.js → twig-CWk4q5Y3.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{typescript-YOQ_oE25.js → typescript-BqxGJiP0.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{typst-DTffwfpc.js → typst-D9nAun2p.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-D4OMj_C5.js → vue-D6HYhg6_.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-html-kT4WrHGK.js → vue-html-1VRlaENS.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-vine-CxeapeMO.js → vue-vine-BaH0We9y.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{xml-DWVpuurg.js → xml-C4RWnUuj.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{xsl-C0ciup5a.js → xsl-D1iD38ga.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{yaml-98Fvyfpc.js → yaml-yAb4W0G-.js} +1 -1
- package/dist/diff_tool/app/dist/index.html +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/nook/README.md +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/code_mode.js +11 -17
- package/dist/sdk/code_mode.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/index.js +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 +95 -82
- package/dist/tui/session_chat_controller.js.map +1 -1
- package/dist/tui/ui/footer.js +2 -5
- package/dist/tui/ui/footer.js.map +1 -1
- package/package.json +7 -7
- package/dist/code_mode/files.d.ts +0 -47
- package/dist/code_mode/files.js +0 -296
- package/dist/code_mode/files.js.map +0 -1
- package/dist/core/session/goal.js +0 -54
- package/dist/core/session/goal.js.map +0 -1
- package/dist/core/tool/openrouter_decisions.js.map +0 -1
- package/dist/core/tool/openrouter_media.js +0 -180
- package/dist/core/tool/openrouter_media.js.map +0 -1
- package/dist/core/tools/goal.js +0 -167
- package/dist/core/tools/goal.js.map +0 -1
- package/dist/core/tools/history.js +0 -118
- package/dist/core/tools/history.js.map +0 -1
- package/dist/core/tools/mcp.js +0 -167
- package/dist/core/tools/mcp.js.map +0 -1
- package/dist/core/tools/nook.js.map +0 -1
- package/dist/core/tools/web.js.map +0 -1
- package/dist/diff_tool/app/dist/assets/index-CBT_sNIz.js +0 -340
|
@@ -18,7 +18,7 @@ The server sends `ready` as its first message:
|
|
|
18
18
|
|
|
19
19
|
```json
|
|
20
20
|
{
|
|
21
|
-
"version":
|
|
21
|
+
"version": 17,
|
|
22
22
|
"type": "ready",
|
|
23
23
|
"methods": ["initialize", "session.create", "session.list"]
|
|
24
24
|
}
|
|
@@ -30,7 +30,7 @@ After `ready`, send `initialize` with non-empty client metadata:
|
|
|
30
30
|
|
|
31
31
|
```json
|
|
32
32
|
{
|
|
33
|
-
"version":
|
|
33
|
+
"version": 17,
|
|
34
34
|
"type": "request",
|
|
35
35
|
"id": "init-1",
|
|
36
36
|
"method": "initialize",
|
|
@@ -50,7 +50,7 @@ Every request has the same envelope:
|
|
|
50
50
|
|
|
51
51
|
```json
|
|
52
52
|
{
|
|
53
|
-
"version":
|
|
53
|
+
"version": 17,
|
|
54
54
|
"type": "request",
|
|
55
55
|
"id": "req-42",
|
|
56
56
|
"method": "session.snapshot",
|
|
@@ -64,7 +64,7 @@ Successful responses echo the request id:
|
|
|
64
64
|
|
|
65
65
|
```json
|
|
66
66
|
{
|
|
67
|
-
"version":
|
|
67
|
+
"version": 17,
|
|
68
68
|
"type": "response",
|
|
69
69
|
"id": "req-42",
|
|
70
70
|
"ok": true,
|
|
@@ -100,7 +100,7 @@ Observation controls delivery, not session ownership. `session.unobserve` stops
|
|
|
100
100
|
| `revision` | Monotonic protocol snapshot revision. |
|
|
101
101
|
| `lifecycle` | `idle` or `running`. |
|
|
102
102
|
| `agentState` | Independent agent revision, model context key, and optional usage checkpoint. |
|
|
103
|
-
| `
|
|
103
|
+
| `settings`, `costTotal` | Persona and reasoning settings, and accumulated session cost. |
|
|
104
104
|
| `bootstrap`, `catalog` | Selected model and prompt metadata plus available personas, prompt metadata, skills, and enabled host-configured MCP server names. |
|
|
105
105
|
| `executionEnvironment` | The environment kind, identity, `cwd`, and home used for agent-visible work. |
|
|
106
106
|
| `messages`, `turns` | Synchronized model-facing records and durable logical-turn receipts. |
|
|
@@ -124,7 +124,7 @@ Intermediate instructions are committed without a user turn receipt. Their durab
|
|
|
124
124
|
|
|
125
125
|
Turn requests return a terminal outcome, and accepted user turns are also keyed by `userHistoryEntryId` in `snapshot.turns`. Use that ledger to distinguish an unknown request from accepted running work and settled work. Do not infer request outcomes from notice titles, message counts, or timing.
|
|
126
126
|
|
|
127
|
-
User-facing behavior such as
|
|
127
|
+
User-facing behavior such as retry, compaction, rewind, and recovery is described in [sessions](sessions.md).
|
|
128
128
|
|
|
129
129
|
## Apply snapshot deltas in order
|
|
130
130
|
|
|
@@ -132,7 +132,7 @@ Observed snapshot changes arrive as `session.delta`:
|
|
|
132
132
|
|
|
133
133
|
```json
|
|
134
134
|
{
|
|
135
|
-
"version":
|
|
135
|
+
"version": 17,
|
|
136
136
|
"type": "session.delta",
|
|
137
137
|
"sessionId": "0195d6e4-4cf9-7f44-a2d8-f8f7f49ee9d3",
|
|
138
138
|
"fromRevision": 8,
|
|
@@ -170,7 +170,7 @@ Not all observed state belongs in the recoverable snapshot. Each live channel ha
|
|
|
170
170
|
|
|
171
171
|
```json
|
|
172
172
|
{
|
|
173
|
-
"version":
|
|
173
|
+
"version": 17,
|
|
174
174
|
"type": "session.pendingUserMessages",
|
|
175
175
|
"sessionId": "...",
|
|
176
176
|
"state": {
|
|
@@ -207,7 +207,7 @@ An initialized client that advertised a tool can receive:
|
|
|
207
207
|
|
|
208
208
|
```json
|
|
209
209
|
{
|
|
210
|
-
"version":
|
|
210
|
+
"version": 17,
|
|
211
211
|
"type": "session.clientTool.call",
|
|
212
212
|
"sessionId": "...",
|
|
213
213
|
"agentId": "main",
|
|
@@ -231,7 +231,7 @@ Error responses use `ok: false`:
|
|
|
231
231
|
|
|
232
232
|
```json
|
|
233
233
|
{
|
|
234
|
-
"version":
|
|
234
|
+
"version": 17,
|
|
235
235
|
"type": "response",
|
|
236
236
|
"id": "req-42",
|
|
237
237
|
"ok": false,
|
|
@@ -263,7 +263,7 @@ A WebSocket close, malformed server payload, unsupported version, or other termi
|
|
|
263
263
|
|
|
264
264
|
The server can accept several requests before earlier requests settle, so responses and streamed messages may interleave.
|
|
265
265
|
|
|
266
|
-
- Only one
|
|
266
|
+
- Only one main-session turn runs at a time. `session.submit` and `session.retry` return `busy` on conflict.
|
|
267
267
|
- `session.queue` waits for idle work. `session.steer` requests the next safe turn boundary. Each request receives its own eventual response.
|
|
268
268
|
- Session mutations are serialized in arrival order across clients. Mutations that replace context can interrupt active work and reject pending input. `session.rewind` instead requires the session to be idle with no pending input.
|
|
269
269
|
- `session.setReasoning` is serialized but does not interrupt the active turn. The new setting applies to the next independently started turn.
|
|
@@ -29,7 +29,7 @@ Session-owned [background Bash jobs](tools.md#bash) survive turns, interruption,
|
|
|
29
29
|
|
|
30
30
|
## Submit, queue, and steer
|
|
31
31
|
|
|
32
|
-
A normal submission is accepted and persisted before model work begins. Tau then runs model and tool subturns until the turn completes, fails, is blocked, or is interrupted.
|
|
32
|
+
A normal submission is accepted and persisted before model work begins. Tau then runs model and tool subturns until the turn completes, fails, is blocked, or is interrupted. The model decides when its response is complete; Tau does not automatically start another turn after a final response. Automatic compaction can continue an unfinished turn within a new context window.
|
|
33
33
|
|
|
34
34
|
Only one logical turn runs at a time. Input sent during active work has two useful delivery modes:
|
|
35
35
|
|
|
@@ -48,7 +48,7 @@ Ordinary session interruption is cooperative. It requests cancellation of the ma
|
|
|
48
48
|
|
|
49
49
|
Retry runs another assistant turn from the current session history. It does not remove the interrupted or failed result, rewind context, or submit the previous user text again. This lets Tau continue from completed tool results without automatically rerunning them. In the TUI, press Enter twice on an empty editor while idle.
|
|
50
50
|
|
|
51
|
-
Retry is unavailable when there is no prior user turn.
|
|
51
|
+
Retry is unavailable when there is no prior user turn.
|
|
52
52
|
|
|
53
53
|
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).
|
|
54
54
|
|
|
@@ -71,42 +71,23 @@ Recovery preserves user-visible durable state including:
|
|
|
71
71
|
- committed conversation messages and terminal tool results
|
|
72
72
|
- current persona and reasoning settings
|
|
73
73
|
- cumulative usage cost and context accounting needed for continuation
|
|
74
|
-
- persistent goal state
|
|
75
74
|
- execution-environment identity, cwd, and creation attributes
|
|
76
75
|
- compaction and rewind results
|
|
77
76
|
|
|
78
|
-
Recovery intentionally does not recreate every live process. It returns the session idle, settles any accepted but unfinished turn as aborted, cancels running maintenance operations, and normalizes tools whose completion cannot be proven. Supervised subagents and their live activity do not survive restart.
|
|
77
|
+
Recovery intentionally does not recreate every live process. It returns the session idle, settles any accepted but unfinished turn as aborted, cancels running maintenance operations, and normalizes tools whose completion cannot be proven. Supervised subagents and their live activity do not survive restart.
|
|
79
78
|
|
|
80
79
|
A stored session is listed or recovered only when the current host has a resolver capable of restoring its execution-environment kind and named target. Recovery can therefore fail even when the session document is valid, for example when a Cloudflare bridge was removed, a Fly API target is no longer configured, or the underlying sandbox, Sprite, directory, or credentials are unavailable.
|
|
81
80
|
|
|
82
81
|
Newer Tau versions preserve the openability of supported stored sessions through storage migrations and recovery normalization. This promises access to recoverable semantic data, not byte-for-byte files or identical historical presentation. A genuinely newer unsupported storage version or corrupted document can still be rejected.
|
|
83
82
|
|
|
84
|
-
## Use persistent goals
|
|
85
|
-
|
|
86
|
-
A persistent goal lets Tau continue across repeated model turns until the agent marks the objective complete or blocked. Start one from the TUI:
|
|
87
|
-
|
|
88
|
-
```text
|
|
89
|
-
/goal prepare the release and verify the package
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Tau stores the objective before running it. While the goal remains active, the host creates continuation turns automatically. The agent’s goal tools can refine the objective, block it when human input is needed, or complete and clear it.
|
|
93
|
-
|
|
94
|
-
Use the controls deliberately:
|
|
95
|
-
|
|
96
|
-
- `/goal` shows the current objective and status.
|
|
97
|
-
- `/goal resume` resumes a blocked goal.
|
|
98
|
-
- `/goal clear` clears the goal. If work is active, clearing interrupts it and cancels pending input associated with the old flow.
|
|
99
|
-
|
|
100
|
-
Only one goal can exist at a time. Clear it before starting another. Interruption, provider failure, blocked execution, or host recovery changes an active goal to `blocked`. Tau never silently resumes autonomous goal work after recovery. Goal-controlled turns cannot use ordinary retry; use `/goal resume` after resolving the blocker.
|
|
101
|
-
|
|
102
|
-
A goal survives client detach and host restart because its objective and status are session state. The process doing the work does not survive restart.
|
|
103
|
-
|
|
104
83
|
## Compact model context
|
|
105
84
|
|
|
106
85
|
Compaction replaces model-visible conversation context with a checkpoint so the same session can continue within the model’s context window. It changes active model context, not the independent searchable transcript.
|
|
107
86
|
|
|
108
87
|
The working model creates the checkpoint from its native conversation context, including the base instructions, previous checkpoint, and reasoning state supported by its provider. The checkpoint covers the whole active context and does not depend on knowing which recent messages will remain. It is an isolated maintenance request with no tool execution, not a submitted user turn. Reasoning continuity depends on the provider; the checkpoint records useful conclusions and rationale rather than reproducing internal thinking.
|
|
109
88
|
|
|
89
|
+
The summary is intended to support both immediate continuation and recognition of earlier work. Recent and unfinished work receives the most detail; older work is compressed into its purpose, outcomes, and significant decisions. Across repeated compactions, the agent integrates the previous summary with newer conversation rather than discarding topics solely because they are old or completed. Important ongoing constraints retain precision regardless of age. Compaction is lossy: this cumulative overview does not preserve every topic or detail indefinitely.
|
|
90
|
+
|
|
110
91
|
### Automatic compaction
|
|
111
92
|
|
|
112
93
|
Automatic compaction runs before a model subturn when fresh provider usage plus newly added estimated context exceeds the threshold. The threshold is the model context window minus a fixed reserve of 16,384 tokens. Checkpoint generation inherits the normal model stream settings without a compaction-specific output limit. Requests whose input cannot fit fail rather than falling back to a flattened transcript. Compaction can run more than once during a long logical turn.
|
|
@@ -214,7 +195,7 @@ Use normal Tau operations rather than opening or editing session files.
|
|
|
214
195
|
1. Wait for active work to finish or interrupt it intentionally.
|
|
215
196
|
2. Note the session id shown in the TUI startup block.
|
|
216
197
|
3. Exit cleanly and reattach through the same host.
|
|
217
|
-
4. Confirm the expected messages, persona, reasoning level
|
|
198
|
+
4. Confirm the expected messages, persona, and reasoning level.
|
|
218
199
|
5. Run non-contextual environment checks with `!!`, for example `!!pwd` and `!!git status --short`.
|
|
219
200
|
6. Submit a small read-only request before resuming destructive work.
|
|
220
201
|
|
|
@@ -28,10 +28,11 @@ The eligible inherited tools are:
|
|
|
28
28
|
- `history`
|
|
29
29
|
- `nook`, when Nook is configured
|
|
30
30
|
- `mcp`, when the host has enabled MCP servers
|
|
31
|
+
- `models`
|
|
31
32
|
|
|
32
|
-
Tau then adds intrinsic `tau_docs` to every subagent registry, independently of this subset. A persona’s `tools` list cannot disable it. Apart from `tau_docs`, subagents do not receive
|
|
33
|
+
Tau then adds intrinsic `tau_docs` to every subagent registry, independently of this subset. A persona’s `tools` list cannot disable it. Apart from `tau_docs`, subagents do not receive subagent supervision tools, client tools, or TUI-local tools.
|
|
33
34
|
|
|
34
|
-
The worker inherits the intersection of the main persona's tools and those
|
|
35
|
+
The worker inherits the intersection of the main persona's tools and those nine eligible names. MCP uses the parent's shared host connections, independent of the child's working directory. For example, a main persona with `bash`, `edit`, `history`, and `spawn_agent` gives the child `bash`, `edit`, and `history`, plus intrinsic `tau_docs`. Service selectors enable namespaces in the child's `code` tool. There is no separate child tool allowlist.
|
|
35
36
|
|
|
36
37
|
Subagents cannot launch other subagents: supervision tools are never included in a child's registry. See [tools](tools.md) for the broader availability contract.
|
|
37
38
|
|
|
@@ -229,7 +229,7 @@ The runner's speech credentials and `speech.voiceId` are loaded at startup from
|
|
|
229
229
|
| --- | --- |
|
|
230
230
|
| `/use_<projectId>` | Selects the project for future `/new` sessions. |
|
|
231
231
|
| `/new` | Replaces the active session using the preferred project. |
|
|
232
|
-
| `/status` | Reports session state, project, model, reasoning, context usage,
|
|
232
|
+
| `/status` | Reports session state, project, model, reasoning, context usage, and cost. |
|
|
233
233
|
| `/persona` | Switches persona while idle without losing history or starting a turn. |
|
|
234
234
|
| `/effort_low` | Selects low reasoning for future turns. |
|
|
235
235
|
| `/effort_medium` | Selects medium reasoning for future turns. |
|
|
@@ -6,13 +6,12 @@ Tool availability is captured when a logical turn starts. Persona changes, confi
|
|
|
6
6
|
|
|
7
7
|
## Tool categories
|
|
8
8
|
|
|
9
|
-
Tau uses
|
|
9
|
+
Tau uses three distinct categories:
|
|
10
10
|
|
|
11
11
|
| Category | Owner and availability |
|
|
12
12
|
| --- | --- |
|
|
13
13
|
| Persona-controlled host tools | The host binds implementations that operate against the session execution environment or host services. The active persona's `tools` list selects them. |
|
|
14
14
|
| Intrinsic tools | Tau binds these outside persona allowlists. `tau_docs` is available to main agents and subagents. |
|
|
15
|
-
| Main-session goal tools | `get_goal`, `create_goal`, and `update_goal` are always available to the main session, independently of the persona. They are not subagent tools. |
|
|
16
15
|
| Client-provided tools | An attached client advertises and executes these. TUI-owned `diff_review` and `prefill_input` are examples. Configured command client tools use the same boundary. |
|
|
17
16
|
|
|
18
17
|
A tool schema tells the model how to call a tool. It does not grant operating-system permissions. Host tools execute with the authority of the execution environment or the configured host service. Client tools execute with the authority of their owning client and may separately request commands in the execution environment. See [ownership and scope](ownership-and-scope.md) and [client tools](client-tools.md).
|
|
@@ -30,7 +29,7 @@ tools:
|
|
|
30
29
|
- web
|
|
31
30
|
```
|
|
32
31
|
|
|
33
|
-
The supported persona-controlled
|
|
32
|
+
The supported persona-controlled tool and capability selectors are:
|
|
34
33
|
|
|
35
34
|
```text
|
|
36
35
|
bash
|
|
@@ -41,6 +40,7 @@ web
|
|
|
41
40
|
nook
|
|
42
41
|
history
|
|
43
42
|
mcp
|
|
43
|
+
models
|
|
44
44
|
spawn_agent
|
|
45
45
|
send_input_to_agent
|
|
46
46
|
wait_for_agents
|
|
@@ -48,7 +48,9 @@ list_agents
|
|
|
48
48
|
interrupt_agent
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
A custom persona that omits `tools` enables `bash`, `write`, `edit`, `view_image`, `web`, `nook`, `history`, and `
|
|
51
|
+
A custom persona that omits `tools` enables `bash`, `write`, `edit`, `view_image`, `web`, `nook`, `history`, `mcp`, and `models`. It also enables the five subagent-management tools. Built-in personas enable the same base and subagent tool sets.
|
|
52
|
+
|
|
53
|
+
The selectors `web`, `history`, `nook`, `mcp`, and `models` enable namespaces in the single `code` tool, not separate model-facing tools. `bash` enables both the direct Bash tools and `tau.bash` within code mode. Tau registers `code` when at least one eligible composition capability is selected; `code` is not a separate persona selector. A namespace not selected by the persona is absent from the SDK and its documentation index.
|
|
52
54
|
|
|
53
55
|
An empty list disables every persona-controlled host tool:
|
|
54
56
|
|
|
@@ -56,7 +58,7 @@ An empty list disables every persona-controlled host tool:
|
|
|
56
58
|
tools: []
|
|
57
59
|
```
|
|
58
60
|
|
|
59
|
-
It does not remove intrinsic `tau_docs
|
|
61
|
+
It does not remove intrinsic `tau_docs`. It also does not select client-provided tools, which are advertised independently by an observing client.
|
|
60
62
|
|
|
61
63
|
The `nook` name has an additional eligibility check: the effective host configuration must contain a Nook target. Without one, Tau does not register the tool even if the persona lists it. Other credentials and service configuration can affect what an enabled tool can do, but not whether its schema is selected. Persona configuration is covered in [personas](personas.md).
|
|
62
64
|
|
|
@@ -72,16 +74,6 @@ index.md
|
|
|
72
74
|
|
|
73
75
|
Then follow paths linked by that page. The tool description also advertises built-in command-line tools with capability summaries and dedicated documentation paths. Agents may read those pages directly when a tool is relevant, without first loading the index. Use of these utilities is optional and depends on the execution environment's prerequisites. Unknown paths are rejected. The corpus describes supported Tau contracts, not the current effective configuration of a particular session, so use configuration inspection or debug output when the answer depends on local state.
|
|
74
76
|
|
|
75
|
-
## Main-session goal tools
|
|
76
|
-
|
|
77
|
-
The main agent always receives:
|
|
78
|
-
|
|
79
|
-
- `get_goal`, which reads the persisted session goal or returns no goal.
|
|
80
|
-
- `create_goal`, which creates an active goal only when the user or an active instruction explicitly requests one.
|
|
81
|
-
- `update_goal`, which changes, completes, or blocks the current goal.
|
|
82
|
-
|
|
83
|
-
These tools are outside persona allowlists because goal lifecycle is a session capability. They are not included in subagent registries or advertised by clients. Goal behavior is described in [sessions](sessions.md).
|
|
84
|
-
|
|
85
77
|
## Execution-environment tools
|
|
86
78
|
|
|
87
79
|
### Bash
|
|
@@ -147,65 +139,65 @@ The supported formats are JPEG, PNG, and WebP. Source reads are capped at 50 MiB
|
|
|
147
139
|
|
|
148
140
|
Each guide covers setup, input, examples, outputs, and failure behavior. Use `tau tool --help` to list commands or `tau tool <command> --help` for command-specific help. The same guides are packaged for `tau_docs` and linked from its `index.md`.
|
|
149
141
|
|
|
150
|
-
## Code-mode
|
|
142
|
+
## Code-mode composition
|
|
143
|
+
|
|
144
|
+
`code` runs a one-shot JavaScript program that composes enabled capabilities through `tau.web`, `tau.history`, `tau.nook`, `tau.mcp`, `tau.bash`, and `tau.models`. Direct Bash, write, edit, and image-viewing tools remain available independently.
|
|
151
145
|
|
|
152
|
-
|
|
146
|
+
### Documentation and output
|
|
153
147
|
|
|
154
|
-
|
|
148
|
+
When the runtime guide is not already visible, the agent first runs a documentation-only program:
|
|
155
149
|
|
|
156
150
|
```js
|
|
157
|
-
|
|
151
|
+
printText(docs);
|
|
158
152
|
```
|
|
159
153
|
|
|
160
|
-
The
|
|
161
|
-
|
|
162
|
-
Code-mode programs have no direct process, environment, credential, import, timer, network, or `fetch` access. They can call only the named API and use agent-scoped scratch files exposed by the runtime. Programs default to 60 seconds (MCP: 15 minutes), allow 128 API requests with eight unresolved at once, and limit each serialized payload to 16 MiB. Undefined object properties are omitted from API arguments; undefined arguments and array entries are invalid. Console output is middle-truncated above roughly 8,192 estimated tokens.
|
|
163
|
-
|
|
164
|
-
`await image({ type: "image", data, mimeType })` forwards a base64 image without files. Calls must be awaited before the program exits. JPEG, PNG, and WebP bytes must match the declared MIME type and fit the 16 MiB JSON bridge limit. Source images are limited to 40 megapixels; each program may forward 16 images. Images are resized or re-encoded to fit within 4,096 pixels per dimension and 3.5 MiB each. Adjacent console writes form one text block; awaited images separate the text before and after them. Text truncation keeps images in place. Invalid blocks reject and can be caught. Built-in tools retain valid images if the program later fails.
|
|
154
|
+
The guide covers runtime rules, capabilities, and composition examples. The agent retrieves any unseen capability reference in a separate documentation-only call:
|
|
165
155
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
`web` is for open-web search and webpage extraction when repository data, a purpose-built CLI, a first-party API or SDK, or another structured source cannot answer the task. For GitHub issues, pull requests, releases, and repository metadata, use `gh`; for checked-out source and history, use Git.
|
|
171
|
-
|
|
172
|
-
Web discovery can inspect an ordinary URL through the execution environment without an Exa credential. Search and content extraction require an effective Exa API key. The tool's documentation explains the discovery-first flow and when to retrieve advertised agent-friendly resources with Bash instead of webpage extraction. See [credentials](credentials.md) for key resolution.
|
|
173
|
-
|
|
174
|
-
### History
|
|
156
|
+
```js
|
|
157
|
+
printText(await tau.docs("web"));
|
|
158
|
+
```
|
|
175
159
|
|
|
176
|
-
|
|
160
|
+
The agent reuses visible documentation. MCP descriptions and Nook's authoring guide have separate discovery steps. Programs need not print intermediate results.
|
|
177
161
|
|
|
178
|
-
|
|
162
|
+
Only `printText(string)` and awaited `printImage({ data, mimeType })` emit output, in emission order; return values are ignored. Text is middle-truncated to `maxOutputTokens` (default 8,192; range 1–65,536). The agent leaves it unset unless needed, requesting up to 16,384 autonomously; higher budgets require an explicit user request. Truncated built-in text is saved to a temporary execution-environment file when possible, with its path reported. Read it rather than repeat side effects. Files exclude images and text lost to capture limits.
|
|
179
163
|
|
|
180
|
-
|
|
164
|
+
JPEG, PNG, and WebP images are validated outside the sandbox and prepared within 4,096 pixels per dimension and 3.5 MiB each. Sources are limited to 40 megapixels and 16 images per program. Valid images survive built-in program failure.
|
|
181
165
|
|
|
182
|
-
`
|
|
166
|
+
The pure globals `truncate(text, { maxChars, position? })` and `truncateLines(text, { maxLines, position? })` return bounded strings with omission markers. Position defaults to `middle`; `start` and `end` retain the corresponding edge. They do not print automatically.
|
|
183
167
|
|
|
184
|
-
|
|
168
|
+
```js
|
|
169
|
+
const result = await tau.bash.run({ command: "npm test" });
|
|
170
|
+
printText(truncate(result.stdout, { maxChars: 4000 }));
|
|
171
|
+
```
|
|
185
172
|
|
|
186
|
-
###
|
|
173
|
+
### Execution and limits
|
|
187
174
|
|
|
188
|
-
|
|
175
|
+
Programs have no ambient filesystem, process, environment, credential, import, timer, network, or fetch access. Capabilities supply authority; variables hold data and Bash handles files. No scratch-file API.
|
|
189
176
|
|
|
190
|
-
|
|
177
|
+
`code` defaults to 5 minutes; `timeout` accepts 1–900,000 ms (15 minutes). `tau.bash.run` defaults to 60 seconds, capped at 5 minutes and the enclosing deadline. Programs allow 128 API requests, eight concurrent. Serialized requests and responses are capped at 64 MiB. Undefined object properties are omitted; undefined arguments and array entries are rejected. Programs are not retried; failure or cancellation does not undo actions.
|
|
191
178
|
|
|
192
|
-
|
|
179
|
+
### Capabilities
|
|
193
180
|
|
|
194
|
-
|
|
181
|
+
- `tau.web`: metadata discovery, Exa search, and page content retrieval. The agent prefers local data, purpose-built CLIs, first-party APIs, and structured sources over web extraction. GitHub operations use gh or checked-out Git where suitable. Metadata discovery does not need an Exa key; search and content retrieval do.
|
|
182
|
+
- `tau.history`: read-only search and paginated transcript access. The agent uses it only when explicitly instructed to consult historical sessions. Historical content is untrusted data, not instructions. See [history](history.md).
|
|
183
|
+
- `tau.nook`: site deployment, templates, and site-scoped JSON KV. The agent uses it for user-requested publishing or Nook management. App authoring requires reading `tau.nook.skill()` in a separate documentation-only call first. See [Nook](nook.md).
|
|
184
|
+
- `tau.mcp`: discovery and invocation of connected tools and resources. The agent reads each tool's description and schema before calling it. Connections are shared and lazy; mutations are not retried. `isError` is result data; protocol failures throw. Existing MCP server configuration and trust rules apply. See [configuration reference](config-reference.md#mcpservers) and [security](security.md#trust-mcp-servers).
|
|
185
|
+
- `tau.bash`: `run`, `start`, `list`, `read`, `wait`, and `stop`. `run` returns stdout/stderr and exit/termination fields with a 24 MiB capture bound. Overflow keeps a tail; check `truncated` before parsing. Optional UTF-8 `stdin` is limited to 16 MiB and closed after writing (EOF); omitted input is unavailable, `""` is empty. `start` has no stdin. Background jobs share the direct tools' registry and bounded output tails. Jobs survive program exit and interruption; foreground work is cancelled. Shell rules above apply.
|
|
186
|
+
- `tau.models`: lists fixed OpenRouter model choices and performs standalone chat or typed decisions. No session conversation or tools are inherited. Chat media accepts either paths on the agent's machine or inline padded base64 with a matching MIME type. Credentials stay with the host. Provider usage metadata is returned, but external model charges are not included in session cumulative cost or usage logs. Requests are cancellable and not automatically retried. Input, model, media, response, and request limits match [OpenRouter](openrouter.md); inspect completion/refusal status rather than assuming every response is a complete answer.
|
|
195
187
|
|
|
196
|
-
|
|
188
|
+
SDK and command client tools use the same sandbox globals and output contract with their own explicitly declared APIs. Their default program deadline is 60 seconds unless configured otherwise.
|
|
197
189
|
|
|
198
190
|
## Subagent tool eligibility
|
|
199
191
|
|
|
200
192
|
A subagent can receive only:
|
|
201
193
|
|
|
202
194
|
```text
|
|
203
|
-
bash write edit view_image web history nook mcp
|
|
195
|
+
bash write edit view_image web history nook mcp models
|
|
204
196
|
```
|
|
205
197
|
|
|
206
|
-
Tau inherits the intersection of the main persona’s tools and those
|
|
198
|
+
Tau inherits the intersection of the main persona’s tools and those nine eligible names. `tau_docs` is then added intrinsically. There is no separate child tool selection. Nook and MCP require configuration; MCP uses the parent's host connections.
|
|
207
199
|
|
|
208
|
-
Subagents do not receive
|
|
200
|
+
Subagents do not receive subagent-management tools or client-provided tools. Their Bash and file tools are scoped to the subagent working directory, including an alternate directory selected at launch. See [subagents](subagents.md) for configuration and working-directory context rebuilding.
|
|
209
201
|
|
|
210
202
|
## Client-owned tools
|
|
211
203
|
|
|
@@ -239,7 +231,7 @@ First identify which owner should provide it:
|
|
|
239
231
|
- For a host tool, inspect the active persona's `tools`, effective host configuration, and service credentials.
|
|
240
232
|
- For a subagent tool, inspect both the subagent's explicit list and the eligible inherited set.
|
|
241
233
|
- For a client tool, confirm that an observing client advertises it and that client tools were not disabled.
|
|
242
|
-
- For `tau_docs
|
|
234
|
+
- For `tau_docs`, a missing schema indicates a runtime or version problem rather than a persona setting.
|
|
243
235
|
|
|
244
236
|
Then check the execution boundary named in the error. A path that exists on the TUI client may not exist in the execution environment. A command available in the host's `PATH` may not be available in the execution environment's login shell. Client process errors belong to the client machine, while `executionEnvironment.exec` errors belong to the session machine.
|
|
245
237
|
|
|
@@ -124,7 +124,7 @@ For a subagent, check these three gates:
|
|
|
124
124
|
|
|
125
125
|
An already spawned thread keeps its captured model, tools, and working directory after reload. Recovery does not restore subagent threads, so old agent IDs cannot receive follow-ups after a host restart. Use `list_agents` to inspect live records. See [subagents](subagents.md).
|
|
126
126
|
|
|
127
|
-
For `tau_docs
|
|
127
|
+
For `tau_docs`, absence indicates a host runtime or version problem, not a persona list. Confirm the host package and restart it.
|
|
128
128
|
|
|
129
129
|
## A command client tool is missing or fails
|
|
130
130
|
|
|
@@ -219,7 +219,7 @@ Without `--session` or `--new`, attach needs a TTY for its selector. In automati
|
|
|
219
219
|
|
|
220
220
|
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 API definitions, credentials, local directory, or Sprite. Never edit session JSON to substitute a target or `cwd`.
|
|
221
221
|
|
|
222
|
-
Recovery returns idle, aborts unfinished turns, cancels running maintenance, removes live subagents
|
|
222
|
+
Recovery returns idle, aborts unfinished turns, cancels running maintenance, and removes live subagents. Review the last assistant and tools, then safely check `!!pwd` and `!!git status --short`. Retry continues current history without rerunning completed tools automatically.
|
|
223
223
|
|
|
224
224
|
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.
|
|
225
225
|
|
|
@@ -52,9 +52,9 @@ When Tau is idle, Enter and Ctrl+Enter both start a normal turn. While a turn is
|
|
|
52
52
|
|
|
53
53
|
Pending input is session state shared by attached clients while the host remains alive. It is not durable across host restart or session recovery. A queued turn captures the persona, reasoning, tools, and model settings when that turn actually starts. Steering remains part of the active logical turn and keeps the settings captured when that turn began.
|
|
54
54
|
|
|
55
|
-
Escape interrupts foreground client work or the main session’s active work. If a local diff review,
|
|
55
|
+
Escape interrupts foreground client work or the main session’s active work. If a local diff review, voice input, or speech playback task owns the foreground, Escape stops that task first; otherwise it requests main-session interruption from the host, including cancellation of a running manual compaction. Once compaction has replaced model context, a late interruption does not undo it or turn successful persistence into a failure. It does not stop independently running supervised subagents; select one with Alt+Down and use Ctrl+G. Press Escape twice to clear the current editor text.
|
|
56
56
|
|
|
57
|
-
Press Enter twice on an empty editor to retry from the current session history. Retry does not rewind or duplicate the last user message.
|
|
57
|
+
Press Enter twice on an empty editor to retry from the current session history. Retry does not rewind or duplicate the last user message.
|
|
58
58
|
|
|
59
59
|
## Choose persona, reasoning, and thought visibility
|
|
60
60
|
|
|
@@ -88,7 +88,6 @@ Then use Shift+Tab to select an allowed reasoning level. Newly added personas do
|
|
|
88
88
|
| `/exit` | Close this TUI. It detaches from a long-running remote host rather than deleting the session. |
|
|
89
89
|
| `/rewind` | Pick an earlier user message, remove it and everything after it, and return its text to the editor. |
|
|
90
90
|
| `/diff [git diff args...]` | Open the client-local diff review tool for a snapshot captured from the execution environment. |
|
|
91
|
-
| `/goal [objective\|resume\|clear]` | Show, start, resume, or clear the persistent session goal. |
|
|
92
91
|
| `/compact-all [guidance]` | Replace model context with a generated summary. |
|
|
93
92
|
| `/compact-keep-last [guidance]` | Generate a summary that also includes the previous last assistant response when available. |
|
|
94
93
|
| `/reload` | Reload session-owned configuration and content from the execution environment. |
|
|
@@ -101,9 +100,9 @@ Then use Shift+Tab to select an allowed reasoning level. Newly added personas do
|
|
|
101
100
|
| `/prompt:<id>` | Resolve a prompt from the execution environment and place it in the editor without submitting it. |
|
|
102
101
|
| `/theme:<id>` | Switch this TUI’s theme for the current run. |
|
|
103
102
|
|
|
104
|
-
Commands that mutate context, such as persona changes, compaction, rewind, and reload, should be run while idle. `/
|
|
103
|
+
Commands that mutate context, such as persona changes, compaction, rewind, and reload, should be run while idle. `/auto-speak`, `/listen`, `/prompt:<id>`, and `/exit` have limited useful behavior during a running turn. Ordinary command submissions are otherwise held back until Tau is idle.
|
|
105
104
|
|
|
106
|
-
Compaction, rewind,
|
|
105
|
+
Compaction, rewind, recovery, and retry are described in [sessions](sessions.md). Prompt discovery and insertion are covered in [prompts and project context](prompts-and-project-context.md).
|
|
107
106
|
|
|
108
107
|
## Keyboard shortcuts
|
|
109
108
|
|
|
@@ -174,13 +173,15 @@ The TUI also advertises diff review as a client tool unless `--no-client-tools`
|
|
|
174
173
|
|
|
175
174
|
## Use speech
|
|
176
175
|
|
|
177
|
-
`/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
|
|
176
|
+
`/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 or at the 9-minute recording limit. The Gemini limit leaves time for setup and finalization within its 10-minute live session. Startup fails if the microphone produces no audio within 15 seconds. Pressing Enter or Ctrl+Enter while recording stops capture, finishes transcription, and submits the finalized editor text. While a turn is active, Enter steers it and Ctrl+Enter queues another turn, just like normal editor submission. Pressing Ctrl+Y again or reaching the recording limit finishes transcription and inserts the transcript at the cursor for review without submitting it.
|
|
178
177
|
|
|
179
178
|
The recording shortcut is configurable with [`speech.recordingShortcut`](config-reference.md#speech), including single-press and double-tap printable keys such as `§`. The editor hint shows the configured gesture. Starting a recording stops speech playback.
|
|
180
179
|
|
|
181
180
|
`/auto-speak` toggles automatic reading of successful final answers. `/auto-speak on` and `/auto-speak off` explicitly select the mode; turning it off also stops current playback. It starts off and applies only to the current session in this TUI, including when attached remotely. `/new` resets it. It does not change other clients or replay historical answers. Commentary, tool activity, and failed or interrupted answers are not automatically spoken. Responses arriving while recording or playing speech are not queued for later playback. Escape stops playback without disabling the mode. Automatic playback uses the same voice, credentials, and rewriting as `/speak`; it does not open the microphone or automatically submit dictation.
|
|
182
181
|
|
|
183
|
-
Gemini displays a replaceable live preview in muted italic text at the original cursor position. Finalized dictation uses normal text once transcription settles. Its final transcript replaces the preview without duplication. Submitting a draft containing finalized dictation includes hidden guidance that some or all of the message may have been transcribed from speech and may contain transcription errors. The guidance remains after edits and clears when the draft is emptied. Editing stays disabled from recording startup through finalization, and
|
|
182
|
+
Gemini displays a replaceable live preview in muted italic text at the original cursor position. Automatic voice activity detection finalizes speech segments during pauses while recording continues. Tau preserves finalized segments and replaces only the current interim preview. When recording stops, Tau signals the end of audio and keeps receiving live results until three seconds pass without transcription or speech-activity updates. If a new speech activity is detected after stopping, Tau signals the end of audio again to flush it. The final transcript comes from the live stream; normal recording does not upload the saved WAV for a second transcription. Finalized dictation uses normal text once transcription settles. Its final transcript replaces the preview without duplication. Submitting a draft containing finalized dictation includes hidden guidance that some or all of the message may have been transcribed from speech and may contain transcription errors. The guidance remains after edits and clears when the draft is emptied. Editing stays disabled from recording startup through finalization. Escape cancels voice input during startup, recording, microphone shutdown, transcription, or retry. Cancellation immediately removes the preview, restores the original draft, and re-enables editing without inserting or submitting speech. The cancelled recording is deleted after pending capture or file work settles. Failure also restores the original draft. Recording and retries cannot start while another editor update is pending.
|
|
183
|
+
|
|
184
|
+
A completed empty transcription inserts nothing. Tau does not detect silence locally or infer recording completion from live speech-segment notifications. Known unfinished speech must finalize before Tau accepts the result. Live finalization has a 30-second deadline; Escape cancels this wait.
|
|
184
185
|
|
|
185
186
|
If transcription fails, Tau retains the local WAV and reports its path. Run `/listen retry` to transcribe the same audio again with Gemini and the current conversation context, or `/listen discard` to delete it. Retained recordings longer than 20 minutes are rejected rather than sent to the provider. A replacement recording deletes the retained file only after the new capture starts producing audio. Tau keeps at most one failed recording, and exiting leaves that file at the reported path for manual recovery. For live transcription, GPT-6 Luna extracts spelling hints from recent conversation while recording begins, with reasoning disabled. Tau buffers audio until the transcription session is ready and then streams subsequent audio. Gemini uses `gemini-3.5-transcribe-live` in verbatim mode with English (`en-US`) and Finnish (`fi-FI`) language hints. Missing OpenAI credentials or hint extraction failure does not fail transcription. On retry, Gemini uploads the retained recording for `gemini-3.5-transcribe` verbatim transcription with the same language hints and attempts to delete the remote file afterward.
|
|
186
187
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TOOL_NAME_BASH, TOOL_NAME_EDIT, TOOL_NAME_HISTORY, TOOL_NAME_MCP, TOOL_NAME_NOOK, TOOL_NAME_SPAWN_AGENT, TOOL_NAME_VIEW_IMAGE, TOOL_NAME_WEB, TOOL_NAME_WRITE, } from "../tools/tool_names.js";
|
|
1
|
+
import { TOOL_NAME_BASH, TOOL_NAME_EDIT, TOOL_NAME_HISTORY, TOOL_NAME_MCP, TOOL_NAME_MODELS, TOOL_NAME_NOOK, TOOL_NAME_SPAWN_AGENT, TOOL_NAME_VIEW_IMAGE, TOOL_NAME_WEB, TOOL_NAME_WRITE, } from "../tools/tool_names.js";
|
|
2
2
|
const INHERITABLE_TOOL_NAMES = new Set([
|
|
3
3
|
TOOL_NAME_BASH,
|
|
4
4
|
TOOL_NAME_WRITE,
|
|
@@ -7,6 +7,7 @@ const INHERITABLE_TOOL_NAMES = new Set([
|
|
|
7
7
|
TOOL_NAME_WEB,
|
|
8
8
|
TOOL_NAME_HISTORY,
|
|
9
9
|
TOOL_NAME_MCP,
|
|
10
|
+
TOOL_NAME_MODELS,
|
|
10
11
|
TOOL_NAME_NOOK,
|
|
11
12
|
]);
|
|
12
13
|
function normalizeTools(tools) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/subagents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAIhC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAmB;IACvD,cAAc;IACd,eAAe;IACf,cAAc;IACd,oBAAoB;IACpB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,cAAc;CACf,CAAC,CAAC;AAEH,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IACzC,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAgB;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAChC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAwB,CAAC,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,IAAwB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAID,MAAM,UAAU,gCAAgC,CAAC,IAGhD;IACC,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;IAClD,CAAC;IACD,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;QACpD,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,gCAAgC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,MAAM,CAAC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAClD,MAAM,gBAAgB,GACpB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE5F,OAAO;QACL,EAAE;QACF,EAAE;QACF,eAAe;QACf,EAAE;QACF,4NAA4N;QAC5N,EAAE;QACF,sBAAsB,SAAS,CAAC,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,SAAS,IAAI;QACrF,4BAA4B,gBAAgB,EAAE;QAC9C,EAAE;QACF,+EAA+E;KAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/subagents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAIhC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAmB;IACvD,cAAc;IACd,eAAe;IACf,cAAc;IACd,oBAAoB;IACpB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,cAAc;CACf,CAAC,CAAC;AAEH,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IACzC,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAgB;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAChC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAwB,CAAC,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,IAAwB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAID,MAAM,UAAU,gCAAgC,CAAC,IAGhD;IACC,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;IAClD,CAAC;IACD,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;QACpD,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,gCAAgC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,MAAM,CAAC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAClD,MAAM,gBAAgB,GACpB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE5F,OAAO;QACL,EAAE;QACF,EAAE;QACF,eAAe;QACf,EAAE;QACF,4NAA4N;QAC5N,EAAE;QACF,sBAAsB,SAAS,CAAC,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,SAAS,IAAI;QACrF,4BAA4B,gBAAgB,EAAE;QAC9C,EAAE;QACF,+EAA+E;KAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TOOL_NAME_BASH, TOOL_NAME_EDIT, TOOL_NAME_HISTORY, TOOL_NAME_MCP, TOOL_NAME_NOOK, TOOL_NAME_VIEW_IMAGE, TOOL_NAME_WEB, TOOL_NAME_WRITE, } from "../tools/tool_names.js";
|
|
1
|
+
import { TOOL_NAME_BASH, TOOL_NAME_EDIT, TOOL_NAME_HISTORY, TOOL_NAME_MCP, TOOL_NAME_MODELS, TOOL_NAME_NOOK, TOOL_NAME_VIEW_IMAGE, TOOL_NAME_WEB, TOOL_NAME_WRITE, } from "../tools/tool_names.js";
|
|
2
2
|
export const SUBAGENT_TOOL_NAMES = [
|
|
3
3
|
TOOL_NAME_BASH,
|
|
4
4
|
TOOL_NAME_WRITE,
|
|
@@ -7,6 +7,7 @@ export const SUBAGENT_TOOL_NAMES = [
|
|
|
7
7
|
TOOL_NAME_WEB,
|
|
8
8
|
TOOL_NAME_HISTORY,
|
|
9
9
|
TOOL_NAME_MCP,
|
|
10
|
+
TOOL_NAME_MODELS,
|
|
10
11
|
TOOL_NAME_NOOK,
|
|
11
12
|
];
|
|
12
13
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/subagents/types.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,cAAc;IACd,eAAe;IACf,cAAc;IACd,oBAAoB;IACpB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,cAAc;CACN,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/subagents/types.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,cAAc;IACd,eAAe;IACf,cAAc;IACd,oBAAoB;IACpB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,cAAc;CACN,CAAC"}
|
|
@@ -328,16 +328,11 @@ function formatSessionStatus(session, project, snapshot, preferredProjectId) {
|
|
|
328
328
|
if (!snapshot) {
|
|
329
329
|
return `${status}${preferenceStatus}`;
|
|
330
330
|
}
|
|
331
|
-
const goalStatus = snapshot.goal
|
|
332
|
-
? snapshot.goal.status === "active"
|
|
333
|
-
? " it is pursuing a goal."
|
|
334
|
-
: " its goal is blocked."
|
|
335
|
-
: "";
|
|
336
331
|
const model = snapshot.bootstrap.model.name || snapshot.bootstrap.model.id;
|
|
337
332
|
const reasoning = snapshot.settings.reasoning ?? "none";
|
|
338
333
|
const context = formatTelegramContextUsage(snapshot);
|
|
339
334
|
const cost = formatTelegramSessionCost(getTelegramSessionCostTotal(snapshot));
|
|
340
|
-
return `${status}
|
|
335
|
+
return `${status} it is using ${model} with ${reasoning} reasoning. context usage is ${context}. cumulative cost is ${cost}.${preferenceStatus}`;
|
|
341
336
|
}
|
|
342
337
|
function ensureTerminalPunctuation(text) {
|
|
343
338
|
const trimmed = text.trim();
|