drydock-cli 2.2.7__tar.gz → 2.2.9__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.
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/PKG-INFO +1 -1
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agent_loop.py +139 -49
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/search_replace.py +13 -2
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/pyproject.toml +1 -1
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.gitignore +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.python-version +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.typos.toml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.vscode/extensions.json +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.vscode/launch.json +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.vscode/settings.json +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/AGENTS.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/CHANGELOG.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/CLAUDE.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/LICENSE +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/NOTICE +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/PRD.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/README.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/action.yml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/docs/README.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/docs/acp-setup.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/logger.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/slug.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/types.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/utils.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/whats_new.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock-acp.spec +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock_terms.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/flake.lock +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/flake.nix +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/README.md +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/backup.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/bump_version.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/install.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/notify_release.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/test_full.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/conftest.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/common.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/utils.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agents.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_integration.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_message_id.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_middleware.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_smoke.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_workloads.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.2.7 → drydock_cli-2.2.9}/uv.lock +0 -0
|
@@ -497,6 +497,8 @@ class AgentLoop:
|
|
|
497
497
|
files_explored: list[str] = [] # Track files read for context state
|
|
498
498
|
files_modified: list[str] = [] # Track files edited for blast radius
|
|
499
499
|
context_summary_injected = False
|
|
500
|
+
self._temp_override: float | None = None # Temperature bump on loop detection
|
|
501
|
+
self._failed_approaches: list[str] = [] # Persistent failed approach tracker
|
|
500
502
|
while not should_break_loop:
|
|
501
503
|
# Loop protection: prevent infinite tool-call loops
|
|
502
504
|
tool_turns += 1
|
|
@@ -861,57 +863,31 @@ class AgentLoop:
|
|
|
861
863
|
if nudge_text:
|
|
862
864
|
self._inject_system_note(nudge_text)
|
|
863
865
|
|
|
864
|
-
# Loop guidance —
|
|
866
|
+
# Loop guidance — retrospection, NEVER stop
|
|
865
867
|
if not should_break_loop:
|
|
866
868
|
rep = self._check_tool_call_repetition()
|
|
867
869
|
if rep == "FORCE_STOP" or (rep and rep.startswith("WARNING")):
|
|
868
|
-
stuck_tool = ""
|
|
869
|
-
if rep and "|" in rep:
|
|
870
|
-
stuck_tool = rep.split("|", 1)[1]
|
|
871
|
-
|
|
872
870
|
# Prune duplicate tool calls to give model fresh context
|
|
873
871
|
self._prune_repeated_tool_calls()
|
|
874
872
|
|
|
875
|
-
#
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
self.
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
" You have been running the SAME bash command repeatedly. "
|
|
894
|
-
"Running the same command again will give the same result. "
|
|
895
|
-
"If it succeeded but didn't do what you expected, READ the source code "
|
|
896
|
-
"to understand WHY, then FIX the code with search_replace. "
|
|
897
|
-
"If it failed, try a DIFFERENT command or approach."
|
|
898
|
-
)
|
|
899
|
-
if repeat_warnings >= 4:
|
|
900
|
-
# Escalated: replace tool result with strong directive
|
|
901
|
-
warning_text = (
|
|
902
|
-
"BLOCKED: Your tool call was not executed because you have been repeating the same action. "
|
|
903
|
-
"You already have all the information you need from previous tool results. "
|
|
904
|
-
"Your ONLY valid next action is: use search_replace to make your code fix. "
|
|
905
|
-
"Do NOT read, grep, or bash. Use search_replace NOW."
|
|
906
|
-
)
|
|
907
|
-
self._inject_system_note(warning_text, replace_last_tool=True)
|
|
908
|
-
else:
|
|
909
|
-
warning_text = (
|
|
910
|
-
"WARNING: You are repeating the same tool call with the same arguments. "
|
|
911
|
-
"This is not making progress. Try a DIFFERENT approach, use a different tool, "
|
|
912
|
-
"or tell the user what's blocking you." + nudge
|
|
913
|
-
)
|
|
914
|
-
self._inject_system_note(warning_text)
|
|
873
|
+
# Temperature bump: force model to explore different paths
|
|
874
|
+
self._temp_override = 0.5
|
|
875
|
+
|
|
876
|
+
# Track failed approach for accumulator
|
|
877
|
+
self._record_failed_approach()
|
|
878
|
+
|
|
879
|
+
# RETROSPECTION: Summarize recent actions and let the model
|
|
880
|
+
# decide its own next step — no hardcoded nudges
|
|
881
|
+
retro = self._build_retrospection()
|
|
882
|
+
if retro:
|
|
883
|
+
# Include failed approaches if any
|
|
884
|
+
if self._failed_approaches:
|
|
885
|
+
approaches = "\n".join(f" - {a}" for a in self._failed_approaches[-5:])
|
|
886
|
+
retro += f"\n\nApproaches already tried (don't repeat these):\n{approaches}"
|
|
887
|
+
self._inject_system_note(retro)
|
|
888
|
+
else:
|
|
889
|
+
# Loop broken — reset temperature to normal
|
|
890
|
+
self._temp_override = None
|
|
915
891
|
|
|
916
892
|
if user_cancelled:
|
|
917
893
|
return
|
|
@@ -1291,11 +1267,31 @@ class AgentLoop:
|
|
|
1291
1267
|
)
|
|
1292
1268
|
except (json.JSONDecodeError, AttributeError):
|
|
1293
1269
|
pass
|
|
1270
|
+
# AUTO-READ: Automatically read the target file so the model has
|
|
1271
|
+
# the actual content — don't just tell it to read, DO it for it
|
|
1272
|
+
auto_read_content = ""
|
|
1273
|
+
try:
|
|
1274
|
+
sr_args = json.loads(tool_call.raw_arguments or "{}")
|
|
1275
|
+
sr_path = sr_args.get("file_path", sr_args.get("path", ""))
|
|
1276
|
+
if sr_path and Path(sr_path).exists():
|
|
1277
|
+
with open(sr_path, "r", encoding="utf-8", errors="replace") as f:
|
|
1278
|
+
lines = f.readlines()
|
|
1279
|
+
# Show first 50 lines or the whole file if small
|
|
1280
|
+
preview_lines = lines[:50]
|
|
1281
|
+
numbered = [f"{i+1}\t{line.rstrip()}" for i, line in enumerate(preview_lines)]
|
|
1282
|
+
auto_read_content = (
|
|
1283
|
+
f"\n\nAUTO-READ of {sr_path} (first {len(preview_lines)} lines):\n"
|
|
1284
|
+
+ "\n".join(numbered)
|
|
1285
|
+
)
|
|
1286
|
+
if len(lines) > 50:
|
|
1287
|
+
auto_read_content += f"\n[... {len(lines) - 50} more lines]"
|
|
1288
|
+
except Exception:
|
|
1289
|
+
pass
|
|
1294
1290
|
error_msg += (
|
|
1295
1291
|
"\n\n[RECOVERY: Your search text didn't match the file contents. "
|
|
1296
|
-
"
|
|
1297
|
-
"then retry search_replace with the EXACT text from read_file output."
|
|
1292
|
+
"The actual file content is shown below — use EXACT text from it for your next edit."
|
|
1298
1293
|
f"{sr_file_hint}]"
|
|
1294
|
+
f"{auto_read_content}"
|
|
1299
1295
|
)
|
|
1300
1296
|
elif tool_call.tool_name == "search_replace" and "multiple" in str(exc).lower():
|
|
1301
1297
|
error_msg += (
|
|
@@ -1429,10 +1425,12 @@ class AgentLoop:
|
|
|
1429
1425
|
|
|
1430
1426
|
try:
|
|
1431
1427
|
start_time = time.perf_counter()
|
|
1428
|
+
# Use temperature override if set (loop detection bumps it)
|
|
1429
|
+
temp = getattr(self, '_temp_override', None) or active_model.temperature
|
|
1432
1430
|
result = await self.backend.complete(
|
|
1433
1431
|
model=active_model,
|
|
1434
1432
|
messages=self.messages,
|
|
1435
|
-
temperature=
|
|
1433
|
+
temperature=temp,
|
|
1436
1434
|
tools=available_tools,
|
|
1437
1435
|
tool_choice=tool_choice,
|
|
1438
1436
|
extra_headers=self._get_extra_headers(provider),
|
|
@@ -1477,10 +1475,12 @@ class AgentLoop:
|
|
|
1477
1475
|
start_time = time.perf_counter()
|
|
1478
1476
|
usage = LLMUsage()
|
|
1479
1477
|
chunk_agg = LLMChunk(message=LLMMessage(role=Role.assistant))
|
|
1478
|
+
# Use temperature override if set (loop detection bumps it)
|
|
1479
|
+
temp = getattr(self, '_temp_override', None) or active_model.temperature
|
|
1480
1480
|
async for chunk in self.backend.complete_streaming(
|
|
1481
1481
|
model=active_model,
|
|
1482
1482
|
messages=self.messages,
|
|
1483
|
-
temperature=
|
|
1483
|
+
temperature=temp,
|
|
1484
1484
|
tools=available_tools,
|
|
1485
1485
|
tool_choice=tool_choice,
|
|
1486
1486
|
extra_headers=self._get_extra_headers(provider),
|
|
@@ -1584,6 +1584,96 @@ class AgentLoop:
|
|
|
1584
1584
|
feedback=feedback,
|
|
1585
1585
|
)
|
|
1586
1586
|
|
|
1587
|
+
def _record_failed_approach(self) -> None:
|
|
1588
|
+
"""Record a one-line summary of the most recent failed approach.
|
|
1589
|
+
|
|
1590
|
+
Survives pruning and compaction so the model doesn't retry
|
|
1591
|
+
the same strategy after context cleanup.
|
|
1592
|
+
"""
|
|
1593
|
+
if not hasattr(self, '_failed_approaches'):
|
|
1594
|
+
self._failed_approaches = []
|
|
1595
|
+
|
|
1596
|
+
# Extract the last tool call and its result
|
|
1597
|
+
last_tool_name = ""
|
|
1598
|
+
last_tool_args = ""
|
|
1599
|
+
last_result = ""
|
|
1600
|
+
for msg in reversed(self.messages[-6:]):
|
|
1601
|
+
if msg.role == Role.tool and not last_result:
|
|
1602
|
+
result = str(msg.content or "")[:100]
|
|
1603
|
+
if "error" in result.lower() or "not found" in result.lower():
|
|
1604
|
+
last_result = result[:80]
|
|
1605
|
+
elif msg.role == Role.assistant and msg.tool_calls and not last_tool_name:
|
|
1606
|
+
for tc in msg.tool_calls:
|
|
1607
|
+
if tc.function:
|
|
1608
|
+
last_tool_name = tc.function.name or ""
|
|
1609
|
+
args = tc.function.arguments or ""
|
|
1610
|
+
# Extract file path if present
|
|
1611
|
+
try:
|
|
1612
|
+
parsed = json.loads(args)
|
|
1613
|
+
last_tool_args = parsed.get("file_path", parsed.get("path", parsed.get("command", "")))[:60]
|
|
1614
|
+
except (json.JSONDecodeError, TypeError, AttributeError):
|
|
1615
|
+
last_tool_args = args[:40]
|
|
1616
|
+
break
|
|
1617
|
+
|
|
1618
|
+
if last_tool_name:
|
|
1619
|
+
summary = f"{last_tool_name}({last_tool_args})"
|
|
1620
|
+
if last_result:
|
|
1621
|
+
summary += f" → {last_result}"
|
|
1622
|
+
# Don't add duplicates
|
|
1623
|
+
if not self._failed_approaches or self._failed_approaches[-1] != summary:
|
|
1624
|
+
self._failed_approaches.append(summary)
|
|
1625
|
+
# Keep only last 10
|
|
1626
|
+
self._failed_approaches = self._failed_approaches[-10:]
|
|
1627
|
+
|
|
1628
|
+
def _build_retrospection(self) -> str | None:
|
|
1629
|
+
"""Build a retrospection summary of recent tool calls.
|
|
1630
|
+
|
|
1631
|
+
Instead of hardcoded nudges, show the model what it's been doing
|
|
1632
|
+
and let it decide on a different approach. The model is better at
|
|
1633
|
+
self-correcting when it can see its own pattern of behavior.
|
|
1634
|
+
"""
|
|
1635
|
+
# Collect last 8 tool calls with their results (truncated)
|
|
1636
|
+
recent: list[str] = []
|
|
1637
|
+
count = 0
|
|
1638
|
+
for msg in reversed(self.messages):
|
|
1639
|
+
if count >= 8:
|
|
1640
|
+
break
|
|
1641
|
+
if msg.role == Role.assistant and msg.tool_calls:
|
|
1642
|
+
for tc in reversed(msg.tool_calls or []):
|
|
1643
|
+
if tc.function:
|
|
1644
|
+
name = tc.function.name or "?"
|
|
1645
|
+
args_str = tc.function.arguments or ""
|
|
1646
|
+
# Truncate args for readability
|
|
1647
|
+
if len(args_str) > 120:
|
|
1648
|
+
args_str = args_str[:120] + "..."
|
|
1649
|
+
recent.append(f" {count+1}. {name}({args_str})")
|
|
1650
|
+
count += 1
|
|
1651
|
+
if count >= 8:
|
|
1652
|
+
break
|
|
1653
|
+
elif msg.role == Role.tool and recent:
|
|
1654
|
+
# Add result summary to last entry
|
|
1655
|
+
result = str(msg.content or "")[:150]
|
|
1656
|
+
if "error" in result.lower() or "Error" in result:
|
|
1657
|
+
recent[-1] += f" → ERROR"
|
|
1658
|
+
elif "not found" in result.lower():
|
|
1659
|
+
recent[-1] += f" → NOT FOUND"
|
|
1660
|
+
else:
|
|
1661
|
+
recent[-1] += f" → ok"
|
|
1662
|
+
|
|
1663
|
+
if len(recent) < 3:
|
|
1664
|
+
return None
|
|
1665
|
+
|
|
1666
|
+
recent.reverse()
|
|
1667
|
+
summary = "\n".join(recent)
|
|
1668
|
+
|
|
1669
|
+
return (
|
|
1670
|
+
f"RETROSPECTION — Your last {len(recent)} tool calls:\n"
|
|
1671
|
+
f"{summary}\n\n"
|
|
1672
|
+
f"You are repeating a pattern that is not making progress. "
|
|
1673
|
+
f"Review the sequence above. What went wrong? What should you do differently? "
|
|
1674
|
+
f"Choose a different approach on your own."
|
|
1675
|
+
)
|
|
1676
|
+
|
|
1587
1677
|
def _inject_system_note(self, text: str, replace_last_tool: bool = False) -> None:
|
|
1588
1678
|
"""Safely inject a system note into conversation without breaking message ordering.
|
|
1589
1679
|
|
|
@@ -23,11 +23,12 @@ from drydock.core.tools.utils import resolve_file_tool_permission
|
|
|
23
23
|
from drydock.core.types import ToolResultEvent, ToolStreamEvent
|
|
24
24
|
|
|
25
25
|
SEARCH_REPLACE_BLOCK_RE = re.compile(
|
|
26
|
-
r"<{5,}
|
|
26
|
+
r"<{5,}\s*(?:SEARCH\s*)+\r?\n(.*?)\r?\n?={5,}\r?\n(.*?)\r?\n?>{5,}\s*(?:REPLACE\s*)+",
|
|
27
|
+
flags=re.DOTALL,
|
|
27
28
|
)
|
|
28
29
|
|
|
29
30
|
SEARCH_REPLACE_BLOCK_WITH_FENCE_RE = re.compile(
|
|
30
|
-
r"```[\s\S]*?\n<{5,}
|
|
31
|
+
r"```[\s\S]*?\n<{5,}\s*(?:SEARCH\s*)+\r?\n(.*?)\r?\n?={5,}\r?\n(.*?)\r?\n?>{5,}\s*(?:REPLACE\s*)+\s*\n```",
|
|
31
32
|
flags=re.DOTALL,
|
|
32
33
|
)
|
|
33
34
|
|
|
@@ -213,6 +214,16 @@ class SearchReplace(
|
|
|
213
214
|
">>>>>>> REPLACE"
|
|
214
215
|
)
|
|
215
216
|
|
|
217
|
+
# Detect garbled token output (common with some models/parsers)
|
|
218
|
+
for block in search_replace_blocks:
|
|
219
|
+
if re.search(r'(.)\1{4,}', block.search) or re.search(r'<{3,}[a-z]', block.search):
|
|
220
|
+
raise ToolError(
|
|
221
|
+
"Your search text appears garbled (repeated/corrupted characters). "
|
|
222
|
+
"This happens when regex or special characters confuse the tool call parser. "
|
|
223
|
+
"WORKAROUND: Use read_file to get the exact line numbers, then use write_file "
|
|
224
|
+
"to rewrite the entire function instead of search_replace on complex regex patterns."
|
|
225
|
+
)
|
|
226
|
+
|
|
216
227
|
return file_path, search_replace_blocks
|
|
217
228
|
|
|
218
229
|
async def _read_file(self, file_path: Path) -> str:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/text_area.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/history_windowing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py
RENAMED
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/ports/update_cache_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/__init__.py
RENAMED
|
File without changes
|
{drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/ignore_rules.py
RENAMED
|
File without changes
|