tau-coding-agent 0.7.2__tar.gz → 0.7.3__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 (500) hide show
  1. {tau_coding_agent-0.7.2/tau_coding_agent.egg-info → tau_coding_agent-0.7.3}/PKG-INFO +1 -1
  2. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/auth.md +1 -0
  3. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/inference-providers.md +30 -1
  4. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/pyproject.toml +1 -1
  5. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/agent/prompt/builder.py +1 -1
  6. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/agent/service.py +4 -1
  7. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/ask_user/component.py +43 -24
  8. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/ask_user/tool.py +3 -4
  9. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/footer/__init__.py +16 -0
  10. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/footer/model.py +16 -2
  11. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/loop/__init__.py +21 -6
  12. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/loop/duration.py +6 -7
  13. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/loop/state.py +16 -8
  14. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/subagent_schema.py +3 -9
  15. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/todo/__init__.py +10 -9
  16. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/todo/todo_schema.py +3 -1
  17. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/todo/todo_tool.py +12 -4
  18. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/models/text.py +715 -0
  19. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/providers/text.py +6 -0
  20. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/grep.py +6 -3
  21. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/ls.py +1 -1
  22. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/read.py +3 -1
  23. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/utils.py +0 -1
  24. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/engine/service.py +3 -1
  25. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/service.py +3 -1
  26. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/gemini_generate.py +13 -3
  27. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/google_antigravity.py +35 -3
  28. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/google_vertex.py +10 -2
  29. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/mistral_chat.py +8 -1
  30. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/openai_vertex.py +5 -0
  31. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/anthropic_claude_code.py +17 -4
  32. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/xai_grok.py +5 -4
  33. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/agent_hooks.py +20 -3
  34. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/session.py +1 -3
  35. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/message_list.py +1 -1
  36. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/settings_selector.py +6 -1
  37. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/spinner.py +86 -1
  38. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/theme.py +2 -0
  39. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/utils/format.py +8 -2
  40. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3/tau_coding_agent.egg-info}/PKG-INFO +1 -1
  41. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_builtin_tools.py +2 -1
  42. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_compaction.py +2 -4
  43. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_engine_length_and_live_tools.py +3 -1
  44. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_gemini_generate.py +3 -1
  45. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_google_antigravity.py +13 -7
  46. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_google_vertex.py +7 -2
  47. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_subagent_context.py +100 -45
  48. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_text_input.py +3 -1
  49. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tree_branch_restore.py +3 -1
  50. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/LICENSE +0 -0
  51. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/MANIFEST.in +0 -0
  52. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/README.md +0 -0
  53. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/architecture.md +0 -0
  54. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/cli-reference.md +0 -0
  55. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/creating-tools.md +0 -0
  56. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/development.md +0 -0
  57. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/docs.json +0 -0
  58. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/engine.md +0 -0
  59. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/extension-settings.md +0 -0
  60. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/extensions.md +0 -0
  61. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/http-proxy.md +0 -0
  62. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/index.md +0 -0
  63. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/inference.md +0 -0
  64. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/installation.md +0 -0
  65. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/keybindings.md +0 -0
  66. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/messages.md +0 -0
  67. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/project-context.md +0 -0
  68. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/project-structure.md +0 -0
  69. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/prompts.md +0 -0
  70. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/python-api.md +0 -0
  71. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/quickstart.md +0 -0
  72. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/sessions.md +0 -0
  73. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/settings.md +0 -0
  74. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/skills.md +0 -0
  75. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/themes.md +0 -0
  76. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/tools.md +0 -0
  77. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/tui.md +0 -0
  78. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/docs/usage.md +0 -0
  79. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/setup.cfg +0 -0
  80. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/__init__.py +0 -0
  81. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/agent/__init__.py +0 -0
  82. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/agent/embedded.py +0 -0
  83. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/agent/prompt/__init__.py +0 -0
  84. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/agent/prompt/types.py +0 -0
  85. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/agent/types.py +0 -0
  86. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/auth/manager.py +0 -0
  87. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/auth/storage.py +0 -0
  88. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/auth/types.py +0 -0
  89. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/__init__.py +0 -0
  90. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/commands/__init__.py +0 -0
  91. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/commands/clear.py +0 -0
  92. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/commands/compact.py +0 -0
  93. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/commands/reload.py +0 -0
  94. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/commands/session.py +0 -0
  95. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/ask_user/__init__.py +0 -0
  96. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/ask_user/manifest.json +0 -0
  97. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/ask_user/schema.py +0 -0
  98. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/btw/__init__.py +0 -0
  99. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/footer/git.py +0 -0
  100. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/footer/utils.py +0 -0
  101. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/header/__init__.py +0 -0
  102. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/loop/README.md +0 -0
  103. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/loop/dispatch.py +0 -0
  104. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/sandbox/__init__.py +0 -0
  105. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/sandbox/manager.py +0 -0
  106. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/sandbox/manifest.json +0 -0
  107. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/sandbox/sandbox_tool.py +0 -0
  108. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/__init__.py +0 -0
  109. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/context-builder.md +0 -0
  110. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/delegate.md +0 -0
  111. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/oracle.md +0 -0
  112. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/planner.md +0 -0
  113. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/researcher.md +0 -0
  114. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/reviewer.md +0 -0
  115. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/scout.md +0 -0
  116. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents/worker.md +0 -0
  117. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/agents.py +0 -0
  118. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/manifest.json +0 -0
  119. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/subagent/subagent_tool.py +0 -0
  120. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/todo/manifest.json +0 -0
  121. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/watch/__init__.py +0 -0
  122. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/__init__.py +0 -0
  123. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/engines/__init__.py +0 -0
  124. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/engines/base.py +0 -0
  125. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/engines/ddgs_engine.py +0 -0
  126. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/engines/exa_engine.py +0 -0
  127. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/engines/jina_engine.py +0 -0
  128. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/engines/tavily_engine.py +0 -0
  129. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/manifest.json +0 -0
  130. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/tools/__init__.py +0 -0
  131. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/tools/fetch.py +0 -0
  132. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/web/tools/search.py +0 -0
  133. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/workflow/__init__.py +0 -0
  134. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/workflow/agent_discovery.py +0 -0
  135. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/workflow/manifest.json +0 -0
  136. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/workflow/model.py +0 -0
  137. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/workflow/runner.py +0 -0
  138. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/workflow/skills/create-workflows/SKILL.md +0 -0
  139. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/extensions/workflow/store.py +0 -0
  140. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/models/__init__.py +0 -0
  141. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/models/audio.py +0 -0
  142. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/models/image.py +0 -0
  143. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/models/video.py +0 -0
  144. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/prompts/commit.md +0 -0
  145. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/prompts/docs.md +0 -0
  146. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/prompts/explain.md +0 -0
  147. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/prompts/fix.md +0 -0
  148. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/prompts/refactor.md +0 -0
  149. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/prompts/review.md +0 -0
  150. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/prompts/test.md +0 -0
  151. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/providers/__init__.py +0 -0
  152. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/providers/audio.py +0 -0
  153. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/providers/image.py +0 -0
  154. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/providers/video.py +0 -0
  155. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/skills/code-review/SKILL.md +0 -0
  156. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/skills/debug/SKILL.md +0 -0
  157. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  158. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
  159. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
  160. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/ayu-dark.yaml +0 -0
  161. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/catppuccin.yaml +0 -0
  162. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/dark.yaml +0 -0
  163. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/dracula.yaml +0 -0
  164. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/everforest.yaml +0 -0
  165. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/gruvbox.yaml +0 -0
  166. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/horizon.yaml +0 -0
  167. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/kanagawa.yaml +0 -0
  168. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/light.yaml +0 -0
  169. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/material-ocean.yaml +0 -0
  170. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/monokai.yaml +0 -0
  171. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/night-owl.yaml +0 -0
  172. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/nord.yaml +0 -0
  173. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/one-dark.yaml +0 -0
  174. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/rose-pine.yaml +0 -0
  175. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/solarized-dark.yaml +0 -0
  176. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/themes/tokyo-night.yaml +0 -0
  177. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/__init__.py +0 -0
  178. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/edit.py +0 -0
  179. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/glob.py +0 -0
  180. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/terminal.py +0 -0
  181. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/builtins/tools/write.py +0 -0
  182. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/commands/__init__.py +0 -0
  183. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/commands/registry.py +0 -0
  184. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/commands/types.py +0 -0
  185. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/console/__init__.py +0 -0
  186. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/console/cli.py +0 -0
  187. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/console/commands/__init__.py +0 -0
  188. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/console/commands/auth.py +0 -0
  189. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/console/commands/packages.py +0 -0
  190. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/console/commands/update.py +0 -0
  191. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/core/__init__.py +0 -0
  192. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/core/registry.py +0 -0
  193. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/engine/__init__.py +0 -0
  194. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/engine/types.py +0 -0
  195. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/extensions/__init__.py +0 -0
  196. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/extensions/api.py +0 -0
  197. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/extensions/context.py +0 -0
  198. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/extensions/loader.py +0 -0
  199. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/extensions/runtime.py +0 -0
  200. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/extensions/settings.py +0 -0
  201. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/__init__.py +0 -0
  202. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/engine.py +0 -0
  203. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/inference.py +0 -0
  204. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/runtime.py +0 -0
  205. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/session.py +0 -0
  206. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/tui.py +0 -0
  207. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/hooks/types.py +0 -0
  208. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/__init__.py +0 -0
  209. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/__init__.py +0 -0
  210. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/__init__.py +0 -0
  211. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/base.py +0 -0
  212. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/builtins.py +0 -0
  213. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  214. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/gemini_audio.py +0 -0
  215. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/openai_audio.py +0 -0
  216. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/registry.py +0 -0
  217. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/sarvam_audio.py +0 -0
  218. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/service.py +0 -0
  219. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/audio/utils.py +0 -0
  220. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/availability.py +0 -0
  221. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/__init__.py +0 -0
  222. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/base.py +0 -0
  223. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/builtins.py +0 -0
  224. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/gemini_image.py +0 -0
  225. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/openai_image.py +0 -0
  226. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/openrouter.py +0 -0
  227. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/registry.py +0 -0
  228. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/image/service.py +0 -0
  229. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/registry.py +0 -0
  230. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/__init__.py +0 -0
  231. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/anthropic_claude_code.py +0 -0
  232. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/anthropic_messages.py +0 -0
  233. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/anthropic_vertex.py +0 -0
  234. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/base.py +0 -0
  235. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/builtins.py +0 -0
  236. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/dialect.py +0 -0
  237. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/github_copilot_chat.py +0 -0
  238. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/ollama_chat.py +0 -0
  239. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/openai_codex_responses.py +0 -0
  240. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/openai_completions.py +0 -0
  241. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/openai_responses.py +0 -0
  242. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/registry.py +0 -0
  243. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/service.py +0 -0
  244. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/types.py +0 -0
  245. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/utils.py +0 -0
  246. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/text/xai_responses.py +0 -0
  247. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/__init__.py +0 -0
  248. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/base.py +0 -0
  249. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/builtins.py +0 -0
  250. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/fal_video.py +0 -0
  251. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/openrouter_video.py +0 -0
  252. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/registry.py +0 -0
  253. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/service.py +0 -0
  254. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/api/video/zai_video.py +0 -0
  255. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/model/__init__.py +0 -0
  256. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/model/registry.py +0 -0
  257. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/model/types.py +0 -0
  258. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/__init__.py +0 -0
  259. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/__init__.py +0 -0
  260. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/github_copilot.py +0 -0
  261. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/google_antigravity.py +0 -0
  262. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/openai_codex.py +0 -0
  263. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/pkce.py +0 -0
  264. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/types.py +0 -0
  265. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/oauth/utils.py +0 -0
  266. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/registry.py +0 -0
  267. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/provider/types.py +0 -0
  268. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/types.py +0 -0
  269. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/inference/utils.py +0 -0
  270. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/message/__init__.py +0 -0
  271. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/message/types.py +0 -0
  272. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/message/utils.py +0 -0
  273. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/__init__.py +0 -0
  274. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/__init__.py +0 -0
  275. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/app.py +1 -1
  276. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/__init__.py +0 -0
  277. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/appearance.py +0 -0
  278. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/auth.py +0 -0
  279. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/context.py +0 -0
  280. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/extensions.py +0 -0
  281. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/misc.py +0 -0
  282. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/commands/model.py +0 -0
  283. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/__init__.py +0 -0
  284. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/command_palette.py +0 -0
  285. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/config_selector.py +0 -0
  286. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/extension_selector.py +0 -0
  287. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/file_picker.py +0 -0
  288. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/layout.py +0 -0
  289. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/model_selector.py +0 -0
  290. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/oauth_selector.py +0 -0
  291. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/overlays.py +0 -0
  292. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/selector_controller.py +0 -0
  293. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/session_selector.py +0 -0
  294. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/theme_selector.py +0 -0
  295. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/thinking_selector.py +0 -0
  296. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/tree_selector.py +0 -0
  297. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/trust_screen.py +0 -0
  298. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/components/voice_selector.py +0 -0
  299. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/input_handler.py +0 -0
  300. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/interactive/ui_context.py +0 -0
  301. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/print/__init__.py +0 -0
  302. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/rpc/__init__.py +0 -0
  303. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/rpc/mode.py +0 -0
  304. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/modes/rpc/types.py +0 -0
  305. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/packages/__init__.py +0 -0
  306. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/packages/manager.py +0 -0
  307. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/packages/types.py +0 -0
  308. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/packages/utils.py +0 -0
  309. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/prompts/expand.py +0 -0
  310. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/prompts/loader.py +0 -0
  311. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/prompts/registry.py +0 -0
  312. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/prompts/types.py +0 -0
  313. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/resources/__init__.py +0 -0
  314. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/resources/loader.py +0 -0
  315. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/resources/types.py +0 -0
  316. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/runtime/dependencies.py +0 -0
  317. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/runtime/service.py +0 -0
  318. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/runtime/types.py +0 -0
  319. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/session/branch_summarization.py +0 -0
  320. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/session/compaction.py +0 -0
  321. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/session/manager.py +0 -0
  322. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/session/types.py +0 -0
  323. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/session/utils.py +0 -0
  324. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/settings/manager.py +0 -0
  325. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/settings/paths.py +0 -0
  326. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/settings/storage.py +0 -0
  327. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/settings/types.py +0 -0
  328. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/settings/utils.py +0 -0
  329. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/skills/loader.py +0 -0
  330. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/skills/registry.py +0 -0
  331. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/skills/types.py +0 -0
  332. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/telemetry/__init__.py +0 -0
  333. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/telemetry/service.py +0 -0
  334. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/telemetry/types.py +0 -0
  335. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/themes/loader.py +0 -0
  336. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/themes/registry.py +0 -0
  337. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/themes/types.py +0 -0
  338. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tool/__init__.py +0 -0
  339. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tool/registry.py +0 -0
  340. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tool/render.py +0 -0
  341. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tool/types.py +0 -0
  342. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/trust/__init__.py +0 -0
  343. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/trust/manager.py +0 -0
  344. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/trust/types.py +0 -0
  345. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/trust/utils.py +0 -0
  346. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/__init__.py +1 -1
  347. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/ansi_bridge.py +0 -0
  348. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/autocomplete.py +0 -0
  349. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/backend.py +0 -0
  350. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/buffer.py +0 -0
  351. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/component.py +0 -0
  352. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/__init__.py +0 -0
  353. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/box.py +0 -0
  354. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/editor.py +0 -0
  355. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/image.py +0 -0
  356. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/select_list.py +0 -0
  357. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/simple_picker.py +0 -0
  358. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/text_input.py +0 -0
  359. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/components/widget_bridge.py +0 -0
  360. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/frame.py +0 -0
  361. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/geometry.py +0 -0
  362. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/input.py +0 -0
  363. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/keybinding_hints.py +0 -0
  364. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/layout.py +0 -0
  365. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/markdown.py +0 -0
  366. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/palette.py +0 -0
  367. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/service.py +0 -0
  368. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/style.py +0 -0
  369. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/terminal.py +0 -0
  370. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/testing.py +0 -0
  371. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/text.py +0 -0
  372. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/utils.py +0 -0
  373. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widget.py +0 -0
  374. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/__init__.py +0 -0
  375. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/barchart.py +0 -0
  376. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/block.py +0 -0
  377. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/calendar.py +0 -0
  378. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/canvas.py +0 -0
  379. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/chart.py +0 -0
  380. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/clear.py +0 -0
  381. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/gauge.py +0 -0
  382. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/list.py +0 -0
  383. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/paragraph.py +0 -0
  384. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/scrollbar.py +0 -0
  385. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/sparkline.py +0 -0
  386. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/symbols.py +0 -0
  387. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/table.py +0 -0
  388. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/tui/widgets/tabs.py +0 -0
  389. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/utils/__init__.py +0 -0
  390. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/utils/http_proxy.py +0 -0
  391. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/utils/image_processing.py +0 -0
  392. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/utils/secrets.py +0 -0
  393. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau/utils/version_check.py +0 -0
  394. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau_coding_agent.egg-info/SOURCES.txt +0 -0
  395. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  396. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  397. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau_coding_agent.egg-info/requires.txt +0 -0
  398. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tau_coding_agent.egg-info/top_level.txt +0 -0
  399. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_agent_compaction.py +0 -0
  400. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_agent_hooks.py +0 -0
  401. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_agent_prompt.py +0 -0
  402. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_agent_types.py +0 -0
  403. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_ansi.py +0 -0
  404. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_ansi_bridge_legacy_image.py +0 -0
  405. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_anthropic_tool_history.py +0 -0
  406. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_ask_user_extension.py +0 -0
  407. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_audio_transcription_apis.py +0 -0
  408. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_auth_command.py +0 -0
  409. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_auth_manager.py +0 -0
  410. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_auth_storage.py +0 -0
  411. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_autocomplete_modifiers.py +0 -0
  412. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_branch_navigation.py +0 -0
  413. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_branch_summarization.py +0 -0
  414. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_builtin_watch.py +0 -0
  415. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_cli_inputs.py +0 -0
  416. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_cmd_copy.py +0 -0
  417. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_command_execution_policy.py +0 -0
  418. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_command_registry.py +0 -0
  419. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_component_buffer_bridge.py +0 -0
  420. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_diff.py +0 -0
  421. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_editor_protocol.py +0 -0
  422. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_engine_execution.py +0 -0
  423. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_engine_steering.py +0 -0
  424. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_engine_types.py +0 -0
  425. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_escape_behavior.py +0 -0
  426. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_extension_api.py +0 -0
  427. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_extension_lifecycle.py +0 -0
  428. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_footer_model.py +0 -0
  429. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_footer_utils.py +0 -0
  430. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_fuzzy.py +0 -0
  431. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_http_proxy.py +0 -0
  432. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_image_processing.py +0 -0
  433. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_inference_api_text_utils.py +0 -0
  434. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_inference_dialect.py +0 -0
  435. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_inference_error_utils.py +0 -0
  436. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_inference_types.py +0 -0
  437. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_inference_utils.py +0 -0
  438. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_keybindings.py +0 -0
  439. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_layout_render_cells.py +0 -0
  440. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_markdown.py +0 -0
  441. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_message_list_frozen.py +0 -0
  442. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_message_types.py +0 -0
  443. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_message_utils.py +0 -0
  444. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_model_availability.py +0 -0
  445. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_model_command.py +0 -0
  446. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_model_registry.py +0 -0
  447. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_model_selector_modal.py +0 -0
  448. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_model_types.py +0 -0
  449. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_oauth_utils.py +0 -0
  450. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_package_resources.py +0 -0
  451. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_packages_utils.py +0 -0
  452. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_peer_extension.py +0 -0
  453. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_pkce.py +0 -0
  454. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_prompts_expand.py +0 -0
  455. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_prompts_loader.py +0 -0
  456. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_prompts_registry.py +0 -0
  457. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_provider_registry.py +0 -0
  458. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_resource_loader.py +0 -0
  459. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_rpc_mode.py +0 -0
  460. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_runtime_sdk.py +0 -0
  461. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_scrollback_raw_writes.py +0 -0
  462. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_scrollback_terminal.py +0 -0
  463. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_secrets.py +0 -0
  464. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_select_list_render_cells.py +0 -0
  465. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_selector_controller.py +0 -0
  466. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_session_manager.py +0 -0
  467. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_session_trust_persist.py +0 -0
  468. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_session_types.py +0 -0
  469. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_session_utils.py +0 -0
  470. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_settings_manager.py +0 -0
  471. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_settings_paths.py +0 -0
  472. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_settings_storage.py +0 -0
  473. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_settings_utils.py +0 -0
  474. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_skills_loader.py +0 -0
  475. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_skills_registry.py +0 -0
  476. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_strip_control_chars.py +0 -0
  477. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_telemetry.py +0 -0
  478. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_text_input_render_cells.py +0 -0
  479. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_text_llm_invoke.py +0 -0
  480. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_text_llm_model_resolution.py +0 -0
  481. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_theme_loader.py +0 -0
  482. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_themes_registry.py +0 -0
  483. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_thinking_render.py +0 -0
  484. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tool_registry.py +0 -0
  485. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tool_render.py +0 -0
  486. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_trust_manager.py +0 -0
  487. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_trust_utils.py +0 -0
  488. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_capabilities.py +0 -0
  489. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_child_rows.py +0 -0
  490. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_input.py +0 -0
  491. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_layout_sizing.py +0 -0
  492. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_public_api.py +0 -0
  493. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_renderer.py +0 -0
  494. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_select_list.py +0 -0
  495. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_theme.py +0 -0
  496. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_tui_utils.py +0 -0
  497. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_ui_context.py +0 -0
  498. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_utils_hashline.py +0 -0
  499. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_version_check.py +0 -0
  500. {tau_coding_agent-0.7.2 → tau_coding_agent-0.7.3}/tests/test_voice_selector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tau-coding-agent
