tau-coding-agent 0.6.2__tar.gz → 0.6.4__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.2/tau_coding_agent.egg-info → tau_coding_agent-0.6.4}/PKG-INFO +28 -6
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/README.md +27 -5
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/pyproject.toml +1 -1
- tau_coding_agent-0.6.4/tau/agent/embedded.py +339 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/service.py +1 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/loop/README.md +45 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/loop/__init__.py +206 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/loop/dispatch.py +106 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/loop/duration.py +124 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/loop/state.py +188 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/worker.md +1 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/subagent_schema.py +0 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/subagent_tool.py +108 -163
- tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/__init__.py +282 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/agent_discovery.py +42 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/manifest.json +19 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/model.py +136 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/runner.py +288 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/skills/create-workflows/SKILL.md +144 -0
- tau_coding_agent-0.6.4/tau/builtins/extensions/workflow/store.py +110 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/cli.py +1 -3
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/loader.py +38 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/misc.py +1 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/layout.py +3 -3
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/ui_context.py +34 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/runtime/types.py +8 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/render.py +1 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/autocomplete.py +1 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/input.py +1 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4/tau_coding_agent.egg-info}/PKG-INFO +28 -6
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/SOURCES.txt +13 -1
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_text_llm_invoke.py +4 -0
- tau_coding_agent-0.6.2/tests/test_mcp_extension.py +0 -183
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/LICENSE +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/MANIFEST.in +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/architecture.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/auth.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/cli-reference.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/creating-tools.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/development.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/docs.json +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/engine.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/extension-settings.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/extensions.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/http-proxy.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/index.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/inference-providers.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/inference.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/installation.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/keybindings.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/messages.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/project-context.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/project-structure.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/prompts.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/python-api.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/quickstart.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/sessions.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/settings.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/skills.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/themes.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/tools.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/tui.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/docs/usage.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/setup.cfg +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/prompt/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/prompt/builder.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/prompt/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/agent/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/auth/manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/auth/storage.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/auth/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/clear.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/compact.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/reload.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/commands/session.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/component.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/manifest.json +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/schema.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/ask_user/tool.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/btw/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/git.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/model.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/footer/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/header/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/manifest.json +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/sandbox/sandbox_tool.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/context-builder.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/delegate.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/oracle.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/planner.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/researcher.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/reviewer.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents/scout.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/agents.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/subagent/manifest.json +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/manifest.json +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/todo_schema.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/todo/todo_tool.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/watch/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/base.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/ddgs_engine.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/exa_engine.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/jina_engine.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/engines/tavily_engine.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/manifest.json +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/tools/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/tools/fetch.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/extensions/web/tools/search.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/audio.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/image.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/text.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/models/video.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/commit.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/docs.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/explain.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/fix.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/refactor.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/review.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/prompts/test.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/audio.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/image.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/text.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/providers/video.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/code-review/SKILL.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/debug/SKILL.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/git-commit/SKILL.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/skill-creator/LICENSE.txt +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/skills/skill-creator/SKILL.md +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/ayu-dark.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/catppuccin.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/dark.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/dracula.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/everforest.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/gruvbox.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/horizon.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/kanagawa.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/light.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/material-ocean.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/monokai.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/night-owl.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/nord.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/one-dark.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/rose-pine.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/solarized-dark.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/themes/tokyo-night.yaml +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/edit.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/glob.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/grep.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/ls.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/read.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/terminal.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/builtins/tools/write.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/commands/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/commands/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/auth.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/packages.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/console/commands/update.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/core/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/core/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/engine/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/engine/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/engine/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/api.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/context.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/runtime.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/extensions/settings.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/engine.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/inference.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/runtime.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/session.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/tui.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/hooks/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/base.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/builtins.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/elevenlabs_audio.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/gemini_audio.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/openai_audio.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/sarvam_audio.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/audio/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/availability.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/base.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/builtins.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/gemini_image.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/openai_image.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/openrouter.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/image/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/anthropic_messages.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/anthropic_vertex.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/base.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/builtins.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/dialect.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/gemini_generate.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/github_copilot_chat.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/google_antigravity.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/google_vertex.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/mistral_chat.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/ollama_chat.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_codex_responses.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_completions.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_responses.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/openai_vertex.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/text/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/base.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/builtins.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/fal_video.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/openrouter_video.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/api/video/zai_video.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/model/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/model/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/model/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/anthropic_claude_code.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/github_copilot.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/google_antigravity.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/openai_codex.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/pkce.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/oauth/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/provider/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/inference/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/message/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/message/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/message/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/agent_hooks.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/app.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/appearance.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/auth.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/context.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/extensions.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/model.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/commands/session.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/command_palette.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/config_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/extension_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/file_picker.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/message_list.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/model_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/oauth_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/overlays.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/selector_controller.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/session_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/settings_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/theme_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/thinking_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/tree_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/trust_screen.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/components/voice_selector.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/interactive/input_handler.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/print/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/rpc/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/rpc/mode.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/modes/rpc/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/packages/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/expand.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/prompts/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/resources/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/resources/loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/resources/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/runtime/dependencies.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/runtime/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/branch_summarization.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/compaction.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/session/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/paths.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/storage.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/settings/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/skills/loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/skills/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/skills/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/telemetry/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/telemetry/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/telemetry/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/themes/loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/themes/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/themes/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tool/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/trust/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/ansi_bridge.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/backend.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/buffer.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/component.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/box.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/editor.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/image.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/select_list.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/simple_picker.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/spinner.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/text_input.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/components/widget_bridge.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/frame.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/geometry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/keybinding_hints.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/layout.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/markdown.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/palette.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/service.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/style.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/terminal.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/testing.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/text.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/theme.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widget.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/barchart.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/block.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/calendar.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/canvas.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/chart.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/clear.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/gauge.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/list.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/paragraph.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/scrollbar.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/sparkline.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/symbols.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/table.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/tui/widgets/tabs.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/__init__.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/format.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/http_proxy.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/image_processing.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/secrets.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau/utils/version_check.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/dependency_links.txt +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/entry_points.txt +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/requires.txt +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tau_coding_agent.egg-info/top_level.txt +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_compaction.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_hooks.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_prompt.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_agent_types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ansi.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ansi_bridge_legacy_image.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ask_user_extension.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_audio_transcription_apis.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_auth_command.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_auth_manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_auth_storage.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_autocomplete_modifiers.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_branch_navigation.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_branch_summarization.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_builtin_tools.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_builtin_watch.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_cli_inputs.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_command_execution_policy.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_command_registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_compaction.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_component_buffer_bridge.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_diff.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_editor_protocol.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_engine_execution.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_engine_steering.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_engine_types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_escape_behavior.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_extension_api.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_extension_lifecycle.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_footer_model.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_footer_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_fuzzy.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_gemini_generate.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_http_proxy.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_image_processing.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_api_text_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_dialect.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_error_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_inference_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_keybindings.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_layout_render_cells.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_markdown.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_message_list_frozen.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_message_types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_message_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_availability.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_command.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_selector_modal.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_model_types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_oauth_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_package_resources.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_packages_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_peer_extension.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_pkce.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_prompts_expand.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_prompts_loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_prompts_registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_provider_registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_resource_loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_rpc_mode.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_runtime_sdk.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_scrollback_raw_writes.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_scrollback_terminal.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_secrets.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_select_list_render_cells.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_selector_controller.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_trust_persist.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_types.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_session_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_paths.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_storage.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_settings_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_skills_loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_skills_registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_subagent_context.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_telemetry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_text_input.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_text_input_render_cells.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_theme_loader.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_themes_registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_thinking_render.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tool_registry.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tool_render.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_trust_manager.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_trust_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_capabilities.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_child_rows.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_input.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_layout_sizing.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_public_api.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_renderer.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_select_list.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_theme.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_tui_utils.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_ui_context.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_utils_hashline.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/tests/test_version_check.py +0 -0
- {tau_coding_agent-0.6.2 → tau_coding_agent-0.6.4}/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.4
|
|
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
|
|
@@ -36,11 +36,33 @@ Requires-Dist: ripgrep>=14.0.0; extra == "tools"
|
|
|
36
36
|
Requires-Dist: ast-grep-cli>=0.44.0; extra == "tools"
|
|
37
37
|
Dynamic: license-file
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
<div align="center">
|
|
40
|
+
|
|
41
|
+
<img src="assets/wordmark.svg" alt="Tau" height="160">
|
|
42
|
+
<br>
|
|
43
|
+
<a href="https://pypi.org/project/tau-coding-agent/">
|
|
44
|
+
<img src="https://img.shields.io/pypi/v/tau-coding-agent.svg" alt="PyPI version">
|
|
45
|
+
</a>
|
|
46
|
+
<a href="https://pepy.tech/project/tau-coding-agent">
|
|
47
|
+
<img src="https://static.pepy.tech/badge/tau-coding-agent" alt="PyPI Downloads">
|
|
48
|
+
</a>
|
|
49
|
+
<a href="https://github.com/Jeomon/Tau/blob/main/LICENSE">
|
|
50
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="License">
|
|
51
|
+
</a>
|
|
52
|
+
<img src="https://img.shields.io/badge/python-3.12%2B-blue" alt="Python">
|
|
53
|
+
<br>
|
|
54
|
+
<a href="https://github.com/Jeomon/Tau/actions/workflows/ci.yml">
|
|
55
|
+
<img src="https://github.com/Jeomon/Tau/actions/workflows/ci.yml/badge.svg" alt="CI status">
|
|
56
|
+
</a>
|
|
57
|
+
<a href="https://github.com/Jeomon/Tau/commits/main">
|
|
58
|
+
<img src="https://img.shields.io/github/last-commit/Jeomon/Tau.svg" alt="Last commit">
|
|
59
|
+
</a>
|
|
60
|
+
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<br>
|
|
64
|
+
|
|
65
|
+
Tau is a Python agent framework and coding agent, inspired by [Pi](https://github.com/earendil-works/pi). It combines an interactive terminal UI, multiple model providers, persistent sessions, tool execution, and an extension system in one package.
|
|
44
66
|
|
|
45
67
|
<p align="center">
|
|
46
68
|
<img src="assets/tui.jpeg" alt="Tau interactive terminal interface" width="700">
|
|
@@ -1,8 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="assets/wordmark.svg" alt="Tau" height="160">
|
|
4
|
+
<br>
|
|
5
|
+
<a href="https://pypi.org/project/tau-coding-agent/">
|
|
6
|
+
<img src="https://img.shields.io/pypi/v/tau-coding-agent.svg" alt="PyPI version">
|
|
7
|
+
</a>
|
|
8
|
+
<a href="https://pepy.tech/project/tau-coding-agent">
|
|
9
|
+
<img src="https://static.pepy.tech/badge/tau-coding-agent" alt="PyPI Downloads">
|
|
10
|
+
</a>
|
|
11
|
+
<a href="https://github.com/Jeomon/Tau/blob/main/LICENSE">
|
|
12
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="License">
|
|
13
|
+
</a>
|
|
14
|
+
<img src="https://img.shields.io/badge/python-3.12%2B-blue" alt="Python">
|
|
15
|
+
<br>
|
|
16
|
+
<a href="https://github.com/Jeomon/Tau/actions/workflows/ci.yml">
|
|
17
|
+
<img src="https://github.com/Jeomon/Tau/actions/workflows/ci.yml/badge.svg" alt="CI status">
|
|
18
|
+
</a>
|
|
19
|
+
<a href="https://github.com/Jeomon/Tau/commits/main">
|
|
20
|
+
<img src="https://img.shields.io/github/last-commit/Jeomon/Tau.svg" alt="Last commit">
|
|
21
|
+
</a>
|
|
22
|
+
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<br>
|
|
26
|
+
|
|
27
|
+
Tau is a Python agent framework and coding agent, inspired by [Pi](https://github.com/earendil-works/pi). It combines an interactive terminal UI, multiple model providers, persistent sessions, tool execution, and an extension system in one package.
|
|
6
28
|
|
|
7
29
|
<p align="center">
|
|
8
30
|
<img src="assets/tui.jpeg" alt="Tau interactive terminal interface" width="700">
|
|
@@ -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.4"
|
|
8
8
|
description = "A self-extensible agent CLI with terminal UI, multi-provider LLM support, session management with branching, and a plugin system for tools and commands"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"""In-process agent execution — run one isolated agent turn directly in this
|
|
2
|
+
interpreter via Engine/LLM, instead of spawning a separate `tau` OS process.
|
|
3
|
+
|
|
4
|
+
Shared by the `subagent` tool and the `/workflow` extension: both need to run
|
|
5
|
+
an isolated agent turn given a task, an agent's tools/system prompt, and
|
|
6
|
+
(optionally) prior conversation history to resume read-only.
|
|
7
|
+
|
|
8
|
+
Deliberately narrow and self-contained: builds an Engine, an LLM, fresh tool
|
|
9
|
+
instances, and a Hooks() dispatcher directly — bypassing Runtime.create()'s
|
|
10
|
+
full bootstrap (resource discovery, extension loading, global registry
|
|
11
|
+
reload) entirely. That bootstrap mutates process-wide singletons
|
|
12
|
+
(skill_registry, prompt_registry, theme_registry) and re-fires session_start
|
|
13
|
+
on every extension, which is unsafe to run reentrantly from inside an
|
|
14
|
+
already-running session. Engine itself is explicitly documented as knowing
|
|
15
|
+
"nothing about sessions, extensions, or compaction" — exactly the isolation
|
|
16
|
+
this needs.
|
|
17
|
+
|
|
18
|
+
Trade-off: an embedded agent only has the base builtin coding tools
|
|
19
|
+
(read/write/edit/terminal/glob/grep/ls) plus whatever its own `tools:`
|
|
20
|
+
frontmatter names from that set — extension-contributed tools (web_search,
|
|
21
|
+
web_fetch, subagent, todo, ...) are not available, since loading them would
|
|
22
|
+
mean loading extensions. None of the shipped subagent presets need more than
|
|
23
|
+
the base set.
|
|
24
|
+
|
|
25
|
+
Fork context (resuming a parent session's history read-only) is safe for the
|
|
26
|
+
same reason SessionManager itself is safe to use here even though
|
|
27
|
+
Runtime.create() isn't: SessionManager is instance-scoped, not a mutated
|
|
28
|
+
process-wide singleton. Constructing one with persist=False and calling only
|
|
29
|
+
its read methods (build_session_context) never touches shared state and
|
|
30
|
+
never writes back — see load_fork_context().
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import asyncio
|
|
36
|
+
import contextlib
|
|
37
|
+
import json
|
|
38
|
+
from collections.abc import Callable
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
from typing import Any
|
|
41
|
+
|
|
42
|
+
from pydantic import BaseModel, create_model
|
|
43
|
+
|
|
44
|
+
from tau.builtins.tools import TOOLS
|
|
45
|
+
from tau.engine import Engine, EngineContext
|
|
46
|
+
from tau.hooks.engine import MessageEndEvent, ToolExecutionStartEvent
|
|
47
|
+
from tau.hooks.service import Hooks
|
|
48
|
+
from tau.inference import StopReason
|
|
49
|
+
from tau.inference.api.text.service import TextLLM
|
|
50
|
+
from tau.message.types import (
|
|
51
|
+
AssistantMessage,
|
|
52
|
+
LLMMessage,
|
|
53
|
+
Role,
|
|
54
|
+
ToolCallContent,
|
|
55
|
+
ToolMessage,
|
|
56
|
+
UserMessage,
|
|
57
|
+
)
|
|
58
|
+
from tau.tool.types import Tool, ToolContext, ToolInvocation, ToolKind, ToolResult
|
|
59
|
+
|
|
60
|
+
TASK_TIMEOUT_S = 300
|
|
61
|
+
_ABORT_GRACE_S = 15
|
|
62
|
+
_TOOL_ARG_KEYS = ("cmd", "pattern", "path")
|
|
63
|
+
_JSON_SCHEMA_TYPES: dict[str, type] = {
|
|
64
|
+
"string": str,
|
|
65
|
+
"integer": int,
|
|
66
|
+
"number": float,
|
|
67
|
+
"boolean": bool,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Same fallback Runtime.create() uses when no model is configured — matched
|
|
71
|
+
# here so an embedded agent behaves the same as a real session would.
|
|
72
|
+
_DEFAULT_MODEL = "claude-sonnet-4-6"
|
|
73
|
+
_DEFAULT_PROVIDER = "anthropic"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def load_fork_context(cwd: Path, session_id: str, session_dir: Path) -> list[LLMMessage]:
|
|
77
|
+
"""Read a parent session's current branch as read-only LLM message history.
|
|
78
|
+
|
|
79
|
+
Constructs a non-persisting SessionManager purely to read
|
|
80
|
+
build_session_context() — never calls enable_persist() or any write
|
|
81
|
+
method, so this cannot affect the parent session on disk. Filters out
|
|
82
|
+
session-only message types (compaction/branch-summary markers, custom
|
|
83
|
+
messages) that the LLM API layer doesn't understand, and drops any
|
|
84
|
+
SystemMessage since the embedded agent supplies its own system_prompt
|
|
85
|
+
separately.
|
|
86
|
+
"""
|
|
87
|
+
from tau.session.manager import SessionManager
|
|
88
|
+
|
|
89
|
+
matches = list(session_dir.rglob(f"*{session_id}*.jsonl"))
|
|
90
|
+
if not matches:
|
|
91
|
+
return []
|
|
92
|
+
matches.sort(key=lambda p: p.stat().st_mtime, reverse=True)
|
|
93
|
+
session_file = matches[0].resolve()
|
|
94
|
+
|
|
95
|
+
sm = SessionManager(cwd, session_dir=session_dir, session_file=session_file, persist=False)
|
|
96
|
+
context = sm.build_session_context()
|
|
97
|
+
keep = (UserMessage, AssistantMessage, ToolMessage)
|
|
98
|
+
return [m for m in context.messages if isinstance(m, keep)]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _tool_preview(name: str, args: dict[str, Any]) -> str:
|
|
102
|
+
"""One-line summary of a tool call, e.g. 'terminal: curl -s https://...'."""
|
|
103
|
+
for key in _TOOL_ARG_KEYS:
|
|
104
|
+
value = args.get(key)
|
|
105
|
+
if isinstance(value, str) and value:
|
|
106
|
+
return f"{name}: {value}"[:100]
|
|
107
|
+
for value in args.values():
|
|
108
|
+
if isinstance(value, str) and value:
|
|
109
|
+
return f"{name}: {value}"[:100]
|
|
110
|
+
return name
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _build_tools(tool_names: list[str] | None, extra_tools: list[Tool] | None = None) -> list[Tool]:
|
|
114
|
+
"""Fresh instances of the requested base tools, plus any matching extra
|
|
115
|
+
tools the caller already has instances of (e.g. web_search/web_fetch
|
|
116
|
+
borrowed from the parent session's own tool registry — see
|
|
117
|
+
subagent_tool.py's _extension_tools()). The full base set is used when
|
|
118
|
+
tool_names is unset; extra_tools are only included if explicitly named.
|
|
119
|
+
"""
|
|
120
|
+
selected = TOOLS if not tool_names else [t for t in TOOLS if t.name in set(tool_names)]
|
|
121
|
+
tools = [t.__class__() for t in selected] # type: ignore[call-arg]
|
|
122
|
+
if tool_names and extra_tools:
|
|
123
|
+
wanted = set(tool_names)
|
|
124
|
+
tools += [t for t in extra_tools if t.name in wanted]
|
|
125
|
+
return tools
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _json_schema_field_type(spec: Any) -> Any:
|
|
129
|
+
"""Map a flat JSON Schema field spec to a Python type. Supports string,
|
|
130
|
+
integer, number, boolean, and array-of-those — enough for typical
|
|
131
|
+
result shapes. Anything else (nested object, unset type) falls back to
|
|
132
|
+
Any, which still validates but doesn't constrain."""
|
|
133
|
+
if not isinstance(spec, dict):
|
|
134
|
+
return Any
|
|
135
|
+
t = spec.get("type")
|
|
136
|
+
if t == "array":
|
|
137
|
+
item_type = _json_schema_field_type(spec.get("items"))
|
|
138
|
+
return list[item_type] # type: ignore[valid-type]
|
|
139
|
+
if not isinstance(t, str):
|
|
140
|
+
return Any
|
|
141
|
+
return _JSON_SCHEMA_TYPES.get(t, Any)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def build_schema_model(name: str, schema: dict[str, Any]) -> type[BaseModel]:
|
|
145
|
+
"""Build a Pydantic model from a flat JSON-Schema-shaped dict:
|
|
146
|
+
``{"type": "object", "properties": {...}, "required": [...]}``.
|
|
147
|
+
"""
|
|
148
|
+
properties = schema.get("properties")
|
|
149
|
+
if not isinstance(properties, dict) or not properties:
|
|
150
|
+
raise ValueError("schema must have a non-empty 'properties' mapping")
|
|
151
|
+
required = set(schema.get("required") or [])
|
|
152
|
+
fields: dict[str, Any] = {}
|
|
153
|
+
for field_name, spec in properties.items():
|
|
154
|
+
py_type = _json_schema_field_type(spec)
|
|
155
|
+
fields[field_name] = (py_type, ...) if field_name in required else (py_type | None, None)
|
|
156
|
+
return create_model(name, **fields) # type: ignore[call-overload,no-any-return]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class StructuredOutputTool(Tool):
|
|
160
|
+
"""Terminating tool: one call ends the task, its (schema-validated) args
|
|
161
|
+
become the task's output. Mirrors pi-dynamic-workflows' structured_output
|
|
162
|
+
tool, built on Engine's native ToolResult.terminate mechanism.
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
def __init__(self, schema_model: type[BaseModel], capture: dict[str, Any]) -> None:
|
|
166
|
+
self._capture = capture
|
|
167
|
+
super().__init__(
|
|
168
|
+
name="structured_output",
|
|
169
|
+
description=(
|
|
170
|
+
"Submit the final structured result for this task. Call this exactly once, "
|
|
171
|
+
"as your last action, with fields matching the required shape. Do not also "
|
|
172
|
+
"write a prose final answer — this call ends the task immediately."
|
|
173
|
+
),
|
|
174
|
+
schema=schema_model,
|
|
175
|
+
kind=ToolKind.Read,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
async def execute(
|
|
179
|
+
self,
|
|
180
|
+
invocation: ToolInvocation,
|
|
181
|
+
tool_execution_update_callback: Any = None,
|
|
182
|
+
signal: Any = None,
|
|
183
|
+
context: ToolContext | None = None,
|
|
184
|
+
) -> ToolResult:
|
|
185
|
+
self._capture["called"] = True
|
|
186
|
+
self._capture["value"] = invocation.params
|
|
187
|
+
content = json.dumps(invocation.params)
|
|
188
|
+
return ToolResult(
|
|
189
|
+
id=invocation.id, content=content, terminate=True, terminate_message=content
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
async def run_embedded_agent(
|
|
194
|
+
*,
|
|
195
|
+
cwd: Path,
|
|
196
|
+
model_id: str | None,
|
|
197
|
+
provider: str | None,
|
|
198
|
+
system_prompt: str,
|
|
199
|
+
tool_names: list[str] | None,
|
|
200
|
+
task_text: str,
|
|
201
|
+
schema: dict[str, Any] | None = None,
|
|
202
|
+
initial_messages: list[LLMMessage] | None = None,
|
|
203
|
+
abort_signal: asyncio.Event | None = None,
|
|
204
|
+
extra_tools: list[Tool] | None = None,
|
|
205
|
+
on_tool_start: Callable[[str], None] | None = None,
|
|
206
|
+
on_event: Callable[[Any], None] | None = None,
|
|
207
|
+
timeout_s: float = TASK_TIMEOUT_S,
|
|
208
|
+
) -> tuple[bool, str, dict[str, Any]]:
|
|
209
|
+
"""Run one agent turn to completion, bounded by ``timeout_s``.
|
|
210
|
+
|
|
211
|
+
Returns (ok, output_text, usage). Fully self-contained: its own LLM
|
|
212
|
+
instance, its own Hooks(), its own fresh tools — no session persistence,
|
|
213
|
+
no shared registries, no OS subprocess.
|
|
214
|
+
|
|
215
|
+
``extra_tools``, if given, are pre-built Tool instances made available
|
|
216
|
+
when ``tool_names`` explicitly names them — for tools this module can't
|
|
217
|
+
construct itself (e.g. web_search/web_fetch need a configured search
|
|
218
|
+
engine). Only used when named; the base coding toolset never needs this.
|
|
219
|
+
|
|
220
|
+
``initial_messages``, if given, is prepended to the conversation before
|
|
221
|
+
the task message — use load_fork_context() to build this from a parent
|
|
222
|
+
session's history for a read-only "fork" context.
|
|
223
|
+
|
|
224
|
+
``abort_signal``, if given, is used as the engine's own AbortSignal
|
|
225
|
+
instead of a fresh one — set it externally (e.g. on parent-tool-call
|
|
226
|
+
cancellation) to abort the run cooperatively. The timeout still applies
|
|
227
|
+
on top of this and sets the same signal when it fires.
|
|
228
|
+
|
|
229
|
+
When ``schema`` is set (a flat JSON-Schema-shaped dict), the task gets an
|
|
230
|
+
extra ``structured_output`` tool and must call it exactly once to finish;
|
|
231
|
+
its validated args (as JSON text) become the output. A task that finishes
|
|
232
|
+
without calling it fails — this is meant for tasks whose output feeds a
|
|
233
|
+
later placeholder substitution or handoff, where prose formatting habits
|
|
234
|
+
(code fences, commentary) would otherwise break parsing.
|
|
235
|
+
|
|
236
|
+
``on_tool_start`` gets a one-line preview string per tool call, for
|
|
237
|
+
simple progress logging. ``on_event`` (if set) gets every raw hook event
|
|
238
|
+
object emitted during the run, for callers that want to build a richer
|
|
239
|
+
live view (e.g. per-tool-call result previews).
|
|
240
|
+
|
|
241
|
+
On timeout, aborts cooperatively via the engine's own AbortSignal (the
|
|
242
|
+
same mechanism Esc-cancel uses in the interactive TUI) and gives it
|
|
243
|
+
``_ABORT_GRACE_S`` to unwind cleanly before falling back to raw task
|
|
244
|
+
cancellation.
|
|
245
|
+
"""
|
|
246
|
+
usage: dict[str, Any] = {"turns": 0, "input_tokens": 0, "output_tokens": 0, "cost": 0.0}
|
|
247
|
+
final_text = ""
|
|
248
|
+
error_message: str | None = None
|
|
249
|
+
failed = False
|
|
250
|
+
|
|
251
|
+
try:
|
|
252
|
+
llm = TextLLM(model_id=model_id or _DEFAULT_MODEL, provider=provider or _DEFAULT_PROVIDER)
|
|
253
|
+
except Exception as e:
|
|
254
|
+
return False, f"Failed to resolve model: {e}", usage
|
|
255
|
+
|
|
256
|
+
tools = _build_tools(tool_names, extra_tools)
|
|
257
|
+
structured_capture: dict[str, Any] | None = None
|
|
258
|
+
if schema is not None:
|
|
259
|
+
try:
|
|
260
|
+
schema_model = build_schema_model("StructuredOutput", schema)
|
|
261
|
+
except Exception as e:
|
|
262
|
+
return False, f"Invalid task schema: {e}", usage
|
|
263
|
+
structured_capture = {"called": False, "value": None}
|
|
264
|
+
tools = [*tools, StructuredOutputTool(schema_model, structured_capture)]
|
|
265
|
+
system_prompt = (
|
|
266
|
+
system_prompt
|
|
267
|
+
+ "\n\nFinal output contract: your last action must be a structured_output "
|
|
268
|
+
"tool call. Do not write a prose final answer instead."
|
|
269
|
+
)
|
|
270
|
+
known_tool_names = {t.name for t in tools}
|
|
271
|
+
hooks = Hooks()
|
|
272
|
+
|
|
273
|
+
def _on_message_end(event: MessageEndEvent) -> None:
|
|
274
|
+
nonlocal final_text, error_message, failed
|
|
275
|
+
message = event.message
|
|
276
|
+
if getattr(message, "role", None) != Role.ASSISTANT:
|
|
277
|
+
return
|
|
278
|
+
usage["turns"] += 1
|
|
279
|
+
usage["input_tokens"] += message.usage.input_tokens
|
|
280
|
+
usage["output_tokens"] += message.usage.output_tokens
|
|
281
|
+
usage["cost"] += message.usage.cost.total
|
|
282
|
+
if message.stop_reason in (StopReason.Error, StopReason.Abort):
|
|
283
|
+
failed = True
|
|
284
|
+
if message.error:
|
|
285
|
+
error_message = message.error
|
|
286
|
+
failed = True
|
|
287
|
+
text = message.text_content()
|
|
288
|
+
if text:
|
|
289
|
+
final_text = text
|
|
290
|
+
|
|
291
|
+
# ToolExecutionStartEvent never fires for a tool name the model
|
|
292
|
+
# invented (Engine._execute returns an error before emitting it), so
|
|
293
|
+
# without this a model that hallucinates a tool and won't self-correct
|
|
294
|
+
# would burn the whole timeout in visible silence — indistinguishable
|
|
295
|
+
# from a genuine hang. Surface it explicitly instead.
|
|
296
|
+
if on_tool_start is not None:
|
|
297
|
+
for content in message.contents:
|
|
298
|
+
if isinstance(content, ToolCallContent) and content.name not in known_tool_names:
|
|
299
|
+
on_tool_start(f"✗ unknown tool requested: {content.name!r} (ignored)")
|
|
300
|
+
|
|
301
|
+
def _on_tool_start(event: ToolExecutionStartEvent) -> None:
|
|
302
|
+
if on_tool_start is not None:
|
|
303
|
+
on_tool_start(_tool_preview(event.tool_call.name, event.tool_call.args))
|
|
304
|
+
|
|
305
|
+
hooks.register("message_end", _on_message_end)
|
|
306
|
+
hooks.register("tool_execution_start", _on_tool_start)
|
|
307
|
+
if on_event is not None:
|
|
308
|
+
hooks.subscribe(on_event)
|
|
309
|
+
|
|
310
|
+
engine = Engine(cwd=cwd, llm=llm, tools=tools, system_prompt=system_prompt, hooks=hooks)
|
|
311
|
+
task_message = UserMessage.from_text(f"Task: {task_text}")
|
|
312
|
+
messages: list[LLMMessage] = [*(initial_messages or []), task_message]
|
|
313
|
+
ctx = EngineContext(system_prompt=system_prompt, messages=messages, tools=tools)
|
|
314
|
+
signal = abort_signal if abort_signal is not None else asyncio.Event()
|
|
315
|
+
run_task = asyncio.ensure_future(engine.run(ctx, signal=signal))
|
|
316
|
+
|
|
317
|
+
try:
|
|
318
|
+
await asyncio.wait_for(asyncio.shield(run_task), timeout=timeout_s)
|
|
319
|
+
except TimeoutError:
|
|
320
|
+
signal.set()
|
|
321
|
+
try:
|
|
322
|
+
await asyncio.wait_for(run_task, timeout=_ABORT_GRACE_S)
|
|
323
|
+
except TimeoutError:
|
|
324
|
+
run_task.cancel()
|
|
325
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
326
|
+
await run_task
|
|
327
|
+
return False, f"Task timed out after {timeout_s:.0f}s", usage
|
|
328
|
+
except Exception as e:
|
|
329
|
+
return False, f"Subagent failed: {e}", usage
|
|
330
|
+
|
|
331
|
+
if failed:
|
|
332
|
+
return False, error_message or final_text or "(no output)", usage
|
|
333
|
+
|
|
334
|
+
if structured_capture is not None:
|
|
335
|
+
if not structured_capture["called"]:
|
|
336
|
+
return False, "Task required structured output but finished without calling it", usage
|
|
337
|
+
return True, json.dumps(structured_capture["value"]), usage
|
|
338
|
+
|
|
339
|
+
return True, final_text or "(no output)", usage
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# loop
|
|
2
|
+
|
|
3
|
+
A single `/loop` command for scheduling recurring prompts in Tau.
|
|
4
|
+
|
|
5
|
+
Runtime design (interval parsing, id-derived jitter, 3-day auto-expiry,
|
|
6
|
+
idle-gated dispatch, atomic disk persistence) modeled on
|
|
7
|
+
[pi-scheduler](https://github.com/manojlds/pi-scheduler), trimmed to exactly
|
|
8
|
+
what's needed here: one command, no one-time reminders, no LLM-callable tool.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/loop open the interactive loop manager
|
|
14
|
+
/loop <period> <task> create directly, e.g. /loop 5m water the plants
|
|
15
|
+
/loop <task> every <period> create directly, e.g. /loop water the plants every 2h
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Bare `/loop` opens a picker listing every loop as `■/☐ id every <period> — <task>`
|
|
19
|
+
(■ = enabled, ☐ = disabled).
|
|
20
|
+
Selecting one opens an action menu: **Enable/Disable**, **Edit instruction**
|
|
21
|
+
(multi-line editor, prefilled), **Edit duration** (reparsed with the same
|
|
22
|
+
interval syntax), **Delete**, or **Back**. The list also has **+ New loop**
|
|
23
|
+
and **Clear all loops** entries. In headless mode (no TUI), bare `/loop`
|
|
24
|
+
just prints the current list as text since there's no picker to drive.
|
|
25
|
+
|
|
26
|
+
Intervals accept short (`5m`, `2h`, `3d`) or word forms (`5 minutes`, `2 hours`).
|
|
27
|
+
Anything below 1 minute is rounded up; anything not on a minute boundary is
|
|
28
|
+
rounded to the nearest minute.
|
|
29
|
+
|
|
30
|
+
A loop only fires while Tau is idle between turns (never mid-turn), and
|
|
31
|
+
auto-expires 3 days after creation. Each loop's next-run time gets a small
|
|
32
|
+
id-derived jitter (up to 10% of its interval, capped at 15m) so multiple loops
|
|
33
|
+
don't all fire in lockstep.
|
|
34
|
+
|
|
35
|
+
Tasks persist to `.tau/loop/scheduler.json` in the project directory and
|
|
36
|
+
survive session restarts.
|
|
37
|
+
|
|
38
|
+
## Files
|
|
39
|
+
|
|
40
|
+
| File | Responsibility |
|
|
41
|
+
|------|----------------|
|
|
42
|
+
| `__init__.py` | Entry point — `register(tau)`, the `/loop` command handler, the interactive picker/action-menu flow, session hooks |
|
|
43
|
+
| `duration.py` | Interval parsing/formatting (`parse_duration`, `parse_loop_args`, `format_duration`) |
|
|
44
|
+
| `state.py` | `LoopTask` dataclass and `SchedulerState` (in-memory tasks, edits, + disk persistence) |
|
|
45
|
+
| `dispatch.py` | Per-second ticker: marks due tasks pending, dispatches one when idle, updates the footer status slot |
|