tau-coding-agent 0.6.7__tar.gz → 0.6.8__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.6.7/tau_coding_agent.egg-info → tau_coding_agent-0.6.8}/PKG-INFO +1 -1
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/pyproject.toml +1 -1
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/models/text.py +100 -14
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/providers/text.py +2 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/builtins.py +1 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/openai_responses.py +31 -33
- tau_coding_agent-0.6.8/tau/inference/api/text/xai_responses.py +31 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/__init__.py +6 -0
- tau_coding_agent-0.6.8/tau/inference/provider/oauth/xai_grok.py +286 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8/tau_coding_agent.egg-info}/PKG-INFO +1 -1
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau_coding_agent.egg-info/SOURCES.txt +2 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/LICENSE +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/MANIFEST.in +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/README.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/architecture.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/auth.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/cli-reference.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/creating-tools.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/development.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/docs.json +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/engine.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/extension-settings.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/extensions.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/http-proxy.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/index.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/inference-providers.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/inference.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/installation.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/keybindings.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/messages.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/project-context.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/project-structure.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/prompts.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/python-api.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/quickstart.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/sessions.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/settings.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/skills.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/themes.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/tools.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/tui.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/docs/usage.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/setup.cfg +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/agent/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/agent/embedded.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/agent/prompt/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/agent/prompt/builder.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/agent/prompt/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/agent/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/agent/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/auth/manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/auth/storage.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/auth/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/commands/clear.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/commands/compact.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/commands/reload.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/commands/session.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/ask_user/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/ask_user/component.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/ask_user/manifest.json +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/ask_user/schema.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/ask_user/tool.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/btw/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/footer/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/footer/git.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/footer/model.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/footer/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/header/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/loop/README.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/loop/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/loop/dispatch.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/loop/duration.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/loop/state.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/sandbox/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/sandbox/manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/sandbox/manifest.json +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/sandbox/sandbox_tool.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/context-builder.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/delegate.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/oracle.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/planner.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/researcher.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/reviewer.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/scout.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents/worker.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/agents.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/manifest.json +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/subagent_schema.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/subagent/subagent_tool.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/todo/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/todo/manifest.json +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/todo/todo_schema.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/todo/todo_tool.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/watch/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/engines/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/engines/base.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/engines/ddgs_engine.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/engines/exa_engine.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/engines/jina_engine.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/engines/tavily_engine.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/manifest.json +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/tools/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/tools/fetch.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/web/tools/search.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/workflow/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/workflow/agent_discovery.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/workflow/manifest.json +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/workflow/model.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/workflow/runner.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/workflow/skills/create-workflows/SKILL.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/extensions/workflow/store.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/models/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/models/audio.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/models/image.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/models/video.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/prompts/commit.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/prompts/docs.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/prompts/explain.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/prompts/fix.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/prompts/refactor.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/prompts/review.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/prompts/test.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/providers/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/providers/audio.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/providers/image.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/providers/video.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/skills/code-review/SKILL.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/skills/debug/SKILL.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/skills/git-commit/SKILL.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/ayu-dark.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/catppuccin.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/dark.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/dracula.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/everforest.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/gruvbox.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/horizon.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/kanagawa.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/light.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/material-ocean.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/monokai.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/night-owl.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/nord.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/one-dark.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/rose-pine.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/solarized-dark.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/themes/tokyo-night.yaml +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/edit.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/glob.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/grep.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/ls.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/read.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/terminal.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/builtins/tools/write.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/commands/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/commands/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/console/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/console/cli.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/console/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/console/commands/auth.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/console/commands/packages.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/console/commands/update.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/core/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/core/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/engine/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/engine/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/engine/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/extensions/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/extensions/api.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/extensions/context.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/extensions/loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/extensions/runtime.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/extensions/settings.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/engine.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/inference.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/runtime.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/session.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/tui.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/hooks/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/base.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/builtins.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/gemini_audio.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/openai_audio.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/sarvam_audio.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/audio/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/availability.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/base.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/builtins.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/gemini_image.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/openai_image.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/openrouter.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/image/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/anthropic_messages.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/anthropic_vertex.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/base.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/dialect.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/gemini_generate.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/github_copilot_chat.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/google_antigravity.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/google_vertex.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/mistral_chat.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/ollama_chat.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/openai_codex_responses.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/openai_completions.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/openai_vertex.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/base.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/builtins.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/fal_video.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/openrouter_video.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/video/zai_video.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/model/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/model/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/model/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/github_copilot.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/google_antigravity.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/openai_codex.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/pkce.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/oauth/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/provider/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/message/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/message/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/message/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/agent_hooks.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/app.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/appearance.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/auth.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/context.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/extensions.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/misc.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/model.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/commands/session.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/command_palette.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/config_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/extension_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/file_picker.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/layout.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/message_list.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/model_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/oauth_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/overlays.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/selector_controller.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/session_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/settings_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/theme_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/thinking_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/tree_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/trust_screen.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/components/voice_selector.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/input_handler.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/interactive/ui_context.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/print/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/rpc/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/rpc/mode.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/modes/rpc/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/packages/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/packages/manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/packages/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/packages/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/prompts/expand.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/prompts/loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/prompts/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/prompts/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/resources/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/resources/loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/resources/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/runtime/dependencies.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/runtime/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/runtime/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/session/branch_summarization.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/session/compaction.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/session/manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/session/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/session/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/settings/manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/settings/paths.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/settings/storage.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/settings/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/settings/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/skills/loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/skills/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/skills/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/telemetry/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/telemetry/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/telemetry/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/themes/loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/themes/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/themes/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tool/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tool/registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tool/render.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tool/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/trust/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/trust/manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/trust/types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/trust/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/ansi_bridge.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/autocomplete.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/backend.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/buffer.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/component.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/box.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/editor.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/image.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/select_list.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/simple_picker.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/spinner.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/text_input.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/components/widget_bridge.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/frame.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/geometry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/input.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/keybinding_hints.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/layout.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/markdown.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/palette.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/service.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/style.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/terminal.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/testing.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/text.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/theme.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widget.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/barchart.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/block.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/calendar.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/canvas.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/chart.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/clear.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/gauge.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/list.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/paragraph.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/scrollbar.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/sparkline.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/symbols.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/table.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/tui/widgets/tabs.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/utils/__init__.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/utils/format.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/utils/http_proxy.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/utils/image_processing.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/utils/secrets.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/utils/version_check.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau_coding_agent.egg-info/entry_points.txt +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau_coding_agent.egg-info/requires.txt +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau_coding_agent.egg-info/top_level.txt +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_agent_compaction.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_agent_hooks.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_agent_prompt.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_agent_types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_ansi.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_ansi_bridge_legacy_image.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_anthropic_tool_history.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_ask_user_extension.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_audio_transcription_apis.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_auth_command.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_auth_manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_auth_storage.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_autocomplete_modifiers.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_branch_navigation.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_branch_summarization.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_builtin_tools.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_builtin_watch.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_cli_inputs.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_cmd_copy.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_command_execution_policy.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_command_registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_compaction.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_component_buffer_bridge.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_diff.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_editor_protocol.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_engine_execution.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_engine_length_and_live_tools.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_engine_steering.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_engine_types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_escape_behavior.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_extension_api.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_extension_lifecycle.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_footer_model.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_footer_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_fuzzy.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_gemini_generate.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_google_antigravity.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_google_vertex.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_http_proxy.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_image_processing.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_inference_api_text_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_inference_dialect.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_inference_error_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_inference_types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_inference_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_keybindings.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_layout_render_cells.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_markdown.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_message_list_frozen.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_message_types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_message_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_model_availability.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_model_command.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_model_registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_model_selector_modal.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_model_types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_oauth_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_package_resources.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_packages_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_peer_extension.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_pkce.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_prompts_expand.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_prompts_loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_prompts_registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_provider_registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_resource_loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_rpc_mode.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_runtime_sdk.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_scrollback_raw_writes.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_scrollback_terminal.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_secrets.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_select_list_render_cells.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_selector_controller.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_session_manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_session_trust_persist.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_session_types.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_session_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_settings_manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_settings_paths.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_settings_storage.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_settings_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_skills_loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_skills_registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_strip_control_chars.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_subagent_context.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_telemetry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_text_input.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_text_input_render_cells.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_text_llm_invoke.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_text_llm_model_resolution.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_theme_loader.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_themes_registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_thinking_render.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tool_registry.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tool_render.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tree_branch_restore.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_trust_manager.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_trust_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_capabilities.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_child_rows.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_input.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_layout_sizing.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_public_api.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_renderer.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_select_list.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_theme.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_tui_utils.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_ui_context.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_utils_hashline.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tests/test_version_check.py +0 -0
- {tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/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.6.
|
|
3
|
+
Version: 0.6.8
|
|
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
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tau-coding-agent"
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.8"
|
|
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"
|
|
@@ -1008,6 +1008,16 @@ models = [
|
|
|
1008
1008
|
output=_TEXT,
|
|
1009
1009
|
),
|
|
1010
1010
|
# xAI
|
|
1011
|
+
Model(
|
|
1012
|
+
id="grok-4.5",
|
|
1013
|
+
name="Grok 4.5",
|
|
1014
|
+
provider="xai",
|
|
1015
|
+
cost=Cost(input=2.00, output=6.00),
|
|
1016
|
+
thinking=True,
|
|
1017
|
+
context_window=500_000,
|
|
1018
|
+
input=_TEXT_IMAGE,
|
|
1019
|
+
output=_TEXT,
|
|
1020
|
+
),
|
|
1011
1021
|
Model(
|
|
1012
1022
|
id="grok-4.3",
|
|
1013
1023
|
name="Grok 4.3",
|
|
@@ -1028,6 +1038,42 @@ models = [
|
|
|
1028
1038
|
input=_TEXT_IMAGE,
|
|
1029
1039
|
output=_TEXT,
|
|
1030
1040
|
),
|
|
1041
|
+
# xAI Grok CLI (OAuth — SuperGrok/X Premium+ subscription quota via
|
|
1042
|
+
# cli-chat-proxy.grok.com, the same backend the official Grok CLI uses).
|
|
1043
|
+
# grok-4.3 and grok-build are recognized by the proxy alongside grok-4.5
|
|
1044
|
+
# (confirmed live: HTTP 402 "need subscription" rather than 404/401 when
|
|
1045
|
+
# the account isn't entitled to them) — same models as the "xai" API-key
|
|
1046
|
+
# provider, just billed against subscription quota instead of per-token.
|
|
1047
|
+
Model(
|
|
1048
|
+
id="grok-4.5",
|
|
1049
|
+
name="Grok 4.5",
|
|
1050
|
+
provider="xai-grok",
|
|
1051
|
+
cost=Cost(),
|
|
1052
|
+
thinking=True,
|
|
1053
|
+
context_window=500_000,
|
|
1054
|
+
input=_TEXT_IMAGE,
|
|
1055
|
+
output=_TEXT,
|
|
1056
|
+
),
|
|
1057
|
+
Model(
|
|
1058
|
+
id="grok-4.3",
|
|
1059
|
+
name="Grok 4.3",
|
|
1060
|
+
provider="xai-grok",
|
|
1061
|
+
cost=Cost(),
|
|
1062
|
+
thinking=True,
|
|
1063
|
+
context_window=1_000_000,
|
|
1064
|
+
input=_TEXT_IMAGE,
|
|
1065
|
+
output=_TEXT,
|
|
1066
|
+
),
|
|
1067
|
+
Model(
|
|
1068
|
+
id="grok-build",
|
|
1069
|
+
name="Grok Build",
|
|
1070
|
+
provider="xai-grok",
|
|
1071
|
+
cost=Cost(),
|
|
1072
|
+
thinking=True,
|
|
1073
|
+
context_window=256_000,
|
|
1074
|
+
input=_TEXT_IMAGE,
|
|
1075
|
+
output=_TEXT,
|
|
1076
|
+
),
|
|
1031
1077
|
# AWS Bedrock
|
|
1032
1078
|
Model(
|
|
1033
1079
|
id="openai.gpt-oss-120b",
|
|
@@ -1552,7 +1598,8 @@ models = [
|
|
|
1552
1598
|
input=_TEXT,
|
|
1553
1599
|
output=_TEXT,
|
|
1554
1600
|
),
|
|
1555
|
-
# Mistral
|
|
1601
|
+
# Mistral. Magistral (reasoning-only line) is deprecated — Medium 3.5 and
|
|
1602
|
+
# Small 4 absorbed its reasoning mode behind the reasoning_effort param.
|
|
1556
1603
|
Model(
|
|
1557
1604
|
id="mistral-large-latest",
|
|
1558
1605
|
name="Mistral Large 3",
|
|
@@ -1566,8 +1613,9 @@ models = [
|
|
|
1566
1613
|
id="mistral-medium-latest",
|
|
1567
1614
|
name="Mistral Medium 3.5",
|
|
1568
1615
|
provider="mistral",
|
|
1569
|
-
cost=Cost(input=
|
|
1570
|
-
|
|
1616
|
+
cost=Cost(input=1.50, output=7.50),
|
|
1617
|
+
thinking=True,
|
|
1618
|
+
context_window=262_144,
|
|
1571
1619
|
input=_TEXT_IMAGE,
|
|
1572
1620
|
output=_TEXT,
|
|
1573
1621
|
),
|
|
@@ -1575,27 +1623,26 @@ models = [
|
|
|
1575
1623
|
id="mistral-small-latest",
|
|
1576
1624
|
name="Mistral Small 4",
|
|
1577
1625
|
provider="mistral",
|
|
1578
|
-
cost=Cost(input=0.
|
|
1626
|
+
cost=Cost(input=0.15, output=0.60),
|
|
1579
1627
|
thinking=True,
|
|
1580
|
-
context_window=
|
|
1628
|
+
context_window=262_144,
|
|
1581
1629
|
input=_TEXT_IMAGE,
|
|
1582
1630
|
output=_TEXT,
|
|
1583
1631
|
),
|
|
1584
1632
|
Model(
|
|
1585
|
-
id="
|
|
1586
|
-
name="
|
|
1633
|
+
id="devstral-medium-latest",
|
|
1634
|
+
name="Devstral 2",
|
|
1587
1635
|
provider="mistral",
|
|
1588
|
-
cost=Cost(input=
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
input=_TEXT_IMAGE,
|
|
1636
|
+
cost=Cost(input=0.40, output=2.0),
|
|
1637
|
+
context_window=262_144,
|
|
1638
|
+
input=_TEXT,
|
|
1592
1639
|
output=_TEXT,
|
|
1593
1640
|
),
|
|
1594
1641
|
Model(
|
|
1595
|
-
id="devstral-latest",
|
|
1596
|
-
name="Devstral 2",
|
|
1642
|
+
id="devstral-small-latest",
|
|
1643
|
+
name="Devstral Small 2",
|
|
1597
1644
|
provider="mistral",
|
|
1598
|
-
cost=Cost(input=0.
|
|
1645
|
+
cost=Cost(input=0.10, output=0.30),
|
|
1599
1646
|
context_window=262_144,
|
|
1600
1647
|
input=_TEXT,
|
|
1601
1648
|
output=_TEXT,
|
|
@@ -1609,6 +1656,45 @@ models = [
|
|
|
1609
1656
|
input=_TEXT,
|
|
1610
1657
|
output=_TEXT,
|
|
1611
1658
|
),
|
|
1659
|
+
# Labs (free/experimental) — code agent for Lean 4 formal proof engineering
|
|
1660
|
+
# and automated theorem proving, not a general chat model.
|
|
1661
|
+
Model(
|
|
1662
|
+
id="labs-leanstral-1-5",
|
|
1663
|
+
name="Leanstral 1.5",
|
|
1664
|
+
provider="mistral",
|
|
1665
|
+
cost=Cost(),
|
|
1666
|
+
thinking=True,
|
|
1667
|
+
context_window=256_000,
|
|
1668
|
+
input=_TEXT,
|
|
1669
|
+
output=_TEXT,
|
|
1670
|
+
),
|
|
1671
|
+
Model(
|
|
1672
|
+
id="ministral-3-14b-2512",
|
|
1673
|
+
name="Ministral 3 14B",
|
|
1674
|
+
provider="mistral",
|
|
1675
|
+
cost=Cost(input=0.20, output=0.20),
|
|
1676
|
+
context_window=128_000,
|
|
1677
|
+
input=_TEXT_IMAGE,
|
|
1678
|
+
output=_TEXT,
|
|
1679
|
+
),
|
|
1680
|
+
Model(
|
|
1681
|
+
id="ministral-3-8b-2512",
|
|
1682
|
+
name="Ministral 3 8B",
|
|
1683
|
+
provider="mistral",
|
|
1684
|
+
cost=Cost(input=0.15, output=0.15),
|
|
1685
|
+
context_window=128_000,
|
|
1686
|
+
input=_TEXT_IMAGE,
|
|
1687
|
+
output=_TEXT,
|
|
1688
|
+
),
|
|
1689
|
+
Model(
|
|
1690
|
+
id="ministral-3-3b-2512",
|
|
1691
|
+
name="Ministral 3 3B",
|
|
1692
|
+
provider="mistral",
|
|
1693
|
+
cost=Cost(input=0.10, output=0.10),
|
|
1694
|
+
context_window=128_000,
|
|
1695
|
+
input=_TEXT_IMAGE,
|
|
1696
|
+
output=_TEXT,
|
|
1697
|
+
),
|
|
1612
1698
|
# Ollama Cloud (catalog from models.dev / ollama-cloud — https://ollama.com/v1)
|
|
1613
1699
|
Model(
|
|
1614
1700
|
id="cogito-2.1:671b-cloud",
|
|
@@ -4,6 +4,7 @@ from tau.inference.provider.oauth.anthropic_claude_code import AnthropicClaudeCo
|
|
|
4
4
|
from tau.inference.provider.oauth.github_copilot import GitHubCopilotOAuthProvider
|
|
5
5
|
from tau.inference.provider.oauth.google_antigravity import GoogleAntigravityOAuthProvider
|
|
6
6
|
from tau.inference.provider.oauth.openai_codex import OpenAICodexOAuthProvider
|
|
7
|
+
from tau.inference.provider.oauth.xai_grok import XAIGrokOAuthProvider
|
|
7
8
|
from tau.inference.provider.types import APIProvider
|
|
8
9
|
from tau.inference.types import AuthType, LLMOptions
|
|
9
10
|
|
|
@@ -129,6 +130,7 @@ oauth_providers = [
|
|
|
129
130
|
AnthropicClaudeCodeOAuthProvider(),
|
|
130
131
|
GitHubCopilotOAuthProvider(),
|
|
131
132
|
GoogleAntigravityOAuthProvider(),
|
|
133
|
+
XAIGrokOAuthProvider(),
|
|
132
134
|
]
|
|
133
135
|
|
|
134
136
|
providers = api_providers + oauth_providers
|
|
@@ -22,6 +22,7 @@ LLM_APIS: list[tuple[str, str]] = [
|
|
|
22
22
|
("google_vertex", "tau.inference.api.text.google_vertex:GoogleVertexAPI"),
|
|
23
23
|
("anthropic_vertex", "tau.inference.api.text.anthropic_vertex:AnthropicVertexAPI"),
|
|
24
24
|
("openai_vertex", "tau.inference.api.text.openai_vertex:OpenAIVertexAPI"),
|
|
25
|
+
("xai", "tau.inference.api.text.xai_responses:XAIAPIResponses"),
|
|
25
26
|
]
|
|
26
27
|
|
|
27
28
|
# Backward-compat alias
|
{tau_coding_agent-0.6.7 → tau_coding_agent-0.6.8}/tau/inference/api/text/openai_responses.py
RENAMED
|
@@ -88,15 +88,9 @@ def _content_to_openai(content_items: list, supports_thinking: bool = True) -> l
|
|
|
88
88
|
else f"data:{mime or 'image/png'};base64,{b64}"
|
|
89
89
|
)
|
|
90
90
|
other_parts.append({"type": "input_image", "image_url": url})
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"type": "function_call",
|
|
95
|
-
"call_id": item.id,
|
|
96
|
-
"name": item.name,
|
|
97
|
-
"arguments": json.dumps(item.args),
|
|
98
|
-
}
|
|
99
|
-
)
|
|
91
|
+
# ToolCallContent is handled by _messages_to_input, which hoists
|
|
92
|
+
# it out to a top-level function_call item — see the comment
|
|
93
|
+
# on the supports_thinking=True branch below.
|
|
100
94
|
parts: list[dict[str, Any]] = []
|
|
101
95
|
if thinking_parts or text_parts:
|
|
102
96
|
merged = "\n".join(thinking_parts + text_parts)
|
|
@@ -104,6 +98,11 @@ def _content_to_openai(content_items: list, supports_thinking: bool = True) -> l
|
|
|
104
98
|
parts.extend(other_parts)
|
|
105
99
|
return parts
|
|
106
100
|
|
|
101
|
+
# ThinkingContent and ToolCallContent are intentionally not handled here:
|
|
102
|
+
# the Responses API has no "thinking" content-part type (reasoning is
|
|
103
|
+
# ephemeral and isn't replayed on later turns — see openai_codex_responses.py),
|
|
104
|
+
# and function_call is a top-level input item, not nested inside a
|
|
105
|
+
# message's content array. _messages_to_input hoists it out separately.
|
|
107
106
|
parts = []
|
|
108
107
|
for item in content_items:
|
|
109
108
|
match item:
|
|
@@ -117,23 +116,6 @@ def _content_to_openai(content_items: list, supports_thinking: bool = True) -> l
|
|
|
117
116
|
else f"data:{mime or 'image/png'};base64,{b64}"
|
|
118
117
|
)
|
|
119
118
|
parts.append({"type": "input_image", "image_url": url})
|
|
120
|
-
case ThinkingContent():
|
|
121
|
-
parts.append(
|
|
122
|
-
{
|
|
123
|
-
"type": "thinking",
|
|
124
|
-
"thinking": item.content,
|
|
125
|
-
"signature": item.signature,
|
|
126
|
-
}
|
|
127
|
-
)
|
|
128
|
-
case ToolCallContent():
|
|
129
|
-
parts.append(
|
|
130
|
-
{
|
|
131
|
-
"type": "function_call",
|
|
132
|
-
"call_id": item.id,
|
|
133
|
-
"name": item.name,
|
|
134
|
-
"arguments": json.dumps(item.args),
|
|
135
|
-
}
|
|
136
|
-
)
|
|
137
119
|
return parts
|
|
138
120
|
|
|
139
121
|
|
|
@@ -167,6 +149,19 @@ def _messages_to_input(
|
|
|
167
149
|
parts = _content_to_openai(msg.contents, supports_thinking=supports_thinking)
|
|
168
150
|
if parts:
|
|
169
151
|
input_items.append({"role": role, "content": parts})
|
|
152
|
+
# function_call is a top-level input item in the Responses API,
|
|
153
|
+
# not nested inside a message's content array. It must precede
|
|
154
|
+
# its matching function_call_output (emitted by the ToolMessage).
|
|
155
|
+
for content in msg.contents:
|
|
156
|
+
if isinstance(content, ToolCallContent):
|
|
157
|
+
input_items.append(
|
|
158
|
+
{
|
|
159
|
+
"type": "function_call",
|
|
160
|
+
"call_id": content.id,
|
|
161
|
+
"name": content.name,
|
|
162
|
+
"arguments": json.dumps(content.args),
|
|
163
|
+
}
|
|
164
|
+
)
|
|
170
165
|
|
|
171
166
|
return instructions, input_items
|
|
172
167
|
|
|
@@ -258,7 +253,12 @@ class OpenAIResponsesAPI(BaseAPI):
|
|
|
258
253
|
if modified is not None:
|
|
259
254
|
params = modified
|
|
260
255
|
|
|
261
|
-
|
|
256
|
+
# Keyed by the response item's own id (event.item_id in the arguments
|
|
257
|
+
# delta/done events), mapping to (call_id, name). item_id and call_id
|
|
258
|
+
# are two distinct identifiers — OpenAI's backend happens to make them
|
|
259
|
+
# equal, but other Responses-API-compatible backends (e.g. xAI's Grok
|
|
260
|
+
# CLI proxy) don't, so they must be tracked separately.
|
|
261
|
+
tool_calls: dict[str, tuple[str, str]] = {}
|
|
262
262
|
_input_tokens = 0
|
|
263
263
|
_output_tokens = 0
|
|
264
264
|
_cache_read_tokens = 0
|
|
@@ -279,7 +279,7 @@ class OpenAIResponsesAPI(BaseAPI):
|
|
|
279
279
|
elif item.type == "reasoning":
|
|
280
280
|
yield ThinkingStartEvent(thinking=None)
|
|
281
281
|
elif item.type == "function_call":
|
|
282
|
-
|
|
282
|
+
tool_calls[item.id] = (item.call_id, item.name) # type: ignore[union-attr,index]
|
|
283
283
|
yield ToolCallStartEvent(
|
|
284
284
|
tool_call=ToolCallContent(id=item.call_id, name=item.name) # type: ignore[union-attr,arg-type]
|
|
285
285
|
)
|
|
@@ -297,18 +297,16 @@ class OpenAIResponsesAPI(BaseAPI):
|
|
|
297
297
|
yield ThinkingEndEvent(thinking=ThinkingContent(content=event.text)) # type: ignore[union-attr]
|
|
298
298
|
|
|
299
299
|
elif etype == "response.function_call_arguments.delta":
|
|
300
|
-
call_id = event.item_id # type: ignore[union-attr]
|
|
300
|
+
call_id, _ = tool_calls.get(event.item_id, (event.item_id, "")) # type: ignore[union-attr]
|
|
301
301
|
yield ToolCallDeltaEvent(tool_call=ToolCallContent(id=call_id))
|
|
302
302
|
|
|
303
303
|
elif etype == "response.function_call_arguments.done":
|
|
304
|
-
call_id = event.item_id # type: ignore[union-attr]
|
|
304
|
+
call_id, name = tool_calls.get(event.item_id, (event.item_id, "")) # type: ignore[union-attr]
|
|
305
305
|
args_str = event.arguments.strip() # type: ignore[union-attr]
|
|
306
306
|
args = parse_tool_args(args_str)
|
|
307
307
|
|
|
308
308
|
yield ToolCallEndEvent(
|
|
309
|
-
tool_call=ToolCallContent(
|
|
310
|
-
id=call_id, name=tool_names.get(call_id, ""), args=args
|
|
311
|
-
)
|
|
309
|
+
tool_call=ToolCallContent(id=call_id, name=name, args=args)
|
|
312
310
|
)
|
|
313
311
|
|
|
314
312
|
elif etype == "response.done":
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""
|
|
2
|
+
xAI Grok CLI API — thin wrapper around the OpenAI Responses API adapter,
|
|
3
|
+
pointed at the Grok CLI's cli-chat-proxy.grok.com backend.
|
|
4
|
+
|
|
5
|
+
That proxy gatekeeps on client-identity headers (confirmed live: a request
|
|
6
|
+
without ``x-grok-client-version`` is rejected with HTTP 426 "outdated
|
|
7
|
+
version"), which the plain OpenAI Responses client doesn't send.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from tau.inference.api.text.openai_responses import OpenAIResponsesAPI
|
|
13
|
+
from tau.inference.types import LLMOptions
|
|
14
|
+
|
|
15
|
+
__all__ = ["XAIAPIResponses"]
|
|
16
|
+
|
|
17
|
+
_DEFAULT_BASE_URL = "https://cli-chat-proxy.grok.com/v1"
|
|
18
|
+
_CLIENT_VERSION = "0.2.93"
|
|
19
|
+
|
|
20
|
+
_GROK_CLI_HEADERS = {
|
|
21
|
+
"x-grok-client-identifier": "grok-cli",
|
|
22
|
+
"x-grok-client-version": _CLIENT_VERSION,
|
|
23
|
+
"x-xai-token-auth": "xai-grok-cli",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class XAIAPIResponses(OpenAIResponsesAPI):
|
|
28
|
+
def __init__(self, options: LLMOptions) -> None:
|
|
29
|
+
options.base_url = options.base_url or _DEFAULT_BASE_URL
|
|
30
|
+
options.headers = {**_GROK_CLI_HEADERS, **(options.headers or {})}
|
|
31
|
+
super().__init__(options)
|
|
@@ -17,6 +17,7 @@ if TYPE_CHECKING:
|
|
|
17
17
|
)
|
|
18
18
|
from tau.inference.provider.oauth.google_antigravity import GoogleAntigravityOAuthProvider
|
|
19
19
|
from tau.inference.provider.oauth.openai_codex import OpenAICodexOAuthProvider
|
|
20
|
+
from tau.inference.provider.oauth.xai_grok import XAIGrokOAuthProvider
|
|
20
21
|
|
|
21
22
|
__all__ = [
|
|
22
23
|
"OAuthProvider",
|
|
@@ -30,6 +31,7 @@ __all__ = [
|
|
|
30
31
|
"GitHubCopilotOAuthProvider",
|
|
31
32
|
"get_copilot_base_url",
|
|
32
33
|
"GoogleAntigravityOAuthProvider",
|
|
34
|
+
"XAIGrokOAuthProvider",
|
|
33
35
|
]
|
|
34
36
|
|
|
35
37
|
|
|
@@ -57,4 +59,8 @@ def __getattr__(name: str):
|
|
|
57
59
|
from tau.inference.provider.oauth.google_antigravity import GoogleAntigravityOAuthProvider
|
|
58
60
|
|
|
59
61
|
return GoogleAntigravityOAuthProvider
|
|
62
|
+
if name == "XAIGrokOAuthProvider":
|
|
63
|
+
from tau.inference.provider.oauth.xai_grok import XAIGrokOAuthProvider
|
|
64
|
+
|
|
65
|
+
return XAIGrokOAuthProvider
|
|
60
66
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"""
|
|
2
|
+
xAI Grok CLI OAuth flow — PKCE + local callback server.
|
|
3
|
+
|
|
4
|
+
The access token is used as a Bearer token for calls to
|
|
5
|
+
cli-chat-proxy.grok.com, the same proxy the official Grok CLI/Grok Build
|
|
6
|
+
uses to give SuperGrok/X Premium+ subscribers quota-based access to Grok
|
|
7
|
+
models without a separate pay-per-token API key.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import datetime as dt
|
|
14
|
+
import json
|
|
15
|
+
import secrets
|
|
16
|
+
import time
|
|
17
|
+
import urllib.error
|
|
18
|
+
import urllib.parse
|
|
19
|
+
import urllib.request
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
|
|
23
|
+
from tau.inference.provider.oauth.pkce import generate_pkce
|
|
24
|
+
from tau.inference.provider.oauth.types import (
|
|
25
|
+
AbortSignal,
|
|
26
|
+
OAuthAuthInfo,
|
|
27
|
+
OAuthCredential,
|
|
28
|
+
OAuthLoginCallbacks,
|
|
29
|
+
OAuthPrompt,
|
|
30
|
+
)
|
|
31
|
+
from tau.inference.provider.oauth.utils import (
|
|
32
|
+
await_oauth_code,
|
|
33
|
+
get_oauth_ssl_context,
|
|
34
|
+
parse_authorization_input,
|
|
35
|
+
start_oauth_callback_server,
|
|
36
|
+
)
|
|
37
|
+
from tau.inference.provider.types import OAuthProvider
|
|
38
|
+
|
|
39
|
+
__all__ = ["XAIGrokOAuthProvider"]
|
|
40
|
+
|
|
41
|
+
CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828"
|
|
42
|
+
ISSUER = "https://auth.x.ai"
|
|
43
|
+
AUTHORIZE_URL = f"{ISSUER}/oauth2/authorize"
|
|
44
|
+
TOKEN_URL = f"{ISSUER}/oauth2/token"
|
|
45
|
+
REVOKE_URL = f"{ISSUER}/oauth2/revoke"
|
|
46
|
+
USERINFO_URL = f"{ISSUER}/oauth2/userinfo"
|
|
47
|
+
CALLBACK_HOST = "127.0.0.1"
|
|
48
|
+
CALLBACK_PORT = 56121
|
|
49
|
+
CALLBACK_PATH = "/callback"
|
|
50
|
+
REDIRECT_URI = f"http://{CALLBACK_HOST}:{CALLBACK_PORT}{CALLBACK_PATH}"
|
|
51
|
+
SCOPES = "openid profile email offline_access grok-cli:access api:access"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _build_authorization_url(challenge: str, state: str, nonce: str) -> str:
|
|
55
|
+
"""Build the xAI authorization URL with PKCE and state parameters."""
|
|
56
|
+
params = {
|
|
57
|
+
"response_type": "code",
|
|
58
|
+
"client_id": CLIENT_ID,
|
|
59
|
+
"redirect_uri": REDIRECT_URI,
|
|
60
|
+
"scope": SCOPES,
|
|
61
|
+
"code_challenge": challenge,
|
|
62
|
+
"code_challenge_method": "S256",
|
|
63
|
+
"state": state,
|
|
64
|
+
"nonce": nonce,
|
|
65
|
+
"plan": "generic",
|
|
66
|
+
"referrer": "tau",
|
|
67
|
+
}
|
|
68
|
+
return f"{AUTHORIZE_URL}?{urllib.parse.urlencode(params)}"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _post_form(url: str, body: dict) -> dict:
|
|
72
|
+
"""POST a form-encoded request and return the parsed JSON response;
|
|
73
|
+
raise RuntimeError on HTTP errors.
|
|
74
|
+
"""
|
|
75
|
+
data = urllib.parse.urlencode(body).encode()
|
|
76
|
+
req = urllib.request.Request(
|
|
77
|
+
url,
|
|
78
|
+
data=data,
|
|
79
|
+
headers={"Content-Type": "application/x-www-form-urlencoded", "Accept": "application/json"},
|
|
80
|
+
method="POST",
|
|
81
|
+
)
|
|
82
|
+
try:
|
|
83
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=30) as resp:
|
|
84
|
+
return json.loads(resp.read())
|
|
85
|
+
except urllib.error.HTTPError as e:
|
|
86
|
+
body_text = e.read().decode(errors="replace")
|
|
87
|
+
raise RuntimeError(f"Request failed ({e.code}): {body_text}") from e
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _exchange_code(code: str, verifier: str) -> dict:
|
|
91
|
+
"""Exchange an authorization code for tokens using PKCE verification."""
|
|
92
|
+
return _post_form(
|
|
93
|
+
TOKEN_URL,
|
|
94
|
+
{
|
|
95
|
+
"grant_type": "authorization_code",
|
|
96
|
+
"client_id": CLIENT_ID,
|
|
97
|
+
"code": code,
|
|
98
|
+
"redirect_uri": REDIRECT_URI,
|
|
99
|
+
"code_verifier": verifier,
|
|
100
|
+
},
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _refresh_token_sync(refresh_token: str) -> dict:
|
|
105
|
+
"""Exchange a refresh token for a new access token via xAI's token endpoint."""
|
|
106
|
+
return _post_form(
|
|
107
|
+
TOKEN_URL,
|
|
108
|
+
{
|
|
109
|
+
"grant_type": "refresh_token",
|
|
110
|
+
"client_id": CLIENT_ID,
|
|
111
|
+
"refresh_token": refresh_token,
|
|
112
|
+
},
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _validate_token_sync(access_token: str) -> bool:
|
|
117
|
+
"""Check if the access token is valid by probing the userinfo endpoint."""
|
|
118
|
+
req = urllib.request.Request(
|
|
119
|
+
USERINFO_URL,
|
|
120
|
+
headers={"Authorization": f"Bearer {access_token}"},
|
|
121
|
+
method="GET",
|
|
122
|
+
)
|
|
123
|
+
try:
|
|
124
|
+
with urllib.request.urlopen(req, context=get_oauth_ssl_context(), timeout=10) as resp:
|
|
125
|
+
return resp.status == 200
|
|
126
|
+
except urllib.error.HTTPError as e:
|
|
127
|
+
return e.code not in (401, 403)
|
|
128
|
+
except Exception:
|
|
129
|
+
return False
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _revoke_token_sync(token: str) -> None:
|
|
133
|
+
"""Revoke a token at xAI's revocation endpoint (best-effort, silently ignores errors)."""
|
|
134
|
+
try:
|
|
135
|
+
_post_form(REVOKE_URL, {"token": token, "client_id": CLIENT_ID})
|
|
136
|
+
except Exception:
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _parse_token_response(data: dict) -> tuple[str, str, int]:
|
|
141
|
+
"""Extract (access_token, refresh_token, expires_ms) from an xAI token response."""
|
|
142
|
+
access = data.get("access_token")
|
|
143
|
+
refresh = data.get("refresh_token")
|
|
144
|
+
expires_in = data.get("expires_in")
|
|
145
|
+
if not access or not isinstance(expires_in, (int, float)):
|
|
146
|
+
raise ValueError(f"Token response missing fields: {data}")
|
|
147
|
+
if not refresh:
|
|
148
|
+
refresh = ""
|
|
149
|
+
expires_ms = int(time.time() * 1000) + int(expires_in) * 1000 - 5 * 60 * 1000
|
|
150
|
+
return access, refresh, expires_ms
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
_GROK_AUTH_FILE = Path.home() / ".grok" / "auth.json"
|
|
154
|
+
_GROK_AUTH_KEY = f"{ISSUER}::{CLIENT_ID}"
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def read_grok_file_credential() -> OAuthCredential | None:
|
|
158
|
+
"""Read the Grok CLI credential from ~/.grok/auth.json, if available.
|
|
159
|
+
|
|
160
|
+
The official Grok CLI stores tokens keyed by "<issuer>::<client_id>",
|
|
161
|
+
with the access token under "key" (a JWT) and expiry as an ISO 8601
|
|
162
|
+
timestamp under "expires_at" — distinct field names from every other
|
|
163
|
+
OAuth credential file this codebase reads.
|
|
164
|
+
"""
|
|
165
|
+
try:
|
|
166
|
+
data = json.loads(_GROK_AUTH_FILE.read_text(encoding="utf-8"))
|
|
167
|
+
entry = data.get(_GROK_AUTH_KEY)
|
|
168
|
+
if not isinstance(entry, dict):
|
|
169
|
+
return None
|
|
170
|
+
access = entry.get("key", "")
|
|
171
|
+
refresh = entry.get("refresh_token", "")
|
|
172
|
+
expires_at = entry.get("expires_at", "")
|
|
173
|
+
if not refresh:
|
|
174
|
+
return None
|
|
175
|
+
expires_ms = int(dt.datetime.fromisoformat(expires_at.replace("Z", "+00:00")).timestamp() * 1000)
|
|
176
|
+
return OAuthCredential(access=access, refresh=refresh, expires=expires_ms)
|
|
177
|
+
except Exception:
|
|
178
|
+
return None
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
async def login_xai_grok(callbacks: OAuthLoginCallbacks) -> OAuthCredential:
|
|
182
|
+
"""Run the full xAI Grok OAuth login flow and return a fresh OAuthCredential.
|
|
183
|
+
|
|
184
|
+
If a credential exists at ~/.grok/auth.json (written by the official
|
|
185
|
+
Grok CLI) it is returned directly without opening a browser.
|
|
186
|
+
"""
|
|
187
|
+
file_cred = read_grok_file_credential()
|
|
188
|
+
if file_cred is not None:
|
|
189
|
+
return file_cred
|
|
190
|
+
|
|
191
|
+
verifier, challenge = generate_pkce()
|
|
192
|
+
state = secrets.token_urlsafe(32)
|
|
193
|
+
nonce = secrets.token_urlsafe(16)
|
|
194
|
+
url = _build_authorization_url(challenge, state, nonce)
|
|
195
|
+
|
|
196
|
+
server, code_future = await start_oauth_callback_server(
|
|
197
|
+
CALLBACK_PATH, state, CALLBACK_HOST, CALLBACK_PORT
|
|
198
|
+
)
|
|
199
|
+
callbacks.on_auth(
|
|
200
|
+
OAuthAuthInfo(
|
|
201
|
+
url=url,
|
|
202
|
+
instructions=(
|
|
203
|
+
"Complete xAI login in your browser (requires a SuperGrok / "
|
|
204
|
+
"X Premium+ subscription). If the browser is on another "
|
|
205
|
+
"machine, paste the final redirect URL here."
|
|
206
|
+
),
|
|
207
|
+
)
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
code, recv_state = await await_oauth_code(code_future, state, server, callbacks)
|
|
211
|
+
|
|
212
|
+
if not code:
|
|
213
|
+
raw = await callbacks.on_prompt(
|
|
214
|
+
OAuthPrompt(
|
|
215
|
+
message="Paste the authorization code or full redirect URL:",
|
|
216
|
+
placeholder=REDIRECT_URI,
|
|
217
|
+
)
|
|
218
|
+
)
|
|
219
|
+
parsed_code, parsed_state = parse_authorization_input(raw)
|
|
220
|
+
if parsed_state and parsed_state != state:
|
|
221
|
+
raise ValueError("OAuth state mismatch")
|
|
222
|
+
code = parsed_code
|
|
223
|
+
recv_state = parsed_state or state
|
|
224
|
+
|
|
225
|
+
if not code:
|
|
226
|
+
raise ValueError("Missing authorization code")
|
|
227
|
+
if not recv_state:
|
|
228
|
+
raise ValueError("Missing OAuth state")
|
|
229
|
+
|
|
230
|
+
if callbacks.on_progress:
|
|
231
|
+
callbacks.on_progress("Exchanging authorization code for tokens...")
|
|
232
|
+
|
|
233
|
+
data = await asyncio.to_thread(_exchange_code, code, verifier)
|
|
234
|
+
access, refresh, expires_ms = _parse_token_response(data)
|
|
235
|
+
|
|
236
|
+
return OAuthCredential(access=access, refresh=refresh, expires=expires_ms)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
async def refresh_xai_grok_token(
|
|
240
|
+
credential: OAuthCredential, signal: AbortSignal | None = None
|
|
241
|
+
) -> OAuthCredential:
|
|
242
|
+
"""Exchange a refresh token for a new OAuthCredential; transparent to the streaming loop."""
|
|
243
|
+
data = await asyncio.to_thread(_refresh_token_sync, credential.refresh)
|
|
244
|
+
access, new_refresh, expires_ms = _parse_token_response(data)
|
|
245
|
+
refresh = new_refresh or credential.refresh
|
|
246
|
+
return OAuthCredential(access=access, refresh=refresh, expires=expires_ms)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
@dataclass
|
|
250
|
+
class XAIGrokOAuthProvider(OAuthProvider):
|
|
251
|
+
"""OAuthProvider implementation for xAI Grok CLI (SuperGrok / X Premium+) accounts."""
|
|
252
|
+
|
|
253
|
+
id: str = "xai-grok"
|
|
254
|
+
name: str = "xAI Grok CLI (SuperGrok Subscription)"
|
|
255
|
+
uses_callback_server: bool = True
|
|
256
|
+
|
|
257
|
+
async def login(self, callbacks: OAuthLoginCallbacks) -> OAuthCredential:
|
|
258
|
+
"""Initiate the OAuth login flow through xAI's authorization server."""
|
|
259
|
+
return await login_xai_grok(callbacks)
|
|
260
|
+
|
|
261
|
+
async def refresh_token(
|
|
262
|
+
self, credential: OAuthCredential, signal: AbortSignal | None = None
|
|
263
|
+
) -> OAuthCredential:
|
|
264
|
+
"""Obtain a new access token using the stored refresh token."""
|
|
265
|
+
return await refresh_xai_grok_token(credential, signal=signal)
|
|
266
|
+
|
|
267
|
+
async def logout(self, credential: OAuthCredential) -> None:
|
|
268
|
+
"""Revoke the refresh token at xAI's revocation endpoint (best-effort)."""
|
|
269
|
+
await asyncio.to_thread(_revoke_token_sync, credential.refresh)
|
|
270
|
+
|
|
271
|
+
@property
|
|
272
|
+
def api(self):
|
|
273
|
+
"""Return the API class that handles requests with this provider's tokens."""
|
|
274
|
+
from tau.inference.api.text.xai_responses import XAIAPIResponses
|
|
275
|
+
|
|
276
|
+
return XAIAPIResponses
|
|
277
|
+
|
|
278
|
+
async def validate(
|
|
279
|
+
self, credential: OAuthCredential, signal: AbortSignal | None = None
|
|
280
|
+
) -> bool:
|
|
281
|
+
"""Return True if the credential is unexpired and accepted by the API."""
|
|
282
|
+
if self.is_expired(credential):
|
|
283
|
+
return False
|
|
284
|
+
if signal and signal.is_set():
|
|
285
|
+
return False
|
|
286
|
+
return await asyncio.to_thread(_validate_token_sync, credential.access)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tau-coding-agent
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.8
|
|
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
|