tau-coding-agent 0.3.9__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 (377) hide show
  1. {tau_coding_agent-0.3.9/tau_coding_agent.egg-info → tau_coding_agent-0.4.5}/PKG-INFO +3 -3
  2. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/README.md +2 -2
  3. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/architecture.md +12 -5
  4. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/cli-reference.md +15 -7
  5. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/extension-settings.md +211 -6
  6. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/extensions.md +88 -8
  7. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/keybindings.md +8 -3
  8. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/messages.md +6 -0
  9. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/project-structure.md +27 -29
  10. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/python-api.md +10 -2
  11. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/sessions.md +40 -6
  12. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/settings.md +10 -3
  13. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/tools.md +36 -10
  14. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/usage.md +2 -1
  15. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/pyproject.toml +2 -2
  16. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/prompt/builder.py +2 -1
  17. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/service.py +253 -83
  18. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/types.py +2 -0
  19. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/__init__.py +7 -0
  20. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/git.py +1 -1
  21. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/model.py +26 -1
  22. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/header/__init__.py +1 -1
  23. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/text.py +91 -0
  24. tau_coding_agent-0.4.5/tau/builtins/providers/audio.py +22 -0
  25. tau_coding_agent-0.4.5/tau/builtins/providers/image.py +31 -0
  26. tau_coding_agent-0.4.5/tau/builtins/providers/video.py +11 -0
  27. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/edit.py +87 -84
  28. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/glob.py +22 -28
  29. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/grep.py +29 -64
  30. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/ls.py +4 -21
  31. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/read.py +17 -20
  32. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/terminal.py +76 -35
  33. tau_coding_agent-0.4.5/tau/builtins/tools/utils.py +129 -0
  34. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/write.py +7 -13
  35. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/commands/registry.py +33 -10
  36. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/cli.py +119 -13
  37. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/packages.py +13 -4
  38. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/update.py +43 -10
  39. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/core/registry.py +2 -0
  40. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/engine/service.py +198 -141
  41. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/engine/types.py +3 -2
  42. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/api.py +154 -11
  43. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/context.py +122 -9
  44. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/loader.py +52 -6
  45. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/runtime.py +1 -0
  46. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/__init__.py +12 -0
  47. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/engine.py +21 -0
  48. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/service.py +7 -6
  49. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/session.py +49 -2
  50. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/types.py +12 -0
  51. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/service.py +13 -1
  52. tau_coding_agent-0.4.5/tau/inference/api/availability.py +64 -0
  53. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/service.py +8 -1
  54. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_claude_code.py +6 -1
  55. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_messages.py +6 -1
  56. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_vertex.py +7 -2
  57. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/gemini_generate.py +2 -0
  58. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/github_copilot_chat.py +1 -0
  59. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_antigravity.py +5 -1
  60. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_vertex.py +6 -4
  61. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/mistral_chat.py +1 -0
  62. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_codex_responses.py +1 -0
  63. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_completions.py +1 -0
  64. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_responses.py +1 -0
  65. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_vertex.py +1 -3
  66. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/service.py +10 -35
  67. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/service.py +8 -1
  68. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/model/types.py +13 -4
  69. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/__init__.py +11 -0
  70. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/registry.py +3 -3
  71. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/types.py +6 -3
  72. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/types.py +1 -0
  73. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/utils.py +1 -0
  74. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/message/types.py +1 -0
  75. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/message/utils.py +5 -2
  76. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/agent_hooks.py +9 -9
  77. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/app.py +206 -104
  78. tau_coding_agent-0.4.5/tau/modes/interactive/commands/__init__.py +3 -0
  79. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/appearance.py +102 -86
  80. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/auth.py +87 -41
  81. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/context.py +1 -1
  82. tau_coding_agent-0.4.5/tau/modes/interactive/commands/extensions.py +105 -0
  83. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/misc.py +1 -1
  84. tau_coding_agent-0.4.5/tau/modes/interactive/commands/model.py +198 -0
  85. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/session.py +17 -9
  86. tau_coding_agent-0.4.5/tau/modes/interactive/components/__init__.py +0 -0
  87. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/command_palette.py +18 -9
  88. tau_coding_agent-0.4.5/tau/modes/interactive/components/config_selector.py +233 -0
  89. tau_coding_agent-0.4.5/tau/modes/interactive/components/extension_selector.py +116 -0
  90. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/file_picker.py +21 -10
  91. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/layout.py +336 -280
  92. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/message_list.py +145 -32
  93. tau_coding_agent-0.4.5/tau/modes/interactive/components/model_selector.py +283 -0
  94. tau_coding_agent-0.4.5/tau/modes/interactive/components/oauth_selector.py +132 -0
  95. tau_coding_agent-0.3.9/tau/tui/components/prompt_overlay.py → tau_coding_agent-0.4.5/tau/modes/interactive/components/overlays.py +163 -2
  96. tau_coding_agent-0.4.5/tau/modes/interactive/components/selector_controller.py +203 -0
  97. tau_coding_agent-0.3.9/tau/tui/components/resume_modal.py → tau_coding_agent-0.4.5/tau/modes/interactive/components/session_selector.py +45 -46
  98. tau_coding_agent-0.4.5/tau/modes/interactive/components/settings_selector.py +620 -0
  99. tau_coding_agent-0.4.5/tau/modes/interactive/components/theme_selector.py +102 -0
  100. tau_coding_agent-0.4.5/tau/modes/interactive/components/thinking_selector.py +95 -0
  101. tau_coding_agent-0.3.9/tau/tui/components/tree_select_list.py → tau_coding_agent-0.4.5/tau/modes/interactive/components/tree_selector.py +1 -2
  102. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/trust_screen.py +16 -15
  103. {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/input_handler.py +7 -5
  104. tau_coding_agent-0.4.5/tau/modes/print/__init__.py +0 -0
  105. tau_coding_agent-0.4.5/tau/modes/rpc/__init__.py +8 -0
  106. {tau_coding_agent-0.3.9/tau → tau_coding_agent-0.4.5/tau/modes}/rpc/mode.py +8 -8
  107. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/manager.py +68 -5
  108. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/types.py +1 -0
  109. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/utils.py +50 -5
  110. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/runtime/service.py +187 -67
  111. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/runtime/types.py +104 -34
  112. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/branch_summarization.py +74 -32
  113. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/compaction.py +111 -22
  114. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/manager.py +79 -47
  115. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/utils.py +6 -2
  116. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/manager.py +75 -25
  117. tau_coding_agent-0.4.5/tau/settings/paths.py +347 -0
  118. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/types.py +35 -4
  119. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/skills/registry.py +1 -1
  120. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/themes/loader.py +84 -12
  121. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/themes/registry.py +25 -0
  122. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/registry.py +27 -15
  123. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/render.py +1 -1
  124. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/types.py +19 -1
  125. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/manager.py +6 -4
  126. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/utils.py +2 -4
  127. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/__init__.py +16 -1
  128. tau_coding_agent-0.3.9/tau/tui/components/autocomplete_manager.py → tau_coding_agent-0.4.5/tau/tui/autocomplete.py +211 -9
  129. tau_coding_agent-0.4.5/tau/tui/component.py +512 -0
  130. tau_coding_agent-0.4.5/tau/tui/components/__init__.py +0 -0
  131. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/box.py +17 -1
  132. tau_coding_agent-0.4.5/tau/tui/components/editor.py +73 -0
  133. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/image.py +1 -1
  134. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/select_list.py +40 -5
  135. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/spinner.py +5 -0
  136. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/text_input.py +124 -10
  137. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/input.py +166 -8
  138. tau_coding_agent-0.4.5/tau/tui/keybinding_hints.py +41 -0
  139. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/markdown.py +50 -10
  140. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/terminal.py +135 -6
  141. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/theme.py +20 -2
  142. tau_coding_agent-0.4.5/tau/tui/tui.py +1289 -0
  143. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/ui_context.py +107 -6
  144. tau_coding_agent-0.3.9/tau/tui/ansi.py → tau_coding_agent-0.4.5/tau/tui/utils.py +234 -0
  145. tau_coding_agent-0.4.5/tau/utils/__init__.py +0 -0
  146. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5/tau_coding_agent.egg-info}/PKG-INFO +3 -3
  147. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/SOURCES.txt +56 -39
  148. tau_coding_agent-0.4.5/tests/test_agent_compaction.py +264 -0
  149. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_agent_types.py +4 -1
  150. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_ansi.py +11 -11
  151. tau_coding_agent-0.4.5/tests/test_auth_command.py +41 -0
  152. tau_coding_agent-0.4.5/tests/test_branch_navigation.py +127 -0
  153. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_branch_summarization.py +105 -11
  154. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_builtin_tools.py +217 -75
  155. tau_coding_agent-0.4.5/tests/test_cli_inputs.py +40 -0
  156. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_command_registry.py +16 -1
  157. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_compaction.py +111 -8
  158. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_diff.py +1 -1
  159. tau_coding_agent-0.4.5/tests/test_editor_protocol.py +67 -0
  160. tau_coding_agent-0.4.5/tests/test_engine_execution.py +78 -0
  161. tau_coding_agent-0.4.5/tests/test_engine_steering.py +284 -0
  162. tau_coding_agent-0.4.5/tests/test_extension_api.py +291 -0
  163. tau_coding_agent-0.4.5/tests/test_footer_model.py +86 -0
  164. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_fuzzy.py +1 -1
  165. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_keybindings.py +4 -4
  166. tau_coding_agent-0.4.5/tests/test_model_availability.py +118 -0
  167. tau_coding_agent-0.4.5/tests/test_model_selector_modal.py +153 -0
  168. tau_coding_agent-0.4.5/tests/test_package_resources.py +66 -0
  169. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_packages_utils.py +40 -5
  170. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_provider_registry.py +6 -6
  171. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_rpc_mode.py +1 -1
  172. tau_coding_agent-0.4.5/tests/test_selector_controller.py +36 -0
  173. tau_coding_agent-0.4.5/tests/test_session_manager.py +97 -0
  174. tau_coding_agent-0.4.5/tests/test_settings_manager.py +253 -0
  175. tau_coding_agent-0.4.5/tests/test_text_input.py +17 -0
  176. tau_coding_agent-0.4.5/tests/test_thinking_render.py +53 -0
  177. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tool_registry.py +12 -0
  178. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tool_render.py +38 -1
  179. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_capabilities.py +1 -1
  180. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_input.py +70 -1
  181. tau_coding_agent-0.4.5/tests/test_tui_layout_sizing.py +182 -0
  182. tau_coding_agent-0.4.5/tests/test_ui_context.py +42 -0
  183. tau_coding_agent-0.3.9/tau/builtins/providers/audio.py +0 -10
  184. tau_coding_agent-0.3.9/tau/builtins/providers/image.py +0 -15
  185. tau_coding_agent-0.3.9/tau/builtins/providers/video.py +0 -8
  186. tau_coding_agent-0.3.9/tau/rpc/__init__.py +0 -8
  187. tau_coding_agent-0.3.9/tau/settings/paths.py +0 -171
  188. tau_coding_agent-0.3.9/tau/tui/autocomplete.py +0 -36
  189. tau_coding_agent-0.3.9/tau/tui/capabilities.py +0 -124
  190. tau_coding_agent-0.3.9/tau/tui/commands/__init__.py +0 -3
  191. tau_coding_agent-0.3.9/tau/tui/commands/model.py +0 -129
  192. tau_coding_agent-0.3.9/tau/tui/component.py +0 -258
  193. tau_coding_agent-0.3.9/tau/tui/components/autocomplete_picker.py +0 -147
  194. tau_coding_agent-0.3.9/tau/tui/components/dynamic_border.py +0 -19
  195. tau_coding_agent-0.3.9/tau/tui/components/inline_selector.py +0 -73
  196. tau_coding_agent-0.3.9/tau/tui/components/modal.py +0 -97
  197. tau_coding_agent-0.3.9/tau/tui/components/model_palette.py +0 -221
  198. tau_coding_agent-0.3.9/tau/tui/components/picker_overlay.py +0 -178
  199. tau_coding_agent-0.3.9/tau/tui/components/settings_modal.py +0 -279
  200. tau_coding_agent-0.3.9/tau/tui/components/settings_schema.py +0 -223
  201. tau_coding_agent-0.3.9/tau/tui/components/text_prompt.py +0 -83
  202. tau_coding_agent-0.3.9/tau/tui/diff.py +0 -114
  203. tau_coding_agent-0.3.9/tau/tui/fuzzy.py +0 -99
  204. tau_coding_agent-0.3.9/tau/tui/keybindings.py +0 -90
  205. tau_coding_agent-0.3.9/tau/tui/message_renderers.py +0 -32
  206. tau_coding_agent-0.3.9/tau/tui/overlay.py +0 -334
  207. tau_coding_agent-0.3.9/tau/tui/renderer.py +0 -390
  208. tau_coding_agent-0.3.9/tau/tui/tui.py +0 -563
  209. tau_coding_agent-0.3.9/tau/tui/utils.py +0 -20
  210. tau_coding_agent-0.3.9/tests/test_settings_manager.py +0 -150
  211. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/LICENSE +0 -0
  212. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/MANIFEST.in +0 -0
  213. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
  214. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/auth.md +0 -0
  215. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/development.md +0 -0
  216. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/docs.json +0 -0
  217. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/http-proxy.md +0 -0
  218. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/index.md +0 -0
  219. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/inference-providers.md +0 -0
  220. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/installation.md +0 -0
  221. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/project-context.md +0 -0
  222. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/prompts.md +0 -0
  223. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/quickstart.md +0 -0
  224. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/skills.md +0 -0
  225. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/themes.md +0 -0
  226. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/setup.cfg +0 -0
  227. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/__init__.py +0 -0
  228. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/__init__.py +0 -0
  229. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/prompt/__init__.py +0 -0
  230. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/prompt/types.py +0 -0
  231. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/auth/manager.py +0 -0
  232. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/auth/storage.py +0 -0
  233. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/auth/types.py +0 -0
  234. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/__init__.py +0 -0
  235. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/__init__.py +0 -0
  236. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/clear.py +0 -0
  237. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/compact.py +0 -0
  238. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/reload.py +0 -0
  239. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/session.py +0 -0
  240. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/utils.py +0 -0
  241. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/__init__.py +0 -0
  242. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/audio.py +0 -0
  243. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/image.py +0 -0
  244. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/video.py +0 -0
  245. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/commit.md +0 -0
  246. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/docs.md +0 -0
  247. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/explain.md +0 -0
  248. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/fix.md +0 -0
  249. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/refactor.md +0 -0
  250. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/review.md +0 -0
  251. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/test.md +0 -0
  252. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/providers/__init__.py +0 -0
  253. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/providers/text.py +0 -0
  254. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/skills/code-review/SKILL.md +0 -0
  255. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/skills/debug/SKILL.md +0 -0
  256. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  257. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/themes/dark.yaml +0 -0
  258. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/themes/light.yaml +0 -0
  259. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/__init__.py +0 -0
  260. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/commands/__init__.py +0 -0
  261. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/commands/types.py +0 -0
  262. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/__init__.py +0 -0
  263. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/__init__.py +0 -0
  264. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/auth.py +0 -0
  265. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/core/__init__.py +0 -0
  266. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/engine/__init__.py +0 -0
  267. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/__init__.py +0 -0
  268. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/settings.py +0 -0
  269. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/inference.py +0 -0
  270. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/runtime.py +0 -0
  271. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/tui.py +0 -0
  272. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/__init__.py +0 -0
  273. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/__init__.py +0 -0
  274. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/__init__.py +0 -0
  275. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/base.py +0 -0
  276. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/builtins.py +0 -0
  277. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  278. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/gemini_audio.py +0 -0
  279. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/openai_audio.py +0 -0
  280. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/registry.py +0 -0
  281. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/sarvam_audio.py +0 -0
  282. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/utils.py +0 -0
  283. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/__init__.py +0 -0
  284. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/base.py +0 -0
  285. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/builtins.py +0 -0
  286. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/gemini_image.py +0 -0
  287. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/openai_image.py +0 -0
  288. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/openrouter.py +0 -0
  289. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/registry.py +0 -0
  290. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/registry.py +0 -0
  291. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/__init__.py +0 -0
  292. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/base.py +0 -0
  293. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/builtins.py +0 -0
  294. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/ollama_chat.py +0 -0
  295. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/registry.py +0 -0
  296. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/types.py +0 -0
  297. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/utils.py +0 -0
  298. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/__init__.py +0 -0
  299. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/base.py +0 -0
  300. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/builtins.py +0 -0
  301. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/fal_video.py +0 -0
  302. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/openrouter_video.py +0 -0
  303. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/registry.py +0 -0
  304. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/model/__init__.py +0 -0
  305. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/model/registry.py +0 -0
  306. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/__init__.py +0 -0
  307. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
  308. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/github_copilot.py +0 -0
  309. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/google_antigravity.py +0 -0
  310. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/openai_codex.py +0 -0
  311. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/pkce.py +0 -0
  312. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/types.py +0 -0
  313. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/utils.py +0 -0
  314. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/message/__init__.py +0 -0
  315. {tau_coding_agent-0.3.9/tau/tui/components → tau_coding_agent-0.4.5/tau/modes}/__init__.py +0 -0
  316. {tau_coding_agent-0.3.9/tau/utils → tau_coding_agent-0.4.5/tau/modes/interactive}/__init__.py +0 -0
  317. {tau_coding_agent-0.3.9/tau → tau_coding_agent-0.4.5/tau/modes}/rpc/types.py +0 -0
  318. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/__init__.py +0 -0
  319. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/expand.py +0 -0
  320. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/loader.py +0 -0
  321. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/registry.py +0 -0
  322. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/types.py +0 -0
  323. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/types.py +0 -0
  324. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/storage.py +0 -0
  325. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/utils.py +0 -0
  326. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/skills/loader.py +0 -0
  327. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/skills/types.py +0 -0
  328. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/themes/types.py +0 -0
  329. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/__init__.py +0 -0
  330. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/__init__.py +0 -0
  331. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/types.py +0 -0
  332. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/http_proxy.py +0 -0
  333. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/image_processing.py +0 -0
  334. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/secrets.py +0 -0
  335. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/version_check.py +0 -0
  336. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  337. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  338. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/requires.txt +0 -0
  339. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/top_level.txt +0 -0
  340. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_agent_prompt.py +0 -0
  341. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_auth_manager.py +0 -0
  342. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_auth_storage.py +0 -0
  343. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_engine_types.py +0 -0
  344. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_footer_utils.py +0 -0
  345. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_http_proxy.py +0 -0
  346. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_image_processing.py +0 -0
  347. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_api_text_utils.py +0 -0
  348. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_error_utils.py +0 -0
  349. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_types.py +0 -0
  350. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_utils.py +0 -0
  351. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_markdown.py +0 -0
  352. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_message_types.py +0 -0
  353. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_message_utils.py +0 -0
  354. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_model_registry.py +0 -0
  355. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_model_types.py +0 -0
  356. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_oauth_utils.py +0 -0
  357. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_pkce.py +0 -0
  358. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_prompts_expand.py +0 -0
  359. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_prompts_loader.py +0 -0
  360. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_prompts_registry.py +0 -0
  361. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_secrets.py +0 -0
  362. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_session_trust_persist.py +0 -0
  363. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_session_types.py +0 -0
  364. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_session_utils.py +0 -0
  365. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_settings_paths.py +0 -0
  366. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_settings_storage.py +0 -0
  367. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_settings_utils.py +0 -0
  368. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_skills_loader.py +0 -0
  369. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_skills_registry.py +0 -0
  370. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_text_llm_invoke.py +0 -0
  371. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_theme_loader.py +0 -0
  372. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_themes_registry.py +0 -0
  373. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_trust_manager.py +0 -0
  374. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_trust_utils.py +0 -0
  375. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_theme.py +0 -0
  376. {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_utils.py +0 -0
  377. {tau_coding_agent-0.3.9 → 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.3.9
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
@@ -35,7 +35,7 @@ Dynamic: license-file
35
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.
@@ -47,7 +47,7 @@ Start a conversation with the agent in the terminal.
47
47
  ### Installation
48
48
 
49
49
  ```bash
50
- pip install tau-coding-agent
50
+ uv pip install tau-coding-agent
51
51
  ```
52
52
 
53
53
  Or install from source:
@@ -3,7 +3,7 @@
3
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.
@@ -15,7 +15,7 @@ Start a conversation with the agent in the terminal.
15
15
  ### Installation
16
16
 
17
17
  ```bash
18
- pip install tau-coding-agent
18
+ uv pip install tau-coding-agent
19
19
  ```
20
20
 
21
21
  Or install from source:
@@ -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:
@@ -21,7 +21,7 @@ def register(tau):
21
21
  timeout = config.get("timeout_ms", 5000)
22
22
  ```
23
23
 
24
- In `~/.tau/settings.json` or `.tau/settings.json`:
24
+ The values are stored in `~/.tau/settings.json` (global) or `.tau/settings.json` (project-local):
25
25
 
26
26
  ```json
27
27
  {
@@ -39,6 +39,71 @@ In `~/.tau/settings.json` or `.tau/settings.json`:
39
39
  }
40
40
  ```
41
41
 
42
+ ### Where settings live
43
+
44
+ Settings for an extension are stored in the `settings` object of its entry inside `extensions.list`. Tau matches entries by path — the path in the list must match the path or directory the extension was loaded from.
45
+
46
+ **Project-local** — `.tau/settings.json` (only applies in this directory):
47
+
48
+ ```json
49
+ {
50
+ "extensions": {
51
+ "list": [
52
+ {
53
+ "path": ".tau/extensions/lsp",
54
+ "settings": {
55
+ "lsp": true,
56
+ "eager": [],
57
+ "servers": {
58
+ "pyright": { "enabled": true },
59
+ "ruff": { "enabled": true },
60
+ "typescript-language-server": { "enabled": false }
61
+ }
62
+ }
63
+ },
64
+ {
65
+ "path": ".tau/extensions/voice",
66
+ "settings": {
67
+ "enabled": true,
68
+ "stt_model": "whisper-1",
69
+ "stt_provider": "openai",
70
+ "hold_seconds": 2,
71
+ "sample_rate": 16000
72
+ }
73
+ }
74
+ ]
75
+ }
76
+ }
77
+ ```
78
+
79
+ **Global** — `~/.tau/settings.json` (applies to every project):
80
+
81
+ ```json
82
+ {
83
+ "extensions": {
84
+ "list": [
85
+ {
86
+ "path": "~/.tau/extensions/web-search",
87
+ "settings": {
88
+ "enabled": true,
89
+ "engine": "ddgs",
90
+ "results": 10
91
+ }
92
+ },
93
+ {
94
+ "path": "~/.tau/extensions/my_ext.py",
95
+ "settings": {
96
+ "api_key": "sk-...",
97
+ "timeout_ms": 5000
98
+ }
99
+ }
100
+ ]
101
+ }
102
+ }
103
+ ```
104
+
105
+ Both files can coexist — project settings are merged on top of global settings at startup. Extensions loaded from `.tau/extensions/` read from the project file; extensions loaded from `~/.tau/extensions/` read from the global file.
106
+
42
107
  ## Nested Structures
43
108
 
44
109
  `ExtensionSettings` handles nested configuration just as naturally:
@@ -237,7 +302,147 @@ def register(tau):
237
302
 
238
303
  Extensions can register settings items that appear as a named sub-panel at the bottom of the interactive `/settings` panel. Users can then edit extension settings from the TUI without touching JSON.
239
304
 
240
- ### Basic example
305
+ There are two ways to do this: declare the schema in `manifest.json` (recommended for directory extensions) or register it imperatively with `tau.register_settings()` (useful for single-file extensions).
306
+
307
+ ---
308
+
309
+ ### Option A — manifest.json schema (recommended)
310
+
311
+ Add a `"settings"` block under the `"tau"` key in `manifest.json`. Tau reads it at load time, builds the `/settings` sub-panel automatically, reads current values from the extension's config, and persists changes back to `settings.json` (reloading just that extension so the change applies live — no restart needed).
312
+
313
+ ```json
314
+ {
315
+ "tau": {
316
+ "extensions": ["__init__.py"],
317
+ "dependencies": ["requests"],
318
+ "settings": {
319
+ "title": "Web search",
320
+ "fields": [
321
+ {
322
+ "key": "enabled",
323
+ "label": "Enabled",
324
+ "type": "bool",
325
+ "default": true,
326
+ "description": "Enable or disable the web search extension."
327
+ },
328
+ {
329
+ "key": "engine",
330
+ "label": "Search engine",
331
+ "type": "enum",
332
+ "values": ["ddgs", "exa", "tavily"],
333
+ "default": "ddgs",
334
+ "description": "Which search backend to use."
335
+ },
336
+ {
337
+ "key": "results",
338
+ "label": "Max results",
339
+ "type": "int",
340
+ "default": 10,
341
+ "min": 1,
342
+ "max": 50,
343
+ "description": "Number of results returned per query."
344
+ },
345
+ {
346
+ "key": "api_key",
347
+ "label": "API key",
348
+ "type": "secret",
349
+ "default": "",
350
+ "description": "Provider API key (stored in settings.json)."
351
+ },
352
+ {
353
+ "key": "exa",
354
+ "label": "Exa settings",
355
+ "type": "group",
356
+ "fields": [
357
+ {
358
+ "key": "base_url",
359
+ "label": "Base URL",
360
+ "type": "string",
361
+ "default": "https://api.exa.ai"
362
+ },
363
+ {
364
+ "key": "highlights",
365
+ "label": "Highlights",
366
+ "type": "bool",
367
+ "default": true
368
+ }
369
+ ]
370
+ }
371
+ ]
372
+ }
373
+ }
374
+ }
375
+ ```
376
+
377
+ The corresponding `.tau/settings.json` entry that stores the current values:
378
+
379
+ ```json
380
+ {
381
+ "extensions": {
382
+ "list": [
383
+ {
384
+ "path": ".tau/extensions/web-search",
385
+ "settings": {
386
+ "enabled": true,
387
+ "engine": "exa",
388
+ "results": 20,
389
+ "api_key": "sk-exa-...",
390
+ "exa": {
391
+ "base_url": "https://api.exa.ai",
392
+ "highlights": false
393
+ }
394
+ }
395
+ }
396
+ ]
397
+ }
398
+ }
399
+ ```
400
+
401
+ #### Field types
402
+
403
+ | Type | UI control | Notes |
404
+ |------|-----------|-------|
405
+ | `bool` | Toggle `off` / `on` | Stored as a JSON boolean in settings |
406
+ | `int` | Text input (numeric) | Optional `min` and `max` clamps |
407
+ | `string` | Text input | Optional `pattern` (regex the value must match) |
408
+ | `secret` | Text input | Same as `string`; signals sensitive content |
409
+ | `text` | Text input | Same as `string`; intended for longer values |
410
+ | `enum` or `select` | Cycle through values on Enter | Requires a non-empty `"values"` list |
411
+ | `group` | Opens a nested sub-panel | Contains a `"fields"` list; keys are prefixed |
412
+
413
+ #### Field properties
414
+
415
+ | Property | Required | Description |
416
+ |----------|----------|-------------|
417
+ | `key` | Yes | Setting key. Supports dot-notation: `"exa.api_key"` is equivalent to nesting under a `"exa"` group |
418
+ | `label` | Yes | Display text shown in the `/settings` panel |
419
+ | `type` | No (defaults to `string`) | One of the types listed above |
420
+ | `default` | No | Fallback value when the key is absent from settings |
421
+ | `description` | No | Dimmed help text shown below the label |
422
+ | `values` | `enum`/`select` only | List of allowed values to cycle through |
423
+ | `min` / `max` | `int` only | Clamp the entered value to this range |
424
+ | `pattern` | `string`/`secret`/`text` | Regex the value must fully match; invalid input is silently ignored |
425
+ | `fields` | `group` only | Nested list of field definitions |
426
+
427
+ #### Summary badge
428
+
429
+ The first top-level `bool` field is automatically used as an on/off summary badge on the extension's parent row in the main `/settings` list. This lets users see at a glance whether an extension is enabled without opening its sub-panel.
430
+
431
+ #### Dot-notation keys
432
+
433
+ `"key": "exa.api_key"` at the top level is exactly equivalent to a field with `"key": "api_key"` nested inside a group with `"key": "exa"`. Both read and write the same path in settings:
434
+
435
+ ```json
436
+ { "exa": { "api_key": "sk-..." } }
437
+ ```
438
+
439
+ Use the explicit `group` type when you want the sub-panel to have a header label. Use dot-notation directly when you just want nested storage without the extra level of UI.
440
+
441
+ ---
442
+
443
+ ### Option B — `tau.register_settings()` (imperative)
444
+
445
+ #### Basic example
241
446
 
242
447
  ```python
243
448
  from tau.tui.components.settings_modal import SettingItem
@@ -254,7 +459,7 @@ def register(tau):
254
459
  ], title="My Extension", on_change=on_change)
