tau-coding-agent 0.1.0__tar.gz → 0.2.0__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 (317) hide show
  1. {tau_coding_agent-0.1.0/tau_coding_agent.egg-info → tau_coding_agent-0.2.0}/PKG-INFO +11 -5
  2. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/README.md +9 -3
  3. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/pyproject.toml +12 -2
  4. tau_coding_agent-0.2.0/tau/builtins/__pycache__/__init__.cpython-313.pyc +0 -0
  5. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/__init__.cpython-313.pyc +0 -0
  6. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/clear.cpython-313.pyc +0 -0
  7. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/compact.cpython-313.pyc +0 -0
  8. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/reload.cpython-313.pyc +0 -0
  9. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/session.cpython-313.pyc +0 -0
  10. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/__init__.cpython-313.pyc +0 -0
  11. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/git.cpython-313.pyc +0 -0
  12. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/model.cpython-313.pyc +0 -0
  13. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/utils.cpython-313.pyc +0 -0
  14. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/header/__pycache__/__init__.cpython-313.pyc +0 -0
  15. tau_coding_agent-0.2.0/tau/builtins/models/__pycache__/__init__.cpython-313.pyc +0 -0
  16. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/__pycache__/text.cpython-313.pyc +0 -0
  17. tau_coding_agent-0.2.0/tau/builtins/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  18. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/__pycache__/text.cpython-313.pyc +0 -0
  19. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  20. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/edit.cpython-313.pyc +0 -0
  21. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/glob.cpython-313.pyc +0 -0
  22. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/grep.cpython-313.pyc +0 -0
  23. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/ls.cpython-313.pyc +0 -0
  24. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/read.cpython-313.pyc +0 -0
  25. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/terminal.cpython-313.pyc +0 -0
  26. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/write.cpython-313.pyc +0 -0
  27. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/cli.py +1 -1
  28. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/google_antigravity.py +4 -3
  29. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/utils.py +11 -1
  30. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/message/types.py +15 -0
  31. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/runtime/service.py +2 -0
  32. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/themes/registry.py +23 -0
  33. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/app.py +25 -11
  34. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/appearance.py +4 -4
  35. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/autocomplete_manager.py +6 -0
  36. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/input_handler.py +40 -6
  37. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0/tau_coding_agent.egg-info}/PKG-INFO +11 -5
  38. tau_coding_agent-0.1.0/tau/builtins/__pycache__/__init__.cpython-313.pyc +0 -0
  39. tau_coding_agent-0.1.0/tau/builtins/models/__pycache__/__init__.cpython-313.pyc +0 -0
  40. tau_coding_agent-0.1.0/tau/builtins/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  41. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/LICENSE +0 -0
  42. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/MANIFEST.in +0 -0
  43. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
  44. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/architecture.md +0 -0
  45. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/auth.md +0 -0
  46. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/cli-reference.md +0 -0
  47. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/development.md +0 -0
  48. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/docs.json +0 -0
  49. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/extension-settings.md +0 -0
  50. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/extensions.md +0 -0
  51. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/http-proxy.md +0 -0
  52. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/index.md +0 -0
  53. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/inference-providers.md +0 -0
  54. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/installation.md +0 -0
  55. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/keybindings.md +0 -0
  56. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/messages.md +0 -0
  57. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/project-context.md +0 -0
  58. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/project-structure.md +0 -0
  59. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/prompts.md +0 -0
  60. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/python-api.md +0 -0
  61. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/quickstart.md +0 -0
  62. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/sessions.md +0 -0
  63. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/settings.md +0 -0
  64. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/skills.md +0 -0
  65. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/themes.md +0 -0
  66. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/tools.md +0 -0
  67. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/usage.md +0 -0
  68. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/setup.cfg +0 -0
  69. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/__init__.py +0 -0
  70. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/__init__.py +0 -0
  71. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/prompt/__init__.py +0 -0
  72. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/prompt/builder.py +0 -0
  73. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/prompt/types.py +0 -0
  74. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/service.py +0 -0
  75. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/types.py +0 -0
  76. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/auth/manager.py +0 -0
  77. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/auth/storage.py +0 -0
  78. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/auth/types.py +0 -0
  79. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/__init__.py +0 -0
  80. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/__pycache__/__init__.cpython-314.pyc +0 -0
  81. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__init__.py +0 -0
  82. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/__init__.cpython-314.pyc +0 -0
  83. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/clear.cpython-314.pyc +0 -0
  84. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/compact.cpython-314.pyc +0 -0
  85. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/reload.cpython-314.pyc +0 -0
  86. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/session.cpython-314.pyc +0 -0
  87. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/clear.py +0 -0
  88. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/compact.py +0 -0
  89. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/reload.py +0 -0
  90. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/session.py +0 -0
  91. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__init__.py +0 -0
  92. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/git.py +0 -0
  93. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/model.py +0 -0
  94. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/utils.py +0 -0
  95. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/header/__init__.py +0 -0
  96. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/__init__.py +0 -0
  97. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/audio.py +0 -0
  98. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/image.py +0 -0
  99. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/text.py +0 -0
  100. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/video.py +0 -0
  101. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/commit.md +0 -0
  102. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/docs.md +0 -0
  103. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/explain.md +0 -0
  104. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/fix.md +0 -0
  105. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/refactor.md +0 -0
  106. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/review.md +0 -0
  107. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/test.md +0 -0
  108. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/__init__.py +0 -0
  109. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/audio.py +0 -0
  110. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/image.py +0 -0
  111. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/text.py +0 -0
  112. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/video.py +0 -0
  113. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/skills/code-review/SKILL.md +0 -0
  114. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/skills/debug/SKILL.md +0 -0
  115. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  116. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/themes/dark.yaml +0 -0
  117. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/themes/light.yaml +0 -0
  118. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__init__.py +0 -0
  119. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  120. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/bash.cpython-313.pyc +0 -0
  121. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/bash.cpython-314.pyc +0 -0
  122. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/edit.cpython-314.pyc +0 -0
  123. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/glob.cpython-314.pyc +0 -0
  124. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/grep.cpython-314.pyc +0 -0
  125. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/ls.cpython-314.pyc +0 -0
  126. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/read.cpython-314.pyc +0 -0
  127. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/terminal.cpython-314.pyc +0 -0
  128. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/write.cpython-314.pyc +0 -0
  129. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/edit.py +0 -0
  130. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/glob.py +0 -0
  131. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/grep.py +0 -0
  132. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/ls.py +0 -0
  133. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/read.py +0 -0
  134. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/terminal.py +0 -0
  135. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/write.py +0 -0
  136. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/commands/__init__.py +0 -0
  137. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/commands/registry.py +0 -0
  138. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/commands/types.py +0 -0
  139. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/__init__.py +0 -0
  140. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/__init__.py +0 -0
  141. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/auth.py +0 -0
  142. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/packages.py +0 -0
  143. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/update.py +0 -0
  144. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/core/__init__.py +0 -0
  145. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/core/registry.py +0 -0
  146. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/engine/__init__.py +0 -0
  147. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/engine/service.py +0 -0
  148. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/engine/types.py +0 -0
  149. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/__init__.py +0 -0
  150. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/api.py +0 -0
  151. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/context.py +0 -0
  152. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/events.py +0 -0
  153. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/loader.py +0 -0
  154. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/runtime.py +0 -0
  155. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/settings.py +0 -0
  156. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/__init__.py +0 -0
  157. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/engine.py +0 -0
  158. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/inference.py +0 -0
  159. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/runtime.py +0 -0
  160. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/service.py +0 -0
  161. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/session.py +0 -0
  162. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/tui.py +0 -0
  163. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/types.py +0 -0
  164. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/__init__.py +0 -0
  165. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/__init__.py +0 -0
  166. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/__init__.py +0 -0
  167. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/base.py +0 -0
  168. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/builtins.py +0 -0
  169. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  170. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/gemini_audio.py +0 -0
  171. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/openai_audio.py +0 -0
  172. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/registry.py +0 -0
  173. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/sarvam_audio.py +0 -0
  174. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/service.py +0 -0
  175. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/utils.py +0 -0
  176. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/__init__.py +0 -0
  177. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/base.py +0 -0
  178. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/builtins.py +0 -0
  179. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/gemini_image.py +0 -0
  180. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/openai_image.py +0 -0
  181. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/openrouter.py +0 -0
  182. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/registry.py +0 -0
  183. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/service.py +0 -0
  184. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/registry.py +0 -0
  185. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/__init__.py +0 -0
  186. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/anthropic_claude_code.py +0 -0
  187. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/anthropic_messages.py +0 -0
  188. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/base.py +0 -0
  189. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/builtins.py +0 -0
  190. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/gemini_generate.py +0 -0
  191. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/github_copilot_chat.py +0 -0
  192. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/google_antigravity.py +0 -0
  193. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/mistral_chat.py +0 -0
  194. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/ollama_chat.py +0 -0
  195. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/openai_codex_responses.py +0 -0
  196. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/openai_completions.py +0 -0
  197. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/openai_responses.py +0 -0
  198. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/registry.py +0 -0
  199. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/service.py +0 -0
  200. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/types.py +0 -0
  201. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/utils.py +0 -0
  202. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/__init__.py +0 -0
  203. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/base.py +0 -0
  204. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/builtins.py +0 -0
  205. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/fal_video.py +0 -0
  206. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/openrouter_video.py +0 -0
  207. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/registry.py +0 -0
  208. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/service.py +0 -0
  209. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/model/__init__.py +0 -0
  210. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/model/registry.py +0 -0
  211. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/model/types.py +0 -0
  212. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/__init__.py +0 -0
  213. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/__init__.py +0 -0
  214. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
  215. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/github_copilot.py +0 -0
  216. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/openai_codex.py +0 -0
  217. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/pkce.py +0 -0
  218. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/types.py +0 -0
  219. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/registry.py +0 -0
  220. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/types.py +0 -0
  221. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/types.py +0 -0
  222. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/utils.py +0 -0
  223. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/message/__init__.py +0 -0
  224. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/message/utils.py +0 -0
  225. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/__init__.py +0 -0
  226. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/manager.py +0 -0
  227. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/types.py +0 -0
  228. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/utils.py +0 -0
  229. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/expand.py +0 -0
  230. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/loader.py +0 -0
  231. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/registry.py +0 -0
  232. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/types.py +0 -0
  233. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/rpc/__init__.py +0 -0
  234. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/rpc/mode.py +0 -0
  235. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/rpc/types.py +0 -0
  236. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/runtime/types.py +0 -0
  237. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/branch_summarization.py +0 -0
  238. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/compaction.py +0 -0
  239. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/manager.py +0 -0
  240. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/types.py +0 -0
  241. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/utils.py +0 -0
  242. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/manager.py +0 -0
  243. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/paths.py +0 -0
  244. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/storage.py +0 -0
  245. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/types.py +0 -0
  246. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/utils.py +0 -0
  247. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/skills/loader.py +0 -0
  248. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/skills/registry.py +0 -0
  249. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/skills/types.py +0 -0
  250. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/themes/loader.py +0 -0
  251. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/themes/types.py +0 -0
  252. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/__init__.py +0 -0
  253. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/registry.py +0 -0
  254. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/render.py +0 -0
  255. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/types.py +0 -0
  256. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/__init__.py +0 -0
  257. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/manager.py +0 -0
  258. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/types.py +0 -0
  259. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/utils.py +0 -0
  260. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/__init__.py +0 -0
  261. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/agent_hooks.py +0 -0
  262. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/ansi.py +0 -0
  263. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/autocomplete.py +0 -0
  264. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/capabilities.py +0 -0
  265. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/__init__.py +0 -0
  266. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/auth.py +0 -0
  267. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/context.py +0 -0
  268. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/misc.py +0 -0
  269. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/model.py +0 -0
  270. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/session.py +0 -0
  271. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/component.py +0 -0
  272. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/__init__.py +0 -0
  273. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/autocomplete_picker.py +0 -0
  274. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/box.py +0 -0
  275. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/command_palette.py +0 -0
  276. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/dynamic_border.py +0 -0
  277. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/file_picker.py +0 -0
  278. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/image.py +0 -0
  279. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/inline_selector.py +0 -0
  280. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/layout.py +0 -0
  281. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/message_list.py +0 -0
  282. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/modal.py +0 -0
  283. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/model_palette.py +0 -0
  284. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/picker_overlay.py +0 -0
  285. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/prompt_overlay.py +0 -0
  286. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/resume_modal.py +0 -0
  287. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/select_list.py +0 -0
  288. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/settings_modal.py +0 -0
  289. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/settings_schema.py +0 -0
  290. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/spinner.py +0 -0
  291. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/text_input.py +0 -0
  292. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/text_prompt.py +0 -0
  293. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/tree_select_list.py +0 -0
  294. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/trust_screen.py +0 -0
  295. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/diff.py +0 -0
  296. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/fuzzy.py +0 -0
  297. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/input.py +0 -0
  298. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/keybindings.py +0 -0
  299. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/markdown.py +0 -0
  300. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/message_renderers.py +0 -0
  301. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/overlay.py +0 -0
  302. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/renderer.py +0 -0
  303. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/terminal.py +0 -0
  304. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/theme.py +0 -0
  305. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/tui.py +0 -0
  306. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/ui_context.py +0 -0
  307. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/utils.py +0 -0
  308. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/__init__.py +0 -0
  309. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/http_proxy.py +0 -0
  310. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/image_processing.py +0 -0
  311. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/secrets.py +0 -0
  312. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/version_check.py +0 -0
  313. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/SOURCES.txt +0 -0
  314. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  315. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  316. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/requires.txt +0 -0
  317. {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tau-coding-agent
3
- Version: 0.1.0
4
- Summary: Interactive agent CLI with terminal UI for multi-provider LLM support
3
+ Version: 0.2.0
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.13.*
6
6
  Description-Content-Type: text/markdown
7
7
  License-File: LICENSE
@@ -27,9 +27,15 @@ Requires-Dist: pathspec==1.1.1
27
27
  Requires-Dist: gitpython==3.1.50
28
28
  Dynamic: license-file
29
29
 
30
- # Tau
30
+ # Tau (τ)
31
31
 
32
- Inspired by [Pi](https://pi.dev), Tau brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
32
+ Inspired by [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
33
+
34
+ <p align="center">
35
+ <img src="assets/tui.png" alt="Tau TUI" width="700">
36
+ </p>
37
+
38
+ Start a conversation with the agent in the terminal.
33
39
 
34
40
  ---
35
41
 
@@ -55,7 +61,7 @@ pip install -e .
55
61
  tau
56
62
  ```
57
63
 
58
- Authenticate with your LLM provider using `/login` or set environment variables (e.g., `ANTHROPIC_API_KEY`).
64
+ Authenticate with your LLM provider using `/login` or set environment variables (e.g., `NVIDIA_API_KEY`).
59
65
 
60
66
  ### Common Commands
61
67
 
@@ -1,6 +1,12 @@
1
- # Tau
1
+ # Tau (τ)
2
2
 
3
- Inspired by [Pi](https://pi.dev), Tau brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
3
+ Inspired by [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
4
+
5
+ <p align="center">
6
+ <img src="assets/tui.png" alt="Tau TUI" width="700">
7
+ </p>
8
+
9
+ Start a conversation with the agent in the terminal.
4
10
 
5
11
  ---
6
12
 
@@ -26,7 +32,7 @@ pip install -e .
26
32
  tau
27
33
  ```
28
34
 
29
- Authenticate with your LLM provider using `/login` or set environment variables (e.g., `ANTHROPIC_API_KEY`).
35
+ Authenticate with your LLM provider using `/login` or set environment variables (e.g., `NVIDIA_API_KEY`).
30
36
 
31
37
  ### Common Commands
32
38
 
@@ -1,7 +1,11 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61"]
3
+ build-backend = "setuptools.build_meta"
4
+
1
5
  [project]
2
6
  name = "tau-coding-agent"
3
- version = "0.1.0"
4
- description = "Interactive agent CLI with terminal UI for multi-provider LLM support"
7
+ version = "0.2.0"
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"
5
9
  readme = "README.md"
6
10
  requires-python = "==3.13.*"
7
11
  dependencies = [
@@ -49,6 +53,12 @@ indent-style = "space"
49
53
  [tool.setuptools]
50
54
  include-package-data = true
51
55
 
56
+ # Only package the `tau` import package. Without this, setuptools auto-discovery
57
+ # trips over sibling top-level dirs (dist/, docs/, assets/, *.egg-info) and
58
+ # aborts editable installs with "Multiple top-level packages discovered".
59
+ [tool.setuptools.packages.find]
60
+ include = ["tau*"]
61
+
52
62
  [tool.setuptools.package-data]
53
63
  tau = [
54
64
  "builtins/**/*",
@@ -49,7 +49,7 @@ def resolve_model(model: str | None, provider: str | None) -> tuple[str | None,
49
49
  @click.option("--provider", default=None, help="Provider to use (e.g. groq, mistral, openrouter).")
50
50
  @click.option("--model", default=None, help="Model ID, or provider/model shorthand (e.g. groq/llama-3.3-70b-versatile).")
51
51
  @click.option("--theme", "-t", default=None, metavar="NAME",
52
- help="UI theme: default, dracula, nord, gruvbox, catppuccin.")
52
+ help="UI theme name (default: dark). Builtins: dark, light. See /theme for all installed themes.")
53
53
  @click.option("--resume", "-r", is_flag=True, default=False,
54
54
  help="Resume the most recent session.")
55
55
  @click.option("--system", "-s", default=None, metavar="TEXT",
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import asyncio
10
10
  import json
11
+ import os
11
12
  import secrets
12
13
  import ssl
13
14
  import time
@@ -26,10 +27,10 @@ from tau.inference.provider.oauth.utils import parse_authorization_input, start_
26
27
 
27
28
  __all__ = ["GoogleAntigravityOAuthProvider"]
28
29
 
29
- _SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
30
+ _SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
30
31
 
31
- CLIENT_ID = "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com"
32
- CLIENT_SECRET = "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"
32
+ CLIENT_ID = os.getenv("GOOGLE_ANTIGRAVITY_CLIENT_ID", "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com")
33
+ CLIENT_SECRET = os.getenv("GOOGLE_ANTIGRAVITY_CLIENT_SECRET", "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")
33
34
  AUTHORIZE_URL = "https://accounts.google.com/o/oauth2/v2/auth"
34
35
  TOKEN_URL = "https://oauth2.googleapis.com/token"
35
36
  USERINFO_URL = "https://www.googleapis.com/oauth2/v1/userinfo"
@@ -119,12 +119,14 @@ async def await_oauth_code(
119
119
  """
120
120
  code: Optional[str] = None
121
121
  recv_state: Optional[str] = None
122
+ pending: set = set()
122
123
  try:
123
124
  if callbacks.on_manual_code_input:
124
125
  browser_task = asyncio.ensure_future(code_future)
125
126
  manual_task = asyncio.ensure_future(callbacks.on_manual_code_input())
127
+ pending = {browser_task, manual_task}
126
128
  done, pending = await asyncio.wait(
127
- [browser_task, manual_task],
129
+ pending,
128
130
  timeout=300,
129
131
  return_when=asyncio.FIRST_COMPLETED,
130
132
  )
@@ -148,7 +150,15 @@ async def await_oauth_code(
148
150
  recv_state = state
149
151
  except asyncio.TimeoutError:
150
152
  pass
153
+ except Exception:
154
+ for task in pending:
155
+ if not task.done():
156
+ task.cancel()
157
+ raise
151
158
  finally:
159
+ for task in pending:
160
+ if not task.done():
161
+ task.cancel()
152
162
  server.close()
153
163
  await server.wait_closed()
154
164
  return code, recv_state
@@ -41,6 +41,21 @@ class ImageContent:
41
41
  images: list[str | Image.Image | bytes] = field(default_factory=list)
42
42
  dimension_note: str | None = None
43
43
 
44
+ def __post_init__(self) -> None:
45
+ # Normalize raw bytes / PIL images to base64 strings so the content is
46
+ # always JSON-serializable for session persistence (pydantic cannot
47
+ # encode non-UTF-8 image bytes). Existing base64 and URL strings pass
48
+ # through unchanged, and to_base64() re-detects the MIME type from the
49
+ # base64 magic bytes, so downstream API/render code is unaffected.
50
+ normalized: list[str | Image.Image | bytes] = []
51
+ for img in self.images:
52
+ if isinstance(img, str):
53
+ normalized.append(img)
54
+ else:
55
+ b64, _ = image_to_base64(img)
56
+ normalized.append(b64)
57
+ self.images = normalized
58
+
44
59
  def to_base64(self) -> list[tuple[str, str]]:
45
60
  """Convert all images to (base64_data, mime_type) pairs.
46
61
 
@@ -178,6 +178,8 @@ class Runtime:
178
178
  expanded = prompt_registry.expand(name, " ".join(args))
179
179
  if expanded is not None:
180
180
  await self.invoke(expanded, options)
181
+ else:
182
+ self.notify(f"Unknown command: /{name}")
181
183
  case t:
182
184
  await self.invoke(t, options)
183
185
 
@@ -20,6 +20,11 @@ if TYPE_CHECKING:
20
20
  from tau.tui.theme import LayoutTheme
21
21
 
22
22
 
23
+ #: Name of the theme used when none is configured. Must always resolve to a
24
+ #: builtin so the TUI can start even with no global/project themes installed.
25
+ DEFAULT_THEME = "dark"
26
+
27
+
23
28
  class ThemeRegistry:
24
29
  def __init__(self) -> None:
25
30
  """Initialize an empty theme registry."""
@@ -75,6 +80,24 @@ class ThemeRegistry:
75
80
  )
76
81
  return loader()
77
82
 
83
+ def get_default(self) -> "LayoutTheme":
84
+ """Return a theme that is guaranteed to load.
85
+
86
+ Tries the configured default, then any builtin, then falls back to a
87
+ bare ``LayoutTheme()`` so the UI can always start — even when no theme
88
+ files are present at all.
89
+ """
90
+ self._ensure_builtins()
91
+ for name in (DEFAULT_THEME, "light"):
92
+ loader = self._registry.get(name)
93
+ if loader is not None:
94
+ return loader()
95
+ if self._registry:
96
+ return next(iter(self._registry.values()))()
97
+ from tau.tui.theme import LayoutTheme
98
+
99
+ return LayoutTheme()
100
+
78
101
  def list(self) -> list[str]:
79
102
  """Return all available theme names."""
80
103
  self._ensure_builtins()
@@ -45,6 +45,7 @@ class App:
45
45
  on_turn_content=self._input.mark_turn_content,
46
46
  )
47
47
  self._unsubs: list[Callable[[], None]] = []
48
+ self._pending_tasks: set[asyncio.Task] = set()
48
49
  self._last_ctrl_c: float = 0.0
49
50
  self._last_escape: float = 0.0
50
51
 
@@ -60,7 +61,7 @@ class App:
60
61
  keybindings: KeyMap | None = None,
61
62
  ) -> App:
62
63
  """Build the TUI around an already-constructed Runtime."""
63
- from tau.themes.registry import theme_registry
64
+ from tau.themes.registry import theme_registry, DEFAULT_THEME
64
65
 
65
66
  cwd = runtime.session_manager.cwd if runtime.session_manager is not None else None
66
67
  theme_registry.load_external(cwd=cwd)
@@ -69,18 +70,21 @@ class App:
69
70
  prompt_registry.load_external(cwd=cwd)
70
71
 
71
72
  resolved_theme: LayoutTheme | None
72
- theme_name = "default"
73
+ theme_name = DEFAULT_THEME
73
74
  if isinstance(theme, str):
74
75
  theme_name = theme
75
76
  resolved_theme = theme_registry.get(theme_name)
76
77
  elif theme is None:
77
78
  sm = runtime.settings_manager
78
- theme_name = (sm.get_theme() if sm is not None else None) or "default"
79
+ theme_name = (sm.get_theme() if sm is not None else None) or DEFAULT_THEME
79
80
  try:
80
81
  resolved_theme = theme_registry.get(theme_name)
81
82
  except ValueError:
82
- theme_name = "default"
83
- resolved_theme = theme_registry.get(theme_name)
83
+ # Configured theme is gone (e.g. an uninstalled theme package)
84
+ # or the default builtin is missing — fall back to a theme that
85
+ # is guaranteed to load instead of crashing on startup.
86
+ theme_name = DEFAULT_THEME
87
+ resolved_theme = theme_registry.get_default()
84
88
  else:
85
89
  resolved_theme = theme
86
90
 
@@ -172,7 +176,11 @@ class App:
172
176
  def _on_model_palette_commit(self, model_id: str, provider: str) -> None:
173
177
  import asyncio
174
178
  from tau.tui.commands import model as cmd_model
175
- asyncio.ensure_future(cmd_model._apply_model(self._ctx(), model_id, provider))
179
+ self._track_task(asyncio.ensure_future(cmd_model._apply_model(self._ctx(), model_id, provider)))
180
+
181
+ def _track_task(self, task: asyncio.Task) -> None:
182
+ self._pending_tasks.add(task)
183
+ task.add_done_callback(self._pending_tasks.discard)
176
184
 
177
185
  # -------------------------------------------------------------------------
178
186
  # UI command registration
@@ -300,14 +308,14 @@ class App:
300
308
  # before the loop starts so the layout never renders until the user acts.
301
309
  trust_needed = self._setup_trust_screen_if_needed()
302
310
 
303
- asyncio.ensure_future(self._announce_update())
311
+ self._track_task(asyncio.ensure_future(self._announce_update()))
304
312
 
305
313
  await self._runtime.hooks.emit(TuiStartEvent())
306
314
  try:
307
315
  await self._tui.run()
308
316
  finally:
309
317
  await self._runtime.hooks.emit(TuiExitEvent())
310
- self._cleanup()
318
+ await self._cleanup()
311
319
 
312
320
  # -------------------------------------------------------------------------
313
321
  # Project trust prompt
@@ -354,7 +362,7 @@ class App:
354
362
  import asyncio as _asyncio
355
363
  async def _reload() -> None:
356
364
  await self._runtime.reload_extensions()
357
- _asyncio.ensure_future(_reload())
365
+ self._track_task(_asyncio.ensure_future(_reload()))
358
366
 
359
367
  from tau.tui.components.trust_screen import TrustScreen
360
368
  screen = TrustScreen(str(cwd), options, _on_commit)
@@ -449,7 +457,7 @@ class App:
449
457
  ctx = ExtensionContext.from_runtime(runtime)
450
458
  result = h(ctx)
451
459
  if asyncio.iscoroutine(result):
452
- asyncio.ensure_future(result) # type: ignore[arg-type]
460
+ self._track_task(asyncio.ensure_future(result)) # type: ignore[arg-type]
453
461
  return on_input
454
462
 
455
463
  self._unsubs.append(self._tui.on_input(_make_handler(key, handler)))
@@ -532,9 +540,15 @@ class App:
532
540
  ])
533
541
  self._layout.set_widget("version_update", banner, placement="above_editor")
534
542
 
535
- def _cleanup(self) -> None:
543
+ async def _cleanup(self) -> None:
536
544
  self._input.save_history()
537
545
  self._hooks.unsubscribe()
538
546
  for unsub in self._unsubs:
539
547
  unsub()
540
548
  self._unsubs.clear()
549
+ for task in self._pending_tasks:
550
+ task.cancel()
551
+ self._pending_tasks.clear()
552
+ sm = self._runtime.settings_manager
553
+ if sm is not None:
554
+ await sm.flush()
@@ -13,11 +13,11 @@ def _headers_to_str(headers: dict | None) -> str:
13
13
 
14
14
  def open_theme_selector(ctx: CommandContext) -> None:
15
15
  """Open the theme selector modal with live preview."""
16
- from tau.themes.registry import theme_registry
16
+ from tau.themes.registry import theme_registry, DEFAULT_THEME
17
17
 
18
18
  names = theme_registry.list()
19
19
  sm = ctx.runtime.settings_manager
20
- original = (sm.get_theme() if sm is not None else None) or "default"
20
+ original = (sm.get_theme() if sm is not None else None) or DEFAULT_THEME
21
21
 
22
22
  def preview(name: str) -> None:
23
23
  """Preview the selected theme."""
@@ -54,7 +54,7 @@ def open_settings_panel(ctx: CommandContext) -> None:
54
54
  from tau.tui.components.settings_modal import SettingItem, SettingsModal
55
55
  from tau.inference.types import Transport, ThinkingLevel
56
56
  from tau.engine.types import SteeringMode, FollowupMode
57
- from tau.themes.registry import theme_registry
57
+ from tau.themes.registry import theme_registry, DEFAULT_THEME
58
58
 
59
59
  sm = ctx.runtime.settings_manager
60
60
  if sm is None:
@@ -137,7 +137,7 @@ def open_settings_panel(ctx: CommandContext) -> None:
137
137
  id="theme",
138
138
  label="Theme",
139
139
  description="Color theme for the interface",
140
- current_value=sm.get_theme() or "default",
140
+ current_value=sm.get_theme() or DEFAULT_THEME,
141
141
  submenu_items=theme_registry.list(),
142
142
  submenu_title="Theme",
143
143
  ),
@@ -54,6 +54,12 @@ class AutocompleteManager:
54
54
 
55
55
  def clear(self) -> None:
56
56
  """Dismiss both pickers — called when another picker takes over."""
57
+ if self._ac_pending_task is not None:
58
+ self._ac_pending_task.cancel()
59
+ self._ac_pending_task = None
60
+ if self._cmd_arg_pending_task is not None:
61
+ self._cmd_arg_pending_task.cancel()
62
+ self._cmd_arg_pending_task = None
57
63
  self._ac_picker.clear()
58
64
  self._cmd_arg_picker.clear()
59
65
  self._ac_active_trigger = ""
@@ -98,7 +98,15 @@ class InputHandler:
98
98
  asyncio.ensure_future(self._invoke(text))
99
99
  return
100
100
 
101
- images = self._extract_clipboard_images(text)
101
+ images, missing_images = self._extract_clipboard_images(text)
102
+ if missing_images:
103
+ plural = "s" if missing_images > 1 else ""
104
+ self._notify(
105
+ f"{missing_images} image{plural} could not be found — the media file{plural} may have been deleted or moved.",
106
+ type="error",
107
+ )
108
+ return
109
+
102
110
  audio = self._extract_clipboard_audio(text)
103
111
  video = self._extract_clipboard_video(text)
104
112
  expanded = self._expand_pasted_texts(text)
@@ -121,6 +129,11 @@ class InputHandler:
121
129
  asyncio.ensure_future(self._steer(expanded, images))
122
130
  return
123
131
 
132
+ # Strip resolved image markers from the text sent to the model so the
133
+ # LLM doesn't see raw [image:uuid] placeholders alongside actual image bytes.
134
+ stripped = re.sub(r"\[image(?::[^\]]+| #\d+)\]", "", expanded).strip()
135
+ model_text = stripped if stripped else expanded
136
+
124
137
  if images:
125
138
  user_msg = UserMessage.with_images(text, images)
126
139
  elif audio:
@@ -133,10 +146,10 @@ class InputHandler:
133
146
  self._last_user_text = text
134
147
  self._turn_has_content = False
135
148
  self._tui.request_render()
136
- asyncio.ensure_future(self._invoke(self._expand_at_mentions(expanded), images, audio, video))
149
+ asyncio.ensure_future(self._invoke(self._expand_at_mentions(model_text), images, audio, video))
137
150
 
138
151
  def _on_followup(self, text: str) -> None:
139
- images = self._extract_clipboard_images(text)
152
+ images, _ = self._extract_clipboard_images(text)
140
153
  expanded = self._expand_pasted_texts(text)
141
154
  asyncio.ensure_future(self._queue_followup(expanded, images, display_text=text))
142
155
 
@@ -209,6 +222,7 @@ class InputHandler:
209
222
  self._last_user_text = ""
210
223
  if last_text:
211
224
  self._layout.input.set_text(last_text)
225
+ self._clear_clipboard_caches()
212
226
 
213
227
  self._turn_has_content = False
214
228
  # Stop the spinner immediately. The pre-stream branch cancels the invoke
@@ -220,6 +234,18 @@ class InputHandler:
220
234
  asyncio.ensure_future(self._run_queued_next(queued))
221
235
  self._tui.request_render()
222
236
 
237
+ def _clear_clipboard_caches(self) -> None:
238
+ """Clear all clipboard media caches."""
239
+ self._clipboard_images.clear()
240
+ self._clipboard_image_notes.clear()
241
+ self._clipboard_image_counter = 0
242
+ self._clipboard_audio.clear()
243
+ self._clipboard_audio_counter = 0
244
+ self._clipboard_video.clear()
245
+ self._clipboard_video_counter = 0
246
+ self._pasted_texts.clear()
247
+ self._paste_counter = 0
248
+
223
249
  async def _run_queued_next(self, texts: list[str]) -> None:
224
250
  """Submit queued input as the next task once the aborted task is idle.
225
251
 
@@ -551,7 +577,12 @@ class InputHandler:
551
577
  result = re.sub(r"\[paste #\d+(?: \+\d+ lines| \d+ chars)\]", "", result)
552
578
  return result.strip()
553
579
 
554
- def _extract_clipboard_images(self, text: str) -> list[bytes]:
580
+ def _extract_clipboard_images(self, text: str) -> tuple[list[bytes], int]:
581
+ """Extract image bytes from markers in text.
582
+
583
+ Returns (images, missing_count) where missing_count is the number of
584
+ persistent [image:uuid] markers whose media files could not be found.
585
+ """
555
586
  images: list[bytes] = []
556
587
  seen: set[int] = set()
557
588
  for m in re.finditer(r"\[image #(\d+)\]", text):
@@ -569,6 +600,7 @@ class InputHandler:
569
600
  except OSError:
570
601
  pass
571
602
  # Also resolve persistent [image:{uuid}] markers from history
603
+ missing = 0
572
604
  seen_uuids: set[str] = set()
573
605
  for m in re.finditer(r"\[image:([^\]]+)\]", text):
574
606
  uid = m.group(1)
@@ -580,11 +612,13 @@ class InputHandler:
580
612
  try:
581
613
  images.append(p.read_bytes())
582
614
  except OSError:
583
- pass
615
+ missing += 1
616
+ else:
617
+ missing += 1
584
618
  self._clipboard_images.clear()
585
619
  self._clipboard_image_notes.clear()
586
620
  self._clipboard_image_counter = 0
587
- return images
621
+ return images, missing
588
622
 
589
623
  def _extract_clipboard_image_contents(self, text: str) -> "list[Any]":
590
624
  """Like _extract_clipboard_images but returns ImageContent with dimension notes."""
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tau-coding-agent
3
- Version: 0.1.0
4
- Summary: Interactive agent CLI with terminal UI for multi-provider LLM support
3
+ Version: 0.2.0
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.13.*
6
6
  Description-Content-Type: text/markdown
7
7
  License-File: LICENSE
@@ -27,9 +27,15 @@ Requires-Dist: pathspec==1.1.1
27
27
  Requires-Dist: gitpython==3.1.50
28
28
  Dynamic: license-file
29
29
 
30
- # Tau
30
+ # Tau (τ)
31
31
 
32
- Inspired by [Pi](https://pi.dev), Tau brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
32
+ Inspired by [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
33
+
34
+ <p align="center">
35
+ <img src="assets/tui.png" alt="Tau TUI" width="700">
36
+ </p>
37
+
38
+ Start a conversation with the agent in the terminal.
33
39
 
34
40
  ---
35
41
 
@@ -55,7 +61,7 @@ pip install -e .
55
61
  tau
56
62
  ```
57
63
 
58
- Authenticate with your LLM provider using `/login` or set environment variables (e.g., `ANTHROPIC_API_KEY`).
64
+ Authenticate with your LLM provider using `/login` or set environment variables (e.g., `NVIDIA_API_KEY`).
59
65
 
60
66
  ### Common Commands
61
67