tau-coding-agent 0.3.9__tar.gz → 0.4.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tau_coding_agent-0.3.9/tau_coding_agent.egg-info → tau_coding_agent-0.4.5}/PKG-INFO +3 -3
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/README.md +2 -2
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/architecture.md +12 -5
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/cli-reference.md +15 -7
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/extension-settings.md +211 -6
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/extensions.md +88 -8
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/keybindings.md +8 -3
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/messages.md +6 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/project-structure.md +27 -29
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/python-api.md +10 -2
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/sessions.md +40 -6
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/settings.md +10 -3
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/tools.md +36 -10
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/usage.md +2 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/pyproject.toml +2 -2
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/prompt/builder.py +2 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/service.py +253 -83
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/types.py +2 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/__init__.py +7 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/git.py +1 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/model.py +26 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/header/__init__.py +1 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/text.py +91 -0
- tau_coding_agent-0.4.5/tau/builtins/providers/audio.py +22 -0
- tau_coding_agent-0.4.5/tau/builtins/providers/image.py +31 -0
- tau_coding_agent-0.4.5/tau/builtins/providers/video.py +11 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/edit.py +87 -84
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/glob.py +22 -28
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/grep.py +29 -64
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/ls.py +4 -21
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/read.py +17 -20
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/terminal.py +76 -35
- tau_coding_agent-0.4.5/tau/builtins/tools/utils.py +129 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/write.py +7 -13
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/commands/registry.py +33 -10
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/cli.py +119 -13
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/packages.py +13 -4
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/update.py +43 -10
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/core/registry.py +2 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/engine/service.py +198 -141
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/engine/types.py +3 -2
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/api.py +154 -11
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/context.py +122 -9
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/loader.py +52 -6
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/runtime.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/__init__.py +12 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/engine.py +21 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/service.py +7 -6
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/session.py +49 -2
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/types.py +12 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/service.py +13 -1
- tau_coding_agent-0.4.5/tau/inference/api/availability.py +64 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/service.py +8 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_claude_code.py +6 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_messages.py +6 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/anthropic_vertex.py +7 -2
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/gemini_generate.py +2 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/github_copilot_chat.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_antigravity.py +5 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/google_vertex.py +6 -4
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/mistral_chat.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_codex_responses.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_completions.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_responses.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/openai_vertex.py +1 -3
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/service.py +10 -35
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/service.py +8 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/model/types.py +13 -4
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/__init__.py +11 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/registry.py +3 -3
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/types.py +6 -3
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/types.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/utils.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/message/types.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/message/utils.py +5 -2
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/agent_hooks.py +9 -9
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/app.py +206 -104
- tau_coding_agent-0.4.5/tau/modes/interactive/commands/__init__.py +3 -0
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/appearance.py +102 -86
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/auth.py +87 -41
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/context.py +1 -1
- tau_coding_agent-0.4.5/tau/modes/interactive/commands/extensions.py +105 -0
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/misc.py +1 -1
- tau_coding_agent-0.4.5/tau/modes/interactive/commands/model.py +198 -0
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/commands/session.py +17 -9
- tau_coding_agent-0.4.5/tau/modes/interactive/components/__init__.py +0 -0
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/command_palette.py +18 -9
- tau_coding_agent-0.4.5/tau/modes/interactive/components/config_selector.py +233 -0
- tau_coding_agent-0.4.5/tau/modes/interactive/components/extension_selector.py +116 -0
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/file_picker.py +21 -10
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/layout.py +336 -280
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/message_list.py +145 -32
- tau_coding_agent-0.4.5/tau/modes/interactive/components/model_selector.py +283 -0
- tau_coding_agent-0.4.5/tau/modes/interactive/components/oauth_selector.py +132 -0
- tau_coding_agent-0.3.9/tau/tui/components/prompt_overlay.py → tau_coding_agent-0.4.5/tau/modes/interactive/components/overlays.py +163 -2
- tau_coding_agent-0.4.5/tau/modes/interactive/components/selector_controller.py +203 -0
- tau_coding_agent-0.3.9/tau/tui/components/resume_modal.py → tau_coding_agent-0.4.5/tau/modes/interactive/components/session_selector.py +45 -46
- tau_coding_agent-0.4.5/tau/modes/interactive/components/settings_selector.py +620 -0
- tau_coding_agent-0.4.5/tau/modes/interactive/components/theme_selector.py +102 -0
- tau_coding_agent-0.4.5/tau/modes/interactive/components/thinking_selector.py +95 -0
- tau_coding_agent-0.3.9/tau/tui/components/tree_select_list.py → tau_coding_agent-0.4.5/tau/modes/interactive/components/tree_selector.py +1 -2
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/components/trust_screen.py +16 -15
- {tau_coding_agent-0.3.9/tau/tui → tau_coding_agent-0.4.5/tau/modes/interactive}/input_handler.py +7 -5
- tau_coding_agent-0.4.5/tau/modes/print/__init__.py +0 -0
- tau_coding_agent-0.4.5/tau/modes/rpc/__init__.py +8 -0
- {tau_coding_agent-0.3.9/tau → tau_coding_agent-0.4.5/tau/modes}/rpc/mode.py +8 -8
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/manager.py +68 -5
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/types.py +1 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/utils.py +50 -5
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/runtime/service.py +187 -67
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/runtime/types.py +104 -34
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/branch_summarization.py +74 -32
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/compaction.py +111 -22
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/manager.py +79 -47
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/utils.py +6 -2
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/manager.py +75 -25
- tau_coding_agent-0.4.5/tau/settings/paths.py +347 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/types.py +35 -4
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/skills/registry.py +1 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/themes/loader.py +84 -12
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/themes/registry.py +25 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/registry.py +27 -15
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/render.py +1 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/types.py +19 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/manager.py +6 -4
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/utils.py +2 -4
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/__init__.py +16 -1
- tau_coding_agent-0.3.9/tau/tui/components/autocomplete_manager.py → tau_coding_agent-0.4.5/tau/tui/autocomplete.py +211 -9
- tau_coding_agent-0.4.5/tau/tui/component.py +512 -0
- tau_coding_agent-0.4.5/tau/tui/components/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/box.py +17 -1
- tau_coding_agent-0.4.5/tau/tui/components/editor.py +73 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/image.py +1 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/select_list.py +40 -5
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/spinner.py +5 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/components/text_input.py +124 -10
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/input.py +166 -8
- tau_coding_agent-0.4.5/tau/tui/keybinding_hints.py +41 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/markdown.py +50 -10
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/terminal.py +135 -6
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/theme.py +20 -2
- tau_coding_agent-0.4.5/tau/tui/tui.py +1289 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tui/ui_context.py +107 -6
- tau_coding_agent-0.3.9/tau/tui/ansi.py → tau_coding_agent-0.4.5/tau/tui/utils.py +234 -0
- tau_coding_agent-0.4.5/tau/utils/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5/tau_coding_agent.egg-info}/PKG-INFO +3 -3
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/SOURCES.txt +56 -39
- tau_coding_agent-0.4.5/tests/test_agent_compaction.py +264 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_agent_types.py +4 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_ansi.py +11 -11
- tau_coding_agent-0.4.5/tests/test_auth_command.py +41 -0
- tau_coding_agent-0.4.5/tests/test_branch_navigation.py +127 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_branch_summarization.py +105 -11
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_builtin_tools.py +217 -75
- tau_coding_agent-0.4.5/tests/test_cli_inputs.py +40 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_command_registry.py +16 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_compaction.py +111 -8
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_diff.py +1 -1
- tau_coding_agent-0.4.5/tests/test_editor_protocol.py +67 -0
- tau_coding_agent-0.4.5/tests/test_engine_execution.py +78 -0
- tau_coding_agent-0.4.5/tests/test_engine_steering.py +284 -0
- tau_coding_agent-0.4.5/tests/test_extension_api.py +291 -0
- tau_coding_agent-0.4.5/tests/test_footer_model.py +86 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_fuzzy.py +1 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_keybindings.py +4 -4
- tau_coding_agent-0.4.5/tests/test_model_availability.py +118 -0
- tau_coding_agent-0.4.5/tests/test_model_selector_modal.py +153 -0
- tau_coding_agent-0.4.5/tests/test_package_resources.py +66 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_packages_utils.py +40 -5
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_provider_registry.py +6 -6
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_rpc_mode.py +1 -1
- tau_coding_agent-0.4.5/tests/test_selector_controller.py +36 -0
- tau_coding_agent-0.4.5/tests/test_session_manager.py +97 -0
- tau_coding_agent-0.4.5/tests/test_settings_manager.py +253 -0
- tau_coding_agent-0.4.5/tests/test_text_input.py +17 -0
- tau_coding_agent-0.4.5/tests/test_thinking_render.py +53 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tool_registry.py +12 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tool_render.py +38 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_capabilities.py +1 -1
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_input.py +70 -1
- tau_coding_agent-0.4.5/tests/test_tui_layout_sizing.py +182 -0
- tau_coding_agent-0.4.5/tests/test_ui_context.py +42 -0
- tau_coding_agent-0.3.9/tau/builtins/providers/audio.py +0 -10
- tau_coding_agent-0.3.9/tau/builtins/providers/image.py +0 -15
- tau_coding_agent-0.3.9/tau/builtins/providers/video.py +0 -8
- tau_coding_agent-0.3.9/tau/rpc/__init__.py +0 -8
- tau_coding_agent-0.3.9/tau/settings/paths.py +0 -171
- tau_coding_agent-0.3.9/tau/tui/autocomplete.py +0 -36
- tau_coding_agent-0.3.9/tau/tui/capabilities.py +0 -124
- tau_coding_agent-0.3.9/tau/tui/commands/__init__.py +0 -3
- tau_coding_agent-0.3.9/tau/tui/commands/model.py +0 -129
- tau_coding_agent-0.3.9/tau/tui/component.py +0 -258
- tau_coding_agent-0.3.9/tau/tui/components/autocomplete_picker.py +0 -147
- tau_coding_agent-0.3.9/tau/tui/components/dynamic_border.py +0 -19
- tau_coding_agent-0.3.9/tau/tui/components/inline_selector.py +0 -73
- tau_coding_agent-0.3.9/tau/tui/components/modal.py +0 -97
- tau_coding_agent-0.3.9/tau/tui/components/model_palette.py +0 -221
- tau_coding_agent-0.3.9/tau/tui/components/picker_overlay.py +0 -178
- tau_coding_agent-0.3.9/tau/tui/components/settings_modal.py +0 -279
- tau_coding_agent-0.3.9/tau/tui/components/settings_schema.py +0 -223
- tau_coding_agent-0.3.9/tau/tui/components/text_prompt.py +0 -83
- tau_coding_agent-0.3.9/tau/tui/diff.py +0 -114
- tau_coding_agent-0.3.9/tau/tui/fuzzy.py +0 -99
- tau_coding_agent-0.3.9/tau/tui/keybindings.py +0 -90
- tau_coding_agent-0.3.9/tau/tui/message_renderers.py +0 -32
- tau_coding_agent-0.3.9/tau/tui/overlay.py +0 -334
- tau_coding_agent-0.3.9/tau/tui/renderer.py +0 -390
- tau_coding_agent-0.3.9/tau/tui/tui.py +0 -563
- tau_coding_agent-0.3.9/tau/tui/utils.py +0 -20
- tau_coding_agent-0.3.9/tests/test_settings_manager.py +0 -150
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/LICENSE +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/MANIFEST.in +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/auth.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/development.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/docs.json +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/http-proxy.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/index.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/inference-providers.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/installation.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/project-context.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/prompts.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/quickstart.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/skills.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/docs/themes.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/setup.cfg +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/prompt/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/agent/prompt/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/auth/manager.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/auth/storage.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/auth/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/clear.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/compact.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/reload.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/commands/session.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/extensions/footer/utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/audio.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/image.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/models/video.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/commit.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/docs.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/explain.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/fix.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/refactor.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/review.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/prompts/test.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/providers/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/providers/text.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/skills/code-review/SKILL.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/skills/debug/SKILL.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/skills/git-commit/SKILL.md +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/themes/dark.yaml +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/themes/light.yaml +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/builtins/tools/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/commands/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/commands/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/console/commands/auth.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/core/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/engine/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/extensions/settings.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/inference.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/runtime.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/hooks/tui.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/base.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/builtins.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/gemini_audio.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/openai_audio.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/sarvam_audio.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/audio/utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/base.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/builtins.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/gemini_image.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/openai_image.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/openrouter.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/image/registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/base.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/builtins.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/ollama_chat.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/text/utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/base.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/builtins.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/fal_video.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/openrouter_video.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/api/video/registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/model/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/model/registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/github_copilot.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/google_antigravity.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/openai_codex.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/pkce.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/inference/provider/oauth/utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/message/__init__.py +0 -0
- {tau_coding_agent-0.3.9/tau/tui/components → tau_coding_agent-0.4.5/tau/modes}/__init__.py +0 -0
- {tau_coding_agent-0.3.9/tau/utils → tau_coding_agent-0.4.5/tau/modes/interactive}/__init__.py +0 -0
- {tau_coding_agent-0.3.9/tau → tau_coding_agent-0.4.5/tau/modes}/rpc/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/packages/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/expand.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/loader.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/prompts/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/session/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/storage.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/settings/utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/skills/loader.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/skills/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/themes/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/tool/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/__init__.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/trust/types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/http_proxy.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/image_processing.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/secrets.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau/utils/version_check.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/entry_points.txt +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/requires.txt +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tau_coding_agent.egg-info/top_level.txt +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_agent_prompt.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_auth_manager.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_auth_storage.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_engine_types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_footer_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_http_proxy.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_image_processing.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_api_text_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_error_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_inference_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_markdown.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_message_types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_message_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_model_registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_model_types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_oauth_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_pkce.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_prompts_expand.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_prompts_loader.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_prompts_registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_secrets.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_session_trust_persist.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_session_types.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_session_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_settings_paths.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_settings_storage.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_settings_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_skills_loader.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_skills_registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_text_llm_invoke.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_theme_loader.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_themes_registry.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_trust_manager.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_trust_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_theme.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_tui_utils.py +0 -0
- {tau_coding_agent-0.3.9 → tau_coding_agent-0.4.5}/tests/test_version_check.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tau-coding-agent
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands
|
|
5
5
|
Requires-Python: >=3.12
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -35,7 +35,7 @@ Dynamic: license-file
|
|
|
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.
|
|
@@ -47,7 +47,7 @@ Start a conversation with the agent in the terminal.
|
|
|
47
47
|
### Installation
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
pip install tau-coding-agent
|
|
50
|
+
uv pip install tau-coding-agent
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Or install from source:
|
|
@@ -3,7 +3,7 @@
|
|
|
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.
|
|
@@ -15,7 +15,7 @@ Start a conversation with the agent in the terminal.
|
|
|
15
15
|
### Installation
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
pip install tau-coding-agent
|
|
18
|
+
uv pip install tau-coding-agent
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
Or install from source:
|
|
@@ -102,18 +102,20 @@ User input flows through these stages:
|
|
|
102
102
|
|
|
103
103
|
## Agent Execution State Machine
|
|
104
104
|
|
|
105
|
-
The agent has
|
|
105
|
+
The agent has four observable phases:
|
|
106
106
|
|
|
107
107
|
```
|
|
108
108
|
IDLE ──user input──> TURN ──no more tool calls──> IDLE
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
├── manual/auto compact ──> COMPACTION ──> previous phase
|
|
110
|
+
└── tree navigation ──────> BRANCH_SUMMARY ──> IDLE
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
| State | Meaning |
|
|
114
114
|
|-------|---------|
|
|
115
115
|
| `IDLE` | No active inference; waiting for user input |
|
|
116
116
|
| `TURN` | Processing a turn: calling inference, executing tools |
|
|
117
|
+
| `COMPACTION` | Generating or applying a context compaction summary |
|
|
118
|
+
| `BRANCH_SUMMARY` | Generating or applying a branch-navigation summary |
|
|
117
119
|
|
|
118
120
|
The state is exposed via `AgentPhase` enum in `agent/types.py` and accessible to extensions via hooks.
|
|
119
121
|
|
|
@@ -126,14 +128,19 @@ Each agent turn follows this sequence:
|
|
|
126
128
|
2. Add message to session
|
|
127
129
|
3. Call inference (LLM API)
|
|
128
130
|
4. Collect tool calls from response
|
|
129
|
-
5. Execute tools
|
|
131
|
+
5. Execute tools concurrently only when every call in the batch is marked parallel
|
|
130
132
|
6. Add tool results to context
|
|
131
133
|
7. Call inference again (only if tools were called)
|
|
132
134
|
8. Render all messages and results (TUI)
|
|
133
135
|
9. Save session to disk
|
|
134
|
-
10.
|
|
136
|
+
10. Run post-turn compaction and drain messages queued by lifecycle handlers
|
|
137
|
+
11. Fire the settled hook
|
|
135
138
|
```
|
|
136
139
|
|
|
140
|
+
TUI overlays participate in focus lifecycle. Hiding or closing a capturing
|
|
141
|
+
overlay restores the next visible overlay or its previous focus target.
|
|
142
|
+
Components exposing `dispose()` are disposed when their overlay closes.
|
|
143
|
+
|
|
137
144
|
## Message Types and Context
|
|
138
145
|
|
|
139
146
|
Messages in sessions are typed:
|
|
@@ -6,17 +6,21 @@
|
|
|
6
6
|
tau [OPTIONS] [MESSAGE]
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
`
|
|
9
|
+
Use `--prompt TEXT` for a non-interactive prompt. Piped stdin can supply or
|
|
10
|
+
augment it.
|
|
10
11
|
|
|
11
12
|
## Options
|
|
12
13
|
|
|
13
14
|
| Option | Short | Description |
|
|
14
15
|
|--------|-------|-------------|
|
|
15
|
-
| `--
|
|
16
|
-
| `--
|
|
16
|
+
| `--prompt` | `-p` | Run a non-interactive prompt |
|
|
17
|
+
| `--provider` | | Provider to use, e.g. `anthropic`, `openai`, `groq` |
|
|
18
|
+
| `--model` | | Model ID, or `provider/model` shorthand (e.g. `groq/llama-3.3-70b-versatile`) |
|
|
17
19
|
| `--theme` | `-t` | UI theme: `default`, `dracula`, `nord`, `gruvbox`, `catppuccin`, `ayu-dark`, `everforest`, `horizon`, `kanagawa`, `material-ocean`, `monokai`, `night-owl`, `one-dark`, `rose-pine`, `solarized-dark`, `tokyo-night`, or a custom name |
|
|
18
|
-
| `--resume` | `-r` | Resume the most recent session |
|
|
19
|
-
| `--
|
|
20
|
+
| `--resume [ID]` | `-r` | Resume the most recent or a specified session |
|
|
21
|
+
| `--fork ID` | | Fork a specified session at startup |
|
|
22
|
+
| `--session-dir PATH` | | Override session storage |
|
|
23
|
+
| `--name NAME` | | Set the session display name at startup |
|
|
20
24
|
| `--ephemeral` | `-e` | Don't save this session to disk |
|
|
21
25
|
| `--approve` | `-a` | Trust project-local files (extensions, settings, context files) for this run |
|
|
22
26
|
| `--no-approve` | `-na` | Don't trust project-local files for this run |
|
|
@@ -42,10 +46,14 @@ tau --model claude-sonnet-4-6
|
|
|
42
46
|
Run a single prompt, print the response, and exit:
|
|
43
47
|
|
|
44
48
|
```bash
|
|
45
|
-
tau --
|
|
46
|
-
|
|
49
|
+
tau --prompt "Summarize this repo"
|
|
50
|
+
cat README.md | tau --print --prompt "Summarize this text"
|
|
51
|
+
tau --prompt "Compare these files" @src/old.py @src/new.py
|
|
47
52
|
```
|
|
48
53
|
|
|
54
|
+
Piped text, attached file contents, and the explicit prompt are combined in
|
|
55
|
+
that order.
|
|
56
|
+
|
|
49
57
|
### JSON mode
|
|
50
58
|
|
|
51
59
|
Emit a JSON event stream on stdout:
|
|
@@ -21,7 +21,7 @@ def register(tau):
|
|
|
21
21
|
timeout = config.get("timeout_ms", 5000)
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
The values are stored in `~/.tau/settings.json` (global) or `.tau/settings.json` (project-local):
|
|
25
25
|
|
|
26
26
|
```json
|
|
27
27
|
{
|
|
@@ -39,6 +39,71 @@ In `~/.tau/settings.json` or `.tau/settings.json`:
|
|
|
39
39
|
}
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
+
### Where settings live
|
|
43
|
+
|
|
44
|
+
Settings for an extension are stored in the `settings` object of its entry inside `extensions.list`. Tau matches entries by path — the path in the list must match the path or directory the extension was loaded from.
|
|
45
|
+
|
|
46
|
+
**Project-local** — `.tau/settings.json` (only applies in this directory):
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"extensions": {
|
|
51
|
+
"list": [
|
|
52
|
+
{
|
|
53
|
+
"path": ".tau/extensions/lsp",
|
|
54
|
+
"settings": {
|
|
55
|
+
"lsp": true,
|
|
56
|
+
"eager": [],
|
|
57
|
+
"servers": {
|
|
58
|
+
"pyright": { "enabled": true },
|
|
59
|
+
"ruff": { "enabled": true },
|
|
60
|
+
"typescript-language-server": { "enabled": false }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"path": ".tau/extensions/voice",
|
|
66
|
+
"settings": {
|
|
67
|
+
"enabled": true,
|
|
68
|
+
"stt_model": "whisper-1",
|
|
69
|
+
"stt_provider": "openai",
|
|
70
|
+
"hold_seconds": 2,
|
|
71
|
+
"sample_rate": 16000
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Global** — `~/.tau/settings.json` (applies to every project):
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"extensions": {
|
|
84
|
+
"list": [
|
|
85
|
+
{
|
|
86
|
+
"path": "~/.tau/extensions/web-search",
|
|
87
|
+
"settings": {
|
|
88
|
+
"enabled": true,
|
|
89
|
+
"engine": "ddgs",
|
|
90
|
+
"results": 10
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"path": "~/.tau/extensions/my_ext.py",
|
|
95
|
+
"settings": {
|
|
96
|
+
"api_key": "sk-...",
|
|
97
|
+
"timeout_ms": 5000
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Both files can coexist — project settings are merged on top of global settings at startup. Extensions loaded from `.tau/extensions/` read from the project file; extensions loaded from `~/.tau/extensions/` read from the global file.
|
|
106
|
+
|
|
42
107
|
## Nested Structures
|
|
43
108
|
|
|
44
109
|
`ExtensionSettings` handles nested configuration just as naturally:
|
|
@@ -237,7 +302,147 @@ def register(tau):
|
|
|
237
302
|
|
|
238
303
|
Extensions can register settings items that appear as a named sub-panel at the bottom of the interactive `/settings` panel. Users can then edit extension settings from the TUI without touching JSON.
|
|
239
304
|
|
|
240
|
-
|
|
305
|
+
There are two ways to do this: declare the schema in `manifest.json` (recommended for directory extensions) or register it imperatively with `tau.register_settings()` (useful for single-file extensions).
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
### Option A — manifest.json schema (recommended)
|
|
310
|
+
|
|
311
|
+
Add a `"settings"` block under the `"tau"` key in `manifest.json`. Tau reads it at load time, builds the `/settings` sub-panel automatically, reads current values from the extension's config, and persists changes back to `settings.json` (reloading just that extension so the change applies live — no restart needed).
|
|
312
|
+
|
|
313
|
+
```json
|
|
314
|
+
{
|
|
315
|
+
"tau": {
|
|
316
|
+
"extensions": ["__init__.py"],
|
|
317
|
+
"dependencies": ["requests"],
|
|
318
|
+
"settings": {
|
|
319
|
+
"title": "Web search",
|
|
320
|
+
"fields": [
|
|
321
|
+
{
|
|
322
|
+
"key": "enabled",
|
|
323
|
+
"label": "Enabled",
|
|
324
|
+
"type": "bool",
|
|
325
|
+
"default": true,
|
|
326
|
+
"description": "Enable or disable the web search extension."
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"key": "engine",
|
|
330
|
+
"label": "Search engine",
|
|
331
|
+
"type": "enum",
|
|
332
|
+
"values": ["ddgs", "exa", "tavily"],
|
|
333
|
+
"default": "ddgs",
|
|
334
|
+
"description": "Which search backend to use."
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"key": "results",
|
|
338
|
+
"label": "Max results",
|
|
339
|
+
"type": "int",
|
|
340
|
+
"default": 10,
|
|
341
|
+
"min": 1,
|
|
342
|
+
"max": 50,
|
|
343
|
+
"description": "Number of results returned per query."
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"key": "api_key",
|
|
347
|
+
"label": "API key",
|
|
348
|
+
"type": "secret",
|
|
349
|
+
"default": "",
|
|
350
|
+
"description": "Provider API key (stored in settings.json)."
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"key": "exa",
|
|
354
|
+
"label": "Exa settings",
|
|
355
|
+
"type": "group",
|
|
356
|
+
"fields": [
|
|
357
|
+
{
|
|
358
|
+
"key": "base_url",
|
|
359
|
+
"label": "Base URL",
|
|
360
|
+
"type": "string",
|
|
361
|
+
"default": "https://api.exa.ai"
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
"key": "highlights",
|
|
365
|
+
"label": "Highlights",
|
|
366
|
+
"type": "bool",
|
|
367
|
+
"default": true
|
|
368
|
+
}
|
|
369
|
+
]
|
|
370
|
+
}
|
|
371
|
+
]
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
The corresponding `.tau/settings.json` entry that stores the current values:
|
|
378
|
+
|
|
379
|
+
```json
|
|
380
|
+
{
|
|
381
|
+
"extensions": {
|
|
382
|
+
"list": [
|
|
383
|
+
{
|
|
384
|
+
"path": ".tau/extensions/web-search",
|
|
385
|
+
"settings": {
|
|
386
|
+
"enabled": true,
|
|
387
|
+
"engine": "exa",
|
|
388
|
+
"results": 20,
|
|
389
|
+
"api_key": "sk-exa-...",
|
|
390
|
+
"exa": {
|
|
391
|
+
"base_url": "https://api.exa.ai",
|
|
392
|
+
"highlights": false
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
]
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
#### Field types
|
|
402
|
+
|
|
403
|
+
| Type | UI control | Notes |
|
|
404
|
+
|------|-----------|-------|
|
|
405
|
+
| `bool` | Toggle `off` / `on` | Stored as a JSON boolean in settings |
|
|
406
|
+
| `int` | Text input (numeric) | Optional `min` and `max` clamps |
|
|
407
|
+
| `string` | Text input | Optional `pattern` (regex the value must match) |
|
|
408
|
+
| `secret` | Text input | Same as `string`; signals sensitive content |
|
|
409
|
+
| `text` | Text input | Same as `string`; intended for longer values |
|
|
410
|
+
| `enum` or `select` | Cycle through values on Enter | Requires a non-empty `"values"` list |
|
|
411
|
+
| `group` | Opens a nested sub-panel | Contains a `"fields"` list; keys are prefixed |
|
|
412
|
+
|
|
413
|
+
#### Field properties
|
|
414
|
+
|
|
415
|
+
| Property | Required | Description |
|
|
416
|
+
|----------|----------|-------------|
|
|
417
|
+
| `key` | Yes | Setting key. Supports dot-notation: `"exa.api_key"` is equivalent to nesting under a `"exa"` group |
|
|
418
|
+
| `label` | Yes | Display text shown in the `/settings` panel |
|
|
419
|
+
| `type` | No (defaults to `string`) | One of the types listed above |
|
|
420
|
+
| `default` | No | Fallback value when the key is absent from settings |
|
|
421
|
+
| `description` | No | Dimmed help text shown below the label |
|
|
422
|
+
| `values` | `enum`/`select` only | List of allowed values to cycle through |
|
|
423
|
+
| `min` / `max` | `int` only | Clamp the entered value to this range |
|
|
424
|
+
| `pattern` | `string`/`secret`/`text` | Regex the value must fully match; invalid input is silently ignored |
|
|
425
|
+
| `fields` | `group` only | Nested list of field definitions |
|
|
426
|
+
|
|
427
|
+
#### Summary badge
|
|
428
|
+
|
|
429
|
+
The first top-level `bool` field is automatically used as an on/off summary badge on the extension's parent row in the main `/settings` list. This lets users see at a glance whether an extension is enabled without opening its sub-panel.
|
|
430
|
+
|
|
431
|
+
#### Dot-notation keys
|
|
432
|
+
|
|
433
|
+
`"key": "exa.api_key"` at the top level is exactly equivalent to a field with `"key": "api_key"` nested inside a group with `"key": "exa"`. Both read and write the same path in settings:
|
|
434
|
+
|
|
435
|
+
```json
|
|
436
|
+
{ "exa": { "api_key": "sk-..." } }
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
Use the explicit `group` type when you want the sub-panel to have a header label. Use dot-notation directly when you just want nested storage without the extra level of UI.
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
### Option B — `tau.register_settings()` (imperative)
|
|
444
|
+
|
|
445
|
+
#### Basic example
|
|
241
446
|
|
|
242
447
|
```python
|
|
243
448
|
from tau.tui.components.settings_modal import SettingItem
|
|
@@ -254,7 +459,7 @@ def register(tau):
|
|
|
254
459
|
], title="My Extension", on_change=on_change)
|
|
255
460
|
```
|
|
256
461
|
|
|
257
|
-
|
|
462
|
+
#### `tau.register_settings(items, title, on_change)`
|
|
258
463
|
|
|
259
464
|
Registers a sub-panel in `/settings` containing the provided items.
|
|
260
465
|
|
|
@@ -264,7 +469,7 @@ Registers a sub-panel in `/settings` containing the provided items.
|
|
|
264
469
|
| `title` | `str` | The sub-panel title shown in the list |
|
|
265
470
|
| `on_change` | `callable(key, value)` | Called when the user changes a value |
|
|
266
471
|
|
|
267
|
-
|
|
472
|
+
#### `SettingItem` fields
|
|
268
473
|
|
|
269
474
|
| Field | Type | Description |
|
|
270
475
|
|-------|------|-------------|
|
|
@@ -278,7 +483,7 @@ Registers a sub-panel in `/settings` containing the provided items.
|
|
|
278
483
|
| `submenu_settings` | `list[SettingItem] \| None` | Open a full nested sub-panel with these items (arbitrary depth) |
|
|
279
484
|
| `submenu_on_change` | `callable \| None` | Overrides the parent `on_change` for a nested sub-panel |
|
|
280
485
|
|
|
281
|
-
|
|
486
|
+
#### Nested sub-panels
|
|
282
487
|
|
|
283
488
|
A `SettingItem` with `submenu_settings` opens another level of the settings panel. Nesting can be arbitrarily deep. Use `submenu_on_change` to override the change callback for that level:
|
|
284
489
|
|
|
@@ -298,7 +503,7 @@ tau.register_settings([
|
|
|
298
503
|
], title="My Extension", on_change=on_change)
|
|
299
504
|
```
|
|
300
505
|
|
|
301
|
-
|
|
506
|
+
#### `tau.settings.set_extension_config_key(ext_path, key, value)`
|
|
302
507
|
|
|
303
508
|
Persists a value back to `extensions.list[].settings` in `settings.json`.
|
|
304
509
|
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
Extensions are plain Python files that hook into tau's lifecycle. Each one exports
|
|
4
4
|
a single `register(tau)` function — everything is wired up there.
|
|
5
5
|
|
|
6
|
+
Extension tools and commands may shadow built-ins while loaded. Tau retains the
|
|
7
|
+
shadowed source layer, so disabling or reloading the extension restores the
|
|
8
|
+
previous implementation. Reload also replaces extension message renderers,
|
|
9
|
+
autocomplete providers, shortcuts, and published services; do not retain
|
|
10
|
+
service objects across reload.
|
|
11
|
+
|
|
6
12
|
## File locations
|
|
7
13
|
|
|
8
14
|
tau loads extensions from three sources, in this order:
|
|
@@ -36,6 +42,41 @@ dependencies with incompatible versions. The install only runs once — a hash o
|
|
|
36
42
|
the dependency list is cached, so unchanged manifests are a no-op on subsequent
|
|
37
43
|
launches.
|
|
38
44
|
|
|
45
|
+
## Installable resource packages
|
|
46
|
+
|
|
47
|
+
`tau install` accepts PyPI names, pip-compatible Git URLs, local distributions,
|
|
48
|
+
and direct wheel or source-archive URLs:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
tau install pypi:tau-tools==1.2.3
|
|
52
|
+
tau install git+ssh://git@github.com/example/tau-tools.git@v1
|
|
53
|
+
tau install ./dist/tau_tools-1.2.3-py3-none-any.whl
|
|
54
|
+
tau install https://packages.example.com/tau_tools-1.2.3-py3-none-any.whl
|
|
55
|
+
tau install tau-tools==1.2.3 --index-url https://packages.example.com/simple
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Repeat `--extra-index-url URL` to resolve dependencies from additional indexes.
|
|
59
|
+
Index configuration is retained for future updates.
|
|
60
|
+
|
|
61
|
+
Packages can bundle extensions, skills, prompts, and themes:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"tau": {
|
|
66
|
+
"extensions": ["extensions/main.py"],
|
|
67
|
+
"skills": ["skills"],
|
|
68
|
+
"prompts": ["prompts"],
|
|
69
|
+
"themes": ["themes"]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Conventional resource directories are discovered when a manifest field is
|
|
75
|
+
omitted. Package entries in `settings.json` support an `enabled` switch and
|
|
76
|
+
optional `extensions`, `skills`, `prompts`, and `themes` path filters. An empty
|
|
77
|
+
filter disables that resource type. Use `tau update --all` to update Tau and
|
|
78
|
+
all installed packages.
|
|
79
|
+
|
|
39
80
|
## Entry point
|
|
40
81
|
|
|
41
82
|
Every extension must export a `register(tau)` function:
|
|
@@ -212,9 +253,17 @@ def register(tau):
|
|
|
212
253
|
|
|
213
254
|
#### Agent state
|
|
214
255
|
|
|
256
|
+
| Property | Type | Description |
|
|
257
|
+
|----------|------|-------------|
|
|
258
|
+
| `ctx.phase` | `AgentPhase` | Current lifecycle phase: `idle`, `turn`, `compaction`, or `branch_summary` |
|
|
259
|
+
| `ctx.streaming_message` | `AssistantMessage \| None` | Current partial assistant response |
|
|
260
|
+
| `ctx.pending_tool_call_ids` | `frozenset[str]` | Snapshot of tool calls that have started but not finished |
|
|
261
|
+
| `ctx.error_message` | `str \| None` | Most recent engine error |
|
|
262
|
+
| `ctx.queued_messages` | `dict[str, list[LLMMessage]]` | Snapshots of the steering and follow-up queues |
|
|
263
|
+
|
|
215
264
|
| Method | Returns | Description |
|
|
216
265
|
|--------|---------|-------------|
|
|
217
|
-
| `ctx.is_idle()` | `bool` | `True` when
|
|
266
|
+
| `ctx.is_idle()` | `bool` | `True` when `ctx.phase` is `AgentPhase.IDLE` |
|
|
218
267
|
| `ctx.abort()` | — | Cancel the current agent turn; no-op if already idle |
|
|
219
268
|
| `ctx.shutdown()` | — | Exit tau gracefully |
|
|
220
269
|
| `ctx.get_context_usage()` | `dict \| None` | Token usage info (see below) |
|
|
@@ -224,6 +273,13 @@ def register(tau):
|
|
|
224
273
|
| `ctx.signal` | `asyncio.Event \| None` | The current abort signal while the agent is streaming; the event is set when the turn is aborted. `None` when idle |
|
|
225
274
|
| `ctx.get_system_prompt_options()` | `dict` | Metadata about how the active system prompt was assembled — keys: `skills`, `prompts`, `tools`, `system_prompt_length` |
|
|
226
275
|
|
|
276
|
+
Extensions can inject a user message with
|
|
277
|
+
`await ctx.send_user_message(content, deliver_as="steer", trigger_turn=False)`.
|
|
278
|
+
Set `trigger_turn=True` to start a new turn immediately when the agent is idle;
|
|
279
|
+
while it is busy, the message is queued using the selected delivery mode. In
|
|
280
|
+
interactive mode, an immediately triggered message is rendered as a normal user
|
|
281
|
+
message before the assistant response.
|
|
282
|
+
|
|
227
283
|
`get_context_usage()` returns a dict with three keys, or `None` if token data is not yet available (e.g. immediately after compaction, before the next LLM response):
|
|
228
284
|
|
|
229
285
|
```python
|
|
@@ -251,7 +307,7 @@ These methods are `async` and are available in both event handlers and command h
|
|
|
251
307
|
|
|
252
308
|
| Method | Returns | Description |
|
|
253
309
|
|--------|---------|-------------|
|
|
254
|
-
| `await ctx.wait_for_idle()` | — | Suspend until the
|
|
310
|
+
| `await ctx.wait_for_idle()` | — | Suspend until the active invocation and its post-run save/compaction processing finish |
|
|
255
311
|
| `await ctx.new_session()` | `{"cancelled": bool}` | Start a fresh session |
|
|
256
312
|
| `await ctx.fork(entry_id)` | `{"cancelled": bool}` | Fork from a specific session entry |
|
|
257
313
|
| `await ctx.navigate_tree(target_id, summarize=False, custom_instructions=None)` | `{"cancelled": bool}` | Jump to another branch in the session tree |
|
|
@@ -297,12 +353,30 @@ async def cmd(ctx, args):
|
|
|
297
353
|
ctx.compact(custom_instructions="Keep only the final conclusions.")
|
|
298
354
|
```
|
|
299
355
|
|
|
300
|
-
`navigate_tree` optionally generates a branch summary
|
|
356
|
+
`navigate_tree` optionally generates a branch summary and attaches it to the
|
|
357
|
+
destination branch. If summary generation fails, navigation still completes
|
|
358
|
+
without a summary:
|
|
301
359
|
|
|
302
360
|
```python
|
|
303
361
|
result = await ctx.navigate_tree(target_id, summarize=True)
|
|
304
362
|
```
|
|
305
363
|
|
|
364
|
+
Extensions can replace the default branch-summary model call:
|
|
365
|
+
|
|
366
|
+
```python
|
|
367
|
+
from tau.hooks import SessionBeforeTreeResult
|
|
368
|
+
|
|
369
|
+
def register(tau):
|
|
370
|
+
@tau.on("session_before_tree")
|
|
371
|
+
async def summarize(event, ctx):
|
|
372
|
+
entries = event.preparation.entries_to_summarize
|
|
373
|
+
summary = await my_summarizer(entries)
|
|
374
|
+
return SessionBeforeTreeResult(
|
|
375
|
+
summary=summary,
|
|
376
|
+
summary_details={"source": "my-extension"},
|
|
377
|
+
)
|
|
378
|
+
```
|
|
379
|
+
|
|
306
380
|
#### `branch_entries` vs `session_entries`
|
|
307
381
|
|
|
308
382
|
The session file stores entries from every branch ever taken — forks, navigations, abandoned paths. `session_entries` returns all of them. `branch_entries` returns only the linear path from the root to the current leaf — the entries actually in scope for the current conversation.
|
|
@@ -359,7 +433,11 @@ def register(tau):
|
|
|
359
433
|
| `session_shutdown` | `reason`, `target_session_file` | — | Session about to close — last chance for cleanup |
|
|
360
434
|
| `session_before_switch` | `reason`, `target_session_file` | `SessionBeforeSwitchResult` | About to replace the active session — return `cancel=True` to block |
|
|
361
435
|
| `session_before_fork` | `entry_id`, `position` | `SessionBeforeForkResult` | About to create a branch — return `cancel=True` to block |
|
|
362
|
-
| `session_before_tree` | `preparation` | `SessionBeforeTreeResult` | About to rewrite the
|
|
436
|
+
| `session_before_tree` | `preparation` | `SessionBeforeTreeResult` | About to rewrite the tree. Return `summary=` and optional `summary_details=` to replace default summarization, or `cancel=True` to block |
|
|
437
|
+
| `branch_summary_start` | `old_leaf_id`, `target_id`, `from_extension` | — | Branch summarization begins |
|
|
438
|
+
| `branch_summary_end` | `old_leaf_id`, `target_id`, `summary_entry_id`, `summary_length`, `from_extension` | — | Summary attached to the destination |
|
|
439
|
+
| `branch_summary_failure` | `old_leaf_id`, `target_id`, `error` | — | Summary failed; navigation continues without it |
|
|
440
|
+
| `branch_summary_cancelled` | `old_leaf_id`, `target_id`, `reason` | — | Summary or navigation was cancelled |
|
|
363
441
|
| `session_tree` | `new_leaf_id`, `old_leaf_id`, `from_extension` | — | Session tree has been rewritten with the new active leaf |
|
|
364
442
|
|
|
365
443
|
**Agent & turn lifecycle**
|
|
@@ -372,7 +450,7 @@ def register(tau):
|
|
|
372
450
|
| `agent_error` | `error` | — | Engine terminated with an unrecoverable error |
|
|
373
451
|
| `turn_start` | `turn_index`, `timestamp` | — | New LLM inference turn begins |
|
|
374
452
|
| `turn_end` | `turn_index`, `message`, `tool_results` | — | Turn completes with assistant message and tool results |
|
|
375
|
-
| `settled` | — | — |
|
|
453
|
+
| `settled` | — | — | The invocation completed queued turns and post-run compaction with no messages currently queued; this is an observation, not a lock against concurrent submissions |
|
|
376
454
|
|
|
377
455
|
**Input**
|
|
378
456
|
|
|
@@ -425,9 +503,11 @@ def register(tau):
|
|
|
425
503
|
|
|
426
504
|
| Event | Payload fields | Result type | Description |
|
|
427
505
|
|-------|---------------|-------------|-------------|
|
|
428
|
-
| `before_compaction` | `preparation`, `entries`, `manual` | `BeforeCompactionResult` | Before
|
|
429
|
-
| `compaction_start` | `manual` | — | Compaction begins
|
|
430
|
-
| `compaction_end` | `manual`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction
|
|
506
|
+
| `before_compaction` | `preparation`, `entries`, `manual`, `reason`, `will_retry` | `BeforeCompactionResult` | Before summarization; may cancel or provide a complete compaction |
|
|
507
|
+
| `compaction_start` | `manual`, `reason`, `will_retry` | — | Compaction begins after interception |
|
|
508
|
+
| `compaction_end` | `manual`, `reason`, `will_retry`, `tokens_before`, `summary_length`, `from_extension` | — | Compaction succeeds |
|
|
509
|
+
| `compaction_failure` | `manual`, `reason`, `will_retry`, `error` | — | Compaction fails |
|
|
510
|
+
| `compaction_cancelled` | `manual`, `reason`, `will_retry` | — | An extension cancels compaction |
|
|
431
511
|
|
|
432
512
|
**Model & settings**
|
|
433
513
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
| Ctrl+K | Kill to end of line |
|
|
14
14
|
| Ctrl+W | Delete previous word |
|
|
15
15
|
| Ctrl+A / Home | Move to line start |
|
|
16
|
-
| Ctrl+E / End | Move to line end |
|
|
16
|
+
| Ctrl+E / End | Move to line end (Ctrl+E falls through to the app when input is empty) |
|
|
17
17
|
| Delete / Ctrl+D | Delete character at cursor |
|
|
18
18
|
|
|
19
19
|
### Message Queue
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
| Escape | Abort current turn; restore queued messages |
|
|
31
31
|
| Ctrl+C | Abort turn; double-press to quit |
|
|
32
32
|
| Ctrl+D | Quit (on empty input) |
|
|
33
|
-
| Ctrl+O | Toggle expand/collapse for
|
|
33
|
+
| Ctrl+O | Toggle expand/collapse for thinking and tool-result blocks |
|
|
34
|
+
| Ctrl+E | Toggle template and skill blocks when the editor is empty |
|
|
34
35
|
|
|
35
36
|
### Pickers (model, theme, command palette)
|
|
36
37
|
|
|
@@ -52,12 +53,14 @@
|
|
|
52
53
|
Pass a `KeyMap` to `App.create()` at startup:
|
|
53
54
|
|
|
54
55
|
```python
|
|
55
|
-
from tau.tui
|
|
56
|
+
from tau.tui import KeyMap
|
|
56
57
|
|
|
57
58
|
overrides: KeyMap = {
|
|
58
59
|
"tui.app.quit": ["ctrl+q"],
|
|
59
60
|
"tui.input.submit": ["enter"],
|
|
60
61
|
"app.message.followup": ["alt+enter"],
|
|
62
|
+
"app.details.toggle": ["ctrl+o"],
|
|
63
|
+
"app.invocations.toggle": ["ctrl+e"],
|
|
61
64
|
}
|
|
62
65
|
|
|
63
66
|
app = await App.create(runtime, keybindings=overrides)
|
|
@@ -75,6 +78,8 @@ A `KeyMap` is `dict[str, list[str]]` — action name → list of key combos that
|
|
|
75
78
|
| `tui.input.word_back` | `ctrl+w` | Delete previous word |
|
|
76
79
|
| `app.message.followup` | `alt+enter` | Queue as follow-up message |
|
|
77
80
|
| `app.message.dequeue` | `alt+up` | Restore queued messages into editor |
|
|
81
|
+
| `app.details.toggle` | `ctrl+o` | Toggle thinking and tool-result previews |
|
|
82
|
+
| `app.invocations.toggle` | `ctrl+e` | Toggle template and skill blocks |
|
|
78
83
|
| `tui.app.quit` | `ctrl+c`, `ctrl+d` | Quit tau |
|
|
79
84
|
| `tui.app.abort` | `ctrl+c` | Abort the current turn |
|
|
80
85
|
| `tui.select.up` | `up`, `ctrl+p` | Move selection up |
|
|
@@ -28,6 +28,12 @@ Referenced files are automatically processed based on type:
|
|
|
28
28
|
|
|
29
29
|
A response from the LLM. Can include text and tool calls.
|
|
30
30
|
|
|
31
|
+
Assistant messages also store provider usage metadata: input, output,
|
|
32
|
+
cache-read, and cache-write token counts. The
|
|
33
|
+
`input_tokens_include_cache_read` flag records whether cached tokens are
|
|
34
|
+
already included in the provider's input count, preventing context usage from
|
|
35
|
+
counting the same tokens twice.
|
|
36
|
+
|
|
31
37
|
```python
|
|
32
38
|
{
|
|
33
39
|
"type": "assistant",
|