drydock-cli 2.8.43__tar.gz → 2.8.45__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.45/.auto_release.lock +1 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/CLAUDE.md +9 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/PKG-INFO +1 -1
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/commands.py +11 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/app.py +35 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agent_loop.py +118 -1
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/pyproject.toml +1 -1
- drydock_cli-2.8.45/tests/test_api_error_recovery.py +195 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/trip_log.md +48 -0
- drydock_cli-2.8.43/.auto_release.lock +0 -1
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.gitignore +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.pause_stress +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.python-version +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.typos.toml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.vscode/extensions.json +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.vscode/launch.json +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.vscode/settings.json +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/AGENTS.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/Admiral.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/CHANGELOG.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/DEEP_NOIR_PRD.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/DRYDOCK.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/HLE_PRD.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/JETSON_BENCH.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/LICENSE +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/NOTICE +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/README.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/SOVEREIGN_PRD.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/action.yml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/README.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/README.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/acp-setup.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/BASELINE_412.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/Drydock_rebrand.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/PRD.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/drydock_terms.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/resume.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/__main__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auto_solve.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/constraint_extract.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/constraint_hint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/logger.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/slug.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/algebra_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/logic_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/set_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/solve_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/stats_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/units_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/types.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/utils.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/gap_detector.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/config.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/scan_sessions.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/whats_new.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock-acp.spec +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/flake.lock +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/flake.nix +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/outlook_draft_assistant.tar.gz +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/README.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/config_base.toml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/config_best.toml +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/domain_spec.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/experimenter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/kernel.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/mini_prd.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/proposer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/results.tsv +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/resume.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/README.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/auto_test_loop.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/monitor_test_battery.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/overnight_agents_test.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/test_bank.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/test_full.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/test_smoke.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/tui_test.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/auto_solve_audit.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/backfill_hle_curiosity.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/backup.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/bench_inference.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/bump_version.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/classify_pulse.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/consume_retrieval_queue.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/curiosity_idle_cycle.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/dedupe_dispatch_queues.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/dispatch_report.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/drydock_status.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/fetch_arxiv_abstracts.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_aggregate.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_babysitter.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_burndown.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_burndown_keepalive.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_burndown_status.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_eval.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_eval_seed.jsonl +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/notify_release.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/queue_top.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/rejudge_hle.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/start_steering_sidecar.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/tool_usage_report.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/conftest.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/common.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/utils.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/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.43 → drydock_cli-2.8.45}/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.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agents.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_algebra_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_auto_retrieve_soft_nudge.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_auto_solve.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_chemistry_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_classifier.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_dispatch_report.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hle_score_method_split.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hle_typing.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_integration.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_linear_algebra_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_logic_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_message_id.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_middleware.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_number_theory_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_rejudge_hle.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_set_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_smoke.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_solve_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_stats_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_units_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_workloads.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/uv.lock +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/README.md +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2172060
|
|
@@ -18,6 +18,15 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
|
|
|
18
18
|
AWQ-4bit on vLLM is the historical alternate path and stays available
|
|
19
19
|
via `/data3/Models/start_gemma4.sh` (the vLLM script — NOT the
|
|
20
20
|
llama.cpp one). Speed: ~64 tok/s e2e on Q3.
|
|
21
|
+
- **Vision (2026-05-16, GH #23):** `/data3/Models/mmproj-F16.gguf`
|
|
22
|
+
(1.2 GB, unsloth/gemma-4-26B-A4B-it-GGUF). Loaded via
|
|
23
|
+
`--mmproj /models/mmproj-F16.gguf` in `start_gemma4_llamacpp.sh`.
|
|
24
|
+
Container reports `projector: gemma4v` and accepts OpenAI-style
|
|
25
|
+
multimodal messages (`content: [{type:text}, {type:image_url}]`).
|
|
26
|
+
Verified with a base64 test image — model received 284 prompt tokens
|
|
27
|
+
for `text + 1×1 image`. Server-side ONLY; drydock TUI does not yet
|
|
28
|
+
have an image-attach affordance — the server-side capability is the
|
|
29
|
+
prereq for that work.
|
|
21
30
|
- **The honest test:** `scripts/shakedown_interactive.py` — drives the real TUI
|
|
22
31
|
via pexpect with a multi-step user conversation (24 steps per PRD: plan,
|
|
23
32
|
build, test, add features, debug, review code, edge cases, README).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.45
|
|
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
|
|
@@ -36,6 +36,17 @@ class CommandRegistry:
|
|
|
36
36
|
description="Clear conversation history",
|
|
37
37
|
handler="_clear_history",
|
|
38
38
|
),
|
|
39
|
+
"undo": Command(
|
|
40
|
+
aliases=frozenset(["/undo", "/back"]),
|
|
41
|
+
description=(
|
|
42
|
+
"Roll back the last turn — drop the most recent user "
|
|
43
|
+
"prompt and the assistant turn it triggered. Use when "
|
|
44
|
+
"an API error or bad tool call wedged the conversation "
|
|
45
|
+
"and you want to retry from the previous good state "
|
|
46
|
+
"without losing the rest of the history (unlike /clear)."
|
|
47
|
+
),
|
|
48
|
+
handler="_undo_last_turn",
|
|
49
|
+
),
|
|
39
50
|
"log": Command(
|
|
40
51
|
aliases=frozenset(["/log"]),
|
|
41
52
|
description="Show path to current interaction log file",
|
|
@@ -2204,6 +2204,41 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
2204
2204
|
)
|
|
2205
2205
|
)
|
|
2206
2206
|
|
|
2207
|
+
async def _undo_last_turn(self) -> None:
|
|
2208
|
+
"""Roll back the last user→assistant turn without wiping the
|
|
2209
|
+
whole session. Safer alternative to /clear when an error
|
|
2210
|
+
wedges the conversation."""
|
|
2211
|
+
if self._agent_running:
|
|
2212
|
+
await self._mount_and_scroll(
|
|
2213
|
+
ErrorMessage(
|
|
2214
|
+
"Cannot /undo while the agent is processing. "
|
|
2215
|
+
"Press Esc to cancel first, then /undo.",
|
|
2216
|
+
collapsed=self._tools_collapsed,
|
|
2217
|
+
)
|
|
2218
|
+
)
|
|
2219
|
+
return
|
|
2220
|
+
try:
|
|
2221
|
+
ok, info = await self.agent_loop.undo_last_turn()
|
|
2222
|
+
if not ok:
|
|
2223
|
+
await self._mount_and_scroll(
|
|
2224
|
+
ErrorMessage(info, collapsed=self._tools_collapsed)
|
|
2225
|
+
)
|
|
2226
|
+
return
|
|
2227
|
+
# The conversation history is now rolled back. We don't try
|
|
2228
|
+
# to selectively remove rendered UI widgets — that's fragile
|
|
2229
|
+
# since the assistant turn we dropped may have produced
|
|
2230
|
+
# multiple widgets (text, tool calls, tool results). Instead,
|
|
2231
|
+
# emit a clear marker so the user sees where the rollback
|
|
2232
|
+
# happened. Subsequent prompts will start fresh against the
|
|
2233
|
+
# truncated message history.
|
|
2234
|
+
await self._mount_and_scroll(UserCommandMessage(info))
|
|
2235
|
+
except Exception as e: # noqa: BLE001
|
|
2236
|
+
await self._mount_and_scroll(
|
|
2237
|
+
ErrorMessage(
|
|
2238
|
+
f"Undo failed: {e}", collapsed=self._tools_collapsed
|
|
2239
|
+
)
|
|
2240
|
+
)
|
|
2241
|
+
|
|
2207
2242
|
async def _clear_history(self) -> None:
|
|
2208
2243
|
try:
|
|
2209
2244
|
self._reset_ui_state()
|
|
@@ -729,6 +729,23 @@ class AgentLoop:
|
|
|
729
729
|
if user_message.message_id is None:
|
|
730
730
|
raise AgentLoopError("User message must have a message_id")
|
|
731
731
|
|
|
732
|
+
# Reset sticky error counters on every fresh user turn. Without
|
|
733
|
+
# this, once `_total_error_rounds` hits the 3-round stop ceiling
|
|
734
|
+
# (~45 API errors), it stays at 3 forever — every subsequent
|
|
735
|
+
# user message immediately re-trips the ceiling on its first
|
|
736
|
+
# API error and aborts. Users were stuck typing /clear (which
|
|
737
|
+
# wipes the whole session) just to recover. The user has
|
|
738
|
+
# manually intervened by typing again; they earn a fresh
|
|
739
|
+
# error budget. The bad messages may also have been
|
|
740
|
+
# dropped/compacted by the previous round's recovery path, so
|
|
741
|
+
# the new turn often succeeds where the prior round couldn't.
|
|
742
|
+
if getattr(self, "_total_error_rounds", 0) > 0:
|
|
743
|
+
logger.warning(
|
|
744
|
+
"[recovery] resetting _total_error_rounds=%d → 0 on new user turn",
|
|
745
|
+
self._total_error_rounds,
|
|
746
|
+
)
|
|
747
|
+
self._total_error_rounds = 0
|
|
748
|
+
|
|
732
749
|
# Flush the user message to disk RIGHT NOW, before the LLM call.
|
|
733
750
|
# Without this, messages.jsonl only updates after the model yields
|
|
734
751
|
# — for silent/slow prompts the user message is invisible to any
|
|
@@ -1050,8 +1067,44 @@ class AgentLoop:
|
|
|
1050
1067
|
self._total_error_rounds = 0
|
|
1051
1068
|
self._total_error_rounds += 1
|
|
1052
1069
|
if self._total_error_rounds >= 3:
|
|
1070
|
+
# Hard-stop after 3 rounds of recovery attempts.
|
|
1071
|
+
# Drop the LAST user→assistant block so the next
|
|
1072
|
+
# user message doesn't immediately re-trigger the
|
|
1073
|
+
# same broken state. Counter resets on the next
|
|
1074
|
+
# _conversation_loop entry, so the user can just
|
|
1075
|
+
# type the next message and continue without
|
|
1076
|
+
# losing their entire context.
|
|
1077
|
+
try:
|
|
1078
|
+
# Find the last user message; truncate to it.
|
|
1079
|
+
# Keep everything up to AND INCLUDING that
|
|
1080
|
+
# message; drop the assistant garbage after.
|
|
1081
|
+
last_user_idx = -1
|
|
1082
|
+
for i in range(len(self.messages) - 1, -1, -1):
|
|
1083
|
+
if self.messages[i].role == Role.user:
|
|
1084
|
+
last_user_idx = i
|
|
1085
|
+
break
|
|
1086
|
+
if last_user_idx >= 0 and last_user_idx < len(self.messages) - 1:
|
|
1087
|
+
kept = list(self.messages[: last_user_idx + 1])
|
|
1088
|
+
self.messages.reset(kept)
|
|
1089
|
+
logger.warning(
|
|
1090
|
+
"[recovery] hard-stop: dropped %d messages "
|
|
1091
|
+
"after last user turn (idx=%d)",
|
|
1092
|
+
len(self.messages) - last_user_idx - 1,
|
|
1093
|
+
last_user_idx,
|
|
1094
|
+
)
|
|
1095
|
+
except Exception as _drop_err: # noqa: BLE001
|
|
1096
|
+
logger.warning(
|
|
1097
|
+
"[recovery] hard-stop drop failed: %s",
|
|
1098
|
+
_drop_err,
|
|
1099
|
+
)
|
|
1053
1100
|
yield AssistantEvent(
|
|
1054
|
-
content=
|
|
1101
|
+
content=(
|
|
1102
|
+
f"\n\n[Stopping after {self._total_error_rounds * MAX_API_ERRORS}+ "
|
|
1103
|
+
f"API errors. Conversation rolled back to your "
|
|
1104
|
+
f"last message — just type your next request "
|
|
1105
|
+
f"to continue. (Use /compact if context is "
|
|
1106
|
+
f"genuinely too long, /clear only to fully reset.)]\n"
|
|
1107
|
+
),
|
|
1055
1108
|
)
|
|
1056
1109
|
return
|
|
1057
1110
|
|
|
@@ -4320,6 +4373,70 @@ or replace freely; future sessions will respect your edits._
|
|
|
4320
4373
|
def set_user_input_callback(self, callback: UserInputCallback) -> None:
|
|
4321
4374
|
self.user_input_callback = callback
|
|
4322
4375
|
|
|
4376
|
+
async def undo_last_turn(self) -> tuple[bool, str]:
|
|
4377
|
+
"""Rewind history past the LAST user message, dropping the
|
|
4378
|
+
assistant turn (and any tool results) it triggered AND the
|
|
4379
|
+
user message itself. Use case: the last user prompt set off
|
|
4380
|
+
a chain that wedged the conversation; the user wants to back
|
|
4381
|
+
out and try a different prompt.
|
|
4382
|
+
|
|
4383
|
+
Returns (success, info_message).
|
|
4384
|
+
|
|
4385
|
+
Why this is safer than `/clear`:
|
|
4386
|
+
- Preserves the system message (index 0)
|
|
4387
|
+
- Preserves all prior good user+assistant exchanges
|
|
4388
|
+
- Resets the sticky error counters so the new prompt
|
|
4389
|
+
won't immediately re-trip the lockout
|
|
4390
|
+
|
|
4391
|
+
Why drop the user message too (not just the assistant turn):
|
|
4392
|
+
- If the user repeats the same prompt, they'll re-trigger
|
|
4393
|
+
the same bad assistant response. The point of /undo is
|
|
4394
|
+
to escape; the user can always re-type the prompt if
|
|
4395
|
+
they really want it.
|
|
4396
|
+
"""
|
|
4397
|
+
# Find the last user message — walk backward
|
|
4398
|
+
last_user_idx = -1
|
|
4399
|
+
for i in range(len(self.messages) - 1, -1, -1):
|
|
4400
|
+
if self.messages[i].role == Role.user:
|
|
4401
|
+
last_user_idx = i
|
|
4402
|
+
break
|
|
4403
|
+
|
|
4404
|
+
if last_user_idx <= 0:
|
|
4405
|
+
# No user message to rewind past (only the system message
|
|
4406
|
+
# is present), or the user message is at idx 0 which we
|
|
4407
|
+
# never drop. Nothing to undo.
|
|
4408
|
+
return (False, "Nothing to undo — no prior user turn in history.")
|
|
4409
|
+
|
|
4410
|
+
dropped = len(self.messages) - last_user_idx
|
|
4411
|
+
kept = list(self.messages[:last_user_idx])
|
|
4412
|
+
try:
|
|
4413
|
+
await self.session_logger.save_interaction(
|
|
4414
|
+
self.messages,
|
|
4415
|
+
self.stats,
|
|
4416
|
+
self._base_config,
|
|
4417
|
+
self.tool_manager,
|
|
4418
|
+
self.agent_profile,
|
|
4419
|
+
)
|
|
4420
|
+
except Exception as e: # noqa: BLE001 — never block /undo on a save failure
|
|
4421
|
+
logger.warning("[undo] session save failed (continuing): %s", e)
|
|
4422
|
+
self.messages.reset(kept)
|
|
4423
|
+
# Clear the sticky error counters so the next prompt starts fresh.
|
|
4424
|
+
if hasattr(self, "_total_error_rounds"):
|
|
4425
|
+
self._total_error_rounds = 0
|
|
4426
|
+
if hasattr(self, "_consecutive_circuit_breaker_fires"):
|
|
4427
|
+
self._consecutive_circuit_breaker_fires = 0
|
|
4428
|
+
if hasattr(self, "_consecutive_empty_turns"):
|
|
4429
|
+
self._consecutive_empty_turns = 0
|
|
4430
|
+
logger.warning(
|
|
4431
|
+
"[undo] rolled back: kept %d messages (dropped %d after last user idx=%d)",
|
|
4432
|
+
len(kept), dropped, last_user_idx,
|
|
4433
|
+
)
|
|
4434
|
+
return (
|
|
4435
|
+
True,
|
|
4436
|
+
f"Rolled back the last turn — dropped {dropped} message(s). "
|
|
4437
|
+
f"Type your next prompt to continue from the prior state.",
|
|
4438
|
+
)
|
|
4439
|
+
|
|
4323
4440
|
async def clear_history(self) -> None:
|
|
4324
4441
|
await self.session_logger.save_interaction(
|
|
4325
4442
|
self.messages,
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""Regression tests for the unrecoverable-API-error fix.
|
|
2
|
+
|
|
3
|
+
The bug (reported 2026-05-16): once the agent loop hit
|
|
4
|
+
`_total_error_rounds >= 3`, it stayed stuck — every subsequent user
|
|
5
|
+
message tripped the ceiling on its first API error and aborted.
|
|
6
|
+
The only escape was `/clear`, which wipes the entire session.
|
|
7
|
+
|
|
8
|
+
The fix has two parts:
|
|
9
|
+
1. Reset `_total_error_rounds` to 0 at the top of each new
|
|
10
|
+
`_conversation_loop` (= new user turn).
|
|
11
|
+
2. On the hard-stop path, drop messages after the last user
|
|
12
|
+
turn so the broken state doesn't immediately re-trip the same
|
|
13
|
+
error on the next attempt.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
from unittest.mock import MagicMock
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _make_stub_loop():
|
|
22
|
+
"""Minimal stub object that exercises just the reset semantics
|
|
23
|
+
without needing a full AgentLoop construction (which requires
|
|
24
|
+
a real backend, tools, config, etc.)."""
|
|
25
|
+
loop = MagicMock()
|
|
26
|
+
loop._total_error_rounds = 0
|
|
27
|
+
return loop
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_total_error_rounds_starts_at_zero():
|
|
31
|
+
"""Baseline — fresh agent loops should have rounds=0."""
|
|
32
|
+
loop = _make_stub_loop()
|
|
33
|
+
assert loop._total_error_rounds == 0
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_reset_on_new_user_turn_clears_sticky_state():
|
|
37
|
+
"""The hard-stop ceiling was sticky pre-fix. After the fix,
|
|
38
|
+
`_conversation_loop` resets `_total_error_rounds` at entry so
|
|
39
|
+
subsequent user messages get a fresh error budget."""
|
|
40
|
+
# Simulate the reset block from _conversation_loop:
|
|
41
|
+
loop = _make_stub_loop()
|
|
42
|
+
loop._total_error_rounds = 3 # hit the stop ceiling
|
|
43
|
+
|
|
44
|
+
# The fix logic — extracted to validate it in isolation:
|
|
45
|
+
if getattr(loop, "_total_error_rounds", 0) > 0:
|
|
46
|
+
loop._total_error_rounds = 0
|
|
47
|
+
|
|
48
|
+
assert loop._total_error_rounds == 0
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_drop_messages_after_last_user_turn_on_hard_stop():
|
|
52
|
+
"""Hard-stop path should rewind history to the last user
|
|
53
|
+
message so the next turn doesn't re-trigger the same error.
|
|
54
|
+
Validates the slice/keep logic independent of AgentLoop."""
|
|
55
|
+
|
|
56
|
+
class FakeMsg:
|
|
57
|
+
def __init__(self, role, content=""):
|
|
58
|
+
self.role = role
|
|
59
|
+
self.content = content
|
|
60
|
+
|
|
61
|
+
class Role:
|
|
62
|
+
user = "user"
|
|
63
|
+
assistant = "assistant"
|
|
64
|
+
tool = "tool"
|
|
65
|
+
|
|
66
|
+
msgs = [
|
|
67
|
+
FakeMsg(Role.user, "first prompt"),
|
|
68
|
+
FakeMsg(Role.assistant, "first reply"),
|
|
69
|
+
FakeMsg(Role.user, "second prompt"),
|
|
70
|
+
FakeMsg(Role.assistant, "broken tool_call attempt"),
|
|
71
|
+
FakeMsg(Role.tool, "error result"),
|
|
72
|
+
FakeMsg(Role.assistant, "another bad attempt"),
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
# Find last user message index — matches the fix's loop
|
|
76
|
+
last_user_idx = -1
|
|
77
|
+
for i in range(len(msgs) - 1, -1, -1):
|
|
78
|
+
if msgs[i].role == Role.user:
|
|
79
|
+
last_user_idx = i
|
|
80
|
+
break
|
|
81
|
+
|
|
82
|
+
assert last_user_idx == 2
|
|
83
|
+
kept = msgs[: last_user_idx + 1]
|
|
84
|
+
assert len(kept) == 3
|
|
85
|
+
assert kept[-1].role == Role.user
|
|
86
|
+
assert kept[-1].content == "second prompt"
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_drop_is_safe_when_last_message_is_already_user():
|
|
90
|
+
"""If the last message is already a user turn (nothing after),
|
|
91
|
+
the drop should be a no-op."""
|
|
92
|
+
|
|
93
|
+
class FakeMsg:
|
|
94
|
+
def __init__(self, role, content=""):
|
|
95
|
+
self.role = role
|
|
96
|
+
self.content = content
|
|
97
|
+
|
|
98
|
+
class Role:
|
|
99
|
+
user = "user"
|
|
100
|
+
assistant = "assistant"
|
|
101
|
+
|
|
102
|
+
msgs = [
|
|
103
|
+
FakeMsg(Role.user, "only message"),
|
|
104
|
+
]
|
|
105
|
+
last_user_idx = -1
|
|
106
|
+
for i in range(len(msgs) - 1, -1, -1):
|
|
107
|
+
if msgs[i].role == Role.user:
|
|
108
|
+
last_user_idx = i
|
|
109
|
+
break
|
|
110
|
+
|
|
111
|
+
# The fix's guard: `last_user_idx < len(self.messages) - 1`
|
|
112
|
+
should_drop = last_user_idx >= 0 and last_user_idx < len(msgs) - 1
|
|
113
|
+
assert should_drop is False # nothing to drop
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def test_reset_skipped_when_already_zero():
|
|
117
|
+
"""The reset path logs when rounds > 0 and skips otherwise — no
|
|
118
|
+
side effects for healthy sessions."""
|
|
119
|
+
loop = _make_stub_loop()
|
|
120
|
+
loop._total_error_rounds = 0
|
|
121
|
+
|
|
122
|
+
triggered_reset = False
|
|
123
|
+
if getattr(loop, "_total_error_rounds", 0) > 0:
|
|
124
|
+
triggered_reset = True
|
|
125
|
+
loop._total_error_rounds = 0
|
|
126
|
+
|
|
127
|
+
assert triggered_reset is False
|
|
128
|
+
assert loop._total_error_rounds == 0
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# ── Integration via the real _conversation_loop entry ──────────────────
|
|
132
|
+
|
|
133
|
+
def test_conversation_loop_resets_total_error_rounds_on_entry():
|
|
134
|
+
"""The actual code path: `_conversation_loop` should reset the
|
|
135
|
+
counter to 0 before any LLM work happens. We patch AgentLoop's
|
|
136
|
+
dependencies to skip the LLM call and just verify the counter."""
|
|
137
|
+
# This is a partial-integration test — it imports the real method
|
|
138
|
+
# and exercises its early code path. We don't run a full LLM turn.
|
|
139
|
+
from drydock.core.agent_loop import AgentLoop # noqa: F401
|
|
140
|
+
|
|
141
|
+
# Verify the source code contains the reset block at the
|
|
142
|
+
# `_conversation_loop` site. (A behavioural test would require
|
|
143
|
+
# mocking the whole agent loop; this string-check is the
|
|
144
|
+
# cheapest reliable regression.)
|
|
145
|
+
import inspect
|
|
146
|
+
src = inspect.getsource(AgentLoop._conversation_loop)
|
|
147
|
+
assert "_total_error_rounds" in src
|
|
148
|
+
assert "= 0" in src
|
|
149
|
+
assert "fresh user turn" in src or "Reset sticky error" in src
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# ── /undo slash command ────────────────────────────────────────────────
|
|
153
|
+
|
|
154
|
+
def test_undo_command_registered_with_aliases():
|
|
155
|
+
"""The /undo command must be in the registry with /back as alias."""
|
|
156
|
+
from drydock.cli.commands import CommandRegistry
|
|
157
|
+
r = CommandRegistry()
|
|
158
|
+
cmd = r.commands.get("undo")
|
|
159
|
+
assert cmd is not None
|
|
160
|
+
assert "/undo" in cmd.aliases
|
|
161
|
+
assert "/back" in cmd.aliases
|
|
162
|
+
assert cmd.handler == "_undo_last_turn"
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def test_agent_loop_undo_last_turn_method_exists():
|
|
166
|
+
"""The agent loop must expose undo_last_turn for the TUI handler."""
|
|
167
|
+
from drydock.core.agent_loop import AgentLoop
|
|
168
|
+
assert callable(getattr(AgentLoop, "undo_last_turn", None))
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def test_undo_keeps_system_and_truncates_to_before_last_user():
|
|
172
|
+
"""Validate the rewind shape: drop the last user msg + everything
|
|
173
|
+
after it; keep the system message and all prior turns."""
|
|
174
|
+
import inspect
|
|
175
|
+
from drydock.core.agent_loop import AgentLoop
|
|
176
|
+
src = inspect.getsource(AgentLoop.undo_last_turn)
|
|
177
|
+
# The implementation must walk backward to find the last user idx,
|
|
178
|
+
# then slice the messages to keep only [:last_user_idx].
|
|
179
|
+
assert "last_user_idx" in src
|
|
180
|
+
assert "Role.user" in src
|
|
181
|
+
assert ".reset(" in src
|
|
182
|
+
# It must also clear the sticky error counters so the next prompt
|
|
183
|
+
# doesn't immediately re-trip the lockout.
|
|
184
|
+
assert "_total_error_rounds" in src
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def test_undo_returns_failure_when_only_system_message():
|
|
188
|
+
"""If there's no user message to rewind past, undo should return
|
|
189
|
+
(False, info) rather than wiping the system message."""
|
|
190
|
+
import inspect
|
|
191
|
+
from drydock.core.agent_loop import AgentLoop
|
|
192
|
+
src = inspect.getsource(AgentLoop.undo_last_turn)
|
|
193
|
+
# Guard condition for "no user message" or "only system message"
|
|
194
|
+
assert "last_user_idx <= 0" in src or "last_user_idx == -1" in src
|
|
195
|
+
assert "Nothing to undo" in src
|
|
@@ -1,5 +1,53 @@
|
|
|
1
1
|
# Drydock Trip Log
|
|
2
2
|
|
|
3
|
+
## 2026-05-16 12:00 UTC tick
|
|
4
|
+
- Stress: paused (.pause_stress sentinel active)
|
|
5
|
+
- Write rate: N/A (stress paused)
|
|
6
|
+
- HLE burndown: running (PID 2157358, slot 33 "other" category); lifetime 12.1% (72/594): Math 17.1%, Bio/Med 14.3%, CS/AI 2.4%, Chemistry 6.1%, Engineering 6.1%, Physics 3.1%
|
|
7
|
+
- Recent batches declining (60%→0%) as burndown cycles into hard CS/AI questions — not a regression; CS/AI 2.4% is baseline for this model on symbolic/graph-theory problems; earlier Math 6/10 batch confirms Math loop is healthy
|
|
8
|
+
- vLLM 400s: 0 (llamacpp-gemma4 healthy, reasoning-budget=12000 confirmed in container config)
|
|
9
|
+
- GH issues: 1 open (#23 image-processing multimodal enhancement — not actionable this tick)
|
|
10
|
+
- Dispatch queue: harness=8 (all thinking_stall, fully addressed by prior commits), retrieval=0 actionable, curiosity=1950 pending (316 hle_failure, 1635 unknown_term)
|
|
11
|
+
- Retrieval drain: 0 projects ingested (all already ingested recently)
|
|
12
|
+
- Curiosity: consumed 30cceb0645e3c41e (JS timeout hle_failure — pre-fix thinking stall, addressed by reasoning-budget=12000 + STOP_NOW fixes)
|
|
13
|
+
- Action this tick: no code changes — all dispatch patterns addressed, CS/AI 0% is model capability not a drydock bug
|
|
14
|
+
|
|
15
|
+
## 2026-05-16 12:30 UTC tick
|
|
16
|
+
- Stress: paused (.pause_stress sentinel active)
|
|
17
|
+
- Write rate: N/A (stress paused)
|
|
18
|
+
- HLE burndown: running (PID 2157358, 43m elapsed); lifetime 12.3% (74/600): Math 17.1%, Bio/Med 14.3%, CS/AI 2.4%, Chemistry 6.1%, Other 18.2%
|
|
19
|
+
- vLLM 400s: 0 (llamacpp-gemma4 healthy, Q3_K_M, reasoning-budget=12000)
|
|
20
|
+
- GH issues: 1 open (#23 image-processing enhancement — not actionable)
|
|
21
|
+
- Dispatch queue: harness=8 (all thinking_stall, fully addressed), retrieval=0 actionable, curiosity=1971 pending (319 hle_failure, 1652 unknown_term)
|
|
22
|
+
- Retrieval drain: 0 projects ingested (all already ingested recently)
|
|
23
|
+
- Curiosity: consumed 21fc1bf2f3913021 (directed multigraph cycle cover — model used tools but no FINAL ANSWER; addressed by 23f3530 force tool_choice=none + b0350cb stall nudge)
|
|
24
|
+
- Action this tick: no code changes — system nominal; all harness:thinking_stall patterns addressed by prior 24h commits; HLE score holding steady at 12.3%
|
|
25
|
+
|
|
26
|
+
## 2026-05-16 11:30 UTC tick
|
|
27
|
+
- Stress: paused (.pause_stress sentinel active)
|
|
28
|
+
- Write rate: N/A (stress paused)
|
|
29
|
+
- HLE burndown: alive (PID 2144966, 52 min), lifetime 71/589 = 12.1% (Math 50/292 = 17.1%, CS/AI 2/81 = 2.5%)
|
|
30
|
+
- Recent batch trend: scores dropped 60%→0% over last 8 batches — NOT a regression. Category rotation has been hitting CS/AI (10:40 UTC 0/10, 10:46 UTC 0/8 ongoing) and Biology (10%). CS/AI is historically 2.5% for this model; both recent CS/AI batches are consistent with baseline. Earlier 6/10 Math batch confirms Math is healthy at ~17%.
|
|
31
|
+
- vLLM (llamacpp-gemma4): healthy, Q3_K_M, reasoning-budget=12000 confirmed active
|
|
32
|
+
- Balancer: healthy on :8001
|
|
33
|
+
- Autonomous review: started 11:30 UTC (prior tick ended 11:05 UTC exit=0)
|
|
34
|
+
- GH issues: 1 open (#23 image processing enhancement, non-critical)
|
|
35
|
+
- Dispatch queue: harness=12 (thinking_stall, all addressed per evidence), retrieval=0 actionable (3 entries, already ingested), curiosity=1945 pending (1632 unknown_term, 314 hle_failure)
|
|
36
|
+
- Action this tick: consumed curiosity d287eae28286f71b (Make 24 no-FINAL-ANSWER case, addressed by 23f3530 force-tool_choice-none fix). No code change — system healthy, HLE running, all loops nominal.
|
|
37
|
+
|
|
38
|
+
## 2026-05-16 11:00 UTC tick
|
|
39
|
+
- Stress: paused (.pause_stress sentinel active)
|
|
40
|
+
- Write rate: N/A (stress paused)
|
|
41
|
+
- HLE burndown: alive (PID 2144966, 19h+ elapsed), lifetime 71/584 = 12.2% (Math 50/292 = 17.1%, CS/AI 2/76 = 2.6%)
|
|
42
|
+
- Recent batch trend: score drop from ~30% (Math) to 0% (CS/AI) is category-rotation driven — model historically 2.6% on CS/AI vs 17.1% Math; empty:no_response on two coding questions is thinking-budget exhaustion (12000-token budget × ~50 tok/s ≈ 240s, plus prompt overhead)
|
|
43
|
+
- vLLM (llamacpp-gemma4): healthy, Q3_K_M, reasoning-budget=12000
|
|
44
|
+
- Balancer: healthy on :8001
|
|
45
|
+
- Autonomous review: started 11:00 UTC (prior run ended 10:35 UTC)
|
|
46
|
+
- GH issues: 1 open (#23 image processing enhancement, non-critical)
|
|
47
|
+
- Dispatch queue: harness=12 (thinking_stall, all addressed per prior commits), retrieval=0 actionable, curiosity=1925 pending
|
|
48
|
+
- Retrieval drain: 0 ingested (3 entries, all recently ingested)
|
|
49
|
+
- Action this tick: consumed 3 stale curiosity items (chemistry no_final_answer from pre-v2.8.42 era, before judge fix e3a3a9d and stall fixes b0350cb/23f3530 — no code change needed)
|
|
50
|
+
|
|
3
51
|
## 2026-05-16 10:30 UTC tick
|
|
4
52
|
- Stress: paused (.pause_stress sentinel active)
|
|
5
53
|
- Write rate: N/A (stress paused)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2148271
|
|
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
|