3
- Version: 0.7.2
3
+ Version: 0.7.3
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
@@ -144,6 +144,7 @@ The provider ID used as the key in `auth.json` and the `{PROVIDER}_API_KEY` env
144
144
  | Google | `google` | `GOOGLE_API_KEY` |
145
145
  | Mistral | `mistral` | `MISTRAL_API_KEY` |
146
146
  | Fireworks AI | `fireworks` | `FIREWORKS_API_KEY` |
147
+ | Hugging Face | `huggingface` | `HUGGINGFACE_API_KEY` |
147
148
  | Ollama | `ollama` | `OLLAMA_API_KEY` |
148
149
 
149
150
  ## Next Steps
@@ -8,7 +8,8 @@ Tau supports the following inference providers:
8
8
 
9
9
  Built-in API-key providers are `openai`, `anthropic`, `google`, `nvidia`,
10
10
  `groq`, `openrouter`, `perplexity`, `xai`, `bedrock`, `kimi`, `minimax`,
11
- `cerebras`, `deepseek`, `zai`, `kilocode`, `fireworks`, and `mistral`.
11
+ `cerebras`, `deepseek`, `zai`, `kilocode`, `fireworks`, `huggingface`, and
12
+ `mistral`.
12
13
 
13
14
  Tau also includes local `ollama`, Google/Anthropic/OpenAI-compatible Vertex AI
