tau-coding-agent 0.5.2__tar.gz → 0.5.4__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 (383) hide show
  1. {tau_coding_agent-0.5.2/tau_coding_agent.egg-info → tau_coding_agent-0.5.4}/PKG-INFO +1 -1
  2. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/tui.md +3 -0
  3. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/pyproject.toml +1 -1
  4. tau_coding_agent-0.5.4/tau/__init__.py +9 -0
  5. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/agent/prompt/builder.py +37 -8
  6. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/agent/prompt/types.py +6 -0
  7. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/terminal.py +2 -0
  8. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/console/commands/update.py +4 -3
  9. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/anthropic_claude_code.py +3 -7
  10. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/github_copilot.py +3 -7
  11. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/google_antigravity.py +4 -8
  12. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/openai_codex.py +4 -8
  13. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/utils.py +16 -0
  14. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/layout.py +21 -1
  15. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/runtime/types.py +14 -1
  16. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/session/types.py +8 -3
  17. tau_coding_agent-0.5.4/tau/tui/__init__.py +218 -0
  18. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/components/text_input.py +54 -0
  19. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/tui.py +25 -1
  20. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4/tau_coding_agent.egg-info}/PKG-INFO +1 -1
  21. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_text_input.py +34 -0
  22. tau_coding_agent-0.5.2/tau/tui/__init__.py +0 -134
  23. tau_coding_agent-0.5.2/tau/utils/__init__.py +0 -0
  24. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/LICENSE +0 -0
  25. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/MANIFEST.in +0 -0
  26. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/README.md +0 -0
  27. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/architecture.md +0 -0
  28. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/auth.md +0 -0
  29. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/cli-reference.md +0 -0
  30. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/creating-tools.md +0 -0
  31. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/development.md +0 -0
  32. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/docs.json +0 -0
  33. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/engine.md +0 -0
  34. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/extension-settings.md +0 -0
  35. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/extensions.md +0 -0
  36. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/http-proxy.md +0 -0
  37. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/index.md +0 -0
  38. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/inference-providers.md +0 -0
  39. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/inference.md +0 -0
  40. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/installation.md +0 -0
  41. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/keybindings.md +0 -0
  42. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/messages.md +0 -0
  43. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/project-context.md +0 -0
  44. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/project-structure.md +0 -0
  45. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/prompts.md +0 -0
  46. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/python-api.md +0 -0
  47. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/quickstart.md +0 -0
  48. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/sessions.md +0 -0
  49. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/settings.md +0 -0
  50. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/skills.md +0 -0
  51. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/themes.md +0 -0
  52. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/tools.md +0 -0
  53. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/docs/usage.md +0 -0
  54. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/setup.cfg +0 -0
  55. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/agent/__init__.py +0 -0
  56. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/agent/prompt/__init__.py +0 -0
  57. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/agent/service.py +0 -0
  58. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/agent/types.py +0 -0
  59. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/auth/manager.py +0 -0
  60. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/auth/storage.py +0 -0
  61. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/auth/types.py +0 -0
  62. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/__init__.py +0 -0
  63. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/commands/__init__.py +0 -0
  64. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/commands/clear.py +0 -0
  65. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/commands/compact.py +0 -0
  66. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/commands/reload.py +0 -0
  67. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/commands/session.py +0 -0
  68. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/extensions/btw/__init__.py +0 -0
  69. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/extensions/footer/__init__.py +0 -0
  70. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/extensions/footer/git.py +0 -0
  71. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/extensions/footer/model.py +0 -0
  72. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/extensions/footer/utils.py +0 -0
  73. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/extensions/header/__init__.py +0 -0
  74. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/extensions/watch/__init__.py +0 -0
  75. {tau_coding_agent-0.5.2/tau → tau_coding_agent-0.5.4/tau/builtins/models}/__init__.py +0 -0
  76. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/models/audio.py +0 -0
  77. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/models/image.py +0 -0
  78. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/models/text.py +0 -0
  79. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/models/video.py +0 -0
  80. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/prompts/commit.md +0 -0
  81. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/prompts/docs.md +0 -0
  82. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/prompts/explain.md +0 -0
  83. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/prompts/fix.md +0 -0
  84. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/prompts/refactor.md +0 -0
  85. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/prompts/review.md +0 -0
  86. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/prompts/test.md +0 -0
  87. {tau_coding_agent-0.5.2/tau/builtins/models → tau_coding_agent-0.5.4/tau/builtins/providers}/__init__.py +0 -0
  88. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/providers/audio.py +0 -0
  89. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/providers/image.py +0 -0
  90. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/providers/text.py +0 -0
  91. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/providers/video.py +0 -0
  92. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/skills/code-review/SKILL.md +0 -0
  93. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/skills/debug/SKILL.md +0 -0
  94. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  95. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
  96. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
  97. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/themes/dark.yaml +0 -0
  98. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/themes/light.yaml +0 -0
  99. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/__init__.py +0 -0
  100. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/edit.py +0 -0
  101. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/glob.py +0 -0
  102. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/grep.py +0 -0
  103. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/ls.py +0 -0
  104. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/read.py +0 -0
  105. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/utils.py +0 -0
  106. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/builtins/tools/write.py +0 -0
  107. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/commands/__init__.py +0 -0
  108. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/commands/registry.py +0 -0
  109. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/commands/types.py +0 -0
  110. {tau_coding_agent-0.5.2/tau/builtins/providers → tau_coding_agent-0.5.4/tau/console}/__init__.py +0 -0
  111. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/console/cli.py +0 -0
  112. {tau_coding_agent-0.5.2/tau/console → tau_coding_agent-0.5.4/tau/console/commands}/__init__.py +0 -0
  113. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/console/commands/auth.py +0 -0
  114. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/console/commands/packages.py +0 -0
  115. {tau_coding_agent-0.5.2/tau/console/commands → tau_coding_agent-0.5.4/tau/core}/__init__.py +0 -0
  116. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/core/registry.py +0 -0
  117. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/engine/__init__.py +0 -0
  118. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/engine/service.py +0 -0
  119. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/engine/types.py +0 -0
  120. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/extensions/__init__.py +0 -0
  121. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/extensions/api.py +0 -0
  122. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/extensions/context.py +0 -0
  123. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/extensions/loader.py +0 -0
  124. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/extensions/runtime.py +0 -0
  125. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/extensions/settings.py +0 -0
  126. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/__init__.py +0 -0
  127. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/engine.py +0 -0
  128. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/inference.py +0 -0
  129. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/runtime.py +0 -0
  130. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/service.py +0 -0
  131. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/session.py +0 -0
  132. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/tui.py +0 -0
  133. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/hooks/types.py +0 -0
  134. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/__init__.py +0 -0
  135. {tau_coding_agent-0.5.2/tau/core → tau_coding_agent-0.5.4/tau/inference/api}/__init__.py +0 -0
  136. {tau_coding_agent-0.5.2/tau/inference/api → tau_coding_agent-0.5.4/tau/inference/api/audio}/__init__.py +0 -0
  137. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/base.py +0 -0
  138. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/builtins.py +0 -0
  139. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  140. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/gemini_audio.py +0 -0
  141. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/openai_audio.py +0 -0
  142. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/registry.py +0 -0
  143. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/sarvam_audio.py +0 -0
  144. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/service.py +0 -0
  145. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/audio/utils.py +0 -0
  146. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/availability.py +0 -0
  147. {tau_coding_agent-0.5.2/tau/inference/api/audio → tau_coding_agent-0.5.4/tau/inference/api/image}/__init__.py +0 -0
  148. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/image/base.py +0 -0
  149. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/image/builtins.py +0 -0
  150. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/image/gemini_image.py +0 -0
  151. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/image/openai_image.py +0 -0
  152. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/image/openrouter.py +0 -0
  153. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/image/registry.py +0 -0
  154. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/image/service.py +0 -0
  155. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/registry.py +0 -0
  156. {tau_coding_agent-0.5.2/tau/inference/api/image → tau_coding_agent-0.5.4/tau/inference/api/text}/__init__.py +0 -0
  157. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/anthropic_claude_code.py +0 -0
  158. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/anthropic_messages.py +0 -0
  159. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/anthropic_vertex.py +0 -0
  160. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/base.py +0 -0
  161. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/builtins.py +0 -0
  162. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/dialect.py +0 -0
  163. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/gemini_generate.py +0 -0
  164. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/github_copilot_chat.py +0 -0
  165. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/google_antigravity.py +0 -0
  166. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/google_vertex.py +0 -0
  167. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/mistral_chat.py +0 -0
  168. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/ollama_chat.py +0 -0
  169. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/openai_codex_responses.py +0 -0
  170. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/openai_completions.py +0 -0
  171. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/openai_responses.py +0 -0
  172. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/openai_vertex.py +0 -0
  173. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/registry.py +0 -0
  174. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/service.py +0 -0
  175. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/types.py +0 -0
  176. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/text/utils.py +0 -0
  177. {tau_coding_agent-0.5.2/tau/inference/api/text → tau_coding_agent-0.5.4/tau/inference/api/video}/__init__.py +0 -0
  178. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/video/base.py +0 -0
  179. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/video/builtins.py +0 -0
  180. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/video/fal_video.py +0 -0
  181. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/video/openrouter_video.py +0 -0
  182. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/video/registry.py +0 -0
  183. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/video/service.py +0 -0
  184. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/api/video/zai_video.py +0 -0
  185. {tau_coding_agent-0.5.2/tau/inference/api/video → tau_coding_agent-0.5.4/tau/inference/model}/__init__.py +0 -0
  186. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/model/registry.py +0 -0
  187. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/model/types.py +0 -0
  188. {tau_coding_agent-0.5.2/tau/inference/model → tau_coding_agent-0.5.4/tau/inference/provider}/__init__.py +0 -0
  189. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/__init__.py +0 -0
  190. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/pkce.py +0 -0
  191. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/oauth/types.py +0 -0
  192. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/registry.py +0 -0
  193. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/provider/types.py +0 -0
  194. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/types.py +0 -0
  195. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/inference/utils.py +0 -0
  196. {tau_coding_agent-0.5.2/tau/inference/provider → tau_coding_agent-0.5.4/tau/message}/__init__.py +0 -0
  197. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/message/types.py +0 -0
  198. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/message/utils.py +0 -0
  199. {tau_coding_agent-0.5.2/tau/message → tau_coding_agent-0.5.4/tau/modes}/__init__.py +0 -0
  200. {tau_coding_agent-0.5.2/tau/modes → tau_coding_agent-0.5.4/tau/modes/interactive}/__init__.py +0 -0
  201. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/agent_hooks.py +0 -0
  202. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/app.py +0 -0
  203. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/__init__.py +0 -0
  204. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/appearance.py +0 -0
  205. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/auth.py +0 -0
  206. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/context.py +0 -0
  207. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/extensions.py +0 -0
  208. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/misc.py +0 -0
  209. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/model.py +0 -0
  210. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/commands/session.py +0 -0
  211. {tau_coding_agent-0.5.2/tau/modes/interactive → tau_coding_agent-0.5.4/tau/modes/interactive/components}/__init__.py +0 -0
  212. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/command_palette.py +0 -0
  213. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/config_selector.py +0 -0
  214. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/extension_selector.py +0 -0
  215. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/file_picker.py +0 -0
  216. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/message_list.py +0 -0
  217. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/model_selector.py +0 -0
  218. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/oauth_selector.py +0 -0
  219. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/overlays.py +0 -0
  220. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/selector_controller.py +0 -0
  221. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/session_selector.py +0 -0
  222. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/settings_selector.py +0 -0
  223. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/theme_selector.py +0 -0
  224. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/thinking_selector.py +0 -0
  225. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/tree_selector.py +0 -0
  226. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/trust_screen.py +0 -0
  227. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/components/voice_selector.py +0 -0
  228. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/input_handler.py +0 -0
  229. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/interactive/ui_context.py +0 -0
  230. {tau_coding_agent-0.5.2/tau/modes/interactive/components → tau_coding_agent-0.5.4/tau/modes/print}/__init__.py +0 -0
  231. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/rpc/__init__.py +0 -0
  232. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/rpc/mode.py +0 -0
  233. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/modes/rpc/types.py +0 -0
  234. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/packages/__init__.py +0 -0
  235. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/packages/manager.py +0 -0
  236. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/packages/types.py +0 -0
  237. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/packages/utils.py +0 -0
  238. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/prompts/expand.py +0 -0
  239. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/prompts/loader.py +0 -0
  240. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/prompts/registry.py +0 -0
  241. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/prompts/types.py +0 -0
  242. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/resources/__init__.py +0 -0
  243. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/resources/loader.py +0 -0
  244. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/resources/types.py +0 -0
  245. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/runtime/dependencies.py +0 -0
  246. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/runtime/service.py +0 -0
  247. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/session/branch_summarization.py +0 -0
  248. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/session/compaction.py +0 -0
  249. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/session/manager.py +0 -0
  250. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/session/utils.py +0 -0
  251. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/settings/manager.py +0 -0
  252. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/settings/paths.py +0 -0
  253. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/settings/storage.py +0 -0
  254. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/settings/types.py +0 -0
  255. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/settings/utils.py +0 -0
  256. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/skills/loader.py +0 -0
  257. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/skills/registry.py +0 -0
  258. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/skills/types.py +0 -0
  259. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/themes/loader.py +0 -0
  260. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/themes/registry.py +0 -0
  261. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/themes/types.py +0 -0
  262. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tool/__init__.py +0 -0
  263. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tool/registry.py +0 -0
  264. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tool/render.py +0 -0
  265. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tool/types.py +0 -0
  266. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/trust/__init__.py +0 -0
  267. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/trust/manager.py +0 -0
  268. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/trust/types.py +0 -0
  269. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/trust/utils.py +0 -0
  270. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/autocomplete.py +0 -0
  271. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/component.py +0 -0
  272. {tau_coding_agent-0.5.2/tau/modes/print → tau_coding_agent-0.5.4/tau/tui/components}/__init__.py +0 -0
  273. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/components/box.py +0 -0
  274. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/components/editor.py +0 -0
  275. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/components/image.py +0 -0
  276. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/components/select_list.py +0 -0
  277. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/components/spinner.py +0 -0
  278. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/input.py +0 -0
  279. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/keybinding_hints.py +0 -0
  280. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/markdown.py +0 -0
  281. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/terminal.py +0 -0
  282. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/theme.py +0 -0
  283. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/tui/utils.py +0 -0
  284. {tau_coding_agent-0.5.2/tau/tui/components → tau_coding_agent-0.5.4/tau/utils}/__init__.py +0 -0
  285. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/utils/http_proxy.py +0 -0
  286. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/utils/image_processing.py +0 -0
  287. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/utils/secrets.py +0 -0
  288. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/utils/telemetry.py +0 -0
  289. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau/utils/version_check.py +0 -0
  290. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau_coding_agent.egg-info/SOURCES.txt +0 -0
  291. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  292. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  293. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau_coding_agent.egg-info/requires.txt +0 -0
  294. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tau_coding_agent.egg-info/top_level.txt +0 -0
  295. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_agent_compaction.py +0 -0
  296. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_agent_prompt.py +0 -0
  297. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_agent_types.py +0 -0
  298. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_ansi.py +0 -0
  299. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_ask_user_extension.py +0 -0
  300. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_auth_command.py +0 -0
  301. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_auth_manager.py +0 -0
  302. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_auth_storage.py +0 -0
  303. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_autocomplete_modifiers.py +0 -0
  304. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_branch_navigation.py +0 -0
  305. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_branch_summarization.py +0 -0
  306. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_builtin_tools.py +0 -0
  307. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_builtin_watch.py +0 -0
  308. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_cli_inputs.py +0 -0
  309. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_command_execution_policy.py +0 -0
  310. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_command_registry.py +0 -0
  311. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_compaction.py +0 -0
  312. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_diff.py +0 -0
  313. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_editor_protocol.py +0 -0
  314. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_engine_execution.py +0 -0
  315. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_engine_steering.py +0 -0
  316. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_engine_types.py +0 -0
  317. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_escape_behavior.py +0 -0
  318. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_extension_api.py +0 -0
  319. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_extension_lifecycle.py +0 -0
  320. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_footer_model.py +0 -0
  321. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_footer_utils.py +0 -0
  322. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_fuzzy.py +0 -0
  323. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_http_proxy.py +0 -0
  324. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_image_processing.py +0 -0
  325. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_inference_api_text_utils.py +0 -0
  326. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_inference_dialect.py +0 -0
  327. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_inference_error_utils.py +0 -0
  328. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_inference_types.py +0 -0
  329. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_inference_utils.py +0 -0
  330. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_keybindings.py +0 -0
  331. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_markdown.py +0 -0
  332. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_message_types.py +0 -0
  333. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_message_utils.py +0 -0
  334. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_model_availability.py +0 -0
  335. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_model_command.py +0 -0
  336. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_model_registry.py +0 -0
  337. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_model_selector_modal.py +0 -0
  338. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_model_types.py +0 -0
  339. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_oauth_utils.py +0 -0
  340. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_package_resources.py +0 -0
  341. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_packages_utils.py +0 -0
  342. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_peer_extension.py +0 -0
  343. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_pkce.py +0 -0
  344. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_prompts_expand.py +0 -0
  345. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_prompts_loader.py +0 -0
  346. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_prompts_registry.py +0 -0
  347. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_provider_registry.py +0 -0
  348. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_resource_loader.py +0 -0
  349. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_rpc_mode.py +0 -0
  350. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_runtime_sdk.py +0 -0
  351. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_secrets.py +0 -0
  352. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_selector_controller.py +0 -0
  353. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_session_manager.py +0 -0
  354. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_session_trust_persist.py +0 -0
  355. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_session_types.py +0 -0
  356. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_session_utils.py +0 -0
  357. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_settings_manager.py +0 -0
  358. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_settings_paths.py +0 -0
  359. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_settings_storage.py +0 -0
  360. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_settings_utils.py +0 -0
  361. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_skills_loader.py +0 -0
  362. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_skills_registry.py +0 -0
  363. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_subagents_extension.py +0 -0
  364. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_telemetry.py +0 -0
  365. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_text_llm_invoke.py +0 -0
  366. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_theme_loader.py +0 -0
  367. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_themes_registry.py +0 -0
  368. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_thinking_render.py +0 -0
  369. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tool_registry.py +0 -0
  370. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tool_render.py +0 -0
  371. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_trust_manager.py +0 -0
  372. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_trust_utils.py +0 -0
  373. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_capabilities.py +0 -0
  374. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_input.py +0 -0
  375. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_layout_sizing.py +0 -0
  376. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_public_api.py +0 -0
  377. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_renderer.py +0 -0
  378. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_select_list.py +0 -0
  379. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_theme.py +0 -0
  380. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_tui_utils.py +0 -0
  381. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_ui_context.py +0 -0
  382. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/tests/test_version_check.py +0 -0
  383. {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.4}/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.5.2
