drydock-cli 2.9.87__tar.gz → 2.9.91__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/PKG-INFO +1 -1
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agent_loop.py +18 -4
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/policy.py +10 -1
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/policy_union.py +62 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/bash.py +2 -2
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/pyproject.toml +1 -1
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_config_paths.py +14 -3
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_config_resolution.py +3 -1
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_grammar.py +88 -1
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/uv.lock +1 -1
- drydock_cli-2.9.87/tests/core/test_circuit_breaker_count_escalation.py +0 -94
- drydock_cli-2.9.87/tests/core/test_circuit_breaker_readonly_threshold.py +0 -93
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/.gitignore +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/LICENSE +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/NOTICE +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/docs/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/__main__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auto_solve.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/constraint_extract.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/constraint_hint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/goal.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/_llamacpp_converter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/logger.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/gemma4_math.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/gemma4_slim.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/slug.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/spec_check.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/algebra_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/logic_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prolog_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/set_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/solve_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/stats_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/units_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/types.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/utils.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/gap_detector.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/ingest.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/checklist/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/config.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/scan_sessions.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/whats_new.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/install_tests/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/install_tests/publish/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/install_tests/windows/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/scripts/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/scripts/_archived_eval_harness/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/scripts/llm/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/conftest.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/conftest.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/common.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/utils.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stress/__init__.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stress/test_io_thrash.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agents.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_algebra_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_api_error_recovery.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_approval_modal_stray_keys.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_auto_retrieve_soft_nudge.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_auto_solve.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_chemistry_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_classifier.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_dispatch_report.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_gemma4_anti_loop_migration.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_goal.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_integration.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_linear_algebra_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_logic_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_math_docs_lazy_injection.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_mcp_stdio_command_normalization.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_message_id.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_middleware.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_number_theory_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_prolog_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_read_file_notebook_slim.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_rejudge_hle.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_retrieve_project_detection.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_safe_parse_tool_args.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_search_replace_syntax_rollback.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_session_log_event.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_session_publish_on_resume.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_set_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_smoke.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_solve_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_specialist_math_tools_hidden.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_stats_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tool_call_loops_regression_suite.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tool_stop_injected_scope.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_units_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_validation_error_scrub.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_workloads.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_pre_rename_hook.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_missing_main_module.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_multifile_rename.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/web/README.md +0 -0
- {drydock_cli-2.9.87 → drydock_cli-2.9.91}/worked_examples/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.9.
|
|
3
|
+
Version: 2.9.91
|
|
4
4
|
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -21,7 +21,7 @@ from pydantic import BaseModel
|
|
|
21
21
|
|
|
22
22
|
from drydock.cli.terminal_setup import detect_terminal
|
|
23
23
|
from drydock.core.agents.manager import AgentManager
|
|
24
|
-
from drydock.core.agents.models import AgentProfile, BuiltinAgentName
|
|
24
|
+
from drydock.core.agents.models import AgentProfile, AgentType, BuiltinAgentName
|
|
25
25
|
from drydock.core.config import Backend, ProviderConfig, DrydockConfig
|
|
26
26
|
from drydock.core.llm.backend.factory import BACKEND_FACTORY
|
|
27
27
|
from drydock.core.llm.exceptions import BackendError
|
|
@@ -1174,9 +1174,23 @@ class AgentLoop:
|
|
|
1174
1174
|
# a final text response. 18 = 3× nudge threshold —
|
|
1175
1175
|
# the nudge has fired AT LEAST twice without effect.
|
|
1176
1176
|
# Gated by DRYDOCK_ADAPTIVE_BUDGET=1 (default ON).
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1177
|
+
#
|
|
1178
|
+
# SKIP for subagents (explore/diagnostic/planner/builder)
|
|
1179
|
+
# — they are designed to be read-mostly and their parent
|
|
1180
|
+
# owns the overall deadline. Firing inside a subagent
|
|
1181
|
+
# made it return completed=False with the "Stopping
|
|
1182
|
+
# exploration" nudge as content; the parent read that
|
|
1183
|
+
# and dispatched ANOTHER subagent on a related question,
|
|
1184
|
+
# repeating indefinitely. Observed 2026-06-06 in user's
|
|
1185
|
+
# slide-reviewer drydock session: 28-minute loop of
|
|
1186
|
+
# back-to-back explore dispatches, each cut off at 18
|
|
1187
|
+
# read-only calls. The subagent's max_turns budget +
|
|
1188
|
+
# the parent's own ADAPTIVE-BUDGET still cap runtime.
|
|
1189
|
+
if (
|
|
1190
|
+
os.environ.get("DRYDOCK_ADAPTIVE_BUDGET", "1")
|
|
1191
|
+
.strip().lower() not in ("0", "false", "no")
|
|
1192
|
+
and self.agent_profile.agent_type != AgentType.SUBAGENT
|
|
1193
|
+
):
|
|
1180
1194
|
_streak = getattr(self, "_readonly_streak", 0)
|
|
1181
1195
|
if _streak >= 18:
|
|
1182
1196
|
self.stats.adaptive_budget_stops += 1
|
|
@@ -89,8 +89,17 @@ def select_grammar(
|
|
|
89
89
|
)
|
|
90
90
|
return None, None
|
|
91
91
|
|
|
92
|
+
# Tighten the schema: Pydantic `Field(default="")` markers in
|
|
93
|
+
# drydock args models leak as non-required JSON-Schema fields, and
|
|
94
|
+
# the grammar then lets the model emit empty paths / no-content
|
|
95
|
+
# writes. Reuse the union-grammar tightener. See policy_union for
|
|
96
|
+
# the heuristic.
|
|
97
|
+
from drydock.core.llm.grammar.policy_union import _tighten_args_schema
|
|
92
98
|
try:
|
|
93
|
-
|
|
99
|
+
raw_schema = args_model.model_json_schema()
|
|
100
|
+
tight_schema = _tighten_args_schema(raw_schema)
|
|
101
|
+
from drydock.core.llm.grammar import json_schema_to_gbnf
|
|
102
|
+
gbnf = json_schema_to_gbnf(tight_schema)
|
|
94
103
|
except Exception as e:
|
|
95
104
|
logger.warning(
|
|
96
105
|
"[GRAMMAR-POLICY] failed to compile %s args to GBNF: %s",
|
|
@@ -44,6 +44,67 @@ _COMMON_RULES = ("space", "string", "char", "boolean", "null", "number",
|
|
|
44
44
|
"integer", "value")
|
|
45
45
|
|
|
46
46
|
|
|
47
|
+
def _tighten_args_schema(schema: dict[str, Any]) -> dict[str, Any]:
|
|
48
|
+
"""Force fields with vacuous defaults to be required in the grammar.
|
|
49
|
+
|
|
50
|
+
Pydantic args models in drydock use `Field(default="")` so the
|
|
51
|
+
AUTO-INFER recovery path can rewrite partial calls. But that makes
|
|
52
|
+
the JSON Schema mark those fields as optional, and the grammar then
|
|
53
|
+
accepts `{}` as valid args — the model under grammar emits empty
|
|
54
|
+
paths and garbage content because the schema permits it.
|
|
55
|
+
Concretely: WriteFileArgs.path defaults to "" and the model under
|
|
56
|
+
grammar emitted 18 writes with `path=None` and identical 428-char
|
|
57
|
+
`out0 = out0\\nout1 = out1\\n...` gibberish (2026-06-06 v2.9.87 batch,
|
|
58
|
+
circuit-fibsqrt trial).
|
|
59
|
+
|
|
60
|
+
Heuristic: a field with default value `""`, `[]`, `{}`, or `None`
|
|
61
|
+
(when the type isn't nullable) is "vacuous" — the default never
|
|
62
|
+
represents a real intent, it's a placeholder for the recovery
|
|
63
|
+
machinery. Strip the default from such fields and add them to
|
|
64
|
+
`required`. Boolean / numeric / non-empty-string defaults are
|
|
65
|
+
legitimate optionals and left alone.
|
|
66
|
+
|
|
67
|
+
Returns a NEW dict; does not mutate the input.
|
|
68
|
+
"""
|
|
69
|
+
if not isinstance(schema, dict):
|
|
70
|
+
return schema
|
|
71
|
+
out = dict(schema)
|
|
72
|
+
props = dict(out.get("properties") or {})
|
|
73
|
+
if not props:
|
|
74
|
+
return out
|
|
75
|
+
required = list(out.get("required") or [])
|
|
76
|
+
for name, spec in list(props.items()):
|
|
77
|
+
if not isinstance(spec, dict):
|
|
78
|
+
continue
|
|
79
|
+
if "default" not in spec:
|
|
80
|
+
continue
|
|
81
|
+
default = spec["default"]
|
|
82
|
+
is_vacuous = False
|
|
83
|
+
if default == "" or default == [] or default == {}:
|
|
84
|
+
is_vacuous = True
|
|
85
|
+
elif default is None:
|
|
86
|
+
# `default=None` is fine when the type is nullable, e.g.
|
|
87
|
+
# ReadFileArgs.limit (type: int|null). It's a problem only
|
|
88
|
+
# for fields whose schema type doesn't allow null — those
|
|
89
|
+
# are buggy-optionals. Detect via anyOf branches.
|
|
90
|
+
any_of = spec.get("anyOf") or []
|
|
91
|
+
type_allows_null = any(
|
|
92
|
+
isinstance(b, dict) and b.get("type") == "null"
|
|
93
|
+
for b in any_of
|
|
94
|
+
) or spec.get("type") == "null"
|
|
95
|
+
if not type_allows_null:
|
|
96
|
+
is_vacuous = True
|
|
97
|
+
if is_vacuous:
|
|
98
|
+
new_spec = {k: v for k, v in spec.items() if k != "default"}
|
|
99
|
+
props[name] = new_spec
|
|
100
|
+
if name not in required:
|
|
101
|
+
required.append(name)
|
|
102
|
+
out["properties"] = props
|
|
103
|
+
if required:
|
|
104
|
+
out["required"] = required
|
|
105
|
+
return out
|
|
106
|
+
|
|
107
|
+
|
|
47
108
|
def build_union_gbnf(
|
|
48
109
|
tool_specs: list[tuple[str, type]],
|
|
49
110
|
) -> str | None:
|
|
@@ -68,6 +129,7 @@ def build_union_gbnf(
|
|
|
68
129
|
except Exception as e:
|
|
69
130
|
logger.debug("[UNION] %s schema err: %s — skipping", tool_name, e)
|
|
70
131
|
continue
|
|
132
|
+
args_schema = _tighten_args_schema(args_schema)
|
|
71
133
|
one_of_branches.append({
|
|
72
134
|
"type": "object",
|
|
73
135
|
"properties": {
|
|
@@ -1305,7 +1305,7 @@ class Bash(
|
|
|
1305
1305
|
if not _is_write_cmd:
|
|
1306
1306
|
_run_cnt = run_count_state.get(args.command, 0) + 1
|
|
1307
1307
|
run_count_state[args.command] = _run_cnt
|
|
1308
|
-
if _run_cnt >=
|
|
1308
|
+
if _run_cnt >= 3:
|
|
1309
1309
|
cmd_preview = args.command[:80]
|
|
1310
1310
|
# Truncate the previous stdout heavily so the
|
|
1311
1311
|
# loop-breaker preamble isn't overshadowed by full
|
|
@@ -1346,7 +1346,7 @@ class Bash(
|
|
|
1346
1346
|
if returncode != 0:
|
|
1347
1347
|
err_count = err_state.get(args.command, 0) + 1
|
|
1348
1348
|
err_state[args.command] = err_count
|
|
1349
|
-
if err_count >=
|
|
1349
|
+
if err_count >= 3:
|
|
1350
1350
|
cmd_preview = args.command[:80]
|
|
1351
1351
|
notice = (
|
|
1352
1352
|
f"[NOTICE: `{cmd_preview}` has failed with a non-zero "
|
|
@@ -194,13 +194,19 @@ class TestUserToolsDirs:
|
|
|
194
194
|
|
|
195
195
|
|
|
196
196
|
class TestUserSkillsDirs:
|
|
197
|
-
def test_returns_empty_when_user_not_in_sources(
|
|
197
|
+
def test_returns_empty_when_user_not_in_sources(
|
|
198
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
199
|
+
) -> None:
|
|
200
|
+
# Patch DRYDOCK_ROOT so bundled skills dir doesn't exist, isolating
|
|
201
|
+
# the "user" source gate check.
|
|
202
|
+
monkeypatch.setattr("drydock.DRYDOCK_ROOT", tmp_path)
|
|
198
203
|
mgr = HarnessFilesManager(sources=("project",))
|
|
199
204
|
assert mgr.user_skills_dirs == []
|
|
200
205
|
|
|
201
206
|
def test_returns_empty_when_dir_does_not_exist(
|
|
202
207
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
203
208
|
) -> None:
|
|
209
|
+
monkeypatch.setattr("drydock.DRYDOCK_ROOT", tmp_path)
|
|
204
210
|
monkeypatch.setattr("drydock.core.paths._drydock_home._DEFAULT_DRYDOCK_HOME", tmp_path)
|
|
205
211
|
mgr = HarnessFilesManager(sources=("user",))
|
|
206
212
|
assert mgr.user_skills_dirs == []
|
|
@@ -208,8 +214,13 @@ class TestUserSkillsDirs:
|
|
|
208
214
|
def test_returns_path_when_user_in_sources_and_dir_exists(
|
|
209
215
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
210
216
|
) -> None:
|
|
211
|
-
|
|
212
|
-
|
|
217
|
+
fake_root = tmp_path / "pkg"
|
|
218
|
+
fake_root.mkdir()
|
|
219
|
+
fake_home = tmp_path / "home"
|
|
220
|
+
fake_home.mkdir()
|
|
221
|
+
monkeypatch.setattr("drydock.DRYDOCK_ROOT", fake_root)
|
|
222
|
+
monkeypatch.setattr("drydock.core.paths._drydock_home._DEFAULT_DRYDOCK_HOME", fake_home)
|
|
223
|
+
skills_dir = fake_home / "skills"
|
|
213
224
|
skills_dir.mkdir()
|
|
214
225
|
mgr = HarnessFilesManager(sources=("user",))
|
|
215
226
|
assert mgr.user_skills_dirs == [skills_dir]
|
|
@@ -102,7 +102,9 @@ class TestAutoCompactThresholdFallback:
|
|
|
102
102
|
assert cfg.get_active_model().auto_compact_threshold == 99_000
|
|
103
103
|
|
|
104
104
|
def test_default_global_threshold_used_when_nothing_set(self) -> None:
|
|
105
|
-
|
|
105
|
+
# context_window must exceed the global default (200K) or the ceiling
|
|
106
|
+
# clamp (context_window - 4096) fires and the assertion fails.
|
|
107
|
+
model = ModelConfig(name="m", provider="p", alias="m", context_window=500_000)
|
|
106
108
|
cfg = build_test_drydock_config(models=[model], active_model="m")
|
|
107
109
|
assert cfg.get_active_model().auto_compact_threshold == 200_000
|
|
108
110
|
|
|
@@ -22,7 +22,11 @@ from drydock.core.llm.grammar.policy import (
|
|
|
22
22
|
apply_grammar,
|
|
23
23
|
select_grammar,
|
|
24
24
|
)
|
|
25
|
-
from drydock.core.llm.grammar.policy_union import
|
|
25
|
+
from drydock.core.llm.grammar.policy_union import (
|
|
26
|
+
_tighten_args_schema,
|
|
27
|
+
build_union_gbnf,
|
|
28
|
+
select_union_grammar,
|
|
29
|
+
)
|
|
26
30
|
|
|
27
31
|
|
|
28
32
|
# ---------------------------------------------------------------------------
|
|
@@ -321,3 +325,86 @@ def test_select_union_grammar_empty_tools_returns_none(monkeypatch):
|
|
|
321
325
|
tool_manager=mgr,
|
|
322
326
|
)
|
|
323
327
|
assert gbnf is None
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
# ---------------------------------------------------------------------------
|
|
331
|
+
# Regression: vacuous-default fields must become grammar-required.
|
|
332
|
+
# v2.9.87 batch had 18 write_file calls with path=None and identical
|
|
333
|
+
# 428-char `out0 = out0\nout1 = out1\n...` garbage content because the
|
|
334
|
+
# pydantic schema (path: str = Field(default="")) marked path as
|
|
335
|
+
# non-required, the grammar accepted the empty default, and the model
|
|
336
|
+
# committed to whatever fit. The tightener strips those defaults.
|
|
337
|
+
# ---------------------------------------------------------------------------
|
|
338
|
+
|
|
339
|
+
def test_tighten_args_schema_forces_empty_string_defaults_required():
|
|
340
|
+
schema = {
|
|
341
|
+
"properties": {
|
|
342
|
+
"path": {"type": "string", "default": ""},
|
|
343
|
+
"content": {"type": "string", "default": ""},
|
|
344
|
+
"overwrite": {"type": "boolean", "default": True},
|
|
345
|
+
},
|
|
346
|
+
}
|
|
347
|
+
out = _tighten_args_schema(schema)
|
|
348
|
+
assert set(out["required"]) == {"path", "content"}
|
|
349
|
+
assert "default" not in out["properties"]["path"]
|
|
350
|
+
assert "default" not in out["properties"]["content"]
|
|
351
|
+
# legit boolean default left alone
|
|
352
|
+
assert out["properties"]["overwrite"]["default"] is True
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def test_tighten_args_schema_preserves_nullable_optionals():
|
|
356
|
+
# ReadFileArgs.limit pattern: Optional[int] = None → type allows null,
|
|
357
|
+
# default=null is a legit "no limit" — must NOT be forced required.
|
|
358
|
+
schema = {
|
|
359
|
+
"properties": {
|
|
360
|
+
"path": {"type": "string"},
|
|
361
|
+
"limit": {
|
|
362
|
+
"anyOf": [{"type": "integer"}, {"type": "null"}],
|
|
363
|
+
"default": None,
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
"required": ["path"],
|
|
367
|
+
}
|
|
368
|
+
out = _tighten_args_schema(schema)
|
|
369
|
+
assert out["required"] == ["path"]
|
|
370
|
+
assert out["properties"]["limit"]["default"] is None
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def test_tighten_args_schema_real_write_file_args():
|
|
374
|
+
"""End-to-end with the actual production WriteFileArgs."""
|
|
375
|
+
from drydock.core.tools.builtins.write_file import WriteFileArgs
|
|
376
|
+
raw = WriteFileArgs.model_json_schema()
|
|
377
|
+
# baseline: pydantic leaves it open
|
|
378
|
+
assert "required" not in raw or "path" not in raw.get("required", [])
|
|
379
|
+
tight = _tighten_args_schema(raw)
|
|
380
|
+
assert "path" in tight["required"]
|
|
381
|
+
assert "content" in tight["required"]
|
|
382
|
+
# overwrite stays optional
|
|
383
|
+
assert "overwrite" not in tight["required"]
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def test_union_grammar_requires_write_file_path_after_tightener():
|
|
387
|
+
"""The grammar string itself must include the required-fields markers
|
|
388
|
+
for write_file's path. We assert by checking that the GBNF doesn't
|
|
389
|
+
contain a permissive write_file branch that lets path be omitted."""
|
|
390
|
+
from drydock.core.tools.builtins.write_file import WriteFileArgs
|
|
391
|
+
gbnf = build_union_gbnf([("write_file", WriteFileArgs)])
|
|
392
|
+
assert gbnf is not None
|
|
393
|
+
# Tool name + path appear as GBNF string constants (\"-escaped).
|
|
394
|
+
assert '\\"write_file\\"' in gbnf
|
|
395
|
+
assert '\\"path\\"' in gbnf
|
|
396
|
+
assert '\\"content\\"' in gbnf
|
|
397
|
+
# The smoking gun for the bug would be an args body rule that allows
|
|
398
|
+
# `{}` (no required keys). After the tightener, the args body opens
|
|
399
|
+
# with `path-kv "," space content-kv` — path and content are
|
|
400
|
+
# unconditional, overwrite is wrapped in `( ... )?`. Verify the args
|
|
401
|
+
# rule doesn't degenerate to `"{" space "}"`.
|
|
402
|
+
args_rule_line = next(
|
|
403
|
+
(ln for ln in gbnf.splitlines() if "-arguments ::=" in ln),
|
|
404
|
+
"",
|
|
405
|
+
)
|
|
406
|
+
assert args_rule_line, "expected an arguments rule in GBNF"
|
|
407
|
+
assert "path-kv" in args_rule_line # path is in the args body
|
|
408
|
+
assert "content-kv" in args_rule_line # content is in the args body
|
|
409
|
+
# overwrite (optional) should appear wrapped in `( ... )?`
|
|
410
|
+
assert "overwrite-kv )" in args_rule_line and "?" in args_rule_line
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"""Regression test: circuit breaker count escalates on repeated fires.
|
|
2
|
-
|
|
3
|
-
Bug: _circuit_breaker_check returned the NOTE but never incremented the count
|
|
4
|
-
in _tool_call_history when it fired. Every retry got the same "8 times" message,
|
|
5
|
-
so the escalation signal was flat and the model never broke out.
|
|
6
|
-
|
|
7
|
-
Fix: _circuit_breaker_check now increments the count on each fire, giving the
|
|
8
|
-
model an increasing signal that nothing has changed.
|
|
9
|
-
"""
|
|
10
|
-
import unittest
|
|
11
|
-
from unittest.mock import MagicMock
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def _make_loop():
|
|
15
|
-
from drydock.core.agent_loop import AgentLoop
|
|
16
|
-
loop = AgentLoop.__new__(AgentLoop)
|
|
17
|
-
loop._tool_call_history = {}
|
|
18
|
-
loop._get_attempted_summary = lambda: ""
|
|
19
|
-
return loop
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def _make_tc(name, args):
|
|
23
|
-
tc = MagicMock()
|
|
24
|
-
tc.tool_name = name
|
|
25
|
-
tc.args_dict = args
|
|
26
|
-
tc.call_id = "test-id"
|
|
27
|
-
return tc
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def _record(loop, tc, result="output"):
|
|
31
|
-
from drydock.core.agent_loop import AgentLoop
|
|
32
|
-
AgentLoop._circuit_breaker_record(loop, tc, result)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class TestCircuitBreakerCountEscalation(unittest.TestCase):
|
|
36
|
-
def test_count_escalates_on_repeated_fires(self):
|
|
37
|
-
"""After the threshold, each fire increments the count so the message escalates."""
|
|
38
|
-
loop = _make_loop()
|
|
39
|
-
tc = _make_tc("bash", {"command": "python3 -m tool_agent run foo"})
|
|
40
|
-
|
|
41
|
-
# Reach threshold (8 recorded calls)
|
|
42
|
-
for _ in range(8):
|
|
43
|
-
_record(loop, tc, "some output")
|
|
44
|
-
|
|
45
|
-
# First fire: should mention 8
|
|
46
|
-
msg1 = loop._circuit_breaker_check(tc)
|
|
47
|
-
self.assertIsNotNone(msg1)
|
|
48
|
-
self.assertIn("8 times", msg1)
|
|
49
|
-
|
|
50
|
-
# Second fire (without any external record call): should mention 9
|
|
51
|
-
msg2 = loop._circuit_breaker_check(tc)
|
|
52
|
-
self.assertIsNotNone(msg2)
|
|
53
|
-
self.assertIn("9 times", msg2)
|
|
54
|
-
|
|
55
|
-
# Third fire: should mention 10
|
|
56
|
-
msg3 = loop._circuit_breaker_check(tc)
|
|
57
|
-
self.assertIsNotNone(msg3)
|
|
58
|
-
self.assertIn("10 times", msg3)
|
|
59
|
-
|
|
60
|
-
def test_last_result_preserved_across_fires(self):
|
|
61
|
-
"""last_result shown in NOTE stays as the real tool output, not a prior NOTE."""
|
|
62
|
-
loop = _make_loop()
|
|
63
|
-
tc = _make_tc("bash", {"command": "echo hello"})
|
|
64
|
-
|
|
65
|
-
for _ in range(8):
|
|
66
|
-
_record(loop, tc, "hello\n")
|
|
67
|
-
|
|
68
|
-
msg1 = loop._circuit_breaker_check(tc)
|
|
69
|
-
self.assertIn("hello", msg1)
|
|
70
|
-
|
|
71
|
-
# After a second fire, last_result should still be the original output
|
|
72
|
-
msg2 = loop._circuit_breaker_check(tc)
|
|
73
|
-
assert msg2 is not None, "circuit breaker should fire on 10th call"
|
|
74
|
-
self.assertIn("hello", msg2)
|
|
75
|
-
# Not the prior NOTE text
|
|
76
|
-
self.assertNotIn("NOTE: this exact call", msg2.split("Last result:")[1])
|
|
77
|
-
|
|
78
|
-
def test_count_below_threshold_unaffected(self):
|
|
79
|
-
"""Calls below threshold still return None and don't mutate state unexpectedly."""
|
|
80
|
-
loop = _make_loop()
|
|
81
|
-
tc = _make_tc("bash", {"command": "ls"})
|
|
82
|
-
|
|
83
|
-
for i in range(7):
|
|
84
|
-
result = loop._circuit_breaker_check(tc)
|
|
85
|
-
self.assertIsNone(result, f"Should not fire on call {i+1} (count={i})")
|
|
86
|
-
_record(loop, tc)
|
|
87
|
-
|
|
88
|
-
# 8th call is still below threshold (count=7 < 8)
|
|
89
|
-
result = loop._circuit_breaker_check(tc)
|
|
90
|
-
self.assertIsNone(result)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if __name__ == "__main__":
|
|
94
|
-
unittest.main()
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"""Regression test: read_file circuit breaker fires at threshold 5, not 12.
|
|
2
|
-
|
|
3
|
-
Stress sessions reset every 45 prompts. With threshold=12, the model could
|
|
4
|
-
loop 11× on the same read_file call before being blocked — admiral advisories
|
|
5
|
-
fire at 3× but are ignored. Threshold=5 actually engages the block before
|
|
6
|
-
the session's budget is exhausted.
|
|
7
|
-
"""
|
|
8
|
-
import hashlib
|
|
9
|
-
import json
|
|
10
|
-
import unittest
|
|
11
|
-
from unittest.mock import MagicMock
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def _make_circuit_breaker_check():
|
|
15
|
-
"""Import and bind just the circuit breaker logic for unit testing."""
|
|
16
|
-
from drydock.core.agent_loop import AgentLoop
|
|
17
|
-
|
|
18
|
-
loop = AgentLoop.__new__(AgentLoop)
|
|
19
|
-
loop._tool_call_history = {}
|
|
20
|
-
loop._get_attempted_summary = lambda: ""
|
|
21
|
-
return loop
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class TestCircuitBreakerReadonlyThreshold(unittest.TestCase):
|
|
25
|
-
def _make_tool_call(self, name, args):
|
|
26
|
-
tc = MagicMock()
|
|
27
|
-
tc.tool_name = name
|
|
28
|
-
tc.args_dict = args
|
|
29
|
-
tc.call_id = "test-id"
|
|
30
|
-
return tc
|
|
31
|
-
|
|
32
|
-
def _record(self, loop, tool_call, result="some content"):
|
|
33
|
-
from drydock.core.agent_loop import AgentLoop
|
|
34
|
-
AgentLoop._circuit_breaker_record(loop, tool_call, result)
|
|
35
|
-
|
|
36
|
-
def test_read_file_blocks_at_5(self):
|
|
37
|
-
"""Circuit breaker fires on the 6th identical call (threshold=5 means count>=5 blocks)."""
|
|
38
|
-
loop = _make_circuit_breaker_check()
|
|
39
|
-
tc = self._make_tool_call("read_file", {"path": "foo.py", "offset": 150, "limit": 100})
|
|
40
|
-
|
|
41
|
-
# First 5 calls: should not block
|
|
42
|
-
for i in range(5):
|
|
43
|
-
result = loop._circuit_breaker_check(tc)
|
|
44
|
-
self.assertIsNone(result, f"Expected no block on call {i+1}, got: {result}")
|
|
45
|
-
self._record(loop, tc)
|
|
46
|
-
|
|
47
|
-
# 6th call: should block (count=5 >= threshold=5)
|
|
48
|
-
result = loop._circuit_breaker_check(tc)
|
|
49
|
-
self.assertIsNotNone(result, "Expected circuit breaker to fire on 6th identical read_file")
|
|
50
|
-
self.assertIn("read_file", result)
|
|
51
|
-
|
|
52
|
-
def test_bash_still_blocks_at_8(self):
|
|
53
|
-
"""bash threshold=8, so blocks on 9th call (count=8 >= threshold=8)."""
|
|
54
|
-
loop = _make_circuit_breaker_check()
|
|
55
|
-
tc = self._make_tool_call("bash", {"command": "ls -la"})
|
|
56
|
-
|
|
57
|
-
for i in range(8):
|
|
58
|
-
result = loop._circuit_breaker_check(tc)
|
|
59
|
-
self.assertIsNone(result, f"Expected no block on bash call {i+1}")
|
|
60
|
-
self._record(loop, tc)
|
|
61
|
-
|
|
62
|
-
result = loop._circuit_breaker_check(tc)
|
|
63
|
-
self.assertIsNotNone(result, "Expected circuit breaker to fire on 9th identical bash")
|
|
64
|
-
|
|
65
|
-
def test_grep_blocks_at_5(self):
|
|
66
|
-
loop = _make_circuit_breaker_check()
|
|
67
|
-
tc = self._make_tool_call("grep", {"pattern": "def foo", "path": "bar.py"})
|
|
68
|
-
|
|
69
|
-
for i in range(5):
|
|
70
|
-
result = loop._circuit_breaker_check(tc)
|
|
71
|
-
self.assertIsNone(result)
|
|
72
|
-
self._record(loop, tc)
|
|
73
|
-
|
|
74
|
-
# 6th call blocks (count=5 >= threshold=5)
|
|
75
|
-
result = loop._circuit_breaker_check(tc)
|
|
76
|
-
self.assertIsNotNone(result, "Expected circuit breaker to fire on 6th identical grep")
|
|
77
|
-
|
|
78
|
-
def test_different_args_not_blocked(self):
|
|
79
|
-
loop = _make_circuit_breaker_check()
|
|
80
|
-
|
|
81
|
-
# 5 reads of foo.py at offset 150
|
|
82
|
-
tc1 = self._make_tool_call("read_file", {"path": "foo.py", "offset": 150})
|
|
83
|
-
for _ in range(5):
|
|
84
|
-
self._record(loop, tc1)
|
|
85
|
-
|
|
86
|
-
# Different offset should not be blocked
|
|
87
|
-
tc2 = self._make_tool_call("read_file", {"path": "foo.py", "offset": 200})
|
|
88
|
-
result = loop._circuit_breaker_check(tc2)
|
|
89
|
-
self.assertIsNone(result, "Different args should not be blocked")
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if __name__ == "__main__":
|
|
93
|
-
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|