tau-coding-agent 0.4.8__tar.gz → 0.5.1__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.8/tau_coding_agent.egg-info → tau_coding_agent-0.5.1}/PKG-INFO +6 -6
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/README.md +5 -5
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/architecture.md +12 -4
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/cli-reference.md +2 -2
- tau_coding_agent-0.5.1/docs/creating-tools.md +242 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/development.md +13 -26
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/docs.json +16 -0
- tau_coding_agent-0.5.1/docs/engine.md +114 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/extension-settings.md +1 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/extensions.md +4 -2
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/http-proxy.md +9 -6
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/index.md +4 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/inference-providers.md +11 -22
- tau_coding_agent-0.5.1/docs/inference.md +229 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/messages.md +1 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/project-structure.md +22 -19
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/python-api.md +4 -2
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/quickstart.md +3 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/sessions.md +9 -7
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/settings.md +23 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/skills.md +11 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/tools.md +14 -3
- tau_coding_agent-0.5.1/docs/tui.md +167 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/usage.md +6 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/pyproject.toml +1 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/agent/service.py +5 -4
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/agent/types.py +5 -13
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/models/audio.py +10 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/models/image.py +19 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/models/text.py +229 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/models/video.py +65 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/providers/audio.py +6 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/providers/image.py +6 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/providers/text.py +6 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/providers/video.py +6 -0
- tau_coding_agent-0.5.1/tau/builtins/skills/skill-creator/LICENSE.txt +13 -0
- tau_coding_agent-0.5.1/tau/builtins/skills/skill-creator/SKILL.md +153 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/edit.py +1 -1
- tau_coding_agent-0.5.1/tau/builtins/tools/terminal.py +342 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/utils.py +108 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/engine/__init__.py +16 -8
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/engine/service.py +17 -17
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/engine/types.py +10 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/extensions/context.py +2 -2
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/video/builtins.py +1 -0
- tau_coding_agent-0.5.1/tau/inference/api/video/zai_video.py +139 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/agent_hooks.py +6 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/app.py +6 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/appearance.py +8 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/layout.py +11 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/message_list.py +4 -0
- {tau_coding_agent-0.4.8/tau/tui → tau_coding_agent-0.5.1/tau/modes/interactive}/ui_context.py +5 -2
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/runtime/service.py +18 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/settings/manager.py +15 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/settings/types.py +1 -0
- tau_coding_agent-0.5.1/tau/tui/__init__.py +134 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/autocomplete.py +34 -7
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/component.py +45 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/components/image.py +13 -3
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/components/spinner.py +8 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/components/text_input.py +8 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/input.py +15 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/markdown.py +36 -17
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/theme.py +24 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/tui.py +74 -15
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/utils.py +40 -4
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/utils/http_proxy.py +4 -2
- tau_coding_agent-0.5.1/tau/utils/telemetry.py +42 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1/tau_coding_agent.egg-info}/PKG-INFO +6 -6
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau_coding_agent.egg-info/SOURCES.txt +13 -1
- tau_coding_agent-0.5.1/tests/test_ask_user_extension.py +46 -0
- tau_coding_agent-0.5.1/tests/test_autocomplete_modifiers.py +52 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_builtin_tools.py +123 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_engine_execution.py +17 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_engine_steering.py +21 -17
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_inference_dialect.py +16 -1
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_markdown.py +30 -14
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_settings_manager.py +7 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_skills_registry.py +14 -0
- tau_coding_agent-0.5.1/tests/test_telemetry.py +75 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_text_input.py +17 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_thinking_render.py +21 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tui_input.py +10 -0
- tau_coding_agent-0.5.1/tests/test_tui_public_api.py +55 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tui_renderer.py +93 -4
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tui_theme.py +27 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_ui_context.py +1 -1
- tau_coding_agent-0.4.8/tau/builtins/tools/terminal.py +0 -213
- tau_coding_agent-0.4.8/tau/tui/__init__.py +0 -69
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/LICENSE +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/MANIFEST.in +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/auth.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/installation.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/keybindings.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/project-context.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/prompts.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/docs/themes.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/setup.cfg +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/agent/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/agent/prompt/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/agent/prompt/builder.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/agent/prompt/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/auth/manager.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/auth/storage.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/auth/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/commands/clear.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/commands/compact.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/commands/reload.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/commands/session.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/extensions/btw/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/extensions/footer/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/extensions/footer/git.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/extensions/footer/model.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/extensions/footer/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/extensions/header/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/extensions/watch/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/models/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/prompts/commit.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/prompts/docs.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/prompts/explain.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/prompts/fix.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/prompts/refactor.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/prompts/review.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/prompts/test.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/providers/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/skills/code-review/SKILL.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/skills/debug/SKILL.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/skills/git-commit/SKILL.md +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/themes/dark.yaml +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/themes/light.yaml +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/glob.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/grep.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/ls.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/read.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/builtins/tools/write.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/commands/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/commands/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/console/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/console/cli.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/console/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/console/commands/auth.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/console/commands/packages.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/console/commands/update.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/core/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/core/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/extensions/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/extensions/api.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/extensions/loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/extensions/runtime.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/extensions/settings.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/engine.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/inference.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/runtime.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/service.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/session.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/tui.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/hooks/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/base.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/builtins.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/gemini_audio.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/openai_audio.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/sarvam_audio.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/service.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/audio/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/availability.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/base.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/builtins.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/gemini_image.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/openai_image.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/openrouter.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/image/service.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/anthropic_messages.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/anthropic_vertex.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/base.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/builtins.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/dialect.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/gemini_generate.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/github_copilot_chat.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/google_antigravity.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/google_vertex.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/mistral_chat.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/ollama_chat.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/openai_codex_responses.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/openai_completions.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/openai_responses.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/openai_vertex.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/service.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/text/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/video/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/video/base.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/video/fal_video.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/video/openrouter_video.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/video/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/api/video/service.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/model/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/model/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/model/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/github_copilot.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/google_antigravity.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/openai_codex.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/pkce.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/oauth/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/provider/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/inference/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/message/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/message/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/message/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/auth.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/context.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/extensions.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/misc.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/model.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/commands/session.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/command_palette.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/config_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/extension_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/file_picker.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/model_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/oauth_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/overlays.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/selector_controller.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/session_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/settings_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/theme_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/thinking_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/tree_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/trust_screen.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/components/voice_selector.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/interactive/input_handler.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/print/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/rpc/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/rpc/mode.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/modes/rpc/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/packages/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/packages/manager.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/packages/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/packages/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/prompts/expand.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/prompts/loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/prompts/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/prompts/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/resources/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/resources/loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/resources/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/runtime/dependencies.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/runtime/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/session/branch_summarization.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/session/compaction.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/session/manager.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/session/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/session/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/settings/paths.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/settings/storage.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/settings/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/skills/loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/skills/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/skills/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/themes/loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/themes/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/themes/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tool/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tool/registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tool/render.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tool/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/trust/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/trust/manager.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/trust/types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/trust/utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/components/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/components/box.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/components/editor.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/components/select_list.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/keybinding_hints.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/tui/terminal.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/utils/__init__.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/utils/image_processing.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/utils/secrets.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau/utils/version_check.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau_coding_agent.egg-info/entry_points.txt +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau_coding_agent.egg-info/requires.txt +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tau_coding_agent.egg-info/top_level.txt +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_agent_compaction.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_agent_prompt.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_agent_types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_ansi.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_auth_command.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_auth_manager.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_auth_storage.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_branch_navigation.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_branch_summarization.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_builtin_watch.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_cli_inputs.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_command_execution_policy.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_command_registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_compaction.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_diff.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_editor_protocol.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_engine_types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_escape_behavior.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_extension_api.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_extension_lifecycle.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_footer_model.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_footer_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_fuzzy.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_http_proxy.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_image_processing.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_inference_api_text_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_inference_error_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_inference_types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_inference_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_keybindings.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_message_types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_message_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_model_availability.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_model_command.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_model_registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_model_selector_modal.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_model_types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_oauth_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_package_resources.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_packages_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_peer_extension.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_pkce.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_prompts_expand.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_prompts_loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_prompts_registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_provider_registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_resource_loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_rpc_mode.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_runtime_sdk.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_secrets.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_selector_controller.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_session_manager.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_session_trust_persist.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_session_types.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_session_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_settings_paths.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_settings_storage.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_settings_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_skills_loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_subagents_extension.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_text_llm_invoke.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_theme_loader.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_themes_registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tool_registry.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tool_render.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_trust_manager.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_trust_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tui_capabilities.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tui_layout_sizing.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tui_select_list.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_tui_utils.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_version_check.py +0 -0
- {tau_coding_agent-0.4.8 → tau_coding_agent-0.5.1}/tests/test_voice_selector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tau-coding-agent
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
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
|
|
@@ -75,7 +75,7 @@ tau # Interactive mode
|
|
|
75
75
|
tau --resume # Resume most recent session
|
|
76
76
|
tau --model claude-sonnet-4-6 # Use specific model
|
|
77
77
|
tau --print "Summarize this repo" # One-shot mode
|
|
78
|
-
tau
|
|
78
|
+
tau --provider anthropic --print "Explain this code" # Print mode with provider
|
|
79
79
|
tau --mode rpc # RPC mode for IDE extensions
|
|
80
80
|
```
|
|
81
81
|
|
|
@@ -83,13 +83,13 @@ tau --mode rpc # RPC mode for IDE extensions
|
|
|
83
83
|
|
|
84
84
|
## Features
|
|
85
85
|
|
|
86
|
-
- **Multi-provider LLM support** — Anthropic
|
|
86
|
+
- **Multi-provider LLM support** — Anthropic, OpenAI, Google Gemini, Mistral AI, Ollama, Groq, xAI, AWS Bedrock, OpenRouter, Z.ai, and more
|
|
87
87
|
- **Terminal UI** — Built-in chat interface with syntax highlighting, markdown rendering, and keyboard navigation
|
|
88
88
|
- **Rich media support** — Work with text files, images, audio files, and video files via file references or clipboard input
|
|
89
89
|
- **Session management** — Persistent sessions with branching, forking, and resuming capabilities
|
|
90
|
-
- **Tool execution** — Built-in tools (terminal, file I/O,
|
|
90
|
+
- **Tool execution** — Built-in tools (terminal, file I/O, search) with full user permissions and extensibility
|
|
91
91
|
- **Plugin system** — Add custom tools, slash commands, hooks, themes, and skills without modifying core code
|
|
92
|
-
- **
|
|
92
|
+
- **Themes** — Dark and light base themes, customizable and extensible via YAML
|
|
93
93
|
- **Context management** — Automatic context compaction and branch summarization for long conversations
|
|
94
94
|
- **Python API** — Embed Tau in your own applications programmatically
|
|
95
95
|
- **Multiple run modes** — Interactive TUI, print mode (one-shot), JSON event stream, and JSON-RPC for IDE integration
|
|
@@ -174,7 +174,7 @@ See [SECURITY.md](SECURITY.md) for detailed practices and vulnerability reportin
|
|
|
174
174
|
```bash
|
|
175
175
|
python -m pytest # Run tests
|
|
176
176
|
pyright tau/ # Type checking
|
|
177
|
-
python -m tau
|
|
177
|
+
python -m tau # Launch from source
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
See [Development Setup](docs/development.md) for detailed instructions.
|
|
@@ -41,7 +41,7 @@ tau # Interactive mode
|
|
|
41
41
|
tau --resume # Resume most recent session
|
|
42
42
|
tau --model claude-sonnet-4-6 # Use specific model
|
|
43
43
|
tau --print "Summarize this repo" # One-shot mode
|
|
44
|
-
tau
|
|
44
|
+
tau --provider anthropic --print "Explain this code" # Print mode with provider
|
|
45
45
|
tau --mode rpc # RPC mode for IDE extensions
|
|
46
46
|
```
|
|
47
47
|
|
|
@@ -49,13 +49,13 @@ tau --mode rpc # RPC mode for IDE extensions
|
|
|
49
49
|
|
|
50
50
|
## Features
|
|
51
51
|
|
|
52
|
-
- **Multi-provider LLM support** — Anthropic
|
|
52
|
+
- **Multi-provider LLM support** — Anthropic, OpenAI, Google Gemini, Mistral AI, Ollama, Groq, xAI, AWS Bedrock, OpenRouter, Z.ai, and more
|
|
53
53
|
- **Terminal UI** — Built-in chat interface with syntax highlighting, markdown rendering, and keyboard navigation
|
|
54
54
|
- **Rich media support** — Work with text files, images, audio files, and video files via file references or clipboard input
|
|
55
55
|
- **Session management** — Persistent sessions with branching, forking, and resuming capabilities
|
|
56
|
-
- **Tool execution** — Built-in tools (terminal, file I/O,
|
|
56
|
+
- **Tool execution** — Built-in tools (terminal, file I/O, search) with full user permissions and extensibility
|
|
57
57
|
- **Plugin system** — Add custom tools, slash commands, hooks, themes, and skills without modifying core code
|
|
58
|
-
- **
|
|
58
|
+
- **Themes** — Dark and light base themes, customizable and extensible via YAML
|
|
59
59
|
- **Context management** — Automatic context compaction and branch summarization for long conversations
|
|
60
60
|
- **Python API** — Embed Tau in your own applications programmatically
|
|
61
61
|
- **Multiple run modes** — Interactive TUI, print mode (one-shot), JSON event stream, and JSON-RPC for IDE integration
|
|
@@ -140,7 +140,7 @@ See [SECURITY.md](SECURITY.md) for detailed practices and vulnerability reportin
|
|
|
140
140
|
```bash
|
|
141
141
|
python -m pytest # Run tests
|
|
142
142
|
pyright tau/ # Type checking
|
|
143
|
-
python -m tau
|
|
143
|
+
python -m tau # Launch from source
|
|
144
144
|
```
|
|
145
145
|
|
|
146
146
|
See [Development Setup](docs/development.md) for detailed instructions.
|
|
@@ -61,7 +61,7 @@ User input flows through these stages:
|
|
|
61
61
|
| `console/` | CLI entry point, argument parsing |
|
|
62
62
|
| `runtime/` | Orchestrates agent, session, engine, extensions |
|
|
63
63
|
| `agent/` | Processes message turns, calls inference |
|
|
64
|
-
| `engine/` |
|
|
64
|
+
| `engine/` | Standalone inference and tool-execution loop |
|
|
65
65
|
| `inference/` | Unified interface to LLM providers |
|
|
66
66
|
|
|
67
67
|
### Data & State
|
|
@@ -79,7 +79,7 @@ User input flows through these stages:
|
|
|
79
79
|
|
|
80
80
|
| Module | Purpose |
|
|
81
81
|
|--------|---------|
|
|
82
|
-
| `tui/` |
|
|
82
|
+
| `tui/` | Standalone terminal rendering and component framework |
|
|
83
83
|
| `extensions/` | Plugin system API |
|
|
84
84
|
| `hooks/` | Event system for extensions |
|
|
85
85
|
| `commands/` | Slash command registry |
|
|
@@ -141,6 +141,9 @@ Each agent turn follows this sequence:
|
|
|
141
141
|
TUI overlays participate in focus lifecycle. Hiding or closing a capturing
|
|
142
142
|
overlay restores the next visible overlay or its previous focus target.
|
|
143
143
|
Components exposing `dispose()` are disposed when their overlay closes.
|
|
144
|
+
The reusable renderer, terminal, input, and component APIs are documented in
|
|
145
|
+
[Terminal UI](tui.md); runtime-aware composition lives in
|
|
146
|
+
`modes/interactive/`.
|
|
144
147
|
|
|
145
148
|
Slash commands declare whether they require an idle agent. Idle-only commands
|
|
146
149
|
are deferred until the current turn settles; UI-only and read-only commands may
|
|
@@ -204,7 +207,9 @@ class BaseAPI:
|
|
|
204
207
|
...
|
|
205
208
|
```
|
|
206
209
|
|
|
207
|
-
The inference module handles provider-specific details (API keys, endpoints,
|
|
210
|
+
The inference module handles provider-specific details (API keys, endpoints,
|
|
211
|
+
format conversions) and can also be used independently of the agent runtime.
|
|
212
|
+
See [Inference](inference.md) for its package boundaries and public clients.
|
|
208
213
|
|
|
209
214
|
## Tool Execution Model
|
|
210
215
|
|
|
@@ -219,10 +224,13 @@ Tools are executed in a sandboxed environment:
|
|
|
219
224
|
6. Result is serialized and added to context
|
|
220
225
|
```
|
|
221
226
|
|
|
222
|
-
Built-in tools (
|
|
227
|
+
Built-in tools (terminal, read, write, edit, glob, grep, ls) are enabled by default.
|
|
223
228
|
`RuntimeConfig` can allow or exclude tools by name. Custom tools are registered
|
|
224
229
|
via extensions or passed directly to the runtime.
|
|
225
230
|
|
|
231
|
+
The engine can also be embedded without the session-aware agent or runtime.
|
|
232
|
+
See [Engine](engine.md) for its public API and dependency boundary.
|
|
233
|
+
|
|
226
234
|
Programmatic runtimes can replace constructed services through
|
|
227
235
|
`RuntimeDependencies`. Typed factories cover settings, LLM/model/auth wiring,
|
|
228
236
|
session storage, hooks, and the tool registry. Session-bound factories run
|
|
@@ -206,8 +206,8 @@ Events do **not** have an `id` field. Only responses do.
|
|
|
206
206
|
|
|
207
207
|
| Command | Key fields | Description |
|
|
208
208
|
|---------|-----------|-------------|
|
|
209
|
-
| `
|
|
210
|
-
| `
|
|
209
|
+
| `terminal` | `command` (required), `excludeFromContext?` | Run a shell command; output is added to the next LLM context |
|
|
210
|
+
| `abort_terminal` | — | Abort a running terminal subprocess |
|
|
211
211
|
|
|
212
212
|
##### Session
|
|
213
213
|
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Creating Tools
|
|
2
|
+
|
|
3
|
+
Tools are typed asynchronous operations that a model can request. A tool
|
|
4
|
+
defines its name, description, Pydantic input schema, execution policy, and
|
|
5
|
+
result handling.
|
|
6
|
+
|
|
7
|
+
Use this guide to implement and test a tool. See [Tools](tools.md) for the
|
|
8
|
+
built-in tool reference and execution model.
|
|
9
|
+
|
|
10
|
+
## Implement a Tool
|
|
11
|
+
|
|
12
|
+
This example creates a read-only word-count tool:
|
|
13
|
+
|
|
14
|
+
```python
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, Field
|
|
20
|
+
|
|
21
|
+
from tau.tool.types import (
|
|
22
|
+
AbortSignal,
|
|
23
|
+
Tool,
|
|
24
|
+
ToolContext,
|
|
25
|
+
ToolExecutionMode,
|
|
26
|
+
ToolExecutionUpdateCallback,
|
|
27
|
+
ToolInvocation,
|
|
28
|
+
ToolKind,
|
|
29
|
+
ToolResult,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class WordCountParams(BaseModel):
|
|
34
|
+
"""Validated parameters for the word-count tool."""
|
|
35
|
+
|
|
36
|
+
path: str = Field(description="Text file path, relative to the working directory.")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class WordCountTool(Tool):
|
|
40
|
+
"""Count words in a UTF-8 text file."""
|
|
41
|
+
|
|
42
|
+
def __init__(self) -> None:
|
|
43
|
+
super().__init__(
|
|
44
|
+
name="word_count",
|
|
45
|
+
description="Count the words in a UTF-8 text file.",
|
|
46
|
+
schema=WordCountParams,
|
|
47
|
+
kind=ToolKind.Read,
|
|
48
|
+
execution_mode=ToolExecutionMode.Parallel,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
async def execute(
|
|
52
|
+
self,
|
|
53
|
+
invocation: ToolInvocation,
|
|
54
|
+
tool_execution_update_callback: ToolExecutionUpdateCallback | None = None,
|
|
55
|
+
signal: AbortSignal | None = None,
|
|
56
|
+
context: ToolContext | None = None,
|
|
57
|
+
) -> ToolResult:
|
|
58
|
+
params = WordCountParams.model_validate(invocation.params)
|
|
59
|
+
|
|
60
|
+
if signal is not None and signal.is_set():
|
|
61
|
+
return ToolResult.error(invocation.id, "Word count cancelled.")
|
|
62
|
+
|
|
63
|
+
base = context.cwd if context is not None and context.cwd is not None else Path.cwd()
|
|
64
|
+
path = Path(params.path)
|
|
65
|
+
if not path.is_absolute():
|
|
66
|
+
path = base / path
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
content = path.read_text(encoding="utf-8")
|
|
70
|
+
except OSError as error:
|
|
71
|
+
return ToolResult.error(invocation.id, f"Cannot read {path}: {error}")
|
|
72
|
+
|
|
73
|
+
count = len(content.split())
|
|
74
|
+
return ToolResult.ok(
|
|
75
|
+
invocation.id,
|
|
76
|
+
f"{path}: {count} words",
|
|
77
|
+
metadata={"path": str(path), "word_count": count},
|
|
78
|
+
)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The engine validates `invocation.params` against `schema` before execution.
|
|
82
|
+
Validating again inside `execute()` produces a typed parameter object and keeps
|
|
83
|
+
the tool safe when called directly in tests.
|
|
84
|
+
|
|
85
|
+
## Define Clear Metadata
|
|
86
|
+
|
|
87
|
+
Constructor fields affect both model behavior and execution:
|
|
88
|
+
|
|
89
|
+
| Field | Guidance |
|
|
90
|
+
|-------|----------|
|
|
91
|
+
| `name` | Use a stable lowercase identifier with underscores |
|
|
92
|
+
| `description` | State what the tool does and when it should be used |
|
|
93
|
+
| `schema` | Use Pydantic fields with precise descriptions and constraints |
|
|
94
|
+
| `kind` | Classify the side effect as read, edit, write, execute, or web |
|
|
95
|
+
| `execution_mode` | Use parallel only when concurrent calls are safe |
|
|
96
|
+
|
|
97
|
+
Tools that mutate files, launch processes, or modify external state should
|
|
98
|
+
normally use `ToolExecutionMode.Sequential`. Read-only operations may use
|
|
99
|
+
`Parallel` when they do not share mutable state.
|
|
100
|
+
|
|
101
|
+
## Return Results
|
|
102
|
+
|
|
103
|
+
Return model-facing text with one of the result constructors:
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
return ToolResult.ok(invocation.id, "Completed", metadata={"items": 3})
|
|
107
|
+
return ToolResult.error(invocation.id, "The requested file does not exist")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Keep `content` concise and actionable. Use `metadata` for structured facts
|
|
111
|
+
needed by hooks or renderers, not for duplicating the complete text result.
|
|
112
|
+
|
|
113
|
+
For Markdown rendering of a successful result:
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
return ToolResult.ok(
|
|
117
|
+
invocation.id,
|
|
118
|
+
"## Results\n\n- First\n- Second",
|
|
119
|
+
metadata={"_render_format": "markdown"},
|
|
120
|
+
)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Use Runtime Context
|
|
124
|
+
|
|
125
|
+
`ToolContext` provides optional runtime services:
|
|
126
|
+
|
|
127
|
+
| Attribute | Value |
|
|
128
|
+
|-----------|-------|
|
|
129
|
+
| `cwd` | Current engine working directory |
|
|
130
|
+
| `llm` | Active text inference client |
|
|
131
|
+
| `settings` | Active settings manager, when available |
|
|
132
|
+
|
|
133
|
+
Treat every attribute as optional because tools can be unit-tested or called
|
|
134
|
+
outside the complete runtime.
|
|
135
|
+
|
|
136
|
+
Long-running tools should check `signal.is_set()` at safe cancellation points.
|
|
137
|
+
Tools that produce incremental output can call
|
|
138
|
+
`tool_execution_update_callback` with partial `ToolResult` values.
|
|
139
|
+
High-frequency producers should throttle updates so they do not flood engine
|
|
140
|
+
events or terminal renders. Emit an initial update when work begins and a final
|
|
141
|
+
update matching the returned result.
|
|
142
|
+
|
|
143
|
+
## Register the Tool
|
|
144
|
+
|
|
145
|
+
### Project or Global Extension
|
|
146
|
+
|
|
147
|
+
Create `.tau/extensions/word_count.py` for one project, or
|
|
148
|
+
`~/.tau/extensions/word_count.py` for all projects:
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
from tau.extensions import ExtensionAPI
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def register(tau: ExtensionAPI) -> None:
|
|
155
|
+
tau.register_tool(WordCountTool())
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Run `/reload` after changing an extension.
|
|
159
|
+
|
|
160
|
+
### Python Runtime
|
|
161
|
+
|
|
162
|
+
Pass tool instances through `RuntimeConfig`:
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
from pathlib import Path
|
|
166
|
+
|
|
167
|
+
from tau.runtime.types import RuntimeConfig
|
|
168
|
+
|
|
169
|
+
config = RuntimeConfig(
|
|
170
|
+
cwd=Path.cwd(),
|
|
171
|
+
tools=[WordCountTool()],
|
|
172
|
+
)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Standalone Engine
|
|
176
|
+
|
|
177
|
+
Supply tools to both `Engine` and `EngineContext`:
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
from pathlib import Path
|
|
181
|
+
|
|
182
|
+
from tau.engine import Engine, EngineContext
|
|
183
|
+
from tau.message.types import UserMessage
|
|
184
|
+
|
|
185
|
+
tools = [WordCountTool()]
|
|
186
|
+
engine = Engine(cwd=Path.cwd(), llm=llm, tools=tools)
|
|
187
|
+
|
|
188
|
+
await engine.run(
|
|
189
|
+
EngineContext(
|
|
190
|
+
system_prompt="Use tools when they answer the request.",
|
|
191
|
+
messages=[UserMessage.from_text("Count the words in README.md")],
|
|
192
|
+
tools=tools,
|
|
193
|
+
)
|
|
194
|
+
)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
See [Engine](engine.md) for standalone lifecycle and event handling.
|
|
198
|
+
|
|
199
|
+
## Test the Tool
|
|
200
|
+
|
|
201
|
+
Test execution without making an inference request:
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
from pathlib import Path
|
|
205
|
+
|
|
206
|
+
import pytest
|
|
207
|
+
|
|
208
|
+
from tau.tool.types import ToolContext, ToolInvocation
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@pytest.mark.asyncio
|
|
212
|
+
async def test_word_count(tmp_path: Path) -> None:
|
|
213
|
+
source = tmp_path / "sample.txt"
|
|
214
|
+
source.write_text("one two three", encoding="utf-8")
|
|
215
|
+
tool = WordCountTool()
|
|
216
|
+
|
|
217
|
+
result = await tool.execute(
|
|
218
|
+
ToolInvocation(
|
|
219
|
+
id="call-1",
|
|
220
|
+
name=tool.name,
|
|
221
|
+
cwd=tmp_path,
|
|
222
|
+
params={"path": "sample.txt"},
|
|
223
|
+
),
|
|
224
|
+
context=ToolContext(cwd=tmp_path),
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
assert not result.is_error
|
|
228
|
+
assert result.metadata["word_count"] == 3
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Also test invalid parameters, missing resources, cancellation, and concurrent
|
|
232
|
+
execution when the tool declares parallel safety.
|
|
233
|
+
|
|
234
|
+
## Checklist
|
|
235
|
+
|
|
236
|
+
- Parameter types and constraints are expressed in the Pydantic schema.
|
|
237
|
+
- The description explains when the model should call the tool.
|
|
238
|
+
- Side effects match `ToolKind` and `ToolExecutionMode`.
|
|
239
|
+
- Errors are returned as `ToolResult.error`, not leaked as raw tracebacks.
|
|
240
|
+
- Paths are resolved against `ToolContext.cwd`.
|
|
241
|
+
- Cancellation is checked during long operations.
|
|
242
|
+
- Unit tests cover success and failure paths.
|
|
@@ -128,40 +128,30 @@ ruff format tau/
|
|
|
128
128
|
4. Test manually:
|
|
129
129
|
```bash
|
|
130
130
|
tau -p "test prompt"
|
|
131
|
-
tau --list-models
|
|
132
131
|
```
|
|
133
132
|
|
|
134
133
|
## Testing
|
|
135
134
|
|
|
136
135
|
### Test Structure
|
|
137
136
|
|
|
138
|
-
Tests are organized by module:
|
|
137
|
+
Tests are organized by module, with granular filenames per submodule:
|
|
139
138
|
|
|
140
139
|
```text
|
|
141
140
|
tests/
|
|
142
|
-
├──
|
|
143
|
-
├──
|
|
144
|
-
├──
|
|
145
|
-
|
|
141
|
+
├── test_agent_compaction.py
|
|
142
|
+
├── test_agent_prompt.py
|
|
143
|
+
├── test_agent_types.py
|
|
144
|
+
├── test_inference_dialect.py
|
|
145
|
+
├── test_inference_types.py
|
|
146
|
+
├── test_engine_execution.py
|
|
147
|
+
├── test_engine_steering.py
|
|
148
|
+
├── test_tui_renderer.py
|
|
149
|
+
└── ...
|
|
146
150
|
```
|
|
147
151
|
|
|
148
152
|
### Writing Tests
|
|
149
153
|
|
|
150
|
-
Use pytest
|
|
151
|
-
|
|
152
|
-
```python
|
|
153
|
-
import pytest
|
|
154
|
-
from tau.agent import Agent
|
|
155
|
-
|
|
156
|
-
def test_agent_creation():
|
|
157
|
-
agent = Agent(client=MockClient())
|
|
158
|
-
assert agent is not None
|
|
159
|
-
|
|
160
|
-
def test_agent_run():
|
|
161
|
-
agent = Agent(client=MockClient())
|
|
162
|
-
result = agent.run("test prompt")
|
|
163
|
-
assert "result" in result.lower()
|
|
164
|
-
```
|
|
154
|
+
Use pytest, following the existing patterns in `tests/`.
|
|
165
155
|
|
|
166
156
|
### Running Tests
|
|
167
157
|
|
|
@@ -172,11 +162,8 @@ python -m pytest
|
|
|
172
162
|
# Run with verbose output
|
|
173
163
|
python -m pytest -v
|
|
174
164
|
|
|
175
|
-
# Run
|
|
176
|
-
python -m pytest
|
|
177
|
-
|
|
178
|
-
# Run specific test file
|
|
179
|
-
python -m pytest tests/test_agent.py
|
|
165
|
+
# Run a specific module's tests
|
|
166
|
+
python -m pytest tests/test_agent_compaction.py
|
|
180
167
|
```
|
|
181
168
|
|
|
182
169
|
## Debugging
|
|
@@ -28,6 +28,18 @@
|
|
|
28
28
|
{
|
|
29
29
|
"title": "Core Concepts",
|
|
30
30
|
"items": [
|
|
31
|
+
{
|
|
32
|
+
"title": "Inference",
|
|
33
|
+
"path": "inference.md"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"title": "Engine",
|
|
37
|
+
"path": "engine.md"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"title": "Terminal UI",
|
|
41
|
+
"path": "tui.md"
|
|
42
|
+
},
|
|
31
43
|
{
|
|
32
44
|
"title": "Inference Providers",
|
|
33
45
|
"path": "inference-providers.md"
|
|
@@ -44,6 +56,10 @@
|
|
|
44
56
|
"title": "Tools",
|
|
45
57
|
"path": "tools.md"
|
|
46
58
|
},
|
|
59
|
+
{
|
|
60
|
+
"title": "Creating Tools",
|
|
61
|
+
"path": "creating-tools.md"
|
|
62
|
+
},
|
|
47
63
|
{
|
|
48
64
|
"title": "Project Context",
|
|
49
65
|
"path": "project-context.md"
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Engine
|
|
2
|
+
|
|
3
|
+
`tau.engine` is Tau's standalone text-inference and tool-execution loop. It can
|
|
4
|
+
be embedded directly when an application needs agentic model/tool iteration
|
|
5
|
+
without Tau's sessions, compaction, extensions, runtime lifecycle, or terminal
|
|
6
|
+
UI.
|
|
7
|
+
|
|
8
|
+
Use [Inference](inference.md) instead when the application only needs a single
|
|
9
|
+
model request and will manage tool calls itself. Use the
|
|
10
|
+
[Python API](python-api.md) when the application needs the complete Tau runtime.
|
|
11
|
+
|
|
12
|
+
## Responsibilities
|
|
13
|
+
|
|
14
|
+
The engine:
|
|
15
|
+
|
|
16
|
+
- streams normalized text inference events
|
|
17
|
+
- accumulates assistant messages
|
|
18
|
+
- validates and executes requested tools
|
|
19
|
+
- runs safe tool batches sequentially or concurrently
|
|
20
|
+
- emits message, turn, tool, and engine lifecycle events
|
|
21
|
+
- supports steering, follow-up messages, continuation, and cancellation
|
|
22
|
+
|
|
23
|
+
The engine does not persist messages, compact context, discover extensions,
|
|
24
|
+
construct the application system prompt, or manage the user interface.
|
|
25
|
+
`tau.agent` owns session-aware orchestration around the engine, while
|
|
26
|
+
`tau.runtime` constructs and connects the full application.
|
|
27
|
+
|
|
28
|
+
## Public API
|
|
29
|
+
|
|
30
|
+
| Type | Purpose |
|
|
31
|
+
|------|---------|
|
|
32
|
+
| `Engine` | Streaming inference and tool-execution service |
|
|
33
|
+
| `EngineContext` | System prompt, message history, and tools for one run |
|
|
34
|
+
| `EngineOptions` | Execution strategy and lifecycle callbacks |
|
|
35
|
+
| `EngineState` | Observable mutable execution state |
|
|
36
|
+
|
|
37
|
+
The former `Agent` and `AgentState` names remain compatibility aliases, and
|
|
38
|
+
`AgentOptions` is the descriptive compatibility name for `EngineOptions`.
|
|
39
|
+
New code should use the explicit `Engine` names.
|
|
40
|
+
|
|
41
|
+
## Basic Example
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
import asyncio
|
|
45
|
+
from pathlib import Path
|
|
46
|
+
|
|
47
|
+
from tau.engine import Engine, EngineContext, MessageEndEvent
|
|
48
|
+
from tau.inference.api.text.service import TextLLM
|
|
49
|
+
from tau.message.types import UserMessage
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
async def main() -> None:
|
|
53
|
+
llm = TextLLM("gpt-4o")
|
|
54
|
+
engine = Engine(cwd=Path.cwd(), llm=llm, tools=[])
|
|
55
|
+
|
|
56
|
+
def print_completed_message(event: object) -> None:
|
|
57
|
+
if isinstance(event, MessageEndEvent):
|
|
58
|
+
print(event.message)
|
|
59
|
+
|
|
60
|
+
await engine.subscribe(print_completed_message)
|
|
61
|
+
await engine.run(
|
|
62
|
+
EngineContext(
|
|
63
|
+
system_prompt="Answer concisely.",
|
|
64
|
+
messages=[UserMessage.from_text("What does an execution engine do?")],
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
asyncio.run(main())
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Configure the model provider before running the example. See
|
|
73
|
+
[Inference Providers](inference-providers.md).
|
|
74
|
+
|
|
75
|
+
## Supplying Tools
|
|
76
|
+
|
|
77
|
+
Pass the same tool objects to both the engine and the run context:
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
tools = [read_tool, terminal_tool]
|
|
81
|
+
engine = Engine(cwd=Path.cwd(), llm=llm, tools=tools)
|
|
82
|
+
|
|
83
|
+
await engine.run(
|
|
84
|
+
EngineContext(
|
|
85
|
+
system_prompt="Use tools when needed.",
|
|
86
|
+
messages=[UserMessage.from_text("Inspect this project.")],
|
|
87
|
+
tools=tools,
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Tools declare their own execution safety. A batch runs concurrently only when
|
|
93
|
+
every tool in that batch permits parallel execution; otherwise source order is
|
|
94
|
+
preserved.
|
|
95
|
+
|
|
96
|
+
## Lifecycle Control
|
|
97
|
+
|
|
98
|
+
- `subscribe(handler)` observes engine events and returns an unsubscribe
|
|
99
|
+
callback.
|
|
100
|
+
- `steer(message)` injects guidance during an active tool loop.
|
|
101
|
+
- `follow_up(message)` queues another user message after a natural stop.
|
|
102
|
+
- `abort()` cancels the active stream at the next safe boundary.
|
|
103
|
+
- `run_continue()` resumes from the engine's current in-memory history.
|
|
104
|
+
- `wait_for_idle()` waits until the active loop exits.
|
|
105
|
+
|
|
106
|
+
Engine history is in memory only. Applications using the engine directly are
|
|
107
|
+
responsible for durable storage and for constructing the next
|
|
108
|
+
`EngineContext`.
|
|
109
|
+
|
|
110
|
+
## Dependency Boundary
|
|
111
|
+
|
|
112
|
+
`tau.engine` depends on inference, messages, tools, hooks, and optional
|
|
113
|
+
settings. It must not import session, extension, TUI, runtime, or agent
|
|
114
|
+
services. This keeps the engine independently testable and embeddable.
|
|
@@ -445,7 +445,7 @@ Use the explicit `group` type when you want the sub-panel to have a header label
|
|
|
445
445
|
#### Basic example
|
|
446
446
|
|
|
447
447
|
```python
|
|
448
|
-
from tau.
|
|
448
|
+
from tau.modes.interactive.components.settings_selector import SettingItem
|
|
449
449
|
|
|
450
450
|
def register(tau):
|
|
451
451
|
def on_change(key, value):
|
|
@@ -130,6 +130,8 @@ async def register(tau):
|
|
|
130
130
|
## Tools
|
|
131
131
|
|
|
132
132
|
Import from `tau.tool.types`. Use a Pydantic `BaseModel` for the parameter schema.
|
|
133
|
+
For a focused walkthrough covering implementation, registration, and testing,
|
|
134
|
+
see [Creating Tools](creating-tools.md).
|
|
133
135
|
|
|
134
136
|
```python
|
|
135
137
|
from pydantic import BaseModel, Field
|
|
@@ -1188,7 +1190,7 @@ def my_footer(tui, theme):
|
|
|
1188
1190
|
return StaticComponent([f" {theme.primary}Custom footer{RESET} "])
|
|
1189
1191
|
|
|
1190
1192
|
# With TUI + theme + live data (recommended)
|
|
1191
|
-
from tau.
|
|
1193
|
+
from tau.modes.interactive.ui_context import FooterData
|
|
1192
1194
|
|
|
1193
1195
|
def my_footer(tui, theme, data: FooterData):
|
|
1194
1196
|
branch = data.git_branch or "detached"
|
|
@@ -1328,7 +1330,7 @@ ctx.ui.paste_to_editor("@file.py ") # insert at cursor position
|
|
|
1328
1330
|
|
|
1329
1331
|
```python
|
|
1330
1332
|
names = ctx.ui.get_all_themes() # list[str] of theme names
|
|
1331
|
-
ok = ctx.ui.set_theme("
|
|
1333
|
+
ok = ctx.ui.set_theme("dark") # True on success, False if unknown
|
|
1332
1334
|
theme = ctx.ui.theme # LayoutTheme — current active theme
|
|
1333
1335
|
```
|
|
1334
1336
|
|
|
@@ -124,7 +124,8 @@ api_base = "https://api.example.com"
|
|
|
124
124
|
proxies = get_proxies_for_client(api_base, settings_manager)
|
|
125
125
|
headers = get_proxy_headers(settings_manager)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
mounts = {s: httpx.AsyncHTTPTransport(proxy=u) for s, u in proxies.items()} if proxies else None
|
|
128
|
+
async with httpx.AsyncClient(mounts=mounts, headers=headers) as client:
|
|
128
129
|
response = await client.get(f"{api_base}/v1/models")
|
|
129
130
|
```
|
|
130
131
|
|
|
@@ -144,7 +145,8 @@ headers = {
|
|
|
144
145
|
**proxy_headers, # Include custom proxy headers
|
|
145
146
|
}
|
|
146
147
|
|
|
147
|
-
|
|
148
|
+
mounts = {s: httpx.AsyncHTTPTransport(proxy=u) for s, u in proxies.items()} if proxies else None
|
|
149
|
+
async with httpx.AsyncClient(mounts=mounts, headers=headers) as client:
|
|
148
150
|
response = await client.get(f"{api_base}/v1/models")
|
|
149
151
|
```
|
|
150
152
|
|
|
@@ -159,9 +161,9 @@ proxy_url = get_proxy_url_for_target(api_base)
|
|
|
159
161
|
|
|
160
162
|
client_kwargs = {}
|
|
161
163
|
if proxy_url:
|
|
162
|
-
client_kwargs["
|
|
163
|
-
"http://": proxy_url,
|
|
164
|
-
"https://": proxy_url,
|
|
164
|
+
client_kwargs["mounts"] = {
|
|
165
|
+
"http://": httpx.AsyncHTTPTransport(proxy=proxy_url),
|
|
166
|
+
"https://": httpx.AsyncHTTPTransport(proxy=proxy_url),
|
|
165
167
|
}
|
|
166
168
|
|
|
167
169
|
async with httpx.AsyncClient(**client_kwargs) as client:
|
|
@@ -334,7 +336,8 @@ from tau.utils.http_proxy import get_proxies_for_client
|
|
|
334
336
|
import httpx
|
|
335
337
|
|
|
336
338
|
proxies = get_proxies_for_client("https://api.example.com")
|
|
337
|
-
|
|
339
|
+
mounts = {s: httpx.AsyncHTTPTransport(proxy=u) for s, u in proxies.items()} if proxies else None
|
|
340
|
+
async with httpx.AsyncClient(mounts=mounts) as client:
|
|
338
341
|
response = await client.get("...")
|
|
339
342
|
```
|
|
340
343
|
|