3
+ Version: 0.5.4
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
@@ -122,6 +122,9 @@ Input is normalized into typed events:
122
122
  - `BgColorEvent`
123
123
 
124
124
  Use `KeyEvent.matches()` instead of comparing raw escape sequences.
125
+ Mouse reporting is enabled while the TUI runs. The stock interactive
126
+ `TextInput` moves its caret to the clicked text position, including across
127
+ hard newlines and soft-wrapped rows.
125
128
 
126
129
  ## Overlays
127
130
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tau-coding-agent"
7
- version = "0.5.2"
7
+ version = "0.5.4"
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"
@@ -0,0 +1,9 @@
1
+ import os
2
+
3
+ # Skip pydantic's plugin discovery (a full `importlib.metadata.distributions()`
4
+ # scan of every installed package, ~30-50ms) unless the environment already
5
+ # asked for a specific setting. Tau ships no pydantic plugins and none are
6
+ # expected to be installed alongside it; this must run before the first
7
+ # pydantic BaseModel subclass is defined anywhere in the process, so it lives
8
+ # in this package's __init__ (executed before any tau submodule).
9
+ os.environ.setdefault("PYDANTIC_DISABLE_PLUGINS", "1")
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import os
4
4
  import platform
5
5
  import shutil
6
+ import sys
6
7
  from collections.abc import Callable
