drydock-cli 0.6.5__tar.gz → 0.6.7__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.6.5 → drydock_cli-0.6.7}/PKG-INFO +1 -1
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/agent_loop.py +4 -2
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/webfetch.py +4 -2
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/pyproject.toml +1 -1
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/scripts/deploy_to_github.sh +1 -1
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/scripts/publish_to_pypi.sh +1 -1
- drydock_cli-0.6.7/tests/test_agent_tasks.py +238 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_drydock_tasks.py +3 -3
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_loop_detection.py +11 -11
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/CODEOWNERS +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/workflows/ci.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.github/workflows/release.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.gitignore +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.pre-commit-config.yaml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.python-version +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.typos.toml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.vscode/extensions.json +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.vscode/launch.json +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/.vscode/settings.json +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/AGENTS.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/CHANGELOG.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/CLAUDE.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/CONTRIBUTING.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/Drydock_rebrand.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/LICENSE +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/NOTICE +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/PRD.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/README.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/action.yml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/distribution/zed/LICENSE +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/distribution/zed/extension.toml +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/docs/README.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/docs/acp-setup.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/docs/proxy-setup.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/acp/utils.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/cli.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/commands.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/agents/models.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/auth/github.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/consultant.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/format.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/llm/types.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/logger.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/middleware.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/plan_session.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/programmatic.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/skills/models.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/slug.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/base.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/types.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/core/utils.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/skills/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/whats_new.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock-acp.spec +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock_terms.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/flake.lock +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/flake.nix +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/scripts/README.md +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/scripts/bump_version.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/scripts/install.sh +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/scripts/prepare_release.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/conftest.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_acp.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_bash.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_content.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_utils.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/test_backend.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_commands.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/conftest.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_agents.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_slug.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/core/test_utils.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/e2e/common.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/e2e/conftest.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/mock/__init__.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/mock/utils.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/skills/conftest.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/skills/test_manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/skills/test_models.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/skills/test_parser.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/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.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_agent_backend.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_agent_stats.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_agents.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_history_manager.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_message_id.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_message_merging.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_middleware.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_system_prompt.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_tagged_text.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_bash.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_grep.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_task.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-0.6.5 → drydock_cli-0.6.7}/uv.lock +0 -0
|
@@ -849,8 +849,9 @@ class AgentLoop:
|
|
|
849
849
|
|
|
850
850
|
def _circuit_breaker_check(self, tool_call: ResolvedToolCall) -> str | None:
|
|
851
851
|
"""Block exact-duplicate tool calls. Returns cached result or None."""
|
|
852
|
+
args_str = json.dumps(tool_call.args_dict, sort_keys=True, default=str)
|
|
852
853
|
sig = hashlib.md5(
|
|
853
|
-
f"{tool_call.tool_name}:{
|
|
854
|
+
f"{tool_call.tool_name}:{args_str}".encode()
|
|
854
855
|
).hexdigest()
|
|
855
856
|
|
|
856
857
|
count, last_result = self._tool_call_history.get(sig, (0, ""))
|
|
@@ -883,8 +884,9 @@ class AgentLoop:
|
|
|
883
884
|
|
|
884
885
|
def _circuit_breaker_record(self, tool_call: ResolvedToolCall, result_text: str) -> None:
|
|
885
886
|
"""Record a tool call execution for circuit breaker tracking."""
|
|
887
|
+
args_str = json.dumps(tool_call.args_dict, sort_keys=True, default=str)
|
|
886
888
|
sig = hashlib.md5(
|
|
887
|
-
f"{tool_call.tool_name}:{
|
|
889
|
+
f"{tool_call.tool_name}:{args_str}".encode()
|
|
888
890
|
).hexdigest()
|
|
889
891
|
count, _ = self._tool_call_history.get(sig, (0, ""))
|
|
890
892
|
self._tool_call_history[sig] = (count + 1, result_text[:500])
|
|
@@ -23,7 +23,7 @@ if TYPE_CHECKING:
|
|
|
23
23
|
from drydock.core.types import ToolCallEvent, ToolResultEvent
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
_HONEST_USER_AGENT = "
|
|
26
|
+
_HONEST_USER_AGENT = "drydock-cli"
|
|
27
27
|
_HTTP_FORBIDDEN = 403
|
|
28
28
|
|
|
29
29
|
|
|
@@ -146,8 +146,10 @@ class WebFetch(
|
|
|
146
146
|
async def _do_fetch(
|
|
147
147
|
self, url: str, timeout: int, headers: dict[str, str]
|
|
148
148
|
) -> httpx.Response:
|
|
149
|
+
import os
|
|
150
|
+
verify_ssl = os.environ.get("DRYDOCK_INSECURE") != "1"
|
|
149
151
|
async with httpx.AsyncClient(
|
|
150
|
-
follow_redirects=True, timeout=httpx.Timeout(timeout)
|
|
152
|
+
follow_redirects=True, timeout=httpx.Timeout(timeout), verify=verify_ssl
|
|
151
153
|
) as client:
|
|
152
154
|
response = await client.get(url, headers=headers)
|
|
153
155
|
|
|
@@ -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 \
|
|
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 \
|
|
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 \
|
|
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 \
|
|
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,238 @@
|
|
|
1
|
+
"""Agent task tests — spin up real agent loops with scripted LLM responses.
|
|
2
|
+
|
|
3
|
+
Each test simulates a real user task by providing scripted model responses
|
|
4
|
+
and verifying the agent produces the right events and behavior.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import json
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
from tests.conftest import build_test_agent_loop, build_test_vibe_config
|
|
15
|
+
from tests.mock.utils import mock_llm_chunk
|
|
16
|
+
from tests.stubs.fake_backend import FakeBackend
|
|
17
|
+
from drydock.core.agent_loop import AgentLoop
|
|
18
|
+
from drydock.core.agents.models import BuiltinAgentName
|
|
19
|
+
from drydock.core.tools.base import BaseToolConfig, ToolPermission
|
|
20
|
+
from drydock.core.types import (
|
|
21
|
+
AssistantEvent,
|
|
22
|
+
BaseEvent,
|
|
23
|
+
FunctionCall,
|
|
24
|
+
LLMMessage,
|
|
25
|
+
MessageList,
|
|
26
|
+
Role,
|
|
27
|
+
ToolCall,
|
|
28
|
+
ToolCallEvent,
|
|
29
|
+
ToolResultEvent,
|
|
30
|
+
UserMessageEvent,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
async def _run(agent: AgentLoop, prompt: str, max_events: int = 50) -> list[BaseEvent]:
|
|
35
|
+
events = []
|
|
36
|
+
async for ev in agent.act(prompt):
|
|
37
|
+
events.append(ev)
|
|
38
|
+
if len(events) >= max_events:
|
|
39
|
+
break
|
|
40
|
+
return events
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _count(events: list[BaseEvent], event_type: type) -> int:
|
|
44
|
+
return sum(1 for e in events if isinstance(e, event_type))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _agent(backend: FakeBackend) -> AgentLoop:
|
|
48
|
+
config = build_test_vibe_config(
|
|
49
|
+
system_prompt_id="tests",
|
|
50
|
+
include_project_context=False,
|
|
51
|
+
include_prompt_detail=False,
|
|
52
|
+
)
|
|
53
|
+
return build_test_agent_loop(
|
|
54
|
+
config=config,
|
|
55
|
+
agent_name=BuiltinAgentName.AUTO_APPROVE,
|
|
56
|
+
backend=backend,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# ============================================================================
|
|
61
|
+
# Task 1: Simple greeting — no tools, no loops
|
|
62
|
+
# ============================================================================
|
|
63
|
+
|
|
64
|
+
@pytest.mark.asyncio
|
|
65
|
+
async def test_task_greeting_no_loop(telemetry_events):
|
|
66
|
+
"""Agent responds to greeting and stops without looping."""
|
|
67
|
+
backend = FakeBackend([
|
|
68
|
+
[mock_llm_chunk(content="Hello! How can I help?")],
|
|
69
|
+
])
|
|
70
|
+
events = await _run(_agent(backend), "hi")
|
|
71
|
+
|
|
72
|
+
assert _count(events, UserMessageEvent) == 1
|
|
73
|
+
text = [e for e in events if isinstance(e, AssistantEvent)]
|
|
74
|
+
assert len(text) >= 1
|
|
75
|
+
assert "Hello" in text[0].content
|
|
76
|
+
assert len(events) < 10 # Not looping
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ============================================================================
|
|
80
|
+
# Task 2: Agent stops after text-only response
|
|
81
|
+
# ============================================================================
|
|
82
|
+
|
|
83
|
+
@pytest.mark.asyncio
|
|
84
|
+
async def test_task_stops_on_text_response(telemetry_events):
|
|
85
|
+
"""Text-only response terminates the loop (no tool calls = done)."""
|
|
86
|
+
backend = FakeBackend([
|
|
87
|
+
[mock_llm_chunk(content="The answer is 42.")],
|
|
88
|
+
])
|
|
89
|
+
events = await _run(_agent(backend), "meaning of life?")
|
|
90
|
+
|
|
91
|
+
assert _count(events, AssistantEvent) >= 1
|
|
92
|
+
assert len(events) <= 5
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# ============================================================================
|
|
96
|
+
# Task 3: Empty response doesn't crash
|
|
97
|
+
# ============================================================================
|
|
98
|
+
|
|
99
|
+
@pytest.mark.asyncio
|
|
100
|
+
async def test_task_empty_response_no_crash(telemetry_events):
|
|
101
|
+
"""Empty LLM response handled gracefully."""
|
|
102
|
+
backend = FakeBackend([[mock_llm_chunk(content="")]])
|
|
103
|
+
events = await _run(_agent(backend), "hello")
|
|
104
|
+
assert _count(events, UserMessageEvent) == 1
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# ============================================================================
|
|
108
|
+
# Task 4: Message ordering maintained across turns
|
|
109
|
+
# ============================================================================
|
|
110
|
+
|
|
111
|
+
@pytest.mark.asyncio
|
|
112
|
+
async def test_task_message_ordering_clean(telemetry_events):
|
|
113
|
+
"""No user-after-tool violations in message history."""
|
|
114
|
+
backend = FakeBackend([
|
|
115
|
+
[mock_llm_chunk(content="First response.")],
|
|
116
|
+
])
|
|
117
|
+
agent = _agent(backend)
|
|
118
|
+
await _run(agent, "test message ordering")
|
|
119
|
+
|
|
120
|
+
for i in range(1, len(agent.messages)):
|
|
121
|
+
assert not (
|
|
122
|
+
agent.messages[i].role == Role.user
|
|
123
|
+
and agent.messages[i - 1].role == Role.tool
|
|
124
|
+
), f"user after tool at position {i}"
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# ============================================================================
|
|
128
|
+
# Task 5: Messages remain a MessageList (not plain list)
|
|
129
|
+
# ============================================================================
|
|
130
|
+
|
|
131
|
+
@pytest.mark.asyncio
|
|
132
|
+
async def test_task_messagelist_integrity(telemetry_events):
|
|
133
|
+
"""Agent messages stay as MessageList, never replaced with plain list."""
|
|
134
|
+
backend = FakeBackend([
|
|
135
|
+
[mock_llm_chunk(content="Working on it.")],
|
|
136
|
+
])
|
|
137
|
+
agent = _agent(backend)
|
|
138
|
+
await _run(agent, "test integrity")
|
|
139
|
+
|
|
140
|
+
assert isinstance(agent.messages, MessageList)
|
|
141
|
+
assert hasattr(agent.messages, "reset")
|
|
142
|
+
assert hasattr(agent.messages, "append")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
# ============================================================================
|
|
146
|
+
# Task 6: Circuit breaker state initialized
|
|
147
|
+
# ============================================================================
|
|
148
|
+
|
|
149
|
+
@pytest.mark.asyncio
|
|
150
|
+
async def test_task_circuit_breaker_initialized(telemetry_events):
|
|
151
|
+
"""Agent has circuit breaker history dict after creation."""
|
|
152
|
+
backend = FakeBackend([[mock_llm_chunk(content="ok")]])
|
|
153
|
+
agent = _agent(backend)
|
|
154
|
+
assert hasattr(agent, "_tool_call_history")
|
|
155
|
+
assert isinstance(agent._tool_call_history, dict)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# ============================================================================
|
|
159
|
+
# Task 7: Middleware turn limit stops agent
|
|
160
|
+
# ============================================================================
|
|
161
|
+
|
|
162
|
+
@pytest.mark.asyncio
|
|
163
|
+
async def test_task_turn_limit_stops_agent(telemetry_events):
|
|
164
|
+
"""max_turns=1 limits agent to a single turn."""
|
|
165
|
+
backend = FakeBackend([
|
|
166
|
+
[mock_llm_chunk(content="First turn.")],
|
|
167
|
+
[mock_llm_chunk(content="Should not reach this.")],
|
|
168
|
+
])
|
|
169
|
+
config = build_test_vibe_config(
|
|
170
|
+
system_prompt_id="tests",
|
|
171
|
+
include_project_context=False,
|
|
172
|
+
include_prompt_detail=False,
|
|
173
|
+
)
|
|
174
|
+
agent = build_test_agent_loop(
|
|
175
|
+
config=config,
|
|
176
|
+
agent_name=BuiltinAgentName.AUTO_APPROVE,
|
|
177
|
+
backend=backend,
|
|
178
|
+
max_turns=1,
|
|
179
|
+
)
|
|
180
|
+
events = await _run(agent, "do many things")
|
|
181
|
+
|
|
182
|
+
# With max_turns=1, agent should stop after 1 turn
|
|
183
|
+
# Either via middleware stop or by natural text-only response
|
|
184
|
+
text = [e for e in events if isinstance(e, AssistantEvent)]
|
|
185
|
+
assert len(text) >= 1
|
|
186
|
+
assert len(events) <= 10
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
# ============================================================================
|
|
190
|
+
# Task 8: Multi-response conversation
|
|
191
|
+
# ============================================================================
|
|
192
|
+
|
|
193
|
+
@pytest.mark.asyncio
|
|
194
|
+
async def test_task_multi_turn_conversation(telemetry_events):
|
|
195
|
+
"""Agent handles multiple text-only turns (when nudged to continue)."""
|
|
196
|
+
backend = FakeBackend([
|
|
197
|
+
[mock_llm_chunk(content="Let me think about this...")],
|
|
198
|
+
])
|
|
199
|
+
agent = _agent(backend)
|
|
200
|
+
events = await _run(agent, "explain the codebase")
|
|
201
|
+
|
|
202
|
+
# Should have at least user message + 1 assistant response
|
|
203
|
+
assert _count(events, UserMessageEvent) == 1
|
|
204
|
+
assert _count(events, AssistantEvent) >= 1
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
# ============================================================================
|
|
208
|
+
# Task 9: Backend exception doesn't crash permanently
|
|
209
|
+
# ============================================================================
|
|
210
|
+
|
|
211
|
+
@pytest.mark.asyncio
|
|
212
|
+
async def test_task_backend_error_recovery(telemetry_events):
|
|
213
|
+
"""Agent survives an LLM backend error."""
|
|
214
|
+
backend = FakeBackend(
|
|
215
|
+
exception_to_raise=RuntimeError("API error from vllm: connection refused")
|
|
216
|
+
)
|
|
217
|
+
agent = _agent(backend)
|
|
218
|
+
|
|
219
|
+
# Should not raise — agent catches and handles
|
|
220
|
+
events = await _run(agent, "test error handling")
|
|
221
|
+
# Will have limited events since backend keeps failing
|
|
222
|
+
assert _count(events, UserMessageEvent) == 1
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
# ============================================================================
|
|
226
|
+
# Task 10: System prompt present in messages
|
|
227
|
+
# ============================================================================
|
|
228
|
+
|
|
229
|
+
@pytest.mark.asyncio
|
|
230
|
+
async def test_task_system_prompt_present(telemetry_events):
|
|
231
|
+
"""Agent has a system prompt as first message."""
|
|
232
|
+
backend = FakeBackend([[mock_llm_chunk(content="ok")]])
|
|
233
|
+
agent = _agent(backend)
|
|
234
|
+
await _run(agent, "test")
|
|
235
|
+
|
|
236
|
+
assert len(agent.messages) >= 2
|
|
237
|
+
assert agent.messages[0].role == Role.system
|
|
238
|
+
assert len(agent.messages[0].content) > 50 # Non-trivial system prompt
|
|
@@ -400,7 +400,7 @@ class TestCircuitBreaker:
|
|
|
400
400
|
al.messages = MessageList()
|
|
401
401
|
al._tool_call_history = {}
|
|
402
402
|
|
|
403
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
403
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "ls -ltr"})
|
|
404
404
|
|
|
405
405
|
assert al._circuit_breaker_check(tc) is None
|
|
406
406
|
al._circuit_breaker_record(tc, "file1.py\nfile2.py")
|
|
@@ -421,8 +421,8 @@ class TestCircuitBreaker:
|
|
|
421
421
|
al.messages = MessageList()
|
|
422
422
|
al._tool_call_history = {}
|
|
423
423
|
|
|
424
|
-
tc1 = SimpleNamespace(tool_name="bash",
|
|
425
|
-
tc2 = SimpleNamespace(tool_name="bash",
|
|
424
|
+
tc1 = SimpleNamespace(tool_name="bash", args_dict={"command": "ls -ltr"})
|
|
425
|
+
tc2 = SimpleNamespace(tool_name="bash", args_dict={"command": "ls -la"})
|
|
426
426
|
|
|
427
427
|
al._circuit_breaker_record(tc1, "result1")
|
|
428
428
|
al._circuit_breaker_record(tc1, "result1")
|
|
@@ -59,18 +59,18 @@ class TestCircuitBreaker:
|
|
|
59
59
|
|
|
60
60
|
def test_first_call_allowed(self):
|
|
61
61
|
al = _make_agent()
|
|
62
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
62
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -ltr"})
|
|
63
63
|
assert al._circuit_breaker_check(tc) is None
|
|
64
64
|
|
|
65
65
|
def test_second_call_allowed(self):
|
|
66
66
|
al = _make_agent()
|
|
67
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
67
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -ltr"})
|
|
68
68
|
al._circuit_breaker_record(tc, "file1.py\nfile2.py")
|
|
69
69
|
assert al._circuit_breaker_check(tc) is None
|
|
70
70
|
|
|
71
71
|
def test_third_call_blocked(self):
|
|
72
72
|
al = _make_agent()
|
|
73
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
73
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -ltr"})
|
|
74
74
|
al._circuit_breaker_record(tc, "file1.py\nfile2.py")
|
|
75
75
|
al._circuit_breaker_record(tc, "file1.py\nfile2.py")
|
|
76
76
|
result = al._circuit_breaker_check(tc)
|
|
@@ -79,7 +79,7 @@ class TestCircuitBreaker:
|
|
|
79
79
|
|
|
80
80
|
def test_blocked_message_contains_previous_result(self):
|
|
81
81
|
al = _make_agent()
|
|
82
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
82
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -ltr"})
|
|
83
83
|
al._circuit_breaker_record(tc, "important_file.py")
|
|
84
84
|
al._circuit_breaker_record(tc, "important_file.py")
|
|
85
85
|
result = al._circuit_breaker_check(tc)
|
|
@@ -87,7 +87,7 @@ class TestCircuitBreaker:
|
|
|
87
87
|
|
|
88
88
|
def test_blocked_message_contains_alternatives(self):
|
|
89
89
|
al = _make_agent()
|
|
90
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
90
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -ltr"})
|
|
91
91
|
al._circuit_breaker_record(tc, "output")
|
|
92
92
|
al._circuit_breaker_record(tc, "output")
|
|
93
93
|
result = al._circuit_breaker_check(tc)
|
|
@@ -95,8 +95,8 @@ class TestCircuitBreaker:
|
|
|
95
95
|
|
|
96
96
|
def test_different_args_not_blocked(self):
|
|
97
97
|
al = _make_agent()
|
|
98
|
-
tc1 = SimpleNamespace(tool_name="bash",
|
|
99
|
-
tc2 = SimpleNamespace(tool_name="bash",
|
|
98
|
+
tc1 = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -ltr"})
|
|
99
|
+
tc2 = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -la"})
|
|
100
100
|
al._circuit_breaker_record(tc1, "r1")
|
|
101
101
|
al._circuit_breaker_record(tc1, "r1")
|
|
102
102
|
assert al._circuit_breaker_check(tc1) is not None # Blocked
|
|
@@ -104,8 +104,8 @@ class TestCircuitBreaker:
|
|
|
104
104
|
|
|
105
105
|
def test_different_tools_not_blocked(self):
|
|
106
106
|
al = _make_agent()
|
|
107
|
-
tc1 = SimpleNamespace(tool_name="bash",
|
|
108
|
-
tc2 = SimpleNamespace(tool_name="grep",
|
|
107
|
+
tc1 = SimpleNamespace(tool_name="bash", args_dict={"command":"ls"})
|
|
108
|
+
tc2 = SimpleNamespace(tool_name="grep", args_dict={"pattern":"foo"})
|
|
109
109
|
al._circuit_breaker_record(tc1, "r1")
|
|
110
110
|
al._circuit_breaker_record(tc1, "r1")
|
|
111
111
|
assert al._circuit_breaker_check(tc1) is not None
|
|
@@ -113,7 +113,7 @@ class TestCircuitBreaker:
|
|
|
113
113
|
|
|
114
114
|
def test_already_attempted_summary(self):
|
|
115
115
|
al = _make_agent()
|
|
116
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
116
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command":"ls"})
|
|
117
117
|
al._circuit_breaker_record(tc, "output1")
|
|
118
118
|
al._circuit_breaker_record(tc, "output1")
|
|
119
119
|
result = al._circuit_breaker_check(tc)
|
|
@@ -327,7 +327,7 @@ class TestRealWorldLoops:
|
|
|
327
327
|
def test_ls_ltr_loop(self):
|
|
328
328
|
"""User reports: `ls -ltr` runs 5+ times."""
|
|
329
329
|
al = _make_agent()
|
|
330
|
-
tc = SimpleNamespace(tool_name="bash",
|
|
330
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command":"ls -ltr"})
|
|
331
331
|
|
|
332
332
|
# First 2 calls go through
|
|
333
333
|
al._circuit_breaker_record(tc, "total 48\n-rw-r--r-- 1 user user 1234 auth.py")
|
|
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.6.5 → drydock_cli-0.6.7}/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.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-0.6.5 → drydock_cli-0.6.7}/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.6.5 → drydock_cli-0.6.7}/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.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-0.6.5 → drydock_cli-0.6.7}/drydock/cli/textual_ui/widgets/chat_input/text_area.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|