drydock-cli 2.8.44__tar.gz → 2.8.46__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.46/.auto_release.lock +1 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/PKG-INFO +1 -1
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/commands.py +25 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/app.py +187 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agent_loop.py +148 -0
- drydock_cli-2.8.46/drydock/core/goal.py +147 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/pyproject.toml +1 -1
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_api_error_recovery.py +46 -0
- drydock_cli-2.8.46/tests/test_goal.py +203 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/trip_log.md +13 -0
- drydock_cli-2.8.44/.auto_release.lock +0 -1
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.gitignore +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.pause_stress +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.python-version +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.typos.toml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.vscode/extensions.json +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.vscode/launch.json +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.vscode/settings.json +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/AGENTS.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/Admiral.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/CHANGELOG.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/CLAUDE.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/DEEP_NOIR_PRD.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/DRYDOCK.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/HLE_PRD.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/JETSON_BENCH.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/LICENSE +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/NOTICE +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/README.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/SOVEREIGN_PRD.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/action.yml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/README.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/README.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/acp-setup.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/BASELINE_412.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/Drydock_rebrand.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/PRD.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/drydock_terms.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/resume.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/__main__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auto_solve.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/constraint_extract.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/constraint_hint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/logger.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/slug.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/algebra_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/logic_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/set_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/solve_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/stats_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/units_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/types.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/utils.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/gap_detector.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/config.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/scan_sessions.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/whats_new.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock-acp.spec +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/flake.lock +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/flake.nix +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/outlook_draft_assistant.tar.gz +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/README.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/config_base.toml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/config_best.toml +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/domain_spec.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/experimenter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/kernel.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/mini_prd.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/proposer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/results.tsv +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/resume.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/README.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/auto_test_loop.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/monitor_test_battery.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/overnight_agents_test.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/test_bank.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/test_full.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/test_smoke.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/tui_test.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/auto_solve_audit.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/backfill_hle_curiosity.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/backup.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/bench_inference.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/bump_version.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/classify_pulse.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/consume_retrieval_queue.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/curiosity_idle_cycle.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/dedupe_dispatch_queues.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/dispatch_report.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/drydock_status.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/fetch_arxiv_abstracts.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_aggregate.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_babysitter.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_burndown.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_burndown_keepalive.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_burndown_status.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_eval.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_eval_seed.jsonl +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/notify_release.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/queue_top.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/rejudge_hle.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/start_steering_sidecar.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/tool_usage_report.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/conftest.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/common.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/utils.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/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.44 → drydock_cli-2.8.46}/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.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agents.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_algebra_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_auto_retrieve_soft_nudge.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_auto_solve.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_chemistry_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_classifier.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_dispatch_report.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hle_score_method_split.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hle_typing.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_integration.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_linear_algebra_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_logic_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_message_id.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_middleware.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_number_theory_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_rejudge_hle.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_set_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_smoke.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_solve_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_stats_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_units_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_workloads.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/uv.lock +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/README.md +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2173622
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.46
|
|
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,31 @@ 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
|
+
),
|
|
50
|
+
"goal": Command(
|
|
51
|
+
aliases=frozenset(["/goal"]),
|
|
52
|
+
description=(
|
|
53
|
+
"Set a completion condition and auto-continue across "
|
|
54
|
+
"turns until met. Usage:\n"
|
|
55
|
+
" /goal <condition> — set a goal\n"
|
|
56
|
+
" /goal — show current goal status\n"
|
|
57
|
+
" /goal clear — cancel the active goal\n"
|
|
58
|
+
"After each turn, a small evaluator checks the "
|
|
59
|
+
"condition. If not met, drydock injects a continuation "
|
|
60
|
+
"prompt and runs another turn (capped at 20 iterations)."
|
|
61
|
+
),
|
|
62
|
+
handler="_goal_command",
|
|
63
|
+
),
|
|
39
64
|
"log": Command(
|
|
40
65
|
aliases=frozenset(["/log"]),
|
|
41
66
|
description="Show path to current interaction log file",
|
|
@@ -851,6 +851,21 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
851
851
|
loading_widget=self._loading_widget,
|
|
852
852
|
)
|
|
853
853
|
|
|
854
|
+
# /goal post-turn hook — if a goal is active, ask the
|
|
855
|
+
# evaluator whether the condition is met. Met → clear and
|
|
856
|
+
# tell the user. Not met → queue a continuation prompt so
|
|
857
|
+
# the next turn fires automatically. The hook only runs on
|
|
858
|
+
# the success path (skipped on exception below) so a broken
|
|
859
|
+
# turn doesn't trigger an auto-continuation that re-trips
|
|
860
|
+
# the same failure.
|
|
861
|
+
try:
|
|
862
|
+
await self._check_goal_continuation()
|
|
863
|
+
except Exception as _goal_e: # noqa: BLE001
|
|
864
|
+
import logging
|
|
865
|
+
logging.getLogger(__name__).warning(
|
|
866
|
+
"[goal] post-turn hook failed (skipped): %s", _goal_e,
|
|
867
|
+
)
|
|
868
|
+
|
|
854
869
|
except asyncio.CancelledError:
|
|
855
870
|
if self._loading_widget and self._loading_widget.parent:
|
|
856
871
|
await self._loading_widget.remove()
|
|
@@ -2204,6 +2219,178 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
2204
2219
|
)
|
|
2205
2220
|
)
|
|
2206
2221
|
|
|
2222
|
+
async def _check_goal_continuation(self) -> None:
|
|
2223
|
+
"""Called from `_handle_agent_loop_turn` after the agent's turn
|
|
2224
|
+
finishes. If a goal is active, run the evaluator and either
|
|
2225
|
+
clear (met) or queue a continuation prompt (not met).
|
|
2226
|
+
"""
|
|
2227
|
+
loop = self.agent_loop
|
|
2228
|
+
goal = getattr(loop, "goal", None)
|
|
2229
|
+
if goal is None or not goal.active:
|
|
2230
|
+
return
|
|
2231
|
+
|
|
2232
|
+
# Cap check first — never call the evaluator past the cap.
|
|
2233
|
+
if goal.iterations >= goal.max_iterations:
|
|
2234
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2235
|
+
f"**Goal hit iteration cap** ({goal.max_iterations}). "
|
|
2236
|
+
f"Stopping auto-continuation for: _{goal.condition}_.\n\n"
|
|
2237
|
+
f"Last verdict: {goal.last_verdict or '(none)'}. "
|
|
2238
|
+
f"Re-issue `/goal <condition>` to restart, or send a "
|
|
2239
|
+
f"normal prompt to continue manually."
|
|
2240
|
+
))
|
|
2241
|
+
loop.clear_goal()
|
|
2242
|
+
return
|
|
2243
|
+
|
|
2244
|
+
# If the user typed something while we were processing, defer
|
|
2245
|
+
# to their input — don't pre-empt with an auto-continuation.
|
|
2246
|
+
# The queued message will run via _process_queued_message in
|
|
2247
|
+
# the `finally` block below, and the goal will re-evaluate
|
|
2248
|
+
# after THAT turn.
|
|
2249
|
+
if hasattr(self, "_pending_messages") and self._pending_messages:
|
|
2250
|
+
return
|
|
2251
|
+
|
|
2252
|
+
verdict, reasoning = await loop.evaluate_goal()
|
|
2253
|
+
goal.iterations += 1
|
|
2254
|
+
|
|
2255
|
+
if verdict == "YES":
|
|
2256
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2257
|
+
f"**Goal met** after {goal.iterations} turn(s): "
|
|
2258
|
+
f"_{goal.condition}_.\n\n"
|
|
2259
|
+
f"Evaluator reasoning: {reasoning or '—'}\n\n"
|
|
2260
|
+
f"Auto-continuation cleared."
|
|
2261
|
+
))
|
|
2262
|
+
loop.clear_goal()
|
|
2263
|
+
return
|
|
2264
|
+
|
|
2265
|
+
if verdict == "ERROR":
|
|
2266
|
+
# Repeated evaluator errors are not the model's fault and
|
|
2267
|
+
# shouldn't lock the user in. Three errors → stop.
|
|
2268
|
+
err_key = "_goal_eval_error_streak"
|
|
2269
|
+
n = getattr(self, err_key, 0) + 1
|
|
2270
|
+
setattr(self, err_key, n)
|
|
2271
|
+
if n >= 3:
|
|
2272
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2273
|
+
f"**Goal evaluator failing repeatedly** (3 errors in a "
|
|
2274
|
+
f"row). Last reason: {reasoning}. Clearing the goal — "
|
|
2275
|
+
f"re-issue `/goal` to retry."
|
|
2276
|
+
))
|
|
2277
|
+
loop.clear_goal()
|
|
2278
|
+
setattr(self, err_key, 0)
|
|
2279
|
+
return
|
|
2280
|
+
# On a single error, keep the goal but don't auto-continue —
|
|
2281
|
+
# safer than running another turn blind.
|
|
2282
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2283
|
+
f"Goal evaluator returned an error: {reasoning}. "
|
|
2284
|
+
f"Pausing auto-continuation for this turn; goal still "
|
|
2285
|
+
f"active. Type any prompt to continue manually."
|
|
2286
|
+
))
|
|
2287
|
+
return
|
|
2288
|
+
|
|
2289
|
+
# NO — queue a continuation prompt so the next turn fires.
|
|
2290
|
+
setattr(self, "_goal_eval_error_streak", 0)
|
|
2291
|
+
from drydock.core.goal import make_continuation_prompt
|
|
2292
|
+
cont_prompt = make_continuation_prompt(goal)
|
|
2293
|
+
if not hasattr(self, "_pending_messages"):
|
|
2294
|
+
self._pending_messages = []
|
|
2295
|
+
self._pending_messages.append(cont_prompt)
|
|
2296
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2297
|
+
f"_Auto-continuing toward goal (turn {goal.iterations}/"
|
|
2298
|
+
f"{goal.max_iterations}): {reasoning or 'not yet met'}_"
|
|
2299
|
+
))
|
|
2300
|
+
|
|
2301
|
+
async def _goal_command(self, args: str = "") -> None:
|
|
2302
|
+
"""/goal — set / show / clear a session-scoped goal that drives
|
|
2303
|
+
automatic turn-after-turn work toward a verifiable condition.
|
|
2304
|
+
|
|
2305
|
+
Usage:
|
|
2306
|
+
/goal <condition> set a goal (and start auto-continuation)
|
|
2307
|
+
/goal show the current goal's status
|
|
2308
|
+
/goal clear cancel the active goal
|
|
2309
|
+
"""
|
|
2310
|
+
args = (args or "").strip()
|
|
2311
|
+
loop = self.agent_loop
|
|
2312
|
+
|
|
2313
|
+
# Status (no args) — show whatever goal is active
|
|
2314
|
+
if not args:
|
|
2315
|
+
g = getattr(loop, "goal", None)
|
|
2316
|
+
if g is None or not g.active:
|
|
2317
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2318
|
+
"No active goal. Set one with `/goal <condition>`."
|
|
2319
|
+
))
|
|
2320
|
+
return
|
|
2321
|
+
verdict = g.last_verdict or "(not yet evaluated)"
|
|
2322
|
+
reason = g.last_evaluator_reasoning or ""
|
|
2323
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2324
|
+
f"**Goal:** {g.condition}\n\n"
|
|
2325
|
+
f"- Iterations: {g.iterations} / {g.max_iterations}\n"
|
|
2326
|
+
f"- Last verdict: {verdict}\n"
|
|
2327
|
+
f"- Reasoning: {reason or '—'}\n\n"
|
|
2328
|
+
f"Use `/goal clear` to cancel."
|
|
2329
|
+
))
|
|
2330
|
+
return
|
|
2331
|
+
|
|
2332
|
+
# Clear
|
|
2333
|
+
if args.lower() in ("clear", "cancel", "stop", "off"):
|
|
2334
|
+
loop.clear_goal()
|
|
2335
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2336
|
+
"Goal cleared."
|
|
2337
|
+
))
|
|
2338
|
+
return
|
|
2339
|
+
|
|
2340
|
+
# Set a new goal
|
|
2341
|
+
# Read DRYDOCK_GOAL_MAX_ITERATIONS for the operator-overridable cap
|
|
2342
|
+
import os
|
|
2343
|
+
try:
|
|
2344
|
+
cap = int(os.environ.get("DRYDOCK_GOAL_MAX_ITERATIONS", "20"))
|
|
2345
|
+
if cap < 1:
|
|
2346
|
+
cap = 20
|
|
2347
|
+
except ValueError:
|
|
2348
|
+
cap = 20
|
|
2349
|
+
loop.set_goal(args, max_iterations=cap)
|
|
2350
|
+
await self._mount_and_scroll(UserCommandMessage(
|
|
2351
|
+
f"**Goal set:** {args}\n\n"
|
|
2352
|
+
f"After each turn, a fast evaluator will check whether the "
|
|
2353
|
+
f"condition holds. If not, drydock will keep working "
|
|
2354
|
+
f"automatically (up to {cap} turns). The goal will clear "
|
|
2355
|
+
f"once met. Use `/goal` to check status, `/goal clear` to "
|
|
2356
|
+
f"cancel."
|
|
2357
|
+
))
|
|
2358
|
+
|
|
2359
|
+
async def _undo_last_turn(self) -> None:
|
|
2360
|
+
"""Roll back the last user→assistant turn without wiping the
|
|
2361
|
+
whole session. Safer alternative to /clear when an error
|
|
2362
|
+
wedges the conversation."""
|
|
2363
|
+
if self._agent_running:
|
|
2364
|
+
await self._mount_and_scroll(
|
|
2365
|
+
ErrorMessage(
|
|
2366
|
+
"Cannot /undo while the agent is processing. "
|
|
2367
|
+
"Press Esc to cancel first, then /undo.",
|
|
2368
|
+
collapsed=self._tools_collapsed,
|
|
2369
|
+
)
|
|
2370
|
+
)
|
|
2371
|
+
return
|
|
2372
|
+
try:
|
|
2373
|
+
ok, info = await self.agent_loop.undo_last_turn()
|
|
2374
|
+
if not ok:
|
|
2375
|
+
await self._mount_and_scroll(
|
|
2376
|
+
ErrorMessage(info, collapsed=self._tools_collapsed)
|
|
2377
|
+
)
|
|
2378
|
+
return
|
|
2379
|
+
# The conversation history is now rolled back. We don't try
|
|
2380
|
+
# to selectively remove rendered UI widgets — that's fragile
|
|
2381
|
+
# since the assistant turn we dropped may have produced
|
|
2382
|
+
# multiple widgets (text, tool calls, tool results). Instead,
|
|
2383
|
+
# emit a clear marker so the user sees where the rollback
|
|
2384
|
+
# happened. Subsequent prompts will start fresh against the
|
|
2385
|
+
# truncated message history.
|
|
2386
|
+
await self._mount_and_scroll(UserCommandMessage(info))
|
|
2387
|
+
except Exception as e: # noqa: BLE001
|
|
2388
|
+
await self._mount_and_scroll(
|
|
2389
|
+
ErrorMessage(
|
|
2390
|
+
f"Undo failed: {e}", collapsed=self._tools_collapsed
|
|
2391
|
+
)
|
|
2392
|
+
)
|
|
2393
|
+
|
|
2207
2394
|
async def _clear_history(self) -> None:
|
|
2208
2395
|
try:
|
|
2209
2396
|
self._reset_ui_state()
|
|
@@ -4373,6 +4373,150 @@ or replace freely; future sessions will respect your edits._
|
|
|
4373
4373
|
def set_user_input_callback(self, callback: UserInputCallback) -> None:
|
|
4374
4374
|
self.user_input_callback = callback
|
|
4375
4375
|
|
|
4376
|
+
# ------------------------------------------------------------------
|
|
4377
|
+
# Goal pursuit (Claude Code /goal feature) — see drydock/core/goal.py
|
|
4378
|
+
# ------------------------------------------------------------------
|
|
4379
|
+
|
|
4380
|
+
def set_goal(self, condition: str, max_iterations: int = 20) -> None:
|
|
4381
|
+
"""Activate goal-pursuit mode. The TUI calls this when the user
|
|
4382
|
+
types `/goal <condition>`. The agent loop itself doesn't act on
|
|
4383
|
+
the goal — the TUI's post-turn hook checks `self.goal` and
|
|
4384
|
+
decides whether to inject a continuation prompt."""
|
|
4385
|
+
from drydock.core.goal import GoalState
|
|
4386
|
+
self.goal = GoalState(
|
|
4387
|
+
condition=condition.strip(),
|
|
4388
|
+
max_iterations=max_iterations,
|
|
4389
|
+
)
|
|
4390
|
+
logger.warning(
|
|
4391
|
+
"[goal] activated: %r (cap=%d turns)",
|
|
4392
|
+
condition[:80], max_iterations,
|
|
4393
|
+
)
|
|
4394
|
+
|
|
4395
|
+
def clear_goal(self) -> None:
|
|
4396
|
+
"""Cancel goal-pursuit. Idempotent."""
|
|
4397
|
+
if getattr(self, "goal", None) is not None:
|
|
4398
|
+
logger.warning("[goal] cleared")
|
|
4399
|
+
self.goal = None
|
|
4400
|
+
|
|
4401
|
+
async def evaluate_goal(self) -> tuple[str, str]:
|
|
4402
|
+
"""Ask the model whether the active goal has been met.
|
|
4403
|
+
|
|
4404
|
+
Returns (verdict, reasoning) where verdict ∈ {"YES", "NO", "ERROR"}.
|
|
4405
|
+
ERROR means the call itself failed or the response couldn't be
|
|
4406
|
+
parsed — caller should treat as NO and continue (or, after a
|
|
4407
|
+
threshold of ERRORs in a row, clear the goal as a safety hatch).
|
|
4408
|
+
"""
|
|
4409
|
+
from drydock.core.goal import (
|
|
4410
|
+
EVALUATOR_SYSTEM_PROMPT,
|
|
4411
|
+
build_evaluator_prompt,
|
|
4412
|
+
collect_recent_message_snippets,
|
|
4413
|
+
parse_verdict,
|
|
4414
|
+
)
|
|
4415
|
+
goal = getattr(self, "goal", None)
|
|
4416
|
+
if goal is None or not goal.active:
|
|
4417
|
+
return ("ERROR", "no active goal")
|
|
4418
|
+
|
|
4419
|
+
snippets = collect_recent_message_snippets(self.messages, n=8)
|
|
4420
|
+
user_prompt = build_evaluator_prompt(goal, snippets)
|
|
4421
|
+
|
|
4422
|
+
eval_messages = [
|
|
4423
|
+
LLMMessage(role=Role.system, content=EVALUATOR_SYSTEM_PROMPT),
|
|
4424
|
+
LLMMessage(role=Role.user, content=user_prompt),
|
|
4425
|
+
]
|
|
4426
|
+
active_model = self.config.get_active_model()
|
|
4427
|
+
try:
|
|
4428
|
+
# Tight budget — evaluator returns ~30 tokens at most.
|
|
4429
|
+
# Temperature low for determinism. No tools.
|
|
4430
|
+
result = await self.backend.complete(
|
|
4431
|
+
model=active_model,
|
|
4432
|
+
messages=eval_messages,
|
|
4433
|
+
temperature=0.0,
|
|
4434
|
+
tools=[],
|
|
4435
|
+
tool_choice=None,
|
|
4436
|
+
extra_headers=self._get_extra_headers(
|
|
4437
|
+
self.config.get_active_provider()
|
|
4438
|
+
),
|
|
4439
|
+
max_tokens=120,
|
|
4440
|
+
metadata=None,
|
|
4441
|
+
)
|
|
4442
|
+
except Exception as e: # noqa: BLE001 — never crash the TUI on eval error
|
|
4443
|
+
logger.warning("[goal] evaluator call failed: %s", e)
|
|
4444
|
+
return ("ERROR", f"evaluator backend error: {e!s}"[:200])
|
|
4445
|
+
|
|
4446
|
+
raw = (result.message.content or "").strip()
|
|
4447
|
+
verdict, reasoning = parse_verdict(raw)
|
|
4448
|
+
goal.last_verdict = verdict
|
|
4449
|
+
goal.last_evaluator_reasoning = reasoning
|
|
4450
|
+
logger.warning(
|
|
4451
|
+
"[goal] verdict=%s iter=%d/%d reason=%r",
|
|
4452
|
+
verdict, goal.iterations, goal.max_iterations, reasoning[:120],
|
|
4453
|
+
)
|
|
4454
|
+
return (verdict, reasoning)
|
|
4455
|
+
|
|
4456
|
+
async def undo_last_turn(self) -> tuple[bool, str]:
|
|
4457
|
+
"""Rewind history past the LAST user message, dropping the
|
|
4458
|
+
assistant turn (and any tool results) it triggered AND the
|
|
4459
|
+
user message itself. Use case: the last user prompt set off
|
|
4460
|
+
a chain that wedged the conversation; the user wants to back
|
|
4461
|
+
out and try a different prompt.
|
|
4462
|
+
|
|
4463
|
+
Returns (success, info_message).
|
|
4464
|
+
|
|
4465
|
+
Why this is safer than `/clear`:
|
|
4466
|
+
- Preserves the system message (index 0)
|
|
4467
|
+
- Preserves all prior good user+assistant exchanges
|
|
4468
|
+
- Resets the sticky error counters so the new prompt
|
|
4469
|
+
won't immediately re-trip the lockout
|
|
4470
|
+
|
|
4471
|
+
Why drop the user message too (not just the assistant turn):
|
|
4472
|
+
- If the user repeats the same prompt, they'll re-trigger
|
|
4473
|
+
the same bad assistant response. The point of /undo is
|
|
4474
|
+
to escape; the user can always re-type the prompt if
|
|
4475
|
+
they really want it.
|
|
4476
|
+
"""
|
|
4477
|
+
# Find the last user message — walk backward
|
|
4478
|
+
last_user_idx = -1
|
|
4479
|
+
for i in range(len(self.messages) - 1, -1, -1):
|
|
4480
|
+
if self.messages[i].role == Role.user:
|
|
4481
|
+
last_user_idx = i
|
|
4482
|
+
break
|
|
4483
|
+
|
|
4484
|
+
if last_user_idx <= 0:
|
|
4485
|
+
# No user message to rewind past (only the system message
|
|
4486
|
+
# is present), or the user message is at idx 0 which we
|
|
4487
|
+
# never drop. Nothing to undo.
|
|
4488
|
+
return (False, "Nothing to undo — no prior user turn in history.")
|
|
4489
|
+
|
|
4490
|
+
dropped = len(self.messages) - last_user_idx
|
|
4491
|
+
kept = list(self.messages[:last_user_idx])
|
|
4492
|
+
try:
|
|
4493
|
+
await self.session_logger.save_interaction(
|
|
4494
|
+
self.messages,
|
|
4495
|
+
self.stats,
|
|
4496
|
+
self._base_config,
|
|
4497
|
+
self.tool_manager,
|
|
4498
|
+
self.agent_profile,
|
|
4499
|
+
)
|
|
4500
|
+
except Exception as e: # noqa: BLE001 — never block /undo on a save failure
|
|
4501
|
+
logger.warning("[undo] session save failed (continuing): %s", e)
|
|
4502
|
+
self.messages.reset(kept)
|
|
4503
|
+
# Clear the sticky error counters so the next prompt starts fresh.
|
|
4504
|
+
if hasattr(self, "_total_error_rounds"):
|
|
4505
|
+
self._total_error_rounds = 0
|
|
4506
|
+
if hasattr(self, "_consecutive_circuit_breaker_fires"):
|
|
4507
|
+
self._consecutive_circuit_breaker_fires = 0
|
|
4508
|
+
if hasattr(self, "_consecutive_empty_turns"):
|
|
4509
|
+
self._consecutive_empty_turns = 0
|
|
4510
|
+
logger.warning(
|
|
4511
|
+
"[undo] rolled back: kept %d messages (dropped %d after last user idx=%d)",
|
|
4512
|
+
len(kept), dropped, last_user_idx,
|
|
4513
|
+
)
|
|
4514
|
+
return (
|
|
4515
|
+
True,
|
|
4516
|
+
f"Rolled back the last turn — dropped {dropped} message(s). "
|
|
4517
|
+
f"Type your next prompt to continue from the prior state.",
|
|
4518
|
+
)
|
|
4519
|
+
|
|
4376
4520
|
async def clear_history(self) -> None:
|
|
4377
4521
|
await self.session_logger.save_interaction(
|
|
4378
4522
|
self.messages,
|
|
@@ -4415,6 +4559,10 @@ or replace freely; future sessions will respect your edits._
|
|
|
4415
4559
|
self._empty_nudge_last_user_idx = -1
|
|
4416
4560
|
self._total_error_rounds = 0
|
|
4417
4561
|
self._read_file_state = {}
|
|
4562
|
+
# /goal state: None means no active goal. Cleared by /clear and
|
|
4563
|
+
# /compact since the goal is session-scoped and a fresh session
|
|
4564
|
+
# shouldn't inherit the prior pursuit.
|
|
4565
|
+
self.goal = None
|
|
4418
4566
|
|
|
4419
4567
|
async def compact(self) -> str:
|
|
4420
4568
|
try:
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""Goal pursuit — autonomous turn-after-turn work toward a condition.
|
|
2
|
+
|
|
3
|
+
Mirrors the Claude Code `/goal` feature. The user sets a completion
|
|
4
|
+
condition; after every turn, a small evaluator model decides whether
|
|
5
|
+
the condition holds. If not, drydock injects a continuation prompt
|
|
6
|
+
and runs another turn. The goal clears automatically once met.
|
|
7
|
+
|
|
8
|
+
Design notes:
|
|
9
|
+
- Iteration cap (default 20) prevents infinite loops on unverifiable
|
|
10
|
+
or impossible goals.
|
|
11
|
+
- Evaluator uses the same provider/model as the agent loop. A small
|
|
12
|
+
dedicated model would be cleaner but complicates local deployment.
|
|
13
|
+
The evaluator prompt is tight: it returns a single YES/NO token.
|
|
14
|
+
- The continuation prompt is synthesised — same shape as the existing
|
|
15
|
+
DRYDOCK_AUTO_CONTINUE mechanism — but tagged with the goal so the
|
|
16
|
+
main agent loop knows we're on a goal turn, not a user turn.
|
|
17
|
+
- Status (`/goal` with no args), set (`/goal <condition>`), and
|
|
18
|
+
clear (`/goal clear`) live in commands.py; this module owns the
|
|
19
|
+
state, evaluation, and continuation-prompt synthesis.
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import logging
|
|
24
|
+
from dataclasses import dataclass, field
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger("drydock.goal")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class GoalState:
|
|
31
|
+
"""Per-session goal state. Owned by the TUI / AgentLoop wrapper."""
|
|
32
|
+
|
|
33
|
+
condition: str
|
|
34
|
+
iterations: int = 0
|
|
35
|
+
# Conservative cap — covers most realistic workflows (per-turn ~30-80s
|
|
36
|
+
# on Gemma 4, so 20 turns ~10-25 min) without letting a runaway goal
|
|
37
|
+
# burn the whole afternoon. Operator can override.
|
|
38
|
+
max_iterations: int = 20
|
|
39
|
+
last_verdict: str = "" # "YES" | "NO" | "ERROR" | "" before first eval
|
|
40
|
+
last_evaluator_reasoning: str = ""
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def active(self) -> bool:
|
|
44
|
+
return bool(self.condition.strip())
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def remaining(self) -> int:
|
|
48
|
+
return max(0, self.max_iterations - self.iterations)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# ── Evaluation prompt ───────────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
EVALUATOR_SYSTEM_PROMPT = (
|
|
54
|
+
"You are a goal-completion evaluator. You read a goal condition "
|
|
55
|
+
"plus the recent conversation between a user and a coding agent, "
|
|
56
|
+
"and you decide whether the goal has been met.\n\n"
|
|
57
|
+
"Output rules (STRICT):\n"
|
|
58
|
+
"1. Your FIRST line must be exactly `VERDICT: YES` or `VERDICT: NO`.\n"
|
|
59
|
+
"2. Your SECOND line should be a one-sentence reason (≤120 chars).\n"
|
|
60
|
+
"3. Output NOTHING else. No preamble, no markdown, no quotes.\n\n"
|
|
61
|
+
"Be conservative — only say YES if the conversation contains "
|
|
62
|
+
"concrete evidence the goal is satisfied. Tool output, test "
|
|
63
|
+
"results, file contents, or explicit confirmation from the agent. "
|
|
64
|
+
"Plans, intentions, and 'I will' statements are NOT evidence."
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def build_evaluator_prompt(goal: GoalState, recent_messages: list[str]) -> str:
|
|
69
|
+
"""Render the evaluator user prompt from the goal + last N msgs."""
|
|
70
|
+
convo = "\n\n---\n\n".join(recent_messages[-12:])
|
|
71
|
+
if len(convo) > 8000:
|
|
72
|
+
convo = convo[:8000] + "\n[... earlier turns truncated]"
|
|
73
|
+
return (
|
|
74
|
+
f"GOAL CONDITION:\n{goal.condition}\n\n"
|
|
75
|
+
f"RECENT CONVERSATION:\n{convo}\n\n"
|
|
76
|
+
f"Has the goal been met? Respond with VERDICT: YES or VERDICT: NO."
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def parse_verdict(raw: str) -> tuple[str, str]:
|
|
81
|
+
"""Parse an evaluator response into (verdict, reasoning).
|
|
82
|
+
|
|
83
|
+
verdict ∈ {"YES", "NO", "ERROR"}.
|
|
84
|
+
"""
|
|
85
|
+
if not raw:
|
|
86
|
+
return ("ERROR", "evaluator returned empty response")
|
|
87
|
+
lines = [l.strip() for l in raw.splitlines() if l.strip()]
|
|
88
|
+
if not lines:
|
|
89
|
+
return ("ERROR", "evaluator returned only whitespace")
|
|
90
|
+
first = lines[0].upper()
|
|
91
|
+
reasoning = lines[1] if len(lines) > 1 else ""
|
|
92
|
+
# Accept both strict ("VERDICT: YES") and lenient ("YES.") forms
|
|
93
|
+
if first.startswith("VERDICT:"):
|
|
94
|
+
verdict_token = first.replace("VERDICT:", "").strip().rstrip(".").strip()
|
|
95
|
+
else:
|
|
96
|
+
verdict_token = first.rstrip(".").strip()
|
|
97
|
+
if verdict_token.startswith("YES"):
|
|
98
|
+
return ("YES", reasoning)
|
|
99
|
+
if verdict_token.startswith("NO"):
|
|
100
|
+
return ("NO", reasoning)
|
|
101
|
+
return ("ERROR", f"unrecognised verdict token: {first[:60]!r}")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def make_continuation_prompt(goal: GoalState) -> str:
|
|
105
|
+
"""The synthesised user message that keeps the agent working.
|
|
106
|
+
|
|
107
|
+
Kept short so it doesn't dominate the next turn's context. The
|
|
108
|
+
main agent loop's system prompt already explains the agent's
|
|
109
|
+
role; the continuation just refocuses on the goal.
|
|
110
|
+
"""
|
|
111
|
+
return (
|
|
112
|
+
f"Continue working toward the goal: {goal.condition}\n"
|
|
113
|
+
f"(Iteration {goal.iterations}/{goal.max_iterations}. "
|
|
114
|
+
f"Goal will auto-clear when met.)"
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# ── Snippet extraction for the evaluator ────────────────────────────────
|
|
119
|
+
|
|
120
|
+
def collect_recent_message_snippets(messages, n: int = 8) -> list[str]:
|
|
121
|
+
"""Render the last n messages as short strings the evaluator can
|
|
122
|
+
read. Truncates each to ≤600 chars so the evaluator prompt stays
|
|
123
|
+
bounded.
|
|
124
|
+
|
|
125
|
+
`messages` is the AgentLoop's `self.messages` — a sequence of
|
|
126
|
+
LLMMessage objects with .role and .content.
|
|
127
|
+
"""
|
|
128
|
+
out: list[str] = []
|
|
129
|
+
# Skip the system message (index 0); take the tail.
|
|
130
|
+
tail = list(messages)[-n:] if len(messages) > n else list(messages)
|
|
131
|
+
for m in tail:
|
|
132
|
+
role = getattr(m, "role", "?")
|
|
133
|
+
role_str = getattr(role, "value", None) or str(role)
|
|
134
|
+
content = getattr(m, "content", "") or ""
|
|
135
|
+
# Include tool-call summaries since they're often the evidence
|
|
136
|
+
# the evaluator needs (test pass, file written, etc.).
|
|
137
|
+
tcs = getattr(m, "tool_calls", None) or []
|
|
138
|
+
if tcs and not content:
|
|
139
|
+
tc_summary = ", ".join(
|
|
140
|
+
getattr(getattr(tc, "function", None), "name", "?")
|
|
141
|
+
for tc in tcs
|
|
142
|
+
)
|
|
143
|
+
content = f"[tool calls: {tc_summary}]"
|
|
144
|
+
if len(content) > 600:
|
|
145
|
+
content = content[:600] + "...[truncated]"
|
|
146
|
+
out.append(f"[{role_str}] {content}")
|
|
147
|
+
return out
|
|
@@ -147,3 +147,49 @@ def test_conversation_loop_resets_total_error_rounds_on_entry():
|
|
|
147
147
|
assert "_total_error_rounds" in src
|
|
148
148
|
assert "= 0" in src
|
|
149
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
|