tau-coding-agent 0.5.2__tar.gz → 0.5.3__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.5.2/tau_coding_agent.egg-info → tau_coding_agent-0.5.3}/PKG-INFO +1 -1
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/tui.md +3 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/pyproject.toml +1 -1
- tau_coding_agent-0.5.3/tau/__init__.py +9 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/agent/prompt/builder.py +37 -8
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/agent/prompt/types.py +6 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/anthropic_claude_code.py +3 -7
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/github_copilot.py +3 -7
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/google_antigravity.py +4 -8
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/openai_codex.py +4 -8
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/utils.py +16 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/layout.py +21 -1
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/runtime/types.py +14 -1
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/session/types.py +8 -3
- tau_coding_agent-0.5.3/tau/tui/__init__.py +218 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/components/text_input.py +54 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/tui.py +25 -1
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3/tau_coding_agent.egg-info}/PKG-INFO +1 -1
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_text_input.py +34 -0
- tau_coding_agent-0.5.2/tau/tui/__init__.py +0 -134
- tau_coding_agent-0.5.2/tau/utils/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/LICENSE +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/MANIFEST.in +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/README.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/architecture.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/auth.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/cli-reference.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/creating-tools.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/development.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/docs.json +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/engine.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/extension-settings.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/extensions.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/http-proxy.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/index.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/inference-providers.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/inference.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/installation.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/keybindings.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/messages.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/project-context.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/project-structure.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/prompts.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/python-api.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/quickstart.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/sessions.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/settings.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/skills.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/themes.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/tools.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/docs/usage.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/setup.cfg +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/agent/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/agent/prompt/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/agent/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/agent/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/auth/manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/auth/storage.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/auth/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/commands/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/commands/clear.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/commands/compact.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/commands/reload.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/commands/session.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/extensions/btw/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/extensions/footer/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/extensions/footer/git.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/extensions/footer/model.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/extensions/footer/utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/extensions/header/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/extensions/watch/__init__.py +0 -0
- {tau_coding_agent-0.5.2/tau → tau_coding_agent-0.5.3/tau/builtins/models}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/models/audio.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/models/image.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/models/text.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/models/video.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/prompts/commit.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/prompts/docs.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/prompts/explain.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/prompts/fix.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/prompts/refactor.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/prompts/review.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/prompts/test.md +0 -0
- {tau_coding_agent-0.5.2/tau/builtins/models → tau_coding_agent-0.5.3/tau/builtins/providers}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/providers/audio.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/providers/image.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/providers/text.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/providers/video.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/skills/code-review/SKILL.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/skills/debug/SKILL.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/skills/git-commit/SKILL.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/themes/dark.yaml +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/themes/light.yaml +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/edit.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/glob.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/grep.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/ls.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/read.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/terminal.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/builtins/tools/write.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/commands/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/commands/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/commands/types.py +0 -0
- {tau_coding_agent-0.5.2/tau/builtins/providers → tau_coding_agent-0.5.3/tau/console}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/console/cli.py +0 -0
- {tau_coding_agent-0.5.2/tau/console → tau_coding_agent-0.5.3/tau/console/commands}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/console/commands/auth.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/console/commands/packages.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/console/commands/update.py +0 -0
- {tau_coding_agent-0.5.2/tau/console/commands → tau_coding_agent-0.5.3/tau/core}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/core/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/engine/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/engine/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/engine/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/extensions/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/extensions/api.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/extensions/context.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/extensions/loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/extensions/runtime.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/extensions/settings.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/engine.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/inference.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/runtime.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/session.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/tui.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/hooks/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/__init__.py +0 -0
- {tau_coding_agent-0.5.2/tau/core → tau_coding_agent-0.5.3/tau/inference/api}/__init__.py +0 -0
- {tau_coding_agent-0.5.2/tau/inference/api → tau_coding_agent-0.5.3/tau/inference/api/audio}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/base.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/builtins.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/gemini_audio.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/openai_audio.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/sarvam_audio.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/audio/utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/availability.py +0 -0
- {tau_coding_agent-0.5.2/tau/inference/api/audio → tau_coding_agent-0.5.3/tau/inference/api/image}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/image/base.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/image/builtins.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/image/gemini_image.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/image/openai_image.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/image/openrouter.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/image/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/image/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/registry.py +0 -0
- {tau_coding_agent-0.5.2/tau/inference/api/image → tau_coding_agent-0.5.3/tau/inference/api/text}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/anthropic_messages.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/anthropic_vertex.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/base.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/builtins.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/dialect.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/gemini_generate.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/github_copilot_chat.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/google_antigravity.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/google_vertex.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/mistral_chat.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/ollama_chat.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/openai_codex_responses.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/openai_completions.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/openai_responses.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/openai_vertex.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/text/utils.py +0 -0
- {tau_coding_agent-0.5.2/tau/inference/api/text → tau_coding_agent-0.5.3/tau/inference/api/video}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/video/base.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/video/builtins.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/video/fal_video.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/video/openrouter_video.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/video/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/video/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/api/video/zai_video.py +0 -0
- {tau_coding_agent-0.5.2/tau/inference/api/video → tau_coding_agent-0.5.3/tau/inference/model}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/model/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/model/types.py +0 -0
- {tau_coding_agent-0.5.2/tau/inference/model → tau_coding_agent-0.5.3/tau/inference/provider}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/pkce.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/utils.py +0 -0
- {tau_coding_agent-0.5.2/tau/inference/provider → tau_coding_agent-0.5.3/tau/message}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/message/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/message/utils.py +0 -0
- {tau_coding_agent-0.5.2/tau/message → tau_coding_agent-0.5.3/tau/modes}/__init__.py +0 -0
- {tau_coding_agent-0.5.2/tau/modes → tau_coding_agent-0.5.3/tau/modes/interactive}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/agent_hooks.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/app.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/appearance.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/auth.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/context.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/extensions.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/misc.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/model.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/commands/session.py +0 -0
- {tau_coding_agent-0.5.2/tau/modes/interactive → tau_coding_agent-0.5.3/tau/modes/interactive/components}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/command_palette.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/config_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/extension_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/file_picker.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/message_list.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/model_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/oauth_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/overlays.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/selector_controller.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/session_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/settings_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/theme_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/thinking_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/tree_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/trust_screen.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/voice_selector.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/input_handler.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/ui_context.py +0 -0
- {tau_coding_agent-0.5.2/tau/modes/interactive/components → tau_coding_agent-0.5.3/tau/modes/print}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/rpc/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/rpc/mode.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/rpc/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/packages/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/packages/manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/packages/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/packages/utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/prompts/expand.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/prompts/loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/prompts/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/prompts/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/resources/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/resources/loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/resources/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/runtime/dependencies.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/runtime/service.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/session/branch_summarization.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/session/compaction.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/session/manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/session/utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/settings/manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/settings/paths.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/settings/storage.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/settings/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/settings/utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/skills/loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/skills/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/skills/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/themes/loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/themes/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/themes/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tool/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tool/registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tool/render.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tool/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/trust/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/trust/manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/trust/types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/trust/utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/autocomplete.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/component.py +0 -0
- {tau_coding_agent-0.5.2/tau/modes/print → tau_coding_agent-0.5.3/tau/tui/components}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/components/box.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/components/editor.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/components/image.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/components/select_list.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/components/spinner.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/input.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/keybinding_hints.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/markdown.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/terminal.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/theme.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/tui/utils.py +0 -0
- {tau_coding_agent-0.5.2/tau/tui/components → tau_coding_agent-0.5.3/tau/utils}/__init__.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/utils/http_proxy.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/utils/image_processing.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/utils/secrets.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/utils/telemetry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/utils/version_check.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau_coding_agent.egg-info/SOURCES.txt +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau_coding_agent.egg-info/entry_points.txt +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau_coding_agent.egg-info/requires.txt +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau_coding_agent.egg-info/top_level.txt +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_agent_compaction.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_agent_prompt.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_agent_types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_ansi.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_ask_user_extension.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_auth_command.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_auth_manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_auth_storage.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_autocomplete_modifiers.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_branch_navigation.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_branch_summarization.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_builtin_tools.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_builtin_watch.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_cli_inputs.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_command_execution_policy.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_command_registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_compaction.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_diff.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_editor_protocol.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_engine_execution.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_engine_steering.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_engine_types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_escape_behavior.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_extension_api.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_extension_lifecycle.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_footer_model.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_footer_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_fuzzy.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_http_proxy.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_image_processing.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_inference_api_text_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_inference_dialect.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_inference_error_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_inference_types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_inference_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_keybindings.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_markdown.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_message_types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_message_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_model_availability.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_model_command.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_model_registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_model_selector_modal.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_model_types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_oauth_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_package_resources.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_packages_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_peer_extension.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_pkce.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_prompts_expand.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_prompts_loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_prompts_registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_provider_registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_resource_loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_rpc_mode.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_runtime_sdk.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_secrets.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_selector_controller.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_session_manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_session_trust_persist.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_session_types.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_session_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_settings_manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_settings_paths.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_settings_storage.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_settings_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_skills_loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_skills_registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_subagents_extension.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_telemetry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_text_llm_invoke.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_theme_loader.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_themes_registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_thinking_render.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tool_registry.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tool_render.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_trust_manager.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_trust_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_capabilities.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_input.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_layout_sizing.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_public_api.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_renderer.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_select_list.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_theme.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_tui_utils.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_ui_context.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_version_check.py +0 -0
- {tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tests/test_voice_selector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tau-coding-agent
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.3
|
|
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
|
|
@@ -122,6 +122,9 @@ Input is normalized into typed events:
|
|
|
122
122
|
- `BgColorEvent`
|
|
123
123
|
|
|
124
124
|
Use `KeyEvent.matches()` instead of comparing raw escape sequences.
|
|
125
|
+
Mouse reporting is enabled while the TUI runs. The stock interactive
|
|
126
|
+
`TextInput` moves its caret to the clicked text position, including across
|
|
127
|
+
hard newlines and soft-wrapped rows.
|
|
125
128
|
|
|
126
129
|
## Overlays
|
|
127
130
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tau-coding-agent"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.3"
|
|
8
8
|
description = "A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
# Skip pydantic's plugin discovery (a full `importlib.metadata.distributions()`
|
|
4
|
+
# scan of every installed package, ~30-50ms) unless the environment already
|
|
5
|
+
# asked for a specific setting. Tau ships no pydantic plugins and none are
|
|
6
|
+
# expected to be installed alongside it; this must run before the first
|
|
7
|
+
# pydantic BaseModel subclass is defined anywhere in the process, so it lives
|
|
8
|
+
# in this package's __init__ (executed before any tau submodule).
|
|
9
|
+
os.environ.setdefault("PYDANTIC_DISABLE_PLUGINS", "1")
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import os
|
|
4
4
|
import platform
|
|
5
5
|
import shutil
|
|
6
|
+
import sys
|
|
6
7
|
from collections.abc import Callable
|
|
7
8
|
from datetime import date
|
|
8
9
|
from pathlib import Path
|
|
@@ -163,17 +164,41 @@ _GIT_LOG_COUNT = 5
|
|
|
163
164
|
|
|
164
165
|
|
|
165
166
|
def _detect_os() -> str:
|
|
166
|
-
"""Return a human-readable OS name and version.
|
|
167
|
+
"""Return a human-readable OS name and version.
|
|
168
|
+
|
|
169
|
+
On Windows, ``platform.system()``/``platform.release()`` call
|
|
170
|
+
``platform.uname()``, which shells out to two separate WMI COM queries
|
|
171
|
+
(~150-200ms combined) to determine the release name. ``sys.getwindowsversion()``
|
|
172
|
+
reads the same information directly from the OS with no WMI round-trip, so we
|
|
173
|
+
use it here and derive the release name (10 vs 11) from the build number using
|
|
174
|
+
the same >=22000 heuristic Windows itself uses.
|
|
175
|
+
"""
|
|
176
|
+
if sys.platform == "win32":
|
|
177
|
+
v = sys.getwindowsversion()
|
|
178
|
+
release = "11" if v.build >= 22000 else str(v.major)
|
|
179
|
+
return f"Windows {release}"
|
|
167
180
|
system = platform.system()
|
|
168
181
|
if system == "Darwin":
|
|
169
182
|
return f"macOS {platform.mac_ver()[0] or platform.release()}"
|
|
170
183
|
if system == "Linux":
|
|
171
184
|
return f"Linux {platform.release()}"
|
|
172
|
-
if system == "Windows":
|
|
173
|
-
return f"Windows {platform.release()}"
|
|
174
185
|
return f"{system} {platform.release()}".strip()
|
|
175
186
|
|
|
176
187
|
|
|
188
|
+
def _detect_machine() -> str:
|
|
189
|
+
"""Return the machine architecture (e.g. 'x86_64', 'AMD64').
|
|
190
|
+
|
|
191
|
+
``platform.machine()`` is a thin wrapper around ``platform.uname()``, which
|
|
192
|
+
is expensive on Windows (see ``_detect_os``). ``PROCESSOR_ARCHITECTURE`` is
|
|
193
|
+
always set by the OS and gives the same value without the WMI round-trip.
|
|
194
|
+
"""
|
|
195
|
+
if sys.platform == "win32":
|
|
196
|
+
arch = os.environ.get("PROCESSOR_ARCHITECTURE")
|
|
197
|
+
if arch:
|
|
198
|
+
return arch
|
|
199
|
+
return platform.machine()
|
|
200
|
+
|
|
201
|
+
|
|
177
202
|
def _detect_shell() -> str:
|
|
178
203
|
"""Detect the user's shell from $SHELL, falling back to common shells on PATH."""
|
|
179
204
|
shell = os.environ.get("SHELL", "")
|
|
@@ -198,7 +223,6 @@ def _git_status(cwd: Path) -> str:
|
|
|
198
223
|
except ImportError:
|
|
199
224
|
return ""
|
|
200
225
|
|
|
201
|
-
repo = None
|
|
202
226
|
try:
|
|
203
227
|
repo = Repo(cwd, search_parent_directories=True)
|
|
204
228
|
|
|
@@ -233,9 +257,12 @@ def _git_status(cwd: Path) -> str:
|
|
|
233
257
|
return ""
|
|
234
258
|
except GitError:
|
|
235
259
|
return ""
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
260
|
+
# No explicit repo.close() here: GitPython's Repo.__del__ already calls it,
|
|
261
|
+
# and close() forces two gc.collect() passes on Windows (its own workaround
|
|
262
|
+
# for tempfile handles). Closing explicitly *and* via __del__ paid for that
|
|
263
|
+
# gc.collect() pass twice for no benefit — we don't touch the object database
|
|
264
|
+
# in the common (attached-branch) path, so there's nothing time-sensitive to
|
|
265
|
+
# release synchronously.
|
|
239
266
|
|
|
240
267
|
parts = [
|
|
241
268
|
"\n\ngitStatus: snapshot taken at session start; it is not updated during the "
|
|
@@ -440,6 +467,8 @@ class PromptBuilder:
|
|
|
440
467
|
"""
|
|
441
468
|
if self._opts.project_trusted is False:
|
|
442
469
|
return ""
|
|
470
|
+
if self._opts.git_snapshot is not None:
|
|
471
|
+
return self._opts.git_snapshot
|
|
443
472
|
return _git_status(self._opts.cwd)
|
|
444
473
|
|
|
445
474
|
def _footer(self) -> str:
|
|
@@ -449,7 +478,7 @@ class PromptBuilder:
|
|
|
449
478
|
"\n\n# Environment\n"
|
|
450
479
|
f"Current working directory: {cwd}\n"
|
|
451
480
|
f"OS: {_detect_os()}\n"
|
|
452
|
-
f"Architecture: {
|
|
481
|
+
f"Architecture: {_detect_machine()}\n"
|
|
453
482
|
f"Shell: {_detect_shell()}\n"
|
|
454
483
|
f"Date: {today}"
|
|
455
484
|
)
|
|
@@ -39,3 +39,9 @@ class PromptOptions(BaseModel):
|
|
|
39
39
|
|
|
40
40
|
# Preloaded context files. None keeps direct PromptBuilder auto-discovery.
|
|
41
41
|
context_files: tuple[ContextFile, ...] | None = None
|
|
42
|
+
|
|
43
|
+
# Precomputed git snapshot (see builder._git_status). None keeps direct,
|
|
44
|
+
# synchronous computation inside the builder; callers that can compute it
|
|
45
|
+
# concurrently with other startup work (e.g. RuntimeContext.create) pass
|
|
46
|
+
# the already-awaited result here to avoid blocking on it a second time.
|
|
47
|
+
git_snapshot: str | None = None
|
|
@@ -10,7 +10,6 @@ from __future__ import annotations
|
|
|
10
10
|
import asyncio
|
|
11
11
|
import base64
|
|
12
12
|
import json
|
|
13
|
-
import ssl
|
|
14
13
|
import subprocess
|
|
15
14
|
import sys
|
|
16
15
|
import time
|
|
@@ -19,8 +18,6 @@ import urllib.parse
|
|
|
19
18
|
import urllib.request
|
|
20
19
|
from dataclasses import dataclass
|
|
21
20
|
|
|
22
|
-
import certifi
|
|
23
|
-
|
|
24
21
|
from tau.inference.provider.oauth.pkce import generate_pkce
|
|
25
22
|
from tau.inference.provider.oauth.types import (
|
|
26
23
|
AbortSignal,
|
|
@@ -31,6 +28,7 @@ from tau.inference.provider.oauth.types import (
|
|
|
31
28
|
)
|
|
32
29
|
from tau.inference.provider.oauth.utils import (
|
|
33
30
|
await_oauth_code,
|
|
31
|
+
get_oauth_ssl_context,
|
|
34
32
|
parse_authorization_input,
|
|
35
33
|
start_oauth_callback_server,
|
|
36
34
|
)
|
|
@@ -38,8 +36,6 @@ from tau.inference.provider.types import OAuthProvider
|
|
|
38
36
|
|
|
39
37
|
__all__ = ["AnthropicClaudeCodeOAuthProvider"]
|
|
40
38
|
|
|
41
|
-
_SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
|
|
42
|
-
|
|
43
39
|
_RAW_CLIENT_ID = "OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl"
|
|
44
40
|
CLIENT_ID = base64.b64decode(_RAW_CLIENT_ID).decode()
|
|
45
41
|
AUTHORIZE_URL = "https://claude.ai/oauth/authorize"
|
|
@@ -87,7 +83,7 @@ def _post_json(url: str, body: dict) -> dict:
|
|
|
87
83
|
method="POST",
|
|
88
84
|
)
|
|
89
85
|
try:
|
|
90
|
-
with urllib.request.urlopen(req, context=
|
|
86
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=30) as resp:
|
|
91
87
|
return json.loads(resp.read())
|
|
92
88
|
except urllib.error.HTTPError as e:
|
|
93
89
|
body_text = e.read().decode(errors="replace")
|
|
@@ -134,7 +130,7 @@ def _validate_token_sync(access_token: str) -> bool:
|
|
|
134
130
|
method="GET",
|
|
135
131
|
)
|
|
136
132
|
try:
|
|
137
|
-
with urllib.request.urlopen(req, context=
|
|
133
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10) as resp:
|
|
138
134
|
return resp.status == 200
|
|
139
135
|
except urllib.error.HTTPError as e:
|
|
140
136
|
# 401/403 mean the token is genuinely invalid; other codes may be transient
|
{tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/github_copilot.py
RENAMED
|
@@ -15,15 +15,12 @@ import asyncio
|
|
|
15
15
|
import base64
|
|
16
16
|
import json
|
|
17
17
|
import re
|
|
18
|
-
import ssl
|
|
19
18
|
import time
|
|
20
19
|
import urllib.error
|
|
21
20
|
import urllib.parse
|
|
22
21
|
import urllib.request
|
|
23
22
|
from dataclasses import dataclass
|
|
24
23
|
|
|
25
|
-
import certifi
|
|
26
|
-
|
|
27
24
|
from tau.inference.provider.oauth.types import (
|
|
28
25
|
AbortSignal,
|
|
29
26
|
OAuthAuthInfo,
|
|
@@ -31,12 +28,11 @@ from tau.inference.provider.oauth.types import (
|
|
|
31
28
|
OAuthLoginCallbacks,
|
|
32
29
|
OAuthPrompt,
|
|
33
30
|
)
|
|
31
|
+
from tau.inference.provider.oauth.utils import get_oauth_ssl_context
|
|
34
32
|
from tau.inference.provider.types import OAuthProvider
|
|
35
33
|
|
|
36
34
|
__all__ = ["GitHubCopilotOAuthProvider", "get_copilot_base_url"]
|
|
37
35
|
|
|
38
|
-
_SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
|
|
39
|
-
|
|
40
36
|
_RAW_CLIENT_ID = "SXYxLmI1MDdhMDhjODdlY2ZlOTg="
|
|
41
37
|
CLIENT_ID = base64.b64decode(_RAW_CLIENT_ID).decode()
|
|
42
38
|
|
|
@@ -101,7 +97,7 @@ def _fetch_json(url: str, *, method: str = "GET", headers: dict, body: bytes | N
|
|
|
101
97
|
"""
|
|
102
98
|
req = urllib.request.Request(url, data=body, headers=headers, method=method)
|
|
103
99
|
try:
|
|
104
|
-
with urllib.request.urlopen(req, context=
|
|
100
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=30) as resp:
|
|
105
101
|
return json.loads(resp.read())
|
|
106
102
|
except urllib.error.HTTPError as e:
|
|
107
103
|
body_text = e.read().decode(errors="replace")
|
|
@@ -177,7 +173,7 @@ def _enable_model(copilot_token: str, model_id: str, enterprise_domain: str | No
|
|
|
177
173
|
method="POST",
|
|
178
174
|
)
|
|
179
175
|
try:
|
|
180
|
-
with urllib.request.urlopen(req, context=
|
|
176
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10) as resp:
|
|
181
177
|
return resp.status == 200
|
|
182
178
|
except Exception:
|
|
183
179
|
return False
|
{tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/google_antigravity.py
RENAMED
|
@@ -11,7 +11,6 @@ import asyncio
|
|
|
11
11
|
import json
|
|
12
12
|
import os
|
|
13
13
|
import secrets
|
|
14
|
-
import ssl
|
|
15
14
|
import time
|
|
16
15
|
import urllib.error
|
|
17
16
|
import urllib.parse
|
|
@@ -19,8 +18,6 @@ import urllib.request
|
|
|
19
18
|
from dataclasses import dataclass
|
|
20
19
|
from pathlib import Path
|
|
21
20
|
|
|
22
|
-
import certifi
|
|
23
|
-
|
|
24
21
|
from tau.inference.provider.oauth.types import (
|
|
25
22
|
AbortSignal,
|
|
26
23
|
OAuthAuthInfo,
|
|
@@ -30,6 +27,7 @@ from tau.inference.provider.oauth.types import (
|
|
|
30
27
|
)
|
|
31
28
|
from tau.inference.provider.oauth.utils import (
|
|
32
29
|
await_oauth_code,
|
|
30
|
+
get_oauth_ssl_context,
|
|
33
31
|
parse_authorization_input,
|
|
34
32
|
start_oauth_callback_server,
|
|
35
33
|
)
|
|
@@ -37,8 +35,6 @@ from tau.inference.provider.types import OAuthProvider
|
|
|
37
35
|
|
|
38
36
|
__all__ = ["GoogleAntigravityOAuthProvider"]
|
|
39
37
|
|
|
40
|
-
_SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
|
|
41
|
-
|
|
42
38
|
CLIENT_ID = os.getenv(
|
|
43
39
|
"GOOGLE_ANTIGRAVITY_CLIENT_ID",
|
|
44
40
|
"1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com",
|
|
@@ -88,7 +84,7 @@ def _post_form(url: str, body: dict) -> dict:
|
|
|
88
84
|
method="POST",
|
|
89
85
|
)
|
|
90
86
|
try:
|
|
91
|
-
with urllib.request.urlopen(req, context=
|
|
87
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=30) as resp:
|
|
92
88
|
return json.loads(resp.read())
|
|
93
89
|
except urllib.error.HTTPError as e:
|
|
94
90
|
body_text = e.read().decode(errors="replace")
|
|
@@ -130,7 +126,7 @@ def _validate_token_sync(access_token: str) -> bool:
|
|
|
130
126
|
method="GET",
|
|
131
127
|
)
|
|
132
128
|
try:
|
|
133
|
-
with urllib.request.urlopen(req, context=
|
|
129
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10) as resp:
|
|
134
130
|
return resp.status == 200
|
|
135
131
|
except urllib.error.HTTPError as e:
|
|
136
132
|
return e.code not in (401, 403)
|
|
@@ -275,7 +271,7 @@ class GoogleAntigravityOAuthProvider(OAuthProvider):
|
|
|
275
271
|
data=b"",
|
|
276
272
|
method="POST",
|
|
277
273
|
)
|
|
278
|
-
with urllib.request.urlopen(req, context=
|
|
274
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10):
|
|
279
275
|
pass
|
|
280
276
|
except Exception:
|
|
281
277
|
pass
|
{tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/inference/provider/oauth/openai_codex.py
RENAMED
|
@@ -11,7 +11,6 @@ import asyncio
|
|
|
11
11
|
import base64
|
|
12
12
|
import json
|
|
13
13
|
import secrets
|
|
14
|
-
import ssl
|
|
15
14
|
import time
|
|
16
15
|
import urllib.error
|
|
17
16
|
import urllib.parse
|
|
@@ -19,8 +18,6 @@ import urllib.request
|
|
|
19
18
|
from dataclasses import dataclass
|
|
20
19
|
from pathlib import Path
|
|
21
20
|
|
|
22
|
-
import certifi
|
|
23
|
-
|
|
24
21
|
from tau.inference.provider.oauth.pkce import generate_pkce
|
|
25
22
|
from tau.inference.provider.oauth.types import (
|
|
26
23
|
AbortSignal,
|
|
@@ -31,13 +28,12 @@ from tau.inference.provider.oauth.types import (
|
|
|
31
28
|
)
|
|
32
29
|
from tau.inference.provider.oauth.utils import (
|
|
33
30
|
await_oauth_code,
|
|
31
|
+
get_oauth_ssl_context,
|
|
34
32
|
parse_authorization_input,
|
|
35
33
|
start_oauth_callback_server,
|
|
36
34
|
)
|
|
37
35
|
from tau.inference.provider.types import OAuthProvider
|
|
38
36
|
|
|
39
|
-
_SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
|
|
40
|
-
|
|
41
37
|
__all__ = ["OpenAICodexOAuthProvider"]
|
|
42
38
|
|
|
43
39
|
CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann"
|
|
@@ -113,7 +109,7 @@ def _post_token(body: dict[str, str]) -> dict:
|
|
|
113
109
|
method="POST",
|
|
114
110
|
)
|
|
115
111
|
try:
|
|
116
|
-
with urllib.request.urlopen(req, context=
|
|
112
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context()) as resp:
|
|
117
113
|
return json.loads(resp.read())
|
|
118
114
|
except urllib.error.HTTPError as e:
|
|
119
115
|
body_text = e.read().decode(errors="replace")
|
|
@@ -159,7 +155,7 @@ def _revoke_token_sync(token: str) -> None:
|
|
|
159
155
|
method="POST",
|
|
160
156
|
)
|
|
161
157
|
try:
|
|
162
|
-
with urllib.request.urlopen(req, context=
|
|
158
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context()):
|
|
163
159
|
pass
|
|
164
160
|
except urllib.error.HTTPError:
|
|
165
161
|
# best-effort; treat any error as revocation attempt done
|
|
@@ -174,7 +170,7 @@ def _validate_token_sync(access_token: str) -> bool:
|
|
|
174
170
|
method="GET",
|
|
175
171
|
)
|
|
176
172
|
try:
|
|
177
|
-
with urllib.request.urlopen(req, context=
|
|
173
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context()) as resp:
|
|
178
174
|
return resp.status == 200
|
|
179
175
|
except urllib.error.HTTPError:
|
|
180
176
|
return False
|
|
@@ -4,7 +4,9 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import logging
|
|
7
|
+
import ssl
|
|
7
8
|
import urllib.parse
|
|
9
|
+
from functools import lru_cache
|
|
8
10
|
|
|
9
11
|
from tau.inference.provider.oauth.types import OAuthLoginCallbacks
|
|
10
12
|
|
|
@@ -13,11 +15,25 @@ _log = logging.getLogger(__name__)
|
|
|
13
15
|
__all__ = [
|
|
14
16
|
"OAUTH_SUCCESS_HTML",
|
|
15
17
|
"OAUTH_ERROR_HTML",
|
|
18
|
+
"get_oauth_ssl_context",
|
|
16
19
|
"parse_authorization_input",
|
|
17
20
|
"start_oauth_callback_server",
|
|
18
21
|
"await_oauth_code",
|
|
19
22
|
]
|
|
20
23
|
|
|
24
|
+
|
|
25
|
+
@lru_cache(maxsize=1)
|
|
26
|
+
def get_oauth_ssl_context() -> ssl.SSLContext:
|
|
27
|
+
"""Build (once, on first use) the shared SSL context for OAuth HTTP calls.
|
|
28
|
+
|
|
29
|
+
Loading the certifi CA bundle takes ~150-200ms; deferring it until an
|
|
30
|
+
OAuth provider is actually used (rather than at module import time)
|
|
31
|
+
keeps that cost off the startup path for users who aren't using OAuth.
|
|
32
|
+
"""
|
|
33
|
+
import certifi
|
|
34
|
+
|
|
35
|
+
return ssl.create_default_context(cafile=certifi.where())
|
|
36
|
+
|
|
21
37
|
OAUTH_SUCCESS_HTML = b"""<!DOCTYPE html><html><head><title>Auth complete</title></head><body>
|
|
22
38
|
<h2>Authentication successful!</h2>
|
|
23
39
|
<p>You can close this window and return to the application.</p>
|
{tau_coding_agent-0.5.2 → tau_coding_agent-0.5.3}/tau/modes/interactive/components/layout.py
RENAMED
|
@@ -272,6 +272,8 @@ class Layout(Component):
|
|
|
272
272
|
self._settings_panel: list[str] | None = None
|
|
273
273
|
self._prompt = TextPrompt()
|
|
274
274
|
self._oauth_status_lines: list[str] | None = None
|
|
275
|
+
self._editor_row = 0
|
|
276
|
+
self._editor_row_count = 0
|
|
275
277
|
|
|
276
278
|
# Model palette — inline filtered model list for '/model <name> <provider>'
|
|
277
279
|
|
|
@@ -366,6 +368,7 @@ class Layout(Component):
|
|
|
366
368
|
content.append(_divider("─" * width))
|
|
367
369
|
|
|
368
370
|
if any_modal:
|
|
371
|
+
self._editor_row_count = 0
|
|
369
372
|
# Modal replaces the input between the two dividers
|
|
370
373
|
if self._selectors.is_active:
|
|
371
374
|
content.extend(self._selectors.render(width))
|
|
@@ -377,7 +380,10 @@ class Layout(Component):
|
|
|
377
380
|
content.extend(self._oauth_status_lines)
|
|
378
381
|
else:
|
|
379
382
|
# Normal: show the input editor
|
|
380
|
-
|
|
383
|
+
self._editor_row = len(content)
|
|
384
|
+
editor_lines = self.input.render(width)
|
|
385
|
+
self._editor_row_count = len(editor_lines)
|
|
386
|
+
content.extend(editor_lines)
|
|
381
387
|
|
|
382
388
|
content.append(_divider("─" * width))
|
|
383
389
|
|
|
@@ -407,6 +413,20 @@ class Layout(Component):
|
|
|
407
413
|
so this method deals only with editor and picker navigation.
|
|
408
414
|
"""
|
|
409
415
|
if isinstance(event, MouseEvent):
|
|
416
|
+
if not event.pressed or event.button != 0:
|
|
417
|
+
return False
|
|
418
|
+
position = self._tui.mouse_position_for(self, event)
|
|
419
|
+
if position is None:
|
|
420
|
+
return False
|
|
421
|
+
row, column = position
|
|
422
|
+
editor_row = row - self._editor_row
|
|
423
|
+
if (
|
|
424
|
+
0 <= editor_row < self._editor_row_count
|
|
425
|
+
and isinstance(self.input, TextInput)
|
|
426
|
+
and self.input.move_cursor_to_visual(editor_row, column)
|
|
427
|
+
):
|
|
428
|
+
self._tui.request_render()
|
|
429
|
+
return True
|
|
410
430
|
return False
|
|
411
431
|
|
|
412
432
|
if self._selectors.handle_input(event):
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
from typing import TYPE_CHECKING, Any
|
|
6
7
|
|
|
7
8
|
from pydantic import BaseModel, Field
|
|
8
9
|
|
|
9
|
-
from tau.agent.prompt.builder import build_prompt
|
|
10
|
+
from tau.agent.prompt.builder import _git_status, build_prompt
|
|
10
11
|
from tau.agent.prompt.types import PromptOptions
|
|
11
12
|
from tau.agent.service import Agent
|
|
12
13
|
from tau.agent.types import AgentConfig
|
|
@@ -207,6 +208,16 @@ class RuntimeContext:
|
|
|
207
208
|
)
|
|
208
209
|
)
|
|
209
210
|
|
|
211
|
+
# Kick off the git-status snapshot now (needed later for the system prompt)
|
|
212
|
+
# so its subprocess calls run in a background thread concurrently with the
|
|
213
|
+
# rest of startup (settings, extension loading, resource discovery) instead
|
|
214
|
+
# of blocking the event loop right before the prompt is built.
|
|
215
|
+
git_task: asyncio.Task[str] | None = (
|
|
216
|
+
asyncio.create_task(asyncio.to_thread(_git_status, cwd))
|
|
217
|
+
if project_trusted and not config.system_prompt
|
|
218
|
+
else None
|
|
219
|
+
)
|
|
220
|
+
|
|
210
221
|
# ── LLM ───────────────────────────────────────────────────────────────
|
|
211
222
|
text_ref = settings_manager.get_model_ref("text")
|
|
212
223
|
model_id = config.model_id or (text_ref.id if text_ref else None) or _DEFAULT_MODEL
|
|
@@ -351,6 +362,7 @@ class RuntimeContext:
|
|
|
351
362
|
skills = skill_registry.list()
|
|
352
363
|
|
|
353
364
|
# ── System prompt ─────────────────────────────────────────────────────
|
|
365
|
+
git_snapshot = await git_task if git_task is not None else None
|
|
354
366
|
system_prompt = (
|
|
355
367
|
config.system_prompt
|
|
356
368
|
or resources.system_prompt
|
|
@@ -363,6 +375,7 @@ class RuntimeContext:
|
|
|
363
375
|
disable_context_files=config.disable_context_files,
|
|
364
376
|
project_trusted=project_trusted,
|
|
365
377
|
context_files=resources.context_files,
|
|
378
|
+
git_snapshot=git_snapshot,
|
|
366
379
|
)
|
|
367
380
|
)
|
|
368
381
|
)
|
|
@@ -42,14 +42,19 @@ class SessionType(StrEnum):
|
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class BaseSessionEntry(BaseModel):
|
|
45
|
-
|
|
45
|
+
# defer_build: these models (and the ~10-way discriminated union built from
|
|
46
|
+
# them) cost ~60ms of pydantic core-schema construction at import time even
|
|
47
|
+
# though session entries are only read/written once a session file is
|
|
48
|
+
# actually touched. Deferring moves that cost to first real use instead of
|
|
49
|
+
# every startup.
|
|
50
|
+
model_config = ConfigDict(arbitrary_types_allowed=True, defer_build=True)
|
|
46
51
|
id: str = Field(default_factory=_generate_id)
|
|
47
52
|
timestamp: float = Field(default_factory=generate_timestamp)
|
|
48
53
|
parent_id: str | None = None
|
|
49
54
|
|
|
50
55
|
|
|
51
56
|
class SessionHeader(BaseModel):
|
|
52
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
57
|
+
model_config = ConfigDict(arbitrary_types_allowed=True, defer_build=True)
|
|
53
58
|
type: Literal[SessionType.SESSION_HEADER] = SessionType.SESSION_HEADER
|
|
54
59
|
version: int = SESSION_VERSION
|
|
55
60
|
id: str = Field(default_factory=_generate_id)
|
|
@@ -150,7 +155,7 @@ SessionFileEntry = Annotated[SessionHeader | SessionEntries, Field(discriminator
|
|
|
150
155
|
|
|
151
156
|
|
|
152
157
|
class SessionTreeNode(BaseModel):
|
|
153
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
158
|
+
model_config = ConfigDict(arbitrary_types_allowed=True, defer_build=True)
|
|
154
159
|
entry: SessionEntry
|
|
155
160
|
children: list[SessionTreeNode] = Field(default_factory=list)
|
|
156
161
|
label: str | None = None
|