drydock-cli 2.8.24__tar.gz → 2.8.26__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.26/.auto_release.lock +1 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/HLE_PRD.md +38 -1
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/PKG-INFO +1 -1
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/agent_loop.py +20 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/gemma4.md +15 -1
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/sidecar/server.py +66 -27
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/pyproject.toml +1 -1
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/hle_eval.py +50 -7
- drydock_cli-2.8.26/tests/test_auto_retrieve_soft_nudge.py +167 -0
- drydock_cli-2.8.26/tests/test_steering_sidecar_chat_inputs.py +147 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/trip_log.md +216 -0
- drydock_cli-2.8.24/.auto_release.lock +0 -1
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.gitignore +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.python-version +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.typos.toml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.vscode/extensions.json +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.vscode/launch.json +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/.vscode/settings.json +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/AGENTS.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/Admiral.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/CHANGELOG.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/CLAUDE.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/DEEP_NOIR_PRD.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/DRYDOCK.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/JETSON_BENCH.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/LICENSE +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/NOTICE +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/README.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/SOVEREIGN_PRD.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/action.yml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/README.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/README.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/acp-setup.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/BASELINE_412.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/Drydock_rebrand.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/PRD.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/drydock_terms.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/archive/resume.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/__main__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/logger.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/slug.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/types.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/core/utils.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/curiosity/gap_detector.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/config.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock/whats_new.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/drydock-acp.spec +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/flake.lock +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/flake.nix +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/outlook_draft_assistant.tar.gz +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/README.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/config_base.toml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/config_best.toml +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/domain_spec.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/experimenter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/kernel.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/mini_prd.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/proposer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/research/results.tsv +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/README.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/archive/auto_test_loop.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/archive/monitor_test_battery.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/archive/overnight_agents_test.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/archive/test_bank.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/archive/test_full.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/archive/test_smoke.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/archive/tui_test.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/backfill_hle_curiosity.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/backup.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/bench_inference.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/bump_version.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/classify_pulse.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/consume_retrieval_queue.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/curiosity_idle_cycle.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/fetch_arxiv_abstracts.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/hle_eval_seed.jsonl +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/notify_release.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/queue_top.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/shakedown.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/start_steering_sidecar.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/tool_usage_report.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/conftest.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/e2e/common.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/mock/utils.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/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.24 → drydock_cli-2.8.26}/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.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_admiral.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_agents.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_classifier.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_hle_typing.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_integration.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_message_id.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_middleware.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_smoke.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_steering.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_workloads.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/uv.lock +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/worked_examples/README.md +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.8.24 → drydock_cli-2.8.26}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1181066
|
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
# HLE PRD — drydock + GraphRAG + Deep Noir vs Humanity's Last Exam
|
|
2
2
|
|
|
3
|
-
**Status as of 2026-05-
|
|
3
|
+
**Status as of 2026-05-13 12:15 UTC.** Q4_K_M validated and held. AR-OFF
|
|
4
|
+
disambiguation says auto-retrieve is NET POSITIVE on correctness and NOT
|
|
5
|
+
the dominant cause of thinking-stalls. Deep Noir sidecar wiring (M1-M4)
|
|
6
|
+
is in tree; M1 end-to-end GPU smoke pending after the transformers 5.x
|
|
7
|
+
apply_chat_template fix (f02aa4b).
|
|
8
|
+
|
|
9
|
+
## Q4 vs AR-OFF disambiguation (2026-05-13)
|
|
10
|
+
|
|
11
|
+
Two variables shifted simultaneously when the v1 baseline ran (Q3+AR-off
|
|
12
|
+
pre-curiosity-layer) → Q4 30-Q overnight (Q4+AR-on, v2.8.20-24):
|
|
13
|
+
|
|
14
|
+
| Run | Model | AR | Result |
|
|
15
|
+
|-----|-------|----|--------|
|
|
16
|
+
| v1 baseline (Q3, AR-off, pre-curiosity) | Q3_K_M | off | 10/200 = 5.0% raw; 42% thinking-stalls |
|
|
17
|
+
| Q4 30-Q math overnight (2026-05-13 04:27) | Q4_K_M | on | 2/30 = 6.7%; 26/30 (87%) end-on-tool |
|
|
18
|
+
| Q4 5-Q math AR-off smoke (2026-05-13 12:13) | Q4_K_M | off | 0/5 = 0%; 2/5 msg<=1, 3/5 engaged-then-empty |
|
|
19
|
+
|
|
20
|
+
**Conclusions:**
|
|
21
|
+
|
|
22
|
+
- Auto-retrieve is **NET POSITIVE for correctness** (6.7% with AR vs 0%
|
|
23
|
+
without on Math) — the rare YES answers come from curated chunks that
|
|
24
|
+
retrieve surfaces.
|
|
25
|
+
- Auto-retrieve is **NOT the cause of stalls** — every Q4 attempt
|
|
26
|
+
stalled regardless of AR state. Stalls are about model reasoning
|
|
27
|
+
budget, not scaffolding.
|
|
28
|
+
- The `method='empty'` bucket masks two distinct failure shapes (now
|
|
29
|
+
split in `scripts/hle_eval.py` per commit d022572):
|
|
30
|
+
- `empty:no_response` (msg_count <= 1) — model never started, pure
|
|
31
|
+
thinking-stall. 2/5 in AR-off Q4 smoke. Harness/quant/timeout
|
|
32
|
+
problem.
|
|
33
|
+
- `empty:no_final_answer` (msg_count > 1) — model engaged with
|
|
34
|
+
tools but never emitted `FINAL ANSWER:`. 3/5 in AR-off Q4 smoke.
|
|
35
|
+
Retrieval / prompt-rule problem.
|
|
36
|
+
- **Open question**: Q4 quant vs Q3 quant impact on stall rate. Not
|
|
37
|
+
disambiguated yet — needs a 5-Q math smoke after swapping back to
|
|
38
|
+
Q3 with current curiosity defaults.
|
|
39
|
+
|
|
40
|
+
## Phase 2.5 ablation — FINAL RESULTS
|
|
4
41
|
|
|
5
42
|
## Phase 2.5 ablation — FINAL RESULTS
|
|
6
43
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.26
|
|
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
|
|
@@ -3520,6 +3520,26 @@ class AgentLoop:
|
|
|
3520
3520
|
"curator. Respond with text only, no further tool calls."
|
|
3521
3521
|
)
|
|
3522
3522
|
self._inject_system_note(note)
|
|
3523
|
+
elif chunks:
|
|
3524
|
+
# Quality hits but no curated ANSWER marker — common case
|
|
3525
|
+
# for arXiv-corpus retrievals. Without a nudge, Gemma 4
|
|
3526
|
+
# defaults to chaining web_search calls and burns the
|
|
3527
|
+
# session timeout before producing any content (HLE Q4
|
|
3528
|
+
# overnight 2026-05-13: 26/30 sessions ended at 481s with
|
|
3529
|
+
# last role=tool, no assistant content). The nudge here is
|
|
3530
|
+
# advisory — model can still web_search if needed, but it
|
|
3531
|
+
# gets told to prefer the retrieval first.
|
|
3532
|
+
soft_note = (
|
|
3533
|
+
"The retrieve tool result above contains "
|
|
3534
|
+
f"{len(chunks)} chunk(s) drawn from the local corpus "
|
|
3535
|
+
f"(top score {top_score:.1f}). Read these carefully "
|
|
3536
|
+
"and answer from them. Only use web_search if the "
|
|
3537
|
+
"retrieved context is clearly insufficient — do not "
|
|
3538
|
+
"duplicate the same query you already have evidence "
|
|
3539
|
+
"for. When you have enough to answer, respond with "
|
|
3540
|
+
"text (no further tool calls)."
|
|
3541
|
+
)
|
|
3542
|
+
self._inject_system_note(soft_note)
|
|
3523
3543
|
|
|
3524
3544
|
logger.warning(
|
|
3525
3545
|
"[AUTO-RETRIEVE] synthesized retrieve tool result: %d chunks "
|
|
@@ -4,7 +4,7 @@ ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT ex
|
|
|
4
4
|
|
|
5
5
|
When answering a direct factual or math question (not writing code), you MUST write visible text — never produce a response with only thinking tokens and no visible content. End your response with "FINAL ANSWER: <your answer>" on its own line so the judge can extract it.
|
|
6
6
|
|
|
7
|
-
Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve.
|
|
7
|
+
Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve, math, count, memory, verify.
|
|
8
8
|
|
|
9
9
|
CURIOSITY — default posture is "investigate, then assert" (SOVEREIGN_PRD §5.7):
|
|
10
10
|
- If the user message names a thing you don't have context for (paper title,
|
|
@@ -91,6 +91,20 @@ prior alone. The math tool is sandboxed Python (`math.factorial(20)`,
|
|
|
91
91
|
`math.comb(50,5)`, `Fraction(1,3)+Fraction(1,6)`, `statistics.mean([...])`)
|
|
92
92
|
and returns exact results. Use it. Don't compute in your head.
|
|
93
93
|
|
|
94
|
+
USE THE count TOOL for "how many X" questions over text or files —
|
|
95
|
+
substring, regex, lines, words, chars, bytes. Eyeballing miscounts;
|
|
96
|
+
`count(pattern="def ", path="src/foo.py")` doesn't.
|
|
97
|
+
|
|
98
|
+
USE THE memory TOOL to persist facts across sessions. `memory(op="save",
|
|
99
|
+
key="<name>", value="<value>")` writes to ~/.drydock/agent_memory; later
|
|
100
|
+
sessions can `memory(op="recall", key="<name>")`. Use for user
|
|
101
|
+
preferences, project conventions, or anything you'll need next time.
|
|
102
|
+
|
|
103
|
+
USE THE verify TOOL to operationalize "loop until verified" — runs a
|
|
104
|
+
check and returns pass/fail. `verify(criterion="tests pass",
|
|
105
|
+
command="pytest -q", expect="passed", expect_mode="contains")` instead
|
|
106
|
+
of inspecting the bash output yourself.
|
|
107
|
+
|
|
94
108
|
Rules:
|
|
95
109
|
- Create files immediately. Do not plan or discuss — write code.
|
|
96
110
|
- Use absolute imports for Python packages
|
|
@@ -176,6 +176,55 @@ def _now() -> int:
|
|
|
176
176
|
return int(time.time())
|
|
177
177
|
|
|
178
178
|
|
|
179
|
+
def prepare_chat_inputs(
|
|
180
|
+
tokenizer: Any, messages: list[dict[str, Any]], *, device: Any = None
|
|
181
|
+
) -> dict[str, Any]:
|
|
182
|
+
"""Apply the tokenizer's chat template and return a dict that
|
|
183
|
+
`model.generate(**inputs, ...)` can consume.
|
|
184
|
+
|
|
185
|
+
transformers >=5 returns a BatchEncoding (dict-like) from
|
|
186
|
+
`apply_chat_template`; older versions returned a bare Tensor. This
|
|
187
|
+
helper normalizes both shapes to `{"input_ids": Tensor, ...}` and
|
|
188
|
+
optionally moves the tensors onto `device`.
|
|
189
|
+
|
|
190
|
+
Falls back to tokenize-then-encode when the template path doesn't
|
|
191
|
+
accept `return_dict=True` or fails.
|
|
192
|
+
"""
|
|
193
|
+
import torch
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
inputs = tokenizer.apply_chat_template(
|
|
197
|
+
messages,
|
|
198
|
+
add_generation_prompt=True,
|
|
199
|
+
return_tensors="pt",
|
|
200
|
+
return_dict=True,
|
|
201
|
+
)
|
|
202
|
+
except TypeError:
|
|
203
|
+
prompt_text = tokenizer.apply_chat_template(
|
|
204
|
+
messages, add_generation_prompt=True, tokenize=False
|
|
205
|
+
)
|
|
206
|
+
inputs = tokenizer(prompt_text, return_tensors="pt")
|
|
207
|
+
|
|
208
|
+
if isinstance(inputs, torch.Tensor):
|
|
209
|
+
inputs = {"input_ids": inputs}
|
|
210
|
+
else:
|
|
211
|
+
inputs = dict(inputs)
|
|
212
|
+
|
|
213
|
+
if device is not None:
|
|
214
|
+
inputs = {
|
|
215
|
+
k: (v.to(device) if isinstance(v, torch.Tensor) else v)
|
|
216
|
+
for k, v in inputs.items()
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if "input_ids" not in inputs:
|
|
220
|
+
raise RuntimeError(
|
|
221
|
+
f"prepare_chat_inputs: tokenizer returned {list(inputs.keys())!r} "
|
|
222
|
+
"with no input_ids — chat template likely misconfigured"
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
return inputs
|
|
226
|
+
|
|
227
|
+
|
|
179
228
|
def build_app() -> FastAPI:
|
|
180
229
|
app = FastAPI(
|
|
181
230
|
title="Drydock Deep Noir Steering Sidecar",
|
|
@@ -236,21 +285,19 @@ def build_app() -> FastAPI:
|
|
|
236
285
|
content={"error": {"message": str(e), "type": "model_load_failed"}},
|
|
237
286
|
)
|
|
238
287
|
|
|
239
|
-
# Apply the chat template —
|
|
288
|
+
# Apply the chat template — see prepare_chat_inputs for the API
|
|
289
|
+
# drift across transformers versions.
|
|
290
|
+
import torch
|
|
291
|
+
|
|
240
292
|
try:
|
|
241
|
-
|
|
242
|
-
messages,
|
|
243
|
-
add_generation_prompt=True,
|
|
244
|
-
return_tensors="pt",
|
|
293
|
+
inputs = prepare_chat_inputs(
|
|
294
|
+
tokenizer, messages, device=model.device
|
|
245
295
|
)
|
|
246
296
|
except Exception as e:
|
|
247
297
|
raise HTTPException(
|
|
248
298
|
status_code=400, detail=f"chat template failed: {e}"
|
|
249
299
|
)
|
|
250
|
-
|
|
251
|
-
import torch
|
|
252
|
-
|
|
253
|
-
prompt_ids = prompt_ids.to(model.device)
|
|
300
|
+
prompt_ids = inputs["input_ids"]
|
|
254
301
|
max_new_tokens = int(payload.get("max_tokens") or 512)
|
|
255
302
|
# Gemma 4 anti-loop sampling defaults — match what we ship in
|
|
256
303
|
# DEFAULT_MODELS for the local model. Caller can override via
|
|
@@ -267,29 +314,21 @@ def build_app() -> FastAPI:
|
|
|
267
314
|
active_layers: list[int] = []
|
|
268
315
|
t0 = time.perf_counter()
|
|
269
316
|
with torch.no_grad():
|
|
317
|
+
gen_kwargs = dict(
|
|
318
|
+
max_new_tokens=max_new_tokens,
|
|
319
|
+
do_sample=do_sample,
|
|
320
|
+
temperature=temperature if do_sample else 1.0,
|
|
321
|
+
top_p=top_p if do_sample else 1.0,
|
|
322
|
+
top_k=top_k if do_sample else 0,
|
|
323
|
+
pad_token_id=tokenizer.eos_token_id,
|
|
324
|
+
)
|
|
270
325
|
if _HOOK_MANAGER is not None and directives:
|
|
271
326
|
with _HOOK_MANAGER.activate(directives) as active:
|
|
272
327
|
if active is not None:
|
|
273
328
|
active_layers = active.fired_layers()
|
|
274
|
-
output = model.generate(
|
|
275
|
-
prompt_ids,
|
|
276
|
-
max_new_tokens=max_new_tokens,
|
|
277
|
-
do_sample=do_sample,
|
|
278
|
-
temperature=temperature if do_sample else 1.0,
|
|
279
|
-
top_p=top_p if do_sample else 1.0,
|
|
280
|
-
top_k=top_k if do_sample else 0,
|
|
281
|
-
pad_token_id=tokenizer.eos_token_id,
|
|
282
|
-
)
|
|
329
|
+
output = model.generate(**inputs, **gen_kwargs)
|
|
283
330
|
else:
|
|
284
|
-
output = model.generate(
|
|
285
|
-
prompt_ids,
|
|
286
|
-
max_new_tokens=max_new_tokens,
|
|
287
|
-
do_sample=do_sample,
|
|
288
|
-
temperature=temperature if do_sample else 1.0,
|
|
289
|
-
top_p=top_p if do_sample else 1.0,
|
|
290
|
-
top_k=top_k if do_sample else 0,
|
|
291
|
-
pad_token_id=tokenizer.eos_token_id,
|
|
292
|
-
)
|
|
331
|
+
output = model.generate(**inputs, **gen_kwargs)
|
|
293
332
|
gen_time = time.perf_counter() - t0
|
|
294
333
|
|
|
295
334
|
# Decode only the newly-generated portion.
|
|
@@ -184,11 +184,33 @@ def judge_with_gemma(question: str, gold: str, pred: str) -> tuple[str, str]:
|
|
|
184
184
|
return "ERROR", f"judge failed: {e!r}"
|
|
185
185
|
|
|
186
186
|
|
|
187
|
-
def score_answer(q: dict, pred: str) -> dict:
|
|
187
|
+
def score_answer(q: dict, pred: str, outcome: dict | None = None) -> dict:
|
|
188
|
+
"""Score the model's predicted answer against the ground truth.
|
|
189
|
+
|
|
190
|
+
`outcome` is the dict returned by `run_one` (optional). When passed
|
|
191
|
+
and `pred` is empty, we sub-classify the empty failure using
|
|
192
|
+
`msg_count` so the diagnostic distinguishes 'model never started'
|
|
193
|
+
(msg_count<=1) from 'model talked but did not emit FINAL ANSWER:'
|
|
194
|
+
(msg_count>1). This dropped out of the Q4 30-Q overnight diagnosis
|
|
195
|
+
on 2026-05-13 — 26/30 empties shared `method='empty'` but the
|
|
196
|
+
sessions had very different shapes underneath.
|
|
197
|
+
"""
|
|
188
198
|
gold = q["answer"]
|
|
189
199
|
answer_type = q.get("answer_type", "text") or "text"
|
|
190
200
|
if not pred.strip():
|
|
191
|
-
|
|
201
|
+
method = "empty"
|
|
202
|
+
if outcome is not None:
|
|
203
|
+
msg_count = int(outcome.get("msg_count") or 0)
|
|
204
|
+
if msg_count <= 1:
|
|
205
|
+
# Only the user message landed — the model never even
|
|
206
|
+
# produced a tool call or content token before the
|
|
207
|
+
# harness killed the session.
|
|
208
|
+
method = "empty:no_response"
|
|
209
|
+
else:
|
|
210
|
+
# Assistant did produce messages (tool calls / thinking
|
|
211
|
+
# turns) but extraction found no FINAL ANSWER: line.
|
|
212
|
+
method = "empty:no_final_answer"
|
|
213
|
+
return {"correct": False, "method": method, "verdict": "NO",
|
|
192
214
|
"judge_reasoning": "no answer extracted"}
|
|
193
215
|
if answer_type in ("multipleChoice", "exactMatch", "numeric"):
|
|
194
216
|
if exact_score(pred, gold):
|
|
@@ -494,7 +516,7 @@ def main() -> int:
|
|
|
494
516
|
"predicted": "", "ground_truth": q["answer"],
|
|
495
517
|
"session_dir": "", "runner_error": repr(e),
|
|
496
518
|
}
|
|
497
|
-
score = score_answer(q, outcome["predicted"])
|
|
519
|
+
score = score_answer(q, outcome["predicted"], outcome)
|
|
498
520
|
outcome.update(score)
|
|
499
521
|
print(f" pred: {outcome['predicted'][:120]}")
|
|
500
522
|
print(f" gold: {q['answer'][:120]}")
|
|
@@ -530,15 +552,36 @@ def main() -> int:
|
|
|
530
552
|
),
|
|
531
553
|
source=f"hle:{qid}",
|
|
532
554
|
suggested_action=(
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
555
|
+
# Refined per Q4 30-Q diagnosis (2026-05-13):
|
|
556
|
+
# `empty:no_response` (msg_count<=1) is a
|
|
557
|
+
# thinking-stall — model never started, so
|
|
558
|
+
# the action is harness-side (timeout,
|
|
559
|
+
# forcing function, quant). `empty:no_final_answer`
|
|
560
|
+
# (msg_count>1) means the model engaged but
|
|
561
|
+
# didn't produce a FINAL ANSWER: line — that's
|
|
562
|
+
# a retrieval / prompt-rule gap.
|
|
563
|
+
"Model never produced a response within the "
|
|
564
|
+
"session timeout. Action: investigate thinking-"
|
|
565
|
+
"budget exhaustion (raise timeout, force tool-"
|
|
566
|
+
"call cap, consider Q3 vs Q4 quant)."
|
|
567
|
+
if method == "empty:no_response"
|
|
568
|
+
else "Model engaged with tools but never emitted "
|
|
569
|
+
"FINAL ANSWER: — investigate retrieval "
|
|
570
|
+
"coverage / prompt rule to force "
|
|
571
|
+
"answer-after-N-turns."
|
|
572
|
+
if method == "empty:no_final_answer"
|
|
573
|
+
else "Investigate retrieval coverage for this "
|
|
574
|
+
"topic; consider GraphRAG ingest of relevant "
|
|
575
|
+
"corpus or a prompt rule to force retrieve "
|
|
576
|
+
"before answering."
|
|
536
577
|
if method == "empty"
|
|
537
578
|
else "Compare predicted vs gold; surface to "
|
|
538
579
|
"autonomous_review as a prompt/AGENTS.md "
|
|
539
580
|
"candidate."
|
|
540
581
|
),
|
|
541
|
-
confidence=
|
|
582
|
+
confidence=(
|
|
583
|
+
0.9 if method.startswith("empty") else 0.6
|
|
584
|
+
),
|
|
542
585
|
extra={"category": q.get("category", ""),
|
|
543
586
|
"method": method},
|
|
544
587
|
))
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""Tests for the soft-nudge branch of `_auto_prefetch_retrieve`.
|
|
2
|
+
|
|
3
|
+
When auto-retrieve fires and the corpus returns quality hits (above
|
|
4
|
+
the QUALITY_THRESHOLD), but no chunk has the curated `ANSWER:` marker
|
|
5
|
+
that triggers the authoritative-answer path, the loop must still
|
|
6
|
+
inject a soft system note telling the model to read the retrieved
|
|
7
|
+
context before web_searching.
|
|
8
|
+
|
|
9
|
+
Without this nudge, Gemma 4 routinely:
|
|
10
|
+
user → synth retrieve → tool result → web_search ×0-8 → 481s timeout
|
|
11
|
+
(no content emitted)
|
|
12
|
+
|
|
13
|
+
The Q4 30-Q math HLE overnight (2026-05-13) caught this: 26/30 sessions
|
|
14
|
+
ended at 481s with last role=tool. The soft nudge biases the model
|
|
15
|
+
toward producing content from the retrieved chunks instead.
|
|
16
|
+
|
|
17
|
+
These tests drive the relevant code paths via a mocked GraphRAG Index
|
|
18
|
+
and assert that:
|
|
19
|
+
- authoritative case injects the strict "use ANSWER: verbatim" note
|
|
20
|
+
- non-authoritative quality hits inject the soft "read these first" note
|
|
21
|
+
- empty / below-threshold retrieval injects NEITHER (no note at all)
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import sys
|
|
26
|
+
from dataclasses import dataclass
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
import pytest
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class _Hit:
|
|
34
|
+
score: float
|
|
35
|
+
content: str
|
|
36
|
+
file: str = "test.md"
|
|
37
|
+
start_line: int = 1
|
|
38
|
+
end_line: int = 10
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class _FakeResult:
|
|
42
|
+
def __init__(self, hits):
|
|
43
|
+
self.text = hits
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class _FakeIndex:
|
|
47
|
+
def __init__(self, hits):
|
|
48
|
+
self._hits = hits
|
|
49
|
+
|
|
50
|
+
def retrieve(self, query, *, symbol_limit=0, text_limit=4):
|
|
51
|
+
return _FakeResult(self._hits)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class _FakeMessages:
|
|
55
|
+
def __init__(self):
|
|
56
|
+
self._items: list[Any] = []
|
|
57
|
+
|
|
58
|
+
def append(self, m):
|
|
59
|
+
self._items.append(m)
|
|
60
|
+
|
|
61
|
+
def __len__(self):
|
|
62
|
+
return len(self._items)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _make_agent(monkeypatch, hits, tmp_path):
|
|
66
|
+
"""Build a minimal object that quacks like AgentLoop for the
|
|
67
|
+
sole purpose of running `_auto_prefetch_retrieve.__func__`."""
|
|
68
|
+
# Fake graphrag db file path so the existence check passes.
|
|
69
|
+
db_file = tmp_path / "graphrag.sqlite"
|
|
70
|
+
db_file.write_text("") # exists check only
|
|
71
|
+
|
|
72
|
+
# Patch the Index constructor so the function doesn't open a real db.
|
|
73
|
+
import drydock.graphrag as graphrag_pkg
|
|
74
|
+
|
|
75
|
+
monkeypatch.setattr(
|
|
76
|
+
graphrag_pkg, "Index", lambda _db_path: _FakeIndex(hits)
|
|
77
|
+
)
|
|
78
|
+
monkeypatch.setenv("DRYDOCK_GRAPHRAG_DB", str(db_file))
|
|
79
|
+
|
|
80
|
+
notes: list[str] = []
|
|
81
|
+
|
|
82
|
+
class _FakeAgent:
|
|
83
|
+
messages = _FakeMessages()
|
|
84
|
+
|
|
85
|
+
def _inject_system_note(self, note):
|
|
86
|
+
notes.append(note)
|
|
87
|
+
|
|
88
|
+
return _FakeAgent(), notes
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def test_authoritative_chunk_injects_strict_note(monkeypatch, tmp_path):
|
|
92
|
+
"""A chunk with ANSWER: marker at a high BM25 score must trigger
|
|
93
|
+
the strict 'emit verbatim' note."""
|
|
94
|
+
from drydock.core.agent_loop import AgentLoop
|
|
95
|
+
|
|
96
|
+
hits = [
|
|
97
|
+
_Hit(
|
|
98
|
+
score=150.0, # above AUTHORITATIVE_SCORE=100
|
|
99
|
+
content="===hle:abc===\nQUESTION: What is 2+2?\nANSWER: 4",
|
|
100
|
+
)
|
|
101
|
+
]
|
|
102
|
+
agent, notes = _make_agent(monkeypatch, hits, tmp_path)
|
|
103
|
+
AgentLoop._auto_prefetch_retrieve(agent, "QUESTION: What is 2+2?")
|
|
104
|
+
assert len(notes) == 1, notes
|
|
105
|
+
assert "FINAL ANSWER" in notes[0]
|
|
106
|
+
assert "verbatim" in notes[0]
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def test_quality_hits_without_marker_inject_soft_note(monkeypatch, tmp_path):
|
|
110
|
+
"""Quality hits (score >= 8.0) but no ANSWER: marker should
|
|
111
|
+
trigger the soft nudge — the fix for the Q4 thinking-stall."""
|
|
112
|
+
from drydock.core.agent_loop import AgentLoop
|
|
113
|
+
|
|
114
|
+
hits = [
|
|
115
|
+
_Hit(
|
|
116
|
+
score=20.0,
|
|
117
|
+
content="Stochastic gradient descent updates parameters by "
|
|
118
|
+
"moving against the gradient of a randomly sampled loss term.",
|
|
119
|
+
),
|
|
120
|
+
_Hit(
|
|
121
|
+
score=15.0,
|
|
122
|
+
content="Convergence rate depends on the learning-rate "
|
|
123
|
+
"schedule and the variance of the noisy gradient.",
|
|
124
|
+
),
|
|
125
|
+
]
|
|
126
|
+
agent, notes = _make_agent(monkeypatch, hits, tmp_path)
|
|
127
|
+
AgentLoop._auto_prefetch_retrieve(agent, "What is stochastic gradient descent?")
|
|
128
|
+
assert len(notes) == 1, notes
|
|
129
|
+
note = notes[0]
|
|
130
|
+
# Soft characteristics: mentions the chunk count, instructs to
|
|
131
|
+
# read first and discourages duplicate web_search.
|
|
132
|
+
assert "chunk" in note.lower()
|
|
133
|
+
assert "web_search" in note
|
|
134
|
+
assert "do not duplicate" in note.lower() or "do not" in note.lower()
|
|
135
|
+
# Must NOT be the authoritative note (those phrases live there).
|
|
136
|
+
assert "FINAL ANSWER" not in note
|
|
137
|
+
assert "verbatim" not in note
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def test_no_quality_hits_injects_nothing(monkeypatch, tmp_path):
|
|
141
|
+
"""Below the QUALITY_THRESHOLD = 8.0 floor, the function returns
|
|
142
|
+
before any note can fire — confirms we didn't add a spurious branch."""
|
|
143
|
+
from drydock.core.agent_loop import AgentLoop
|
|
144
|
+
|
|
145
|
+
hits = [
|
|
146
|
+
_Hit(score=2.0, content="weak match 1"),
|
|
147
|
+
_Hit(score=1.5, content="weak match 2"),
|
|
148
|
+
]
|
|
149
|
+
agent, notes = _make_agent(monkeypatch, hits, tmp_path)
|
|
150
|
+
AgentLoop._auto_prefetch_retrieve(agent, "an arbitrary question phrase")
|
|
151
|
+
assert notes == []
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def test_authoritative_and_soft_are_mutually_exclusive(monkeypatch, tmp_path):
|
|
155
|
+
"""When the authoritative path fires, the soft note must NOT also
|
|
156
|
+
fire (one note per retrieval, never both)."""
|
|
157
|
+
from drydock.core.agent_loop import AgentLoop
|
|
158
|
+
|
|
159
|
+
hits = [
|
|
160
|
+
_Hit(
|
|
161
|
+
score=150.0,
|
|
162
|
+
content="===hle:abc===\nQUESTION: What is X?\nANSWER: Y",
|
|
163
|
+
)
|
|
164
|
+
]
|
|
165
|
+
agent, notes = _make_agent(monkeypatch, hits, tmp_path)
|
|
166
|
+
AgentLoop._auto_prefetch_retrieve(agent, "QUESTION: What is X?")
|
|
167
|
+
assert len(notes) == 1 # not 2
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""Unit tests for `prepare_chat_inputs` — the chat-template conversion
|
|
2
|
+
that broke under transformers 5.x because `apply_chat_template` returns
|
|
3
|
+
a BatchEncoding by default (whereas older code expected a bare Tensor).
|
|
4
|
+
|
|
5
|
+
These tests cover the three shapes the helper must accept:
|
|
6
|
+
|
|
7
|
+
1. Modern transformers: `return_dict=True` honoured → BatchEncoding /
|
|
8
|
+
dict-like with `input_ids` + `attention_mask`.
|
|
9
|
+
2. Older transformers: `return_dict` raises TypeError → helper falls
|
|
10
|
+
back to tokenize=False then `tokenizer(text, return_tensors='pt')`.
|
|
11
|
+
3. Edge: some tokenizers ignore `return_dict` and still hand back a
|
|
12
|
+
bare Tensor → helper wraps it as `{'input_ids': tensor}`.
|
|
13
|
+
|
|
14
|
+
We use a hand-rolled fake tokenizer rather than HF-hub-downloading
|
|
15
|
+
because the test must run offline and not pay model-fetch cost on every
|
|
16
|
+
pytest invocation.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture
|
|
24
|
+
def torch_mod():
|
|
25
|
+
"""Skip the whole file if torch isn't installed (CI minimal envs)."""
|
|
26
|
+
torch = pytest.importorskip("torch")
|
|
27
|
+
return torch
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _seq_to_tensor(torch, ids):
|
|
31
|
+
return torch.tensor([ids], dtype=torch.long)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class _FakeModernTokenizer:
|
|
35
|
+
"""Mimics transformers >=5 — return_dict=True returns dict with
|
|
36
|
+
input_ids + attention_mask. Without return_dict, returns Tensor."""
|
|
37
|
+
|
|
38
|
+
def __init__(self, torch):
|
|
39
|
+
self._torch = torch
|
|
40
|
+
|
|
41
|
+
def apply_chat_template(
|
|
42
|
+
self, messages, *, add_generation_prompt=False,
|
|
43
|
+
return_tensors=None, return_dict=False, tokenize=True,
|
|
44
|
+
):
|
|
45
|
+
if not tokenize:
|
|
46
|
+
return "USER: " + messages[-1]["content"]
|
|
47
|
+
ids = [10, 11, 12, 13]
|
|
48
|
+
if return_dict:
|
|
49
|
+
return {
|
|
50
|
+
"input_ids": _seq_to_tensor(self._torch, ids),
|
|
51
|
+
"attention_mask": _seq_to_tensor(self._torch, [1] * len(ids)),
|
|
52
|
+
}
|
|
53
|
+
return _seq_to_tensor(self._torch, ids)
|
|
54
|
+
|
|
55
|
+
def __call__(self, text, *, return_tensors=None):
|
|
56
|
+
# Used by the fallback path.
|
|
57
|
+
return {
|
|
58
|
+
"input_ids": _seq_to_tensor(self._torch, [20, 21, 22]),
|
|
59
|
+
"attention_mask": _seq_to_tensor(self._torch, [1, 1, 1]),
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class _FakeLegacyTokenizer:
|
|
64
|
+
"""Mimics older transformers that don't accept return_dict."""
|
|
65
|
+
|
|
66
|
+
def __init__(self, torch):
|
|
67
|
+
self._torch = torch
|
|
68
|
+
|
|
69
|
+
def apply_chat_template(
|
|
70
|
+
self, messages, *, add_generation_prompt=False,
|
|
71
|
+
return_tensors=None, tokenize=True,
|
|
72
|
+
):
|
|
73
|
+
# Note: no return_dict kwarg. Passing return_dict trips TypeError.
|
|
74
|
+
if not tokenize:
|
|
75
|
+
return "USER: " + messages[-1]["content"]
|
|
76
|
+
return _seq_to_tensor(self._torch, [30, 31, 32])
|
|
77
|
+
|
|
78
|
+
def __call__(self, text, *, return_tensors=None):
|
|
79
|
+
return {"input_ids": _seq_to_tensor(self._torch, [40, 41, 42, 43])}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class _FakeTensorOnlyTokenizer:
|
|
83
|
+
"""Mimics tokenizers that ignore return_dict and still hand back a Tensor."""
|
|
84
|
+
|
|
85
|
+
def __init__(self, torch):
|
|
86
|
+
self._torch = torch
|
|
87
|
+
|
|
88
|
+
def apply_chat_template(
|
|
89
|
+
self, messages, *, add_generation_prompt=False,
|
|
90
|
+
return_tensors=None, return_dict=False, tokenize=True,
|
|
91
|
+
):
|
|
92
|
+
return _seq_to_tensor(self._torch, [50, 51])
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_modern_tokenizer_returns_dict_with_attention_mask(torch_mod):
|
|
96
|
+
from drydock.steering.sidecar.server import prepare_chat_inputs
|
|
97
|
+
|
|
98
|
+
tok = _FakeModernTokenizer(torch_mod)
|
|
99
|
+
out = prepare_chat_inputs(tok, [{"role": "user", "content": "hi"}])
|
|
100
|
+
assert "input_ids" in out
|
|
101
|
+
assert "attention_mask" in out
|
|
102
|
+
assert out["input_ids"].shape == (1, 4)
|
|
103
|
+
assert out["attention_mask"].shape == (1, 4)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_modern_tokenizer_moves_to_device(torch_mod):
|
|
107
|
+
from drydock.steering.sidecar.server import prepare_chat_inputs
|
|
108
|
+
|
|
109
|
+
tok = _FakeModernTokenizer(torch_mod)
|
|
110
|
+
out = prepare_chat_inputs(
|
|
111
|
+
tok, [{"role": "user", "content": "hi"}], device=torch_mod.device("cpu")
|
|
112
|
+
)
|
|
113
|
+
assert out["input_ids"].device.type == "cpu"
|
|
114
|
+
assert out["attention_mask"].device.type == "cpu"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_legacy_tokenizer_falls_back_to_two_step(torch_mod):
|
|
118
|
+
from drydock.steering.sidecar.server import prepare_chat_inputs
|
|
119
|
+
|
|
120
|
+
tok = _FakeLegacyTokenizer(torch_mod)
|
|
121
|
+
out = prepare_chat_inputs(tok, [{"role": "user", "content": "hi"}])
|
|
122
|
+
# Fallback path uses tokenizer(text) which returns [40,41,42,43]
|
|
123
|
+
assert out["input_ids"].tolist() == [[40, 41, 42, 43]]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def test_tensor_only_tokenizer_is_wrapped(torch_mod):
|
|
127
|
+
from drydock.steering.sidecar.server import prepare_chat_inputs
|
|
128
|
+
|
|
129
|
+
tok = _FakeTensorOnlyTokenizer(torch_mod)
|
|
130
|
+
out = prepare_chat_inputs(tok, [{"role": "user", "content": "hi"}])
|
|
131
|
+
assert "input_ids" in out
|
|
132
|
+
assert out["input_ids"].tolist() == [[50, 51]]
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def test_helper_raises_when_no_input_ids(torch_mod):
|
|
136
|
+
"""A misconfigured tokenizer that returns a dict without input_ids
|
|
137
|
+
must surface a clear error, not a downstream KeyError."""
|
|
138
|
+
from drydock.steering.sidecar.server import prepare_chat_inputs
|
|
139
|
+
|
|
140
|
+
class _Bad:
|
|
141
|
+
def apply_chat_template(self, messages, **kw):
|
|
142
|
+
if kw.get("return_dict"):
|
|
143
|
+
return {"pixel_values": _seq_to_tensor(torch_mod, [0])}
|
|
144
|
+
return _seq_to_tensor(torch_mod, [0])
|
|
145
|
+
|
|
146
|
+
with pytest.raises(RuntimeError, match="no input_ids"):
|
|
147
|
+
prepare_chat_inputs(_Bad(), [{"role": "user", "content": "hi"}])
|