tau-coding-agent 0.7.5__tar.gz → 0.7.6__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 (512) hide show
  1. {tau_coding_agent-0.7.5/tau_coding_agent.egg-info → tau_coding_agent-0.7.6}/PKG-INFO +1 -1
  2. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/pyproject.toml +1 -1
  3. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/sandbox/sandbox_tool.py +1 -1
  4. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/todo/__init__.py +7 -8
  5. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/todo/todo_tool.py +4 -1
  6. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/models/text.py +11 -0
  7. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/providers/text.py +18 -3
  8. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/edit.py +3 -1
  9. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/glob.py +3 -0
  10. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/grep.py +3 -0
  11. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/ls.py +3 -0
  12. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/read.py +56 -2
  13. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/terminal.py +1 -1
  14. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/utils.py +20 -0
  15. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/write.py +3 -1
  16. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/engine/service.py +15 -2
  17. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/anthropic_claude_code.py +0 -2
  18. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/anthropic_messages.py +0 -2
  19. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/anthropic_vertex.py +0 -2
  20. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/gemini_generate.py +0 -2
  21. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/github_copilot_chat.py +0 -2
  22. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/google_antigravity.py +0 -2
  23. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/mistral_chat.py +0 -2
  24. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/ollama_chat.py +0 -2
  25. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/openai_codex_responses.py +0 -2
  26. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/openai_completions.py +0 -4
  27. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/openai_responses.py +0 -4
  28. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/openai_vertex.py +0 -2
  29. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/utils.py +8 -51
  30. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/utils.py +1 -0
  31. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/message_list.py +6 -1
  32. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tool/types.py +1 -10
  33. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6/tau_coding_agent.egg-info}/PKG-INFO +1 -1
  34. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_inference_error_utils.py +6 -0
  35. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_inference_utils.py +22 -0
  36. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/LICENSE +0 -0
  37. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/MANIFEST.in +0 -0
  38. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/README.md +0 -0
  39. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/architecture.md +0 -0
  40. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/auth.md +0 -0
  41. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/cli-reference.md +0 -0
  42. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/creating-tools.md +0 -0
  43. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/development.md +0 -0
  44. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/docs.json +0 -0
  45. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/engine.md +0 -0
  46. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/extension-settings.md +0 -0
  47. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/extensions.md +0 -0
  48. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/http-proxy.md +0 -0
  49. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/index.md +0 -0
  50. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/inference-providers.md +0 -0
  51. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/inference.md +0 -0
  52. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/installation.md +0 -0
  53. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/keybindings.md +0 -0
  54. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/messages.md +0 -0
  55. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/project-context.md +0 -0
  56. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/project-structure.md +0 -0
  57. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/prompts.md +0 -0
  58. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/python-api.md +0 -0
  59. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/quickstart.md +0 -0
  60. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/sessions.md +0 -0
  61. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/settings.md +0 -0
  62. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/skills.md +0 -0
  63. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/themes.md +0 -0
  64. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/tools.md +0 -0
  65. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/tui.md +0 -0
  66. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/docs/usage.md +0 -0
  67. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/setup.cfg +0 -0
  68. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/__init__.py +0 -0
  69. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/agent/__init__.py +0 -0
  70. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/agent/embedded.py +0 -0
  71. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/agent/prompt/__init__.py +0 -0
  72. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/agent/prompt/builder.py +0 -0
  73. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/agent/prompt/types.py +0 -0
  74. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/agent/service.py +0 -0
  75. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/agent/types.py +0 -0
  76. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/auth/manager.py +0 -0
  77. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/auth/storage.py +0 -0
  78. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/auth/types.py +0 -0
  79. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/__init__.py +0 -0
  80. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/commands/__init__.py +0 -0
  81. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/commands/clear.py +0 -0
  82. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/commands/compact.py +0 -0
  83. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/commands/reload.py +0 -0
  84. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/commands/session.py +0 -0
  85. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/ask_user/__init__.py +0 -0
  86. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/ask_user/component.py +0 -0
  87. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/ask_user/manifest.json +0 -0
  88. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/ask_user/schema.py +0 -0
  89. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/ask_user/tool.py +0 -0
  90. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/btw/__init__.py +0 -0
  91. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/footer/__init__.py +0 -0
  92. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/footer/git.py +0 -0
  93. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/footer/model.py +0 -0
  94. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/footer/utils.py +0 -0
  95. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/header/__init__.py +0 -0
  96. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/loop/README.md +0 -0
  97. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/loop/__init__.py +0 -0
  98. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/loop/dispatch.py +0 -0
  99. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/loop/duration.py +0 -0
  100. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/loop/state.py +0 -0
  101. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/sandbox/__init__.py +0 -0
  102. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/sandbox/manager.py +0 -0
  103. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/sandbox/manifest.json +0 -0
  104. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/__init__.py +0 -0
  105. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/context-builder.md +0 -0
  106. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/delegate.md +0 -0
  107. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/oracle.md +0 -0
  108. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/planner.md +0 -0
  109. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/researcher.md +0 -0
  110. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/reviewer.md +0 -0
  111. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/scout.md +0 -0
  112. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents/worker.md +0 -0
  113. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/agents.py +0 -0
  114. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/manifest.json +0 -0
  115. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/subagent_schema.py +0 -0
  116. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/subagent/subagent_tool.py +0 -0
  117. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/todo/manifest.json +0 -0
  118. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/todo/todo_schema.py +0 -0
  119. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/watch/__init__.py +0 -0
  120. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/__init__.py +0 -0
  121. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/engines/__init__.py +0 -0
  122. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/engines/base.py +0 -0
  123. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/engines/ddgs_engine.py +0 -0
  124. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/engines/exa_engine.py +0 -0
  125. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/engines/jina_engine.py +0 -0
  126. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/engines/tavily_engine.py +0 -0
  127. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/manifest.json +0 -0
  128. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/tools/__init__.py +0 -0
  129. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/tools/fetch.py +0 -0
  130. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/web/tools/search.py +0 -0
  131. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/workflow/__init__.py +0 -0
  132. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/workflow/agent_discovery.py +0 -0
  133. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/workflow/manifest.json +0 -0
  134. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/workflow/model.py +0 -0
  135. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/workflow/runner.py +0 -0
  136. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/workflow/skills/create-workflows/SKILL.md +0 -0
  137. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/extensions/workflow/store.py +0 -0
  138. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/models/__init__.py +0 -0
  139. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/models/audio.py +0 -0
  140. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/models/image.py +0 -0
  141. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/models/video.py +0 -0
  142. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/prompts/commit.md +0 -0
  143. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/prompts/docs.md +0 -0
  144. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/prompts/explain.md +0 -0
  145. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/prompts/fix.md +0 -0
  146. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/prompts/refactor.md +0 -0
  147. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/prompts/review.md +0 -0
  148. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/prompts/test.md +0 -0
  149. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/providers/__init__.py +0 -0
  150. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/providers/audio.py +0 -0
  151. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/providers/image.py +0 -0
  152. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/providers/video.py +0 -0
  153. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/skills/code-review/SKILL.md +0 -0
  154. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/skills/debug/SKILL.md +0 -0
  155. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  156. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
  157. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
  158. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/ayu-dark.yaml +0 -0
  159. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/catppuccin.yaml +0 -0
  160. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/dark.yaml +0 -0
  161. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/dracula.yaml +0 -0
  162. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/everforest.yaml +0 -0
  163. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/gruvbox.yaml +0 -0
  164. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/horizon.yaml +0 -0
  165. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/kanagawa.yaml +0 -0
  166. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/light.yaml +0 -0
  167. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/material-ocean.yaml +0 -0
  168. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/monokai.yaml +0 -0
  169. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/night-owl.yaml +0 -0
  170. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/nord.yaml +0 -0
  171. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/one-dark.yaml +0 -0
  172. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/rose-pine.yaml +0 -0
  173. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/solarized-dark.yaml +0 -0
  174. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/themes/tokyo-night.yaml +0 -0
  175. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/builtins/tools/__init__.py +0 -0
  176. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/commands/__init__.py +0 -0
  177. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/commands/registry.py +0 -0
  178. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/commands/types.py +0 -0
  179. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/console/__init__.py +0 -0
  180. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/console/cli.py +0 -0
  181. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/console/commands/__init__.py +0 -0
  182. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/console/commands/auth.py +0 -0
  183. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/console/commands/packages.py +0 -0
  184. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/console/commands/update.py +0 -0
  185. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/core/__init__.py +0 -0
  186. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/core/registry.py +0 -0
  187. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/engine/__init__.py +0 -0
  188. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/engine/types.py +0 -0
  189. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/extensions/__init__.py +0 -0
  190. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/extensions/api.py +0 -0
  191. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/extensions/context.py +0 -0
  192. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/extensions/loader.py +0 -0
  193. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/extensions/runtime.py +0 -0
  194. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/extensions/settings.py +0 -0
  195. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/__init__.py +0 -0
  196. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/engine.py +0 -0
  197. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/inference.py +0 -0
  198. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/runtime.py +0 -0
  199. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/service.py +0 -0
  200. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/session.py +0 -0
  201. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/tui.py +0 -0
  202. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/hooks/types.py +0 -0
  203. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/__init__.py +0 -0
  204. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/__init__.py +0 -0
  205. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/__init__.py +0 -0
  206. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/base.py +0 -0
  207. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/builtins.py +0 -0
  208. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  209. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/gemini_audio.py +0 -0
  210. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/openai_audio.py +0 -0
  211. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/registry.py +0 -0
  212. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/sarvam_audio.py +0 -0
  213. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/service.py +0 -0
  214. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/audio/utils.py +0 -0
  215. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/availability.py +0 -0
  216. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/__init__.py +0 -0
  217. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/base.py +0 -0
  218. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/builtins.py +0 -0
  219. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/gemini_image.py +0 -0
  220. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/openai_image.py +0 -0
  221. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/openrouter.py +0 -0
  222. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/registry.py +0 -0
  223. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/image/service.py +0 -0
  224. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/registry.py +0 -0
  225. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/__init__.py +0 -0
  226. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/base.py +0 -0
  227. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/builtins.py +0 -0
  228. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/dialect.py +0 -0
  229. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/google_vertex.py +0 -0
  230. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/registry.py +0 -0
  231. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/service.py +0 -0
  232. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/types.py +0 -0
  233. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/text/xai_responses.py +0 -0
  234. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/__init__.py +0 -0
  235. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/base.py +0 -0
  236. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/builtins.py +0 -0
  237. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/fal_video.py +0 -0
  238. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/openrouter_video.py +0 -0
  239. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/registry.py +0 -0
  240. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/service.py +0 -0
  241. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/api/video/zai_video.py +0 -0
  242. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/__init__.py +0 -0
  243. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/local/__init__.py +0 -0
  244. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/local/llamacpp.py +0 -0
  245. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/local/lmstudio.py +0 -0
  246. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/local/ollama.py +0 -0
  247. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/local/vllm.py +0 -0
  248. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/registry.py +0 -0
  249. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/model/types.py +0 -0
  250. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/__init__.py +0 -0
  251. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/__init__.py +0 -0
  252. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
  253. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/github_copilot.py +0 -0
  254. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/google_antigravity.py +0 -0
  255. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/openai_codex.py +0 -0
  256. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/pkce.py +0 -0
  257. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/types.py +0 -0
  258. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/utils.py +0 -0
  259. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/oauth/xai_grok.py +0 -0
  260. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/registry.py +0 -0
  261. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/provider/types.py +0 -0
  262. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/inference/types.py +0 -0
  263. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/message/__init__.py +0 -0
  264. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/message/types.py +0 -0
  265. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/message/utils.py +0 -0
  266. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/__init__.py +0 -0
  267. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/__init__.py +0 -0
  268. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/agent_hooks.py +0 -0
  269. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/app.py +0 -0
  270. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/__init__.py +0 -0
  271. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/appearance.py +0 -0
  272. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/auth.py +0 -0
  273. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/context.py +0 -0
  274. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/extensions.py +0 -0
  275. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/misc.py +0 -0
  276. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/model.py +0 -0
  277. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/commands/session.py +0 -0
  278. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/__init__.py +0 -0
  279. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/command_palette.py +0 -0
  280. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/config_selector.py +0 -0
  281. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/extension_selector.py +0 -0
  282. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/file_picker.py +0 -0
  283. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/layout.py +0 -0
  284. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/model_selector.py +0 -0
  285. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/oauth_selector.py +0 -0
  286. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/overlays.py +0 -0
  287. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/selector_controller.py +0 -0
  288. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/session_selector.py +0 -0
  289. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/settings_selector.py +0 -0
  290. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/theme_selector.py +0 -0
  291. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/thinking_selector.py +0 -0
  292. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/tree_selector.py +0 -0
  293. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/trust_screen.py +0 -0
  294. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/components/voice_selector.py +0 -0
  295. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/input_handler.py +0 -0
  296. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/interactive/ui_context.py +0 -0
  297. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/print/__init__.py +0 -0
  298. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/rpc/__init__.py +0 -0
  299. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/rpc/mode.py +0 -0
  300. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/modes/rpc/types.py +0 -0
  301. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/packages/__init__.py +0 -0
  302. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/packages/manager.py +0 -0
  303. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/packages/types.py +0 -0
  304. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/packages/utils.py +0 -0
  305. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/prompts/expand.py +0 -0
  306. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/prompts/loader.py +0 -0
  307. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/prompts/registry.py +0 -0
  308. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/prompts/types.py +0 -0
  309. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/resources/__init__.py +0 -0
  310. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/resources/loader.py +0 -0
  311. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/resources/types.py +0 -0
  312. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/runtime/dependencies.py +0 -0
  313. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/runtime/service.py +0 -0
  314. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/runtime/types.py +0 -0
  315. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/session/branch_summarization.py +0 -0
  316. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/session/compaction.py +0 -0
  317. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/session/manager.py +0 -0
  318. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/session/types.py +0 -0
  319. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/session/utils.py +0 -0
  320. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/settings/manager.py +0 -0
  321. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/settings/paths.py +0 -0
  322. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/settings/storage.py +0 -0
  323. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/settings/types.py +0 -0
  324. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/settings/utils.py +0 -0
  325. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/skills/loader.py +0 -0
  326. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/skills/registry.py +0 -0
  327. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/skills/types.py +0 -0
  328. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/telemetry/__init__.py +0 -0
  329. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/telemetry/service.py +0 -0
  330. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/telemetry/types.py +0 -0
  331. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/themes/loader.py +0 -0
  332. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/themes/registry.py +0 -0
  333. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/themes/types.py +0 -0
  334. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tool/__init__.py +0 -0
  335. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tool/registry.py +0 -0
  336. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tool/render.py +0 -0
  337. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/trust/__init__.py +0 -0
  338. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/trust/manager.py +0 -0
  339. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/trust/types.py +0 -0
  340. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/trust/utils.py +0 -0
  341. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/__init__.py +0 -0
  342. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/ansi_bridge.py +0 -0
  343. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/autocomplete.py +0 -0
  344. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/backend.py +0 -0
  345. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/buffer.py +0 -0
  346. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/component.py +0 -0
  347. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/__init__.py +0 -0
  348. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/box.py +0 -0
  349. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/editor.py +0 -0
  350. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/image.py +0 -0
  351. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/select_list.py +0 -0
  352. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/simple_picker.py +0 -0
  353. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/spinner.py +0 -0
  354. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/text_input.py +0 -0
  355. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/components/widget_bridge.py +0 -0
  356. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/frame.py +0 -0
  357. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/geometry.py +0 -0
  358. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/input.py +0 -0
  359. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/keybinding_hints.py +0 -0
  360. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/layout.py +0 -0
  361. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/markdown.py +0 -0
  362. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/palette.py +0 -0
  363. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/service.py +0 -0
  364. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/style.py +0 -0
  365. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/terminal.py +0 -0
  366. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/testing.py +0 -0
  367. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/text.py +0 -0
  368. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/theme.py +0 -0
  369. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/utils.py +0 -0
  370. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widget.py +0 -0
  371. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/__init__.py +0 -0
  372. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/barchart.py +0 -0
  373. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/block.py +0 -0
  374. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/calendar.py +0 -0
  375. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/canvas.py +0 -0
  376. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/chart.py +0 -0
  377. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/clear.py +0 -0
  378. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/gauge.py +0 -0
  379. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/list.py +0 -0
  380. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/paragraph.py +0 -0
  381. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/scrollbar.py +0 -0
  382. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/sparkline.py +0 -0
  383. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/symbols.py +0 -0
  384. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/table.py +0 -0
  385. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/tui/widgets/tabs.py +0 -0
  386. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/utils/__init__.py +0 -0
  387. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/utils/format.py +0 -0
  388. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/utils/http_proxy.py +0 -0
  389. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/utils/image_processing.py +0 -0
  390. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/utils/secrets.py +0 -0
  391. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau/utils/version_check.py +0 -0
  392. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau_coding_agent.egg-info/SOURCES.txt +0 -0
  393. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  394. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  395. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau_coding_agent.egg-info/requires.txt +0 -0
  396. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tau_coding_agent.egg-info/top_level.txt +0 -0
  397. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_agent_compaction.py +0 -0
  398. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_agent_hooks.py +0 -0
  399. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_agent_prompt.py +0 -0
  400. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_agent_types.py +0 -0
  401. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_ansi.py +0 -0
  402. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_ansi_bridge_legacy_image.py +0 -0
  403. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_anthropic_tool_history.py +0 -0
  404. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_ask_user_extension.py +0 -0
  405. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_audio_transcription_apis.py +0 -0
  406. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_auth_command.py +0 -0
  407. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_auth_manager.py +0 -0
  408. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_auth_storage.py +0 -0
  409. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_autocomplete_modifiers.py +0 -0
  410. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_branch_navigation.py +0 -0
  411. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_branch_summarization.py +0 -0
  412. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_builtin_tools.py +0 -0
  413. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_builtin_watch.py +0 -0
  414. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_cli_inputs.py +0 -0
  415. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_cmd_copy.py +0 -0
  416. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_command_execution_policy.py +0 -0
  417. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_command_registry.py +0 -0
  418. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_compaction.py +0 -0
  419. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_component_buffer_bridge.py +0 -0
  420. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_diff.py +0 -0
  421. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_editor_protocol.py +0 -0
  422. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_engine_execution.py +0 -0
  423. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_engine_length_and_live_tools.py +0 -0
  424. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_engine_steering.py +0 -0
  425. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_engine_types.py +0 -0
  426. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_escape_behavior.py +0 -0
  427. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_extension_api.py +0 -0
  428. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_extension_lifecycle.py +0 -0
  429. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_footer_model.py +0 -0
  430. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_footer_utils.py +0 -0
  431. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_fuzzy.py +0 -0
  432. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_gemini_generate.py +0 -0
  433. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_google_antigravity.py +0 -0
  434. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_google_vertex.py +0 -0
  435. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_http_proxy.py +0 -0
  436. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_image_processing.py +0 -0
  437. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_inference_api_text_utils.py +0 -0
  438. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_inference_dialect.py +0 -0
  439. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_inference_types.py +0 -0
  440. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_input_handler_paste.py +0 -0
  441. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_keybindings.py +0 -0
  442. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_layout_render_cells.py +0 -0
  443. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_local_model_discovery.py +0 -0
  444. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_markdown.py +0 -0
  445. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_message_list_frozen.py +0 -0
  446. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_message_types.py +0 -0
  447. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_message_utils.py +0 -0
  448. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_model_audio_modality.py +0 -0
  449. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_model_availability.py +0 -0
  450. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_model_command.py +0 -0
  451. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_model_file_modality.py +0 -0
  452. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_model_registry.py +0 -0
  453. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_model_selector_modal.py +0 -0
  454. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_model_types.py +0 -0
  455. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_oauth_utils.py +0 -0
  456. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_openai_codex_responses_lite.py +0 -0
  457. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_package_resources.py +0 -0
  458. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_packages_utils.py +0 -0
  459. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_peer_extension.py +0 -0
  460. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_pkce.py +0 -0
  461. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_prompts_expand.py +0 -0
  462. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_prompts_loader.py +0 -0
  463. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_prompts_registry.py +0 -0
  464. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_provider_audio_content.py +0 -0
  465. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_provider_file_content.py +0 -0
  466. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_provider_registry.py +0 -0
  467. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_resource_loader.py +0 -0
  468. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_rpc_mode.py +0 -0
  469. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_runtime_sdk.py +0 -0
  470. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_scrollback_raw_writes.py +0 -0
  471. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_scrollback_terminal.py +0 -0
  472. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_secrets.py +0 -0
  473. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_select_list_render_cells.py +0 -0
  474. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_selector_controller.py +0 -0
  475. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_session_manager.py +0 -0
  476. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_session_trust_persist.py +0 -0
  477. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_session_types.py +0 -0
  478. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_session_utils.py +0 -0
  479. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_settings_manager.py +0 -0
  480. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_settings_paths.py +0 -0
  481. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_settings_storage.py +0 -0
  482. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_settings_utils.py +0 -0
  483. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_skills_loader.py +0 -0
  484. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_skills_registry.py +0 -0
  485. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_strip_control_chars.py +0 -0
  486. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_subagent_context.py +0 -0
  487. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_telemetry.py +0 -0
  488. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_text_input.py +0 -0
  489. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_text_input_render_cells.py +0 -0
  490. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_text_llm_invoke.py +0 -0
  491. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_text_llm_model_resolution.py +0 -0
  492. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_theme_loader.py +0 -0
  493. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_themes_registry.py +0 -0
  494. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_thinking_render.py +0 -0
  495. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tool_registry.py +0 -0
  496. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tool_render.py +0 -0
  497. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tree_branch_restore.py +0 -0
  498. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_trust_manager.py +0 -0
  499. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_trust_utils.py +0 -0
  500. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_capabilities.py +0 -0
  501. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_child_rows.py +0 -0
  502. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_input.py +0 -0
  503. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_layout_sizing.py +0 -0
  504. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_public_api.py +0 -0
  505. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_renderer.py +0 -0
  506. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_select_list.py +0 -0
  507. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_theme.py +0 -0
  508. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_tui_utils.py +0 -0
  509. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_ui_context.py +0 -0
  510. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_utils_hashline.py +0 -0
  511. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/tests/test_version_check.py +0 -0
  512. {tau_coding_agent-0.7.5 → tau_coding_agent-0.7.6}/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.5