7
8
  from datetime import date
8
9
  from pathlib import Path
@@ -163,17 +164,41 @@ _GIT_LOG_COUNT = 5
163
164
 
164
165
 
165
166
  def _detect_os() -> str:
166
- """Return a human-readable OS name and version."""
167
+ """Return a human-readable OS name and version.
168
+
169
+ On Windows, ``platform.system()``/``platform.release()`` call
170
+ ``platform.uname()``, which shells out to two separate WMI COM queries
171
+ (~150-200ms combined) to determine the release name. ``sys.getwindowsversion()``
172
+ reads the same information directly from the OS with no WMI round-trip, so we
173
+ use it here and derive the release name (10 vs 11) from the build number using
174
+ the same >=22000 heuristic Windows itself uses.
175
+ """
176
+ if sys.platform == "win32":
177
+ v = sys.getwindowsversion()
178
+ release = "11" if v.build >= 22000 else str(v.major)
179
+ return f"Windows {release}"
167
180
  system = platform.system()
168
181
  if system == "Darwin":
169
182
  return f"macOS {platform.mac_ver()[0] or platform.release()}"
170
183
  if system == "Linux":
171
184
  return f"Linux {platform.release()}"
172
- if system == "Windows":
173
- return f"Windows {platform.release()}"
174
185
  return f"{system} {platform.release()}".strip()
