tau-coding-agent 0.7.8__tar.gz → 0.7.9__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 (565) hide show
  1. {tau_coding_agent-0.7.8/tau_coding_agent.egg-info → tau_coding_agent-0.7.9}/PKG-INFO +1 -1
  2. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/auth.md +1 -0
  3. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/inference-providers.md +32 -2
  4. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/pyproject.toml +1 -1
  5. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/todo/__init__.py +1 -1
  6. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/models/text.py +15 -0
  7. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/providers/text.py +9 -18
  8. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/service.py +11 -8
  9. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/agent_hooks.py +59 -6
  10. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/message_list.py +58 -5
  11. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/markdown.py +123 -2
  12. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/service.py +108 -11
  13. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9/tau_coding_agent.egg-info}/PKG-INFO +1 -1
  14. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau_coding_agent.egg-info/SOURCES.txt +2 -0
  15. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_markdown.py +60 -1
  16. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_message_list_frozen.py +9 -9
  17. tau_coding_agent-0.7.9/tests/test_subconscious_provider.py +27 -0
  18. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_text_llm_invoke.py +17 -0
  19. tau_coding_agent-0.7.9/tests/test_tui_frozen_row_cache.py +170 -0
  20. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/LICENSE +0 -0
  21. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/MANIFEST.in +0 -0
  22. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/README.md +0 -0
  23. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/architecture.md +0 -0
  24. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/cli-reference.md +0 -0
  25. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/creating-tools.md +0 -0
  26. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/development.md +0 -0
  27. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/docs.json +0 -0
  28. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/engine.md +0 -0
  29. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/extension-settings.md +0 -0
  30. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/extensions.md +0 -0
  31. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/http-proxy.md +0 -0
  32. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/index.md +0 -0
  33. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/inference.md +0 -0
  34. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/installation.md +0 -0
  35. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/keybindings.md +0 -0
  36. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/messages.md +0 -0
  37. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/project-context.md +0 -0
  38. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/project-structure.md +0 -0
  39. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/prompts.md +0 -0
  40. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/python-api.md +0 -0
  41. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/quickstart.md +0 -0
  42. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/sessions.md +0 -0
  43. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/settings.md +0 -0
  44. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/skills.md +0 -0
  45. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/themes.md +0 -0
  46. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/tools.md +0 -0
  47. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/tui.md +0 -0
  48. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/docs/usage.md +0 -0
  49. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/setup.cfg +0 -0
  50. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/__init__.py +0 -0
  51. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/agent/__init__.py +0 -0
  52. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/agent/embedded.py +0 -0
  53. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/agent/prompt/__init__.py +0 -0
  54. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/agent/prompt/builder.py +0 -0
  55. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/agent/prompt/types.py +0 -0
  56. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/agent/service.py +0 -0
  57. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/agent/types.py +0 -0
  58. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/auth/manager.py +0 -0
  59. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/auth/storage.py +0 -0
  60. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/auth/types.py +0 -0
  61. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/__init__.py +0 -0
  62. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/commands/__init__.py +0 -0
  63. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/commands/clear.py +0 -0
  64. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/commands/compact.py +0 -0
  65. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/commands/reload.py +0 -0
  66. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/commands/session.py +0 -0
  67. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/ask_user/__init__.py +0 -0
  68. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/ask_user/component.py +0 -0
  69. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/ask_user/manifest.json +0 -0
  70. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/ask_user/schema.py +0 -0
  71. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/ask_user/tool.py +0 -0
  72. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/btw/__init__.py +0 -0
  73. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/__init__.py +0 -0
  74. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/computer.py +0 -0
  75. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/README.md +0 -0
  76. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/__init__.py +0 -0
  77. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/controls.py +0 -0
  78. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/core.py +0 -0
  79. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/enums.py +0 -0
  80. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/events.py +0 -0
  81. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/patterns.py +0 -0
  82. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/ax/py.typed +0 -0
  83. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/desktop/__init__.py +0 -0
  84. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/desktop/config.py +0 -0
  85. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/desktop/service.py +0 -0
  86. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/tree/__init__.py +0 -0
  87. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/tree/config.py +0 -0
  88. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/tree/service.py +0 -0
  89. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/tree/views.py +0 -0
  90. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/watchdog/__init__.py +0 -0
  91. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/macos/watchdog/service.py +0 -0
  92. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/manifest.json +0 -0
  93. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/router.py +0 -0
  94. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/state.py +0 -0
  95. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/types.py +0 -0
  96. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/desktop/__init__.py +0 -0
  97. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/desktop/service.py +0 -0
  98. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/tree/__init__.py +0 -0
  99. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/tree/cache_utils.py +0 -0
  100. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/tree/config.py +0 -0
  101. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/tree/service.py +0 -0
  102. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/tree/utils.py +0 -0
  103. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/tree/views.py +0 -0
  104. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/uia/__init__.py +0 -0
  105. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/uia/controls.py +0 -0
  106. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/uia/core.py +0 -0
  107. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/uia/enums.py +0 -0
  108. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/uia/events.py +0 -0
  109. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/uia/exceptions.py +0 -0
  110. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/uia/patterns.py +0 -0
  111. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/watchdog/__init__.py +0 -0
  112. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/watchdog/event_handlers.py +0 -0
  113. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/computer_use/windows/watchdog/service.py +0 -0
  114. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/footer/__init__.py +0 -0
  115. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/footer/git.py +0 -0
  116. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/footer/model.py +0 -0
  117. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/footer/utils.py +0 -0
  118. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/header/__init__.py +0 -0
  119. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/loop/README.md +0 -0
  120. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/loop/__init__.py +0 -0
  121. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/loop/dispatch.py +0 -0
  122. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/loop/duration.py +0 -0
  123. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/loop/state.py +0 -0
  124. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/sandbox/__init__.py +0 -0
  125. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/sandbox/manager.py +0 -0
  126. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/sandbox/manifest.json +0 -0
  127. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/sandbox/sandbox_tool.py +0 -0
  128. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/__init__.py +0 -0
  129. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/context-builder.md +0 -0
  130. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/delegate.md +0 -0
  131. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/oracle.md +0 -0
  132. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/planner.md +0 -0
  133. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/researcher.md +0 -0
  134. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/reviewer.md +0 -0
  135. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/scout.md +0 -0
  136. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents/worker.md +0 -0
  137. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/agents.py +0 -0
  138. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/manifest.json +0 -0
  139. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/subagent_schema.py +0 -0
  140. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/subagent/subagent_tool.py +0 -0
  141. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/todo/manifest.json +0 -0
  142. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/todo/todo_schema.py +0 -0
  143. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/todo/todo_tool.py +0 -0
  144. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/watch/__init__.py +0 -0
  145. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/__init__.py +0 -0
  146. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/engines/__init__.py +0 -0
  147. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/engines/base.py +0 -0
  148. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/engines/ddgs_engine.py +0 -0
  149. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/engines/exa_engine.py +0 -0
  150. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/engines/jina_engine.py +0 -0
  151. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/engines/tavily_engine.py +0 -0
  152. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/manifest.json +0 -0
  153. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/tools/__init__.py +0 -0
  154. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/tools/fetch.py +0 -0
  155. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/web/tools/search.py +0 -0
  156. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/workflow/__init__.py +0 -0
  157. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/workflow/agent_discovery.py +0 -0
  158. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/workflow/manifest.json +0 -0
  159. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/workflow/model.py +0 -0
  160. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/workflow/runner.py +0 -0
  161. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/workflow/skills/create-workflows/SKILL.md +0 -0
  162. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/extensions/workflow/store.py +0 -0
  163. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/models/__init__.py +0 -0
  164. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/models/audio.py +0 -0
  165. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/models/image.py +0 -0
  166. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/models/video.py +0 -0
  167. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/prompts/commit.md +0 -0
  168. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/prompts/docs.md +0 -0
  169. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/prompts/explain.md +0 -0
  170. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/prompts/fix.md +0 -0
  171. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/prompts/refactor.md +0 -0
  172. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/prompts/review.md +0 -0
  173. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/prompts/test.md +0 -0
  174. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/providers/__init__.py +0 -0
  175. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/providers/audio.py +0 -0
  176. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/providers/image.py +0 -0
  177. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/providers/video.py +0 -0
  178. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/skills/code-review/SKILL.md +0 -0
  179. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/skills/debug/SKILL.md +0 -0
  180. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  181. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
  182. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
  183. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/ayu-dark.yaml +0 -0
  184. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/catppuccin.yaml +0 -0
  185. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/dark.yaml +0 -0
  186. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/dracula.yaml +0 -0
  187. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/everforest.yaml +0 -0
  188. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/gruvbox.yaml +0 -0
  189. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/horizon.yaml +0 -0
  190. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/kanagawa.yaml +0 -0
  191. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/light.yaml +0 -0
  192. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/material-ocean.yaml +0 -0
  193. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/monokai.yaml +0 -0
  194. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/night-owl.yaml +0 -0
  195. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/nord.yaml +0 -0
  196. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/one-dark.yaml +0 -0
  197. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/rose-pine.yaml +0 -0
  198. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/solarized-dark.yaml +0 -0
  199. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/themes/tokyo-night.yaml +0 -0
  200. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/__init__.py +0 -0
  201. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/edit.py +0 -0
  202. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/glob.py +0 -0
  203. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/grep.py +0 -0
  204. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/ls.py +0 -0
  205. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/read.py +0 -0
  206. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/terminal.py +0 -0
  207. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/utils.py +0 -0
  208. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/builtins/tools/write.py +0 -0
  209. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/commands/__init__.py +0 -0
  210. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/commands/registry.py +0 -0
  211. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/commands/types.py +0 -0
  212. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/__init__.py +0 -0
  213. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/cli.py +0 -0
  214. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/commands/__init__.py +0 -0
  215. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/commands/auth.py +0 -0
  216. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/commands/doctor.py +0 -0
  217. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/commands/packages.py +0 -0
  218. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/commands/serve.py +0 -0
  219. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/console/commands/update.py +0 -0
  220. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/core/__init__.py +0 -0
  221. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/core/registry.py +0 -0
  222. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/engine/__init__.py +0 -0
  223. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/engine/service.py +0 -0
  224. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/engine/types.py +0 -0
  225. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/extensions/__init__.py +0 -0
  226. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/extensions/api.py +0 -0
  227. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/extensions/context.py +0 -0
  228. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/extensions/loader.py +0 -0
  229. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/extensions/runtime.py +0 -0
  230. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/extensions/settings.py +0 -0
  231. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/__init__.py +0 -0
  232. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/engine.py +0 -0
  233. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/inference.py +0 -0
  234. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/runtime.py +0 -0
  235. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/service.py +0 -0
  236. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/session.py +0 -0
  237. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/tui.py +0 -0
  238. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/hooks/types.py +0 -0
  239. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/__init__.py +0 -0
  240. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/__init__.py +0 -0
  241. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/__init__.py +0 -0
  242. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/base.py +0 -0
  243. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/builtins.py +0 -0
  244. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  245. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/gemini_audio.py +0 -0
  246. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/openai_audio.py +0 -0
  247. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/registry.py +0 -0
  248. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/sarvam_audio.py +0 -0
  249. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/service.py +0 -0
  250. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/audio/utils.py +0 -0
  251. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/availability.py +0 -0
  252. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/__init__.py +0 -0
  253. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/base.py +0 -0
  254. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/builtins.py +0 -0
  255. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/gemini_image.py +0 -0
  256. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/openai_image.py +0 -0
  257. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/openrouter.py +0 -0
  258. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/registry.py +0 -0
  259. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/image/service.py +0 -0
  260. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/registry.py +0 -0
  261. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/__init__.py +0 -0
  262. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/anthropic_claude_code.py +0 -0
  263. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/anthropic_messages.py +0 -0
  264. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/anthropic_vertex.py +0 -0
  265. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/base.py +0 -0
  266. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/builtins.py +0 -0
  267. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/dialect.py +0 -0
  268. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/gemini_generate.py +0 -0
  269. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/github_copilot_chat.py +0 -0
  270. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/google_antigravity.py +0 -0
  271. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/google_vertex.py +0 -0
  272. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/mistral_chat.py +0 -0
  273. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/ollama_chat.py +0 -0
  274. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/openai_codex_responses.py +0 -0
  275. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/openai_completions.py +0 -0
  276. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/openai_responses.py +0 -0
  277. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/openai_vertex.py +0 -0
  278. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/registry.py +0 -0
  279. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/types.py +0 -0
  280. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/utils.py +0 -0
  281. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/text/xai_responses.py +0 -0
  282. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/__init__.py +0 -0
  283. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/base.py +0 -0
  284. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/builtins.py +0 -0
  285. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/fal_video.py +0 -0
  286. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/openrouter_video.py +0 -0
  287. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/registry.py +0 -0
  288. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/service.py +0 -0
  289. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/api/video/zai_video.py +0 -0
  290. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/__init__.py +0 -0
  291. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/local/__init__.py +0 -0
  292. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/local/llamacpp.py +0 -0
  293. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/local/lmstudio.py +0 -0
  294. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/local/ollama.py +0 -0
  295. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/local/vllm.py +0 -0
  296. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/registry.py +0 -0
  297. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/model/types.py +0 -0
  298. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/__init__.py +0 -0
  299. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/__init__.py +0 -0
  300. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
  301. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/github_copilot.py +0 -0
  302. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/google_antigravity.py +0 -0
  303. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/openai_codex.py +0 -0
  304. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/pkce.py +0 -0
  305. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/types.py +0 -0
  306. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/utils.py +0 -0
  307. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/oauth/xai_grok.py +0 -0
  308. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/registry.py +0 -0
  309. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/provider/types.py +0 -0
  310. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/types.py +0 -0
  311. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/inference/utils.py +0 -0
  312. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/message/__init__.py +0 -0
  313. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/message/types.py +0 -0
  314. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/message/utils.py +0 -0
  315. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/__init__.py +0 -0
  316. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/__init__.py +0 -0
  317. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/app.py +0 -0
  318. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/__init__.py +0 -0
  319. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/appearance.py +0 -0
  320. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/auth.py +0 -0
  321. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/context.py +0 -0
  322. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/extensions.py +0 -0
  323. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/misc.py +0 -0
  324. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/model.py +0 -0
  325. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/commands/session.py +0 -0
  326. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/__init__.py +0 -0
  327. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/command_palette.py +0 -0
  328. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/config_selector.py +0 -0
  329. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/extension_selector.py +0 -0
  330. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/file_picker.py +0 -0
  331. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/layout.py +0 -0
  332. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/model_selector.py +0 -0
  333. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/oauth_selector.py +0 -0
  334. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/overlays.py +0 -0
  335. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/selector_controller.py +0 -0
  336. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/session_selector.py +0 -0
  337. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/settings_selector.py +0 -0
  338. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/theme_selector.py +0 -0
  339. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/thinking_selector.py +0 -0
  340. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/tree_selector.py +0 -0
  341. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/trust_screen.py +0 -0
  342. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/components/voice_selector.py +0 -0
  343. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/input_handler.py +0 -0
  344. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/interactive/ui_context.py +0 -0
  345. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/print/__init__.py +0 -0
  346. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/rpc/__init__.py +0 -0
  347. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/rpc/mode.py +0 -0
  348. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/rpc/types.py +0 -0
  349. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/serve/__init__.py +0 -0
  350. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/modes/serve/mode.py +0 -0
  351. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/packages/__init__.py +0 -0
  352. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/packages/manager.py +0 -0
  353. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/packages/types.py +0 -0
  354. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/packages/utils.py +0 -0
  355. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/prompts/expand.py +0 -0
  356. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/prompts/loader.py +0 -0
  357. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/prompts/registry.py +0 -0
  358. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/prompts/types.py +0 -0
  359. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/resources/__init__.py +0 -0
  360. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/resources/loader.py +0 -0
  361. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/resources/types.py +0 -0
  362. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/runtime/dependencies.py +0 -0
  363. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/runtime/service.py +0 -0
  364. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/runtime/types.py +0 -0
  365. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/session/branch_summarization.py +0 -0
  366. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/session/compaction.py +0 -0
  367. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/session/manager.py +0 -0
  368. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/session/types.py +0 -0
  369. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/session/utils.py +0 -0
  370. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/settings/manager.py +0 -0
  371. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/settings/paths.py +0 -0
  372. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/settings/storage.py +0 -0
  373. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/settings/types.py +0 -0
  374. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/settings/utils.py +0 -0
  375. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/skills/loader.py +0 -0
  376. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/skills/registry.py +0 -0
  377. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/skills/types.py +0 -0
  378. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/telemetry/__init__.py +0 -0
  379. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/telemetry/service.py +0 -0
  380. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/telemetry/types.py +0 -0
  381. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/themes/loader.py +0 -0
  382. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/themes/registry.py +0 -0
  383. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/themes/types.py +0 -0
  384. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tool/__init__.py +0 -0
  385. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tool/registry.py +0 -0
  386. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tool/render.py +0 -0
  387. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tool/types.py +0 -0
  388. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/trust/__init__.py +0 -0
  389. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/trust/manager.py +0 -0
  390. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/trust/types.py +0 -0
  391. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/trust/utils.py +0 -0
  392. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/__init__.py +0 -0
  393. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/ansi_bridge.py +0 -0
  394. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/autocomplete.py +0 -0
  395. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/backend.py +0 -0
  396. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/buffer.py +0 -0
  397. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/component.py +0 -0
  398. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/__init__.py +0 -0
  399. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/box.py +0 -0
  400. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/editor.py +0 -0
  401. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/image.py +0 -0
  402. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/select_list.py +0 -0
  403. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/simple_picker.py +0 -0
  404. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/spinner.py +0 -0
  405. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/text_input.py +0 -0
  406. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/components/widget_bridge.py +0 -0
  407. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/frame.py +0 -0
  408. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/geometry.py +0 -0
  409. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/input.py +0 -0
  410. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/keybinding_hints.py +0 -0
  411. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/layout.py +0 -0
  412. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/palette.py +0 -0
  413. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/style.py +0 -0
  414. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/terminal.py +0 -0
  415. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/testing.py +0 -0
  416. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/text.py +0 -0
  417. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/theme.py +0 -0
  418. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/utils.py +0 -0
  419. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widget.py +0 -0
  420. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/__init__.py +0 -0
  421. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/barchart.py +0 -0
  422. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/block.py +0 -0
  423. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/calendar.py +0 -0
  424. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/canvas.py +0 -0
  425. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/chart.py +0 -0
  426. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/clear.py +0 -0
  427. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/gauge.py +0 -0
  428. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/list.py +0 -0
  429. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/paragraph.py +0 -0
  430. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/scrollbar.py +0 -0
  431. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/sparkline.py +0 -0
  432. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/symbols.py +0 -0
  433. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/table.py +0 -0
  434. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/tui/widgets/tabs.py +0 -0
  435. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/__init__.py +0 -0
  436. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/format.py +0 -0
  437. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/http_proxy.py +0 -0
  438. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/image_processing.py +0 -0
  439. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/logging.py +0 -0
  440. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/secrets.py +0 -0
  441. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/timing.py +0 -0
  442. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau/utils/version_check.py +0 -0
  443. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  444. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  445. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau_coding_agent.egg-info/requires.txt +0 -0
  446. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tau_coding_agent.egg-info/top_level.txt +0 -0
  447. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_agent_compaction.py +0 -0
  448. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_agent_hooks.py +0 -0
  449. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_agent_prompt.py +0 -0
  450. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_agent_types.py +0 -0
  451. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_ansi.py +0 -0
  452. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_ansi_bridge_legacy_image.py +0 -0
  453. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_anthropic_tool_history.py +0 -0
  454. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_ask_user_extension.py +0 -0
  455. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_audio_transcription_apis.py +0 -0
  456. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_auth_command.py +0 -0
  457. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_auth_manager.py +0 -0
  458. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_auth_storage.py +0 -0
  459. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_autocomplete_modifiers.py +0 -0
  460. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_branch_navigation.py +0 -0
  461. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_branch_summarization.py +0 -0
  462. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_builtin_tools.py +0 -0
  463. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_builtin_watch.py +0 -0
  464. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_cli_inputs.py +0 -0
  465. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_cmd_copy.py +0 -0
  466. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_command_execution_policy.py +0 -0
  467. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_command_registry.py +0 -0
  468. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_compaction.py +0 -0
  469. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_component_buffer_bridge.py +0 -0
  470. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_diff.py +0 -0
  471. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_doctor.py +0 -0
  472. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_editor_protocol.py +0 -0
  473. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_engine_execution.py +0 -0
  474. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_engine_length_and_live_tools.py +0 -0
  475. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_engine_steering.py +0 -0
  476. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_engine_types.py +0 -0
  477. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_escape_behavior.py +0 -0
  478. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_extension_api.py +0 -0
  479. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_extension_lifecycle.py +0 -0
  480. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_footer_model.py +0 -0
  481. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_footer_utils.py +0 -0
  482. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_fuzzy.py +0 -0
  483. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_gemini_generate.py +0 -0
  484. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_google_antigravity.py +0 -0
  485. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_google_vertex.py +0 -0
  486. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_http_proxy.py +0 -0
  487. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_image_processing.py +0 -0
  488. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_inference_api_text_utils.py +0 -0
  489. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_inference_dialect.py +0 -0
  490. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_inference_error_utils.py +0 -0
  491. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_inference_types.py +0 -0
  492. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_inference_utils.py +0 -0
  493. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_input_handler_paste.py +0 -0
  494. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_keybindings.py +0 -0
  495. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_layout_render_cells.py +0 -0
  496. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_local_model_discovery.py +0 -0
  497. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_message_types.py +0 -0
  498. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_message_utils.py +0 -0
  499. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_model_audio_modality.py +0 -0
  500. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_model_availability.py +0 -0
  501. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_model_command.py +0 -0
  502. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_model_file_modality.py +0 -0
  503. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_model_registry.py +0 -0
  504. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_model_selector_modal.py +0 -0
  505. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_model_types.py +0 -0
  506. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_oauth_utils.py +0 -0
  507. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_openai_codex_responses_lite.py +0 -0
  508. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_openai_responses_extra_body.py +0 -0
  509. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_package_manager_venv.py +0 -0
  510. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_package_resources.py +0 -0
  511. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_packages_utils.py +0 -0
  512. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_peer_extension.py +0 -0
  513. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_pkce.py +0 -0
  514. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_prompts_expand.py +0 -0
  515. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_prompts_loader.py +0 -0
  516. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_prompts_registry.py +0 -0
  517. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_provider_audio_content.py +0 -0
  518. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_provider_file_content.py +0 -0
  519. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_provider_registry.py +0 -0
  520. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_resource_loader.py +0 -0
  521. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_rpc_mode.py +0 -0
  522. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_runtime_sdk.py +0 -0
  523. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_scrollback_raw_writes.py +0 -0
  524. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_scrollback_terminal.py +0 -0
  525. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_secrets.py +0 -0
  526. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_select_list_render_cells.py +0 -0
  527. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_selector_controller.py +0 -0
  528. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_session_manager.py +0 -0
  529. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_session_trust_persist.py +0 -0
  530. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_session_types.py +0 -0
  531. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_session_utils.py +0 -0
  532. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_settings_manager.py +0 -0
  533. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_settings_paths.py +0 -0
  534. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_settings_storage.py +0 -0
  535. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_settings_utils.py +0 -0
  536. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_skills_loader.py +0 -0
  537. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_skills_registry.py +0 -0
  538. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_startup_timing.py +0 -0
  539. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_strip_control_chars.py +0 -0
  540. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_subagent_context.py +0 -0
  541. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_telemetry.py +0 -0
  542. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_text_input.py +0 -0
  543. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_text_input_render_cells.py +0 -0
  544. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_text_llm_model_resolution.py +0 -0
  545. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_theme_loader.py +0 -0
  546. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_themes_registry.py +0 -0
  547. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_thinking_render.py +0 -0
  548. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tool_registry.py +0 -0
  549. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tool_render.py +0 -0
  550. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tree_branch_restore.py +0 -0
  551. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_trust_manager.py +0 -0
  552. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_trust_utils.py +0 -0
  553. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_capabilities.py +0 -0
  554. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_child_rows.py +0 -0
  555. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_input.py +0 -0
  556. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_layout_sizing.py +0 -0
  557. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_public_api.py +0 -0
  558. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_renderer.py +0 -0
  559. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_select_list.py +0 -0
  560. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_theme.py +0 -0
  561. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_tui_utils.py +0 -0
  562. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_ui_context.py +0 -0
  563. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_utils_hashline.py +0 -0
  564. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_version_check.py +0 -0
  565. {tau_coding_agent-0.7.8 → tau_coding_agent-0.7.9}/tests/test_voice_selector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tau-coding-agent
