tau-coding-agent 0.4.0__tar.gz → 0.4.5__tar.gz

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 (350) hide show
  1. {tau_coding_agent-0.4.0/tau_coding_agent.egg-info → tau_coding_agent-0.4.5}/PKG-INFO +3 -3
  2. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/README.md +2 -2
  3. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/architecture.md +12 -5
  4. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/cli-reference.md +15 -7
  5. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/extensions.md +88 -8
  6. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/keybindings.md +8 -3
  7. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/messages.md +6 -0
  8. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/project-structure.md +27 -29
  9. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/python-api.md +10 -2
  10. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/sessions.md +40 -6
  11. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/settings.md +10 -3
  12. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/tools.md +36 -10
  13. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/usage.md +2 -1
  14. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/pyproject.toml +2 -2
  15. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/prompt/builder.py +2 -1
  16. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/service.py +208 -85
  17. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/types.py +2 -0
  18. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/__init__.py +7 -0
  19. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/model.py +25 -0
  20. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/text.py +62 -0
  21. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/edit.py +87 -84
  22. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/glob.py +21 -27
  23. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/grep.py +22 -66
  24. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/ls.py +3 -20
  25. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/read.py +16 -19
  26. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/terminal.py +45 -33
  27. tau_coding_agent-0.4.5/tau/builtins/tools/utils.py +129 -0
  28. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/write.py +6 -12
  29. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/commands/registry.py +33 -10
  30. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/cli.py +66 -10
  31. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/packages.py +13 -4
  32. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/update.py +43 -10
  33. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/core/registry.py +2 -0
  34. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/engine/service.py +84 -103
  35. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/engine/types.py +3 -2
  36. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/api.py +3 -1
  37. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/context.py +54 -9
  38. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/runtime.py +1 -0
  39. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/__init__.py +12 -0
  40. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/engine.py +21 -0
  41. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/service.py +7 -6
  42. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/session.py +49 -2
  43. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/types.py +12 -0
  44. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_claude_code.py +1 -0
  45. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_messages.py +1 -0
  46. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_vertex.py +1 -0
  47. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/gemini_generate.py +2 -0
  48. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/github_copilot_chat.py +1 -0
  49. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_antigravity.py +1 -0
  50. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_vertex.py +3 -3
  51. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/mistral_chat.py +1 -0
  52. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_codex_responses.py +1 -0
  53. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_completions.py +1 -0
  54. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_responses.py +1 -0
  55. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_vertex.py +1 -3
  56. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/model/types.py +3 -4
  57. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/types.py +1 -0
  58. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/utils.py +1 -0
  59. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/message/types.py +1 -0
  60. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/message/utils.py +5 -2
  61. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/agent_hooks.py +8 -8
  62. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/app.py +102 -45
  63. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/appearance.py +63 -82
  64. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/auth.py +14 -4
  65. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/extensions.py +1 -3
  66. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/session.py +9 -5
  67. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/config_selector.py +13 -5
  68. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/extension_selector.py +1 -1
  69. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/layout.py +37 -218
  70. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/message_list.py +140 -28
  71. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/model_selector.py +6 -6
  72. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/oauth_selector.py +6 -2
  73. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/overlays.py +3 -2
  74. tau_coding_agent-0.4.5/tau/modes/interactive/components/selector_controller.py +203 -0
  75. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/session_selector.py +1 -0
  76. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/settings_selector.py +4 -3
  77. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/theme_selector.py +3 -4
  78. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/thinking_selector.py +8 -7
  79. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/tree_selector.py +1 -2
  80. tau_coding_agent-0.4.0/tau/tui/input.py → tau_coding_agent-0.4.5/tau/modes/interactive/input_handler.py +4 -934
  81. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/rpc/mode.py +8 -8
  82. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/manager.py +68 -5
  83. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/types.py +1 -0
  84. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/utils.py +50 -5
  85. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/runtime/service.py +170 -61
  86. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/runtime/types.py +93 -25
  87. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/branch_summarization.py +74 -32
  88. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/compaction.py +111 -22
  89. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/manager.py +79 -47
  90. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/utils.py +5 -1
  91. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/manager.py +12 -3
  92. tau_coding_agent-0.4.5/tau/settings/paths.py +347 -0
  93. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/types.py +8 -1
  94. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/skills/registry.py +1 -1
  95. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/themes/loader.py +10 -12
  96. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/themes/registry.py +10 -0
  97. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/registry.py +27 -15
  98. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/types.py +10 -1
  99. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/manager.py +6 -4
  100. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/utils.py +2 -4
  101. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/autocomplete.py +6 -4
  102. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/editor.py +1 -0
  103. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/select_list.py +2 -4
  104. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/spinner.py +5 -0
  105. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/text_input.py +23 -3
  106. tau_coding_agent-0.4.5/tau/tui/input.py +933 -0
  107. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/keybinding_hints.py +1 -0
  108. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/markdown.py +13 -7
  109. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/terminal.py +0 -1
  110. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/tui.py +25 -2
  111. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/ui_context.py +21 -4
  112. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/utils.py +8 -9
  113. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5/tau_coding_agent.egg-info}/PKG-INFO +3 -3
  114. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/SOURCES.txt +14 -0
  115. tau_coding_agent-0.4.5/tests/test_agent_compaction.py +264 -0
  116. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_agent_types.py +4 -1
  117. tau_coding_agent-0.4.5/tests/test_branch_navigation.py +127 -0
  118. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_branch_summarization.py +105 -11
  119. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_builtin_tools.py +217 -75
  120. tau_coding_agent-0.4.5/tests/test_cli_inputs.py +40 -0
  121. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_command_registry.py +16 -1
  122. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_compaction.py +111 -8
  123. tau_coding_agent-0.4.5/tests/test_engine_execution.py +78 -0
  124. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_engine_steering.py +10 -0
  125. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_extension_api.py +109 -0
  126. tau_coding_agent-0.4.5/tests/test_footer_model.py +86 -0
  127. tau_coding_agent-0.4.5/tests/test_package_resources.py +66 -0
  128. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_packages_utils.py +40 -5
  129. tau_coding_agent-0.4.5/tests/test_selector_controller.py +36 -0
  130. tau_coding_agent-0.4.5/tests/test_session_manager.py +97 -0
  131. tau_coding_agent-0.4.5/tests/test_text_input.py +17 -0
  132. tau_coding_agent-0.4.5/tests/test_thinking_render.py +53 -0
  133. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tool_registry.py +12 -0
  134. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tool_render.py +37 -0
  135. tau_coding_agent-0.4.5/tests/test_ui_context.py +42 -0
  136. tau_coding_agent-0.4.0/tau/settings/paths.py +0 -171
  137. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/LICENSE +0 -0
  138. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/MANIFEST.in +0 -0
  139. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
  140. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/auth.md +0 -0
  141. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/development.md +0 -0
  142. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/docs.json +0 -0
  143. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/extension-settings.md +0 -0
  144. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/http-proxy.md +0 -0
  145. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/index.md +0 -0
  146. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/inference-providers.md +0 -0
  147. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/installation.md +0 -0
  148. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/project-context.md +0 -0
  149. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/prompts.md +0 -0
  150. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/quickstart.md +0 -0
  151. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/skills.md +0 -0
  152. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/themes.md +0 -0
  153. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/setup.cfg +0 -0
  154. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/__init__.py +0 -0
  155. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/__init__.py +0 -0
  156. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/prompt/__init__.py +0 -0
  157. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/prompt/types.py +0 -0
  158. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/auth/manager.py +0 -0
  159. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/auth/storage.py +0 -0
  160. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/auth/types.py +0 -0
  161. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/__init__.py +0 -0
  162. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/__init__.py +0 -0
  163. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/clear.py +0 -0
  164. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/compact.py +0 -0
  165. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/reload.py +0 -0
  166. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/session.py +0 -0
  167. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/git.py +0 -0
  168. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/utils.py +0 -0
  169. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/header/__init__.py +1 -1
  170. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/__init__.py +0 -0
  171. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/audio.py +0 -0
  172. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/image.py +0 -0
  173. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/video.py +0 -0
  174. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/commit.md +0 -0
  175. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/docs.md +0 -0
  176. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/explain.md +0 -0
  177. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/fix.md +0 -0
  178. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/refactor.md +0 -0
  179. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/review.md +0 -0
  180. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/test.md +0 -0
  181. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/__init__.py +0 -0
  182. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/audio.py +0 -0
  183. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/image.py +0 -0
  184. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/text.py +0 -0
  185. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/video.py +0 -0
  186. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/skills/code-review/SKILL.md +0 -0
  187. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/skills/debug/SKILL.md +0 -0
  188. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  189. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/themes/dark.yaml +0 -0
  190. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/themes/light.yaml +0 -0
  191. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/__init__.py +0 -0
  192. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/commands/__init__.py +0 -0
  193. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/commands/types.py +0 -0
  194. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/__init__.py +0 -0
  195. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/__init__.py +0 -0
  196. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/auth.py +0 -0
  197. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/core/__init__.py +0 -0
  198. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/engine/__init__.py +0 -0
  199. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/__init__.py +0 -0
  200. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/loader.py +0 -0
  201. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/settings.py +0 -0
  202. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/inference.py +0 -0
  203. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/runtime.py +0 -0
  204. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/tui.py +0 -0
  205. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/__init__.py +0 -0
  206. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/__init__.py +0 -0
  207. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/__init__.py +0 -0
  208. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/base.py +0 -0
  209. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/builtins.py +0 -0
  210. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  211. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/gemini_audio.py +0 -0
  212. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/openai_audio.py +0 -0
  213. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/registry.py +0 -0
  214. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/sarvam_audio.py +0 -0
  215. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/service.py +0 -0
  216. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/utils.py +0 -0
  217. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/availability.py +0 -0
  218. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/__init__.py +0 -0
  219. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/base.py +0 -0
  220. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/builtins.py +0 -0
  221. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/gemini_image.py +0 -0
  222. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/openai_image.py +0 -0
  223. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/openrouter.py +0 -0
  224. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/registry.py +0 -0
  225. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/service.py +0 -0
  226. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/registry.py +0 -0
  227. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/__init__.py +0 -0
  228. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/base.py +0 -0
  229. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/builtins.py +0 -0
  230. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/ollama_chat.py +0 -0
  231. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/registry.py +0 -0
  232. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/service.py +0 -0
  233. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/types.py +0 -0
  234. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/utils.py +0 -0
  235. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/__init__.py +0 -0
  236. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/base.py +0 -0
  237. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/builtins.py +0 -0
  238. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/fal_video.py +0 -0
  239. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/openrouter_video.py +0 -0
  240. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/registry.py +0 -0
  241. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/service.py +0 -0
  242. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/model/__init__.py +0 -0
  243. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/model/registry.py +0 -0
  244. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/__init__.py +0 -0
  245. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/__init__.py +0 -0
  246. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
  247. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/github_copilot.py +0 -0
  248. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/google_antigravity.py +0 -0
  249. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/openai_codex.py +0 -0
  250. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/pkce.py +0 -0
  251. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/types.py +0 -0
  252. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/utils.py +0 -0
  253. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/registry.py +0 -0
  254. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/types.py +0 -0
  255. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/message/__init__.py +0 -0
  256. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/__init__.py +0 -0
  257. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/__init__.py +0 -0
  258. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/__init__.py +0 -0
  259. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/context.py +1 -1
  260. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/misc.py +0 -0
  261. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/model.py +0 -0
  262. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/__init__.py +0 -0
  263. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/command_palette.py +0 -0
  264. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/file_picker.py +1 -1
  265. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/trust_screen.py +0 -0
  266. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/print/__init__.py +0 -0
  267. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/rpc/__init__.py +0 -0
  268. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/rpc/types.py +0 -0
  269. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/__init__.py +0 -0
  270. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/expand.py +0 -0
  271. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/loader.py +0 -0
  272. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/registry.py +0 -0
  273. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/types.py +0 -0
  274. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/types.py +0 -0
  275. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/storage.py +0 -0
  276. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/utils.py +0 -0
  277. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/skills/loader.py +0 -0
  278. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/skills/types.py +0 -0
  279. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/themes/types.py +0 -0
  280. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/__init__.py +0 -0
  281. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/render.py +0 -0
  282. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/__init__.py +0 -0
  283. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/types.py +0 -0
  284. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/__init__.py +0 -0
  285. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/component.py +0 -0
  286. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/__init__.py +0 -0
  287. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/box.py +1 -1
  288. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/image.py +0 -0
  289. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/theme.py +0 -0
  290. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/__init__.py +0 -0
  291. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/http_proxy.py +0 -0
  292. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/image_processing.py +0 -0
  293. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/secrets.py +0 -0
  294. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/version_check.py +0 -0
  295. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  296. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  297. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/requires.txt +0 -0
  298. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/top_level.txt +0 -0
  299. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_agent_prompt.py +0 -0
  300. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_ansi.py +0 -0
  301. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_auth_command.py +0 -0
  302. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_auth_manager.py +0 -0
  303. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_auth_storage.py +0 -0
  304. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_diff.py +0 -0
  305. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_editor_protocol.py +0 -0
  306. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_engine_types.py +0 -0
  307. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_footer_utils.py +0 -0
  308. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_fuzzy.py +0 -0
  309. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_http_proxy.py +0 -0
  310. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_image_processing.py +0 -0
  311. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_api_text_utils.py +0 -0
  312. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_error_utils.py +0 -0
  313. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_types.py +0 -0
  314. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_utils.py +0 -0
  315. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_keybindings.py +0 -0
  316. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_markdown.py +0 -0
  317. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_message_types.py +0 -0
  318. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_message_utils.py +0 -0
  319. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_availability.py +0 -0
  320. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_registry.py +0 -0
  321. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_selector_modal.py +0 -0
  322. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_types.py +0 -0
  323. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_oauth_utils.py +0 -0
  324. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_pkce.py +0 -0
  325. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_prompts_expand.py +0 -0
  326. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_prompts_loader.py +0 -0
  327. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_prompts_registry.py +0 -0
  328. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_provider_registry.py +0 -0
  329. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_rpc_mode.py +0 -0
  330. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_secrets.py +0 -0
  331. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_session_trust_persist.py +0 -0
  332. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_session_types.py +0 -0
  333. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_session_utils.py +0 -0
  334. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_manager.py +0 -0
  335. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_paths.py +0 -0
  336. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_storage.py +0 -0
  337. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_utils.py +0 -0
  338. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_skills_loader.py +0 -0
  339. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_skills_registry.py +0 -0
  340. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_text_llm_invoke.py +0 -0
  341. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_theme_loader.py +0 -0
  342. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_themes_registry.py +0 -0
  343. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_trust_manager.py +0 -0
  344. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_trust_utils.py +0 -0
  345. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_capabilities.py +0 -0
  346. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_input.py +0 -0
  347. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_layout_sizing.py +0 -0
  348. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_theme.py +0 -0
  349. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_utils.py +0 -0
  350. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_version_check.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tau-coding-agent