175
186
 
176
187
 
188
+ def _detect_machine() -> str:
189
+ """Return the machine architecture (e.g. 'x86_64', 'AMD64').
190
+
191
+ ``platform.machine()`` is a thin wrapper around ``platform.uname()``, which
192
+ is expensive on Windows (see ``_detect_os``). ``PROCESSOR_ARCHITECTURE`` is
193
+ always set by the OS and gives the same value without the WMI round-trip.
194
+ """
195
+ if sys.platform == "win32":
196
+ arch = os.environ.get("PROCESSOR_ARCHITECTURE")
197
+ if arch:
198
+ return arch
199
+ return platform.machine()
200
+
201
+
177
202
  def _detect_shell() -> str:
178
203
  """Detect the user's shell from $SHELL, falling back to common shells on PATH."""
179
204
  shell = os.environ.get("SHELL", "")
@@ -198,7 +223,6 @@ def _git_status(cwd: Path) -> str:
198
223
  except ImportError:
199
224
  return ""
200
225
 
201
- repo = None
202
226
  try:
203
227
  repo = Repo(cwd, search_parent_directories=True)
204
228
 
@@ -233,9 +257,12 @@ def _git_status(cwd: Path) -> str:
233
257
  return ""
234
258
  except GitError:
235
259
  return ""