3
+ Version: 0.7.6
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tau-coding-agent"
7
- version = "0.7.5"
7
+ version = "0.7.6"
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"
@@ -45,7 +45,7 @@ def _render_result(content: str, opts: Any) -> list[str]:
45
45
  metadata = opts.metadata or {}
46
46
  exit_code = metadata.get("exit_code", 0)
47
47
  timed_out = metadata.get("timed_out", False)
48
- failed = timed_out or exit_code != 0
48
+ failed = opts.is_error or timed_out or exit_code != 0
49
49
 
50
50
  if timed_out:
51
51
  return [f"{RED}Timed out{RESET}"]
@@ -6,9 +6,9 @@ rebuilt by replaying the session's custom entries (so it naturally follows
6
6
  branch/fork navigation), plus a `/todos` command for a quick look.
7
7
 
8
8
  The task list itself is surfaced through a board widget above the input box
9
- rather than the tool call/result in the transcript — the board only appears
10
- while there is at least one pending task, and disappears once the list is
11
- empty or fully done.
9
+ rather than the tool call/result in the transcript — the board appears as
10
+ soon as a task exists and stays up (showing done/failed tasks too) until the
11
+ list is explicitly cleared or every task is deleted.
12
12
  """
13
13
 
14
14
  from __future__ import annotations
@@ -60,7 +60,7 @@ class TodoBoard:
60
60
 
61
61
  def _lines(self, theme: Any) -> list[str]:
62
62
  from tau.modes.interactive.components.message_list import apply_render_shell
63
- from tau.tui.style import apply_style
63
+ from tau.tui.style import Style, apply_style
64
64
 
65
65
  glyphs = {
66
66
  "pending": ("☐", theme.muted),
@@ -73,16 +73,15 @@ class TodoBoard:
73
73
  glyph, style = glyphs[item.status]
74
74
  subject = item.subject
75
75
  if item.status == "done":
76
- subject = apply_style(style.patch(theme.strikethrough), subject)
76
+ subject = apply_style(theme.muted.patch(Style().dim().strikethrough()), subject)
77
77
  items.append(f"{apply_style(style, glyph)} {item.id}. {subject}")
78
- return apply_render_shell(items, theme)
78
+ return apply_render_shell(items, theme.message)
79
79
 
80
80
  def sync(self, ctx: ExtensionContext) -> None:
81
81
  ui = ctx.ui
82
82
  if ui is None:
83
83
  return
84
- pending = self._state.remaining()
85
- if not pending:
84
+ if not self._state.items:
86
85
  if self._shown:
87
86
  ui.remove_widget(WIDGET_KEY)
88
87
  self._shown = False
@@ -305,7 +305,10 @@ class TodoTool(Tool):
305
305
  "for one task (requires 'id'); 'delete' removes a task (requires 'id'); "
306
306
  "'clear' removes every task. The list is shown to the user in a board above "
307
307
  "the input, not in the transcript, so don't repeat task contents back to the "
308
- "user after calling this tool. State persists across branches and restarts. "
308
+ "user after calling this tool. The board stays visible even once every task "
309
+ "is 'done'/'failed' — until 'clear' is called, so once the whole plan is "
310
+ "complete, call 'clear' to dismiss it instead of leaving it up. State persists "
311
+ "across branches and restarts. "
309
312
  "Never tell the user a task was created, updated, or completed unless you "
310
313
  "actually made the matching 'create'/'update' call in this turn — calling "
311
314
  "'list' alone does not change anything. If it's unclear which task or field "
@@ -1106,6 +1106,17 @@ models = [
1106
1106
  input=_TEXT,
1107
1107
  output=_TEXT,
1108
1108
  ),
1109
+ Model(
1110
+ id="gemma-4-31b",
1111
+ name="Gemma 4 31B",
1112
+ provider="cerebras",
1113
+ cost=Cost(input=0.99, output=1.49),
1114
+ thinking=True,
1115
+ context_window=131_072,
1116
+ max_output_tokens=40_960,
1117
+ input=_TEXT_IMAGE,
1118
+ output=_TEXT,
1119
+ ),
1109
1120
  # Perplexity
1110
1121
  Model(
1111
1122
  id="perplexity/sonar",
@@ -9,9 +9,24 @@ from tau.inference.provider.types import APIProvider
9
9
  from tau.inference.types import AuthType, LLMOptions
10
10
 
11
11
  api_providers = [
12
- APIProvider(id="openai", name="OpenAI", api="openai_responses", options=LLMOptions()),
13
- APIProvider(id="anthropic", name="Anthropic", api="anthropic_messages", options=LLMOptions()),
14
- APIProvider(id="google", name="Google", api="gemini_generate", options=LLMOptions()),
12
+ APIProvider(
13
+ id="openai",
14
+ name="OpenAI",
15
+ api="openai_responses",
16
+ options=LLMOptions()
17
+ ),
18
+ APIProvider(
19
+ id="anthropic",
20
+ name="Anthropic",
21
+ api="anthropic_messages",
22
+ options=LLMOptions()
23
+ ),
24
+ APIProvider(
25
+ id="google",
26
+ name="Google",
27
+ api="gemini_generate",
28
+ options=LLMOptions()
29
+ ),
15
30
  APIProvider(
16
31
  id="google-vertex",
17
32
  name="Google Vertex AI",
@@ -231,6 +231,9 @@ def _collapse_hunk_context(
231
231
  def _render_edit_result(content: str, opts: Any) -> list[str]:
232
232
  from tau.tui.utils import GREEN, RED, RESET
233
233
 
234
+ if opts.is_error:
235
+ return content.splitlines() or [content]
236
+
234
237
  metadata = opts.metadata or {}
235
238
  added = metadata.get("lines_added", 0)
236
239
  removed = metadata.get("lines_removed", 0)
@@ -312,7 +315,6 @@ class EditTool(Tool):
312
315
  " Re-read before editing again if the file may have changed since your"
313
316
  " last read — a formatter, hook, or another edit can shift anchors."
314
317
  ),
315
- strict="prefer",
316
318
  )
317
319
 
318
320
  def get_display_name(self, args: dict[str, Any]) -> str:
@@ -29,6 +29,9 @@ _MAX_RESULTS = 1000
29
29
  def _render_glob_result(content: str, opts: Any) -> list[str]:
30
30
  from tau.tui.utils import DIM, RESET
31
31
 
32
+ if opts.is_error:
33
+ return content.splitlines() or [content]
34
+
32
35
  metadata = opts.metadata or {}
33
36
  match_count = metadata.get("match_count", 0)
34
37
  truncated = metadata.get("truncated", False)
@@ -31,6 +31,9 @@ def _render_grep_call(args: dict, _streaming: bool) -> list[str]:
31
31
  def _render_grep_result(content: str, opts: Any) -> list[str]:
32
32
  from tau.tui.utils import DIM, RESET
33
33
 
34
+ if opts.is_error:
35
+ return content.splitlines() or [content]
36
+
34
37
  metadata = opts.metadata or {}
35
38
  match_count = metadata.get("match_count", 0)
36
39
  files_searched = metadata.get("files_searched", 0)
@@ -39,6 +39,9 @@ class LsParams(BaseModel):
39
39
  def _render_ls_result(content: str, opts: Any) -> list[str]:
40
40
  from tau.tui.utils import DIM, RESET
41
41
 
42
+ if opts.is_error:
43
+ return content.splitlines() or [content]
44
+
42
45
  metadata = opts.metadata or {}
43
46
  path = metadata.get("path", "")
44
47
  file_count = metadata.get("file_count", 0)
@@ -4,7 +4,12 @@ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
7
- from tau.builtins.tools.utils import compute_line_hashes, looks_like_binary, resolve_tool_path
7
+ from tau.builtins.tools.utils import (
8
+ compute_line_hashes,
9
+ detect_image_mime,
10
+ looks_like_binary,
11
+ resolve_tool_path,
12
+ )
8
13
  from tau.tool.render import call_line
9
14
  from tau.tool.types import (
10
15
  AbortSignal,
@@ -16,6 +21,7 @@ from tau.tool.types import (
16
21
  ToolKind,
17
22
  ToolResult,
18
23
  )
24
+ from tau.utils.format import human_size
19
25
 
20
26
 
21
27
  def _render_read_call(args: dict, _streaming: bool) -> list[str]:
@@ -23,6 +29,10 @@ def _render_read_call(args: dict, _streaming: bool) -> list[str]:
23
29
 
24
30
 
25
31
  _MAX_LINE_CHARS = 4000
32
+ # Generous enough for any real screenshot/photo while bounding the base64
33
+ # payload handed to the model — most vision APIs downscale well past this
34
+ # anyway, so there's little value in reading a larger file as an image.
35
+ _MAX_IMAGE_BYTES = 10 * 1024 * 1024
26
36
 
27
37
 
28
38
  def _display_line(line: str) -> str:
@@ -68,7 +78,14 @@ class ReadParams(BaseModel):
68
78
  def _render_read_result(content: str, opts: Any) -> list[str]:
69
79
  from tau.tui.utils import DIM, RESET
70
80
 
81
+ if opts.is_error:
82
+ return content.splitlines() or [content]
83
+
71
84
  metadata = opts.metadata or {}
85
+
86
+ if metadata.get("is_image"):
87
+ return [content]
88
+
72
89
  lines_returned = metadata.get("lines_returned", 0)
73
90
 
74
91
  line_word = "line" if lines_returned == 1 else "lines"
@@ -101,7 +118,11 @@ class ReadTool(Tool):
101
118
  "'<line>:<hash>|<content>'. Every line in the file gets a distinct anchor, "
102
119
  "including blank lines and repeated content. Use offset and limit to read "
103
120
  f"large files in chunks. A single line longer than {_MAX_LINE_CHARS} characters "
104
- "is truncated for display; refuses to read files that look like binary content."
121
+ "is truncated for display. A PNG, JPEG, GIF, or WEBP file (detected from its "
122
+ "magic bytes, regardless of extension) is returned as image content instead of "
123
+ f"text, up to {_MAX_IMAGE_BYTES // (1024 * 1024)} MiB; offset/limit don't apply "
124
+ "to images, and this fails if the active model doesn't accept image input. "
125
+ "Any other binary content is refused."
105
126
  ),
106
127
  schema=ReadParams,
107
128
  kind=ToolKind.Read,
@@ -140,6 +161,39 @@ class ReadTool(Tool):
140
161
  except OSError as e:
141
162
  return ToolResult.error(invocation.id, f"Cannot read file: {e}")
142
163
 
164
+ mime = detect_image_mime(raw)
165
+ if mime is not None:
166
+ model = getattr(context, "llm", None)
167
+ model = getattr(model, "model", None) if model is not None else None
168
+ if model is not None:
169
+ from tau.inference.model.types import Modality
170
+
171
+ if Modality.Image not in model.input:
172
+ return ToolResult.error(
173
+ invocation.id,
174
+ f"'{params.path}' is a {mime} image, but the active model "
175
+ f"({model.name}) doesn't accept image input. Switch to a "
176
+ "vision-capable model to read this file.",
177
+ )
178
+ if len(raw) > _MAX_IMAGE_BYTES:
179
+ return ToolResult.error(
180
+ invocation.id,
181
+ f"'{params.path}' is a {human_size(len(raw))} {mime} image, over the "
182
+ f"{human_size(_MAX_IMAGE_BYTES)} limit for reading images.",
183
+ )
184
+ metadata = {
185
+ "file_path": str(path),
186
+ "is_image": True,
187
+ "mime_type": mime,
188
+ "byte_size": len(raw),
189
+ }
190
+ return ToolResult.with_images(
191
+ invocation.id,
192
+ f"Read image '{params.path}' ({mime}, {human_size(len(raw))})",
193
+ images=[raw],
194
+ metadata=metadata,
195
+ )
196
+
143
197
  if looks_like_binary(raw):
144
198
  return ToolResult.error(
145
199
  invocation.id,
@@ -47,7 +47,7 @@ def _render_terminal_result(content: str, opts: Any) -> list[str]:
47
47
  metadata = opts.metadata or {}
48
48
  exit_code = metadata.get("exit_code", 0)
49
49
  timed_out = metadata.get("timed_out", False)
50
- failed = timed_out or exit_code != 0
50
+ failed = opts.is_error or timed_out or exit_code != 0
51
51
 
52
52
  if timed_out:
53
53
  return [f"{RED}Timed out{RESET}"]
@@ -209,6 +209,26 @@ def looks_like_binary(data: bytes) -> bool:
209
209
  return b"\x00" in data[:_BINARY_SNIFF_BYTES]
210
210
 
211
211
 
212
+ def detect_image_mime(data: bytes) -> str | None:
213
+ """Return the MIME type if ``data`` starts with a recognized image magic number.
214
+
215
+ Unlike ``tau.message.utils.detect_image_mime``, this never guesses — it
216
+ returns ``None`` for anything that isn't unambiguously PNG/JPEG/GIF/WEBP,
217
+ so callers can tell "this is an image" apart from "this is some other
218
+ binary format" (e.g. a zip, a compiled object) instead of mislabeling
219
+ every non-text file as a PNG.
220
+ """
221
+ if data[:3] == b"\xff\xd8\xff":
222
+ return "image/jpeg"
223
+ if data[:8] == b"\x89PNG\r\n\x1a\n":
224
+ return "image/png"
225
+ if data[:6] in (b"GIF87a", b"GIF89a"):
226
+ return "image/gif"
227
+ if data[:4] == b"RIFF" and len(data) >= 12 and data[8:12] == b"WEBP":
228
+ return "image/webp"
229
+ return None
230
+
231
+
212
232
  def resolve_tool_path(raw_path: str, cwd: Path | None) -> Path:
213
233
  """Resolve a tool's ``path`` argument against the invocation's working directory.