3
- Version: 0.4.0
3
+ Version: 0.4.5
4
4
  Summary: A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands
5
5
  Requires-Python: >=3.12
6
6
  Description-Content-Type: text/markdown
@@ -32,10 +32,10 @@ Dynamic: license-file
32
32
 
33
33
  # Tau (τ)
34
34
 
35
- A Python reimplementation of [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
35
+ Inspired by [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
36
36
 
37
37
  <p align="center">
38
- <img src="assets/tui.png" alt="Tau TUI" width="700">
38
+ <img src="assets/tui.jpeg" alt="Tau TUI" width="700">
39
39
  </p>
40
40
 
41
41
  Start a conversation with the agent in the terminal.
@@ -1,9 +1,9 @@
1
1
  # Tau (τ)
2
2
 
3
- A Python reimplementation of [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
3
+ Inspired by [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
4
4
 
5
5
  <p align="center">
6
- <img src="assets/tui.png" alt="Tau TUI" width="700">
6
+ <img src="assets/tui.jpeg" alt="Tau TUI" width="700">
7
7
  </p>
8
8
 
9
9
  Start a conversation with the agent in the terminal.
@@ -102,18 +102,20 @@ User input flows through these stages:
102
102
 
103
103
  ## Agent Execution State Machine
104
104
 
105
- The agent has three main states:
105
+ The agent has four observable phases:
106
106
 
107
107
  ```
108
108
  IDLE ──user input──> TURN ──no more tool calls──> IDLE
109
- ↑ ↓
110
- └─ tool results ─┘
109
+ ├── manual/auto compact ──> COMPACTION ──> previous phase
110
+ └── tree navigation ──────> BRANCH_SUMMARY ──> IDLE
111
111
  ```
112
112
 
113
113
  | State | Meaning |
114
114
  |-------|---------|
115
115
  | `IDLE` | No active inference; waiting for user input |
116
116
  | `TURN` | Processing a turn: calling inference, executing tools |
117
+ | `COMPACTION` | Generating or applying a context compaction summary |
118
+ | `BRANCH_SUMMARY` | Generating or applying a branch-navigation summary |
117
119
 
118
120
  The state is exposed via `AgentPhase` enum in `agent/types.py` and accessible to extensions via hooks.
119
121
 
@@ -126,14 +128,19 @@ Each agent turn follows this sequence:
126
128
  2. Add message to session
127
129
  3. Call inference (LLM API)
128
130
  4. Collect tool calls from response
129
- 5. Execute tools (in parallel if possible)
131
+ 5. Execute tools concurrently only when every call in the batch is marked parallel
130
132
  6. Add tool results to context
131
133
  7. Call inference again (only if tools were called)
132
134
  8. Render all messages and results (TUI)
133
135
  9. Save session to disk
134
- 10. Fire completion hooks
136
+ 10. Run post-turn compaction and drain messages queued by lifecycle handlers
137
+ 11. Fire the settled hook
135
138
  ```
136
139
 
140
+ TUI overlays participate in focus lifecycle. Hiding or closing a capturing
141
+ overlay restores the next visible overlay or its previous focus target.
142
+ Components exposing `dispose()` are disposed when their overlay closes.
143
+
137
144
  ## Message Types and Context
138
145
 
139
146
  Messages in sessions are typed:
@@ -6,17 +6,21 @@
6
6
  tau [OPTIONS] [MESSAGE]
7
7
  ```
8
8
 
9
- `MESSAGE` is an optional positional argument. When provided with `--print` or `--mode print`, it is the prompt to run.
9
+ Use `--prompt TEXT` for a non-interactive prompt. Piped stdin can supply or
10
+ augment it.
10
11
 
11
12
  ## Options
12
13
 
13
14
  | Option | Short | Description |
14
15
  |--------|-------|-------------|
15
- | `--provider` | `-p` | Provider to use, e.g. `anthropic`, `openai`, `groq` |
16
- | `--model` | `-m` | Model ID, or `provider/model` shorthand (e.g. `groq/llama-3.3-70b-versatile`) |
16
+ | `--prompt` | `-p` | Run a non-interactive prompt |
17
+ | `--provider` | | Provider to use, e.g. `anthropic`, `openai`, `groq` |
18
+ | `--model` | | Model ID, or `provider/model` shorthand (e.g. `groq/llama-3.3-70b-versatile`) |
17
19
  | `--theme` | `-t` | UI theme: `default`, `dracula`, `nord`, `gruvbox`, `catppuccin`, `ayu-dark`, `everforest`, `horizon`, `kanagawa`, `material-ocean`, `monokai`, `night-owl`, `one-dark`, `rose-pine`, `solarized-dark`, `tokyo-night`, or a custom name |
18
- | `--resume` | `-r` | Resume the most recent session |
19
- | `--session` | `-s` | Resume a specific session by ID or file path |
20
+ | `--resume [ID]` | `-r` | Resume the most recent or a specified session |
21
+ | `--fork ID` | | Fork a specified session at startup |
22
+ | `--session-dir PATH` | | Override session storage |
23
+ | `--name NAME` | | Set the session display name at startup |
20
24
  | `--ephemeral` | `-e` | Don't save this session to disk |
21
25
  | `--approve` | `-a` | Trust project-local files (extensions, settings, context files) for this run |
22
26
  | `--no-approve` | `-na` | Don't trust project-local files for this run |
@@ -42,10 +46,14 @@ tau --model claude-sonnet-4-6
42
46
  Run a single prompt, print the response, and exit:
43
47
 
44
48
  ```bash
45
- tau --print "Summarize this repo"
46
- tau -p anthropic --print "What is this file?"
49
+ tau --prompt "Summarize this repo"
50
+ cat README.md | tau --print --prompt "Summarize this text"
51
+ tau --prompt "Compare these files" @src/old.py @src/new.py
47
52
  ```
48
53
 
54
+ Piped text, attached file contents, and the explicit prompt are combined in
55
+ that order.
56
+
49
57
  ### JSON mode
50
58
 
51
59
  Emit a JSON event stream on stdout:
@@ -3,6 +3,12 @@
3
3
  Extensions are plain Python files that hook into tau's lifecycle. Each one exports
4
4
  a single `register(tau)` function — everything is wired up there.
5
5
 
6
+ Extension tools and commands may shadow built-ins while loaded. Tau retains the
7
+ shadowed source layer, so disabling or reloading the extension restores the
8
+ previous implementation. Reload also replaces extension message renderers,
9
+ autocomplete providers, shortcuts, and published services; do not retain
10
+ service objects across reload.
11
+
6
12
  ## File locations
7
13
 
8
14
  tau loads extensions from three sources, in this order:
@@ -36,6 +42,41 @@ dependencies with incompatible versions. The install only runs once — a hash o
36
42
  the dependency list is cached, so unchanged manifests are a no-op on subsequent
37
43
  launches.
38
44
 
45
+ ## Installable resource packages
46
+
47
+ `tau install` accepts PyPI names, pip-compatible Git URLs, local distributions,
48
+ and direct wheel or source-archive URLs:
49
+
50
+ ```bash
51
+ tau install pypi:tau-tools==1.2.3
52
+ tau install git+ssh://git@github.com/example/tau-tools.git@v1
53
+ tau install ./dist/tau_tools-1.2.3-py3-none-any.whl
54
+ tau install https://packages.example.com/tau_tools-1.2.3-py3-none-any.whl
55
+ tau install tau-tools==1.2.3 --index-url https://packages.example.com/simple
56
+ ```
57
+
58
+ Repeat `--extra-index-url URL` to resolve dependencies from additional indexes.
59
+ Index configuration is retained for future updates.
60
+
61
+ Packages can bundle extensions, skills, prompts, and themes:
62
+
63
+ ```json
64
+ {
65
+ "tau": {
66
+ "extensions": ["extensions/main.py"],
67
+ "skills": ["skills"],
68
+ "prompts": ["prompts"],
69
+ "themes": ["themes"]
70
+ }
71
+ }
72
+ ```
73
+
74
+ Conventional resource directories are discovered when a manifest field is
75
+ omitted. Package entries in `settings.json` support an `enabled` switch and
76
+ optional `extensions`, `skills`, `prompts`, and `themes` path filters. An empty
77
+ filter disables that resource type. Use `tau update --all` to update Tau and
78
+ all installed packages.
79
+
39
80
  ## Entry point
40
81
 
41
82
  Every extension must export a `register(tau)` function:
@@ -212,9 +253,17 @@ def register(tau):
212
253
 
213
254
  #### Agent state
214
255
 
256
+ | Property | Type | Description |
257
+ |----------|------|-------------|
258
+ | `ctx.phase` | `AgentPhase` | Current lifecycle phase: `idle`, `turn`, `compaction`, or `branch_summary` |
259
+ | `ctx.streaming_message` | `AssistantMessage \| None` | Current partial assistant response |
260
+ | `ctx.pending_tool_call_ids` | `frozenset[str]` | Snapshot of tool calls that have started but not finished |
261
+ | `ctx.error_message` | `str \| None` | Most recent engine error |
262
+ | `ctx.queued_messages` | `dict[str, list[LLMMessage]]` | Snapshots of the steering and follow-up queues |
263
+
215
264
  | Method | Returns | Description |
216
265
  |--------|---------|-------------|
217
- | `ctx.is_idle()` | `bool` | `True` when the agent is not currently streaming a response |
266
+ | `ctx.is_idle()` | `bool` | `True` when `ctx.phase` is `AgentPhase.IDLE` |
218
267
  | `ctx.abort()` | — | Cancel the current agent turn; no-op if already idle |
219
268
  | `ctx.shutdown()` | — | Exit tau gracefully |
220
269
  | `ctx.get_context_usage()` | `dict \| None` | Token usage info (see below) |
@@ -224,6 +273,13 @@ def register(tau):
224
273
  | `ctx.signal` | `asyncio.Event \| None` | The current abort signal while the agent is streaming; the event is set when the turn is aborted. `None` when idle |
225
274
  | `ctx.get_system_prompt_options()` | `dict` | Metadata about how the active system prompt was assembled — keys: `skills`, `prompts`, `tools`, `system_prompt_length` |
226
275
 
276
+ Extensions can inject a user message with
277
+ `await ctx.send_user_message(content, deliver_as="steer", trigger_turn=False)`.
278
+ Set `trigger_turn=True` to start a new turn immediately when the agent is idle;
279
+ while it is busy, the message is queued using the selected delivery mode. In
280
+ interactive mode, an immediately triggered message is rendered as a normal user
281
+ message before the assistant response.
282
+
227
283
  `get_context_usage()` returns a dict with three keys, or `None` if token data is not yet available (e.g. immediately after compaction, before the next LLM response):
228
284
 
229
285
  ```python
@@ -251,7 +307,7 @@ These methods are `async` and are available in both event handlers and command h
251
307
 
252
308
  | Method | Returns | Description |
253
309
  |--------|---------|-------------|
254
- | `await ctx.wait_for_idle()` | — | Suspend until the agent finishes its current turn |
310
+ | `await ctx.wait_for_idle()` | — | Suspend until the active invocation and its post-run save/compaction processing finish |
255
311
  | `await ctx.new_session()` | `{"cancelled": bool}` | Start a fresh session |
256
312
  | `await ctx.fork(entry_id)` | `{"cancelled": bool}` | Fork from a specific session entry |
257
313
  | `await ctx.navigate_tree(target_id, summarize=False, custom_instructions=None)` | `{"cancelled": bool}` | Jump to another branch in the session tree |
@@ -297,12 +353,30 @@ async def cmd(ctx, args):
297
353
  ctx.compact(custom_instructions="Keep only the final conclusions.")
298
354
  ```
299
355
 
300
- `navigate_tree` optionally generates a branch summary before switching:
356
+ `navigate_tree` optionally generates a branch summary and attaches it to the
357
+ destination branch. If summary generation fails, navigation still completes
358
+ without a summary:
301
359
 
302
360
  ```python
303
361
  result = await ctx.navigate_tree(target_id, summarize=True)
304
362
  ```
305
363
 
364
+ Extensions can replace the default branch-summary model call:
365
+
366
+ ```python
367
+ from tau.hooks import SessionBeforeTreeResult
368
+
369
+ def register(tau):
370
+ @tau.on("session_before_tree")
371
+ async def summarize(event, ctx):
372
+ entries = event.preparation.entries_to_summarize
373
+ summary = await my_summarizer(entries)
374
+ return SessionBeforeTreeResult(
375
+ summary=summary,
376
+ summary_details={"source": "my-extension"},
377
+ )
378
+ ```
379
+
306
380
  #### `branch_entries` vs `session_entries`
307
381
 
308
382
  The session file stores entries from every branch ever taken — forks, navigations, abandoned paths. `session_entries` returns all of them. `branch_entries` returns only the linear path from the root to the current leaf — the entries actually in scope for the current conversation.
@@ -359,7 +433,11 @@ def register(tau):
359
433
  | `session_shutdown` | `reason`, `target_session_file` | — | Session about to close — last chance for cleanup |
360
434
  | `session_before_switch` | `reason`, `target_session_file` | `SessionBeforeSwitchResult` | About to replace the active session — return `cancel=True` to block |
361
435
  | `session_before_fork` | `entry_id`, `position` | `SessionBeforeForkResult` | About to create a branch — return `cancel=True` to block |
362
- | `session_before_tree` | `preparation` | `SessionBeforeTreeResult` | About to rewrite the session tree (branch navigation). Mutate `preparation` or return `cancel=True` |
436
+ | `session_before_tree` | `preparation` | `SessionBeforeTreeResult` | About to rewrite the tree. Return `summary=` and optional `summary_details=` to replace default summarization, or `cancel=True` to block |
437
+ | `branch_summary_start` | `old_leaf_id`, `target_id`, `from_extension` | — | Branch summarization begins |
438
+ | `branch_summary_end` | `old_leaf_id`, `target_id`, `summary_entry_id`, `summary_length`, `from_extension` | — | Summary attached to the destination |
439
+ | `branch_summary_failure` | `old_leaf_id`, `target_id`, `error` | — | Summary failed; navigation continues without it |
440
+ | `branch_summary_cancelled` | `old_leaf_id`, `target_id`, `reason` | — | Summary or navigation was cancelled |
363
441
  | `session_tree` | `new_leaf_id`, `old_leaf_id`, `from_extension` | — | Session tree has been rewritten with the new active leaf |
364
442
 
365
443
  **Agent & turn lifecycle**
@@ -372,7 +450,7 @@ def register(tau):
372
450
  | `agent_error` | `error` | — | Engine terminated with an unrecoverable error |
373
451
  | `turn_start` | `turn_index`, `timestamp` | — | New LLM inference turn begins |
374
452
  | `turn_end` | `turn_index`, `message`, `tool_results` | — | Turn completes with assistant message and tool results |
375
- | `settled` | — | — | Agent finishes a `prompt()` call with no more queued turns the agent is fully idle |
453
+ | `settled` | — | — | The invocation completed queued turns and post-run compaction with no messages currently queued; this is an observation, not a lock against concurrent submissions |
376
454
 
377
455
  **Input**
378
456
 
@@ -425,9 +503,11 @@ def register(tau):
425
503
 
426
504
  | Event | Payload fields | Result type | Description |
427
505
  |-------|---------------|-------------|-------------|
428
- | `before_compaction` | `preparation`, `entries`, `manual` | `BeforeCompactionResult` | Before the LLM summarisation call see [Custom Compaction](#custom-compaction) |
429
- | `compaction_start` | `manual` | — | Compaction begins (after `before_compaction` passes) |
430
- | `compaction_end` | `manual`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction finished |
506
+ | `before_compaction` | `preparation`, `entries`, `manual`, `reason`, `will_retry` | `BeforeCompactionResult` | Before summarization; may cancel or provide a complete compaction |
507
+ | `compaction_start` | `manual`, `reason`, `will_retry` | — | Compaction begins after interception |
508
+ | `compaction_end` | `manual`, `reason`, `will_retry`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction succeeds |
509
+ | `compaction_failure` | `manual`, `reason`, `will_retry`, `error` | — | Compaction fails |
510
+ | `compaction_cancelled` | `manual`, `reason`, `will_retry` | — | An extension cancels compaction |
431
511
 
432
512
  **Model & settings**
433
513
 
@@ -13,7 +13,7 @@
13
13
  | Ctrl+K | Kill to end of line |
14
14
  | Ctrl+W | Delete previous word |
15
15
  | Ctrl+A / Home | Move to line start |
16
- | Ctrl+E / End | Move to line end |
16
+ | Ctrl+E / End | Move to line end (Ctrl+E falls through to the app when input is empty) |
17
17
  | Delete / Ctrl+D | Delete character at cursor |
18
18
 
19
19
  ### Message Queue
@@ -30,7 +30,8 @@
30
30
  | Escape | Abort current turn; restore queued messages |
31
31
  | Ctrl+C | Abort turn; double-press to quit |
32
32
  | Ctrl+D | Quit (on empty input) |
33
- | Ctrl+O | Toggle expand/collapse for template blocks |
33
+ | Ctrl+O | Toggle expand/collapse for thinking and tool-result blocks |
34
+ | Ctrl+E | Toggle template and skill blocks when the editor is empty |
34
35
 
35
36
  ### Pickers (model, theme, command palette)
36
37
 
@@ -52,12 +53,14 @@
52
53
  Pass a `KeyMap` to `App.create()` at startup:
53
54
 
54
55
  ```python
55
- from tau.tui.keybindings import KeyMap
56
+ from tau.tui import KeyMap
56
57
 
57
58
  overrides: KeyMap = {
58
59
  "tui.app.quit": ["ctrl+q"],
59
60
  "tui.input.submit": ["enter"],
60
61
  "app.message.followup": ["alt+enter"],
62
+ "app.details.toggle": ["ctrl+o"],
63
+ "app.invocations.toggle": ["ctrl+e"],
61
64
  }
62
65
 
63
66
  app = await App.create(runtime, keybindings=overrides)
@@ -75,6 +78,8 @@ A `KeyMap` is `dict[str, list[str]]` — action name → list of key combos that
75
78
  | `tui.input.word_back` | `ctrl+w` | Delete previous word |
76
79
  | `app.message.followup` | `alt+enter` | Queue as follow-up message |
77
80
  | `app.message.dequeue` | `alt+up` | Restore queued messages into editor |
81
+ | `app.details.toggle` | `ctrl+o` | Toggle thinking and tool-result previews |
82
+ | `app.invocations.toggle` | `ctrl+e` | Toggle template and skill blocks |
78
83
  | `tui.app.quit` | `ctrl+c`, `ctrl+d` | Quit tau |
79
84
  | `tui.app.abort` | `ctrl+c` | Abort the current turn |
80
85
  | `tui.select.up` | `up`, `ctrl+p` | Move selection up |
@@ -28,6 +28,12 @@ Referenced files are automatically processed based on type:
28
28
 
29
29
  A response from the LLM. Can include text and tool calls.
30
30
 
31
+ Assistant messages also store provider usage metadata: input, output,
32
+ cache-read, and cache-write token counts. The
33
+ `input_tokens_include_cache_read` flag records whether cached tokens are
34
+ already included in the provider's input count, preventing context usage from
35
+ counting the same tokens twice.
36
+
31
37
  ```python
32
38
  {
33
39
  "type": "assistant",
@@ -234,35 +234,33 @@ Trust and permission system for tool execution.
234
234
  - `types.py` - Trust data structures
235
235
  - `utils.py` - Trust utilities
236
236
 
237
- ### `tui/` - Terminal User Interface
238
-
239
- Complete terminal UI (22 modules, 736 LOC).
240
-
241
- Core components:
242
- - `tui.py` - Main TUI event loop
243
- - `app.py` - TUI application state
244
- - `terminal.py` - Terminal control and cursor management
245
- - `renderer.py` - Differential update renderer
246
-
247
- Input handling:
248
- - `input.py` - Text input editor
249
- - `input_handler.py` - Input event handling
250
- - `autocomplete.py` - Command/file autocomplete
251
- - `component.py` - UI component system
252
-
253
- Rendering:
254
- - `message_renderers.py` - Message and tool result rendering
255
- - `markdown.py` - Markdown to ANSI rendering
256
- - `overlay.py` - Overlay UI (dialogs, popups)
257
-
258
- Display:
259
- - `theme.py` - Theme application
260
- - `ansi.py` - ANSI code utilities
261
- - `keybindings.py` - Keybinding definitions
262
- - `fuzzy.py` - Fuzzy matching for search
263
-
264
- Integration:
265
- - `agent_hooks.py` - TUI event hooks
237
+ ### `tui/` - Terminal UI Primitives
238
+
239
+ Reusable terminal parsing, differential rendering, components, themes, and
240
+ keybindings.
241
+
242
+ - `tui.py` - Main event loop, focus, overlays, and differential rendering
243
+ - `terminal.py` - Terminal control and capability detection
244
+ - `input.py` - Generic input events, terminal parser, and keybinding registry
245
+ - `component.py` - Component and container primitives
246
+ - `components/` - Editor, text input, selectors, spinner, images, and boxes
247
+ - `autocomplete.py` - Generic autocomplete management
248
+ - `markdown.py` - Markdown-to-ANSI rendering
249
+ - `theme.py` - TUI theme types
250
+ - `ui_context.py` - Extension-facing UI context
251
+
252
+ ### `modes/interactive/` - Interactive Application
253
+
254
+ Interactive runtime orchestration and Tau-specific UI composition.
255
+
256
+ - `app.py` - Application lifecycle and global shortcuts
257
+ - `agent_hooks.py` - Agent-event to UI-state projection
258
+ - `input_handler.py` - Runtime-aware submit, queue, media, and history orchestration
259
+ - `commands/` - Interactive slash-command implementations
260
+ - `components/layout.py` - Editor-zone composition
261
+ - `components/message_list.py` - Message and tool-result rendering
262
+ - `components/selector_controller.py` - Inline selector lifecycle and input routing
263
+ - `components/overlays.py` - Interactive dialogs and editors
266
264
  - `ui_context.py` - UI state context
267
265
 
268
266
  ## Key Types and Classes
@@ -123,8 +123,8 @@ unsub() # remove the handler
123
123
  |-------|------|
124
124
  | `message_end` | Model response fully received |
125
125
  | `tool_execution_end` | A tool call finished |
126
- | `agent_end` | Agent turn is complete |
127
- | `settled` | Agent is fully idle (follow-up queue drained) |
126
+ | `agent_end` | The current low-level engine loop ended; post-run processing may remain |
127
+ | `settled` | The invocation completed post-run processing with no messages currently queued |
128
128
 
129
129
  ## Custom Tools at Runtime
130
130
 
@@ -185,9 +185,17 @@ agent = runtime.agent
185
185
 
186
186
  # Check state
187
187
  agent.is_idle()
188
+ agent.phase # AgentPhase.IDLE, TURN, COMPACTION, or BRANCH_SUMMARY
189
+ agent.streaming_message
190
+ agent.pending_tool_call_ids
191
+ agent.error_message
192
+ agent.queued_messages
188
193
  agent.get_context_usage() # ContextUsage(tokens, context_window, percent)
189
194
  agent.get_system_prompt()
190
195
 
196
+ # Wait through save-point handlers and post-run compaction
197
+ await agent.wait_for_idle()
198
+
191
199
  # Abort
192
200
  agent.abort()
193
201
 
@@ -14,6 +14,10 @@ A session is a conversation between you and the agent. Each session includes:
14
14
 
15
15
  Sessions are saved to `~/.tau/sessions/` in a per-project subdirectory so sessions from different projects never mix.
16
16
 
17
+ Set `session_dir` in settings, or pass `--session-dir PATH`, to override this
18
+ location. `tau --resume ID` resumes a matching session, `tau --fork ID` creates
19
+ a new session from it, and `--name NAME` assigns a display name at startup.
20
+
17
21
  ## Session Files
18
22
 
19
23
  Sessions are stored per-project. The working directory is encoded into a safe subdirectory name:
@@ -32,6 +36,15 @@ The subdirectory name is derived from the absolute path of the working directory
32
36
 
33
37
  Files are in JSONL format (one JSON object per line), allowing efficient appending and compression.
34
38
 
39
+ Opening an existing empty, invalid, or unsupported future-version session
40
+ fails without modifying the file. Persistence errors are reported to the
41
+ caller instead of allowing in-memory state to appear saved when the disk write
42
+ failed.
43
+
44
+ When a branch is extracted into a new session, label entries are recreated at
45
+ the end of the extracted path. Retained entries are re-chained so removing a
46
+ label from between conversation entries cannot leave orphaned parent IDs.
47
+
35
48
  ## Resume Sessions
36
49
 
37
50
  ### Continue Last Session
@@ -112,6 +125,10 @@ Useful for one-off queries where you don't need the conversation history.
112
125
 
113
126
  Every session is a **tree**, not a flat list. When you branch with `/fork` or navigate to a different point in history, tau records a `leaf` entry that points to the new active node. The full conversation history — including all branches — lives in a single JSONL file.
114
127
 
128
+ Parent traversal rejects cycles in malformed session data. Tree rendering
129
+ treats missing-parent entries as separate roots so recoverable orphaned history
130
+ remains visible.
131
+
115
132
  ```text
116
133
  root
117
134
  └── msg A (user)
@@ -148,14 +165,21 @@ Both sessions start in an identical state. Changes in one do not affect the othe
148
165
 
149
166
  Use `/tree` to open the interactive branch navigator. It shows every message node in the session tree, indented by depth, with the current leaf marked `(current)`. Press Enter on any node to navigate to that branch point.
150
167
 
151
- When you navigate to a different branch, tau generates a **branch summary** of the path you're leaving, so context from the abandoned branch isn't lost. The summary is injected into the new branch's context as a `[Branch Summary]` block.
168
+ When you navigate to a different branch, Tau can generate a **branch summary**
169
+ of the path you're leaving, so context from the abandoned branch isn't lost.
170
+ The TUI asks whether to summarize unless prompting is disabled. When generated,
171
+ the summary is attached to the destination branch and injected into its context
172
+ as a `[Branch Summary]` block.
152
173
 
153
174
  #### Branch summary behaviour
154
175
 
155
- - Generated automatically on navigation no manual action needed.
176
+ - Offered during TUI navigation; API callers opt in with `summarize=True`.
156
177
  - Captures: goal, progress, key decisions, next steps, and files read/modified.
157
- - Stored as a `branch_summary` entry in the session file and included in context whenever you return to that branch.
158
- - Extensions can intercept and customise summaries via the `session_before_tree` event (see [Extensions](extensions.md#event-reference)).
178
+ - Stored as a `branch_summary` entry under the destination node and included in that branch's context.
179
+ - Uses the active model's input limit and a bounded prompt. If summarization fails, navigation still completes without a summary and Tau reports the failure.
180
+ - Extensions can return a complete summary and metadata from
181
+ `session_before_tree`, bypassing Tau's default summary model call. See
182
+ [Extensions](extensions.md#event-reference).
159
183
 
160
184
  ### Resuming a Past Session
161
185
 
@@ -252,16 +276,19 @@ Long sessions eventually fill the model's context window. Tau handles this autom
252
276
 
253
277
  ### When Compaction Runs
254
278
 
255
- Token usage is estimated from the **last successful response's reported usage** plus a chars/4 estimate of anything after it, so the trigger reflects real provider accounting rather than a pure guess. The threshold is `context_tokens > context_window - reserve_tokens`. Tau checks this at three points so context is trimmed before it can overflow:
279
+ Token usage is estimated from the **last successful response's reported usage** plus a chars/4 estimate of anything after it, so the trigger reflects real provider accounting rather than a pure guess. Provider cache counters are normalized so cached input is not counted twice. Before the first response, and after switching models, the estimate also includes the system prompt and tool schemas.
280
+
281
+ The threshold is `context_tokens >= context_window - reserve_tokens`. Tau checks this at three points so context is trimmed before it can overflow:
256
282
 
257
283
  1. **Pre-flight** — before sending a new turn. Catches resumed or already-oversized sessions that would otherwise fail on the very first request.
258
- 2. **Post-turn** — after each agent turn completes, the normal proactive path.
284
+ 2. **Post-task** — after the agent finishes the current prompt and becomes idle.
259
285
  3. **Overflow recovery (reactive backstop)** — if a request still fails with a provider *context-overflow* error, Tau catches it, drops the failed response, compacts, and **retries the turn once** automatically. This is bounded to a single attempt per turn — if it overflows again, Tau surfaces a message asking you to reduce context or switch to a larger-context model rather than looping.
260
286
 
261
287
  Two guards keep this stable:
262
288
 
263
289
  - **Stale-anchor guard** — immediately after a compaction, the kept messages still carry their pre-compaction (large) usage numbers. Tau skips re-triggering when the usage anchor predates the latest compaction, so it won't compact on every subsequent turn.
264
290
  - **Circuit breaker** — if automatic compaction fails repeatedly (3×), Tau stops auto-compacting for the session and surfaces a notice instead of failing silently. You can still run `/compact` manually.
291
+ - **Model-switch guard** — usage reported by the previous model is discarded after a model change. Tau falls back to a full heuristic estimate against the new model's context window instead of skipping the check.
265
292
 
266
293
  ### Manual Compaction
267
294
 
@@ -283,6 +310,13 @@ Compaction is controlled by three settings under the `compaction` key in `settin
283
310
  | `reserve_tokens` | `16384` | Tokens to keep free at the top of the context window; compaction triggers when headroom falls below this |
284
311
  | `keep_recent_tokens` | `20000` | Approximate token budget for the recent messages that are kept verbatim after compaction |
285
312
 
313
+ At runtime, Tau clamps `reserve_tokens` and `keep_recent_tokens` to the active
314
+ model's input limit. It always leaves room for the generated summary, preventing
315
+ small-context models from retaining more history than they can accept.
316
+
317
+ Disabling automatic compaction also disables overflow-triggered compaction and
318
+ retry. Provider context-overflow errors are returned directly in that mode.
319
+
286
320
  Example — tighten the trigger and keep more recent history:
287
321
 
288
322
  ```json
@@ -84,6 +84,7 @@ All field names use `snake_case`.
84
84
  | `thinking_level` | string | Extended thinking budget level (see below) |
85
85
  | `transport` | string | Transport layer override (`"streaming"` or `"polling"`) |
86
86
  | `enabled_models` | list[string] | Restrict the model picker to these model IDs |
87
+ | `session_dir` | string | Override the directory used to store and discover sessions |
87
88
 
88
89
  ```json
89
90
  {
@@ -120,6 +121,7 @@ Toggle during a session with `/effort` or the effort picker.
120
121
  | `show_tool_calls` | boolean | `true` | Show tool call / result blocks in the message list |
121
122
  | `picker_max_visible` | integer | `8` | Max visible rows in the model / theme picker |
122
123
  | `autocomplete_max_visible` | integer | `5` | Max visible rows in the editor autocomplete dropdown |
124
+ | `tool_result_preview_lines` | integer | `5` | Lines shown before thinking or default-shell tool results collapse; values below 1 are clamped |
123
125
  | `show_hardware_cursor` | boolean | `false` | Keep the terminal cursor visible while it is repositioned (aids IME input) |
124
126
  | `editor_padding_x` | integer | `0` | Horizontal padding (spaces) added inside the input editor |
125
127
  | `double_escape_action` | string | `"fork"` | What happens when Escape is pressed twice on an empty editor: `"fork"` clones the current branch, `"tree"` opens the branch navigator, `"none"` does nothing |
@@ -187,9 +189,14 @@ When your conversation grows long, tau automatically summarizes older messages t
187
189
  - **`reserve_tokens`**: How many tokens to keep available for the LLM's response (default 16,384 ≈ 4K-5K words)
188
190
  - **`keep_recent_tokens`**: How many recent message tokens to preserve word-for-word before summarization kicks in (default 20,000 ≈ 5K-6K words)
189
191
 
192
+ The active values are resolved live, so changes made through `/settings` apply
193
+ without restarting Tau. For models with smaller input limits, Tau clamps both
194
+ budgets and reserves additional space for the generated summary. Automatic and
195
+ overflow-triggered compaction are both disabled when `enabled` is `false`.
196
+
190
197
  #### Mid-turn (threshold) compaction
191
198
 
192
- In addition to compaction triggered at the start of a turn, tau can compact **mid-turn** when the context hits the configured limit while the agent is already running. When this happens the engine stops cleanly so you can review the compacted context and continue — no partial output is lost. Tool output lines are truncated before sending to the LLM to help prevent hitting the threshold in the first place.
199
+ In addition to compaction triggered at the start of a turn, tau can compact **mid-turn** when context usage reaches `input_limit - reserve_tokens` while the agent is already running. When this happens the engine stops cleanly so you can review the compacted context and continue — no partial output is lost. Tool output lines are truncated before sending to the LLM to help prevent hitting the threshold in the first place.
193
200
 
194
201
  Example configurations:
195
202
 
@@ -232,8 +239,8 @@ summary of the branch you're leaving. These settings control that behaviour.
232
239
  | Field | Type | Default | Description |
233
240
  |-------|------|---------|-------------|
234
241
  | `branch_summary.enabled` | boolean | `true` | Enable branch summarisation entirely. When `false`, the summarisation selector is never shown when switching branches in `/tree` |
235
- | `branch_summary.skip_prompt` | boolean | `false` | Skip the "Summarize branch?" picker and always navigate without a summary |
236
- | `branch_summary.reserve_tokens` | integer | `16384` | Token budget reserved when generating the branch summary |
242
+ | `branch_summary.skip_prompt` | boolean | `false` | Skip the "Summarize branch?" picker and navigate without a summary |
243
+ | `branch_summary.reserve_tokens` | integer | `16384` | Output/headroom budget reserved when generating the branch summary; clamped to the active model's input limit |
237
244
 
238
245
  Disable branch summarization entirely:
239
246
  ```json