14
15
  providers, and OAuth providers for OpenAI Codex, Claude Code, GitHub Copilot,
@@ -132,6 +133,34 @@ tau --model fireworks/accounts/fireworks/models/llama-v3p3-70b-instruct -p "Say
132
133
  - Uses the OpenAI-compatible completions API under the hood
133
134
  - Session affinity is maintained automatically via a per-request `x-session-affinity` header
134
135
 
136
+ ## Hugging Face
137
+
138
+ Hugging Face's Inference Providers router gives OpenAI-compatible access to
139
+ open-source models (DeepSeek, Llama, Qwen, Mixtral, and more) hosted across
140
+ its partner inference providers.
141
+
142
+ ### Setup
143
+
144
+ 1. Create an account at [Hugging Face](https://huggingface.co)
145
+ 2. Generate an access token at [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) (a `read` token is sufficient)
146
+ 3. Set the environment variable:
147
+
148
+ ```bash
149
+ export HUGGINGFACE_API_KEY=hf_...
150
+ ```
151
+
152
+ ### Verify
153
+
154
+ ```bash
155
+ tau --model huggingface/deepseek-ai/DeepSeek-V3-0324 -p "Say hello"
156
+ ```
157
+
158
+ ### Notes
159
+
160
+ - Uses the OpenAI-compatible completions API under the hood, routed through `https://router.huggingface.co/v1`
161
+ - Model IDs are Hugging Face Hub repo IDs (e.g. `meta-llama/Llama-3.3-70B-Instruct`)
162
+ - Built-in model entries are pinned to a specific backend with `<repo>:<provider>` (e.g. `openai/gpt-oss-120b:groq`) rather than the router's default `:fastest` routing, since unpinned routing can silently switch to a backend with different tool-calling behavior. You can still use any model/backend combination the router supports via `tau --model huggingface/<repo>[:<provider>]` even if it isn't in the built-in list.
163
+
135
164
  ## Ollama (Local)
136
165
 
137
166
  Run open-source models locally without API keys or internet.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tau-coding-agent"
7
- version = "0.7.2"
7
+ version = "0.7.3"
8
8
  description = "A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -225,7 +225,7 @@ def _detect_shell() -> str:
225
225
  if shell:
226
226
  return Path(shell).name
227
227
  if sys.platform == "win32":
228
- if os.environ.get("PSModulePath"):
228
+ if os.environ.get("PSModulePath"): # noqa: SIM112 — actual Windows env var casing
229
229
  return "powershell"
230
230
  comspec = os.environ.get("COMSPEC", "")
231
231
  return Path(comspec).stem if comspec else "cmd"
@@ -544,7 +544,10 @@ class Agent:
544
544
  last = self._session_manager.find_last_assistant_message()
545
545
  if last is None:
546
546
  return False
547
- if last.error_kind != ErrorKind.CONTEXT_OVERFLOW and not self._estimate_indicates_overflow():
547
+ if (
548
+ last.error_kind != ErrorKind.CONTEXT_OVERFLOW
549
+ and not self._estimate_indicates_overflow()
550
+ ):
548
551
  return False
549
552
 
550
553
  # Model-switch guard: the overflow error is from a different model if it predates
@@ -7,6 +7,8 @@ from schema import FREEFORM_LABEL, AskUserOption # type: ignore[import-not-foun
7
7
 
8
8
  from tau.tui.component import Component
9
9
  from tau.tui.input import InputEvent, KeyEvent
10
+ from tau.tui.style import RESET
11
+ from tau.tui.theme import LayoutTheme
10
12
 
11
13
  if TYPE_CHECKING:
12
14
  from tau.tui.buffer import Buffer
@@ -48,6 +50,7 @@ class _AskUserComponent(Component):
48
50
  allow_freeform: bool,
49
51
  multiline: bool,
50
52
  on_done: Any,
53
+ theme: LayoutTheme | None = None,
51
54
  ) -> None:
52
55
  self._question = question
53
56
  self._context = context
@@ -56,6 +59,7 @@ class _AskUserComponent(Component):
56
59
  self._allow_freeform = allow_freeform
57
60
  self._multiline = multiline
58
61
  self._on_done = on_done
62
+ self._theme = theme or LayoutTheme()
59
63
 
60
64
  self._cursor = 0
61
65
  self._checked: set[int] = set()
@@ -102,12 +106,13 @@ class _AskUserComponent(Component):
102
106
  row += parse_ansi_wrapped_into(buf, x, y + row, line, width)
103
107
  return row
104
108
 
109
+ t = self._theme
105
110
  header: list[str] = []
106
111
  if self._context:
107
112
  for line in self._context.splitlines():
108
- header.append(f" \x1b[2m{line}\x1b[0m")
113
+ header.append(f" {t.muted.sgr()}{line}{RESET}")
109
114
  header.append("")
110
- header.append(f" \x1b[1m{self._question}\x1b[0m")
115
+ header.append(f" {t.accent.sgr()}{self._question}{RESET}")
111
116
  header.append("")
112
117
 
113
118
  header_rows = _write(header, area.x, area.y, area.width)
@@ -135,7 +140,9 @@ class _AskUserComponent(Component):
135
140
  preview_box = self._build_preview_box(preview, right_width, box_height)
