tau-coding-agent 0.4.0__tar.gz → 0.4.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. {tau_coding_agent-0.4.0/tau_coding_agent.egg-info → tau_coding_agent-0.4.6}/PKG-INFO +3 -3
  2. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/README.md +2 -2
  3. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/architecture.md +45 -7
  4. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/cli-reference.md +15 -7
  5. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/extensions.md +136 -10
  6. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/keybindings.md +8 -3
  7. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/messages.md +6 -0
  8. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/project-structure.md +46 -35
  9. tau_coding_agent-0.4.6/docs/python-api.md +501 -0
  10. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/sessions.md +40 -6
  11. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/settings.md +10 -3
  12. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/tools.md +36 -10
  13. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/usage.md +8 -1
  14. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/pyproject.toml +2 -2
  15. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/agent/prompt/builder.py +27 -5
  16. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/agent/prompt/types.py +4 -0
  17. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/agent/service.py +208 -85
  18. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/agent/types.py +2 -0
  19. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/extensions/footer/__init__.py +7 -0
  20. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/extensions/footer/model.py +25 -0
  21. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/models/text.py +62 -0
  22. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/edit.py +87 -84
  23. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/glob.py +21 -27
  24. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/grep.py +22 -66
  25. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/ls.py +3 -20
  26. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/read.py +16 -19
  27. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/terminal.py +45 -33
  28. tau_coding_agent-0.4.6/tau/builtins/tools/utils.py +129 -0
  29. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/write.py +6 -12
  30. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/commands/registry.py +33 -10
  31. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/commands/types.py +6 -0
  32. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/console/cli.py +66 -10
  33. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/console/commands/packages.py +13 -4
  34. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/console/commands/update.py +43 -10
  35. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/core/registry.py +2 -0
  36. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/engine/service.py +84 -103
  37. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/engine/types.py +3 -2
  38. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/extensions/__init__.py +6 -2
  39. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/extensions/api.py +22 -5
  40. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/extensions/context.py +100 -11
  41. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/extensions/loader.py +43 -0
  42. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/extensions/runtime.py +15 -0
  43. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/__init__.py +12 -0
  44. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/engine.py +21 -0
  45. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/service.py +7 -6
  46. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/session.py +49 -2
  47. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/types.py +12 -0
  48. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/anthropic_claude_code.py +1 -0
  49. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/anthropic_messages.py +1 -0
  50. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/anthropic_vertex.py +1 -0
  51. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/gemini_generate.py +2 -0
  52. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/github_copilot_chat.py +1 -0
  53. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/google_antigravity.py +1 -0
  54. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/google_vertex.py +3 -3
  55. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/mistral_chat.py +1 -0
  56. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/openai_codex_responses.py +1 -0
  57. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/openai_completions.py +1 -0
  58. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/openai_responses.py +1 -0
  59. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/openai_vertex.py +1 -3
  60. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/service.py +14 -0
  61. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/model/types.py +3 -4
  62. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/types.py +1 -0
  63. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/utils.py +1 -0
  64. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/message/types.py +1 -0
  65. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/message/utils.py +5 -2
  66. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/agent_hooks.py +8 -8
  67. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/app.py +107 -53
  68. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/appearance.py +63 -82
  69. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/auth.py +14 -4
  70. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/extensions.py +1 -3
  71. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/session.py +9 -5
  72. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/config_selector.py +13 -5
  73. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/extension_selector.py +1 -1
  74. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/layout.py +37 -218
  75. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/message_list.py +140 -28
  76. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/model_selector.py +6 -6
  77. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/oauth_selector.py +6 -2
  78. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/overlays.py +3 -2
  79. tau_coding_agent-0.4.6/tau/modes/interactive/components/selector_controller.py +203 -0
  80. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/session_selector.py +1 -0
  81. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/settings_selector.py +4 -3
  82. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/theme_selector.py +3 -4
  83. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/thinking_selector.py +8 -7
  84. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/tree_selector.py +1 -2
  85. tau_coding_agent-0.4.0/tau/tui/input.py → tau_coding_agent-0.4.6/tau/modes/interactive/input_handler.py +20 -944
  86. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/rpc/mode.py +8 -8
  87. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/packages/manager.py +68 -5
  88. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/packages/types.py +1 -0
  89. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/packages/utils.py +50 -5
  90. tau_coding_agent-0.4.6/tau/resources/__init__.py +18 -0
  91. tau_coding_agent-0.4.6/tau/resources/loader.py +480 -0
  92. tau_coding_agent-0.4.6/tau/resources/types.py +57 -0
  93. tau_coding_agent-0.4.6/tau/runtime/dependencies.py +58 -0
  94. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/runtime/service.py +423 -133
  95. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/runtime/types.py +212 -95
  96. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/session/branch_summarization.py +74 -32
  97. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/session/compaction.py +111 -22
  98. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/session/manager.py +79 -47
  99. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/session/utils.py +5 -1
  100. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/settings/manager.py +12 -3
  101. tau_coding_agent-0.4.6/tau/settings/paths.py +347 -0
  102. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/settings/types.py +8 -1
  103. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/skills/registry.py +1 -1
  104. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/themes/loader.py +10 -12
  105. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/themes/registry.py +25 -0
  106. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tool/registry.py +27 -15
  107. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tool/types.py +10 -1
  108. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/trust/manager.py +6 -4
  109. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/trust/utils.py +2 -4
  110. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/autocomplete.py +6 -4
  111. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/components/editor.py +1 -0
  112. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/components/select_list.py +2 -4
  113. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/components/spinner.py +5 -0
  114. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/components/text_input.py +23 -3
  115. tau_coding_agent-0.4.6/tau/tui/input.py +933 -0
  116. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/keybinding_hints.py +1 -0
  117. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/markdown.py +13 -7
  118. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/terminal.py +0 -1
  119. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/tui.py +25 -2
  120. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/ui_context.py +21 -4
  121. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/utils.py +8 -9
  122. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6/tau_coding_agent.egg-info}/PKG-INFO +3 -3
  123. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau_coding_agent.egg-info/SOURCES.txt +22 -0
  124. tau_coding_agent-0.4.6/tests/test_agent_compaction.py +264 -0
  125. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_agent_types.py +4 -1
  126. tau_coding_agent-0.4.6/tests/test_branch_navigation.py +127 -0
  127. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_branch_summarization.py +105 -11
  128. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_builtin_tools.py +217 -75
  129. tau_coding_agent-0.4.6/tests/test_cli_inputs.py +40 -0
  130. tau_coding_agent-0.4.6/tests/test_command_execution_policy.py +55 -0
  131. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_command_registry.py +17 -1
  132. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_compaction.py +111 -8
  133. tau_coding_agent-0.4.6/tests/test_engine_execution.py +78 -0
  134. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_engine_steering.py +10 -0
  135. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_extension_api.py +198 -0
  136. tau_coding_agent-0.4.6/tests/test_extension_lifecycle.py +234 -0
  137. tau_coding_agent-0.4.6/tests/test_footer_model.py +86 -0
  138. tau_coding_agent-0.4.6/tests/test_package_resources.py +66 -0
  139. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_packages_utils.py +40 -5
  140. tau_coding_agent-0.4.6/tests/test_resource_loader.py +334 -0
  141. tau_coding_agent-0.4.6/tests/test_runtime_sdk.py +286 -0
  142. tau_coding_agent-0.4.6/tests/test_selector_controller.py +36 -0
  143. tau_coding_agent-0.4.6/tests/test_session_manager.py +97 -0
  144. tau_coding_agent-0.4.6/tests/test_text_input.py +17 -0
  145. tau_coding_agent-0.4.6/tests/test_thinking_render.py +53 -0
  146. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_tool_registry.py +12 -0
  147. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_tool_render.py +37 -0
  148. tau_coding_agent-0.4.6/tests/test_ui_context.py +42 -0
  149. tau_coding_agent-0.4.0/docs/python-api.md +0 -266
  150. tau_coding_agent-0.4.0/tau/settings/paths.py +0 -171
  151. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/LICENSE +0 -0
  152. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/MANIFEST.in +0 -0
  153. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
  154. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/auth.md +0 -0
  155. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/development.md +0 -0
  156. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/docs.json +0 -0
  157. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/extension-settings.md +0 -0
  158. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/http-proxy.md +0 -0
  159. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/index.md +0 -0
  160. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/inference-providers.md +0 -0
  161. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/installation.md +0 -0
  162. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/project-context.md +0 -0
  163. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/prompts.md +0 -0
  164. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/quickstart.md +0 -0
  165. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/skills.md +0 -0
  166. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/docs/themes.md +0 -0
  167. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/setup.cfg +0 -0
  168. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/__init__.py +0 -0
  169. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/agent/__init__.py +0 -0
  170. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/agent/prompt/__init__.py +0 -0
  171. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/auth/manager.py +0 -0
  172. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/auth/storage.py +0 -0
  173. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/auth/types.py +0 -0
  174. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/__init__.py +0 -0
  175. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/commands/__init__.py +0 -0
  176. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/commands/clear.py +0 -0
  177. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/commands/compact.py +0 -0
  178. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/commands/reload.py +0 -0
  179. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/commands/session.py +0 -0
  180. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/extensions/footer/git.py +0 -0
  181. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/extensions/footer/utils.py +0 -0
  182. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/extensions/header/__init__.py +1 -1
  183. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/models/__init__.py +0 -0
  184. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/models/audio.py +0 -0
  185. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/models/image.py +0 -0
  186. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/models/video.py +0 -0
  187. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/prompts/commit.md +0 -0
  188. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/prompts/docs.md +0 -0
  189. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/prompts/explain.md +0 -0
  190. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/prompts/fix.md +0 -0
  191. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/prompts/refactor.md +0 -0
  192. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/prompts/review.md +0 -0
  193. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/prompts/test.md +0 -0
  194. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/providers/__init__.py +0 -0
  195. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/providers/audio.py +0 -0
  196. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/providers/image.py +0 -0
  197. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/providers/text.py +0 -0
  198. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/providers/video.py +0 -0
  199. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/skills/code-review/SKILL.md +0 -0
  200. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/skills/debug/SKILL.md +0 -0
  201. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/skills/git-commit/SKILL.md +0 -0
  202. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/themes/dark.yaml +0 -0
  203. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/themes/light.yaml +0 -0
  204. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/builtins/tools/__init__.py +0 -0
  205. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/commands/__init__.py +0 -0
  206. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/console/__init__.py +0 -0
  207. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/console/commands/__init__.py +0 -0
  208. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/console/commands/auth.py +0 -0
  209. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/core/__init__.py +0 -0
  210. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/engine/__init__.py +0 -0
  211. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/extensions/settings.py +0 -0
  212. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/inference.py +0 -0
  213. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/runtime.py +0 -0
  214. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/hooks/tui.py +0 -0
  215. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/__init__.py +0 -0
  216. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/__init__.py +0 -0
  217. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/__init__.py +0 -0
  218. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/base.py +0 -0
  219. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/builtins.py +0 -0
  220. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
  221. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/gemini_audio.py +0 -0
  222. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/openai_audio.py +0 -0
  223. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/registry.py +0 -0
  224. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/sarvam_audio.py +0 -0
  225. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/service.py +0 -0
  226. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/audio/utils.py +0 -0
  227. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/availability.py +0 -0
  228. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/__init__.py +0 -0
  229. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/base.py +0 -0
  230. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/builtins.py +0 -0
  231. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/gemini_image.py +0 -0
  232. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/openai_image.py +0 -0
  233. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/openrouter.py +0 -0
  234. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/registry.py +0 -0
  235. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/image/service.py +0 -0
  236. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/registry.py +0 -0
  237. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/__init__.py +0 -0
  238. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/base.py +0 -0
  239. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/builtins.py +0 -0
  240. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/ollama_chat.py +0 -0
  241. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/registry.py +0 -0
  242. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/types.py +0 -0
  243. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/text/utils.py +0 -0
  244. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/video/__init__.py +0 -0
  245. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/video/base.py +0 -0
  246. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/video/builtins.py +0 -0
  247. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/video/fal_video.py +0 -0
  248. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/video/openrouter_video.py +0 -0
  249. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/video/registry.py +0 -0
  250. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/api/video/service.py +0 -0
  251. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/model/__init__.py +0 -0
  252. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/model/registry.py +0 -0
  253. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/__init__.py +0 -0
  254. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/__init__.py +0 -0
  255. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
  256. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/github_copilot.py +0 -0
  257. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/google_antigravity.py +0 -0
  258. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/openai_codex.py +0 -0
  259. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/pkce.py +0 -0
  260. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/types.py +0 -0
  261. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/oauth/utils.py +0 -0
  262. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/registry.py +0 -0
  263. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/inference/provider/types.py +0 -0
  264. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/message/__init__.py +0 -0
  265. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/__init__.py +0 -0
  266. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/__init__.py +0 -0
  267. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/__init__.py +0 -0
  268. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/context.py +1 -1
  269. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/misc.py +0 -0
  270. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/commands/model.py +0 -0
  271. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/__init__.py +0 -0
  272. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/command_palette.py +0 -0
  273. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/file_picker.py +1 -1
  274. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/interactive/components/trust_screen.py +0 -0
  275. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/print/__init__.py +0 -0
  276. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/rpc/__init__.py +0 -0
  277. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/modes/rpc/types.py +0 -0
  278. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/packages/__init__.py +0 -0
  279. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/prompts/expand.py +0 -0
  280. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/prompts/loader.py +0 -0
  281. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/prompts/registry.py +0 -0
  282. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/prompts/types.py +0 -0
  283. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/session/types.py +0 -0
  284. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/settings/storage.py +0 -0
  285. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/settings/utils.py +0 -0
  286. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/skills/loader.py +0 -0
  287. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/skills/types.py +0 -0
  288. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/themes/types.py +0 -0
  289. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tool/__init__.py +0 -0
  290. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tool/render.py +0 -0
  291. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/trust/__init__.py +0 -0
  292. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/trust/types.py +0 -0
  293. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/__init__.py +0 -0
  294. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/component.py +0 -0
  295. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/components/__init__.py +0 -0
  296. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/components/box.py +1 -1
  297. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/components/image.py +0 -0
  298. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/tui/theme.py +0 -0
  299. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/utils/__init__.py +0 -0
  300. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/utils/http_proxy.py +0 -0
  301. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/utils/image_processing.py +0 -0
  302. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/utils/secrets.py +0 -0
  303. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau/utils/version_check.py +0 -0
  304. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
  305. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau_coding_agent.egg-info/entry_points.txt +0 -0
  306. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau_coding_agent.egg-info/requires.txt +0 -0
  307. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tau_coding_agent.egg-info/top_level.txt +0 -0
  308. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_agent_prompt.py +0 -0
  309. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_ansi.py +0 -0
  310. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_auth_command.py +0 -0
  311. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_auth_manager.py +0 -0
  312. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_auth_storage.py +0 -0
  313. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_diff.py +0 -0
  314. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_editor_protocol.py +0 -0
  315. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_engine_types.py +0 -0
  316. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_footer_utils.py +0 -0
  317. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_fuzzy.py +0 -0
  318. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_http_proxy.py +0 -0
  319. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_image_processing.py +0 -0
  320. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_inference_api_text_utils.py +0 -0
  321. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_inference_error_utils.py +0 -0
  322. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_inference_types.py +0 -0
  323. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_inference_utils.py +0 -0
  324. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_keybindings.py +0 -0
  325. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_markdown.py +0 -0
  326. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_message_types.py +0 -0
  327. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_message_utils.py +0 -0
  328. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_model_availability.py +0 -0
  329. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_model_registry.py +0 -0
  330. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_model_selector_modal.py +0 -0
  331. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_model_types.py +0 -0
  332. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_oauth_utils.py +0 -0
  333. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_pkce.py +0 -0
  334. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_prompts_expand.py +0 -0
  335. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_prompts_loader.py +0 -0
  336. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_prompts_registry.py +0 -0
  337. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_provider_registry.py +0 -0
  338. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_rpc_mode.py +0 -0
  339. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_secrets.py +0 -0
  340. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_session_trust_persist.py +0 -0
  341. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_session_types.py +0 -0
  342. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_session_utils.py +0 -0
  343. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_settings_manager.py +0 -0
  344. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_settings_paths.py +0 -0
  345. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_settings_storage.py +0 -0
  346. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_settings_utils.py +0 -0
  347. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_skills_loader.py +0 -0
  348. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_skills_registry.py +0 -0
  349. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_text_llm_invoke.py +0 -0
  350. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_theme_loader.py +0 -0
  351. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_themes_registry.py +0 -0
  352. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_trust_manager.py +0 -0
  353. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_trust_utils.py +0 -0
  354. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_tui_capabilities.py +0 -0
  355. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_tui_input.py +0 -0
  356. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_tui_layout_sizing.py +0 -0
  357. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_tui_theme.py +0 -0
  358. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_tui_utils.py +0 -0
  359. {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.6}/tests/test_version_check.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tau-coding-agent