255
460
  ```
256
461
 
257
- ### `tau.register_settings(items, title, on_change)`
462
+ #### `tau.register_settings(items, title, on_change)`
258
463
 
259
464
  Registers a sub-panel in `/settings` containing the provided items.
260
465
 
@@ -264,7 +469,7 @@ Registers a sub-panel in `/settings` containing the provided items.
264
469
  | `title` | `str` | The sub-panel title shown in the list |
265
470
  | `on_change` | `callable(key, value)` | Called when the user changes a value |
266
471
 
267
- ### `SettingItem` fields
472
+ #### `SettingItem` fields
268
473
 
269
474
  | Field | Type | Description |
270
475
  |-------|------|-------------|
@@ -278,7 +483,7 @@ Registers a sub-panel in `/settings` containing the provided items.
278
483
  | `submenu_settings` | `list[SettingItem] \| None` | Open a full nested sub-panel with these items (arbitrary depth) |
279
484
  | `submenu_on_change` | `callable \| None` | Overrides the parent `on_change` for a nested sub-panel |
280
485
 
281
- ### Nested sub-panels
486
+ #### Nested sub-panels
282
487
 
283
488
  A `SettingItem` with `submenu_settings` opens another level of the settings panel. Nesting can be arbitrarily deep. Use `submenu_on_change` to override the change callback for that level:
284
489
 
@@ -298,7 +503,7 @@ tau.register_settings([
298
503
  ], title="My Extension", on_change=on_change)
299
504
  ```
300
505
 
301
- ### `tau.settings.set_extension_config_key(ext_path, key, value)`
506
+ #### `tau.settings.set_extension_config_key(ext_path, key, value)`
302
507
 
303
508
  Persists a value back to `extensions.list[].settings` in `settings.json`.
304
509
 
@@ -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",