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