136
141
 
137
142
  left_rows = _write(content_lines, area.x, body_y, left_width)
138
- right_rows = _write(preview_box, area.x + left_width + self.PREVIEW_GAP, body_y, right_width)
143
+ right_rows = _write(
144
+ preview_box, area.x + left_width + self.PREVIEW_GAP, body_y, right_width
145
+ )
139
146
  col_rows = max(left_rows, right_rows)
140
147
 
141
148
  # Footer spans the FULL width beneath both columns — it's not part of
@@ -180,23 +187,23 @@ class _AskUserComponent(Component):
180
187
  for _ in range(self.ML_MIN_VISIBLE_ROWS - len(visible)):
181
188
  inner.append("")
182
189
  total = len(self._ml_lines)
190
+ muted = self._theme.muted.sgr()
183
191
  if total > self.ML_VISIBLE_ROWS:
184
192
  pct = int(self._ml_scroll_top / max(1, total - self.ML_VISIBLE_ROWS) * 100)
185
- inner.append(f" \x1b[2m↕ {pct}%\x1b[0m")
193
+ inner.append(f" {muted}↕ {pct}%{RESET}")
186
194
  else:
187
195
  inner.append("")
188
196
  back = "Esc to cancel" if not self._options else "Esc to go back"
189
197
  footer = [
190
198
  "",
191
- " \x1b[2mEnter to submit · \\+Enter or Shift+Enter for newline · "
192
- f"{back}\x1b[0m",
199
+ f" {muted}Enter to submit · \\+Enter or Shift+Enter for newline · {back}{RESET}",
193
200
  ]
194
201
  return inner, footer
195
202
 
196
203
  def _build_singleline_body(self) -> tuple[list[str], list[str]]:
197
204
  back = "Esc to cancel" if not self._options else "Esc to go back"
198
205
  content = [f" {self._freeform_value}█"]
199
- footer = ["", f" \x1b[2mEnter to submit · {back}\x1b[0m"]
206
+ footer = ["", f" {self._theme.muted.sgr()}Enter to submit · {back}{RESET}"]
200
207
  return content, footer
201
208
 
202
209
  # Left margin + hanging indent for wrapped description lines beneath a
@@ -205,6 +212,13 @@ class _AskUserComponent(Component):
205
212
  DESC_INDENT = " "
206
213
 
207
214
  def _build_list_body(self, width: int) -> tuple[list[str], list[str]]:
215
+ t = self._theme
216
+ muted = t.muted.sgr()
217
+ success = t.success.sgr()
218
+ accent = t.accent.sgr()
219
+ emphasis = t.emphasis.sgr()
220
+ arrow = t.selector_arrow
221
+
208
222
  inner: list[str] = []
209
223
  desc_width = max(width - len(self.DESC_INDENT), 10)
210
224
 
@@ -213,51 +227,56 @@ class _AskUserComponent(Component):
213
227
  title = FREEFORM_LABEL if is_freeform_row else self._options[i].title
214
228
  desc = "" if is_freeform_row else (self._options[i].description or "")
215
229
  is_cursor = i == self._cursor
216
- cursor_mark = "❯" if is_cursor else " "
230
+
231
+ # Settings-selector style: per-span colors, no reversed background.
232
+ # The moving cursor arrow is always accent-colored; the row label
233
+ # is emphasis (selected) or muted (normal). Any inline color used
234
+ # inside the row — e.g. the checkbox glyph — must resume title_sgr
235
+ # right after its own RESET, since ANSI styles don't nest.
236
+ title_sgr = emphasis if is_cursor else muted
237
+ cursor_mark = f"{accent}{arrow}{RESET}{title_sgr}" if is_cursor else " "
217
238
 
218
239
  if is_freeform_row:
219
240
  # Synthetic action row, not a countable option — keeps its own
220
- # "❯" marker instead of a number.
221
- marker = " "
241
+ # arrow marker instead of a number. Suppressed when this row
242
+ # is also the cursor row, since cursor_mark already shows an
243
+ # arrow there — otherwise it doubles up as "❯ ❯ Type…".
244
+ marker = f" {arrow} " if not is_cursor else " "
222
245
  elif self._allow_multiple:
223
246
  # Same tick glyphs as the /extensions config panel, paired with
224
- # the option's ordinal number. Cursor rows get wrapped in
225
- # reverse-video below, so leave them uncolored here — an
226
- # embedded reset would cut the highlight short.
247
+ # the option's ordinal number.
227
248
  if i in self._checked:
228
- box = "✔" if is_cursor else "\x1b[32m✔\x1b[0m"
249
+ box = f"{success}{RESET}{title_sgr}"
229
250
  else:
230
- box = "✖" if is_cursor else "\x1b[2m✖\x1b[0m"
251
+ box = f"{muted}{RESET}{title_sgr}"
231
252
  marker = f"{i + 1}. {box}"
232
253
  else:
233
254
  marker = f"{i + 1}."
234
255
 
235
256
  row = f" {cursor_mark} {marker} {title}"
236
- if is_cursor:
237
- row = f"\x1b[7m{row}\x1b[0m"
257
+ row = f"{title_sgr}{row}{RESET}"
238
258
  inner.append(row)
239
259
 
240
260
  # Description on its own hanging-indented line(s) below the title,
241
261
  # not packed onto the title row — at left-column widths that
242
262
  # would run straight into the next option's row.
243
263
  for line in textwrap.wrap(desc, desc_width) if desc else []:
244
- inner.append(f"{self.DESC_INDENT}\x1b[2m{line}\x1b[0m")
264
+ inner.append(f"{self.DESC_INDENT}{muted}{line}{RESET}")
245
265
 
246
266
  hints = ["↑/↓ move", "Enter confirm", "Esc cancel"]
247
267
  if self._allow_multiple:
248
268
  hints.insert(1, "Space toggle")
249
- footer = ["", " \x1b[2m" + " · ".join(hints) + "\x1b[0m"]
269
+ footer = ["", f" {muted}" + " · ".join(hints) + RESET]
250
270
  return inner, footer
251
271
 
252
- @staticmethod
253
- def _build_preview_box(preview: str | None, width: int, height: int) -> list[str]:
272
+ def _build_preview_box(self, preview: str | None, width: int, height: int) -> list[str]:
254
273
  """A bordered box of exactly ``height`` lines, sized to ``width``.
255
274
 
256
275
  Content beyond the available rows is truncated with a "N lines hidden"
257
276
  footer rather than growing the box — the box height is pinned to the
258
277
  paired option list so the two columns stay aligned row-for-row.
259
278
  """
260
- dim, reset = "\x1b[2m", "\x1b[0m"
279
+ dim, reset = self._theme.border.sgr(), RESET
261
280
  inner_width = max(width - 4, 4)
262
281
  top = f"{dim}┌{'─' * (width - 2)}┐{reset}"
263
282
  bottom = f"{dim}└{'─' * (width - 2)}┘{reset}"
@@ -467,5 +486,5 @@ class _AskUserComponent(Component):
467
486
  def invalidate(self) -> None:
468
487
  pass
469
488
 
470
- def set_theme(self, theme: Any) -> None:
471
- pass
489
+ def set_theme(self, theme: LayoutTheme) -> None:
490
+ self._theme = theme
@@ -50,7 +50,7 @@ class AskUserTool(Tool):
50
50
  "assumptions that would materially change the implementation. Each "
51
51
  "question supports single-select, multi-select, and freeform text "
52
52
  "answers, and up to 4 options when options are given. If you recommend a "
53
- "specific option, list it first and append \"(Recommended)\" to its "
53
+ 'specific option, list it first and append "(Recommended)" to its '
54
54
  "title. Only available in an interactive TUI session."
55
55
  ),
56
56
  schema=AskUserParams,
@@ -112,9 +112,7 @@ class AskUserTool(Tool):
112
112
  else:
113
113
  content = ", ".join(response["selections"])
114
114
 
115
- answers.append(
116
- {"question": question.question, "response": content, "raw": response}
117
- )
115
+ answers.append({"question": question.question, "response": content, "raw": response})
118
116
 
119
117
  return ToolResult.ok(
120
118
  invocation.id,
@@ -149,6 +147,7 @@ class AskUserTool(Tool):
149
147
  allow_freeform=question.allow_freeform,
150
148
  multiline=question.multiline,
151
149
  on_done=lambda v: (_on_done(v), done(v)),
150
+ theme=_theme,
152
151
  )
153
152
  if timeout:
154
153
  timeout_ms = timeout
@@ -65,6 +65,22 @@ def register(tau: ExtensionAPI) -> None:
65
65
  model_badge.update_context_from_ctx(ctx)
66
66
  _request_render(ctx)
67
67
 
