drydock-cli 2.8.17__tar.gz → 2.8.19__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.8.19/.auto_release.lock +1 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/PKG-INFO +50 -2
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/README.md +49 -1
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/SOVEREIGN_PRD.md +111 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/commands.py +9 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/app.py +211 -15
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agent_loop.py +55 -6
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/pyproject.toml +1 -1
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/auto_release.sh +18 -4
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_integration.py +12 -4
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_loop_detection.py +71 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_real_issues.py +6 -1
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/trip_log.md +216 -0
- drydock_cli-2.8.17/.auto_release.lock +0 -1
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.gitignore +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.python-version +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.typos.toml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.vscode/extensions.json +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.vscode/launch.json +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.vscode/settings.json +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/AGENTS.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/Admiral.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/CHANGELOG.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/CLAUDE.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/DEEP_NOIR_PRD.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/HLE_PRD.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/JETSON_BENCH.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/LICENSE +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/NOTICE +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/action.yml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/README.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/README.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/acp-setup.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/BASELINE_412.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/Drydock_rebrand.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/PRD.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/drydock_terms.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/resume.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/__main__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/logger.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/slug.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/types.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/utils.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/config.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/whats_new.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock-acp.spec +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/flake.lock +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/flake.nix +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/outlook_draft_assistant.tar.gz +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/README.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/config_base.toml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/config_best.toml +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/domain_spec.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/experimenter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/kernel.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/mini_prd.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/proposer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/results.tsv +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/README.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/auto_test_loop.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/monitor_test_battery.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/overnight_agents_test.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/test_bank.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/test_full.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/test_smoke.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/tui_test.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/backup.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/bump_version.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/classify_pulse.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/consume_retrieval_queue.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/fetch_arxiv_abstracts.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/hle_eval.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/hle_eval_seed.jsonl +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/notify_release.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/queue_top.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/start_steering_sidecar.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/conftest.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/common.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/utils.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/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.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agents.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_classifier.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_hle_typing.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_message_id.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_middleware.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_smoke.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_workloads.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/uv.lock +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/README.md +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
739611
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.19
|
|
4
4
|
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -284,7 +284,7 @@ First run creates a config at `~/.drydock/config.toml` and prompts for your prov
|
|
|
284
284
|
- **Loop Detection**: Advisory-only detection that nudges the model away from repetitive actions without blocking.
|
|
285
285
|
- **Conda/Pip Support**: Auto-approves `pip install`, `conda install`, `pytest`, and other dev commands.
|
|
286
286
|
- **Bundled Skills**: Ships with skills like `create-presentation` for PowerPoint generation.
|
|
287
|
-
- **MCP Support**: Connect Model Context Protocol servers
|
|
287
|
+
- **MCP Support**: Connect Model Context Protocol servers via the `/mcp` slash command or `~/.drydock/config.toml`. See [MCP Servers](#mcp-servers).
|
|
288
288
|
- **Safety First**: Tool execution approval with `--dangerously-skip-permissions` for full auto-approve.
|
|
289
289
|
|
|
290
290
|
### Built-in Agents
|
|
@@ -379,14 +379,62 @@ DryDock discovers skills from:
|
|
|
379
379
|
|
|
380
380
|
### MCP Servers
|
|
381
381
|
|
|
382
|
+
DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
|
|
383
|
+
|
|
384
|
+
#### Option A — `/mcp` slash command (recommended)
|
|
385
|
+
|
|
386
|
+
Inside the TUI:
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
/mcp # list configured servers + usage
|
|
390
|
+
/mcp examples # ready-to-paste examples
|
|
391
|
+
/mcp add stdio fetch_server uvx mcp-server-fetch
|
|
392
|
+
/mcp add stdio filesystem npx -y @modelcontextprotocol/server-filesystem /data
|
|
393
|
+
/mcp add http weather https://mcp.example.com
|
|
394
|
+
/mcp add streamable-http myapi https://api.example.com/mcp
|
|
395
|
+
/mcp remove fetch_server
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
The command writes to `~/.drydock/config.toml`. Restart DryDock to load new servers.
|
|
399
|
+
|
|
400
|
+
#### Option B — edit `~/.drydock/config.toml` directly
|
|
401
|
+
|
|
402
|
+
Use this for advanced fields (auth headers, env-var API keys, custom timeouts, `sampling_enabled`). Three transports: `stdio`, `http`, `streamable-http`.
|
|
403
|
+
|
|
382
404
|
```toml
|
|
383
405
|
[[mcp_servers]]
|
|
384
406
|
name = "fetch_server"
|
|
385
407
|
transport = "stdio"
|
|
386
408
|
command = "uvx"
|
|
387
409
|
args = ["mcp-server-fetch"]
|
|
410
|
+
|
|
411
|
+
[[mcp_servers]]
|
|
412
|
+
name = "filesystem"
|
|
413
|
+
transport = "stdio"
|
|
414
|
+
command = "npx"
|
|
415
|
+
args = ["-y", "@modelcontextprotocol/server-filesystem", "/data"]
|
|
416
|
+
env = { LOG_LEVEL = "info" }
|
|
417
|
+
startup_timeout_sec = 10.0
|
|
418
|
+
tool_timeout_sec = 60.0
|
|
419
|
+
sampling_enabled = true
|
|
420
|
+
|
|
421
|
+
[[mcp_servers]]
|
|
422
|
+
name = "github"
|
|
423
|
+
transport = "streamable-http"
|
|
424
|
+
url = "https://api.githubcopilot.com/mcp"
|
|
425
|
+
api_key_env = "GITHUB_TOKEN" # reads token from this env var
|
|
426
|
+
api_key_header = "Authorization"
|
|
427
|
+
api_key_format = "Bearer {token}"
|
|
428
|
+
|
|
429
|
+
[[mcp_servers]]
|
|
430
|
+
name = "weather"
|
|
431
|
+
transport = "http"
|
|
432
|
+
url = "https://mcp.weather.example.com"
|
|
433
|
+
headers = { "X-Tenant" = "drydock" }
|
|
388
434
|
```
|
|
389
435
|
|
|
436
|
+
Verify a server loaded by running `/help` inside the TUI and checking for `<name>__*` prefixed tools. Server errors show up in `~/.drydock/logs/`.
|
|
437
|
+
|
|
390
438
|
## Testing
|
|
391
439
|
|
|
392
440
|
DryDock uses a **shakedown harness** (`scripts/shakedown.py`) that drives the real TUI via pexpect and judges on user-perceptible criteria — not tool-call counts.
|
|
@@ -229,7 +229,7 @@ First run creates a config at `~/.drydock/config.toml` and prompts for your prov
|
|
|
229
229
|
- **Loop Detection**: Advisory-only detection that nudges the model away from repetitive actions without blocking.
|
|
230
230
|
- **Conda/Pip Support**: Auto-approves `pip install`, `conda install`, `pytest`, and other dev commands.
|
|
231
231
|
- **Bundled Skills**: Ships with skills like `create-presentation` for PowerPoint generation.
|
|
232
|
-
- **MCP Support**: Connect Model Context Protocol servers
|
|
232
|
+
- **MCP Support**: Connect Model Context Protocol servers via the `/mcp` slash command or `~/.drydock/config.toml`. See [MCP Servers](#mcp-servers).
|
|
233
233
|
- **Safety First**: Tool execution approval with `--dangerously-skip-permissions` for full auto-approve.
|
|
234
234
|
|
|
235
235
|
### Built-in Agents
|
|
@@ -324,14 +324,62 @@ DryDock discovers skills from:
|
|
|
324
324
|
|
|
325
325
|
### MCP Servers
|
|
326
326
|
|
|
327
|
+
DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
|
|
328
|
+
|
|
329
|
+
#### Option A — `/mcp` slash command (recommended)
|
|
330
|
+
|
|
331
|
+
Inside the TUI:
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
/mcp # list configured servers + usage
|
|
335
|
+
/mcp examples # ready-to-paste examples
|
|
336
|
+
/mcp add stdio fetch_server uvx mcp-server-fetch
|
|
337
|
+
/mcp add stdio filesystem npx -y @modelcontextprotocol/server-filesystem /data
|
|
338
|
+
/mcp add http weather https://mcp.example.com
|
|
339
|
+
/mcp add streamable-http myapi https://api.example.com/mcp
|
|
340
|
+
/mcp remove fetch_server
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
The command writes to `~/.drydock/config.toml`. Restart DryDock to load new servers.
|
|
344
|
+
|
|
345
|
+
#### Option B — edit `~/.drydock/config.toml` directly
|
|
346
|
+
|
|
347
|
+
Use this for advanced fields (auth headers, env-var API keys, custom timeouts, `sampling_enabled`). Three transports: `stdio`, `http`, `streamable-http`.
|
|
348
|
+
|
|
327
349
|
```toml
|
|
328
350
|
[[mcp_servers]]
|
|
329
351
|
name = "fetch_server"
|
|
330
352
|
transport = "stdio"
|
|
331
353
|
command = "uvx"
|
|
332
354
|
args = ["mcp-server-fetch"]
|
|
355
|
+
|
|
356
|
+
[[mcp_servers]]
|
|
357
|
+
name = "filesystem"
|
|
358
|
+
transport = "stdio"
|
|
359
|
+
command = "npx"
|
|
360
|
+
args = ["-y", "@modelcontextprotocol/server-filesystem", "/data"]
|
|
361
|
+
env = { LOG_LEVEL = "info" }
|
|
362
|
+
startup_timeout_sec = 10.0
|
|
363
|
+
tool_timeout_sec = 60.0
|
|
364
|
+
sampling_enabled = true
|
|
365
|
+
|
|
366
|
+
[[mcp_servers]]
|
|
367
|
+
name = "github"
|
|
368
|
+
transport = "streamable-http"
|
|
369
|
+
url = "https://api.githubcopilot.com/mcp"
|
|
370
|
+
api_key_env = "GITHUB_TOKEN" # reads token from this env var
|
|
371
|
+
api_key_header = "Authorization"
|
|
372
|
+
api_key_format = "Bearer {token}"
|
|
373
|
+
|
|
374
|
+
[[mcp_servers]]
|
|
375
|
+
name = "weather"
|
|
376
|
+
transport = "http"
|
|
377
|
+
url = "https://mcp.weather.example.com"
|
|
378
|
+
headers = { "X-Tenant" = "drydock" }
|
|
333
379
|
```
|
|
334
380
|
|
|
381
|
+
Verify a server loaded by running `/help` inside the TUI and checking for `<name>__*` prefixed tools. Server errors show up in `~/.drydock/logs/`.
|
|
382
|
+
|
|
335
383
|
## Testing
|
|
336
384
|
|
|
337
385
|
DryDock uses a **shakedown harness** (`scripts/shakedown.py`) that drives the real TUI via pexpect and judges on user-perceptible criteria — not tool-call counts.
|
|
@@ -80,6 +80,9 @@ A sovereign AI system that:
|
|
|
80
80
|
- Learns customer-specific knowledge
|
|
81
81
|
- Performs coding and reasoning tasks autonomously
|
|
82
82
|
- Self-diagnoses failures (Admiral) and self-improves (MetaHarness, evaluator)
|
|
83
|
+
- **Operates with engineered curiosity** — actively detects its own gaps,
|
|
84
|
+
retrieves before asserting, ingests unfamiliar context, and treats
|
|
85
|
+
surprise as signal worth chasing rather than noise to suppress
|
|
83
86
|
- Improves continuously without phoning home
|
|
84
87
|
|
|
85
88
|
---
|
|
@@ -363,6 +366,99 @@ Already partially shipped — the system already self-observes.
|
|
|
363
366
|
|
|
364
367
|
---
|
|
365
368
|
|
|
369
|
+
## 5.7 Curiosity Layer — engineered intellectual drive
|
|
370
|
+
|
|
371
|
+
GraphRAG, Deep Noir, and the HLE benchmark together expose a structural
|
|
372
|
+
weakness in Gemma 4 and most small local models: they answer from prior
|
|
373
|
+
when they should retrieve, plateau on familiar patterns, and treat
|
|
374
|
+
"unknown" as something to guess past rather than something to investigate.
|
|
375
|
+
The Curiosity Layer is a first-class drydock directive — both a guiding
|
|
376
|
+
principle in the system prompt and a concrete subsystem — that converts
|
|
377
|
+
that weakness into a feedback loop.
|
|
378
|
+
|
|
379
|
+
**Operating definition (carries into the system prompt):**
|
|
380
|
+
|
|
381
|
+
> Curiosity is an inquisitive, often insatiable desire to understand the
|
|
382
|
+
> unknown — from everyday questions to scientific discovery. In drydock
|
|
383
|
+
> this means: when you notice a gap, you close it; when you encounter
|
|
384
|
+
> something unfamiliar, you investigate before asserting; when you have
|
|
385
|
+
> spare cycles, you explore the corpus rather than idle.
|
|
386
|
+
|
|
387
|
+
**Behaviors required of the agent (enforced via prompt + Deep Noir vector
|
|
388
|
+
candidate + tool wiring):**
|
|
389
|
+
|
|
390
|
+
1. **Retrieve before answering on unfamiliar terms.** Any user message
|
|
391
|
+
containing a named entity, paper title, identifier, API, or symbol
|
|
392
|
+
not present in recent context triggers an automatic `retrieve` call
|
|
393
|
+
against GraphRAG before the first content token. Low-confidence
|
|
394
|
+
retrieval triggers a second pass against the arXiv corpus
|
|
395
|
+
(`/data3/arxiv_corpus/graphrag.sqlite`) instead of falling back to
|
|
396
|
+
`web_search`. Fixes the failure mode logged in
|
|
397
|
+
`project_graphrag_underused.md` (Gemma 4 defaults to web_search on
|
|
398
|
+
general-knowledge HLE questions).
|
|
399
|
+
2. **Treat surprise as signal, not noise.** When the model's own
|
|
400
|
+
probability estimate disagrees with retrieved evidence, with a tool
|
|
401
|
+
result, or with an HLE judge verdict, the disagreement is logged to
|
|
402
|
+
the curiosity queue (`~/.drydock/dispatch/curiosity.jsonl`) and
|
|
403
|
+
surfaces in the next overnight `autonomous_review` tick as a
|
|
404
|
+
candidate for: GraphRAG ingest, prompt refinement, Deep Noir vector
|
|
405
|
+
training data, or LoRA candidate.
|
|
406
|
+
3. **Investigate before asking.** When the user request is
|
|
407
|
+
under-specified, the agent first reads the project (Glob + Read on
|
|
408
|
+
plausible files, `retrieve` against GraphRAG) and proposes a
|
|
409
|
+
concrete interpretation. `ask_user_question` only fires after at
|
|
410
|
+
least one investigation pass — never as a first move on ambiguity.
|
|
411
|
+
4. **Explore on idle.** When drydock is idle for > N minutes and the
|
|
412
|
+
classifier dispatch queues are non-empty, the agent runs a single
|
|
413
|
+
exploratory cycle: pick the highest-priority pattern, ingest fresh
|
|
414
|
+
logs into GraphRAG, generate one hypothesis, log to
|
|
415
|
+
`~/.drydock/curiosity_log.md`. Bounded by a tokens-per-day budget
|
|
416
|
+
so curiosity does not starve user work.
|
|
417
|
+
5. **Open mindset on conflict.** When new evidence contradicts a
|
|
418
|
+
previously asserted answer, the agent prefers the new evidence and
|
|
419
|
+
issues a correction in the same turn. Extends the existing
|
|
420
|
+
"Retrieval vs. Prior" guidance in §10 into an active rule.
|
|
421
|
+
|
|
422
|
+
**Curiosity subsystem deliverables (Phase 3, alongside Deep Noir):**
|
|
423
|
+
|
|
424
|
+
- `drydock.curiosity` module — gap detector, surprise scorer, dispatch
|
|
425
|
+
writer. Reuses classifier infrastructure from §5.6.
|
|
426
|
+
- `~/.drydock/dispatch/curiosity.jsonl` queue + consumer wired into
|
|
427
|
+
`autonomous_review.sh`.
|
|
428
|
+
- System-prompt section embedding the five behaviors above, kept short
|
|
429
|
+
enough for Gemma 4's 20-line prompt budget (`gemma4.md`).
|
|
430
|
+
- Deep Noir vector candidate: "exploration" mode — bias toward retrieval,
|
|
431
|
+
hypothesis enumeration, and reading-before-writing. Trained from
|
|
432
|
+
curiosity-log traces once Deep Noir vector training lands.
|
|
433
|
+
- HLE/eval integration: every HLE failure where the judge reasoning
|
|
434
|
+
contains "no answer extracted" or "incorrect prior" is auto-enqueued
|
|
435
|
+
as a curiosity item — the eval becomes a growth signal, not just
|
|
436
|
+
a scoreboard.
|
|
437
|
+
|
|
438
|
+
**Anti-patterns explicitly forbidden:**
|
|
439
|
+
|
|
440
|
+
- Curiosity does **not** mean asking the user more questions. The
|
|
441
|
+
default is to investigate, not interrogate.
|
|
442
|
+
- Curiosity does **not** override the "advisory-only" rule. Exploration
|
|
443
|
+
cycles never block user work; they consume idle cycles only.
|
|
444
|
+
- Curiosity must **not** become rumination — the tokens-per-day budget
|
|
445
|
+
exists specifically to prevent endless exploration loops on a single
|
|
446
|
+
unfamiliar term.
|
|
447
|
+
|
|
448
|
+
**Acceptance criteria:**
|
|
449
|
+
|
|
450
|
+
- `retrieve` is called on ≥ 80 % of HLE questions before any content
|
|
451
|
+
token (measured via execution traces, Phase 3).
|
|
452
|
+
- `~/.drydock/dispatch/curiosity.jsonl` accumulates ≥ 10 items per
|
|
453
|
+
active week without operator priming.
|
|
454
|
+
- `autonomous_review` ships ≥ 1 prompt/AGENTS.md/vector update per week
|
|
455
|
+
that originated from a curiosity-queue item (not a stress-run signal).
|
|
456
|
+
- HLE general-knowledge category score lifts measurably vs. the
|
|
457
|
+
May 2026 baseline (1/20 = 5 %, 18/20 "empty"); target ≥ 25 %
|
|
458
|
+
in Phase 3, ≥ 40 % in Phase 4.
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
366
462
|
# 6. Adaptive Failure Logic
|
|
367
463
|
|
|
368
464
|
```text
|
|
@@ -383,6 +479,18 @@ If loops detected:
|
|
|
383
479
|
→ loop-break sampling (temp+0.3/0.5, freq_pen 0.4–0.7, fresh seed)
|
|
384
480
|
→ planner reset + diversity strategy
|
|
385
481
|
→ only escalates to FORCE_STOP on pure no-op duplicates
|
|
482
|
+
|
|
483
|
+
If unfamiliar term / named entity / identifier in user input:
|
|
484
|
+
→ mandatory retrieve pass (GraphRAG, then arXiv corpus)
|
|
485
|
+
→ web_search only after both local retrievers return low confidence
|
|
486
|
+
|
|
487
|
+
If model output contradicts retrieved evidence / tool result / judge verdict:
|
|
488
|
+
→ log to ~/.drydock/dispatch/curiosity.jsonl
|
|
489
|
+
→ autonomous_review picks it up next tick as ingest / prompt / vector candidate
|
|
490
|
+
|
|
491
|
+
If idle > N minutes AND classifier queues non-empty:
|
|
492
|
+
→ one exploratory cycle (bounded by tokens-per-day budget)
|
|
493
|
+
→ ingest, hypothesis, curiosity_log entry — never a user-visible action
|
|
386
494
|
```
|
|
387
495
|
|
|
388
496
|
All logic is **advisory-first**. Hard stops are reserved for objectively useless
|
|
@@ -551,6 +659,9 @@ mitigates several of the failure classes already in `MODEL_SHORTCOMINGS.md`.
|
|
|
551
659
|
| Customer cloud dependency | −70 % | Brand promise, qualitative |
|
|
552
660
|
| Task completion rate (interactive) | +35 % | Current shakedown baseline |
|
|
553
661
|
| SWE-bench file match | maintain ≥70 % | 70 % current |
|
|
662
|
+
| `retrieve` calls before content (HLE) | ≥80 % | <5 % observed May 2026 |
|
|
663
|
+
| Curiosity-queue items shipped / week | ≥1 | 0 — queue not built yet |
|
|
664
|
+
| HLE general-knowledge score | ≥25 % Phase 3, ≥40 % Phase 4 | 5 % (1/20 May 2026) |
|
|
554
665
|
|
|
555
666
|
Metrics with "TBD" baselines are explicitly required to be **measured** before
|
|
556
667
|
Phase 2 begins, not estimated.
|
|
@@ -125,6 +125,15 @@ class CommandRegistry:
|
|
|
125
125
|
"/steering off | /steering list).",
|
|
126
126
|
handler="_steering_command",
|
|
127
127
|
),
|
|
128
|
+
"mcp": Command(
|
|
129
|
+
aliases=frozenset(["/mcp"]),
|
|
130
|
+
description="Configure MCP servers in ~/.drydock/config.toml "
|
|
131
|
+
"(usage: /mcp | /mcp add stdio <name> <cmd...> | "
|
|
132
|
+
"/mcp add http <name> <url> | "
|
|
133
|
+
"/mcp add streamable-http <name> <url> | "
|
|
134
|
+
"/mcp remove <name> | /mcp examples).",
|
|
135
|
+
handler="_mcp_command",
|
|
136
|
+
),
|
|
128
137
|
}
|
|
129
138
|
|
|
130
139
|
for command in excluded_commands:
|
|
@@ -421,20 +421,46 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
421
421
|
input_widget.value = ""
|
|
422
422
|
|
|
423
423
|
if self._agent_running:
|
|
424
|
-
#
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
424
|
+
# Slash commands and bash escapes can't be folded into a running
|
|
425
|
+
# turn — they need their own worker. Keep the end-of-turn queue
|
|
426
|
+
# for those. Everything else (plain text) goes straight into the
|
|
427
|
+
# agent's context via `queue_user_injection`, matching Claude
|
|
428
|
+
# Code's "type while busy" behavior: the in-flight task keeps
|
|
429
|
+
# running, and the model sees the new message at the next turn
|
|
430
|
+
# boundary without restarting.
|
|
431
|
+
is_command = value.startswith("/") or value.startswith("!") or (
|
|
432
|
+
value.startswith("&") and self.config.nuage_enabled
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
if is_command:
|
|
436
|
+
if not hasattr(self, "_pending_messages"):
|
|
437
|
+
self._pending_messages: list[str] = []
|
|
438
|
+
import time
|
|
439
|
+
now = time.time()
|
|
440
|
+
last_queue_time = getattr(self, "_last_queue_time", 0)
|
|
441
|
+
if now - last_queue_time < 0.5 and self._pending_messages:
|
|
442
|
+
self._pending_messages[-1] += "\n" + value
|
|
443
|
+
else:
|
|
444
|
+
self._pending_messages.append(value)
|
|
445
|
+
self._last_queue_time = now
|
|
446
|
+
preview = value[:60] + "..." if len(value) > 60 else value
|
|
447
|
+
self.notify(
|
|
448
|
+
f"Queued for after current task: \"{preview}\" "
|
|
449
|
+
f"({len(self._pending_messages)} pending)"
|
|
450
|
+
)
|
|
451
|
+
return
|
|
452
|
+
|
|
453
|
+
# Plain text → inject into the running agent's context. Render
|
|
454
|
+
# a user-message bubble immediately so the UI shows what landed,
|
|
455
|
+
# and notify so the user knows it didn't displace the current
|
|
456
|
+
# work.
|
|
457
|
+
self.agent_loop.queue_user_injection(value)
|
|
458
|
+
await self._mount_and_scroll(UserMessage(value))
|
|
436
459
|
preview = value[:60] + "..." if len(value) > 60 else value
|
|
437
|
-
self.notify(
|
|
460
|
+
self.notify(
|
|
461
|
+
f"Sent to running agent: \"{preview}\" "
|
|
462
|
+
f"(will be picked up at the next turn)"
|
|
463
|
+
)
|
|
438
464
|
return
|
|
439
465
|
|
|
440
466
|
if value.startswith("!"):
|
|
@@ -1414,11 +1440,11 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
1414
1440
|
pass
|
|
1415
1441
|
|
|
1416
1442
|
# Read existing config
|
|
1417
|
-
import
|
|
1443
|
+
import tomllib
|
|
1418
1444
|
existing = {}
|
|
1419
1445
|
if config_path.exists():
|
|
1420
1446
|
try:
|
|
1421
|
-
existing =
|
|
1447
|
+
existing = tomllib.loads(config_path.read_text())
|
|
1422
1448
|
except Exception:
|
|
1423
1449
|
pass
|
|
1424
1450
|
|
|
@@ -1462,6 +1488,176 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
1462
1488
|
)
|
|
1463
1489
|
)
|
|
1464
1490
|
|
|
1491
|
+
async def _mcp_command(self, args: str = "") -> None:
|
|
1492
|
+
"""Configure MCP servers in ~/.drydock/config.toml."""
|
|
1493
|
+
import shlex
|
|
1494
|
+
import tomllib
|
|
1495
|
+
import tomli_w
|
|
1496
|
+
|
|
1497
|
+
config_path = Path.home() / ".drydock" / "config.toml"
|
|
1498
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1499
|
+
|
|
1500
|
+
def _load() -> dict:
|
|
1501
|
+
if not config_path.exists():
|
|
1502
|
+
return {}
|
|
1503
|
+
try:
|
|
1504
|
+
return tomllib.loads(config_path.read_text())
|
|
1505
|
+
except Exception:
|
|
1506
|
+
return {}
|
|
1507
|
+
|
|
1508
|
+
def _save(data: dict) -> None:
|
|
1509
|
+
config_path.write_text(tomli_w.dumps(data))
|
|
1510
|
+
|
|
1511
|
+
def _render_servers(servers: list[dict]) -> str:
|
|
1512
|
+
if not servers:
|
|
1513
|
+
return "_(no MCP servers configured)_"
|
|
1514
|
+
lines = []
|
|
1515
|
+
for s in servers:
|
|
1516
|
+
name = s.get("name", "?")
|
|
1517
|
+
transport = s.get("transport", "?")
|
|
1518
|
+
if transport == "stdio":
|
|
1519
|
+
cmd = s.get("command", "")
|
|
1520
|
+
if isinstance(cmd, list):
|
|
1521
|
+
cmd = " ".join(cmd)
|
|
1522
|
+
extra = " ".join(s.get("args", []) or [])
|
|
1523
|
+
target = f"`{cmd} {extra}`".strip()
|
|
1524
|
+
else:
|
|
1525
|
+
target = f"`{s.get('url', '')}`"
|
|
1526
|
+
lines.append(f"- **{name}** ({transport}) → {target}")
|
|
1527
|
+
return "\n".join(lines)
|
|
1528
|
+
|
|
1529
|
+
parts = shlex.split(args) if args.strip() else []
|
|
1530
|
+
sub = parts[0].lower() if parts else "list"
|
|
1531
|
+
|
|
1532
|
+
if sub in ("list", ""):
|
|
1533
|
+
data = _load()
|
|
1534
|
+
servers = data.get("mcp_servers", []) or []
|
|
1535
|
+
msg = (
|
|
1536
|
+
"### MCP servers\n\n"
|
|
1537
|
+
f"Config: `{config_path}`\n\n"
|
|
1538
|
+
f"{_render_servers(servers)}\n\n"
|
|
1539
|
+
"**Commands:**\n"
|
|
1540
|
+
"- `/mcp add stdio <name> <command> [args...]`\n"
|
|
1541
|
+
"- `/mcp add http <name> <url>`\n"
|
|
1542
|
+
"- `/mcp add streamable-http <name> <url>`\n"
|
|
1543
|
+
"- `/mcp remove <name>`\n"
|
|
1544
|
+
"- `/mcp examples`\n\n"
|
|
1545
|
+
"_Restart Drydock after changes to load new servers._"
|
|
1546
|
+
)
|
|
1547
|
+
await self._mount_and_scroll(UserCommandMessage(msg))
|
|
1548
|
+
return
|
|
1549
|
+
|
|
1550
|
+
if sub == "examples":
|
|
1551
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1552
|
+
"### MCP server examples\n\n"
|
|
1553
|
+
"**stdio (local process):**\n"
|
|
1554
|
+
"```\n"
|
|
1555
|
+
"/mcp add stdio filesystem npx -y "
|
|
1556
|
+
"@modelcontextprotocol/server-filesystem /data\n"
|
|
1557
|
+
"```\n\n"
|
|
1558
|
+
"**HTTP:**\n"
|
|
1559
|
+
"```\n"
|
|
1560
|
+
"/mcp add http weather https://mcp.example.com\n"
|
|
1561
|
+
"```\n\n"
|
|
1562
|
+
"**Streamable HTTP:**\n"
|
|
1563
|
+
"```\n"
|
|
1564
|
+
"/mcp add streamable-http myapi https://api.example.com/mcp\n"
|
|
1565
|
+
"```\n\n"
|
|
1566
|
+
"For auth headers, env-var API keys, custom timeouts, or "
|
|
1567
|
+
"`sampling_enabled=false`, edit `~/.drydock/config.toml` "
|
|
1568
|
+
"directly. Schema: `name`, `transport`, plus `command`/"
|
|
1569
|
+
"`args`/`env` (stdio) or `url`/`headers`/`api_key_env`/"
|
|
1570
|
+
"`api_key_header`/`api_key_format` (http variants)."
|
|
1571
|
+
))
|
|
1572
|
+
return
|
|
1573
|
+
|
|
1574
|
+
if sub == "remove":
|
|
1575
|
+
if len(parts) < 2:
|
|
1576
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1577
|
+
"Usage: `/mcp remove <name>`"
|
|
1578
|
+
))
|
|
1579
|
+
return
|
|
1580
|
+
name = parts[1]
|
|
1581
|
+
data = _load()
|
|
1582
|
+
servers = data.get("mcp_servers", []) or []
|
|
1583
|
+
new_servers = [s for s in servers if s.get("name") != name]
|
|
1584
|
+
if len(new_servers) == len(servers):
|
|
1585
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1586
|
+
f"No MCP server named `{name}` found."
|
|
1587
|
+
))
|
|
1588
|
+
return
|
|
1589
|
+
data["mcp_servers"] = new_servers
|
|
1590
|
+
_save(data)
|
|
1591
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1592
|
+
f"Removed MCP server `{name}`. Restart Drydock to apply."
|
|
1593
|
+
))
|
|
1594
|
+
return
|
|
1595
|
+
|
|
1596
|
+
if sub == "add":
|
|
1597
|
+
if len(parts) < 4:
|
|
1598
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1599
|
+
"Usage:\n"
|
|
1600
|
+
"- `/mcp add stdio <name> <command> [args...]`\n"
|
|
1601
|
+
"- `/mcp add http <name> <url>`\n"
|
|
1602
|
+
"- `/mcp add streamable-http <name> <url>`"
|
|
1603
|
+
))
|
|
1604
|
+
return
|
|
1605
|
+
transport = parts[1].lower()
|
|
1606
|
+
name = parts[2]
|
|
1607
|
+
rest = parts[3:]
|
|
1608
|
+
|
|
1609
|
+
if transport not in ("stdio", "http", "streamable-http"):
|
|
1610
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1611
|
+
f"Unknown transport `{transport}`. "
|
|
1612
|
+
"Use `stdio`, `http`, or `streamable-http`."
|
|
1613
|
+
))
|
|
1614
|
+
return
|
|
1615
|
+
|
|
1616
|
+
entry: dict
|
|
1617
|
+
if transport == "stdio":
|
|
1618
|
+
entry = {
|
|
1619
|
+
"name": name,
|
|
1620
|
+
"transport": "stdio",
|
|
1621
|
+
"command": rest[0],
|
|
1622
|
+
"args": list(rest[1:]),
|
|
1623
|
+
}
|
|
1624
|
+
else:
|
|
1625
|
+
if len(rest) != 1:
|
|
1626
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1627
|
+
f"Usage: `/mcp add {transport} <name> <url>`"
|
|
1628
|
+
))
|
|
1629
|
+
return
|
|
1630
|
+
entry = {
|
|
1631
|
+
"name": name,
|
|
1632
|
+
"transport": transport,
|
|
1633
|
+
"url": rest[0],
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
data = _load()
|
|
1637
|
+
servers = data.get("mcp_servers", []) or []
|
|
1638
|
+
servers = [s for s in servers if s.get("name") != name]
|
|
1639
|
+
servers.append(entry)
|
|
1640
|
+
data["mcp_servers"] = servers
|
|
1641
|
+
_save(data)
|
|
1642
|
+
|
|
1643
|
+
target = (
|
|
1644
|
+
f"`{entry['command']} {' '.join(entry.get('args', []))}`".strip()
|
|
1645
|
+
if transport == "stdio"
|
|
1646
|
+
else f"`{entry['url']}`"
|
|
1647
|
+
)
|
|
1648
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1649
|
+
f"Added MCP server **{name}** ({transport}) → {target}\n\n"
|
|
1650
|
+
f"Config: `{config_path}`\n"
|
|
1651
|
+
"Restart Drydock to load the server. Edit the file directly "
|
|
1652
|
+
"for advanced fields (headers, env, api_key_env, timeouts)."
|
|
1653
|
+
))
|
|
1654
|
+
return
|
|
1655
|
+
|
|
1656
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
1657
|
+
"Usage: `/mcp {list | add <transport> <name> ... | "
|
|
1658
|
+
"remove <name> | examples}`"
|
|
1659
|
+
))
|
|
1660
|
+
|
|
1465
1661
|
async def _admiral_apply_command(self, args: str = "") -> None:
|
|
1466
1662
|
"""Merge an Admiral-staged proposal branch into main."""
|
|
1467
1663
|
import subprocess
|
|
@@ -224,6 +224,15 @@ class AgentLoop:
|
|
|
224
224
|
self._empty_responses: int = 0
|
|
225
225
|
self._successful_test_runs: int = 0
|
|
226
226
|
|
|
227
|
+
# Mid-turn user injections (the Claude Code "type while busy" feature).
|
|
228
|
+
# The TUI calls `queue_user_injection()` whenever the user submits a
|
|
229
|
+
# message while the agent is mid-task. The per-turn loop drains this
|
|
230
|
+
# at the top of each iteration and folds the text into context as a
|
|
231
|
+
# SYSTEM note attached to the last tool result (the only ordering that
|
|
232
|
+
# vLLM/Mistral accept after a tool turn). No locking needed — Textual's
|
|
233
|
+
# event loop is single-threaded asyncio, same loop the agent runs on.
|
|
234
|
+
self._pending_user_injections: list[str] = []
|
|
235
|
+
|
|
227
236
|
# Shared read-file state — used by write_file / search_replace to
|
|
228
237
|
# enforce Read-before-Write (per Claude Code's tool contract) and
|
|
229
238
|
# by read_file to dedup unchanged-mtime re-reads. Keyed by resolved
|
|
@@ -305,6 +314,38 @@ class AgentLoop:
|
|
|
305
314
|
def auto_approve(self) -> bool:
|
|
306
315
|
return self.config.auto_approve
|
|
307
316
|
|
|
317
|
+
def queue_user_injection(self, text: str) -> None:
|
|
318
|
+
"""Queue a user message to be folded into context at the next turn boundary.
|
|
319
|
+
|
|
320
|
+
Called by the TUI when the user submits a message while the agent is
|
|
321
|
+
already running. The injection is drained at the top of the next
|
|
322
|
+
per-turn iteration in `act()` and surfaced to the model as a SYSTEM
|
|
323
|
+
note on the last tool result so message ordering stays valid for
|
|
324
|
+
vLLM/Mistral.
|
|
325
|
+
"""
|
|
326
|
+
cleaned = (text or "").strip()
|
|
327
|
+
if cleaned:
|
|
328
|
+
self._pending_user_injections.append(cleaned)
|
|
329
|
+
|
|
330
|
+
def _drain_user_injections(self) -> None:
|
|
331
|
+
"""Pull any queued user messages into the current turn's context.
|
|
332
|
+
|
|
333
|
+
Folds them onto the last tool result via the same safe path as
|
|
334
|
+
`_inject_system_note` — never appends a fresh user-after-tool
|
|
335
|
+
message, which vLLM/Mistral reject.
|
|
336
|
+
"""
|
|
337
|
+
if not self._pending_user_injections:
|
|
338
|
+
return
|
|
339
|
+
# Snapshot + clear so a concurrent queue append doesn't double-fire.
|
|
340
|
+
injections = self._pending_user_injections
|
|
341
|
+
self._pending_user_injections = []
|
|
342
|
+
for text in injections:
|
|
343
|
+
note = (
|
|
344
|
+
f"USER (typed while you were working — fold this into "
|
|
345
|
+
f"the current task; do not start over):\n{text}"
|
|
346
|
+
)
|
|
347
|
+
self._inject_system_note(note)
|
|
348
|
+
|
|
308
349
|
def set_tool_permission(
|
|
309
350
|
self, tool_name: str, permission: ToolPermission, save_permanently: bool = False
|
|
310
351
|
) -> None:
|
|
@@ -738,6 +779,10 @@ class AgentLoop:
|
|
|
738
779
|
_prompt_start = time.perf_counter()
|
|
739
780
|
logger.warning("[TIMING] entering conversation while loop")
|
|
740
781
|
while not should_break_loop:
|
|
782
|
+
# Drain any user messages typed while the agent was working.
|
|
783
|
+
# Done BEFORE the turn counter increments and BEFORE middleware
|
|
784
|
+
# runs so the new context is visible to both.
|
|
785
|
+
self._drain_user_injections()
|
|
741
786
|
# Loop protection: prevent infinite tool-call loops
|
|
742
787
|
tool_turns += 1
|
|
743
788
|
_wt0 = time.perf_counter()
|
|
@@ -2999,12 +3044,16 @@ class AgentLoop:
|
|
|
2999
3044
|
# appear many times in sequence when building multi-file projects.
|
|
3000
3045
|
# Record a hot-combo on the stuck tool with an empty-path marker
|
|
3001
3046
|
# so the per-tool mute in _chat will remove it for 1 turn.
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3047
|
+
# Uniform threshold=8. The autonomous_review fix that lowered this to
|
|
3048
|
+
# 4 for exploration tools (grep/read_file/glob) addressed a misattributed
|
|
3049
|
+
# `harness:thinking_stall` signal — that pattern is about post-thinking
|
|
3050
|
+
# empty messages, handled by the empty-message nudge elsewhere — and the
|
|
3051
|
+
# lowered threshold broke loop_detection regression tests (4 different
|
|
3052
|
+
# greps or read_files is legitimate investigation, not a stuck loop).
|
|
3053
|
+
if len(tool_names) >= 8:
|
|
3054
|
+
last8 = tool_names[-8:]
|
|
3055
|
+
if all(n == last8[-1] for n in last8):
|
|
3056
|
+
self._hot_tool_path = (last8[-1], "<stuck>")
|
|
3008
3057
|
return "FORCE_STOP"
|
|
3009
3058
|
|
|
3010
3059
|
# Check 1c: High recent-error fraction. If ≥6 of last 10 tool
|