214
234
 
@@ -41,6 +41,9 @@ class WriteParams(BaseModel):
41
41
  def _render_write_result(content: str, opts: Any) -> list[str]:
42
42
  from tau.tui.utils import DIM, GREEN, RESET
43
43
 
44
+ if opts.is_error:
45
+ return content.splitlines() or [content]
46
+
44
47
  metadata = opts.metadata or {}
45
48
  total_lines = metadata.get("total_lines", 0)
46
49
  created = metadata.get("created", False)
@@ -77,7 +80,6 @@ class WriteTool(Tool):
77
80
  prompt_guidelines=(
78
81
  "Only use for new files or complete rewrites. Use edit to modify existing files."
79
82
  ),
80
- strict="prefer",
81
83
  )
82
84
 
83
85
  def get_display_name(self, args: dict[str, Any]) -> str:
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import logging
5
+ import traceback
5
6
  from collections.abc import Callable, Coroutine
6
7
  from contextlib import suppress
7
8
  from pathlib import Path
@@ -370,12 +371,24 @@ class Engine:
370
371
  )
371
372
  except Exception as e:
372
373
  _log.error("tool %s raised: %s", tool_call.name, e, exc_info=True)
373
- error = f"Tool '{tool_call.name}' execution failed:\n{e}"
374
+ # First line is a concise summary (what a collapsed render shows); the
375
+ # full traceback follows so both the model and an expanded TUI view
376
+ # get the real root cause instead of just str(e) — see whichever
377
+ # tool.render_result is in play (or the generic fallback) for how
378
+ # this gets collapsed/expanded in the transcript.
379
+ error = (
380
+ f"Tool '{tool_call.name}' execution failed: {e}\n\n{traceback.format_exc()}"
381
+ )
374
382
  tool_result = ToolResultContent(
375
383
  id=tool_call.id,
376
384
  is_error=True,
377
385
  content=error,
378
- metadata={},
386
+ # Tells the renderer to skip this tool's own render_result and use
387
+ # the generic error display instead — an unhandled exception's
388
+ # traceback needs the standard collapse/expand treatment
389
+ # regardless of whether this particular tool's custom renderer
390
+ # was written to handle multi-line error content correctly.
391
+ metadata={"_unhandled_exception": True},
379
392
  tool_name=tool_call.name,
380
393
  )