68
+ @tau.on("message_update")
69
+ def on_message_update(event: Any, ctx: Any) -> None:
70
+ if not ctx.has_ui:
71
+ return
72
+ from tau.message.types import TextContent, ThinkingContent
73
+
74
+ msg = getattr(event, "message", None)
75
+ if msg is None:
76
+ return
77
+ contents = getattr(msg, "contents", [])
78
+ char_count = sum(
79
+ len(item.content) for item in contents if isinstance(item, (TextContent, ThinkingContent))
80
+ )
81
+ model_badge.set_live_estimate(char_count // 4)
82
+ _request_render(ctx)
83
+
68
84
  @tau.on("thinking_level_select")
69
85
  def on_thinking_level_select(event: Any, ctx: Any) -> None:
70
86
  if not ctx.has_ui:
@@ -27,6 +27,10 @@ class ModelBadge(Component):
27
27
  self._context_window = 0
28
28
  self._thinking = False
29
29
  self._thinking_level = ""
30
+ # Char-based estimate of the still-streaming message's token count,
31
+ # added on top of _tokens so the percentage climbs live; cleared
32
+ # whenever a new authoritative count lands via set_context.
33
+ self._live_estimate = 0
30
34
 
31
35
  def set_model(self, model_id: str, provider: str, thinking: bool = False) -> None:
32
36
  self._model = model_id
@@ -39,6 +43,15 @@ class ModelBadge(Component):
39
43
  def set_context(self, tokens: int, context_window: int) -> None:
40
44
  self._tokens = tokens
41
45
  self._context_window = context_window
46
+ self._live_estimate = 0
47
+
48
+ def set_live_estimate(self, extra_tokens: int) -> None:
49
+ """Add an in-flight token estimate on top of the last known count.
50
+
51
+ Call this on each streamed delta of the current turn's response;
52
+ superseded by :meth:`set_context` once the real usage arrives.
53
+ """
54
+ self._live_estimate = extra_tokens
42
55
 
43
56
  def update_from_ctx(self, ctx: object) -> None:
44
57
  self.set_model(
@@ -89,8 +102,9 @@ class ModelBadge(Component):
89
102
  left = f"({self._provider}) {self._model}" if self._provider else self._model
90
103
  if self._thinking and self._thinking_level and self._thinking_level != "off":
91
104
  left += f" ∙ {self._thinking_level.title()}"
92
- if self._context_window > 0 and self._tokens > 0:
93
- pct = self._tokens / self._context_window * 100
105
+ tokens = self._tokens + self._live_estimate
106
+ if self._context_window > 0 and tokens > 0:
107
+ pct = tokens / self._context_window * 100
94
108
  label = f"{pct:.1f}%" if pct < 1 else f"{int(round(pct))}%"
95
109
  return f"{left}|{label}"
96
110
  return left
@@ -30,7 +30,11 @@ from typing import TYPE_CHECKING
30
30
  sys.path.insert(0, str(Path(__file__).parent))
31
31
 
32
32
  from dispatch import _emit, _update_status, run_ticker # type: ignore[import-not-found]
33
- from duration import format_duration, parse_duration, parse_loop_args # type: ignore[import-not-found]
33
+ from duration import ( # type: ignore[import-not-found]
34
+ format_duration,
35
+ parse_duration,
36
+ parse_loop_args,
37
+ )
34
38
  from state import MAX_TASKS, LoopTask, SchedulerState # type: ignore[import-not-found]
35
39
 
36
40
  if TYPE_CHECKING:
@@ -99,7 +103,11 @@ def register(tau: ExtensionAPI) -> None:
99
103
  return
100
104
 
101
105
  task = state.add(parsed["prompt"], parsed["interval_s"])
102
- _emit(ctx, f"Loop scheduled every {format_duration(parsed['interval_s'])} (id: {task.id}). Expires in 3 days.")
106
+ _emit(
107
+ ctx,
108
+ f"Loop scheduled every {format_duration(parsed['interval_s'])} "
109
+ f"(id: {task.id}). Expires in 3 days.",
110
+ )
103
111
  if parsed.get("note"):
104
112
  _emit(ctx, parsed["note"])
105
113
  _update_status(ctx, state)
@@ -117,7 +125,9 @@ def register(tau: ExtensionAPI) -> None:
117
125
  "Delete",
118
126
  "Back",
119
127
  ]
120
- choice = await ui.select(f"Loop {task.id} — every {format_duration(task.interval_s)}", actions)
128
+ choice = await ui.select(
129
+ f"Loop {task.id} — every {format_duration(task.interval_s)}", actions
130
+ )
121
131
  if choice is None or choice == "Back":
122
132
  return
123
133
 
@@ -158,7 +168,9 @@ def register(tau: ExtensionAPI) -> None:
158
168
 
159
169
  async def _show_picker(ctx: ExtensionContext, ui: UIContext) -> None:
160
170
  while True:
161
- options = [_loop_label(t) for t in sorted(state.tasks.values(), key=lambda t: t.next_run_at)]
171
+ options = [
172
+ _loop_label(t) for t in sorted(state.tasks.values(), key=lambda t: t.next_run_at)
173
+ ]
162
174
  options.append("+ New loop")
163
175
  if state.tasks:
164
176
  options.append("Clear all loops")
@@ -174,7 +186,9 @@ def register(tau: ExtensionAPI) -> None:
174
186
  continue
175
187
 
176
188
  if choice == "Clear all loops":
177
- ok = await ui.confirm("Clear all loops?", f"This deletes all {len(state.tasks)} loop(s).")
189
+ ok = await ui.confirm(
190
+ "Clear all loops?", f"This deletes all {len(state.tasks)} loop(s)."
191
+ )
178
192
  if ok:
179
193
  n = state.clear()
180
194
  ui.notify(f"Cleared {n} loop{'s' if n != 1 else ''}.")
@@ -199,7 +213,8 @@ def register(tau: ExtensionAPI) -> None:
199
213
 
200
214
  tau.register_command(
201
215
  "loop",
202
- "Manage recurring prompts: /loop opens the loop manager, /loop <period> <task> creates one directly",
216
+ "Manage recurring prompts: /loop opens the loop manager, "
217
+ "/loop <period> <task> creates one directly",
203
218
  cmd_loop,
204
219
  argument_hint="<period> <task>",
205
220
  get_argument_completions=_get_argument_completions,
@@ -4,7 +4,6 @@ from __future__ import annotations
4
4
 
5
5
  import math
6
6
  import re
7
- from typing import Optional
8
7
 
9
8
  ONE_MINUTE = 60
10
9
  FIFTEEN_MINUTES = 15 * ONE_MINUTE
@@ -17,7 +16,7 @@ _DURATION_WORD = re.compile(
17
16
  )
18
17
 
19
18
 
20
- def parse_duration(text: str) -> Optional[float]:
19
+ def parse_duration(text: str) -> float | None:
21
20
  """Parse '5m', '2h', '30 seconds', etc. into seconds."""
22
21
  raw = text.strip().lower()
23
22
  if not raw:
@@ -43,7 +42,7 @@ def parse_duration(text: str) -> Optional[float]:
43
42
  return None
44
43
 
45
44
 
46
- def normalize_duration(seconds: float) -> tuple[float, Optional[str]]:
45
+ def normalize_duration(seconds: float) -> tuple[float, str | None]:
47
46
  """Round up to minute granularity, matching the minimum tick resolution."""
48
47
  if seconds <= 0:
49
48
  return ONE_MINUTE, "Rounded up to 1m (minimum interval)."
@@ -61,7 +60,7 @@ def format_duration(seconds: float) -> str:
61
60
  return f"{int(seconds // ONE_MINUTE)}m"
62
61
 
63
62
 
64
- def _extract_leading_duration(text: str) -> Optional[tuple[float, str]]:
63
+ def _extract_leading_duration(text: str) -> tuple[float, str] | None:
65
64
  tokens = text.strip().split()
66
65
  if len(tokens) < 2:
67
66
  return None
@@ -78,7 +77,7 @@ def _extract_leading_duration(text: str) -> Optional[tuple[float, str]]:
78
77
  return None
79
78
 
80
79
 
81
- def _extract_trailing_duration(text: str) -> Optional[tuple[float, str]]:
80
+ def _extract_trailing_duration(text: str) -> tuple[float, str] | None:
82
81
  tokens = text.strip().split()
83
82
  if len(tokens) < 2:
84
83
  return None
@@ -95,8 +94,8 @@ def _extract_trailing_duration(text: str) -> Optional[tuple[float, str]]:
95
94
  return None
96
95
 
97
96
 
98
- def parse_loop_args(text: str) -> Optional[dict]:
99
- """/loop 5m <task> | /loop <task> every 2h | /loop <task> 5m | /loop <task> (default 10m)."""
97
+ def parse_loop_args(text: str) -> dict | None:
98
+ """/loop 5m <task> | /loop <task> every 2h | /loop <task> 5m | /loop <task> (default 10m)."""
100
99
  raw = text.strip()
101
100
  if not raw:
102
101
  return None
@@ -8,9 +8,13 @@ import string
8
8
  import time
9
9
  from dataclasses import asdict, dataclass
10
10
  from pathlib import Path
11
- from typing import Optional
12
11
 
13
- from duration import FIFTEEN_MINUTES, ONE_MINUTE, THREE_DAYS, format_duration # type: ignore[import-not-found]
12
+ from duration import ( # type: ignore[import-not-found]
13
+ FIFTEEN_MINUTES,
14
+ ONE_MINUTE,
15
+ THREE_DAYS,
16
+ format_duration,
17
+ )
14
18
 
15
19
  MAX_TASKS = 50
16
20
 
@@ -23,10 +27,10 @@ class LoopTask:
23
27
  created_at: float
24
28
  next_run_at: float
25
29
  interval_s: float
26
- expires_at: Optional[float] = None
30
+ expires_at: float | None = None
27
31
  jitter_s: float = 0
28
- last_run_at: Optional[float] = None
29
- last_status: Optional[str] = None
32
+ last_run_at: float | None = None
33
+ last_status: str | None = None
30
34
  run_count: int = 0
31
35
  pending: bool = False
32
36
 
@@ -56,7 +60,7 @@ def _hash_id(task_id: str) -> int:
56
60
  class SchedulerState:
57
61
  def __init__(self) -> None:
58
62
  self.tasks: dict[str, LoopTask] = {}
59
- self.storage_path: Optional[Path] = None
63
+ self.storage_path: Path | None = None
60
64
  self.dispatching = False
61
65
 
62
66
  def set_storage(self, cwd: Path) -> None:
@@ -76,7 +80,9 @@ class SchedulerState:
76
80
  if not item.get("id") or not item.get("prompt"):
77
81
  continue
78
82
  item = {**item, "pending": False}
79
- task = LoopTask(**{k: v for k, v in item.items() if k in LoopTask.__dataclass_fields__})
83
+ task = LoopTask(
84
+ **{k: v for k, v in item.items() if k in LoopTask.__dataclass_fields__}
85
+ )
80
86
  if task.expires_at and now >= task.expires_at:
81
87
  continue
82
88
  self.tasks[task.id] = task
@@ -90,7 +96,9 @@ class SchedulerState:
90
96
  self.storage_path.parent.mkdir(parents=True, exist_ok=True)
91
97
  data = {
92
98
  "version": 1,
93
- "tasks": [asdict(t) for t in sorted(self.tasks.values(), key=lambda t: t.next_run_at)],
99
+ "tasks": [
100
+ asdict(t) for t in sorted(self.tasks.values(), key=lambda t: t.next_run_at)
101
+ ],
94
102
  }
95
103
  tmp = self.storage_path.with_suffix(".json.tmp")
96
104
  tmp.write_text(json.dumps(data, indent=2))
@@ -18,9 +18,7 @@ class TaskItem(BaseModel):
18
18
  agent: str = Field(..., description="Name of the agent to invoke.")
19
19
  task: str = Field(..., description="Task to delegate to the agent.")
20
20
  cwd: str | None = Field(default=None, description="Working directory for the agent process.")
21
- context: Literal["fresh", "fork"] | None = Field(
22
- default=None, description=_CONTEXT_DESCRIPTION
23
- )
21
+ context: Literal["fresh", "fork"] | None = Field(default=None, description=_CONTEXT_DESCRIPTION)
24
22
 
25
23
 
26
24
  class ChainItem(BaseModel):
@@ -30,9 +28,7 @@ class ChainItem(BaseModel):
30
28
  description="Task with an optional '{previous}' placeholder for the prior step's output.",
31
29
  )
32
30
  cwd: str | None = Field(default=None, description="Working directory for the agent process.")
33
- context: Literal["fresh", "fork"] | None = Field(
34
- default=None, description=_CONTEXT_DESCRIPTION
35
- )
31
+ context: Literal["fresh", "fork"] | None = Field(default=None, description=_CONTEXT_DESCRIPTION)
36
32
 
37
33
 
38
34
  class SubagentParams(BaseModel):
@@ -47,9 +43,7 @@ class SubagentParams(BaseModel):
47
43
  "need to set it explicitly."
48
44
  ),