3
- Version: 0.7.8
3
+ Version: 0.7.9
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
@@ -145,6 +145,7 @@ The provider ID used as the key in `auth.json` and the `{PROVIDER}_API_KEY` env
145
145
  | Mistral | `mistral` | `MISTRAL_API_KEY` |
146
146
  | Fireworks AI | `fireworks` | `FIREWORKS_API_KEY` |
147
147
  | Hugging Face | `huggingface` | `HUGGINGFACE_API_KEY` |
148
+ | Subconscious | `subconscious` | `SUBCONSCIOUS_API_KEY` |
148
149
  | Ollama | `ollama` | None required (local server, default `http://localhost:11434`) |
149
150
 
150
151
  ## Next Steps
@@ -8,8 +8,8 @@ Tau supports the following inference providers:
8
8
 
9
9
  Built-in API-key providers are `openai`, `anthropic`, `google`, `nvidia`,
10
10
  `groq`, `openrouter`, `perplexity`, `xai`, `bedrock`, `kimi`, `minimax`,
11
- `cerebras`, `deepseek`, `zai`, `kilocode`, `fireworks`, `huggingface`, and
12
- `mistral`.
11
+ `cerebras`, `deepseek`, `zai`, `kilocode`, `fireworks`, `huggingface`,
12
+ `subconscious`, and `mistral`.
13
13
 
