drydock-cli 0.7.0__tar.gz → 0.7.1__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-0.7.0 → drydock_cli-0.7.1}/PKG-INFO +1 -1
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/pyproject.toml +1 -1
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/scripts/deploy_to_github.sh +1 -1
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/scripts/publish_to_pypi.sh +1 -1
- drydock_cli-0.7.1/tests/test_integration.py +270 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/CODEOWNERS +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/workflows/ci.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.github/workflows/release.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.gitignore +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.pre-commit-config.yaml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.python-version +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.typos.toml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.vscode/extensions.json +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.vscode/launch.json +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/.vscode/settings.json +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/AGENTS.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/CHANGELOG.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/CLAUDE.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/CONTRIBUTING.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/Drydock_rebrand.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/LICENSE +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/NOTICE +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/PRD.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/README.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/action.yml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/distribution/zed/LICENSE +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/distribution/zed/extension.toml +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/docs/README.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/docs/acp-setup.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/docs/proxy-setup.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/acp/utils.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/cli.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/commands.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/agents/models.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/auth/github.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/consultant.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/format.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/llm/types.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/logger.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/middleware.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/plan_session.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/programmatic.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/skills/models.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/slug.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/base.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/types.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/utils.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/skills/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/whats_new.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock-acp.spec +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock_terms.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/flake.lock +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/flake.nix +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/scripts/README.md +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/scripts/bump_version.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/scripts/install.sh +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/scripts/prepare_release.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/conftest.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_acp.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_bash.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_content.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_utils.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/test_backend.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_commands.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/conftest.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_agents.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_slug.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/core/test_utils.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/e2e/common.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/e2e/conftest.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/mock/__init__.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/mock/utils.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/skills/conftest.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/skills/test_manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/skills/test_models.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/skills/test_parser.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_agent_backend.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_agent_stats.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_agents.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_history_manager.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_loop_detection.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_message_id.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_message_merging.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_middleware.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_system_prompt.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_tagged_text.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_bash.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_grep.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_task.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-0.7.0 → drydock_cli-0.7.1}/uv.lock +0 -0
|
@@ -37,7 +37,7 @@ AUTH_URL="https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git"
|
|
|
37
37
|
|
|
38
38
|
log "Running regression tests..."
|
|
39
39
|
cd "$DRYDOCK_SRC"
|
|
40
|
-
if ! python3 -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py \
|
|
40
|
+
if ! python3 -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py \
|
|
41
41
|
-p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
|
|
42
42
|
log "TESTS FAILED — deploy aborted. Fix the tests before deploying."
|
|
43
43
|
exit 1
|
|
@@ -25,7 +25,7 @@ PYPI_TOKEN=$(cat "$TOKEN_FILE")
|
|
|
25
25
|
|
|
26
26
|
# --- Run tests ---
|
|
27
27
|
log "Running regression tests..."
|
|
28
|
-
if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py \
|
|
28
|
+
if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py \
|
|
29
29
|
-p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
|
|
30
30
|
log "TESTS FAILED — publish aborted."
|
|
31
31
|
exit 1
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"""Integration tests — use the REAL vLLM backend.
|
|
2
|
+
|
|
3
|
+
These tests hit the actual LLM at localhost:8000 and verify the full
|
|
4
|
+
pipeline works end-to-end. They catch issues that mock tests miss
|
|
5
|
+
(like the raw_arguments crash that broke 159 tasks).
|
|
6
|
+
|
|
7
|
+
Skip if vLLM is not running (CI environments).
|
|
8
|
+
|
|
9
|
+
Run manually: pytest tests/test_integration.py -v -s
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import json
|
|
16
|
+
import os
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
import httpx
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
from drydock.core.agent_loop import AgentLoop
|
|
23
|
+
from drydock.core.agents.models import BuiltinAgentName
|
|
24
|
+
from drydock.core.config import (
|
|
25
|
+
Backend,
|
|
26
|
+
ModelConfig,
|
|
27
|
+
ProviderConfig,
|
|
28
|
+
VibeConfig,
|
|
29
|
+
)
|
|
30
|
+
from drydock.core.types import (
|
|
31
|
+
AssistantEvent,
|
|
32
|
+
BaseEvent,
|
|
33
|
+
ToolCallEvent,
|
|
34
|
+
ToolResultEvent,
|
|
35
|
+
UserMessageEvent,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# ============================================================================
|
|
40
|
+
# Skip if vLLM not running
|
|
41
|
+
# ============================================================================
|
|
42
|
+
|
|
43
|
+
def _vllm_available() -> bool:
|
|
44
|
+
try:
|
|
45
|
+
r = httpx.get("http://localhost:8000/v1/models", timeout=3)
|
|
46
|
+
return r.status_code == 200
|
|
47
|
+
except Exception:
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
pytestmark = pytest.mark.skipif(
|
|
52
|
+
not _vllm_available(),
|
|
53
|
+
reason="vLLM not running at localhost:8000"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ============================================================================
|
|
58
|
+
# Helpers
|
|
59
|
+
# ============================================================================
|
|
60
|
+
|
|
61
|
+
def _make_config(tmp_path: Path) -> VibeConfig:
|
|
62
|
+
"""Create a config that uses local vLLM."""
|
|
63
|
+
return VibeConfig(
|
|
64
|
+
active_model="devstral",
|
|
65
|
+
auto_approve=True,
|
|
66
|
+
enable_telemetry=False,
|
|
67
|
+
include_project_context=False,
|
|
68
|
+
include_prompt_detail=False,
|
|
69
|
+
system_prompt_id="tests",
|
|
70
|
+
providers=[
|
|
71
|
+
ProviderConfig(
|
|
72
|
+
name="local-vllm",
|
|
73
|
+
api_base="http://localhost:8000/v1",
|
|
74
|
+
api_key_env_var="",
|
|
75
|
+
backend=Backend.GENERIC,
|
|
76
|
+
),
|
|
77
|
+
],
|
|
78
|
+
models=[
|
|
79
|
+
ModelConfig(
|
|
80
|
+
name="devstral",
|
|
81
|
+
provider="local-vllm",
|
|
82
|
+
alias="devstral",
|
|
83
|
+
input_price=0.0,
|
|
84
|
+
output_price=0.0,
|
|
85
|
+
),
|
|
86
|
+
],
|
|
87
|
+
session_logging={"enabled": False, "save_dir": str(tmp_path / "logs")},
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _make_agent(tmp_path: Path) -> AgentLoop:
|
|
92
|
+
config = _make_config(tmp_path)
|
|
93
|
+
return AgentLoop(
|
|
94
|
+
config=config,
|
|
95
|
+
agent_name=BuiltinAgentName.AUTO_APPROVE,
|
|
96
|
+
max_turns=5, # Safety limit
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
async def _run(agent: AgentLoop, prompt: str, max_events: int = 100) -> list[BaseEvent]:
|
|
101
|
+
events = []
|
|
102
|
+
async for ev in agent.act(prompt):
|
|
103
|
+
events.append(ev)
|
|
104
|
+
if len(events) >= max_events:
|
|
105
|
+
break
|
|
106
|
+
return events
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
# ============================================================================
|
|
110
|
+
# Test 1: Simple text response from real LLM
|
|
111
|
+
# ============================================================================
|
|
112
|
+
|
|
113
|
+
@pytest.mark.asyncio
|
|
114
|
+
async def test_real_llm_responds(tmp_path):
|
|
115
|
+
"""Real LLM produces a text response without crashing."""
|
|
116
|
+
agent = _make_agent(tmp_path)
|
|
117
|
+
events = await _run(agent, "Say hello in one word.")
|
|
118
|
+
|
|
119
|
+
assert any(isinstance(e, AssistantEvent) for e in events)
|
|
120
|
+
text = [e for e in events if isinstance(e, AssistantEvent) and e.content]
|
|
121
|
+
assert len(text) >= 1
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# ============================================================================
|
|
125
|
+
# Test 2: LLM calls a tool and gets result
|
|
126
|
+
# ============================================================================
|
|
127
|
+
|
|
128
|
+
@pytest.mark.asyncio
|
|
129
|
+
async def test_real_tool_call(tmp_path):
|
|
130
|
+
"""Real LLM calls a tool (e.g., bash/grep) and receives the result."""
|
|
131
|
+
agent = _make_agent(tmp_path)
|
|
132
|
+
events = await _run(agent, "Run: echo 'drydock test passed'")
|
|
133
|
+
|
|
134
|
+
# Should have at least one tool call or text response
|
|
135
|
+
has_tool = any(isinstance(e, ToolCallEvent) for e in events)
|
|
136
|
+
has_text = any(isinstance(e, AssistantEvent) and e.content for e in events)
|
|
137
|
+
assert has_tool or has_text, "LLM produced neither tool calls nor text"
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
# ============================================================================
|
|
141
|
+
# Test 3: No crash on tool execution path
|
|
142
|
+
# ============================================================================
|
|
143
|
+
|
|
144
|
+
@pytest.mark.asyncio
|
|
145
|
+
async def test_no_crash_on_tool_path(tmp_path):
|
|
146
|
+
"""The full tool execution path (resolve → execute → result) doesn't crash."""
|
|
147
|
+
agent = _make_agent(tmp_path)
|
|
148
|
+
|
|
149
|
+
# This prompt should trigger grep or read_file
|
|
150
|
+
events = await _run(agent, "What files are in the current directory? Use ls.")
|
|
151
|
+
|
|
152
|
+
# If we get any events at all without exception, the path works
|
|
153
|
+
assert len(events) >= 1
|
|
154
|
+
|
|
155
|
+
# No tool results should have crash errors
|
|
156
|
+
for e in events:
|
|
157
|
+
if isinstance(e, ToolResultEvent) and e.error:
|
|
158
|
+
assert "AttributeError" not in e.error, f"Crash in tool path: {e.error}"
|
|
159
|
+
assert "raw_arguments" not in e.error, f"Old bug present: {e.error}"
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
# ============================================================================
|
|
163
|
+
# Test 4: Circuit breaker doesn't crash on real tool calls
|
|
164
|
+
# ============================================================================
|
|
165
|
+
|
|
166
|
+
@pytest.mark.asyncio
|
|
167
|
+
async def test_circuit_breaker_no_crash(tmp_path):
|
|
168
|
+
"""Circuit breaker works with real ResolvedToolCall objects."""
|
|
169
|
+
agent = _make_agent(tmp_path)
|
|
170
|
+
|
|
171
|
+
# Ask something that triggers a tool call
|
|
172
|
+
events = await _run(agent, "Read the first 3 lines of /etc/hostname")
|
|
173
|
+
|
|
174
|
+
# Verify circuit breaker state was populated (even if only 1 call)
|
|
175
|
+
# The key thing is it didn't crash
|
|
176
|
+
assert hasattr(agent, "_tool_call_history")
|
|
177
|
+
assert isinstance(agent._tool_call_history, dict)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
# ============================================================================
|
|
181
|
+
# Test 5: Message ordering stays clean after real conversation
|
|
182
|
+
# ============================================================================
|
|
183
|
+
|
|
184
|
+
@pytest.mark.asyncio
|
|
185
|
+
async def test_message_ordering_real(tmp_path):
|
|
186
|
+
"""No user-after-tool violations after a real multi-turn conversation."""
|
|
187
|
+
agent = _make_agent(tmp_path)
|
|
188
|
+
events = await _run(agent, "What is 2+2? Just answer the number.")
|
|
189
|
+
|
|
190
|
+
from drydock.core.types import Role
|
|
191
|
+
for i in range(1, len(agent.messages)):
|
|
192
|
+
if agent.messages[i].role == Role.user and agent.messages[i - 1].role == Role.tool:
|
|
193
|
+
pytest.fail(f"user after tool at message {i}")
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# ============================================================================
|
|
197
|
+
# Test 6: Agent stops within turn limit
|
|
198
|
+
# ============================================================================
|
|
199
|
+
|
|
200
|
+
@pytest.mark.asyncio
|
|
201
|
+
async def test_turn_limit_respected(tmp_path):
|
|
202
|
+
"""Agent respects max_turns and doesn't loop forever."""
|
|
203
|
+
agent = _make_agent(tmp_path) # max_turns=5
|
|
204
|
+
events = await _run(agent, "Explore this entire codebase thoroughly.", max_events=200)
|
|
205
|
+
|
|
206
|
+
# Should stop eventually (max_turns=5 or natural stop)
|
|
207
|
+
assert len(events) < 200, "Agent seems to be looping"
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
# ============================================================================
|
|
211
|
+
# Test 7: Bash tool works end-to-end
|
|
212
|
+
# ============================================================================
|
|
213
|
+
|
|
214
|
+
@pytest.mark.asyncio
|
|
215
|
+
async def test_bash_tool_works(tmp_path):
|
|
216
|
+
"""Bash tool executes and returns output through the full pipeline."""
|
|
217
|
+
agent = _make_agent(tmp_path)
|
|
218
|
+
events = await _run(agent, "Run this exact command: echo 'hello from drydock'")
|
|
219
|
+
|
|
220
|
+
tool_results = [e for e in events if isinstance(e, ToolResultEvent)]
|
|
221
|
+
# Either the model called bash successfully, or gave a text response
|
|
222
|
+
has_any_output = len(tool_results) > 0 or any(
|
|
223
|
+
isinstance(e, AssistantEvent) and e.content for e in events
|
|
224
|
+
)
|
|
225
|
+
assert has_any_output
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# ============================================================================
|
|
229
|
+
# Test 8: Agent handles ambiguous prompt without infinite loop
|
|
230
|
+
# ============================================================================
|
|
231
|
+
|
|
232
|
+
@pytest.mark.asyncio
|
|
233
|
+
async def test_ambiguous_prompt_no_loop(tmp_path):
|
|
234
|
+
"""Short ambiguous prompt ('test') doesn't cause infinite filesystem exploration."""
|
|
235
|
+
agent = _make_agent(tmp_path)
|
|
236
|
+
events = await _run(agent, "test", max_events=50)
|
|
237
|
+
|
|
238
|
+
# Should not use excessive tool calls
|
|
239
|
+
tool_calls = [e for e in events if isinstance(e, ToolCallEvent)]
|
|
240
|
+
assert len(tool_calls) < 20, f"Too many tool calls ({len(tool_calls)}) for ambiguous prompt"
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
# ============================================================================
|
|
244
|
+
# Test 9: MessageList integrity after real execution
|
|
245
|
+
# ============================================================================
|
|
246
|
+
|
|
247
|
+
@pytest.mark.asyncio
|
|
248
|
+
async def test_messagelist_integrity_real(tmp_path):
|
|
249
|
+
"""MessageList is never replaced with plain list during real execution."""
|
|
250
|
+
agent = _make_agent(tmp_path)
|
|
251
|
+
await _run(agent, "Hello")
|
|
252
|
+
|
|
253
|
+
from drydock.core.types import MessageList
|
|
254
|
+
assert isinstance(agent.messages, MessageList), \
|
|
255
|
+
f"messages is {type(agent.messages)}, not MessageList"
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
# ============================================================================
|
|
259
|
+
# Test 10: Sanitize message ordering runs without error
|
|
260
|
+
# ============================================================================
|
|
261
|
+
|
|
262
|
+
@pytest.mark.asyncio
|
|
263
|
+
async def test_sanitize_runs_on_real_messages(tmp_path):
|
|
264
|
+
"""_sanitize_message_ordering doesn't crash on real message history."""
|
|
265
|
+
agent = _make_agent(tmp_path)
|
|
266
|
+
await _run(agent, "What time is it?")
|
|
267
|
+
|
|
268
|
+
# Run sanitize explicitly — should not raise
|
|
269
|
+
agent._sanitize_message_ordering()
|
|
270
|
+
assert len(agent.messages) >= 2 # At least system + user
|
|
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-0.7.0 → drydock_cli-0.7.1}/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-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-0.7.0 → drydock_cli-0.7.1}/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-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-0.7.0 → drydock_cli-0.7.1}/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-0.7.0 → drydock_cli-0.7.1}/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-0.7.0 → drydock_cli-0.7.1}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py
RENAMED
|
File without changes
|
{drydock_cli-0.7.0 → drydock_cli-0.7.1}/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
|
|
File without changes
|
{drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/file_indexer/__init__.py
RENAMED
|
File without changes
|
{drydock_cli-0.7.0 → drydock_cli-0.7.1}/drydock/core/autocompletion/file_indexer/ignore_rules.py
RENAMED
|
File without changes
|
|
File without changes
|