49
45
  )
50
- agent: str | None = Field(
51
- default=None, description="Target agent name for action='get'."
52
- )
46
+ agent: str | None = Field(default=None, description="Target agent name for action='get'.")
53
47
  spawn: list[TaskItem] | None = Field(
54
48
  default=None,
55
49
  description=(
@@ -59,6 +59,7 @@ class TodoBoard:
59
59
  self._shown = False
60
60
 
61
61
  def _lines(self, theme: Any) -> list[str]:
62
+ from tau.modes.interactive.components.message_list import apply_render_shell
62
63
  from tau.tui.style import apply_style
63
64
 
64
65
  glyphs = {
@@ -67,16 +68,14 @@ class TodoBoard:
67
68
  "done": ("✓", theme.success),
68
69
  "failed": ("✗", theme.error),
69
70
  }
70
- remaining = self._state.remaining()
71
- header = (
72
- f"{apply_style(theme.warning, '☐')} "
73
- f"{apply_style(theme.emphasis, f'Todos ({len(remaining)} pending)')}"
74
- )
75
- lines = [header]
71
+ items = []
76
72
  for item in self._state.items:
77
73
  glyph, style = glyphs[item.status]
78
- lines.append(f" {apply_style(style, glyph)} {item.id}. {item.subject}")
79
- return lines
74
+ subject = item.subject
75
+ if item.status == "done":
76
+ subject = apply_style(style.patch(theme.strikethrough), subject)
77
+ items.append(f"{apply_style(style, glyph)} {item.id}. {subject}")
78
+ return apply_render_shell(items, theme)
80
79
 
81
80
  def sync(self, ctx: ExtensionContext) -> None:
82
81
  ui = ctx.ui
@@ -148,7 +147,9 @@ def register(tau: ExtensionAPI) -> None:
148
147
  ("Done", "✓", state.list("done")),
149
148
  ("Failed", "✗", state.list("failed")),
150
149
  ]
151
- header = " · ".join(f"{len(items)} {label.lower()}" for label, _, items in sections if items)
150
+ header = " · ".join(
151
+ f"{len(items)} {label.lower()}" for label, _, items in sections if items
152
+ )
152
153
  lines = [header]
153
154
  for label, glyph, items in sections:
154
155
  if not items:
@@ -54,7 +54,9 @@ class TodoParams(BaseModel):
54
54
  )
55
55
  append_note: str | None = Field(
56
56
  default=None,
57
- description="Append a paragraph to the task's existing description. Only used by action='update'.",
57
+ description=(
58
+ "Append a paragraph to the task's existing description. Only used by action='update'."
59
+ ),
58
60
  )
59
61
  status: Literal["pending", "in_progress", "done", "failed"] | None = Field(
60
62
  default=None,