tau-coding-agent 0.1.0__tar.gz → 0.2.0__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.1.0/tau_coding_agent.egg-info → tau_coding_agent-0.2.0}/PKG-INFO +11 -5
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/README.md +9 -3
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/pyproject.toml +12 -2
- tau_coding_agent-0.2.0/tau/builtins/__pycache__/__init__.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/__init__.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/clear.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/compact.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/reload.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/session.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/__init__.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/git.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/model.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__pycache__/utils.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/header/__pycache__/__init__.cpython-313.pyc +0 -0
- tau_coding_agent-0.2.0/tau/builtins/models/__pycache__/__init__.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/__pycache__/text.cpython-313.pyc +0 -0
- tau_coding_agent-0.2.0/tau/builtins/providers/__pycache__/__init__.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/__pycache__/text.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/__init__.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/edit.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/glob.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/grep.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/ls.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/read.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/terminal.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/write.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/cli.py +1 -1
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/google_antigravity.py +4 -3
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/utils.py +11 -1
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/message/types.py +15 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/runtime/service.py +2 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/themes/registry.py +23 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/app.py +25 -11
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/appearance.py +4 -4
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/autocomplete_manager.py +6 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/input_handler.py +40 -6
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0/tau_coding_agent.egg-info}/PKG-INFO +11 -5
- tau_coding_agent-0.1.0/tau/builtins/__pycache__/__init__.cpython-313.pyc +0 -0
- tau_coding_agent-0.1.0/tau/builtins/models/__pycache__/__init__.cpython-313.pyc +0 -0
- tau_coding_agent-0.1.0/tau/builtins/providers/__pycache__/__init__.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/LICENSE +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/MANIFEST.in +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/architecture.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/auth.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/cli-reference.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/development.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/docs.json +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/extension-settings.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/extensions.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/http-proxy.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/index.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/inference-providers.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/installation.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/keybindings.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/messages.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/project-context.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/project-structure.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/prompts.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/python-api.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/quickstart.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/sessions.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/settings.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/skills.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/themes.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/tools.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/docs/usage.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/setup.cfg +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/prompt/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/prompt/builder.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/prompt/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/service.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/agent/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/auth/manager.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/auth/storage.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/auth/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/__pycache__/__init__.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/__init__.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/clear.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/compact.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/reload.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/__pycache__/session.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/clear.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/compact.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/reload.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/commands/session.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/git.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/model.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/footer/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/extensions/header/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/audio.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/image.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/text.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/models/video.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/commit.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/docs.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/explain.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/fix.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/refactor.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/review.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/prompts/test.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/audio.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/image.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/text.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/providers/video.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/skills/code-review/SKILL.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/skills/debug/SKILL.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/skills/git-commit/SKILL.md +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/themes/dark.yaml +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/themes/light.yaml +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/bash.cpython-313.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/bash.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/edit.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/glob.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/grep.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/ls.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/read.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/terminal.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/write.cpython-314.pyc +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/edit.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/glob.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/grep.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/ls.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/read.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/terminal.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/write.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/commands/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/commands/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/commands/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/auth.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/packages.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/console/commands/update.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/core/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/core/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/engine/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/engine/service.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/engine/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/api.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/context.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/events.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/loader.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/runtime.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/extensions/settings.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/engine.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/inference.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/runtime.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/service.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/session.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/tui.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/hooks/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/base.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/builtins.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/gemini_audio.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/openai_audio.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/sarvam_audio.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/service.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/audio/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/base.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/builtins.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/gemini_image.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/openai_image.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/openrouter.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/image/service.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/anthropic_messages.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/base.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/builtins.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/gemini_generate.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/github_copilot_chat.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/google_antigravity.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/mistral_chat.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/ollama_chat.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/openai_codex_responses.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/openai_completions.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/openai_responses.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/service.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/text/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/base.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/builtins.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/fal_video.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/openrouter_video.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/api/video/service.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/model/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/model/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/model/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/github_copilot.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/openai_codex.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/pkce.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/message/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/message/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/manager.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/packages/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/expand.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/loader.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/prompts/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/rpc/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/rpc/mode.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/rpc/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/runtime/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/branch_summarization.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/compaction.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/manager.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/session/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/manager.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/paths.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/storage.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/settings/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/skills/loader.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/skills/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/skills/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/themes/loader.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/themes/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/registry.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/render.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tool/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/manager.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/types.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/trust/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/agent_hooks.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/ansi.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/autocomplete.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/capabilities.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/auth.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/context.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/misc.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/model.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/commands/session.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/component.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/autocomplete_picker.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/box.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/command_palette.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/dynamic_border.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/file_picker.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/image.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/inline_selector.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/layout.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/message_list.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/modal.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/model_palette.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/picker_overlay.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/prompt_overlay.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/resume_modal.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/select_list.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/settings_modal.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/settings_schema.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/spinner.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/text_input.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/text_prompt.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/tree_select_list.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/trust_screen.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/diff.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/fuzzy.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/input.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/keybindings.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/markdown.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/message_renderers.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/overlay.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/renderer.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/terminal.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/theme.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/tui.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/ui_context.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/utils.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/__init__.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/http_proxy.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/image_processing.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/secrets.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/utils/version_check.py +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/SOURCES.txt +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/entry_points.txt +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/requires.txt +0 -0
- {tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau_coding_agent.egg-info/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tau-coding-agent
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.2.0
|
|
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.13.*
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
License-File: LICENSE
|
|
@@ -27,9 +27,15 @@ Requires-Dist: pathspec==1.1.1
|
|
|
27
27
|
Requires-Dist: gitpython==3.1.50
|
|
28
28
|
Dynamic: license-file
|
|
29
29
|
|
|
30
|
-
# Tau
|
|
30
|
+
# Tau (τ)
|
|
31
31
|
|
|
32
|
-
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.
|
|
32
|
+
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.
|
|
33
|
+
|
|
34
|
+
<p align="center">
|
|
35
|
+
<img src="assets/tui.png" alt="Tau TUI" width="700">
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
Start a conversation with the agent in the terminal.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
@@ -55,7 +61,7 @@ pip install -e .
|
|
|
55
61
|
tau
|
|
56
62
|
```
|
|
57
63
|
|
|
58
|
-
Authenticate with your LLM provider using `/login` or set environment variables (e.g., `
|
|
64
|
+
Authenticate with your LLM provider using `/login` or set environment variables (e.g., `NVIDIA_API_KEY`).
|
|
59
65
|
|
|
60
66
|
### Common Commands
|
|
61
67
|
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
# Tau
|
|
1
|
+
# Tau (τ)
|
|
2
2
|
|
|
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.
|
|
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
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="assets/tui.png" alt="Tau TUI" width="700">
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
Start a conversation with the agent in the terminal.
|
|
4
10
|
|
|
5
11
|
---
|
|
6
12
|
|
|
@@ -26,7 +32,7 @@ pip install -e .
|
|
|
26
32
|
tau
|
|
27
33
|
```
|
|
28
34
|
|
|
29
|
-
Authenticate with your LLM provider using `/login` or set environment variables (e.g., `
|
|
35
|
+
Authenticate with your LLM provider using `/login` or set environment variables (e.g., `NVIDIA_API_KEY`).
|
|
30
36
|
|
|
31
37
|
### Common Commands
|
|
32
38
|
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
1
5
|
[project]
|
|
2
6
|
name = "tau-coding-agent"
|
|
3
|
-
version = "0.
|
|
4
|
-
description = "
|
|
7
|
+
version = "0.2.0"
|
|
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"
|
|
5
9
|
readme = "README.md"
|
|
6
10
|
requires-python = "==3.13.*"
|
|
7
11
|
dependencies = [
|
|
@@ -49,6 +53,12 @@ indent-style = "space"
|
|
|
49
53
|
[tool.setuptools]
|
|
50
54
|
include-package-data = true
|
|
51
55
|
|
|
56
|
+
# Only package the `tau` import package. Without this, setuptools auto-discovery
|
|
57
|
+
# trips over sibling top-level dirs (dist/, docs/, assets/, *.egg-info) and
|
|
58
|
+
# aborts editable installs with "Multiple top-level packages discovered".
|
|
59
|
+
[tool.setuptools.packages.find]
|
|
60
|
+
include = ["tau*"]
|
|
61
|
+
|
|
52
62
|
[tool.setuptools.package-data]
|
|
53
63
|
tau = [
|
|
54
64
|
"builtins/**/*",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
{tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/builtins/tools/__pycache__/ls.cpython-313.pyc
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -49,7 +49,7 @@ def resolve_model(model: str | None, provider: str | None) -> tuple[str | None,
|
|
|
49
49
|
@click.option("--provider", default=None, help="Provider to use (e.g. groq, mistral, openrouter).")
|
|
50
50
|
@click.option("--model", default=None, help="Model ID, or provider/model shorthand (e.g. groq/llama-3.3-70b-versatile).")
|
|
51
51
|
@click.option("--theme", "-t", default=None, metavar="NAME",
|
|
52
|
-
help="UI theme
|
|
52
|
+
help="UI theme name (default: dark). Builtins: dark, light. See /theme for all installed themes.")
|
|
53
53
|
@click.option("--resume", "-r", is_flag=True, default=False,
|
|
54
54
|
help="Resume the most recent session.")
|
|
55
55
|
@click.option("--system", "-s", default=None, metavar="TEXT",
|
{tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/inference/provider/oauth/google_antigravity.py
RENAMED
|
@@ -8,6 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import asyncio
|
|
10
10
|
import json
|
|
11
|
+
import os
|
|
11
12
|
import secrets
|
|
12
13
|
import ssl
|
|
13
14
|
import time
|
|
@@ -26,10 +27,10 @@ from tau.inference.provider.oauth.utils import parse_authorization_input, start_
|
|
|
26
27
|
|
|
27
28
|
__all__ = ["GoogleAntigravityOAuthProvider"]
|
|
28
29
|
|
|
29
|
-
_SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
|
|
30
|
+
_SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
|
|
30
31
|
|
|
31
|
-
CLIENT_ID = "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com"
|
|
32
|
-
CLIENT_SECRET = "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"
|
|
32
|
+
CLIENT_ID = os.getenv("GOOGLE_ANTIGRAVITY_CLIENT_ID", "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com")
|
|
33
|
+
CLIENT_SECRET = os.getenv("GOOGLE_ANTIGRAVITY_CLIENT_SECRET", "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")
|
|
33
34
|
AUTHORIZE_URL = "https://accounts.google.com/o/oauth2/v2/auth"
|
|
34
35
|
TOKEN_URL = "https://oauth2.googleapis.com/token"
|
|
35
36
|
USERINFO_URL = "https://www.googleapis.com/oauth2/v1/userinfo"
|
|
@@ -119,12 +119,14 @@ async def await_oauth_code(
|
|
|
119
119
|
"""
|
|
120
120
|
code: Optional[str] = None
|
|
121
121
|
recv_state: Optional[str] = None
|
|
122
|
+
pending: set = set()
|
|
122
123
|
try:
|
|
123
124
|
if callbacks.on_manual_code_input:
|
|
124
125
|
browser_task = asyncio.ensure_future(code_future)
|
|
125
126
|
manual_task = asyncio.ensure_future(callbacks.on_manual_code_input())
|
|
127
|
+
pending = {browser_task, manual_task}
|
|
126
128
|
done, pending = await asyncio.wait(
|
|
127
|
-
|
|
129
|
+
pending,
|
|
128
130
|
timeout=300,
|
|
129
131
|
return_when=asyncio.FIRST_COMPLETED,
|
|
130
132
|
)
|
|
@@ -148,7 +150,15 @@ async def await_oauth_code(
|
|
|
148
150
|
recv_state = state
|
|
149
151
|
except asyncio.TimeoutError:
|
|
150
152
|
pass
|
|
153
|
+
except Exception:
|
|
154
|
+
for task in pending:
|
|
155
|
+
if not task.done():
|
|
156
|
+
task.cancel()
|
|
157
|
+
raise
|
|
151
158
|
finally:
|
|
159
|
+
for task in pending:
|
|
160
|
+
if not task.done():
|
|
161
|
+
task.cancel()
|
|
152
162
|
server.close()
|
|
153
163
|
await server.wait_closed()
|
|
154
164
|
return code, recv_state
|
|
@@ -41,6 +41,21 @@ class ImageContent:
|
|
|
41
41
|
images: list[str | Image.Image | bytes] = field(default_factory=list)
|
|
42
42
|
dimension_note: str | None = None
|
|
43
43
|
|
|
44
|
+
def __post_init__(self) -> None:
|
|
45
|
+
# Normalize raw bytes / PIL images to base64 strings so the content is
|
|
46
|
+
# always JSON-serializable for session persistence (pydantic cannot
|
|
47
|
+
# encode non-UTF-8 image bytes). Existing base64 and URL strings pass
|
|
48
|
+
# through unchanged, and to_base64() re-detects the MIME type from the
|
|
49
|
+
# base64 magic bytes, so downstream API/render code is unaffected.
|
|
50
|
+
normalized: list[str | Image.Image | bytes] = []
|
|
51
|
+
for img in self.images:
|
|
52
|
+
if isinstance(img, str):
|
|
53
|
+
normalized.append(img)
|
|
54
|
+
else:
|
|
55
|
+
b64, _ = image_to_base64(img)
|
|
56
|
+
normalized.append(b64)
|
|
57
|
+
self.images = normalized
|
|
58
|
+
|
|
44
59
|
def to_base64(self) -> list[tuple[str, str]]:
|
|
45
60
|
"""Convert all images to (base64_data, mime_type) pairs.
|
|
46
61
|
|
|
@@ -20,6 +20,11 @@ if TYPE_CHECKING:
|
|
|
20
20
|
from tau.tui.theme import LayoutTheme
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
#: Name of the theme used when none is configured. Must always resolve to a
|
|
24
|
+
#: builtin so the TUI can start even with no global/project themes installed.
|
|
25
|
+
DEFAULT_THEME = "dark"
|
|
26
|
+
|
|
27
|
+
|
|
23
28
|
class ThemeRegistry:
|
|
24
29
|
def __init__(self) -> None:
|
|
25
30
|
"""Initialize an empty theme registry."""
|
|
@@ -75,6 +80,24 @@ class ThemeRegistry:
|
|
|
75
80
|
)
|
|
76
81
|
return loader()
|
|
77
82
|
|
|
83
|
+
def get_default(self) -> "LayoutTheme":
|
|
84
|
+
"""Return a theme that is guaranteed to load.
|
|
85
|
+
|
|
86
|
+
Tries the configured default, then any builtin, then falls back to a
|
|
87
|
+
bare ``LayoutTheme()`` so the UI can always start — even when no theme
|
|
88
|
+
files are present at all.
|
|
89
|
+
"""
|
|
90
|
+
self._ensure_builtins()
|
|
91
|
+
for name in (DEFAULT_THEME, "light"):
|
|
92
|
+
loader = self._registry.get(name)
|
|
93
|
+
if loader is not None:
|
|
94
|
+
return loader()
|
|
95
|
+
if self._registry:
|
|
96
|
+
return next(iter(self._registry.values()))()
|
|
97
|
+
from tau.tui.theme import LayoutTheme
|
|
98
|
+
|
|
99
|
+
return LayoutTheme()
|
|
100
|
+
|
|
78
101
|
def list(self) -> list[str]:
|
|
79
102
|
"""Return all available theme names."""
|
|
80
103
|
self._ensure_builtins()
|
|
@@ -45,6 +45,7 @@ class App:
|
|
|
45
45
|
on_turn_content=self._input.mark_turn_content,
|
|
46
46
|
)
|
|
47
47
|
self._unsubs: list[Callable[[], None]] = []
|
|
48
|
+
self._pending_tasks: set[asyncio.Task] = set()
|
|
48
49
|
self._last_ctrl_c: float = 0.0
|
|
49
50
|
self._last_escape: float = 0.0
|
|
50
51
|
|
|
@@ -60,7 +61,7 @@ class App:
|
|
|
60
61
|
keybindings: KeyMap | None = None,
|
|
61
62
|
) -> App:
|
|
62
63
|
"""Build the TUI around an already-constructed Runtime."""
|
|
63
|
-
from tau.themes.registry import theme_registry
|
|
64
|
+
from tau.themes.registry import theme_registry, DEFAULT_THEME
|
|
64
65
|
|
|
65
66
|
cwd = runtime.session_manager.cwd if runtime.session_manager is not None else None
|
|
66
67
|
theme_registry.load_external(cwd=cwd)
|
|
@@ -69,18 +70,21 @@ class App:
|
|
|
69
70
|
prompt_registry.load_external(cwd=cwd)
|
|
70
71
|
|
|
71
72
|
resolved_theme: LayoutTheme | None
|
|
72
|
-
theme_name =
|
|
73
|
+
theme_name = DEFAULT_THEME
|
|
73
74
|
if isinstance(theme, str):
|
|
74
75
|
theme_name = theme
|
|
75
76
|
resolved_theme = theme_registry.get(theme_name)
|
|
76
77
|
elif theme is None:
|
|
77
78
|
sm = runtime.settings_manager
|
|
78
|
-
theme_name = (sm.get_theme() if sm is not None else None) or
|
|
79
|
+
theme_name = (sm.get_theme() if sm is not None else None) or DEFAULT_THEME
|
|
79
80
|
try:
|
|
80
81
|
resolved_theme = theme_registry.get(theme_name)
|
|
81
82
|
except ValueError:
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
# Configured theme is gone (e.g. an uninstalled theme package)
|
|
84
|
+
# or the default builtin is missing — fall back to a theme that
|
|
85
|
+
# is guaranteed to load instead of crashing on startup.
|
|
86
|
+
theme_name = DEFAULT_THEME
|
|
87
|
+
resolved_theme = theme_registry.get_default()
|
|
84
88
|
else:
|
|
85
89
|
resolved_theme = theme
|
|
86
90
|
|
|
@@ -172,7 +176,11 @@ class App:
|
|
|
172
176
|
def _on_model_palette_commit(self, model_id: str, provider: str) -> None:
|
|
173
177
|
import asyncio
|
|
174
178
|
from tau.tui.commands import model as cmd_model
|
|
175
|
-
asyncio.ensure_future(cmd_model._apply_model(self._ctx(), model_id, provider))
|
|
179
|
+
self._track_task(asyncio.ensure_future(cmd_model._apply_model(self._ctx(), model_id, provider)))
|
|
180
|
+
|
|
181
|
+
def _track_task(self, task: asyncio.Task) -> None:
|
|
182
|
+
self._pending_tasks.add(task)
|
|
183
|
+
task.add_done_callback(self._pending_tasks.discard)
|
|
176
184
|
|
|
177
185
|
# -------------------------------------------------------------------------
|
|
178
186
|
# UI command registration
|
|
@@ -300,14 +308,14 @@ class App:
|
|
|
300
308
|
# before the loop starts so the layout never renders until the user acts.
|
|
301
309
|
trust_needed = self._setup_trust_screen_if_needed()
|
|
302
310
|
|
|
303
|
-
asyncio.ensure_future(self._announce_update())
|
|
311
|
+
self._track_task(asyncio.ensure_future(self._announce_update()))
|
|
304
312
|
|
|
305
313
|
await self._runtime.hooks.emit(TuiStartEvent())
|
|
306
314
|
try:
|
|
307
315
|
await self._tui.run()
|
|
308
316
|
finally:
|
|
309
317
|
await self._runtime.hooks.emit(TuiExitEvent())
|
|
310
|
-
self._cleanup()
|
|
318
|
+
await self._cleanup()
|
|
311
319
|
|
|
312
320
|
# -------------------------------------------------------------------------
|
|
313
321
|
# Project trust prompt
|
|
@@ -354,7 +362,7 @@ class App:
|
|
|
354
362
|
import asyncio as _asyncio
|
|
355
363
|
async def _reload() -> None:
|
|
356
364
|
await self._runtime.reload_extensions()
|
|
357
|
-
_asyncio.ensure_future(_reload())
|
|
365
|
+
self._track_task(_asyncio.ensure_future(_reload()))
|
|
358
366
|
|
|
359
367
|
from tau.tui.components.trust_screen import TrustScreen
|
|
360
368
|
screen = TrustScreen(str(cwd), options, _on_commit)
|
|
@@ -449,7 +457,7 @@ class App:
|
|
|
449
457
|
ctx = ExtensionContext.from_runtime(runtime)
|
|
450
458
|
result = h(ctx)
|
|
451
459
|
if asyncio.iscoroutine(result):
|
|
452
|
-
asyncio.ensure_future(result) # type: ignore[arg-type]
|
|
460
|
+
self._track_task(asyncio.ensure_future(result)) # type: ignore[arg-type]
|
|
453
461
|
return on_input
|
|
454
462
|
|
|
455
463
|
self._unsubs.append(self._tui.on_input(_make_handler(key, handler)))
|
|
@@ -532,9 +540,15 @@ class App:
|
|
|
532
540
|
])
|
|
533
541
|
self._layout.set_widget("version_update", banner, placement="above_editor")
|
|
534
542
|
|
|
535
|
-
def _cleanup(self) -> None:
|
|
543
|
+
async def _cleanup(self) -> None:
|
|
536
544
|
self._input.save_history()
|
|
537
545
|
self._hooks.unsubscribe()
|
|
538
546
|
for unsub in self._unsubs:
|
|
539
547
|
unsub()
|
|
540
548
|
self._unsubs.clear()
|
|
549
|
+
for task in self._pending_tasks:
|
|
550
|
+
task.cancel()
|
|
551
|
+
self._pending_tasks.clear()
|
|
552
|
+
sm = self._runtime.settings_manager
|
|
553
|
+
if sm is not None:
|
|
554
|
+
await sm.flush()
|
|
@@ -13,11 +13,11 @@ def _headers_to_str(headers: dict | None) -> str:
|
|
|
13
13
|
|
|
14
14
|
def open_theme_selector(ctx: CommandContext) -> None:
|
|
15
15
|
"""Open the theme selector modal with live preview."""
|
|
16
|
-
from tau.themes.registry import theme_registry
|
|
16
|
+
from tau.themes.registry import theme_registry, DEFAULT_THEME
|
|
17
17
|
|
|
18
18
|
names = theme_registry.list()
|
|
19
19
|
sm = ctx.runtime.settings_manager
|
|
20
|
-
original = (sm.get_theme() if sm is not None else None) or
|
|
20
|
+
original = (sm.get_theme() if sm is not None else None) or DEFAULT_THEME
|
|
21
21
|
|
|
22
22
|
def preview(name: str) -> None:
|
|
23
23
|
"""Preview the selected theme."""
|
|
@@ -54,7 +54,7 @@ def open_settings_panel(ctx: CommandContext) -> None:
|
|
|
54
54
|
from tau.tui.components.settings_modal import SettingItem, SettingsModal
|
|
55
55
|
from tau.inference.types import Transport, ThinkingLevel
|
|
56
56
|
from tau.engine.types import SteeringMode, FollowupMode
|
|
57
|
-
from tau.themes.registry import theme_registry
|
|
57
|
+
from tau.themes.registry import theme_registry, DEFAULT_THEME
|
|
58
58
|
|
|
59
59
|
sm = ctx.runtime.settings_manager
|
|
60
60
|
if sm is None:
|
|
@@ -137,7 +137,7 @@ def open_settings_panel(ctx: CommandContext) -> None:
|
|
|
137
137
|
id="theme",
|
|
138
138
|
label="Theme",
|
|
139
139
|
description="Color theme for the interface",
|
|
140
|
-
current_value=sm.get_theme() or
|
|
140
|
+
current_value=sm.get_theme() or DEFAULT_THEME,
|
|
141
141
|
submenu_items=theme_registry.list(),
|
|
142
142
|
submenu_title="Theme",
|
|
143
143
|
),
|
{tau_coding_agent-0.1.0 → tau_coding_agent-0.2.0}/tau/tui/components/autocomplete_manager.py
RENAMED
|
@@ -54,6 +54,12 @@ class AutocompleteManager:
|
|
|
54
54
|
|
|
55
55
|
def clear(self) -> None:
|
|
56
56
|
"""Dismiss both pickers — called when another picker takes over."""
|
|
57
|
+
if self._ac_pending_task is not None:
|
|
58
|
+
self._ac_pending_task.cancel()
|
|
59
|
+
self._ac_pending_task = None
|
|
60
|
+
if self._cmd_arg_pending_task is not None:
|
|
61
|
+
self._cmd_arg_pending_task.cancel()
|
|
62
|
+
self._cmd_arg_pending_task = None
|
|
57
63
|
self._ac_picker.clear()
|
|
58
64
|
self._cmd_arg_picker.clear()
|
|
59
65
|
self._ac_active_trigger = ""
|
|
@@ -98,7 +98,15 @@ class InputHandler:
|
|
|
98
98
|
asyncio.ensure_future(self._invoke(text))
|
|
99
99
|
return
|
|
100
100
|
|
|
101
|
-
images = self._extract_clipboard_images(text)
|
|
101
|
+
images, missing_images = self._extract_clipboard_images(text)
|
|
102
|
+
if missing_images:
|
|
103
|
+
plural = "s" if missing_images > 1 else ""
|
|
104
|
+
self._notify(
|
|
105
|
+
f"{missing_images} image{plural} could not be found — the media file{plural} may have been deleted or moved.",
|
|
106
|
+
type="error",
|
|
107
|
+
)
|
|
108
|
+
return
|
|
109
|
+
|
|
102
110
|
audio = self._extract_clipboard_audio(text)
|
|
103
111
|
video = self._extract_clipboard_video(text)
|
|
104
112
|
expanded = self._expand_pasted_texts(text)
|
|
@@ -121,6 +129,11 @@ class InputHandler:
|
|
|
121
129
|
asyncio.ensure_future(self._steer(expanded, images))
|
|
122
130
|
return
|
|
123
131
|
|
|
132
|
+
# Strip resolved image markers from the text sent to the model so the
|
|
133
|
+
# LLM doesn't see raw [image:uuid] placeholders alongside actual image bytes.
|
|
134
|
+
stripped = re.sub(r"\[image(?::[^\]]+| #\d+)\]", "", expanded).strip()
|
|
135
|
+
model_text = stripped if stripped else expanded
|
|
136
|
+
|
|
124
137
|
if images:
|
|
125
138
|
user_msg = UserMessage.with_images(text, images)
|
|
126
139
|
elif audio:
|
|
@@ -133,10 +146,10 @@ class InputHandler:
|
|
|
133
146
|
self._last_user_text = text
|
|
134
147
|
self._turn_has_content = False
|
|
135
148
|
self._tui.request_render()
|
|
136
|
-
asyncio.ensure_future(self._invoke(self._expand_at_mentions(
|
|
149
|
+
asyncio.ensure_future(self._invoke(self._expand_at_mentions(model_text), images, audio, video))
|
|
137
150
|
|
|
138
151
|
def _on_followup(self, text: str) -> None:
|
|
139
|
-
images = self._extract_clipboard_images(text)
|
|
152
|
+
images, _ = self._extract_clipboard_images(text)
|
|
140
153
|
expanded = self._expand_pasted_texts(text)
|
|
141
154
|
asyncio.ensure_future(self._queue_followup(expanded, images, display_text=text))
|
|
142
155
|
|
|
@@ -209,6 +222,7 @@ class InputHandler:
|
|
|
209
222
|
self._last_user_text = ""
|
|
210
223
|
if last_text:
|
|
211
224
|
self._layout.input.set_text(last_text)
|
|
225
|
+
self._clear_clipboard_caches()
|
|
212
226
|
|
|
213
227
|
self._turn_has_content = False
|
|
214
228
|
# Stop the spinner immediately. The pre-stream branch cancels the invoke
|
|
@@ -220,6 +234,18 @@ class InputHandler:
|
|
|
220
234
|
asyncio.ensure_future(self._run_queued_next(queued))
|
|
221
235
|
self._tui.request_render()
|
|
222
236
|
|
|
237
|
+
def _clear_clipboard_caches(self) -> None:
|
|
238
|
+
"""Clear all clipboard media caches."""
|
|
239
|
+
self._clipboard_images.clear()
|
|
240
|
+
self._clipboard_image_notes.clear()
|
|
241
|
+
self._clipboard_image_counter = 0
|
|
242
|
+
self._clipboard_audio.clear()
|
|
243
|
+
self._clipboard_audio_counter = 0
|
|
244
|
+
self._clipboard_video.clear()
|
|
245
|
+
self._clipboard_video_counter = 0
|
|
246
|
+
self._pasted_texts.clear()
|
|
247
|
+
self._paste_counter = 0
|
|
248
|
+
|
|
223
249
|
async def _run_queued_next(self, texts: list[str]) -> None:
|
|
224
250
|
"""Submit queued input as the next task once the aborted task is idle.
|
|
225
251
|
|
|
@@ -551,7 +577,12 @@ class InputHandler:
|
|
|
551
577
|
result = re.sub(r"\[paste #\d+(?: \+\d+ lines| \d+ chars)\]", "", result)
|
|
552
578
|
return result.strip()
|
|
553
579
|
|
|
554
|
-
def _extract_clipboard_images(self, text: str) -> list[bytes]:
|
|
580
|
+
def _extract_clipboard_images(self, text: str) -> tuple[list[bytes], int]:
|
|
581
|
+
"""Extract image bytes from markers in text.
|
|
582
|
+
|
|
583
|
+
Returns (images, missing_count) where missing_count is the number of
|
|
584
|
+
persistent [image:uuid] markers whose media files could not be found.
|
|
585
|
+
"""
|
|
555
586
|
images: list[bytes] = []
|
|
556
587
|
seen: set[int] = set()
|
|
557
588
|
for m in re.finditer(r"\[image #(\d+)\]", text):
|
|
@@ -569,6 +600,7 @@ class InputHandler:
|
|
|
569
600
|
except OSError:
|
|
570
601
|
pass
|
|
571
602
|
# Also resolve persistent [image:{uuid}] markers from history
|
|
603
|
+
missing = 0
|
|
572
604
|
seen_uuids: set[str] = set()
|
|
573
605
|
for m in re.finditer(r"\[image:([^\]]+)\]", text):
|
|
574
606
|
uid = m.group(1)
|
|
@@ -580,11 +612,13 @@ class InputHandler:
|
|
|
580
612
|
try:
|
|
581
613
|
images.append(p.read_bytes())
|
|
582
614
|
except OSError:
|
|
583
|
-
|
|
615
|
+
missing += 1
|
|
616
|
+
else:
|
|
617
|
+
missing += 1
|
|
584
618
|
self._clipboard_images.clear()
|
|
585
619
|
self._clipboard_image_notes.clear()
|
|
586
620
|
self._clipboard_image_counter = 0
|
|
587
|
-
return images
|
|
621
|
+
return images, missing
|
|
588
622
|
|
|
589
623
|
def _extract_clipboard_image_contents(self, text: str) -> "list[Any]":
|
|
590
624
|
"""Like _extract_clipboard_images but returns ImageContent with dimension notes."""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tau-coding-agent
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.2.0
|
|
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.13.*
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
License-File: LICENSE
|
|
@@ -27,9 +27,15 @@ Requires-Dist: pathspec==1.1.1
|
|
|
27
27
|
Requires-Dist: gitpython==3.1.50
|
|
28
28
|
Dynamic: license-file
|
|
29
29
|
|
|
30
|
-
# Tau
|
|
30
|
+
# Tau (τ)
|
|
31
31
|
|
|
32
|
-
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.
|
|
32
|
+
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.
|
|
33
|
+
|
|
34
|
+
<p align="center">
|
|
35
|
+
<img src="assets/tui.png" alt="Tau TUI" width="700">
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
Start a conversation with the agent in the terminal.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
@@ -55,7 +61,7 @@ pip install -e .
|
|
|
55
61
|
tau
|
|
56
62
|
```
|
|
57
63
|
|
|
58
|
-
Authenticate with your LLM provider using `/login` or set environment variables (e.g., `
|
|
64
|
+
Authenticate with your LLM provider using `/login` or set environment variables (e.g., `NVIDIA_API_KEY`).
|
|
59
65
|
|
|
60
66
|
### Common Commands
|
|
61
67
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|