drydock-cli 2.8.50__tar.gz → 2.8.52__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.52/.auto_release.lock +1 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/PKG-INFO +1 -1
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/app.py +51 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/approval_app.py +43 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agent_loop.py +14 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/session_logger.py +24 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/pyproject.toml +1 -1
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown.py +6 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_shakedown.py +10 -2
- drydock_cli-2.8.52/tests/test_approval_modal_stray_keys.py +92 -0
- drydock_cli-2.8.52/tests/test_session_log_event.py +89 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/trip_log.md +9 -0
- drydock_cli-2.8.50/.auto_release.lock +0 -1
- drydock_cli-2.8.50/.pause_stress +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.drydock/graphrag.sqlite +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.gitignore +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pause_hle_babysitter +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pause_hle_burndown +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pause_hle_burndown_keepalive +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.python-version +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.typos.toml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.vscode/extensions.json +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.vscode/launch.json +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.vscode/settings.json +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/AGENTS.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/Admiral.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/CHANGELOG.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/CLAUDE.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/DEEP_NOIR_PRD.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/DRYDOCK.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/HLE_PRD.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/JETSON_BENCH.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/LICENSE +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/NOTICE +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/README.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/SOVEREIGN_PRD.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/action.yml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/README.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/README.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/acp-setup.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/BASELINE_412.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/Drydock_rebrand.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/PRD.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/drydock_terms.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/resume.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/__main__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auto_solve.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/constraint_extract.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/constraint_hint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/goal.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/logger.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/slug.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/algebra_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/logic_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prolog_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/set_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/solve_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/stats_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/units_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/types.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/utils.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/gap_detector.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/config.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/scan_sessions.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/whats_new.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock-acp.spec +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/flake.lock +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/flake.nix +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/outlook_draft_assistant.tar.gz +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/README.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/config_base.toml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/config_best.toml +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/domain_spec.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/experimenter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/kernel.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/mini_prd.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/proposer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/results.tsv +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/resume.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/README.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/README.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/auto_solve_audit.py.deprecated +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_babysitter.sh.deprecated +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_burndown.sh.deprecated +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_burndown_keepalive.sh.deprecated +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_burndown_status.py.deprecated +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_eval.py.deprecated +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/auto_test_loop.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/monitor_test_battery.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/overnight_agents_test.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/test_bank.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/test_full.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/test_smoke.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/tui_test.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/backfill_hle_curiosity.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/backup.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/bench_inference.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/bump_version.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/classify_pulse.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/consume_retrieval_queue.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/curiosity_idle_cycle.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/dedupe_dispatch_queues.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/dispatch_report.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/drydock_status.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/fetch_arxiv_abstracts.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/hle_aggregate.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/hle_eval_seed.jsonl +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/notify_release.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/queue_top.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/rejudge_hle.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/start_steering_sidecar.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/tool_usage_report.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/conftest.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/common.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/utils.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/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.50 → drydock_cli-2.8.52}/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.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agents.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_algebra_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_api_error_recovery.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_auto_retrieve_soft_nudge.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_auto_solve.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_chemistry_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_classifier.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_dispatch_report.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_goal.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hle_score_method_split.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hle_typing.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_integration.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_linear_algebra_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_logic_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_message_id.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_middleware.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_number_theory_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_prolog_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_rejudge_hle.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_set_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_smoke.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_solve_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_stats_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_units_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_workloads.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/uv.lock +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/README.md +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2492908
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.52
|
|
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
|
|
@@ -480,9 +480,58 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
480
480
|
|
|
481
481
|
await self._handle_user_message(value)
|
|
482
482
|
|
|
483
|
+
async def on_approval_app_stray_key(
|
|
484
|
+
self, message: ApprovalApp.StrayKey
|
|
485
|
+
) -> None:
|
|
486
|
+
"""The approval modal forwarded a stray keystroke (user started
|
|
487
|
+
typing chat input while the modal was up). Buffer printable chars
|
|
488
|
+
into a scratch string; flush as one pending message on Enter.
|
|
489
|
+
|
|
490
|
+
Without this, real users hitting an approval modal mid-type lose
|
|
491
|
+
every character they tap — the modal swallows everything not in
|
|
492
|
+
its 1/y/2/3/n/up/down/enter bindings. Stress harness exposed it
|
|
493
|
+
as 30% SKIP rate; root cause is the same for real interactive
|
|
494
|
+
users."""
|
|
495
|
+
if not hasattr(self, "_stray_key_buffer"):
|
|
496
|
+
self._stray_key_buffer: str = ""
|
|
497
|
+
if not hasattr(self, "_pending_messages"):
|
|
498
|
+
self._pending_messages: list[str] = []
|
|
499
|
+
|
|
500
|
+
if message.is_enter:
|
|
501
|
+
buf = self._stray_key_buffer.strip()
|
|
502
|
+
if buf:
|
|
503
|
+
self._pending_messages.append(buf)
|
|
504
|
+
self._stray_key_buffer = ""
|
|
505
|
+
# Tell the user we caught their stray input
|
|
506
|
+
try:
|
|
507
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
508
|
+
f"_Queued chat input typed during approval modal "
|
|
509
|
+
f"({len(buf)} chars): \"{buf[:60]}…\". Will run "
|
|
510
|
+
f"after the modal closes._"
|
|
511
|
+
))
|
|
512
|
+
except Exception:
|
|
513
|
+
pass
|
|
514
|
+
return
|
|
515
|
+
|
|
516
|
+
if message.text:
|
|
517
|
+
self._stray_key_buffer += message.text
|
|
518
|
+
|
|
519
|
+
def _flush_stray_key_buffer(self) -> None:
|
|
520
|
+
"""Move any buffered stray-key text to _pending_messages.
|
|
521
|
+
Called from every approval-close path so chars typed during the
|
|
522
|
+
modal aren't lost even if the user didn't press Enter."""
|
|
523
|
+
buf = getattr(self, "_stray_key_buffer", "").strip()
|
|
524
|
+
if not buf:
|
|
525
|
+
return
|
|
526
|
+
if not hasattr(self, "_pending_messages"):
|
|
527
|
+
self._pending_messages = []
|
|
528
|
+
self._pending_messages.append(buf)
|
|
529
|
+
self._stray_key_buffer = ""
|
|
530
|
+
|
|
483
531
|
async def on_approval_app_approval_granted(
|
|
484
532
|
self, message: ApprovalApp.ApprovalGranted
|
|
485
533
|
) -> None:
|
|
534
|
+
self._flush_stray_key_buffer()
|
|
486
535
|
if self._pending_approval and not self._pending_approval.done():
|
|
487
536
|
self._pending_approval.set_result((ApprovalResponse.YES, None))
|
|
488
537
|
|
|
@@ -491,6 +540,7 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
491
540
|
async def on_approval_app_approval_granted_always_tool(
|
|
492
541
|
self, message: ApprovalApp.ApprovalGrantedAlwaysTool
|
|
493
542
|
) -> None:
|
|
543
|
+
self._flush_stray_key_buffer()
|
|
494
544
|
self._set_tool_permission_always(
|
|
495
545
|
message.tool_name, save_permanently=message.save_permanently
|
|
496
546
|
)
|
|
@@ -503,6 +553,7 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
503
553
|
async def on_approval_app_approval_rejected(
|
|
504
554
|
self, message: ApprovalApp.ApprovalRejected
|
|
505
555
|
) -> None:
|
|
556
|
+
self._flush_stray_key_buffer()
|
|
506
557
|
if self._pending_approval and not self._pending_approval.done():
|
|
507
558
|
feedback = str(
|
|
508
559
|
get_user_cancellation_message(CancellationReason.OPERATION_CANCELLED)
|
|
@@ -45,6 +45,25 @@ class ApprovalApp(Container):
|
|
|
45
45
|
self.tool_args = tool_args
|
|
46
46
|
self.save_permanently = save_permanently
|
|
47
47
|
|
|
48
|
+
class StrayKey(Message):
|
|
49
|
+
"""User started typing chat input while the modal was up.
|
|
50
|
+
|
|
51
|
+
Real users (and the pexpect-based stress harness) hit this when
|
|
52
|
+
an approval modal appears mid-conversation: their keystrokes get
|
|
53
|
+
routed to ApprovalApp, which only binds up/down/enter/1/y/2/3/n
|
|
54
|
+
and silently drops everything else. Before this fix, those
|
|
55
|
+
characters disappeared into the void; the user assumed the TUI
|
|
56
|
+
was ignoring them and re-typed (or gave up).
|
|
57
|
+
|
|
58
|
+
Now we forward stray printable characters AND Enter to the main
|
|
59
|
+
app, which appends them to `_pending_messages` so they replay
|
|
60
|
+
into the chat input after the modal closes.
|
|
61
|
+
"""
|
|
62
|
+
def __init__(self, text: str, is_enter: bool = False) -> None:
|
|
63
|
+
super().__init__()
|
|
64
|
+
self.text = text
|
|
65
|
+
self.is_enter = is_enter
|
|
66
|
+
|
|
48
67
|
class ApprovalRejected(Message):
|
|
49
68
|
def __init__(self, tool_name: str, tool_args: BaseModel) -> None:
|
|
50
69
|
super().__init__()
|
|
@@ -138,6 +157,30 @@ class ApprovalApp(Container):
|
|
|
138
157
|
else:
|
|
139
158
|
widget.add_class("approval-option-no")
|
|
140
159
|
|
|
160
|
+
async def on_key(self, event: events.Key) -> None:
|
|
161
|
+
"""Catch printable characters that aren't in BINDINGS and forward
|
|
162
|
+
them to the main app's pending-messages queue instead of silently
|
|
163
|
+
dropping them. Without this, a user (or pexpect harness) who types
|
|
164
|
+
chat input while the modal is up loses every keystroke.
|
|
165
|
+
|
|
166
|
+
Bound keys (up/down/enter/1/y/2/3/n) are handled by Textual's
|
|
167
|
+
binding system BEFORE on_key fires for unmatched events — so we
|
|
168
|
+
only ever see the stray ones here.
|
|
169
|
+
|
|
170
|
+
We accept any single printable character. Enter is treated as a
|
|
171
|
+
message-send boundary: flush the buffered stray-key text as one
|
|
172
|
+
pending message. The flush boundary lives on the App side so we
|
|
173
|
+
can preserve typing rhythm across multiple modals."""
|
|
174
|
+
if event.character and event.character.isprintable():
|
|
175
|
+
self.post_message(self.StrayKey(text=event.character, is_enter=False))
|
|
176
|
+
event.stop()
|
|
177
|
+
elif event.key == "enter":
|
|
178
|
+
# Enter without any pending stray text means the user
|
|
179
|
+
# confirmed the focused option — let the BINDINGS handle it.
|
|
180
|
+
# (This on_key won't fire for "enter" if the binding consumed
|
|
181
|
+
# it first.) Forward as flush marker just in case.
|
|
182
|
+
self.post_message(self.StrayKey(text="", is_enter=True))
|
|
183
|
+
|
|
141
184
|
def action_move_up(self) -> None:
|
|
142
185
|
self.selected_option = (self.selected_option - 1) % 3
|
|
143
186
|
self._update_options()
|
|
@@ -322,10 +322,24 @@ class AgentLoop:
|
|
|
322
322
|
per-turn iteration in `act()` and surfaced to the model as a SYSTEM
|
|
323
323
|
note on the last tool result so message ordering stays valid for
|
|
324
324
|
vLLM/Mistral.
|
|
325
|
+
|
|
326
|
+
Side-effect: logs the queue event via the session logger so a
|
|
327
|
+
replay (or a harness/watcher) can see that the message was
|
|
328
|
+
accepted, even though it won't appear in `self.messages` until
|
|
329
|
+
the drain runs. Without this, debugging "did my queued message
|
|
330
|
+
land?" requires waiting for the next turn boundary.
|
|
325
331
|
"""
|
|
326
332
|
cleaned = (text or "").strip()
|
|
327
333
|
if cleaned:
|
|
328
334
|
self._pending_user_injections.append(cleaned)
|
|
335
|
+
try:
|
|
336
|
+
self.session_logger.log_event({
|
|
337
|
+
"event": "user_injection_queued",
|
|
338
|
+
"text": cleaned[:1000],
|
|
339
|
+
"pending_count": len(self._pending_user_injections),
|
|
340
|
+
})
|
|
341
|
+
except Exception as _e: # noqa: BLE001 — never block queueing on logger failure
|
|
342
|
+
logger.debug("[injection] session log_event failed: %s", _e)
|
|
329
343
|
|
|
330
344
|
def _drain_user_injections(self) -> None:
|
|
331
345
|
"""Pull any queued user messages into the current turn's context.
|
|
@@ -81,6 +81,30 @@ class SessionLogger:
|
|
|
81
81
|
)
|
|
82
82
|
return self.session_dir / MESSAGES_FILENAME
|
|
83
83
|
|
|
84
|
+
def log_event(self, event: dict) -> None:
|
|
85
|
+
"""Append a structured event to <session_dir>/events.jsonl.
|
|
86
|
+
|
|
87
|
+
Used for things that aren't conversation messages but ARE
|
|
88
|
+
worth recording for replay/debugging — e.g.
|
|
89
|
+
user_injection_queued (typed during agent run), tool_recycled,
|
|
90
|
+
modal_opened, etc. Fail-silent: never raise.
|
|
91
|
+
|
|
92
|
+
Creates session_dir on first call if it doesn't exist yet
|
|
93
|
+
(early-session events can fire before persist_messages
|
|
94
|
+
materialises the dir).
|
|
95
|
+
"""
|
|
96
|
+
if self.session_dir is None:
|
|
97
|
+
return
|
|
98
|
+
try:
|
|
99
|
+
import json as _json
|
|
100
|
+
import time as _time
|
|
101
|
+
event_with_ts = {"ts": _time.time(), **event}
|
|
102
|
+
self.session_dir.mkdir(parents=True, exist_ok=True)
|
|
103
|
+
with (self.session_dir / "events.jsonl").open("a") as f:
|
|
104
|
+
f.write(_json.dumps(event_with_ts) + "\n")
|
|
105
|
+
except Exception: # noqa: BLE001 — never block on logging
|
|
106
|
+
pass
|
|
107
|
+
|
|
84
108
|
@property
|
|
85
109
|
def git_commit(self) -> str | None:
|
|
86
110
|
try:
|
|
@@ -362,8 +362,14 @@ class DrydockDriver:
|
|
|
362
362
|
"COLUMNS": "120",
|
|
363
363
|
"LINES": "30",
|
|
364
364
|
}
|
|
365
|
+
# Match the operator's real daily-driver: `drydock
|
|
366
|
+
# --dangerously-skip-permissions`. Without this flag, every
|
|
367
|
+
# tool call that would prompt for approval pops a modal the
|
|
368
|
+
# harness can't dismiss, leading to a SKIP cascade. The real
|
|
369
|
+
# user has approvals pre-granted via this flag.
|
|
365
370
|
self.child = pexpect.spawn(
|
|
366
371
|
DRYDOCK_BIN,
|
|
372
|
+
args=["--dangerously-skip-permissions"],
|
|
367
373
|
encoding="utf-8",
|
|
368
374
|
timeout=5,
|
|
369
375
|
maxread=100000,
|
|
@@ -429,8 +429,16 @@ def _spawn_tui_child(log_path: Path, cwd: Path,
|
|
|
429
429
|
spawn configuration. Appends to the existing log (don't wipe the
|
|
430
430
|
history — the watcher is polling it and the prior content is useful
|
|
431
431
|
for post-mortem)."""
|
|
432
|
-
|
|
433
|
-
|
|
432
|
+
# Match the operator's real daily-driver config: they run drydock
|
|
433
|
+
# with --dangerously-skip-permissions, so the stress harness should
|
|
434
|
+
# too. Without this, every tool call that requires approval pops a
|
|
435
|
+
# modal that the harness can't dismiss → SKIP cascade. The user's
|
|
436
|
+
# real TUI never hits this path because approvals are pre-granted.
|
|
437
|
+
child = pexpect.spawn(
|
|
438
|
+
DRYDOCK_BIN, args=["--dangerously-skip-permissions"],
|
|
439
|
+
encoding="utf-8", timeout=5,
|
|
440
|
+
maxread=100000, env=env, cwd=str(cwd),
|
|
441
|
+
)
|
|
434
442
|
child.logfile_read = open(log_path, "a", buffering=1)
|
|
435
443
|
child.expect([r">", r"Drydock", r"┌"], timeout=30)
|
|
436
444
|
time.sleep(2)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Regression tests for the approval-modal-eats-keystrokes fix.
|
|
2
|
+
|
|
3
|
+
Bug: when ApprovalApp had focus, any printable character that wasn't
|
|
4
|
+
in its BINDINGS (up/down/enter/1/y/2/3/n) was silently swallowed.
|
|
5
|
+
Real users typing chat input mid-modal lost every keystroke. The
|
|
6
|
+
stress harness surfaced it as a 30% SKIP rate ("TUI did not accept
|
|
7
|
+
after 3 retries") because pexpect can't see the modal and just
|
|
8
|
+
types — the modal ate the prompt, harness re-tried 3x, gave up.
|
|
9
|
+
|
|
10
|
+
Fix: ApprovalApp.on_key catches stray printable chars and forwards
|
|
11
|
+
them to the main app via a StrayKey message. The main app buffers
|
|
12
|
+
them and either:
|
|
13
|
+
- Flushes the buffer on Enter (treats it as a queued chat input)
|
|
14
|
+
- Flushes on modal close (approval granted / always-tool / rejected)
|
|
15
|
+
into `_pending_messages` so they replay after the modal closes.
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import inspect
|
|
20
|
+
|
|
21
|
+
from drydock.cli.textual_ui.widgets.approval_app import ApprovalApp
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# ── ApprovalApp must expose StrayKey + on_key ───────────────────────────
|
|
25
|
+
|
|
26
|
+
def test_stray_key_message_class_exists():
|
|
27
|
+
"""ApprovalApp.StrayKey is the message contract the main app
|
|
28
|
+
listens for. Must accept text + is_enter."""
|
|
29
|
+
cls = getattr(ApprovalApp, "StrayKey", None)
|
|
30
|
+
assert cls is not None
|
|
31
|
+
msg = cls(text="abc", is_enter=False)
|
|
32
|
+
assert msg.text == "abc"
|
|
33
|
+
assert msg.is_enter is False
|
|
34
|
+
msg2 = cls(text="", is_enter=True)
|
|
35
|
+
assert msg2.is_enter is True
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_on_key_handler_exists_and_is_async():
|
|
39
|
+
"""Without on_key, the modal's BINDINGS still swallow everything
|
|
40
|
+
not in {up,down,enter,1,y,2,3,n}. on_key must catch the rest."""
|
|
41
|
+
method = getattr(ApprovalApp, "on_key", None)
|
|
42
|
+
assert method is not None
|
|
43
|
+
assert inspect.iscoroutinefunction(method)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_on_key_source_forwards_printable_chars():
|
|
47
|
+
"""String-grep regression — catches future refactors that remove
|
|
48
|
+
the StrayKey forwarding."""
|
|
49
|
+
src = inspect.getsource(ApprovalApp.on_key)
|
|
50
|
+
assert "StrayKey" in src
|
|
51
|
+
assert "post_message" in src
|
|
52
|
+
assert "isprintable" in src
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# ── Main app handler ────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
def test_main_app_has_stray_key_handler():
|
|
58
|
+
"""app.py must implement on_approval_app_stray_key — Textual's
|
|
59
|
+
automatic event routing relies on the snake_case naming
|
|
60
|
+
convention `on_<sender_class>_<message_class>`."""
|
|
61
|
+
from drydock.cli.textual_ui.app import DrydockApp
|
|
62
|
+
method = getattr(DrydockApp, "on_approval_app_stray_key", None)
|
|
63
|
+
assert method is not None
|
|
64
|
+
assert inspect.iscoroutinefunction(method)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_main_app_flushes_buffer_on_approval_close():
|
|
68
|
+
"""All three approval-close paths (granted / always-tool / rejected)
|
|
69
|
+
must call _flush_stray_key_buffer so chars typed during the modal
|
|
70
|
+
aren't lost even if the user didn't press Enter."""
|
|
71
|
+
from drydock.cli.textual_ui.app import DrydockApp
|
|
72
|
+
for handler_name in (
|
|
73
|
+
"on_approval_app_approval_granted",
|
|
74
|
+
"on_approval_app_approval_granted_always_tool",
|
|
75
|
+
"on_approval_app_approval_rejected",
|
|
76
|
+
):
|
|
77
|
+
handler = getattr(DrydockApp, handler_name, None)
|
|
78
|
+
assert handler is not None
|
|
79
|
+
src = inspect.getsource(handler)
|
|
80
|
+
assert "_flush_stray_key_buffer" in src, (
|
|
81
|
+
f"{handler_name} must call _flush_stray_key_buffer "
|
|
82
|
+
f"so the stray-key buffer doesn't leak across modals"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_flush_method_exists():
|
|
87
|
+
from drydock.cli.textual_ui.app import DrydockApp
|
|
88
|
+
method = getattr(DrydockApp, "_flush_stray_key_buffer", None)
|
|
89
|
+
assert method is not None
|
|
90
|
+
src = inspect.getsource(method)
|
|
91
|
+
assert "_stray_key_buffer" in src
|
|
92
|
+
assert "_pending_messages" in src
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Tests for SessionLogger.log_event + agent_loop.queue_user_injection
|
|
2
|
+
session-log integration.
|
|
3
|
+
|
|
4
|
+
The bug: when the user typed during an agent turn, queue_user_injection
|
|
5
|
+
recorded the message in an in-memory list but didn't write anything to
|
|
6
|
+
the session log until the NEXT turn boundary drained it. For long
|
|
7
|
+
multi-tool turns (5+ minutes), this made the on-disk session log
|
|
8
|
+
silently lag behind what the user had typed — debugging "did my queued
|
|
9
|
+
message land?" required waiting.
|
|
10
|
+
|
|
11
|
+
Fix: SessionLogger.log_event appends structured events to
|
|
12
|
+
<session_dir>/events.jsonl. queue_user_injection calls it with
|
|
13
|
+
event=user_injection_queued so the queue is visible immediately.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
import tempfile
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from drydock.core.config import SessionLoggingConfig
|
|
22
|
+
from drydock.core.session.session_logger import SessionLogger
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# ── SessionLogger.log_event ────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
def test_log_event_writes_jsonl():
|
|
28
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
29
|
+
cfg = SessionLoggingConfig(enabled=True, save_dir=tmp)
|
|
30
|
+
sl = SessionLogger(cfg, "abc12345-deadbeef")
|
|
31
|
+
sl.log_event({"event": "test", "value": 42})
|
|
32
|
+
sl.log_event({"event": "test2", "value": "x"})
|
|
33
|
+
events_file = sl.session_dir / "events.jsonl"
|
|
34
|
+
assert events_file.is_file()
|
|
35
|
+
lines = events_file.read_text().strip().split("\n")
|
|
36
|
+
assert len(lines) == 2
|
|
37
|
+
r0 = json.loads(lines[0])
|
|
38
|
+
assert r0["event"] == "test"
|
|
39
|
+
assert r0["value"] == 42
|
|
40
|
+
assert "ts" in r0 # auto-added timestamp
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_log_event_no_crash_when_logging_disabled():
|
|
44
|
+
cfg = SessionLoggingConfig(enabled=False, save_dir="")
|
|
45
|
+
sl = SessionLogger(cfg, "test")
|
|
46
|
+
# Must be a no-op, must not raise
|
|
47
|
+
sl.log_event({"event": "should_be_dropped"})
|
|
48
|
+
assert sl.session_dir is None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_log_event_creates_session_dir_if_missing():
|
|
52
|
+
"""Early-session events (queue_user_injection during the very first
|
|
53
|
+
turn) can fire before persist_messages has materialised the dir.
|
|
54
|
+
log_event must create it on demand."""
|
|
55
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
56
|
+
cfg = SessionLoggingConfig(enabled=True, save_dir=tmp)
|
|
57
|
+
sl = SessionLogger(cfg, "newid-test")
|
|
58
|
+
# session_dir was assigned in __init__ but the directory itself
|
|
59
|
+
# may not exist yet (save_folder is computed, save_dir.mkdir is
|
|
60
|
+
# called but session_dir is a subdir).
|
|
61
|
+
sl.log_event({"event": "early"})
|
|
62
|
+
assert sl.session_dir.is_dir()
|
|
63
|
+
assert (sl.session_dir / "events.jsonl").is_file()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_log_event_silent_on_failure():
|
|
67
|
+
"""Disk errors / permission issues must not break the caller."""
|
|
68
|
+
cfg = SessionLoggingConfig(enabled=True, save_dir="/nonexistent/path/cannot/write")
|
|
69
|
+
try:
|
|
70
|
+
sl = SessionLogger(cfg, "x")
|
|
71
|
+
except (OSError, PermissionError):
|
|
72
|
+
# If init itself fails, we can't test log_event — fine, the
|
|
73
|
+
# silent-on-failure guarantee is for steady-state writes
|
|
74
|
+
return
|
|
75
|
+
# If init succeeded somehow, log_event must still not raise
|
|
76
|
+
sl.log_event({"event": "doomed"})
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ── queue_user_injection emits the event ───────────────────────────────
|
|
80
|
+
|
|
81
|
+
def test_queue_user_injection_emits_session_event():
|
|
82
|
+
"""String-grep regression: agent_loop.queue_user_injection must
|
|
83
|
+
call session_logger.log_event so the queue is visible in
|
|
84
|
+
events.jsonl immediately, not just after the next drain."""
|
|
85
|
+
import inspect
|
|
86
|
+
from drydock.core.agent_loop import AgentLoop
|
|
87
|
+
src = inspect.getsource(AgentLoop.queue_user_injection)
|
|
88
|
+
assert "log_event" in src
|
|
89
|
+
assert "user_injection_queued" in src
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Drydock Trip Log
|
|
2
2
|
|
|
3
|
+
## 2026-05-17 16:00 UTC tick
|
|
4
|
+
- Stress: step 26/1658, just restarted at 16:00 UTC by hourly babysitter (stress PID 2482864, .pause_stress sentinel present but stress running — babysitter may not check it)
|
|
5
|
+
- Write rate: N/A (just restarted this tick)
|
|
6
|
+
- Admiral last 30 min: N/A
|
|
7
|
+
- vLLM 400s: 0 errors in llamacpp-gemma4 last 30m
|
|
8
|
+
- GH issues: 0 open
|
|
9
|
+
- Dispatch queue: harness=7 (all stale thinking_stall, resolved by v2.8.47+v2.8.48), retrieval=0 actionable, curiosity=2546 pending (409 hle_failure, 2137 unknown_term — all HLE-related, HLE paused via sentinels)
|
|
10
|
+
- Action this tick: no action — system healthy; queued harness items all historical; top curiosity items are hard-math HLE timeouts which cannot be evaluated with HLE paused per operator directive (CLAUDE.md 2026-05-17); retrieval queue already up to date
|
|
11
|
+
|
|
3
12
|
## 2026-05-17 15:30 UTC tick
|
|
4
13
|
- Stress: PAUSED (.pause_stress sentinel active)
|
|
5
14
|
- HLE burndown: running (PID 2465533 engineering batch, slot 59, ~51 min elapsed), lifetime 115/848 = 13.6% (Math 17.8%, CS/AI 6.8%, Bio/Med 13.2%, Physics 8.3%, Chem 8.7%); babysitter skipping correctly while burndown active
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2480262
|
drydock_cli-2.8.50/.pause_stress
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|