3
- Version: 0.4.0
3
+ Version: 0.4.6
4
4
  Summary: A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands
5
5
  Requires-Python: >=3.12
6
6
  Description-Content-Type: text/markdown
@@ -32,10 +32,10 @@ Dynamic: license-file
32
32
 
33
33
  # Tau (τ)
34
34
 
35
- A Python reimplementation of [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
35
+ Inspired by [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
36
36
 
37
37
  <p align="center">
38
- <img src="assets/tui.png" alt="Tau TUI" width="700">
38
+ <img src="assets/tui.jpeg" alt="Tau TUI" width="700">
39
39
  </p>
40
40
 
41
41
  Start a conversation with the agent in the terminal.
@@ -1,9 +1,9 @@
1
1
  # Tau (τ)
2
2
 
3
- A Python reimplementation of [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
3
+ Inspired by [Pi](https://pi.dev), **Tau** brings the same agent framework capabilities to Python developers. A self-extensible agent CLI with a terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools, commands, and customization.
4
4
 
5
5
  <p align="center">
6
- <img src="assets/tui.png" alt="Tau TUI" width="700">
6
+ <img src="assets/tui.jpeg" alt="Tau TUI" width="700">
7
7
  </p>
8
8
 
9
9
  Start a conversation with the agent in the terminal.
@@ -70,6 +70,7 @@ User input flows through these stages:
70
70
  |--------|---------|
71
71
  | `session/` | Session JSONL persistence, compaction, branching |
72
72
  | `settings/` | Configuration from JSON files |
73
+ | `resources/` | Unified discovery of extensions, skills, prompts, and themes |
73
74
  | `auth/` | Credential storage and resolution |
74
75
  | `message/` | Message type definitions |
75
76
  | `trust/` | Trust and permission checks |
@@ -97,23 +98,25 @@ User input flows through these stages:
97
98
 
98
99
  | Module | Purpose |
99
100
  |--------|---------|
100
- | `packages/` | Package/dependency management (reserved) |
101
+ | `packages/` | Installed package and dependency management |
101
102
  | `rpc/` | JSON-RPC protocol for IDE integration |
102
103
 
103
104
  ## Agent Execution State Machine
104
105
 
105
- The agent has three main states:
106
+ The agent has four observable phases:
106
107
 
107
108
  ```
108
109
  IDLE ──user input──> TURN ──no more tool calls──> IDLE
109
- ↑ ↓
110
- └─ tool results ─┘
110
+ ├── manual/auto compact ──> COMPACTION ──> previous phase
111
+ └── tree navigation ──────> BRANCH_SUMMARY ──> IDLE
111
112
  ```
112
113
 
113
114
  | State | Meaning |
114
115
  |-------|---------|
115
116
  | `IDLE` | No active inference; waiting for user input |
116
117
  | `TURN` | Processing a turn: calling inference, executing tools |
118
+ | `COMPACTION` | Generating or applying a context compaction summary |
119
+ | `BRANCH_SUMMARY` | Generating or applying a branch-navigation summary |
117
120
 
118
121
  The state is exposed via `AgentPhase` enum in `agent/types.py` and accessible to extensions via hooks.
119
122
 
@@ -126,14 +129,24 @@ Each agent turn follows this sequence:
126
129
  2. Add message to session
127
130
  3. Call inference (LLM API)
128
131
  4. Collect tool calls from response
129
- 5. Execute tools (in parallel if possible)
132
+ 5. Execute tools concurrently only when every call in the batch is marked parallel
130
133
  6. Add tool results to context
131
134
  7. Call inference again (only if tools were called)
132
135
  8. Render all messages and results (TUI)
133
136
  9. Save session to disk
134
- 10. Fire completion hooks
137
+ 10. Run post-turn compaction and drain messages queued by lifecycle handlers
138
+ 11. Fire the settled hook
135
139
  ```
136
140
 
141
+ TUI overlays participate in focus lifecycle. Hiding or closing a capturing
142
+ overlay restores the next visible overlay or its previous focus target.
143
+ Components exposing `dispose()` are disposed when their overlay closes.
144
+
145
+ Slash commands declare whether they require an idle agent. Idle-only commands
146
+ are deferred until the current turn settles; UI-only and read-only commands may
147
+ opt into immediate dispatch during a turn. Normal Enter input remains steering,
148
+ and Alt+Enter remains a post-turn follow-up message.
149
+
137
150
  ## Message Types and Context
138
151
 
139
152
  Messages in sessions are typed:
@@ -204,12 +217,37 @@ Tools are executed in a sandboxed environment:
204
217
  6. Result is serialized and added to context
205
218
  ```
206
219
 
207
- Built-in tools (bash, read, write, edit, glob, grep, ls) are always available. Custom tools are registered via extensions.
220
+ Built-in tools (bash, read, write, edit, glob, grep, ls) are enabled by default.
221
+ `RuntimeConfig` can allow or exclude tools by name. Custom tools are registered
222
+ via extensions or passed directly to the runtime.
223
+
224
+ Programmatic runtimes can replace constructed services through
225
+ `RuntimeDependencies`. Typed factories cover settings, LLM/model/auth wiring,
226
+ session storage, hooks, and the tool registry. Session-bound factories run
227
+ again when the active session is replaced.
228
+
229
+ `Runtime.create_with_result()` returns the initialized runtime together with
230
+ resource diagnostics, extension errors, and requested-versus-selected
231
+ model/provider resolution. `Runtime.create()` remains the convenience API when
232
+ the caller does not need startup details.
233
+
234
+ Extension reloads pass through a serialized coordinator. Callback-triggered or
235
+ mid-turn requests wait until extension dispatch and the agent lifecycle settle.
236
+ Runtime generations invalidate contexts captured before reload, session
237
+ replacement, or shutdown, and shutdown detaches the extension runtime from its
238
+ hook bus.
208
239
 
209
240
  ## Extension Points
210
241
 
211
242
  Tau is designed to be extended without modifying core code. Key extension points via the `tau` parameter in `register()`:
212
243
 
244
+ Resource discovery is centralized behind the replaceable `ResourceLoader`
245
+ protocol. `DefaultResourceLoader` supports per-resource overrides. Startup and
246
+ `/reload` consume one `ResourceSnapshot`, keeping extensions, skills, prompts,
247
+ themes, context files, and structured diagnostics consistent. Diagnostics
248
+ identify invalid configured paths, package manifests/resources, hook paths, and
249
+ context read failures without preventing valid resources from loading.
250
+
213
251
  ### Tools
214
252
 
215
253
  Register custom tools that the agent can call:
@@ -6,17 +6,21 @@
6
6
  tau [OPTIONS] [MESSAGE]
7
7
  ```
8
8
 
9
- `MESSAGE` is an optional positional argument. When provided with `--print` or `--mode print`, it is the prompt to run.
9
+ Use `--prompt TEXT` for a non-interactive prompt. Piped stdin can supply or
10
+ augment it.
10
11
 
11
12
  ## Options
12
13
 
13
14
  | Option | Short | Description |
14
15
  |--------|-------|-------------|
15
- | `--provider` | `-p` | Provider to use, e.g. `anthropic`, `openai`, `groq` |
16
- | `--model` | `-m` | Model ID, or `provider/model` shorthand (e.g. `groq/llama-3.3-70b-versatile`) |
16
+ | `--prompt` | `-p` | Run a non-interactive prompt |
17
+ | `--provider` | | Provider to use, e.g. `anthropic`, `openai`, `groq` |
18
+ | `--model` | | Model ID, or `provider/model` shorthand (e.g. `groq/llama-3.3-70b-versatile`) |
17
19
  | `--theme` | `-t` | UI theme: `default`, `dracula`, `nord`, `gruvbox`, `catppuccin`, `ayu-dark`, `everforest`, `horizon`, `kanagawa`, `material-ocean`, `monokai`, `night-owl`, `one-dark`, `rose-pine`, `solarized-dark`, `tokyo-night`, or a custom name |
18
- | `--resume` | `-r` | Resume the most recent session |
19
- | `--session` | `-s` | Resume a specific session by ID or file path |
20
+ | `--resume [ID]` | `-r` | Resume the most recent or a specified session |
21
+ | `--fork ID` | | Fork a specified session at startup |
22
+ | `--session-dir PATH` | | Override session storage |
23
+ | `--name NAME` | | Set the session display name at startup |
20
24
  | `--ephemeral` | `-e` | Don't save this session to disk |
21
25
  | `--approve` | `-a` | Trust project-local files (extensions, settings, context files) for this run |
22
26
  | `--no-approve` | `-na` | Don't trust project-local files for this run |
@@ -42,10 +46,14 @@ tau --model claude-sonnet-4-6
42
46
  Run a single prompt, print the response, and exit:
43
47
 
44
48
  ```bash
45
- tau --print "Summarize this repo"
46
- tau -p anthropic --print "What is this file?"
49
+ tau --prompt "Summarize this repo"
50
+ cat README.md | tau --print --prompt "Summarize this text"
51
+ tau --prompt "Compare these files" @src/old.py @src/new.py
47
52
  ```
48
53
 
54
+ Piped text, attached file contents, and the explicit prompt are combined in
55
+ that order.
56
+
49
57
  ### JSON mode
50
58
 
51
59
  Emit a JSON event stream on stdout:
@@ -3,6 +3,12 @@
3
3
  Extensions are plain Python files that hook into tau's lifecycle. Each one exports
4
4
  a single `register(tau)` function — everything is wired up there.
5
5
 
6
+ Extension tools and commands may shadow built-ins while loaded. Tau retains the
7
+ shadowed source layer, so disabling or reloading the extension restores the
8
+ previous implementation. Reload also replaces extension message renderers,
9
+ autocomplete providers, shortcuts, and published services; do not retain
10
+ service objects across reload.
11
+
6
12
  ## File locations
7
13
 
8
14
  tau loads extensions from three sources, in this order:
@@ -36,6 +42,41 @@ dependencies with incompatible versions. The install only runs once — a hash o
36
42
  the dependency list is cached, so unchanged manifests are a no-op on subsequent
37
43
  launches.
38
44
 
45
+ ## Installable resource packages
46
+
47
+ `tau install` accepts PyPI names, pip-compatible Git URLs, local distributions,
48
+ and direct wheel or source-archive URLs:
49
+
50
+ ```bash
51
+ tau install pypi:tau-tools==1.2.3
52
+ tau install git+ssh://git@github.com/example/tau-tools.git@v1
53
+ tau install ./dist/tau_tools-1.2.3-py3-none-any.whl
54
+ tau install https://packages.example.com/tau_tools-1.2.3-py3-none-any.whl
55
+ tau install tau-tools==1.2.3 --index-url https://packages.example.com/simple
56
+ ```
57
+
58
+ Repeat `--extra-index-url URL` to resolve dependencies from additional indexes.
59
+ Index configuration is retained for future updates.
60
+
61
+ Packages can bundle extensions, skills, prompts, and themes:
62
+
63
+ ```json
64
+ {
65
+ "tau": {
66
+ "extensions": ["extensions/main.py"],
67
+ "skills": ["skills"],
68
+ "prompts": ["prompts"],
69
+ "themes": ["themes"]
70
+ }
71
+ }
72
+ ```
73
+
74
+ Conventional resource directories are discovered when a manifest field is
75
+ omitted. Package entries in `settings.json` support an `enabled` switch and
76
+ optional `extensions`, `skills`, `prompts`, and `themes` path filters. An empty
77
+ filter disables that resource type. Use `tau update --all` to update Tau and
78
+ all installed packages.
79
+
39
80
  ## Entry point
40
81
 
41
82
  Every extension must export a `register(tau)` function:
@@ -48,6 +89,34 @@ def register(tau):
48
89
  pass
49
90
  ```
50
91
 
92
+ ### Inline extension factories
93
+
94
+ Python API users can supply the same registration function directly through
95
+ `RuntimeConfig`, without creating or installing an extension file:
96
+
97
+ ```python
98
+ from tau.extensions import ExtensionAPI
99
+ from tau.runtime.types import RuntimeConfig
100
+
101
+ def configure(tau: ExtensionAPI) -> None:
102
+ tau.register_tool(MyTool())
103
+ tau.append_prompt("Use the embedding application's workflow.")
104
+
105
+ config = RuntimeConfig(
106
+ cwd=Path.cwd(),
107
+ extension_factories=[configure],
108
+ )
109
+ ```
110
+
111
+ Inline factories receive the normal `ExtensionAPI`, can be synchronous or
112
+ asynchronous, and load after file-based extensions. They participate in the
113
+ same tool, command, hook, provider, service, prompt, theme, and UI registration
114
+ systems. Factory failures are isolated and reported as `ExtensionError`.
115
+
116
+ `/reload` unloads the old inline extensions and executes the factories again,
117
+ preventing duplicate hook subscriptions. Session replacement reuses the active
118
+ extension runtime and does not rerun factories.
119
+
51
120
  `register` may be `async` if setup requires awaiting:
52
121
 
53
122
  ```python
@@ -212,9 +281,17 @@ def register(tau):
212
281
 
213
282
  #### Agent state
214
283
 
284
+ | Property | Type | Description |
285
+ |----------|------|-------------|
286
+ | `ctx.phase` | `AgentPhase` | Current lifecycle phase: `idle`, `turn`, `compaction`, or `branch_summary` |
287
+ | `ctx.streaming_message` | `AssistantMessage \| None` | Current partial assistant response |
288
+ | `ctx.pending_tool_call_ids` | `frozenset[str]` | Snapshot of tool calls that have started but not finished |
289
+ | `ctx.error_message` | `str \| None` | Most recent engine error |
290
+ | `ctx.queued_messages` | `dict[str, list[LLMMessage]]` | Snapshots of the steering and follow-up queues |
291
+
215
292
  | Method | Returns | Description |
216
293
  |--------|---------|-------------|
217
- | `ctx.is_idle()` | `bool` | `True` when the agent is not currently streaming a response |
294
+ | `ctx.is_idle()` | `bool` | `True` when `ctx.phase` is `AgentPhase.IDLE` |
218
295
  | `ctx.abort()` | — | Cancel the current agent turn; no-op if already idle |
219
296
  | `ctx.shutdown()` | — | Exit tau gracefully |
220
297
  | `ctx.get_context_usage()` | `dict \| None` | Token usage info (see below) |
@@ -224,6 +301,13 @@ def register(tau):
224
301
  | `ctx.signal` | `asyncio.Event \| None` | The current abort signal while the agent is streaming; the event is set when the turn is aborted. `None` when idle |
225
302
  | `ctx.get_system_prompt_options()` | `dict` | Metadata about how the active system prompt was assembled — keys: `skills`, `prompts`, `tools`, `system_prompt_length` |
226
303
 
304
+ Extensions can inject a user message with
305
+ `await ctx.send_user_message(content, deliver_as="steer", trigger_turn=False)`.
306
+ Set `trigger_turn=True` to start a new turn immediately when the agent is idle;
307
+ while it is busy, the message is queued using the selected delivery mode. In
308
+ interactive mode, an immediately triggered message is rendered as a normal user
309
+ message before the assistant response.
310
+
227
311
  `get_context_usage()` returns a dict with three keys, or `None` if token data is not yet available (e.g. immediately after compaction, before the next LLM response):
228
312
 
229
313
  ```python
@@ -251,7 +335,7 @@ These methods are `async` and are available in both event handlers and command h
251
335
 
252
336
  | Method | Returns | Description |
253
337
  |--------|---------|-------------|
254
- | `await ctx.wait_for_idle()` | — | Suspend until the agent finishes its current turn |
338
+ | `await ctx.wait_for_idle()` | — | Suspend until the active invocation and its post-run save/compaction processing finish |
255
339
  | `await ctx.new_session()` | `{"cancelled": bool}` | Start a fresh session |
256
340
  | `await ctx.fork(entry_id)` | `{"cancelled": bool}` | Fork from a specific session entry |
257
341
  | `await ctx.navigate_tree(target_id, summarize=False, custom_instructions=None)` | `{"cancelled": bool}` | Jump to another branch in the session tree |
@@ -297,12 +381,30 @@ async def cmd(ctx, args):
297
381
  ctx.compact(custom_instructions="Keep only the final conclusions.")
298
382
  ```
299
383
 
300
- `navigate_tree` optionally generates a branch summary before switching:
384
+ `navigate_tree` optionally generates a branch summary and attaches it to the
385
+ destination branch. If summary generation fails, navigation still completes
386
+ without a summary:
301
387
 
302
388
  ```python
303
389
  result = await ctx.navigate_tree(target_id, summarize=True)
304
390
  ```
305
391
 
392
+ Extensions can replace the default branch-summary model call:
393
+
394
+ ```python
395
+ from tau.hooks import SessionBeforeTreeResult
396
+
397
+ def register(tau):
398
+ @tau.on("session_before_tree")
399
+ async def summarize(event, ctx):
400
+ entries = event.preparation.entries_to_summarize
401
+ summary = await my_summarizer(entries)
402
+ return SessionBeforeTreeResult(
403
+ summary=summary,
404
+ summary_details={"source": "my-extension"},
405
+ )
406
+ ```
407
+
306
408
  #### `branch_entries` vs `session_entries`
307
409
 
308
410
  The session file stores entries from every branch ever taken — forks, navigations, abandoned paths. `session_entries` returns all of them. `branch_entries` returns only the linear path from the root to the current leaf — the entries actually in scope for the current conversation.
@@ -359,7 +461,11 @@ def register(tau):
359
461
  | `session_shutdown` | `reason`, `target_session_file` | — | Session about to close — last chance for cleanup |
360
462
  | `session_before_switch` | `reason`, `target_session_file` | `SessionBeforeSwitchResult` | About to replace the active session — return `cancel=True` to block |
361
463
  | `session_before_fork` | `entry_id`, `position` | `SessionBeforeForkResult` | About to create a branch — return `cancel=True` to block |
362
- | `session_before_tree` | `preparation` | `SessionBeforeTreeResult` | About to rewrite the session tree (branch navigation). Mutate `preparation` or return `cancel=True` |
464
+ | `session_before_tree` | `preparation` | `SessionBeforeTreeResult` | About to rewrite the tree. Return `summary=` and optional `summary_details=` to replace default summarization, or `cancel=True` to block |
465
+ | `branch_summary_start` | `old_leaf_id`, `target_id`, `from_extension` | — | Branch summarization begins |
466
+ | `branch_summary_end` | `old_leaf_id`, `target_id`, `summary_entry_id`, `summary_length`, `from_extension` | — | Summary attached to the destination |
467
+ | `branch_summary_failure` | `old_leaf_id`, `target_id`, `error` | — | Summary failed; navigation continues without it |
468
+ | `branch_summary_cancelled` | `old_leaf_id`, `target_id`, `reason` | — | Summary or navigation was cancelled |
363
469
  | `session_tree` | `new_leaf_id`, `old_leaf_id`, `from_extension` | — | Session tree has been rewritten with the new active leaf |
364
470
 
365
471
  **Agent & turn lifecycle**
@@ -372,7 +478,7 @@ def register(tau):
372
478
  | `agent_error` | `error` | — | Engine terminated with an unrecoverable error |
373
479
  | `turn_start` | `turn_index`, `timestamp` | — | New LLM inference turn begins |
374
480
  | `turn_end` | `turn_index`, `message`, `tool_results` | — | Turn completes with assistant message and tool results |
375
- | `settled` | — | — | Agent finishes a `prompt()` call with no more queued turns the agent is fully idle |
481
+ | `settled` | — | — | The invocation completed queued turns and post-run compaction with no messages currently queued; this is an observation, not a lock against concurrent submissions |
376
482
 
377
483
  **Input**
378
484
 
@@ -425,9 +531,11 @@ def register(tau):
425
531
 
426
532
  | Event | Payload fields | Result type | Description |
427
533
  |-------|---------------|-------------|-------------|
428
- | `before_compaction` | `preparation`, `entries`, `manual` | `BeforeCompactionResult` | Before the LLM summarisation call see [Custom Compaction](#custom-compaction) |
429
- | `compaction_start` | `manual` | — | Compaction begins (after `before_compaction` passes) |
430
- | `compaction_end` | `manual`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction finished |
534
+ | `before_compaction` | `preparation`, `entries`, `manual`, `reason`, `will_retry` | `BeforeCompactionResult` | Before summarization; may cancel or provide a complete compaction |
535
+ | `compaction_start` | `manual`, `reason`, `will_retry` | — | Compaction begins after interception |
536
+ | `compaction_end` | `manual`, `reason`, `will_retry`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction succeeds |
537
+ | `compaction_failure` | `manual`, `reason`, `will_retry`, `error` | — | Compaction fails |
538
+ | `compaction_cancelled` | `manual`, `reason`, `will_retry` | — | An extension cancels compaction |
431
539
 
432
540
  **Model & settings**
433
541
 
@@ -706,7 +814,7 @@ def register(tau):
706
814
  | Method | Description |
707
815
  |--------|-------------|
708
816
  | `tau.register_tool(tool)` | Add a tool the agent can call |
709
- | `tau.register_command(name, desc, handler, aliases=[], get_argument_completions=None)` | Add a `/name` slash command with optional argument tab-completion |
817
+ | `tau.register_command(name, desc, handler, aliases=[], get_argument_completions=None, argument_hint=None, requires_idle=True)` | Add a `/name` slash command; set `requires_idle=False` only for UI-only or read-only handlers safe during an active turn |
710
818
  | `tau.on(event, handler)` / `@tau.on(event)` | Subscribe to a lifecycle event |
711
819
  | `tau.register_shortcut(key, desc, handler)` | Bind a keyboard shortcut |
712
820
  | `tau.append_prompt(text)` | Append text to the system prompt |
@@ -1343,6 +1451,18 @@ async def on_start(event, ctx):
1343
1451
  `/reload` re-discovers and hot-reloads all extensions, skills, prompts, and
1344
1452
  settings without restarting the session.
1345
1453
 
1454
+ Reload requests are serialized. A request made from an extension callback or
1455
+ while the agent is processing is queued until the callback pipeline and complete
1456
+ agent lifecycle settle. Multiple queued requests are coalesced. Consequently,
1457
+ `await ctx.reload()` acknowledges a request but does not guarantee that a
1458
+ deferred reload has already completed.
1459
+
1460
+ Contexts are generation-bound. An `ExtensionContext` captured before `/reload`,
1461
+ `/new`, `/resume`, `/clone`, or runtime shutdown raises
1462
+ `StaleExtensionContextError` when reused. Do not retain contexts in long-lived
1463
+ background tasks; capture immutable values or acquire a fresh context from a
1464
+ new callback.
1465
+
1346
1466
  **What gets picked up:**
1347
1467
  - New or modified extension files
1348
1468
  - New or modified skill and prompt template files
@@ -1352,10 +1472,16 @@ settings without restarting the session.
1352
1472
  **What persists across reload:**
1353
1473
  - The current session (messages, branching state)
1354
1474
  - Auth credentials
1355
- - Any runtime state your extension stored outside its module (e.g. in a global variable — module globals are re-created on reload)
1475
+ - Normally imported third-party Python modules, which remain cached in `sys.modules`
1476
+ - External state not explicitly released by the extension
1356
1477
 
1357
1478
  **What resets:**
1358
1479
  - All registered tools, commands, shortcuts, and event handlers — re-registered from scratch
1359
1480
  - The system prompt — rebuilt from SYSTEM.md and all `append_prompt` calls
1481
+ - Extension entry-module globals and inline factory state
1482
+
1483
+ Tau emits `extension_unload` before replacing an extension runtime and
1484
+ `runtime_stop` before shutdown. Use those events to release subprocesses,
1485
+ background tasks, sockets, and registrations outside Tau.
1360
1486
 
1361
1487
  After reload, new tools are available to the model immediately in the next turn.
@@ -13,7 +13,7 @@
13
13
  | Ctrl+K | Kill to end of line |
14
14
  | Ctrl+W | Delete previous word |
15
15
  | Ctrl+A / Home | Move to line start |
16
- | Ctrl+E / End | Move to line end |
16
+ | Ctrl+E / End | Move to line end (Ctrl+E falls through to the app when input is empty) |
17
17
  | Delete / Ctrl+D | Delete character at cursor |
18
18
 
19
19
  ### Message Queue
@@ -30,7 +30,8 @@
30
30
  | Escape | Abort current turn; restore queued messages |
31
31
  | Ctrl+C | Abort turn; double-press to quit |
32
32
  | Ctrl+D | Quit (on empty input) |
33
- | Ctrl+O | Toggle expand/collapse for template blocks |
33
+ | Ctrl+O | Toggle expand/collapse for thinking and tool-result blocks |
34
+ | Ctrl+E | Toggle template and skill blocks when the editor is empty |
34
35
 
35
36
  ### Pickers (model, theme, command palette)
36
37
 
@@ -52,12 +53,14 @@
52
53
  Pass a `KeyMap` to `App.create()` at startup:
53
54
 
54
55
  ```python
55
- from tau.tui.keybindings import KeyMap
56
+ from tau.tui import KeyMap
56
57
 
57
58
  overrides: KeyMap = {
58
59
  "tui.app.quit": ["ctrl+q"],
59
60
  "tui.input.submit": ["enter"],
60
61
  "app.message.followup": ["alt+enter"],
62
+ "app.details.toggle": ["ctrl+o"],
63
+ "app.invocations.toggle": ["ctrl+e"],
61
64
  }
62
65
 
63
66
  app = await App.create(runtime, keybindings=overrides)
@@ -75,6 +78,8 @@ A `KeyMap` is `dict[str, list[str]]` — action name → list of key combos that
75
78
  | `tui.input.word_back` | `ctrl+w` | Delete previous word |
76
79
  | `app.message.followup` | `alt+enter` | Queue as follow-up message |
77
80
  | `app.message.dequeue` | `alt+up` | Restore queued messages into editor |
81
+ | `app.details.toggle` | `ctrl+o` | Toggle thinking and tool-result previews |
82
+ | `app.invocations.toggle` | `ctrl+e` | Toggle template and skill blocks |
78
83
  | `tui.app.quit` | `ctrl+c`, `ctrl+d` | Quit tau |
79
84
  | `tui.app.abort` | `ctrl+c` | Abort the current turn |
80
85
  | `tui.select.up` | `up`, `ctrl+p` | Move selection up |
@@ -28,6 +28,12 @@ Referenced files are automatically processed based on type:
28
28
 
29
29
  A response from the LLM. Can include text and tool calls.
30
30
 
31
+ Assistant messages also store provider usage metadata: input, output,
32
+ cache-read, and cache-write token counts. The
33
+ `input_tokens_include_cache_read` flag records whether cached tokens are
34
+ already included in the provider's input count, preventing context usage from
35
+ counting the same tokens twice.
36
+
31
37
  ```python
32
38
  {
33
39
  "type": "assistant",
@@ -1,11 +1,11 @@
1
1
  # Project Structure
2
2
 
3
- Tau consists of 205 Python modules organized into 22 main packages. This page documents the codebase organization and provides module-by-module reference for contributors and agents.
3
+ Tau consists of 230 Python modules organized into 25 main packages. This page documents the codebase organization and provides module-by-module reference for contributors and agents.
4
4
 
5
5
  ## Directory Structure
6
6
 
7
7
  ```
8
- tau/ # Main package (205 modules)
8
+ tau/ # Main package (230 modules)
9
9
  ├── __init__.py
10
10
  ├── content_registry.py # Content registry abstractions
11
11
  ├── agent/ # Agent execution service
@@ -31,6 +31,7 @@ tau/ # Main package (205 modules)
31
31
  ├── message/ # Message types and utilities
32
32
  ├── packages/ # Package/dependency management
33
33
  ├── prompts/ # Prompt template system
34
+ ├── resources/ # Unified runtime resource discovery
34
35
  ├── rpc/ # JSON-RPC protocol for IDE integration
35
36
  ├── runtime/ # Agent runtime service
36
37
  ├── session/ # Session management and persistence
@@ -154,12 +155,22 @@ Message data structures and utilities.
154
155
 
155
156
  ### `packages/` - Package Management
156
157
 
157
- Package/dependency resolution (reserved for future use).
158
+ Installed package and dependency management.
158
159
 
159
160
  - `manager.py` - Package management
160
161
  - `types.py` - Package types
161
162
  - `utils.py` - Package utilities
162
163
 
164
+ ### `resources/` - Resource Discovery
165
+
166
+ The replaceable loader builds one immutable snapshot from built-in, global,
167
+ project, installed-package, hook-provided, and context-file resources. It
168
+ supports focused overrides and structured diagnostics. Runtime startup and
169
+ `/reload` both consume it.
170
+
171
+ - `loader.py` - Resource loader protocol, default discovery, and registry application
172
+ - `types.py` - `ResourceContext`, immutable `ResourceSnapshot`, context files, and diagnostics
173
+
163
174
  ### `prompts/` - Prompt Template System
164
175
 
165
176
  Prompt loading and variable substitution.
@@ -178,10 +189,12 @@ JSON-RPC server for IDE integration.
178
189
 
179
190
  ### `runtime/` - Agent Runtime
180
191
 
181
- Wires together agent, session, engine, and extensions.
192
+ Wires together agent, session, engine, and extensions with replaceable service
193
+ factories for programmatic embedding.
182
194
 
195
+ - `dependencies.py` - Typed dependency factories and creation contexts
183
196
  - `service.py` - Main runtime orchestration
184
- - `types.py` - Runtime state types
197
+ - `types.py` - Runtime state, configuration, and structured startup result types
185
198
 
186
199
  ### `session/` - Session Management
187
200
 
@@ -234,35 +247,33 @@ Trust and permission system for tool execution.
234
247
  - `types.py` - Trust data structures
235
248
  - `utils.py` - Trust utilities
236
249
 
237
- ### `tui/` - Terminal User Interface
238
-
239
- Complete terminal UI (22 modules, 736 LOC).
240
-
241
- Core components:
242
- - `tui.py` - Main TUI event loop
243
- - `app.py` - TUI application state
244
- - `terminal.py` - Terminal control and cursor management
245
- - `renderer.py` - Differential update renderer
246
-
247
- Input handling:
248
- - `input.py` - Text input editor
249
- - `input_handler.py` - Input event handling
250
- - `autocomplete.py` - Command/file autocomplete
251
- - `component.py` - UI component system
252
-
253
- Rendering:
254
- - `message_renderers.py` - Message and tool result rendering
255
- - `markdown.py` - Markdown to ANSI rendering
256
- - `overlay.py` - Overlay UI (dialogs, popups)
257
-
258
- Display:
259
- - `theme.py` - Theme application
260
- - `ansi.py` - ANSI code utilities
261
- - `keybindings.py` - Keybinding definitions
262
- - `fuzzy.py` - Fuzzy matching for search
263
-
264
- Integration:
265
- - `agent_hooks.py` - TUI event hooks
250
+ ### `tui/` - Terminal UI Primitives
251
+
252
+ Reusable terminal parsing, differential rendering, components, themes, and
253
+ keybindings.
254
+
255
+ - `tui.py` - Main event loop, focus, overlays, and differential rendering
256
+ - `terminal.py` - Terminal control and capability detection
257
+ - `input.py` - Generic input events, terminal parser, and keybinding registry
258
+ - `component.py` - Component and container primitives
259
+ - `components/` - Editor, text input, selectors, spinner, images, and boxes
260
+ - `autocomplete.py` - Generic autocomplete management
261
+ - `markdown.py` - Markdown-to-ANSI rendering
262
+ - `theme.py` - TUI theme types
263
+ - `ui_context.py` - Extension-facing UI context
264
+
265
+ ### `modes/interactive/` - Interactive Application
266
+
267
+ Interactive runtime orchestration and Tau-specific UI composition.
268
+
269
+ - `app.py` - Application lifecycle and global shortcuts
270
+ - `agent_hooks.py` - Agent-event to UI-state projection
271
+ - `input_handler.py` - Runtime-aware submit, queue, media, and history orchestration
272
+ - `commands/` - Interactive slash-command implementations
273
+ - `components/layout.py` - Editor-zone composition
274
+ - `components/message_list.py` - Message and tool-result rendering
275
+ - `components/selector_controller.py` - Inline selector lifecycle and input routing
276
+ - `components/overlays.py` - Interactive dialogs and editors
266
277
  - `ui_context.py` - UI state context
267
278
 
268
279
  ## Key Types and Classes
@@ -402,7 +413,7 @@ See [Extensions Guide](extensions.md) for detailed examples.
402
413
  ## Code Statistics
403
414
 
404
415
  - **Total modules**: 205 Python files
405
- - **Main package**: tau/ (22 subpackages)
416
+ - **Main package**: tau/ (25 subpackages)
406
417
  - **Test coverage**: tests/ directory
407
418
  - **Lines of code**: ~8,000 LOC (excluding tests and docs)
408
419
  - **Type hints**: Full type coverage with mypy/pyright