tau-coding-agent 0.4.0__tar.gz → 0.4.5__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.
- {tau_coding_agent-0.4.0/tau_coding_agent.egg-info → tau_coding_agent-0.4.5}/PKG-INFO +3 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/README.md +2 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/architecture.md +12 -5
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/cli-reference.md +15 -7
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/extensions.md +88 -8
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/keybindings.md +8 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/messages.md +6 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/project-structure.md +27 -29
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/python-api.md +10 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/sessions.md +40 -6
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/settings.md +10 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/tools.md +36 -10
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/usage.md +2 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/pyproject.toml +2 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/prompt/builder.py +2 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/service.py +208 -85
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/types.py +2 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/__init__.py +7 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/model.py +25 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/text.py +62 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/edit.py +87 -84
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/glob.py +21 -27
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/grep.py +22 -66
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/ls.py +3 -20
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/read.py +16 -19
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/terminal.py +45 -33
- tau_coding_agent-0.4.5/tau/builtins/tools/utils.py +129 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/write.py +6 -12
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/commands/registry.py +33 -10
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/cli.py +66 -10
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/packages.py +13 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/update.py +43 -10
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/core/registry.py +2 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/engine/service.py +84 -103
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/engine/types.py +3 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/api.py +3 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/context.py +54 -9
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/runtime.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/__init__.py +12 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/engine.py +21 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/service.py +7 -6
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/session.py +49 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/types.py +12 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_claude_code.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_messages.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_vertex.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/gemini_generate.py +2 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/github_copilot_chat.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_antigravity.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_vertex.py +3 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/mistral_chat.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_codex_responses.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_completions.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_responses.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_vertex.py +1 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/model/types.py +3 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/types.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/utils.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/message/types.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/message/utils.py +5 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/agent_hooks.py +8 -8
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/app.py +102 -45
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/appearance.py +63 -82
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/auth.py +14 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/extensions.py +1 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/session.py +9 -5
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/config_selector.py +13 -5
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/extension_selector.py +1 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/layout.py +37 -218
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/message_list.py +140 -28
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/model_selector.py +6 -6
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/oauth_selector.py +6 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/overlays.py +3 -2
- tau_coding_agent-0.4.5/tau/modes/interactive/components/selector_controller.py +203 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/session_selector.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/settings_selector.py +4 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/theme_selector.py +3 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/thinking_selector.py +8 -7
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/tree_selector.py +1 -2
- tau_coding_agent-0.4.0/tau/tui/input.py → tau_coding_agent-0.4.5/tau/modes/interactive/input_handler.py +4 -934
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/rpc/mode.py +8 -8
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/manager.py +68 -5
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/types.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/utils.py +50 -5
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/runtime/service.py +170 -61
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/runtime/types.py +93 -25
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/branch_summarization.py +74 -32
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/compaction.py +111 -22
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/manager.py +79 -47
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/utils.py +5 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/manager.py +12 -3
- tau_coding_agent-0.4.5/tau/settings/paths.py +347 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/types.py +8 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/skills/registry.py +1 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/themes/loader.py +10 -12
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/themes/registry.py +10 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/registry.py +27 -15
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/types.py +10 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/manager.py +6 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/utils.py +2 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/autocomplete.py +6 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/editor.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/select_list.py +2 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/spinner.py +5 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/text_input.py +23 -3
- tau_coding_agent-0.4.5/tau/tui/input.py +933 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/keybinding_hints.py +1 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/markdown.py +13 -7
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/terminal.py +0 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/tui.py +25 -2
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/ui_context.py +21 -4
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/utils.py +8 -9
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5/tau_coding_agent.egg-info}/PKG-INFO +3 -3
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/SOURCES.txt +14 -0
- tau_coding_agent-0.4.5/tests/test_agent_compaction.py +264 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_agent_types.py +4 -1
- tau_coding_agent-0.4.5/tests/test_branch_navigation.py +127 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_branch_summarization.py +105 -11
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_builtin_tools.py +217 -75
- tau_coding_agent-0.4.5/tests/test_cli_inputs.py +40 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_command_registry.py +16 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_compaction.py +111 -8
- tau_coding_agent-0.4.5/tests/test_engine_execution.py +78 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_engine_steering.py +10 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_extension_api.py +109 -0
- tau_coding_agent-0.4.5/tests/test_footer_model.py +86 -0
- tau_coding_agent-0.4.5/tests/test_package_resources.py +66 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_packages_utils.py +40 -5
- tau_coding_agent-0.4.5/tests/test_selector_controller.py +36 -0
- tau_coding_agent-0.4.5/tests/test_session_manager.py +97 -0
- tau_coding_agent-0.4.5/tests/test_text_input.py +17 -0
- tau_coding_agent-0.4.5/tests/test_thinking_render.py +53 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tool_registry.py +12 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tool_render.py +37 -0
- tau_coding_agent-0.4.5/tests/test_ui_context.py +42 -0
- tau_coding_agent-0.4.0/tau/settings/paths.py +0 -171
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/LICENSE +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/MANIFEST.in +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/auth.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/development.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/docs.json +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/extension-settings.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/http-proxy.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/index.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/inference-providers.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/installation.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/project-context.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/prompts.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/quickstart.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/skills.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/docs/themes.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/setup.cfg +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/prompt/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/agent/prompt/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/auth/manager.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/auth/storage.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/auth/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/clear.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/compact.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/reload.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/commands/session.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/git.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/extensions/header/__init__.py +1 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/audio.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/image.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/models/video.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/commit.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/docs.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/explain.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/fix.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/refactor.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/review.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/prompts/test.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/audio.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/image.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/text.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/providers/video.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/skills/code-review/SKILL.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/skills/debug/SKILL.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/skills/git-commit/SKILL.md +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/themes/dark.yaml +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/themes/light.yaml +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/builtins/tools/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/commands/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/console/commands/auth.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/core/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/engine/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/loader.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/extensions/settings.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/inference.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/runtime.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/hooks/tui.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/base.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/builtins.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/gemini_audio.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/openai_audio.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/sarvam_audio.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/service.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/audio/utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/availability.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/base.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/builtins.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/gemini_image.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/openai_image.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/openrouter.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/image/service.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/base.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/builtins.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/ollama_chat.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/service.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/text/utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/base.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/builtins.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/fal_video.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/openrouter_video.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/api/video/service.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/model/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/model/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/github_copilot.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/google_antigravity.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/openai_codex.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/pkce.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/inference/provider/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/message/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/context.py +1 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/misc.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/commands/model.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/command_palette.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/file_picker.py +1 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/interactive/components/trust_screen.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/print/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/rpc/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/modes/rpc/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/packages/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/expand.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/loader.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/prompts/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/session/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/storage.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/settings/utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/skills/loader.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/skills/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/themes/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tool/render.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/trust/types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/component.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/box.py +1 -1
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/components/image.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/tui/theme.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/__init__.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/http_proxy.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/image_processing.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/secrets.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau/utils/version_check.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/entry_points.txt +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/requires.txt +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/top_level.txt +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_agent_prompt.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_ansi.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_auth_command.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_auth_manager.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_auth_storage.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_diff.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_editor_protocol.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_engine_types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_footer_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_fuzzy.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_http_proxy.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_image_processing.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_api_text_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_error_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_inference_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_keybindings.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_markdown.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_message_types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_message_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_availability.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_selector_modal.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_model_types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_oauth_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_pkce.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_prompts_expand.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_prompts_loader.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_prompts_registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_provider_registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_rpc_mode.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_secrets.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_session_trust_persist.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_session_types.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_session_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_manager.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_paths.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_storage.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_settings_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_skills_loader.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_skills_registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_text_llm_invoke.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_theme_loader.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_themes_registry.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_trust_manager.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_trust_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_capabilities.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_input.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_layout_sizing.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_theme.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/tests/test_tui_utils.py +0 -0
- {tau_coding_agent-0.4.0 → tau_coding_agent-0.4.5}/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.
|
|
3
|
+
Version: 0.4.5
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
@@ -102,18 +102,20 @@ User input flows through these stages:
|
|
|
102
102
|
|
|
103
103
|
## Agent Execution State Machine
|
|
104
104
|
|
|
105
|
-
The agent has
|
|
105
|
+
The agent has four observable phases:
|
|
106
106
|
|
|
107
107
|
```
|
|
108
108
|
IDLE ──user input──> TURN ──no more tool calls──> IDLE
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
├── manual/auto compact ──> COMPACTION ──> previous phase
|
|
110
|
+
└── tree navigation ──────> BRANCH_SUMMARY ──> IDLE
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
| State | Meaning |
|
|
114
114
|
|-------|---------|
|
|
115
115
|
| `IDLE` | No active inference; waiting for user input |
|
|
116
116
|
| `TURN` | Processing a turn: calling inference, executing tools |
|
|
117
|
+
| `COMPACTION` | Generating or applying a context compaction summary |
|
|
118
|
+
| `BRANCH_SUMMARY` | Generating or applying a branch-navigation summary |
|
|
117
119
|
|
|
118
120
|
The state is exposed via `AgentPhase` enum in `agent/types.py` and accessible to extensions via hooks.
|
|
119
121
|
|
|
@@ -126,14 +128,19 @@ Each agent turn follows this sequence:
|
|
|
126
128
|
2. Add message to session
|
|
127
129
|
3. Call inference (LLM API)
|
|
128
130
|
4. Collect tool calls from response
|
|
129
|
-
5. Execute tools
|
|
131
|
+
5. Execute tools concurrently only when every call in the batch is marked parallel
|
|
130
132
|
6. Add tool results to context
|
|
131
133
|
7. Call inference again (only if tools were called)
|
|
132
134
|
8. Render all messages and results (TUI)
|
|
133
135
|
9. Save session to disk
|
|
134
|
-
10.
|
|
136
|
+
10. Run post-turn compaction and drain messages queued by lifecycle handlers
|
|
137
|
+
11. Fire the settled hook
|
|
135
138
|
```
|
|
136
139
|
|
|
140
|
+
TUI overlays participate in focus lifecycle. Hiding or closing a capturing
|
|
141
|
+
overlay restores the next visible overlay or its previous focus target.
|
|
142
|
+
Components exposing `dispose()` are disposed when their overlay closes.
|
|
143
|
+
|
|
137
144
|
## Message Types and Context
|
|
138
145
|
|
|
139
146
|
Messages in sessions are typed:
|
|
@@ -6,17 +6,21 @@
|
|
|
6
6
|
tau [OPTIONS] [MESSAGE]
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
`
|
|
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
|
-
| `--
|
|
16
|
-
| `--
|
|
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
|
-
| `--
|
|
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 --
|
|
46
|
-
|
|
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:
|
|
@@ -212,9 +253,17 @@ def register(tau):
|
|
|
212
253
|
|
|
213
254
|
#### Agent state
|
|
214
255
|
|
|
256
|
+
| Property | Type | Description |
|
|
257
|
+
|----------|------|-------------|
|
|
258
|
+
| `ctx.phase` | `AgentPhase` | Current lifecycle phase: `idle`, `turn`, `compaction`, or `branch_summary` |
|
|
259
|
+
| `ctx.streaming_message` | `AssistantMessage \| None` | Current partial assistant response |
|
|
260
|
+
| `ctx.pending_tool_call_ids` | `frozenset[str]` | Snapshot of tool calls that have started but not finished |
|
|
261
|
+
| `ctx.error_message` | `str \| None` | Most recent engine error |
|
|
262
|
+
| `ctx.queued_messages` | `dict[str, list[LLMMessage]]` | Snapshots of the steering and follow-up queues |
|
|
263
|
+
|
|
215
264
|
| Method | Returns | Description |
|
|
216
265
|
|--------|---------|-------------|
|
|
217
|
-
| `ctx.is_idle()` | `bool` | `True` when
|
|
266
|
+
| `ctx.is_idle()` | `bool` | `True` when `ctx.phase` is `AgentPhase.IDLE` |
|
|
218
267
|
| `ctx.abort()` | — | Cancel the current agent turn; no-op if already idle |
|
|
219
268
|
| `ctx.shutdown()` | — | Exit tau gracefully |
|
|
220
269
|
| `ctx.get_context_usage()` | `dict \| None` | Token usage info (see below) |
|
|
@@ -224,6 +273,13 @@ def register(tau):
|
|
|
224
273
|
| `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
274
|
| `ctx.get_system_prompt_options()` | `dict` | Metadata about how the active system prompt was assembled — keys: `skills`, `prompts`, `tools`, `system_prompt_length` |
|
|
226
275
|
|
|
276
|
+
Extensions can inject a user message with
|
|
277
|
+
`await ctx.send_user_message(content, deliver_as="steer", trigger_turn=False)`.
|
|
278
|
+
Set `trigger_turn=True` to start a new turn immediately when the agent is idle;
|
|
279
|
+
while it is busy, the message is queued using the selected delivery mode. In
|
|
280
|
+
interactive mode, an immediately triggered message is rendered as a normal user
|
|
281
|
+
message before the assistant response.
|
|
282
|
+
|
|
227
283
|
`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
284
|
|
|
229
285
|
```python
|
|
@@ -251,7 +307,7 @@ These methods are `async` and are available in both event handlers and command h
|
|
|
251
307
|
|
|
252
308
|
| Method | Returns | Description |
|
|
253
309
|
|--------|---------|-------------|
|
|
254
|
-
| `await ctx.wait_for_idle()` | — | Suspend until the
|
|
310
|
+
| `await ctx.wait_for_idle()` | — | Suspend until the active invocation and its post-run save/compaction processing finish |
|
|
255
311
|
| `await ctx.new_session()` | `{"cancelled": bool}` | Start a fresh session |
|
|
256
312
|
| `await ctx.fork(entry_id)` | `{"cancelled": bool}` | Fork from a specific session entry |
|
|
257
313
|
| `await ctx.navigate_tree(target_id, summarize=False, custom_instructions=None)` | `{"cancelled": bool}` | Jump to another branch in the session tree |
|
|
@@ -297,12 +353,30 @@ async def cmd(ctx, args):
|
|
|
297
353
|
ctx.compact(custom_instructions="Keep only the final conclusions.")
|
|
298
354
|
```
|
|
299
355
|
|
|
300
|
-
`navigate_tree` optionally generates a branch summary
|
|
356
|
+
`navigate_tree` optionally generates a branch summary and attaches it to the
|
|
357
|
+
destination branch. If summary generation fails, navigation still completes
|
|
358
|
+
without a summary:
|
|
301
359
|
|
|
302
360
|
```python
|
|
303
361
|
result = await ctx.navigate_tree(target_id, summarize=True)
|
|
304
362
|
```
|
|
305
363
|
|
|
364
|
+
Extensions can replace the default branch-summary model call:
|
|
365
|
+
|
|
366
|
+
```python
|
|
367
|
+
from tau.hooks import SessionBeforeTreeResult
|
|
368
|
+
|
|
369
|
+
def register(tau):
|
|
370
|
+
@tau.on("session_before_tree")
|
|
371
|
+
async def summarize(event, ctx):
|
|
372
|
+
entries = event.preparation.entries_to_summarize
|
|
373
|
+
summary = await my_summarizer(entries)
|
|
374
|
+
return SessionBeforeTreeResult(
|
|
375
|
+
summary=summary,
|
|
376
|
+
summary_details={"source": "my-extension"},
|
|
377
|
+
)
|
|
378
|
+
```
|
|
379
|
+
|
|
306
380
|
#### `branch_entries` vs `session_entries`
|
|
307
381
|
|
|
308
382
|
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 +433,11 @@ def register(tau):
|
|
|
359
433
|
| `session_shutdown` | `reason`, `target_session_file` | — | Session about to close — last chance for cleanup |
|
|
360
434
|
| `session_before_switch` | `reason`, `target_session_file` | `SessionBeforeSwitchResult` | About to replace the active session — return `cancel=True` to block |
|
|
361
435
|
| `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
|
|
436
|
+
| `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 |
|
|
437
|
+
| `branch_summary_start` | `old_leaf_id`, `target_id`, `from_extension` | — | Branch summarization begins |
|
|
438
|
+
| `branch_summary_end` | `old_leaf_id`, `target_id`, `summary_entry_id`, `summary_length`, `from_extension` | — | Summary attached to the destination |
|
|
439
|
+
| `branch_summary_failure` | `old_leaf_id`, `target_id`, `error` | — | Summary failed; navigation continues without it |
|
|
440
|
+
| `branch_summary_cancelled` | `old_leaf_id`, `target_id`, `reason` | — | Summary or navigation was cancelled |
|
|
363
441
|
| `session_tree` | `new_leaf_id`, `old_leaf_id`, `from_extension` | — | Session tree has been rewritten with the new active leaf |
|
|
364
442
|
|
|
365
443
|
**Agent & turn lifecycle**
|
|
@@ -372,7 +450,7 @@ def register(tau):
|
|
|
372
450
|
| `agent_error` | `error` | — | Engine terminated with an unrecoverable error |
|
|
373
451
|
| `turn_start` | `turn_index`, `timestamp` | — | New LLM inference turn begins |
|
|
374
452
|
| `turn_end` | `turn_index`, `message`, `tool_results` | — | Turn completes with assistant message and tool results |
|
|
375
|
-
| `settled` | — | — |
|
|
453
|
+
| `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
454
|
|
|
377
455
|
**Input**
|
|
378
456
|
|
|
@@ -425,9 +503,11 @@ def register(tau):
|
|
|
425
503
|
|
|
426
504
|
| Event | Payload fields | Result type | Description |
|
|
427
505
|
|-------|---------------|-------------|-------------|
|
|
428
|
-
| `before_compaction` | `preparation`, `entries`, `manual` | `BeforeCompactionResult` | Before
|
|
429
|
-
| `compaction_start` | `manual` | — | Compaction begins
|
|
430
|
-
| `compaction_end` | `manual`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction
|
|
506
|
+
| `before_compaction` | `preparation`, `entries`, `manual`, `reason`, `will_retry` | `BeforeCompactionResult` | Before summarization; may cancel or provide a complete compaction |
|
|
507
|
+
| `compaction_start` | `manual`, `reason`, `will_retry` | — | Compaction begins after interception |
|
|
508
|
+
| `compaction_end` | `manual`, `reason`, `will_retry`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction succeeds |
|
|
509
|
+
| `compaction_failure` | `manual`, `reason`, `will_retry`, `error` | — | Compaction fails |
|
|
510
|
+
| `compaction_cancelled` | `manual`, `reason`, `will_retry` | — | An extension cancels compaction |
|
|
431
511
|
|
|
432
512
|
**Model & settings**
|
|
433
513
|
|
|
@@ -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
|
|
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
|
|
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",
|
|
@@ -234,35 +234,33 @@ Trust and permission system for tool execution.
|
|
|
234
234
|
- `types.py` - Trust data structures
|
|
235
235
|
- `utils.py` - Trust utilities
|
|
236
236
|
|
|
237
|
-
### `tui/` - Terminal
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
- `tui.py` - Main
|
|
243
|
-
- `
|
|
244
|
-
- `
|
|
245
|
-
- `
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
- `
|
|
249
|
-
- `
|
|
250
|
-
- `
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
- `
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
- `
|
|
260
|
-
- `
|
|
261
|
-
- `
|
|
262
|
-
- `
|
|
263
|
-
|
|
264
|
-
Integration:
|
|
265
|
-
- `agent_hooks.py` - TUI event hooks
|
|
237
|
+
### `tui/` - Terminal UI Primitives
|
|
238
|
+
|
|
239
|
+
Reusable terminal parsing, differential rendering, components, themes, and
|
|
240
|
+
keybindings.
|
|
241
|
+
|
|
242
|
+
- `tui.py` - Main event loop, focus, overlays, and differential rendering
|
|
243
|
+
- `terminal.py` - Terminal control and capability detection
|
|
244
|
+
- `input.py` - Generic input events, terminal parser, and keybinding registry
|
|
245
|
+
- `component.py` - Component and container primitives
|
|
246
|
+
- `components/` - Editor, text input, selectors, spinner, images, and boxes
|
|
247
|
+
- `autocomplete.py` - Generic autocomplete management
|
|
248
|
+
- `markdown.py` - Markdown-to-ANSI rendering
|
|
249
|
+
- `theme.py` - TUI theme types
|
|
250
|
+
- `ui_context.py` - Extension-facing UI context
|
|
251
|
+
|
|
252
|
+
### `modes/interactive/` - Interactive Application
|
|
253
|
+
|
|
254
|
+
Interactive runtime orchestration and Tau-specific UI composition.
|
|
255
|
+
|
|
256
|
+
- `app.py` - Application lifecycle and global shortcuts
|
|
257
|
+
- `agent_hooks.py` - Agent-event to UI-state projection
|
|
258
|
+
- `input_handler.py` - Runtime-aware submit, queue, media, and history orchestration
|
|
259
|
+
- `commands/` - Interactive slash-command implementations
|
|
260
|
+
- `components/layout.py` - Editor-zone composition
|
|
261
|
+
- `components/message_list.py` - Message and tool-result rendering
|
|
262
|
+
- `components/selector_controller.py` - Inline selector lifecycle and input routing
|
|
263
|
+
- `components/overlays.py` - Interactive dialogs and editors
|
|
266
264
|
- `ui_context.py` - UI state context
|
|
267
265
|
|
|
268
266
|
## Key Types and Classes
|
|
@@ -123,8 +123,8 @@ unsub() # remove the handler
|
|
|
123
123
|
|-------|------|
|
|
124
124
|
| `message_end` | Model response fully received |
|
|
125
125
|
| `tool_execution_end` | A tool call finished |
|
|
126
|
-
| `agent_end` |
|
|
127
|
-
| `settled` |
|
|
126
|
+
| `agent_end` | The current low-level engine loop ended; post-run processing may remain |
|
|
127
|
+
| `settled` | The invocation completed post-run processing with no messages currently queued |
|
|
128
128
|
|
|
129
129
|
## Custom Tools at Runtime
|
|
130
130
|
|
|
@@ -185,9 +185,17 @@ agent = runtime.agent
|
|
|
185
185
|
|
|
186
186
|
# Check state
|
|
187
187
|
agent.is_idle()
|
|
188
|
+
agent.phase # AgentPhase.IDLE, TURN, COMPACTION, or BRANCH_SUMMARY
|
|
189
|
+
agent.streaming_message
|
|
190
|
+
agent.pending_tool_call_ids
|
|
191
|
+
agent.error_message
|
|
192
|
+
agent.queued_messages
|
|
188
193
|
agent.get_context_usage() # ContextUsage(tokens, context_window, percent)
|
|
189
194
|
agent.get_system_prompt()
|
|
190
195
|
|
|
196
|
+
# Wait through save-point handlers and post-run compaction
|
|
197
|
+
await agent.wait_for_idle()
|
|
198
|
+
|
|
191
199
|
# Abort
|
|
192
200
|
agent.abort()
|
|
193
201
|
|
|
@@ -14,6 +14,10 @@ A session is a conversation between you and the agent. Each session includes:
|
|
|
14
14
|
|
|
15
15
|
Sessions are saved to `~/.tau/sessions/` in a per-project subdirectory so sessions from different projects never mix.
|
|
16
16
|
|
|
17
|
+
Set `session_dir` in settings, or pass `--session-dir PATH`, to override this
|
|
18
|
+
location. `tau --resume ID` resumes a matching session, `tau --fork ID` creates
|
|
19
|
+
a new session from it, and `--name NAME` assigns a display name at startup.
|
|
20
|
+
|
|
17
21
|
## Session Files
|
|
18
22
|
|
|
19
23
|
Sessions are stored per-project. The working directory is encoded into a safe subdirectory name:
|
|
@@ -32,6 +36,15 @@ The subdirectory name is derived from the absolute path of the working directory
|
|
|
32
36
|
|
|
33
37
|
Files are in JSONL format (one JSON object per line), allowing efficient appending and compression.
|
|
34
38
|
|
|
39
|
+
Opening an existing empty, invalid, or unsupported future-version session
|
|
40
|
+
fails without modifying the file. Persistence errors are reported to the
|
|
41
|
+
caller instead of allowing in-memory state to appear saved when the disk write
|
|
42
|
+
failed.
|
|
43
|
+
|
|
44
|
+
When a branch is extracted into a new session, label entries are recreated at
|
|
45
|
+
the end of the extracted path. Retained entries are re-chained so removing a
|
|
46
|
+
label from between conversation entries cannot leave orphaned parent IDs.
|
|
47
|
+
|
|
35
48
|
## Resume Sessions
|
|
36
49
|
|
|
37
50
|
### Continue Last Session
|
|
@@ -112,6 +125,10 @@ Useful for one-off queries where you don't need the conversation history.
|
|
|
112
125
|
|
|
113
126
|
Every session is a **tree**, not a flat list. When you branch with `/fork` or navigate to a different point in history, tau records a `leaf` entry that points to the new active node. The full conversation history — including all branches — lives in a single JSONL file.
|
|
114
127
|
|
|
128
|
+
Parent traversal rejects cycles in malformed session data. Tree rendering
|
|
129
|
+
treats missing-parent entries as separate roots so recoverable orphaned history
|
|
130
|
+
remains visible.
|
|
131
|
+
|
|
115
132
|
```text
|
|
116
133
|
root
|
|
117
134
|
└── msg A (user)
|
|
@@ -148,14 +165,21 @@ Both sessions start in an identical state. Changes in one do not affect the othe
|
|
|
148
165
|
|
|
149
166
|
Use `/tree` to open the interactive branch navigator. It shows every message node in the session tree, indented by depth, with the current leaf marked `(current)`. Press Enter on any node to navigate to that branch point.
|
|
150
167
|
|
|
151
|
-
When you navigate to a different branch,
|
|
168
|
+
When you navigate to a different branch, Tau can generate a **branch summary**
|
|
169
|
+
of the path you're leaving, so context from the abandoned branch isn't lost.
|
|
170
|
+
The TUI asks whether to summarize unless prompting is disabled. When generated,
|
|
171
|
+
the summary is attached to the destination branch and injected into its context
|
|
172
|
+
as a `[Branch Summary]` block.
|
|
152
173
|
|
|
153
174
|
#### Branch summary behaviour
|
|
154
175
|
|
|
155
|
-
-
|
|
176
|
+
- Offered during TUI navigation; API callers opt in with `summarize=True`.
|
|
156
177
|
- Captures: goal, progress, key decisions, next steps, and files read/modified.
|
|
157
|
-
- Stored as a `branch_summary` entry
|
|
158
|
-
-
|
|
178
|
+
- Stored as a `branch_summary` entry under the destination node and included in that branch's context.
|
|
179
|
+
- Uses the active model's input limit and a bounded prompt. If summarization fails, navigation still completes without a summary and Tau reports the failure.
|
|
180
|
+
- Extensions can return a complete summary and metadata from
|
|
181
|
+
`session_before_tree`, bypassing Tau's default summary model call. See
|
|
182
|
+
[Extensions](extensions.md#event-reference).
|
|
159
183
|
|
|
160
184
|
### Resuming a Past Session
|
|
161
185
|
|
|
@@ -252,16 +276,19 @@ Long sessions eventually fill the model's context window. Tau handles this autom
|
|
|
252
276
|
|
|
253
277
|
### When Compaction Runs
|
|
254
278
|
|
|
255
|
-
Token usage is estimated from the **last successful response's reported usage** plus a chars/4 estimate of anything after it, so the trigger reflects real provider accounting rather than a pure guess.
|
|
279
|
+
Token usage is estimated from the **last successful response's reported usage** plus a chars/4 estimate of anything after it, so the trigger reflects real provider accounting rather than a pure guess. Provider cache counters are normalized so cached input is not counted twice. Before the first response, and after switching models, the estimate also includes the system prompt and tool schemas.
|
|
280
|
+
|
|
281
|
+
The threshold is `context_tokens >= context_window - reserve_tokens`. Tau checks this at three points so context is trimmed before it can overflow:
|
|
256
282
|
|
|
257
283
|
1. **Pre-flight** — before sending a new turn. Catches resumed or already-oversized sessions that would otherwise fail on the very first request.
|
|
258
|
-
2. **Post-
|
|
284
|
+
2. **Post-task** — after the agent finishes the current prompt and becomes idle.
|
|
259
285
|
3. **Overflow recovery (reactive backstop)** — if a request still fails with a provider *context-overflow* error, Tau catches it, drops the failed response, compacts, and **retries the turn once** automatically. This is bounded to a single attempt per turn — if it overflows again, Tau surfaces a message asking you to reduce context or switch to a larger-context model rather than looping.
|
|
260
286
|
|
|
261
287
|
Two guards keep this stable:
|
|
262
288
|
|
|
263
289
|
- **Stale-anchor guard** — immediately after a compaction, the kept messages still carry their pre-compaction (large) usage numbers. Tau skips re-triggering when the usage anchor predates the latest compaction, so it won't compact on every subsequent turn.
|
|
264
290
|
- **Circuit breaker** — if automatic compaction fails repeatedly (3×), Tau stops auto-compacting for the session and surfaces a notice instead of failing silently. You can still run `/compact` manually.
|
|
291
|
+
- **Model-switch guard** — usage reported by the previous model is discarded after a model change. Tau falls back to a full heuristic estimate against the new model's context window instead of skipping the check.
|
|
265
292
|
|
|
266
293
|
### Manual Compaction
|
|
267
294
|
|
|
@@ -283,6 +310,13 @@ Compaction is controlled by three settings under the `compaction` key in `settin
|
|
|
283
310
|
| `reserve_tokens` | `16384` | Tokens to keep free at the top of the context window; compaction triggers when headroom falls below this |
|
|
284
311
|
| `keep_recent_tokens` | `20000` | Approximate token budget for the recent messages that are kept verbatim after compaction |
|
|
285
312
|
|
|
313
|
+
At runtime, Tau clamps `reserve_tokens` and `keep_recent_tokens` to the active
|
|
314
|
+
model's input limit. It always leaves room for the generated summary, preventing
|
|
315
|
+
small-context models from retaining more history than they can accept.
|
|
316
|
+
|
|
317
|
+
Disabling automatic compaction also disables overflow-triggered compaction and
|
|
318
|
+
retry. Provider context-overflow errors are returned directly in that mode.
|
|
319
|
+
|
|
286
320
|
Example — tighten the trigger and keep more recent history:
|
|
287
321
|
|
|
288
322
|
```json
|
|
@@ -84,6 +84,7 @@ All field names use `snake_case`.
|
|
|
84
84
|
| `thinking_level` | string | Extended thinking budget level (see below) |
|
|
85
85
|
| `transport` | string | Transport layer override (`"streaming"` or `"polling"`) |
|
|
86
86
|
| `enabled_models` | list[string] | Restrict the model picker to these model IDs |
|
|
87
|
+
| `session_dir` | string | Override the directory used to store and discover sessions |
|
|
87
88
|
|
|
88
89
|
```json
|
|
89
90
|
{
|
|
@@ -120,6 +121,7 @@ Toggle during a session with `/effort` or the effort picker.
|
|
|
120
121
|
| `show_tool_calls` | boolean | `true` | Show tool call / result blocks in the message list |
|
|
121
122
|
| `picker_max_visible` | integer | `8` | Max visible rows in the model / theme picker |
|
|
122
123
|
| `autocomplete_max_visible` | integer | `5` | Max visible rows in the editor autocomplete dropdown |
|
|
124
|
+
| `tool_result_preview_lines` | integer | `5` | Lines shown before thinking or default-shell tool results collapse; values below 1 are clamped |
|
|
123
125
|
| `show_hardware_cursor` | boolean | `false` | Keep the terminal cursor visible while it is repositioned (aids IME input) |
|
|
124
126
|
| `editor_padding_x` | integer | `0` | Horizontal padding (spaces) added inside the input editor |
|
|
125
127
|
| `double_escape_action` | string | `"fork"` | What happens when Escape is pressed twice on an empty editor: `"fork"` clones the current branch, `"tree"` opens the branch navigator, `"none"` does nothing |
|
|
@@ -187,9 +189,14 @@ When your conversation grows long, tau automatically summarizes older messages t
|
|
|
187
189
|
- **`reserve_tokens`**: How many tokens to keep available for the LLM's response (default 16,384 ≈ 4K-5K words)
|
|
188
190
|
- **`keep_recent_tokens`**: How many recent message tokens to preserve word-for-word before summarization kicks in (default 20,000 ≈ 5K-6K words)
|
|
189
191
|
|
|
192
|
+
The active values are resolved live, so changes made through `/settings` apply
|
|
193
|
+
without restarting Tau. For models with smaller input limits, Tau clamps both
|
|
194
|
+
budgets and reserves additional space for the generated summary. Automatic and
|
|
195
|
+
overflow-triggered compaction are both disabled when `enabled` is `false`.
|
|
196
|
+
|
|
190
197
|
#### Mid-turn (threshold) compaction
|
|
191
198
|
|
|
192
|
-
In addition to compaction triggered at the start of a turn, tau can compact **mid-turn** when
|
|
199
|
+
In addition to compaction triggered at the start of a turn, tau can compact **mid-turn** when context usage reaches `input_limit - reserve_tokens` while the agent is already running. When this happens the engine stops cleanly so you can review the compacted context and continue — no partial output is lost. Tool output lines are truncated before sending to the LLM to help prevent hitting the threshold in the first place.
|
|
193
200
|
|
|
194
201
|
Example configurations:
|
|
195
202
|
|
|
@@ -232,8 +239,8 @@ summary of the branch you're leaving. These settings control that behaviour.
|
|
|
232
239
|
| Field | Type | Default | Description |
|
|
233
240
|
|-------|------|---------|-------------|
|
|
234
241
|
| `branch_summary.enabled` | boolean | `true` | Enable branch summarisation entirely. When `false`, the summarisation selector is never shown when switching branches in `/tree` |
|
|
235
|
-
| `branch_summary.skip_prompt` | boolean | `false` | Skip the "Summarize branch?" picker and
|
|
236
|
-
| `branch_summary.reserve_tokens` | integer | `16384` |
|
|
242
|
+
| `branch_summary.skip_prompt` | boolean | `false` | Skip the "Summarize branch?" picker and navigate without a summary |
|
|
243
|
+
| `branch_summary.reserve_tokens` | integer | `16384` | Output/headroom budget reserved when generating the branch summary; clamped to the active model's input limit |
|
|
237
244
|
|
|
238
245
|
Disable branch summarization entirely:
|
|
239
246
|
```json
|