tau-coding-agent 0.6.2__tar.gz → 0.6.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. {tau_coding_agent-0.6.2/tau_coding_agent.egg-info → tau_coding_agent-0.6.4}/PKG-INFO +28 -6
  2. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/README.md +27 -5
  3. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/pyproject.toml +1 -1
  4. tau_coding_agent-0.6.4/tau/agent/embedded.py +339 -0
  5. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/service.py +1 -0
  6. tau_coding_agent-0.6.4/tau/builtins/extensions/loop/README.md +45 -0
  7. tau_coding_agent-0.6.4/tau/builtins/extensions/loop/__init__.py +206 -0
  8. tau_coding_agent-0.6.4/tau/builtins/extensions/loop/dispatch.py +106 -0
  9. tau_coding_agent-0.6.4/tau/builtins/extensions/loop/duration.py +124 -0
  10. tau_coding_agent-0.6.4/tau/builtins/extensions/loop/state.py +188 -0
  11. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/worker.md +1 -1
  12. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/subagent_schema.py +0 -1
  13. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/subagent_tool.py +108 -163
  14. tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/__init__.py +282 -0
  15. tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/agent_discovery.py +42 -0
  16. tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/manifest.json +19 -0
  17. tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/model.py +136 -0
  18. tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/runner.py +288 -0
  19. tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/skills/create-workflows/SKILL.md +144 -0
  20. tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/store.py +110 -0
  21. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/cli.py +1 -3
  22. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/loader.py +38 -0
  23. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/misc.py +1 -1
  24. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/layout.py +3 -3
  25. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/ui_context.py +34 -1
  26. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/runtime/types.py +8 -1
  27. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/render.py +1 -1
  28. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/autocomplete.py +1 -1
  29. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/input.py +1 -1
  30. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4/tau_coding_agent.egg-info}/PKG-INFO +28 -6
  31. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/SOURCES.txt +13 -1
  32. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_text_llm_invoke.py +4 -0
  33. tau_coding_agent-0.6.2/tests/test_mcp_extension.py +0 -183
  34. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/LICENSE +0 -0
  35. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/MANIFEST.in +0 -0
  36. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/architecture.md +0 -0
  37. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/auth.md +0 -0
  38. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/cli-reference.md +0 -0
  39. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/creating-tools.md +0 -0
  40. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/development.md +0 -0
  41. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/docs.json +0 -0
  42. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/engine.md +0 -0
  43. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/extension-settings.md +0 -0
  44. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/extensions.md +0 -0
  45. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/http-proxy.md +0 -0
  46. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/index.md +0 -0
  47. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/inference-providers.md +0 -0
  48. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/inference.md +0 -0
  49. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/installation.md +0 -0
  50. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/keybindings.md +0 -0
  51. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/messages.md +0 -0
  52. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/project-context.md +0 -0
  53. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/project-structure.md +0 -0
  54. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/prompts.md +0 -0
  55. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/python-api.md +0 -0
  56. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/quickstart.md +0 -0
  57. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/sessions.md +0 -0
  58. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/settings.md +0 -0
  59. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/skills.md +0 -0
  60. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/themes.md +0 -0
  61. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/tools.md +0 -0
  62. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/tui.md +0 -0
  63. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/usage.md +0 -0
  64. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/setup.cfg +0 -0
  65. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/__init__.py +0 -0
  66. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/__init__.py +0 -0
  67. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/prompt/__init__.py +0 -0
  68. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/prompt/builder.py +0 -0
  69. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/prompt/types.py +0 -0
  70. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/types.py +0 -0
  71. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/auth/manager.py +0 -0
  72. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/auth/storage.py +0 -0
  73. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/auth/types.py +0 -0
  74. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/__init__.py +0 -0
  75. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/__init__.py +0 -0
  76. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/clear.py +0 -0
  77. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/compact.py +0 -0
  78. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/reload.py +0 -0
  79. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/session.py +0 -0
  80. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/__init__.py +0 -0
  81. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/component.py +0 -0
  82. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/manifest.json +0 -0
  83. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/schema.py +0 -0
  84. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/tool.py +0 -0
  85. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/btw/__init__.py +0 -0
  86. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/__init__.py +0 -0
  87. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/git.py +0 -0
  88. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/model.py +0 -0
  89. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/utils.py +0 -0
  90. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/header/__init__.py +0 -0
  91. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/__init__.py +0 -0
  92. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/manager.py +0 -0
  93. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/manifest.json +0 -0
  94. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/sandbox_tool.py +0 -0
  95. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/__init__.py +0 -0
  96. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/context-builder.md +0 -0
  97. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/delegate.md +0 -0
  98. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/oracle.md +0 -0
  99. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/planner.md +0 -0
  100. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/researcher.md +0 -0
  101. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/reviewer.md +0 -0
  102. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/scout.md +0 -0
  103. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents.py +0 -0
  104. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/manifest.json +0 -0
  105. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/__init__.py +0 -0
  106. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/manifest.json +0 -0
  107. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/todo_schema.py +0 -0
  108. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/todo_tool.py +0 -0
  109. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/watch/__init__.py +0 -0
  110. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/__init__.py +0 -0
  111. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/__init__.py +0 -0
  112. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/base.py +0 -0
  113. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/ddgs_engine.py +0 -0
  114. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/exa_engine.py +0 -0
  115. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/jina_engine.py +0 -0
  116. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/tavily_engine.py +0 -0
  117. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/manifest.json +0 -0
  118. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/tools/__init__.py +0 -0
  119. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/tools/fetch.py +0 -0
  120. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/tools/search.py +0 -0
  121. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/__init__.py +0 -0
  122. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/audio.py +0 -0
  123. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/image.py +0 -0
  124. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/text.py +0 -0
  125. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/video.py +0 -0
  126. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/commit.md +0 -0
  127. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/docs.md +0 -0
  128. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/explain.md +0 -0
  129. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/fix.md +0 -0
  130. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/refactor.md +0 -0
  131. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/review.md +0 -0
  132. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/test.md +0 -0
  133. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/__init__.py +0 -0
  134. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/audio.py +0 -0
  135. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/image.py +0 -0
  136. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/text.py +0 -0
  137. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/video.py +0 -0
  138. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/code-review/SKILL.md +0 -0
  139. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/debug/SKILL.md +0 -0
  140. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  141. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
  142. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
  143. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/ayu-dark.yaml +0 -0
  144. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/catppuccin.yaml +0 -0
  145. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/dark.yaml +0 -0
  146. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/dracula.yaml +0 -0
  147. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/everforest.yaml +0 -0
  148. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/gruvbox.yaml +0 -0
  149. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/horizon.yaml +0 -0
  150. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/kanagawa.yaml +0 -0
  151. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/light.yaml +0 -0
  152. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/material-ocean.yaml +0 -0
  153. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/monokai.yaml +0 -0
  154. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/night-owl.yaml +0 -0
  155. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/nord.yaml +0 -0
  156. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/one-dark.yaml +0 -0
  157. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/rose-pine.yaml +0 -0
  158. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/solarized-dark.yaml +0 -0
  159. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/tokyo-night.yaml +0 -0
  160. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/__init__.py +0 -0
  161. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/edit.py +0 -0
  162. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/glob.py +0 -0
  163. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/grep.py +0 -0
  164. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/ls.py +0 -0
  165. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/read.py +0 -0
  166. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/terminal.py +0 -0
  167. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/utils.py +0 -0
  168. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/write.py +0 -0
  169. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/commands/__init__.py +0 -0
  170. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/commands/registry.py +0 -0
  171. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/commands/types.py +0 -0
  172. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/__init__.py +0 -0
  173. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/__init__.py +0 -0
  174. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/auth.py +0 -0
  175. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/packages.py +0 -0
  176. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/update.py +0 -0
  177. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/core/__init__.py +0 -0
  178. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/core/registry.py +0 -0
  179. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/engine/__init__.py +0 -0
  180. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/engine/service.py +0 -0
  181. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/engine/types.py +0 -0
  182. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/__init__.py +0 -0
  183. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/api.py +0 -0
  184. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/context.py +0 -0
  185. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/runtime.py +0 -0
  186. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/settings.py +0 -0
  187. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/__init__.py +0 -0
  188. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/engine.py +0 -0
  189. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/inference.py +0 -0
  190. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/runtime.py +0 -0
  191. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/service.py +0 -0
  192. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/session.py +0 -0
  193. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/tui.py +0 -0
  194. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/types.py +0 -0
  195. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/__init__.py +0 -0
  196. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/__init__.py +0 -0
  197. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/__init__.py +0 -0
  198. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/base.py +0 -0
  199. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/builtins.py +0 -0
  200. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  201. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/gemini_audio.py +0 -0
  202. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/openai_audio.py +0 -0
  203. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/registry.py +0 -0
  204. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/sarvam_audio.py +0 -0
  205. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/service.py +0 -0
  206. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/utils.py +0 -0
  207. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/availability.py +0 -0
  208. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/__init__.py +0 -0
  209. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/base.py +0 -0
  210. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/builtins.py +0 -0
  211. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/gemini_image.py +0 -0
  212. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/openai_image.py +0 -0
  213. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/openrouter.py +0 -0
  214. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/registry.py +0 -0
  215. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/service.py +0 -0
  216. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/registry.py +0 -0
  217. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/__init__.py +0 -0
  218. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/anthropic_claude_code.py +0 -0
  219. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/anthropic_messages.py +0 -0
  220. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/anthropic_vertex.py +0 -0
  221. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/base.py +0 -0
  222. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/builtins.py +0 -0
  223. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/dialect.py +0 -0
  224. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/gemini_generate.py +0 -0
  225. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/github_copilot_chat.py +0 -0
  226. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/google_antigravity.py +0 -0
  227. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/google_vertex.py +0 -0
  228. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/mistral_chat.py +0 -0
  229. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/ollama_chat.py +0 -0
  230. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_codex_responses.py +0 -0
  231. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_completions.py +0 -0
  232. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_responses.py +0 -0
  233. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_vertex.py +0 -0
  234. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/registry.py +0 -0
  235. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/service.py +0 -0
  236. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/types.py +0 -0
  237. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/utils.py +0 -0
  238. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/__init__.py +0 -0
  239. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/base.py +0 -0
  240. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/builtins.py +0 -0
  241. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/fal_video.py +0 -0
  242. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/openrouter_video.py +0 -0
  243. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/registry.py +0 -0
  244. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/service.py +0 -0
  245. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/zai_video.py +0 -0
  246. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/model/__init__.py +0 -0
  247. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/model/registry.py +0 -0
  248. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/model/types.py +0 -0
  249. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/__init__.py +0 -0
  250. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/__init__.py +0 -0
  251. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
  252. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/github_copilot.py +0 -0
  253. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/google_antigravity.py +0 -0
  254. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/openai_codex.py +0 -0
  255. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/pkce.py +0 -0
  256. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/types.py +0 -0
  257. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/utils.py +0 -0
  258. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/registry.py +0 -0
  259. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/types.py +0 -0
  260. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/types.py +0 -0
  261. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/utils.py +0 -0
  262. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/message/__init__.py +0 -0
  263. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/message/types.py +0 -0
  264. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/message/utils.py +0 -0
  265. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/__init__.py +0 -0
  266. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/__init__.py +0 -0
  267. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/agent_hooks.py +0 -0
  268. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/app.py +0 -0
  269. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/__init__.py +0 -0
  270. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/appearance.py +0 -0
  271. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/auth.py +0 -0
  272. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/context.py +0 -0
  273. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/extensions.py +0 -0
  274. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/model.py +0 -0
  275. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/session.py +0 -0
  276. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/__init__.py +0 -0
  277. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/command_palette.py +0 -0
  278. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/config_selector.py +0 -0
  279. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/extension_selector.py +0 -0
  280. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/file_picker.py +0 -0
  281. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/message_list.py +0 -0
  282. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/model_selector.py +0 -0
  283. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/oauth_selector.py +0 -0
  284. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/overlays.py +0 -0
  285. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/selector_controller.py +0 -0
  286. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/session_selector.py +0 -0
  287. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/settings_selector.py +0 -0
  288. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/theme_selector.py +0 -0
  289. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/thinking_selector.py +0 -0
  290. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/tree_selector.py +0 -0
  291. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/trust_screen.py +0 -0
  292. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/voice_selector.py +0 -0
  293. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/input_handler.py +0 -0
  294. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/print/__init__.py +0 -0
  295. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/rpc/__init__.py +0 -0
  296. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/rpc/mode.py +0 -0
  297. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/rpc/types.py +0 -0
  298. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/__init__.py +0 -0
  299. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/manager.py +0 -0
  300. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/types.py +0 -0
  301. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/utils.py +0 -0
  302. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/expand.py +0 -0
  303. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/loader.py +0 -0
  304. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/registry.py +0 -0
  305. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/types.py +0 -0
  306. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/resources/__init__.py +0 -0
  307. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/resources/loader.py +0 -0
  308. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/resources/types.py +0 -0
  309. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/runtime/dependencies.py +0 -0
  310. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/runtime/service.py +0 -0
  311. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/branch_summarization.py +0 -0
  312. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/compaction.py +0 -0
  313. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/manager.py +0 -0
  314. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/types.py +0 -0
  315. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/utils.py +0 -0
  316. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/manager.py +0 -0
  317. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/paths.py +0 -0
  318. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/storage.py +0 -0
  319. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/types.py +0 -0
  320. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/utils.py +0 -0
  321. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/skills/loader.py +0 -0
  322. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/skills/registry.py +0 -0
  323. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/skills/types.py +0 -0
  324. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/telemetry/__init__.py +0 -0
  325. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/telemetry/service.py +0 -0
  326. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/telemetry/types.py +0 -0
  327. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/themes/loader.py +0 -0
  328. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/themes/registry.py +0 -0
  329. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/themes/types.py +0 -0
  330. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/__init__.py +0 -0
  331. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/registry.py +0 -0
  332. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/types.py +0 -0
  333. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/__init__.py +0 -0
  334. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/manager.py +0 -0
  335. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/types.py +0 -0
  336. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/utils.py +0 -0
  337. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/__init__.py +0 -0
  338. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/ansi_bridge.py +0 -0
  339. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/backend.py +0 -0
  340. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/buffer.py +0 -0
  341. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/component.py +0 -0
  342. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/__init__.py +0 -0
  343. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/box.py +0 -0
  344. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/editor.py +0 -0
  345. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/image.py +0 -0
  346. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/select_list.py +0 -0
  347. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/simple_picker.py +0 -0
  348. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/spinner.py +0 -0
  349. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/text_input.py +0 -0
  350. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/widget_bridge.py +0 -0
  351. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/frame.py +0 -0
  352. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/geometry.py +0 -0
  353. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/keybinding_hints.py +0 -0
  354. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/layout.py +0 -0
  355. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/markdown.py +0 -0
  356. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/palette.py +0 -0
  357. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/service.py +0 -0
  358. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/style.py +0 -0
  359. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/terminal.py +0 -0
  360. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/testing.py +0 -0
  361. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/text.py +0 -0
  362. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/theme.py +0 -0
  363. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/utils.py +0 -0
  364. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widget.py +0 -0
  365. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/__init__.py +0 -0
  366. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/barchart.py +0 -0
  367. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/block.py +0 -0
  368. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/calendar.py +0 -0
  369. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/canvas.py +0 -0
  370. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/chart.py +0 -0
  371. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/clear.py +0 -0
  372. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/gauge.py +0 -0
  373. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/list.py +0 -0
  374. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/paragraph.py +0 -0
  375. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/scrollbar.py +0 -0
  376. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/sparkline.py +0 -0
  377. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/symbols.py +0 -0
  378. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/table.py +0 -0
  379. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/tabs.py +0 -0
  380. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/__init__.py +0 -0
  381. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/format.py +0 -0
  382. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/http_proxy.py +0 -0
  383. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/image_processing.py +0 -0
  384. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/secrets.py +0 -0
  385. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/version_check.py +0 -0
  386. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  387. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  388. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/requires.txt +0 -0
  389. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/top_level.txt +0 -0
  390. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_compaction.py +0 -0
  391. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_hooks.py +0 -0
  392. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_prompt.py +0 -0
  393. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_types.py +0 -0
  394. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ansi.py +0 -0
  395. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ansi_bridge_legacy_image.py +0 -0
  396. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ask_user_extension.py +0 -0
  397. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_audio_transcription_apis.py +0 -0
  398. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_auth_command.py +0 -0
  399. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_auth_manager.py +0 -0
  400. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_auth_storage.py +0 -0
  401. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_autocomplete_modifiers.py +0 -0
  402. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_branch_navigation.py +0 -0
  403. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_branch_summarization.py +0 -0
  404. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_builtin_tools.py +0 -0
  405. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_builtin_watch.py +0 -0
  406. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_cli_inputs.py +0 -0
  407. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_command_execution_policy.py +0 -0
  408. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_command_registry.py +0 -0
  409. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_compaction.py +0 -0
  410. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_component_buffer_bridge.py +0 -0
  411. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_diff.py +0 -0
  412. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_editor_protocol.py +0 -0
  413. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_engine_execution.py +0 -0
  414. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_engine_steering.py +0 -0
  415. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_engine_types.py +0 -0
  416. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_escape_behavior.py +0 -0
  417. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_extension_api.py +0 -0
  418. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_extension_lifecycle.py +0 -0
  419. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_footer_model.py +0 -0
  420. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_footer_utils.py +0 -0
  421. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_fuzzy.py +0 -0
  422. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_gemini_generate.py +0 -0
  423. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_http_proxy.py +0 -0
  424. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_image_processing.py +0 -0
  425. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_api_text_utils.py +0 -0
  426. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_dialect.py +0 -0
  427. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_error_utils.py +0 -0
  428. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_types.py +0 -0
  429. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_utils.py +0 -0
  430. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_keybindings.py +0 -0
  431. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_layout_render_cells.py +0 -0
  432. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_markdown.py +0 -0
  433. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_message_list_frozen.py +0 -0
  434. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_message_types.py +0 -0
  435. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_message_utils.py +0 -0
  436. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_availability.py +0 -0
  437. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_command.py +0 -0
  438. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_registry.py +0 -0
  439. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_selector_modal.py +0 -0
  440. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_types.py +0 -0
  441. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_oauth_utils.py +0 -0
  442. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_package_resources.py +0 -0
  443. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_packages_utils.py +0 -0
  444. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_peer_extension.py +0 -0
  445. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_pkce.py +0 -0
  446. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_prompts_expand.py +0 -0
  447. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_prompts_loader.py +0 -0
  448. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_prompts_registry.py +0 -0
  449. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_provider_registry.py +0 -0
  450. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_resource_loader.py +0 -0
  451. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_rpc_mode.py +0 -0
  452. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_runtime_sdk.py +0 -0
  453. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_scrollback_raw_writes.py +0 -0
  454. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_scrollback_terminal.py +0 -0
  455. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_secrets.py +0 -0
  456. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_select_list_render_cells.py +0 -0
  457. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_selector_controller.py +0 -0
  458. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_manager.py +0 -0
  459. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_trust_persist.py +0 -0
  460. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_types.py +0 -0
  461. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_utils.py +0 -0
  462. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_manager.py +0 -0
  463. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_paths.py +0 -0
  464. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_storage.py +0 -0
  465. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_utils.py +0 -0
  466. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_skills_loader.py +0 -0
  467. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_skills_registry.py +0 -0
  468. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_subagent_context.py +0 -0
  469. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_telemetry.py +0 -0
  470. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_text_input.py +0 -0
  471. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_text_input_render_cells.py +0 -0
  472. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_theme_loader.py +0 -0
  473. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_themes_registry.py +0 -0
  474. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_thinking_render.py +0 -0
  475. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tool_registry.py +0 -0
  476. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tool_render.py +0 -0
  477. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_trust_manager.py +0 -0
  478. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_trust_utils.py +0 -0
  479. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_capabilities.py +0 -0
  480. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_child_rows.py +0 -0
  481. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_input.py +0 -0
  482. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_layout_sizing.py +0 -0
  483. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_public_api.py +0 -0
  484. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_renderer.py +0 -0
  485. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_select_list.py +0 -0
  486. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_theme.py +0 -0
  487. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_utils.py +0 -0
  488. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ui_context.py +0 -0
  489. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_utils_hashline.py +0 -0
  490. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_version_check.py +0 -0
  491. {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_voice_selector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tau-coding-agent
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands
5
5
  Requires-Python: >=3.12
6
6
  Description-Content-Type: text/markdown
@@ -36,11 +36,33 @@ Requires-Dist: ripgrep>=14.0.0; extra == "tools"
36
36
  Requires-Dist: ast-grep-cli>=0.44.0; extra == "tools"
37
37
  Dynamic: license-file
38
38
 
39
- # Tau (τ)
40
-
41
- Tau is a Python agent framework and terminal coding assistant. It combines an
42
- interactive terminal UI, multiple model providers, persistent sessions, tool
43
- execution, and an extension system in one package.
39
+ <div align="center">
40
+
41
+ <img src="assets/wordmark.svg" alt="Tau" height="160">
42
+ <br>
43
+ <a href="https://pypi.org/project/tau-coding-agent/">
44
+ <img src="https://img.shields.io/pypi/v/tau-coding-agent.svg" alt="PyPI version">
45
+ </a>
46
+ <a href="https://pepy.tech/project/tau-coding-agent">
47
+ <img src="https://static.pepy.tech/badge/tau-coding-agent" alt="PyPI Downloads">
48
+ </a>
49
+ <a href="https://github.com/Jeomon/Tau/blob/main/LICENSE">
50
+ <img src="https://img.shields.io/badge/license-MIT-green" alt="License">
51
+ </a>
52
+ <img src="https://img.shields.io/badge/python-3.12%2B-blue" alt="Python">
53
+ <br>
54
+ <a href="https://github.com/Jeomon/Tau/actions/workflows/ci.yml">
55
+ <img src="https://github.com/Jeomon/Tau/actions/workflows/ci.yml/badge.svg" alt="CI status">
56
+ </a>
57
+ <a href="https://github.com/Jeomon/Tau/commits/main">
58
+ <img src="https://img.shields.io/github/last-commit/Jeomon/Tau.svg" alt="Last commit">
59
+ </a>
60
+
61
+ </div>
62
+
63
+ <br>
64
+
65
+ Tau is a Python agent framework and coding agent, inspired by [Pi](https://github.com/earendil-works/pi). It combines an interactive terminal UI, multiple model providers, persistent sessions, tool execution, and an extension system in one package.
44
66
 
45
67
  <p align="center">
46
68
  <img src="assets/tui.jpeg" alt="Tau interactive terminal interface" width="700">
@@ -1,8 +1,30 @@
1
- # Tau (τ)
2
-
3
- Tau is a Python agent framework and terminal coding assistant. It combines an
4
- interactive terminal UI, multiple model providers, persistent sessions, tool
5
- execution, and an extension system in one package.
1
+ <div align="center">
2
+
3
+ <img src="assets/wordmark.svg" alt="Tau" height="160">
4
+ <br>
5
+ <a href="https://pypi.org/project/tau-coding-agent/">
6
+ <img src="https://img.shields.io/pypi/v/tau-coding-agent.svg" alt="PyPI version">
7
+ </a>
8
+ <a href="https://pepy.tech/project/tau-coding-agent">
9
+ <img src="https://static.pepy.tech/badge/tau-coding-agent" alt="PyPI Downloads">
10
+ </a>
11
+ <a href="https://github.com/Jeomon/Tau/blob/main/LICENSE">
12
+ <img src="https://img.shields.io/badge/license-MIT-green" alt="License">
13
+ </a>
14
+ <img src="https://img.shields.io/badge/python-3.12%2B-blue" alt="Python">
15
+ <br>
16
+ <a href="https://github.com/Jeomon/Tau/actions/workflows/ci.yml">
17
+ <img src="https://github.com/Jeomon/Tau/actions/workflows/ci.yml/badge.svg" alt="CI status">
18
+ </a>
19
+ <a href="https://github.com/Jeomon/Tau/commits/main">
20
+ <img src="https://img.shields.io/github/last-commit/Jeomon/Tau.svg" alt="Last commit">
21
+ </a>
22
+
23
+ </div>
24
+
25
+ <br>
26
+
27
+ Tau is a Python agent framework and coding agent, inspired by [Pi](https://github.com/earendil-works/pi). It combines an interactive terminal UI, multiple model providers, persistent sessions, tool execution, and an extension system in one package.
6
28
 
7
29
  <p align="center">
8
30
  <img src="assets/tui.jpeg" alt="Tau interactive terminal interface" width="700">
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tau-coding-agent"
7
- version = "0.6.2"
7
+ version = "0.6.4"
8
8
  description = "A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -0,0 +1,339 @@
1
+ """In-process agent execution — run one isolated agent turn directly in this
2
+ interpreter via Engine/LLM, instead of spawning a separate `tau` OS process.
3
+
4
+ Shared by the `subagent` tool and the `/workflow` extension: both need to run
5
+ an isolated agent turn given a task, an agent's tools/system prompt, and
6
+ (optionally) prior conversation history to resume read-only.
7
+
8
+ Deliberately narrow and self-contained: builds an Engine, an LLM, fresh tool
9
+ instances, and a Hooks() dispatcher directly — bypassing Runtime.create()'s
10
+ full bootstrap (resource discovery, extension loading, global registry
11
+ reload) entirely. That bootstrap mutates process-wide singletons
12
+ (skill_registry, prompt_registry, theme_registry) and re-fires session_start
13
+ on every extension, which is unsafe to run reentrantly from inside an
14
+ already-running session. Engine itself is explicitly documented as knowing
15
+ "nothing about sessions, extensions, or compaction" — exactly the isolation
16
+ this needs.
17
+
18
+ Trade-off: an embedded agent only has the base builtin coding tools
19
+ (read/write/edit/terminal/glob/grep/ls) plus whatever its own `tools:`
20
+ frontmatter names from that set — extension-contributed tools (web_search,
21
+ web_fetch, subagent, todo, ...) are not available, since loading them would
22
+ mean loading extensions. None of the shipped subagent presets need more than
23
+ the base set.
24
+
25
+ Fork context (resuming a parent session's history read-only) is safe for the
26
+ same reason SessionManager itself is safe to use here even though
27
+ Runtime.create() isn't: SessionManager is instance-scoped, not a mutated
28
+ process-wide singleton. Constructing one with persist=False and calling only
29
+ its read methods (build_session_context) never touches shared state and
30
+ never writes back — see load_fork_context().
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ import asyncio
36
+ import contextlib
37
+ import json
38
+ from collections.abc import Callable
39
+ from pathlib import Path
40
+ from typing import Any
41
+
42
+ from pydantic import BaseModel, create_model
43
+
44
+ from tau.builtins.tools import TOOLS
45
+ from tau.engine import Engine, EngineContext
46
+ from tau.hooks.engine import MessageEndEvent, ToolExecutionStartEvent
47
+ from tau.hooks.service import Hooks
48
+ from tau.inference import StopReason
49
+ from tau.inference.api.text.service import TextLLM
50
+ from tau.message.types import (
51
+ AssistantMessage,
52
+ LLMMessage,
53
+ Role,
54
+ ToolCallContent,
55
+ ToolMessage,
56
+ UserMessage,
57
+ )
58
+ from tau.tool.types import Tool, ToolContext, ToolInvocation, ToolKind, ToolResult
59
+
60
+ TASK_TIMEOUT_S = 300
61
+ _ABORT_GRACE_S = 15
62
+ _TOOL_ARG_KEYS = ("cmd", "pattern", "path")
63
+ _JSON_SCHEMA_TYPES: dict[str, type] = {
64
+ "string": str,
65
+ "integer": int,
66
+ "number": float,
67
+ "boolean": bool,
68
+ }
69
+
70
+ # Same fallback Runtime.create() uses when no model is configured — matched
71
+ # here so an embedded agent behaves the same as a real session would.
72
+ _DEFAULT_MODEL = "claude-sonnet-4-6"
73
+ _DEFAULT_PROVIDER = "anthropic"
74
+
75
+
76
+ def load_fork_context(cwd: Path, session_id: str, session_dir: Path) -> list[LLMMessage]:
77
+ """Read a parent session's current branch as read-only LLM message history.
78
+
79
+ Constructs a non-persisting SessionManager purely to read
80
+ build_session_context() — never calls enable_persist() or any write
81
+ method, so this cannot affect the parent session on disk. Filters out
82
+ session-only message types (compaction/branch-summary markers, custom
83
+ messages) that the LLM API layer doesn't understand, and drops any
84
+ SystemMessage since the embedded agent supplies its own system_prompt
85
+ separately.
86
+ """
87
+ from tau.session.manager import SessionManager
88
+
89
+ matches = list(session_dir.rglob(f"*{session_id}*.jsonl"))
90
+ if not matches:
91
+ return []
92
+ matches.sort(key=lambda p: p.stat().st_mtime, reverse=True)
93
+ session_file = matches[0].resolve()
94
+
95
+ sm = SessionManager(cwd, session_dir=session_dir, session_file=session_file, persist=False)
96
+ context = sm.build_session_context()
97
+ keep = (UserMessage, AssistantMessage, ToolMessage)
98
+ return [m for m in context.messages if isinstance(m, keep)]
99
+
100
+
101
+ def _tool_preview(name: str, args: dict[str, Any]) -> str:
102
+ """One-line summary of a tool call, e.g. 'terminal: curl -s https://...'."""
103
+ for key in _TOOL_ARG_KEYS:
104
+ value = args.get(key)
105
+ if isinstance(value, str) and value:
106
+ return f"{name}: {value}"[:100]
107
+ for value in args.values():
108
+ if isinstance(value, str) and value:
109
+ return f"{name}: {value}"[:100]
110
+ return name
111
+
112
+
113
+ def _build_tools(tool_names: list[str] | None, extra_tools: list[Tool] | None = None) -> list[Tool]:
114
+ """Fresh instances of the requested base tools, plus any matching extra
115
+ tools the caller already has instances of (e.g. web_search/web_fetch
116
+ borrowed from the parent session's own tool registry — see
117
+ subagent_tool.py's _extension_tools()). The full base set is used when
118
+ tool_names is unset; extra_tools are only included if explicitly named.
119
+ """
120
+ selected = TOOLS if not tool_names else [t for t in TOOLS if t.name in set(tool_names)]
121
+ tools = [t.__class__() for t in selected] # type: ignore[call-arg]
122
+ if tool_names and extra_tools:
123
+ wanted = set(tool_names)
124
+ tools += [t for t in extra_tools if t.name in wanted]
125
+ return tools
126
+
127
+
128
+ def _json_schema_field_type(spec: Any) -> Any:
129
+ """Map a flat JSON Schema field spec to a Python type. Supports string,
130
+ integer, number, boolean, and array-of-those — enough for typical
131
+ result shapes. Anything else (nested object, unset type) falls back to
132
+ Any, which still validates but doesn't constrain."""
133
+ if not isinstance(spec, dict):
134
+ return Any
135
+ t = spec.get("type")
136
+ if t == "array":
137
+ item_type = _json_schema_field_type(spec.get("items"))
138
+ return list[item_type] # type: ignore[valid-type]
139
+ if not isinstance(t, str):
140
+ return Any
141
+ return _JSON_SCHEMA_TYPES.get(t, Any)
142
+
143
+
144
+ def build_schema_model(name: str, schema: dict[str, Any]) -> type[BaseModel]:
145
+ """Build a Pydantic model from a flat JSON-Schema-shaped dict:
146
+ ``{"type": "object", "properties": {...}, "required": [...]}``.
147
+ """
148
+ properties = schema.get("properties")
149
+ if not isinstance(properties, dict) or not properties:
150
+ raise ValueError("schema must have a non-empty 'properties' mapping")
151
+ required = set(schema.get("required") or [])
152
+ fields: dict[str, Any] = {}
153
+ for field_name, spec in properties.items():
154
+ py_type = _json_schema_field_type(spec)
155
+ fields[field_name] = (py_type, ...) if field_name in required else (py_type | None, None)
156
+ return create_model(name, **fields) # type: ignore[call-overload,no-any-return]
157
+
158
+
159
+ class StructuredOutputTool(Tool):
160
+ """Terminating tool: one call ends the task, its (schema-validated) args
161
+ become the task's output. Mirrors pi-dynamic-workflows' structured_output
162
+ tool, built on Engine's native ToolResult.terminate mechanism.
163
+ """
164
+
165
+ def __init__(self, schema_model: type[BaseModel], capture: dict[str, Any]) -> None:
166
+ self._capture = capture
167
+ super().__init__(
168
+ name="structured_output",
169
+ description=(
170
+ "Submit the final structured result for this task. Call this exactly once, "
171
+ "as your last action, with fields matching the required shape. Do not also "
172
+ "write a prose final answer — this call ends the task immediately."
173
+ ),
174
+ schema=schema_model,
175
+ kind=ToolKind.Read,
176
+ )
177
+
178
+ async def execute(
179
+ self,
180
+ invocation: ToolInvocation,
181
+ tool_execution_update_callback: Any = None,
182
+ signal: Any = None,
183
+ context: ToolContext | None = None,
184
+ ) -> ToolResult:
185
+ self._capture["called"] = True
186
+ self._capture["value"] = invocation.params
187
+ content = json.dumps(invocation.params)
188
+ return ToolResult(
189
+ id=invocation.id, content=content, terminate=True, terminate_message=content
190
+ )
191
+
192
+
193
+ async def run_embedded_agent(
194
+ *,
195
+ cwd: Path,
196
+ model_id: str | None,
197
+ provider: str | None,
198
+ system_prompt: str,
199
+ tool_names: list[str] | None,
200
+ task_text: str,
201
+ schema: dict[str, Any] | None = None,
202
+ initial_messages: list[LLMMessage] | None = None,
203
+ abort_signal: asyncio.Event | None = None,
204
+ extra_tools: list[Tool] | None = None,
205
+ on_tool_start: Callable[[str], None] | None = None,
206
+ on_event: Callable[[Any], None] | None = None,
207
+ timeout_s: float = TASK_TIMEOUT_S,
208
+ ) -> tuple[bool, str, dict[str, Any]]:
209
+ """Run one agent turn to completion, bounded by ``timeout_s``.
210
+
211
+ Returns (ok, output_text, usage). Fully self-contained: its own LLM
212
+ instance, its own Hooks(), its own fresh tools — no session persistence,
213
+ no shared registries, no OS subprocess.
214
+
215
+ ``extra_tools``, if given, are pre-built Tool instances made available
216
+ when ``tool_names`` explicitly names them — for tools this module can't
217
+ construct itself (e.g. web_search/web_fetch need a configured search
218
+ engine). Only used when named; the base coding toolset never needs this.
219
+
220
+ ``initial_messages``, if given, is prepended to the conversation before
221
+ the task message — use load_fork_context() to build this from a parent
222
+ session's history for a read-only "fork" context.
223
+
224
+ ``abort_signal``, if given, is used as the engine's own AbortSignal
225
+ instead of a fresh one — set it externally (e.g. on parent-tool-call
226
+ cancellation) to abort the run cooperatively. The timeout still applies
227
+ on top of this and sets the same signal when it fires.
228
+
229
+ When ``schema`` is set (a flat JSON-Schema-shaped dict), the task gets an
230
+ extra ``structured_output`` tool and must call it exactly once to finish;
231
+ its validated args (as JSON text) become the output. A task that finishes
232
+ without calling it fails — this is meant for tasks whose output feeds a
233
+ later placeholder substitution or handoff, where prose formatting habits
234
+ (code fences, commentary) would otherwise break parsing.
235
+
236
+ ``on_tool_start`` gets a one-line preview string per tool call, for
237
+ simple progress logging. ``on_event`` (if set) gets every raw hook event
238
+ object emitted during the run, for callers that want to build a richer
239
+ live view (e.g. per-tool-call result previews).
240
+
241
+ On timeout, aborts cooperatively via the engine's own AbortSignal (the
242
+ same mechanism Esc-cancel uses in the interactive TUI) and gives it
243
+ ``_ABORT_GRACE_S`` to unwind cleanly before falling back to raw task
244
+ cancellation.
245
+ """
246
+ usage: dict[str, Any] = {"turns": 0, "input_tokens": 0, "output_tokens": 0, "cost": 0.0}
247
+ final_text = ""
248
+ error_message: str | None = None
249
+ failed = False
250
+
251
+ try:
252
+ llm = TextLLM(model_id=model_id or _DEFAULT_MODEL, provider=provider or _DEFAULT_PROVIDER)
253
+ except Exception as e:
254
+ return False, f"Failed to resolve model: {e}", usage
255
+
256
+ tools = _build_tools(tool_names, extra_tools)
257
+ structured_capture: dict[str, Any] | None = None
258
+ if schema is not None:
259
+ try:
260
+ schema_model = build_schema_model("StructuredOutput", schema)
261
+ except Exception as e:
262
+ return False, f"Invalid task schema: {e}", usage
263
+ structured_capture = {"called": False, "value": None}
264
+ tools = [*tools, StructuredOutputTool(schema_model, structured_capture)]
265
+ system_prompt = (
266
+ system_prompt
267
+ + "\n\nFinal output contract: your last action must be a structured_output "
268
+ "tool call. Do not write a prose final answer instead."
269
+ )
270
+ known_tool_names = {t.name for t in tools}
271
+ hooks = Hooks()
272
+
273
+ def _on_message_end(event: MessageEndEvent) -> None:
274
+ nonlocal final_text, error_message, failed
275
+ message = event.message
276
+ if getattr(message, "role", None) != Role.ASSISTANT:
277
+ return
278
+ usage["turns"] += 1
279
+ usage["input_tokens"] += message.usage.input_tokens
280
+ usage["output_tokens"] += message.usage.output_tokens
281
+ usage["cost"] += message.usage.cost.total
282
+ if message.stop_reason in (StopReason.Error, StopReason.Abort):
283
+ failed = True
284
+ if message.error:
285
+ error_message = message.error
286
+ failed = True
287
+ text = message.text_content()
288
+ if text:
289
+ final_text = text
290
+
291
+ # ToolExecutionStartEvent never fires for a tool name the model
292
+ # invented (Engine._execute returns an error before emitting it), so
293
+ # without this a model that hallucinates a tool and won't self-correct
294
+ # would burn the whole timeout in visible silence — indistinguishable
295
+ # from a genuine hang. Surface it explicitly instead.
296
+ if on_tool_start is not None:
297
+ for content in message.contents:
298
+ if isinstance(content, ToolCallContent) and content.name not in known_tool_names:
299
+ on_tool_start(f"✗ unknown tool requested: {content.name!r} (ignored)")
300
+
301
+ def _on_tool_start(event: ToolExecutionStartEvent) -> None:
302
+ if on_tool_start is not None:
303
+ on_tool_start(_tool_preview(event.tool_call.name, event.tool_call.args))
304
+
305
+ hooks.register("message_end", _on_message_end)
306
+ hooks.register("tool_execution_start", _on_tool_start)
307
+ if on_event is not None:
308
+ hooks.subscribe(on_event)
309
+
310
+ engine = Engine(cwd=cwd, llm=llm, tools=tools, system_prompt=system_prompt, hooks=hooks)
311
+ task_message = UserMessage.from_text(f"Task: {task_text}")
312
+ messages: list[LLMMessage] = [*(initial_messages or []), task_message]
313
+ ctx = EngineContext(system_prompt=system_prompt, messages=messages, tools=tools)
314
+ signal = abort_signal if abort_signal is not None else asyncio.Event()
315
+ run_task = asyncio.ensure_future(engine.run(ctx, signal=signal))
316
+
317
+ try:
318
+ await asyncio.wait_for(asyncio.shield(run_task), timeout=timeout_s)
319
+ except TimeoutError:
320
+ signal.set()
321
+ try:
322
+ await asyncio.wait_for(run_task, timeout=_ABORT_GRACE_S)
323
+ except TimeoutError:
324
+ run_task.cancel()
325
+ with contextlib.suppress(asyncio.CancelledError):
326
+ await run_task
327
+ return False, f"Task timed out after {timeout_s:.0f}s", usage
328
+ except Exception as e:
329
+ return False, f"Subagent failed: {e}", usage
330
+
331
+ if failed:
332
+ return False, error_message or final_text or "(no output)", usage
333
+
334
+ if structured_capture is not None:
335
+ if not structured_capture["called"]:
336
+ return False, "Task required structured output but finished without calling it", usage
337
+ return True, json.dumps(structured_capture["value"]), usage
338
+
339
+ return True, final_text or "(no output)", usage
@@ -705,6 +705,7 @@ class Agent:
705
705
  if not self._engine.has_pending_messages():
706
706
  break
707
707
 
708
+ self._phase = AgentPhase.IDLE
708
709
  await self.hooks.emit(SettledEvent())
709
710
  finally:
710
711
  self._phase = AgentPhase.IDLE
@@ -0,0 +1,45 @@
1
+ # loop
2
+
3
+ A single `/loop` command for scheduling recurring prompts in Tau.
4
+
5
+ Runtime design (interval parsing, id-derived jitter, 3-day auto-expiry,
6
+ idle-gated dispatch, atomic disk persistence) modeled on
7
+ [pi-scheduler](https://github.com/manojlds/pi-scheduler), trimmed to exactly
8
+ what's needed here: one command, no one-time reminders, no LLM-callable tool.
9
+
10
+ ## Usage
11
+
12
+ ```
13
+ /loop open the interactive loop manager
14
+ /loop <period> <task> create directly, e.g. /loop 5m water the plants
15
+ /loop <task> every <period> create directly, e.g. /loop water the plants every 2h
16
+ ```
17
+
18
+ Bare `/loop` opens a picker listing every loop as `■/☐ id every <period> — <task>`
19
+ (■ = enabled, ☐ = disabled).
20
+ Selecting one opens an action menu: **Enable/Disable**, **Edit instruction**
21
+ (multi-line editor, prefilled), **Edit duration** (reparsed with the same
22
+ interval syntax), **Delete**, or **Back**. The list also has **+ New loop**
23
+ and **Clear all loops** entries. In headless mode (no TUI), bare `/loop`
24
+ just prints the current list as text since there's no picker to drive.
25
+
26
+ Intervals accept short (`5m`, `2h`, `3d`) or word forms (`5 minutes`, `2 hours`).
27
+ Anything below 1 minute is rounded up; anything not on a minute boundary is
28
+ rounded to the nearest minute.
29
+
30
+ A loop only fires while Tau is idle between turns (never mid-turn), and
31
+ auto-expires 3 days after creation. Each loop's next-run time gets a small
32
+ id-derived jitter (up to 10% of its interval, capped at 15m) so multiple loops
33
+ don't all fire in lockstep.
34
+
35
+ Tasks persist to `.tau/loop/scheduler.json` in the project directory and
36
+ survive session restarts.
37
+
38
+ ## Files
39
+
40
+ | File | Responsibility |
41
+ |------|----------------|
42
+ | `__init__.py` | Entry point — `register(tau)`, the `/loop` command handler, the interactive picker/action-menu flow, session hooks |
43
+ | `duration.py` | Interval parsing/formatting (`parse_duration`, `parse_loop_args`, `format_duration`) |
44
+ | `state.py` | `LoopTask` dataclass and `SchedulerState` (in-memory tasks, edits, + disk persistence) |
45
+ | `dispatch.py` | Per-second ticker: marks due tasks pending, dispatches one when idle, updates the footer status slot |