381
394
  await emit(
@@ -12,7 +12,6 @@ from tau.inference.api.text.utils import (
12
12
  anthropic_apply_message_cache,
13
13
  anthropic_messages_to_list,
14
14
  anthropic_output_config,
15
- check_strict_tools_supported,
16
15
  has_tool_history,
17
16
  parse_tool_args,
18
17
  )
@@ -209,7 +208,6 @@ class AnthropicClaudeCodeAPI(BaseAPI):
209
208
  ephemeral_message_count: int = 0,
210
209
  ) -> dict[str, Any]:
211
210
  """Assemble the Anthropic API request payload, including thinking and tool configs."""
212
- check_strict_tools_supported(tools)
213
211
  _suppress_temp = any(s in model.id for s in ("opus-4-7", "opus-4-8"))
214
212
  params: dict[str, Any] = {
215
213
  "model": model.id,
@@ -10,7 +10,6 @@ from tau.inference.api.text.utils import (
10
10
  anthropic_apply_message_cache,
11
11
  anthropic_messages_to_list,
12
12
  anthropic_output_config,
13
- check_strict_tools_supported,
14
13
  has_tool_history,
15
14
  parse_tool_args,
16
15
  )
@@ -77,7 +76,6 @@ class AnthropicMessagesAPI(BaseAPI):
77
76
  ephemeral_message_count: int = 0,
78
77
  ) -> dict[str, Any]:
79
78
  """Assemble the Anthropic API request payload, including thinking and tool configs."""
80
- check_strict_tools_supported(tools)
81
79
  _suppress_temp = any(s in model.id for s in ("opus-4-7", "opus-4-8"))
82
80
  params: dict[str, Any] = {
83
81
  "model": model.id,
@@ -11,7 +11,6 @@ from tau.inference.api.text.utils import (
11
11
  anthropic_apply_message_cache,
12
12
  anthropic_messages_to_list,
13
13
  anthropic_output_config,
14
- check_strict_tools_supported,
15
14
  has_tool_history,
16
15
  parse_tool_args,
17
16
  )
@@ -96,7 +95,6 @@ class AnthropicVertexAPI(BaseAPI):
96
95
  tools: list[Tool] | None = None,
97
96
  ephemeral_message_count: int = 0,
98
97
  ) -> dict[str, Any]:
99
- check_strict_tools_supported(tools)
100
98
  _suppress_temp = any(s in model.id for s in ("opus-4-7", "opus-4-8"))
101
99
  params: dict[str, Any] = {
102
100
  "model": model.id,
@@ -10,7 +10,6 @@ from google.genai import types as genai_types
10
10
 
11
11
  from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
12
12
  from tau.inference.api.text.utils import (
13
- check_strict_tools_supported,
14
13
  gemini_function_response_parts,
15
14
  gemini_tool_schema,
16
15
  tool_result_text,
@@ -267,7 +266,6 @@ class GeminiGenerateAPI(BaseAPI):
267
266
  include_thoughts=True,
268
267
  )
269
268
 
270
- check_strict_tools_supported(tools)
271
269
  if tools:
272
270
  params["tools"] = [
273
271
  genai_types.Tool(
@@ -7,7 +7,6 @@ from openai import AsyncOpenAI
7
7
 
8
8
  from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
9
9
  from tau.inference.api.text.utils import (
10
- check_strict_tools_supported,
11
10
  openai_messages_to_chat,
12
11
  openai_response_format,
13
12
  parse_tool_args,
@@ -81,7 +80,6 @@ class GitHubCopilotChatAPI(BaseAPI):
81
80
  if self.options.max_tokens is not None:
82
81
  params["max_completion_tokens"] = self.options.max_tokens
83
82
 
84
- check_strict_tools_supported(tools)
85
83
  if tools:
86
84
  params["tools"] = [
87
85
  {
@@ -18,7 +18,6 @@ import httpx
18
18
  from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
19
19
  from tau.inference.api.text.types import APIResponse
20
20
  from tau.inference.api.text.utils import (
21
- check_strict_tools_supported,
22
21
  gemini_function_response_parts_raw,
23
22
  gemini_tool_schema,
24
23
  parse_tool_args,
@@ -424,7 +423,6 @@ class GoogleAntigravityAPI(BaseAPI):
424
423
  inside `items`/`anyOf`/`oneOf`/`allOf`, which Gemini tolerates but
425
424
  Claude does not — so the fix has to walk the whole tree, not just the root.
426
425
  """
427
- check_strict_tools_supported(tools)
428
426
  is_claude = "claude" in model_id
429
427
  seen: set[str] = set()
430
428
  decls = []
@@ -10,7 +10,6 @@ from mistralai.client.types import UNSET
10
10
 
11
11
  from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
12
12
  from tau.inference.api.text.utils import (
13
- check_strict_tools_supported,
14
13
  openai_response_format,
15
14
  openai_user_content,
16
15
  parse_tool_args,
@@ -212,7 +211,6 @@ class MistralChatAPI(BaseAPI):
212
211
  kwargs["response_format"] = response_format
213
212
 
214
213
  tools = context.tools or None
215
- check_strict_tools_supported(tools)
216
214
  if tools:
217
215
  kwargs["tools"] = [
218
216
  {
@@ -8,7 +8,6 @@ from ollama import AsyncClient
8
8
 
9
9
  from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
10
10
  from tau.inference.api.text.utils import (
11
- check_strict_tools_supported,
12
11
  parse_tool_args,
13
12
  tool_result_text,
14
13
  )
@@ -182,7 +181,6 @@ class OllamaChatAPI(BaseAPI):
182
181
  payload["format"] = response_format
183
182
 
184
183
  tools = context.tools or None
185
- check_strict_tools_supported(tools)
186
184
  if tools:
187
185
  payload["tools"] = [
188
186
  {
@@ -16,7 +16,6 @@ import websockets.asyncio.client
16
16
  from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
17
17
  from tau.inference.api.text.types import APIResponse
18
18
  from tau.inference.api.text.utils import (
19
- check_strict_tools_supported,
20
19
  openai_responses_function_call_output,
21
20
  parse_tool_args,
22
21
  )
@@ -262,7 +261,6 @@ def _build_body(
262
261
  # ("Unsupported parameter") — unlike the standard OpenAI Responses API.
263
262
  # Output length is governed by the subscription, so we never send it.
264
263
 
265
- check_strict_tools_supported(tools)
266
264
  if tools:
267
265
  body["tools"] = [
268
266
  {
@@ -11,7 +11,6 @@ from tau.inference.api.text.utils import (
11
11
  openai_messages_to_chat,
12
12
  openai_response_format,
13
13
  parse_tool_args,
14
- strict_json_schema,
15
14
  )
16
15
  from tau.inference.model.types import Model
17
16
  from tau.inference.types import (
@@ -107,9 +106,6 @@ class OpenAICompletionsAPI(BaseAPI):
107
106
  "description": tool.description,
108
107
  "parameters": schema,
109
108
  }
110
- if tool.strict:
111
- function["parameters"] = strict_json_schema(schema)
112
- function["strict"] = True
113
109
  tool_defs.append({"type": "function", "function": function})
114
110
  params["tools"] = tool_defs
115
111
  params["tool_choice"] = "auto"
@@ -10,7 +10,6 @@ from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
10
10
  from tau.inference.api.text.utils import (
11
11
  openai_responses_function_call_output,
12
12
  parse_tool_args,
13
- strict_json_schema,
14
13
  )
15
14
  from tau.inference.model.types import Model
16
15
  from tau.inference.types import (
@@ -232,9 +231,6 @@ class OpenAIResponsesAPI(BaseAPI):
232
231
  "description": tool.description,
233
232
  "parameters": schema,
234
233
  }
235
- if tool.strict:
236
- tool_def["parameters"] = strict_json_schema(schema)
237
- tool_def["strict"] = True
238
234
  tool_defs.append(tool_def)
239
235
  params["tools"] = tool_defs
240
236
 
@@ -9,7 +9,6 @@ from openai import AsyncOpenAI
9
9
 
10
10
  from tau.inference.api.text.base import BaseLLMAPI as BaseAPI
11
11
  from tau.inference.api.text.utils import (
12
- check_strict_tools_supported,
13
12
  openai_messages_to_chat,
14
13
  openai_response_format,
15
14
  parse_tool_args,
@@ -163,7 +162,6 @@ class OpenAIVertexAPI(BaseAPI):
163
162
  if self.options.max_tokens is not None:
164
163
  params["max_completion_tokens"] = self.options.max_tokens
165
164
 
166
- check_strict_tools_supported(tools)
167
165
  if tools:
168
166
  params["tools"] = [
169
167
  {