236
- finally:
237
- if repo is not None:
238
- repo.close()
260
+ # No explicit repo.close() here: GitPython's Repo.__del__ already calls it,
261
+ # and close() forces two gc.collect() passes on Windows (its own workaround
262
+ # for tempfile handles). Closing explicitly *and* via __del__ paid for that
263
+ # gc.collect() pass twice for no benefit — we don't touch the object database
264
+ # in the common (attached-branch) path, so there's nothing time-sensitive to
265
+ # release synchronously.
239
266
 
240
267
  parts = [
241
268
  "\n\ngitStatus: snapshot taken at session start; it is not updated during the "
@@ -440,6 +467,8 @@ class PromptBuilder:
440
467
  """
441
468
  if self._opts.project_trusted is False:
442
469
  return ""
470
+ if self._opts.git_snapshot is not None:
471
+ return self._opts.git_snapshot
443
472
  return _git_status(self._opts.cwd)
444
473
 
445
474
  def _footer(self) -> str:
@@ -449,7 +478,7 @@ class PromptBuilder:
449
478
  "\n\n# Environment\n"
450
479
  f"Current working directory: {cwd}\n"
451
480
  f"OS: {_detect_os()}\n"
452
- f"Architecture: {platform.machine()}\n"
481
+ f"Architecture: {_detect_machine()}\n"
453
482
  f"Shell: {_detect_shell()}\n"
454
483
  f"Date: {today}"
455
484
  )
@@ -39,3 +39,9 @@ class PromptOptions(BaseModel):
39
39
 
40
40
  # Preloaded context files. None keeps direct PromptBuilder auto-discovery.
41
41
  context_files: tuple[ContextFile, ...] | None = None
42
+
43
+ # Precomputed git snapshot (see builder._git_status). None keeps direct,
44
+ # synchronous computation inside the builder; callers that can compute it
45
+ # concurrently with other startup work (e.g. RuntimeContext.create) pass
46
+ # the already-awaited result here to avoid blocking on it a second time.
47
+ git_snapshot: str | None = None
@@ -132,6 +132,7 @@ class TerminalTool(Tool):
132
132
  shell_path,
133
133
  "-c",
134
134
  command,
135
+ stdin=asyncio.subprocess.DEVNULL,
135
136
  stdout=asyncio.subprocess.PIPE,
136
137
  stderr=asyncio.subprocess.STDOUT,
137
138
  cwd=cwd,
@@ -140,6 +141,7 @@ class TerminalTool(Tool):
140
141
  else:
141
142
  proc = await asyncio.create_subprocess_shell(
142
143
  command,
144
+ stdin=asyncio.subprocess.DEVNULL,
143
145
  stdout=asyncio.subprocess.PIPE,
144
146
  stderr=asyncio.subprocess.STDOUT,
145
147
  cwd=cwd,
@@ -92,13 +92,14 @@ def _update_tau() -> None:
92
92
 
93
93
  # Pick the upgrade tool that matches how this copy was installed, inferred
94
94
  # from the venv it runs in, so we upgrade the right managed environment.
95
+ # Only trust prefix-based detection here: falling back to "uv"/"pipx just
96
+ # because they're on PATH (regardless of whether they installed this copy)
97
+ # tells the wrong tool to upgrade a package it doesn't manage, which fails.
95
98
  prefix = sys.prefix.replace(os.sep, "/")
96
99
  if "/pipx/" in prefix and shutil.which("pipx"):
97
100
  cmd = ["pipx", "upgrade", app]
98
- elif "/uv/tools/" in prefix and shutil.which("uv") or shutil.which("uv"):
101
+ elif "/uv/tools/" in prefix and shutil.which("uv"):
99
102
  cmd = ["uv", "tool", "upgrade", app]
100
- elif shutil.which("pipx"):
101
- cmd = ["pipx", "upgrade", app]
102
103
  else:
103
104
  cmd = [sys.executable, "-m", "pip", "install", "--upgrade", app]
104
105
 
@@ -10,7 +10,6 @@ from __future__ import annotations
10
10
  import asyncio
11
11
  import base64
12
12
  import json
13
- import ssl
14
13
  import subprocess
15
14
  import sys
16
15
  import time
@@ -19,8 +18,6 @@ import urllib.parse
19
18
  import urllib.request
20
19
  from dataclasses import dataclass
21
20
 
22
- import certifi
23
-
24
21
  from tau.inference.provider.oauth.pkce import generate_pkce
25
22
  from tau.inference.provider.oauth.types import (
26
23
  AbortSignal,
@@ -31,6 +28,7 @@ from tau.inference.provider.oauth.types import (
31
28
  )
32
29
  from tau.inference.provider.oauth.utils import (
33
30
  await_oauth_code,
31
+ get_oauth_ssl_context,
34
32
  parse_authorization_input,
35
33
  start_oauth_callback_server,
36
34
  )
@@ -38,8 +36,6 @@ from tau.inference.provider.types import OAuthProvider
38
36
 
39
37
  __all__ = ["AnthropicClaudeCodeOAuthProvider"]
40
38
 
41
- _SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
42
-
43
39
  _RAW_CLIENT_ID = "OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl"
44
40
  CLIENT_ID = base64.b64decode(_RAW_CLIENT_ID).decode()
45
41
  AUTHORIZE_URL = "https://claude.ai/oauth/authorize"
@@ -87,7 +83,7 @@ def _post_json(url: str, body: dict) -> dict:
87
83
  method="POST",
88
84
  )
89
85
  try:
90
- with urllib.request.urlopen(req, context=_SSL_CONTEXT, timeout=30) as resp:
86
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=30) as resp:
91
87
  return json.loads(resp.read())
92
88
  except urllib.error.HTTPError as e:
93
89
  body_text = e.read().decode(errors="replace")
@@ -134,7 +130,7 @@ def _validate_token_sync(access_token: str) -> bool:
134
130
  method="GET",
135
131
  )
136
132
  try:
137
- with urllib.request.urlopen(req, context=_SSL_CONTEXT, timeout=10) as resp:
133
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10) as resp:
138
134
  return resp.status == 200
139
135
  except urllib.error.HTTPError as e:
140
136
  # 401/403 mean the token is genuinely invalid; other codes may be transient
@@ -15,15 +15,12 @@ import asyncio
15
15
  import base64
16
16
  import json
17
17
  import re
18
- import ssl
19
18
  import time
20
19
  import urllib.error
21
20
  import urllib.parse
22
21
  import urllib.request
23
22
  from dataclasses import dataclass
24
23
 
25
- import certifi
26
-
27
24
  from tau.inference.provider.oauth.types import (
28
25
  AbortSignal,
29
26
  OAuthAuthInfo,
@@ -31,12 +28,11 @@ from tau.inference.provider.oauth.types import (
31
28
  OAuthLoginCallbacks,
32
29
  OAuthPrompt,
33
30
  )
31
+ from tau.inference.provider.oauth.utils import get_oauth_ssl_context
34
32
  from tau.inference.provider.types import OAuthProvider
35
33
 
36
34
  __all__ = ["GitHubCopilotOAuthProvider", "get_copilot_base_url"]
37
35
 
38
- _SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
39
-
40
36
  _RAW_CLIENT_ID = "SXYxLmI1MDdhMDhjODdlY2ZlOTg="
41
37
  CLIENT_ID = base64.b64decode(_RAW_CLIENT_ID).decode()
42
38
 
@@ -101,7 +97,7 @@ def _fetch_json(url: str, *, method: str = "GET", headers: dict, body: bytes | N
101
97
  """
102
98
  req = urllib.request.Request(url, data=body, headers=headers, method=method)
103
99
  try:
104
- with urllib.request.urlopen(req, context=_SSL_CONTEXT, timeout=30) as resp:
100
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=30) as resp:
105
101
  return json.loads(resp.read())