14
14
  Tau also includes local `ollama`, Google/Anthropic/OpenAI-compatible Vertex AI
15
15
  providers, and OAuth providers for OpenAI Codex, Claude Code, GitHub Copilot,
@@ -161,6 +161,36 @@ tau --model huggingface/deepseek-ai/DeepSeek-V3-0324 -p "Say hello"
161
161
  - Model IDs are Hugging Face Hub repo IDs (e.g. `meta-llama/Llama-3.3-70B-Instruct`)
162
162
  - Built-in model entries are pinned to a specific backend with `<repo>:<provider>` (e.g. `openai/gpt-oss-120b:groq`) rather than the router's default `:fastest` routing, since unpinned routing can silently switch to a backend with different tool-calling behavior. You can still use any model/backend combination the router supports via `tau --model huggingface/<repo>[:<provider>]` even if it isn't in the built-in list.
163
163
 
164
+ ## Subconscious
165
+
166
+ Subconscious provides hosted inference through OpenAI-compatible Chat Completions
167
+ and Anthropic-compatible Messages APIs. Tau uses Chat Completions because dashboard
168
+ keys with the documented `sky_` prefix authenticate through Bearer authorization on
169
+ that endpoint.
170
+
171
+ ### Setup
172
+
173
+ 1. Create an account at [Subconscious](https://www.subconscious.dev/)
174
+ 2. Generate an API key in the dashboard
175
+ 3. Set the environment variable:
176
+
177
+ ```bash
178
+ export SUBCONSCIOUS_API_KEY=...
179
+ ```
180
+
181
+ ### Verify
182
+
183
+ ```bash
184
+ tau --model subconscious/subconscious/tim-qwen3.6-27b -p "Say hello"
185
+ ```
186
+
187
+ ### Notes
188
+
189
+ - The built-in model ID is `subconscious/tim-qwen3.6-27b`; the advertised `subconscious/glm-5.2` is omitted because the live API currently rejects it as an unknown model
190
+ - `TIM-Qwen3.6 27B` is published as multimodal with optional thinking; Tau enables its documented image modality and thinking selector
191
+ - Subconscious does not publish numeric context-window or maximum-output limits, so Tau leaves those fields unspecified rather than guessing
192
+ - Model availability and pricing come from the [official pricing page](https://www.subconscious.dev/pricing)
193
+
164
194
  ## Ollama (Local)
165
195
 
166
196
  Run open-source models locally without API keys or internet.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tau-coding-agent"
7
- version = "0.7.8"
7
+ version = "0.7.9"
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"
@@ -64,7 +64,7 @@ class TodoBoard:
64
64
 
65
65
  glyphs = {
66
66
  "pending": ("☐", theme.muted),
67
- "in_progress": ("■", theme.warning),
67
+ "in_progress": ("■", theme.accent),
68
68
  "done": ("✓", theme.success),
69
69
  "failed": ("✗", theme.error),
70
70
  }
@@ -7349,4 +7349,19 @@ models = [
7349
7349
  input=_TEXT_IMAGE,
7350
7350
  output=_TEXT,
7351
7351
  ),
7352
+ # Subconscious. The provider publishes prices but not numeric context/output limits,
7353
+ # so leave context_window unknown (0) and retain Tau's conservative 16K output default.
7354
+ # Chat Completions is used because dashboard `sky_` keys authenticate through its
7355
+ # Bearer scheme; the same key is rejected by the Anthropic-compatible endpoint.
7356
+ Model(
7357
+ id="subconscious/tim-qwen3.6-27b",
7358
+ name="TIM-Qwen3.6 27B",
7359
+ provider="subconscious",
7360
+ cost=Cost(input=0.30, output=3.00, cache_read=0.15),
7361
+ thinking=True,
7362
+ thinking_format="chat-template",
7363
+ context_window=0,
7364
+ input=_TEXT_IMAGE,
7365
+ output=_TEXT,
7366
+ ),
7352
7367
  ]
@@ -9,24 +9,9 @@ from tau.inference.provider.types import APIProvider
9
9
  from tau.inference.types import AuthType, LLMOptions
10
10
 
11
11
  api_providers = [
12
- APIProvider(
13
- id="openai",
14
- name="OpenAI",
15
- api="openai_responses",
16
- options=LLMOptions()
17
- ),
18
- APIProvider(
19
- id="anthropic",
20
- name="Anthropic",
21
- api="anthropic_messages",
22
- options=LLMOptions()
23
- ),
24
- APIProvider(
25
- id="google",
26
- name="Google",
27
- api="gemini_generate",
28
- options=LLMOptions()
29
- ),
12
+ APIProvider(id="openai", name="OpenAI", api="openai_responses", options=LLMOptions()),
13
+ APIProvider(id="anthropic", name="Anthropic", api="anthropic_messages", options=LLMOptions()),
14
+ APIProvider(id="google", name="Google", api="gemini_generate", options=LLMOptions()),
30
15
  APIProvider(
31
16
  id="google-vertex",
32
17
  name="Google Vertex AI",
@@ -136,6 +121,12 @@ api_providers = [
136
121
  api="openai_completions",
137
122
  options=LLMOptions(base_url="https://router.huggingface.co/v1"),
138
123
  ),
124
+ APIProvider(
125
+ id="subconscious",
126
+ name="Subconscious",
127
+ api="openai_completions",
128
+ options=LLMOptions(base_url="https://api.subconscious.dev/v1"),
129
+ ),
139
130
  APIProvider(id="mistral", name="Mistral", api="mistral_chat", options=LLMOptions()),
140
131
  APIProvider(
141
132
  id="ollama",
@@ -283,15 +283,17 @@ class TextLLM:
283
283
  )
284
284
  from tau.inference.utils import ErrorKind, classify_error, get_retry_after_delay
285
285
 
286
+ api_key = await self._auth_manager.get_api_key(self.provider_id) # type: ignore[union-attr]
287
+ if api_key:
288
+ # Set credentials before resolving the lazy adapter: SDK clients such as
289
+ # Anthropic validate and capture authentication during construction.
290
+ self.api.options.api_key = api_key
291
+
286
292
  # Resolve the provider SDK (first-use import + client construction) on a
287
293
  # worker thread so a cold import doesn't block the event loop — and with
288
294
  # it, the render loop's spinner animation.
289
295
  await self.api.resolve_async()
290
296
 
291
- api_key = await self._auth_manager.get_api_key(self.provider_id) # type: ignore[union-attr]
292
- if api_key:
293
- self.api.options.api_key = api_key
294
-
295
297
  messages = self._resolve_messages(context)
296
298
  api_context = LLMContext(
297
299
  messages=messages,
@@ -399,15 +401,16 @@ class TextLLM:
399
401
  from tau.inference.types import ErrorEvent, StopReason, ThinkingLevel
400
402
  from tau.inference.utils import ErrorKind, classify_error, get_retry_after_delay
401
403
 
404
+ api_key = await self._auth_manager.get_api_key(self.provider_id) # type: ignore[union-attr]
405
+ if api_key:
406
+ # Set credentials before resolving the lazy adapter; see stream().
407
+ self.api.options.api_key = api_key
408
+
402
409
  # Resolve the provider SDK (first-use import + client construction) on a
403
410
  # worker thread so a cold import doesn't block the event loop — and with
404
411
  # it, the render loop's spinner animation.
405
412
  await self.api.resolve_async()
406
413
 
407
- api_key = await self._auth_manager.get_api_key(self.provider_id) # type: ignore[union-attr]
408
- if api_key:
409
- self.api.options.api_key = api_key
410
-
411
414
  original = self.api.options.thinking_level
412
415
  if thinking_level is not None and thinking_level != ThinkingLevel.Off:
413
416
  self.api.options.thinking_level = thinking_level
@@ -75,6 +75,16 @@ class AgentHookHandler:
75
75
  self._pending_flush_handle: asyncio.TimerHandle | None = None
76
76
  self._last_flush_at: float = 0.0
77
77
 
78
+ # Raw terminal/tool output arrives far more densely than model tokens
79
+ # (a chatty subprocess can emit hundreds of lines/sec — see
80
+ # runtime/service.py's per-line TerminalOutputEvent). Without batching,
81
+ # _on_terminal_output would invalidate() the block and force a full
82
+ # re-render on every single line, which is O(total output so far) each
83
+ # time and starves keystroke handling on the same event loop. Batched
84
+ # at the same ~60fps cadence as token streaming below.
85
+ self._pending_terminal_flush_handle: asyncio.TimerHandle | None = None
86
+ self._last_terminal_flush_at: float = 0.0
87
+
78
88
  def subscribe(self) -> None:
79
89
  """Register all hook handlers on the current agent."""
80
90
  agent = self._runtime.agent
@@ -105,6 +115,9 @@ class AgentHookHandler:
105
115
  if self._pending_flush_handle is not None:
106
116
  self._pending_flush_handle.cancel()
107
117
  self._pending_flush_handle = None
118
+ if self._pending_terminal_flush_handle is not None:
119
+ self._pending_terminal_flush_handle.cancel()
120
+ self._pending_terminal_flush_handle = None
108
121
  self._pending_msg = None
109
122
  self._current_block = None
110
123
  self._current_terminal_block = None
@@ -378,6 +391,13 @@ class AgentHookHandler:
378
391
  block = self._layout.add_message(msg, streaming=True)
379
392
  self._current_terminal_block = block
380
393
  else:
394
+ # Cancel any pending batched flush — this event supersedes it, and
395
+ # finalize() below is about to freeze the block for good, so a
396
+ # stale timer must not fire and invalidate() it afterward.
397
+ if self._pending_terminal_flush_handle is not None:
398
+ self._pending_terminal_flush_handle.cancel()
399
+ self._pending_terminal_flush_handle = None
400
+ self._last_terminal_flush_at = 0.0
381
401
  if self._current_terminal_block is not None:
382
402
  self._current_terminal_block.set_streaming(False)
383
403
  # Dropping our own reference for good right here — safe to
@@ -387,6 +407,30 @@ class AgentHookHandler:
387
407
  self._tui.request_render()
388
408
 
389
409
  async def _on_terminal_output(self, _event: object) -> None:
410
+ """Batch invalidation of the live terminal block at ~60fps.
411
+
412
+ Raw subprocess output can arrive far more densely than model tokens
413
+ (runtime/service.py emits a TerminalOutputEvent per line — a chatty
414
+ command can be hundreds/sec). invalidate()-ing and re-rendering on
415
+ every line forces a full re-parse of the whole accumulated output
416
+ each time (cost grows with total output so far), and that work runs
417
+ synchronously on the same event loop that reads keystrokes — see
418
+ TUI._on_stdin_ready — so unthrottled it directly steals time from
419
+ input responsiveness. Mirrors the token-flush batching above.
420
+ """
421
+ if self._current_terminal_block is None:
422
+ return
423
+ if self._pending_terminal_flush_handle is None:
424
+ elapsed = time.monotonic() - self._last_terminal_flush_at
425
+ delay = max(0.0, _STREAM_FLUSH_INTERVAL - elapsed)
426
+ loop = asyncio.get_event_loop()
427
+ self._pending_terminal_flush_handle = loop.call_later(
428
+ delay, self._flush_terminal_output
429
+ )
430
+
431
+ def _flush_terminal_output(self) -> None:
432
+ self._pending_terminal_flush_handle = None
433
+ self._last_terminal_flush_at = time.monotonic()
390
434
  if self._current_terminal_block is not None:
391
435
  self._current_terminal_block.invalidate()
392
436
  self._tui.request_render()
@@ -470,15 +514,24 @@ class AgentHookHandler:
470
514
  if self._current_block is None:
471
515
  return
472
516
  self._current_block._message = msg
517
+ if not streaming:
518
+ reset_streaming_md = getattr(
519
+ self._current_block,
520
+ "reset_streaming_markdown_cache",
521
+ None,
522
+ )
523
+ if callable(reset_streaming_md):
524
+ reset_streaming_md()
473
525
  self._current_block.set_streaming(streaming)
474
526
  self._current_block.invalidate()
475
527
  if clear:
476
- # No finalize(): this is always an AssistantMessage/ToolMessage,
477
- # a ctrl+o target toggle_details_expanded only reaches
478
- # still-live blocks, so freezing here the instant a reply
479
- # finishes would make it permanently un-toggleable. It still
480
- # freezes safely once something else is added after it (the
481
- # "not last unit" fallback in render_split_cells).
528
+ # The driver is dropping its live reference to this block at true
529
+ # message completion. Its content is now render-stable, so let
530
+ # MessageList freeze it immediately even if it is still the last
531
+ # unit. This does not make ctrl+o/theme/session changes impossible:
532
+ # those paths explicitly invalidate frozen caches from the touched
533
+ # block and rebuild on demand.
534
+ self._current_block.finalize()
482
535
  self._current_block = None
483
536
  self._current_text_length = 0
484
537
 
@@ -7,7 +7,7 @@ from tau.tui.buffer import Buffer
7
7
  from tau.tui.component import Component, StaticComponent
8
8
  from tau.tui.geometry import Rect
9
9
  from tau.tui.input import InputEvent, Key, KeyEvent, get_keybindings
10
- from tau.tui.markdown import render_markdown
10
+ from tau.tui.markdown import StreamingMarkdownRenderer, render_markdown
11
11
  from tau.tui.style import Style, apply_style
12
12
  from tau.tui.theme import MessageTheme
13
13
  from tau.tui.utils import BOLD, RESET, _is_diff, cursor_block, visible_width, wrap
@@ -108,6 +108,10 @@ class MessageBlock:
108
108
  self._tool_results_cache: list[str] | None = None
109
109
  self._tool_results_message: object | None = None
110
110
  self._tool_results_width = 0
111
+ # Incremental markdown renderers for append-only streaming text/thinking
112
+ # content. They keep full streamed output visible while avoiding a full
113
+ # CommonMark parse of the whole growing response on every frame.
114
+ self._streaming_markdown: dict[tuple[int, bool], StreamingMarkdownRenderer] = {}
111
115
 
112
116
  # -------------------------------------------------------------------------
113
117
  # Public API
@@ -123,6 +127,13 @@ class MessageBlock:
123
127
  self._tool_results_cache = None
124
128
  self._tool_results_message = None
125
129
 
130
+ def reset_streaming_markdown_cache(self) -> None:
131
+ """Drop incremental markdown state for this block.
132
+
133
+ Used when a streamed message completes so the final render goes through
134
+ the normal whole-document path exactly once.
135
+ """
136
+ self._streaming_markdown.clear()
126
137
  def toggle_expanded(self) -> None:
127
138
  self._expanded = not self._expanded
128
139
  self.invalidate()
@@ -221,6 +232,33 @@ class MessageBlock:
221
232
  def message(self) -> object:
222
233
  return self._message
223
234
 
235
+ def _render_markdown_text(
236
+ self,
237
+ key: tuple[int, bool],
238
+ text: str,
239
+ width: int,
240
+ *,
241
+ preserve_soft_breaks: bool = False,
242
+ ) -> list[str]:
243
+ """Render markdown, using append-only incremental caching while streaming."""
244
+ if self._streaming:
245
+ renderer = self._streaming_markdown.get(key)
246
+ if renderer is None:
247
+ renderer = StreamingMarkdownRenderer()
248
+ self._streaming_markdown[key] = renderer
249
+ return renderer.render(
250
+ text,
251
+ width,
252
+ self._theme.markdown,
253
+ preserve_soft_breaks=preserve_soft_breaks,
254
+ )
255
+ return render_markdown(
256
+ text,
257
+ width,
258
+ self._theme.markdown,
259
+ preserve_soft_breaks=preserve_soft_breaks,
260
+ )
261
+
224
262
  # -------------------------------------------------------------------------
225
263
  # Rendering
226
264
  # -------------------------------------------------------------------------
@@ -407,10 +445,10 @@ class MessageBlock:
407
445
  thinking_idx += 1
408
446
  thinking_text = "".join(thinking_parts).rstrip()
409
447
  thinking_lines = (
410
- render_markdown(
448
+ self._render_markdown_text(
449
+ (idx, True),
411
450
  thinking_text,
412
451
  inner_width,
413
- t.markdown,
414
452
  preserve_soft_breaks=True,
415
453
  )
416
454
  if thinking_text
@@ -437,7 +475,11 @@ class MessageBlock:
437
475
  lines.append("")
438
476
 
439
477
  elif isinstance(item, TextContent) and item.content:
440
- for line in render_markdown(item.content.rstrip(), inner_width, t.markdown):
478
+ for line in self._render_markdown_text(
479
+ (idx, False),
480
+ item.content.rstrip(),
481
+ inner_width,
482
+ ):
441
483
  lines.append(" " + line)
442
484
 
443
485
  elif isinstance(item, _ImageContent):
@@ -960,13 +1002,19 @@ class MessageList(Component):
960
1002
  this should rarely trigger. If it ever does (e.g. a render happened
961
1003
  to land between adding a block and an immediate undo), resetting here
962
1004
  forces one full rebuild rather than leaving the cache pointing past
963
- the end of self._blocks.
1005
+ the end of self._blocks. Must bump frozen_generation too — its
1006
+ contract (see the field's docstring) is "bumped every time
1007
+ _frozen_buf is rebuilt from scratch", and callers like
1008
+ TUI.render_cells cache pre-widened frozen rows keyed on this counter;
1009
+ resetting _frozen_buf without it would let that cache keep serving
1010
+ now-stale content for a unit that no longer exists.
964
1011
  """
965
1012
  if self._frozen_block_count > len(self._blocks):
966
1013
  self._frozen_buf = None
967
1014
  self._frozen_block_count = 0
968
1015
  self._frozen_unit_ends = []
969
1016
  self._frozen_unit_rows = []
1017
+ self.frozen_generation += 1
970
1018
 
971
1019
  def remove_last(self) -> bool:
972
1020
  """Remove the last block (used to undo a user message on pre-stream abort)."""
@@ -1003,6 +1051,11 @@ class MessageList(Component):
1003
1051
  self._frozen_block_count = 0
1004
1052
  self._frozen_unit_ends = []
1005
1053
  self._frozen_unit_rows = []
1054
+ # See _guard_frozen_bounds: any reset of _frozen_buf must bump this so
1055
+ # callers caching pre-widened frozen rows keyed on it (TUI.render_cells)
1056
+ # drop their now-stale cache instead of continuing to serve rows from
1057
+ # the conversation that was just cleared.
1058
+ self.frozen_generation += 1
1006
1059
 
1007
1060
  def add_message(self, message: object, streaming: bool = False) -> MessageBlock:
1008
1061
  block = MessageBlock(
@@ -200,15 +200,136 @@ def render_markdown(
200
200
  preserve_soft_breaks: bool = False,
201
201
  ) -> list[str]:
202
202
  """Render a markdown string to a list of ANSI-coloured terminal lines."""
203
+ return _render_markdown(text, width, theme, preserve_soft_breaks=preserve_soft_breaks)
204
+
205
+
206
+ def _render_markdown(
207
+ text: str,
208
+ width: int,
209
+ theme: MarkdownTheme,
210
+ *,
211
+ preserve_soft_breaks: bool = False,
212
+ trim_trailing_blank_lines: bool = True,
213
+ ) -> list[str]:
203
214
  document, html_block, html_span, md_context = _mistletoe()
204
215
  with md_context(html_span, html_block):
205
216
  doc = document(text.splitlines(keepends=True))
206
217
  lines = _Renderer(width, theme, preserve_soft_breaks).render_blocks(doc.children or [])
207
- while lines and lines[-1] == "":
208
- lines.pop()
218
+ if trim_trailing_blank_lines:
219
+ while lines and lines[-1] == "":
220
+ lines.pop()
209
221
  return lines
210
222
 
211
223
 
224
+ class StreamingMarkdownRenderer:
225
+ """Incremental renderer for append-only streamed markdown.
226
+
227
+ A normal ``render_markdown(growing_text, ...)`` call reparses the entire
228
+ CommonMark document every frame. For long streamed replies that becomes
229
+ O(total_response_size) on the UI event loop and can delay keystroke echo.
230
+
231
+ This cache freezes complete top-level block groups once a blank-line
232
+ boundary has moved behind the live tail, then reparses only the still-open
233
+ suffix on subsequent frames. The final non-streaming render should still
234
+ call ``render_markdown`` once for exact whole-document semantics.
235
+ """
236
+
237
+ def __init__(self) -> None:
238
+ self._width = -1
239
+ self._theme_id = 0
240
+ self._preserve_soft_breaks = False
241
+ self._text = ""
242
+ self._frozen_until = 0
243
+ self._frozen_lines: list[str] = []
244
+
245
+ def reset(self) -> None:
246
+ self._text = ""
247
+ self._frozen_until = 0
248
+ self._frozen_lines = []
249
+
250
+ def render(
251
+ self,
252
+ text: str,
253
+ width: int,
254
+ theme: MarkdownTheme,
255
+ *,
256
+ preserve_soft_breaks: bool = False,
257
+ ) -> list[str]:
258
+ theme_id = id(theme)
259
+ if (
260
+ width != self._width
261
+ or theme_id != self._theme_id
262
+ or preserve_soft_breaks != self._preserve_soft_breaks
263
+ or not text.startswith(self._text)
264
+ ):
265
+ self._width = width
266
+ self._theme_id = theme_id
267
+ self._preserve_soft_breaks = preserve_soft_breaks
268
+ self.reset()
269
+
270
+ self._text = text
271
+ freeze_until = _streaming_markdown_freeze_cutoff(text)
272
+ if freeze_until > self._frozen_until:
273
+ newly_stable = text[self._frozen_until:freeze_until]
274
+ rendered = _render_markdown(
275
+ newly_stable,
276
+ width,
277
+ theme,
278
+ preserve_soft_breaks=preserve_soft_breaks,
279
+ )
280
+ if rendered:
281
+ if self._frozen_lines and self._frozen_lines[-1] != "":
282
+ self._frozen_lines.append("")
283
+ self._frozen_lines.extend(rendered)
284
+ # Preserve the block separator represented by the stable blank
285
+ # boundary; render_markdown trims it for full-document display.
286
+ if self._frozen_lines[-1] != "":
287
+ self._frozen_lines.append("")
288
+ self._frozen_until = freeze_until
289
+
290
+ tail = text[self._frozen_until :]
291
+ tail_lines = _render_markdown(
292
+ tail,
293
+ width,
294
+ theme,
295
+ preserve_soft_breaks=preserve_soft_breaks,
296
+ )
297
+ if not tail_lines:
298
+ frozen = self._frozen_lines
299
+ return list(frozen[:-1] if frozen[-1:] == [""] else frozen)
300
+ return [*self._frozen_lines, *tail_lines]
301
+
302
+
303
+ def _streaming_markdown_freeze_cutoff(text: str) -> int:
304
+ """Return an append-only cutoff for completed top-level markdown blocks.
305
+
306
+ During streaming, only the current open block needs to remain live. Once a
307
+ blank-line boundary is seen outside a fenced code block, the block before
308
+ that boundary is structurally complete for the common assistant-output cases
309
+ we render here (paragraphs, headings, lists, tables, quotes, fenced code).
310
+ Freezing up to the latest such boundary keeps active streaming work bounded
311
+ to the current block instead of the whole reply.
312
+ """
313
+ boundaries: list[int] = []
314
+ in_fence = False
315
+ fence_marker = ""
316
+ pos = 0
317
+ for line in text.splitlines(keepends=True):
318
+ stripped = line.strip()
319
+ if stripped.startswith(("```", "~~~")):
320
+ marker = stripped[:3]
321
+ if not in_fence:
322
+ in_fence = True
323
+ fence_marker = marker
324
+ elif marker == fence_marker:
325
+ in_fence = False
326
+ fence_marker = ""
327
+ pos += len(line)
328
+ if not in_fence and stripped == "":
329
+ boundaries.append(pos)
330
+ return boundaries[-1] if boundaries else 0
331
+
332
+
212
333
  # ── Renderer ──────────────────────────────────────────────────────────────────
213
334
 
214
335