106
102
  except urllib.error.HTTPError as e:
107
103
  body_text = e.read().decode(errors="replace")
@@ -177,7 +173,7 @@ def _enable_model(copilot_token: str, model_id: str, enterprise_domain: str | No
177
173
  method="POST",
178
174
  )
179
175
  try:
180
- with urllib.request.urlopen(req, context=_SSL_CONTEXT, timeout=10) as resp:
176
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10) as resp:
181
177
  return resp.status == 200
182
178
  except Exception:
183
179
  return False
@@ -11,7 +11,6 @@ import asyncio
11
11
  import json
12
12
  import os
13
13
  import secrets
14
- import ssl
15
14
  import time
16
15
  import urllib.error
17
16
  import urllib.parse
@@ -19,8 +18,6 @@ import urllib.request
19
18
  from dataclasses import dataclass
20
19
  from pathlib import Path
21
20
 
22
- import certifi
23
-
24
21
  from tau.inference.provider.oauth.types import (
25
22
  AbortSignal,
26
23
  OAuthAuthInfo,
@@ -30,6 +27,7 @@ from tau.inference.provider.oauth.types import (
30
27
  )
31
28
  from tau.inference.provider.oauth.utils import (
32
29
  await_oauth_code,
30
+ get_oauth_ssl_context,
33
31
  parse_authorization_input,
34
32
  start_oauth_callback_server,
35
33
  )
@@ -37,8 +35,6 @@ from tau.inference.provider.types import OAuthProvider
37
35
 
38
36
  __all__ = ["GoogleAntigravityOAuthProvider"]
39
37
 
40
- _SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
41
-
42
38
  CLIENT_ID = os.getenv(
43
39
  "GOOGLE_ANTIGRAVITY_CLIENT_ID",
44
40
  "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com",
@@ -88,7 +84,7 @@ def _post_form(url: str, body: dict) -> dict:
88
84
  method="POST",
89
85
  )
90
86
  try:
91
- with urllib.request.urlopen(req, context=_SSL_CONTEXT, timeout=30) as resp:
87
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=30) as resp:
92
88
  return json.loads(resp.read())
93
89
  except urllib.error.HTTPError as e:
94
90
  body_text = e.read().decode(errors="replace")
@@ -130,7 +126,7 @@ def _validate_token_sync(access_token: str) -> bool:
130
126
  method="GET",
131
127
  )
132
128
  try:
133
- with urllib.request.urlopen(req, context=_SSL_CONTEXT, timeout=10) as resp:
129
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10) as resp:
134
130
  return resp.status == 200
135
131
  except urllib.error.HTTPError as e:
136
132
  return e.code not in (401, 403)
@@ -275,7 +271,7 @@ class GoogleAntigravityOAuthProvider(OAuthProvider):
275
271
  data=b"",
276
272
  method="POST",
277
273
  )
278
- with urllib.request.urlopen(req, context=_SSL_CONTEXT, timeout=10):
274
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10):
279
275
  pass
280
276
  except Exception:
281
277
  pass
@@ -11,7 +11,6 @@ import asyncio
11
11
  import base64
12
12
  import json
13
13
  import secrets
14
- import ssl
15
14
  import time
16
15
  import urllib.error
17
16
  import urllib.parse
@@ -19,8 +18,6 @@ import urllib.request
19
18
  from dataclasses import dataclass
20
19
  from pathlib import Path
21
20
 
22
- import certifi
23
-
24
21
  from tau.inference.provider.oauth.pkce import generate_pkce
25
22
  from tau.inference.provider.oauth.types import (
26
23
  AbortSignal,
@@ -31,13 +28,12 @@ from tau.inference.provider.oauth.types import (
31
28
  )
32
29
  from tau.inference.provider.oauth.utils import (
33
30
  await_oauth_code,
31
+ get_oauth_ssl_context,
34
32
  parse_authorization_input,
35
33
  start_oauth_callback_server,
36
34
  )
37
35
  from tau.inference.provider.types import OAuthProvider
38
36
 
39
- _SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
40
-
41
37
  __all__ = ["OpenAICodexOAuthProvider"]
42
38
 
43
39
  CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann"
@@ -113,7 +109,7 @@ def _post_token(body: dict[str, str]) -> dict:
113
109
  method="POST",
114
110
  )
115
111
  try:
116
- with urllib.request.urlopen(req, context=_SSL_CONTEXT) as resp:
112
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context()) as resp:
117
113
  return json.loads(resp.read())
118
114
  except urllib.error.HTTPError as e:
119
115
  body_text = e.read().decode(errors="replace")
@@ -159,7 +155,7 @@ def _revoke_token_sync(token: str) -> None:
159
155
  method="POST",
160
156
  )
161
157
  try:
162
- with urllib.request.urlopen(req, context=_SSL_CONTEXT):
158
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context()):
163
159
  pass
164
160
  except urllib.error.HTTPError:
165
161
  # best-effort; treat any error as revocation attempt done
@@ -174,7 +170,7 @@ def _validate_token_sync(access_token: str) -> bool:
174
170
  method="GET",
175
171
  )
176
172
  try:
177
- with urllib.request.urlopen(req, context=_SSL_CONTEXT) as resp:
173
+ with urllib.request.urlopen(req, context=get_oauth_ssl_context()) as resp:
178
174
  return resp.status == 200
179
175
  except urllib.error.HTTPError:
180
176
  return False
@@ -4,7 +4,9 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import logging
7
+ import ssl
7
8
  import urllib.parse
9
+ from functools import lru_cache
8
10
 
9
11
  from tau.inference.provider.oauth.types import OAuthLoginCallbacks
10
12
 
@@ -13,11 +15,25 @@ _log = logging.getLogger(__name__)
13
15
  __all__ = [
14
16
  "OAUTH_SUCCESS_HTML",
15
17
  "OAUTH_ERROR_HTML",
18
+ "get_oauth_ssl_context",
16
19
  "parse_authorization_input",
17
20
  "start_oauth_callback_server",
18
21
  "await_oauth_code",
19
22
  ]
20
23
 
24
+
25
+ @lru_cache(maxsize=1)
26
+ def get_oauth_ssl_context() -> ssl.SSLContext:
27
+ """Build (once, on first use) the shared SSL context for OAuth HTTP calls.
28
+
29
+ Loading the certifi CA bundle takes ~150-200ms; deferring it until an
30
+ OAuth provider is actually used (rather than at module import time)
31
+ keeps that cost off the startup path for users who aren't using OAuth.
32
+ """
33
+ import certifi
34
+
35
+ return ssl.create_default_context(cafile=certifi.where())
36
+
21
37
  OAUTH_SUCCESS_HTML = b"""<!DOCTYPE html><html><head><title>Auth complete</title></head><body>
22
38
  <h2>Authentication successful!</h2>
23
39
  <p>You can close this window and return to the application.</p>
@@ -272,6 +272,8 @@ class Layout(Component):
272
272
  self._settings_panel: list[str] | None = None
273
273
  self._prompt = TextPrompt()
274
274
  self._oauth_status_lines: list[str] | None = None
275
+ self._editor_row = 0
276
+ self._editor_row_count = 0
275
277
 
276
278
  # Model palette — inline filtered model list for '/model <name> <provider>'
277
279
 
@@ -366,6 +368,7 @@ class Layout(Component):
366
368
  content.append(_divider("─" * width))
367
369
 
368
370
  if any_modal:
371
+ self._editor_row_count = 0
369
372
  # Modal replaces the input between the two dividers
370
373
  if self._selectors.is_active:
371
374
  content.extend(self._selectors.render(width))
@@ -377,7 +380,10 @@ class Layout(Component):
377
380
  content.extend(self._oauth_status_lines)
378
381
  else:
379
382
  # Normal: show the input editor
380
- content.extend(self.input.render(width))
383
+ self._editor_row = len(content)
384
+ editor_lines = self.input.render(width)
385
+ self._editor_row_count = len(editor_lines)
386
+ content.extend(editor_lines)
381
387
 
382
388
  content.append(_divider("─" * width))
383
389
 
@@ -407,6 +413,20 @@ class Layout(Component):
407
413
  so this method deals only with editor and picker navigation.
408
414
  """
409
415
  if isinstance(event, MouseEvent):
416
+ if not event.pressed or event.button != 0:
417
+ return False
418
+ position = self._tui.mouse_position_for(self, event)
419
+ if position is None:
420
+ return False
421
+ row, column = position
422
+ editor_row = row - self._editor_row
423
+ if (
424
+ 0 <= editor_row < self._editor_row_count
425
+ and isinstance(self.input, TextInput)
426
+ and self.input.move_cursor_to_visual(editor_row, column)
427
+ ):
428
+ self._tui.request_render()
429
+ return True
410
430
  return False
411
431
 
412
432
  if self._selectors.handle_input(event):
@@ -1,12 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import asyncio
3
4
  from dataclasses import dataclass
4
5
  from pathlib import Path
5
6
  from typing import TYPE_CHECKING, Any
6
7
 
7
8
  from pydantic import BaseModel, Field
8
9
 
9
- from tau.agent.prompt.builder import build_prompt
10
+ from tau.agent.prompt.builder import _git_status, build_prompt
10
11
  from tau.agent.prompt.types import PromptOptions
11
12
  from tau.agent.service import Agent
12
13
  from tau.agent.types import AgentConfig
@@ -207,6 +208,16 @@ class RuntimeContext:
207
208
  )
208
209
  )
209
210
 
211
+ # Kick off the git-status snapshot now (needed later for the system prompt)
212
+ # so its subprocess calls run in a background thread concurrently with the
213
+ # rest of startup (settings, extension loading, resource discovery) instead
214
+ # of blocking the event loop right before the prompt is built.
215
+ git_task: asyncio.Task[str] | None = (
216
+ asyncio.create_task(asyncio.to_thread(_git_status, cwd))
217
+ if project_trusted and not config.system_prompt
218
+ else None
219
+ )
220
+
210
221
  # ── LLM ───────────────────────────────────────────────────────────────
211
222
  text_ref = settings_manager.get_model_ref("text")
212
223
  model_id = config.model_id or (text_ref.id if text_ref else None) or _DEFAULT_MODEL
@@ -351,6 +362,7 @@ class RuntimeContext:
351
362
  skills = skill_registry.list()
352
363
 
353
364
  # ── System prompt ─────────────────────────────────────────────────────
365
+ git_snapshot = await git_task if git_task is not None else None
354
366
  system_prompt = (
355
367
  config.system_prompt
356
368
  or resources.system_prompt
@@ -363,6 +375,7 @@ class RuntimeContext:
363
375
  disable_context_files=config.disable_context_files,
364
376
  project_trusted=project_trusted,
365
377
  context_files=resources.context_files,
378
+ git_snapshot=git_snapshot,
366
379
  )
367
380
  )
368
381
  )
@@ -42,14 +42,19 @@ class SessionType(StrEnum):
42
42
 
43
43
 
44
44
  class BaseSessionEntry(BaseModel):
45
- model_config = ConfigDict(arbitrary_types_allowed=True)
45
+ # defer_build: these models (and the ~10-way discriminated union built from
46
+ # them) cost ~60ms of pydantic core-schema construction at import time even
47
+ # though session entries are only read/written once a session file is
48
+ # actually touched. Deferring moves that cost to first real use instead of
49
+ # every startup.
50
+ model_config = ConfigDict(arbitrary_types_allowed=True, defer_build=True)
46
51
  id: str = Field(default_factory=_generate_id)
47
52
  timestamp: float = Field(default_factory=generate_timestamp)
48
53
  parent_id: str | None = None
49
54
 
50
55
 
51
56
  class SessionHeader(BaseModel):
52
- model_config = ConfigDict(arbitrary_types_allowed=True)
57
+ model_config = ConfigDict(arbitrary_types_allowed=True, defer_build=True)
53
58
  type: Literal[SessionType.SESSION_HEADER] = SessionType.SESSION_HEADER
54
59
  version: int = SESSION_VERSION
55
60
  id: str = Field(default_factory=_generate_id)
@@ -150,7 +155,7 @@ SessionFileEntry = Annotated[SessionHeader | SessionEntries, Field(discriminator
150
155
 
151
156
 
152
157
  class SessionTreeNode(BaseModel):
153
- model_config = ConfigDict(arbitrary_types_allowed=True)
158
+ model_config = ConfigDict(arbitrary_types_allowed=True, defer_build=True)
154
159
  entry: SessionEntry
155
160
  children: list[SessionTreeNode] = Field(default_factory=list)
156
161
  label: str | None = None