drydock-cli 2.6.140__tar.gz → 2.6.142__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.6.142/.auto_release.lock +1 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/Admiral.md +38 -14
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/PKG-INFO +1 -1
- drydock_cli-2.6.142/drydock/admiral/metrics.py +92 -0
- drydock_cli-2.6.142/drydock/admiral/policy.py +134 -0
- drydock_cli-2.6.142/drydock/admiral/proposer.py +157 -0
- drydock_cli-2.6.142/drydock/admiral/stager.py +147 -0
- drydock_cli-2.6.142/drydock/admiral/task_classifier.py +73 -0
- drydock_cli-2.6.142/drydock/admiral/tuning.py +131 -0
- drydock_cli-2.6.142/drydock/admiral/validator.py +95 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/worker.py +54 -2
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/commands.py +18 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/app.py +126 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agent_loop.py +34 -4
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/pyproject.toml +1 -1
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/publish_to_pypi.sh +1 -1
- drydock_cli-2.6.142/scripts/stress_watcher.py +187 -0
- drydock_cli-2.6.142/tests/test_admiral_phase3.py +171 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.claude/scheduled_tasks.lock +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.gitignore +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.python-version +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.typos.toml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/AGENTS.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/BASELINE_412.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/CLAUDE.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/LICENSE +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/NOTICE +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/PRD.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/README.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/action.yml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/README.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/docs/README.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock_terms.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/flake.lock +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/flake.nix +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/README.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/comprehensive_loop.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/evolve_tests.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/install.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/mega_loop.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/meta_ralph_loop.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/oss_task_harness.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/port_task.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/session_loop_audit.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/conftest.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/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.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_admiral.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/uv.lock +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/README.md +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2066036
|
|
@@ -285,7 +285,7 @@ Open design questions for Phase 2:
|
|
|
285
285
|
* Rate-limiting: prevent Opus blast during a bad run. Max 3 escalations
|
|
286
286
|
per session by default. Override via env var.
|
|
287
287
|
|
|
288
|
-
### Phase 3a —
|
|
288
|
+
### Phase 3a — SHIPPED (v2.6.141): Hyperparameter adaptation per (model, task)
|
|
289
289
|
|
|
290
290
|
**Goal.** Admiral learns the strengths and weaknesses of the current
|
|
291
291
|
model + tool set and tunes the harness hyperparameters accordingly,
|
|
@@ -388,7 +388,7 @@ then Admiral re-evaluates once and possibly re-tunes.
|
|
|
388
388
|
|
|
389
389
|
---
|
|
390
390
|
|
|
391
|
-
### Phase 3b —
|
|
391
|
+
### Phase 3b — SHIPPED (v2.6.141, default-OFF via DRYDOCK_ADMIRAL_PROPOSER=1)
|
|
392
392
|
|
|
393
393
|
**Goal.** Close the loop from detection → proposed fix → validated
|
|
394
394
|
branch, without ever writing to `main` or PyPI automatically. The
|
|
@@ -558,8 +558,8 @@ having to tail a log file.
|
|
|
558
558
|
|
|
559
559
|
## 9. Continuity Notes (if this session is lost)
|
|
560
560
|
|
|
561
|
-
**Latest shipped:** v2.6.
|
|
562
|
-
|
|
561
|
+
**Latest shipped:** v2.6.141 — Phase 3a (hyperparameter adaptation)
|
|
562
|
+
and Phase 3b (gated code proposals, default-OFF) both in PyPI.
|
|
563
563
|
|
|
564
564
|
**Shipped this session (2026-04-17):**
|
|
565
565
|
* v2.6.134 — wall-of-text inline-marker breaker (issue #8).
|
|
@@ -571,6 +571,11 @@ Directives rubric wired into prompts).
|
|
|
571
571
|
* v2.6.138 — Admiral Phase 1 module + TUI integration.
|
|
572
572
|
* v2.6.139 — Admiral Phase 2 (local-LLM analyzer, Opus escalator,
|
|
573
573
|
Directives rubric in prompts).
|
|
574
|
+
* v2.6.140 — full `.vibe → .drydock` rename (zero vibe refs left).
|
|
575
|
+
* v2.6.141 — Phase 3a (task_classifier, metrics, tuning, policy +
|
|
576
|
+
AgentLoop integration) + Phase 3b (proposer, validator, stager +
|
|
577
|
+
/admiral-apply, /admiral-reject, /admiral-status slash commands)
|
|
578
|
+
+ scripts/stress_watcher.py harness-level babysitter.
|
|
574
579
|
|
|
575
580
|
**Files (check `git log --oneline -30`):**
|
|
576
581
|
* `drydock/admiral/{__init__,detectors,interventions,history,worker,
|
|
@@ -611,19 +616,38 @@ applied, including the `directive-source` (local-llm / opus / canned).
|
|
|
611
616
|
started ~Apr-16, currently at ~826/1658 (approaching 50%).
|
|
612
617
|
DO NOT interrupt.
|
|
613
618
|
|
|
614
|
-
**Open follow-ups:**
|
|
615
|
-
*
|
|
616
|
-
`drydock/admiral/{task_classifier,metrics,tuning,policy}.py` to
|
|
617
|
-
be created. See §8 Phase 3a spec.
|
|
618
|
-
* **Phase 3b (designed, not started):** code proposals. Proposer →
|
|
619
|
-
validator → staged local branch; never auto-commits. User
|
|
620
|
-
approves via `/admiral-apply <branch>`. See §8 Phase 3b.
|
|
621
|
-
* systemd the admiral_probe.
|
|
619
|
+
**Open follow-ups (post-observation period):**
|
|
620
|
+
* systemd the admiral_probe (currently `nohup &`, dies on logout).
|
|
622
621
|
* TUI widget showing recent Admiral findings (in-app audit view).
|
|
622
|
+
* More detectors driven by observed data: hallucinated tool names,
|
|
623
|
+
edit-undo-edit ping-pong, PRD/spec drift.
|
|
623
624
|
* Learning-rate scheduler (Phase 4).
|
|
624
625
|
* Session vs Global memory split (PRD §6).
|
|
625
|
-
*
|
|
626
|
-
|
|
626
|
+
* Tune Phase 3a knob bounds + Phase 3b promotion criteria from real
|
|
627
|
+
finding-rate data after the 24h observation window.
|
|
628
|
+
|
|
629
|
+
## 10. Observation mode (active 2026-04-17 → 2026-04-18)
|
|
630
|
+
|
|
631
|
+
Per user directive ("let's slow down, and watch for now"). All
|
|
632
|
+
Admiral feature work is paused. What's still running automatically:
|
|
633
|
+
|
|
634
|
+
* **Stress-test status check** every 30 min (Telegram).
|
|
635
|
+
* **GitHub issue check** every hour for fbobe321 issues.
|
|
636
|
+
* **stress_watcher.py** on the live stress run (PID 1860693) —
|
|
637
|
+
detects stalls/timeout-spikes/completion, emits Telegram + audit log.
|
|
638
|
+
* **admiral_probe.py** on `192.168.50.22:8878` — dashboard tab
|
|
639
|
+
consuming it.
|
|
640
|
+
* **Admiral itself** is live in every drydock TUI session — Phase 1
|
|
641
|
+
+ Phase 2 fully active, Phase 3a tuning enabled (no-op until
|
|
642
|
+
`admiral_tuning.json` gets written), Phase 3a policy gated behind
|
|
643
|
+
`DRYDOCK_ADMIRAL_POLICY=1`, Phase 3b proposer gated behind
|
|
644
|
+
`DRYDOCK_ADMIRAL_PROPOSER=1` (both default OFF).
|
|
645
|
+
|
|
646
|
+
**Cron `7a2a593c` fires Sat 2026-04-18 18:13 CDT** — at that point I
|
|
647
|
+
will read `~/.drydock/logs/admiral_history.log` event counts, scan
|
|
648
|
+
`~/.drydock/logs/admiral_metrics.jsonl`, check the dashboard, and
|
|
649
|
+
propose 1–2 next features grounded in what actually fired in the
|
|
650
|
+
past 24h. **No new code without observed evidence it's needed.**
|
|
627
651
|
|
|
628
652
|
***
|
|
629
653
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.142
|
|
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
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Session-end metrics for Admiral.
|
|
2
|
+
|
|
3
|
+
Collects a small set of numbers about how a session went, keyed by
|
|
4
|
+
`(model, task_type)`, and appends one JSONL line at the end. The
|
|
5
|
+
Phase 3a policy loop reads these to decide whether to adjust a
|
|
6
|
+
hyperparameter knob for that tuple.
|
|
7
|
+
|
|
8
|
+
The collection hook fires from AgentLoop on shutdown, best-effort
|
|
9
|
+
only — a failure to write a metric must never propagate.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
from collections.abc import Sequence
|
|
15
|
+
from dataclasses import asdict, dataclass, field
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
19
|
+
from drydock.admiral import persistence, task_classifier
|
|
20
|
+
from drydock.core.types import LLMMessage, Role
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from drydock.core.agent_loop import AgentLoop
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
_WRITE_TOOLS = frozenset({"write_file", "search_replace", "edit_file"})
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class SessionMetrics:
|
|
32
|
+
ts: str
|
|
33
|
+
model: str
|
|
34
|
+
task_type: str
|
|
35
|
+
session_id: str
|
|
36
|
+
outcome: str = "unknown" # success | failure | unknown
|
|
37
|
+
total_tool_calls: int = 0
|
|
38
|
+
tool_calls_per_write: float = 0.0
|
|
39
|
+
time_to_first_write_s: float | None = None
|
|
40
|
+
loop_fires: int = 0
|
|
41
|
+
struggle_fires: int = 0
|
|
42
|
+
opus_escalations: int = 0
|
|
43
|
+
user_interrupts: int = 0
|
|
44
|
+
per_prompt_budget_hits: int = 0
|
|
45
|
+
elapsed_s: float | None = None
|
|
46
|
+
notes: list[str] = field(default_factory=list)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _count_tool_calls(messages: Sequence[LLMMessage]) -> tuple[int, int]:
|
|
50
|
+
total = writes = 0
|
|
51
|
+
for m in messages:
|
|
52
|
+
if m.role != Role.assistant or not m.tool_calls:
|
|
53
|
+
continue
|
|
54
|
+
for tc in m.tool_calls:
|
|
55
|
+
total += 1
|
|
56
|
+
if tc.function.name in _WRITE_TOOLS:
|
|
57
|
+
writes += 1
|
|
58
|
+
return total, writes
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def collect(agent_loop: AgentLoop, session_id: str, outcome: str = "unknown") -> SessionMetrics:
|
|
62
|
+
"""Build a SessionMetrics record from the live AgentLoop state.
|
|
63
|
+
|
|
64
|
+
Safe to call during shutdown — wraps message access in a try/except
|
|
65
|
+
so partial state never breaks the collection.
|
|
66
|
+
"""
|
|
67
|
+
try:
|
|
68
|
+
msgs = list(agent_loop.messages)
|
|
69
|
+
except Exception:
|
|
70
|
+
msgs = []
|
|
71
|
+
try:
|
|
72
|
+
model_name = agent_loop.config.get_active_model().name
|
|
73
|
+
except Exception:
|
|
74
|
+
model_name = "unknown"
|
|
75
|
+
total, writes = _count_tool_calls(msgs)
|
|
76
|
+
tcpw = (total / writes) if writes else float(total)
|
|
77
|
+
return SessionMetrics(
|
|
78
|
+
ts=datetime.now(timezone.utc).isoformat(timespec="seconds"),
|
|
79
|
+
model=model_name,
|
|
80
|
+
task_type=task_classifier.classify(msgs),
|
|
81
|
+
session_id=session_id,
|
|
82
|
+
outcome=outcome,
|
|
83
|
+
total_tool_calls=total,
|
|
84
|
+
tool_calls_per_write=round(tcpw, 2),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def record(metrics: SessionMetrics) -> None:
|
|
89
|
+
try:
|
|
90
|
+
persistence.append_jsonl(persistence.METRICS_PATH, asdict(metrics))
|
|
91
|
+
except Exception as e:
|
|
92
|
+
logger.warning("Admiral metrics write failed: %s", e)
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""Phase 3a adaptation policy.
|
|
2
|
+
|
|
3
|
+
Simple bounded rule engine — no ML. Runs over the session metrics
|
|
4
|
+
log and decides whether to adjust ONE knob for a `(model, task_type)`
|
|
5
|
+
tuple. Keeps changes slow on purpose: Admiral nudges one step per
|
|
6
|
+
re-evaluation window; if recovery doesn't happen, reverts.
|
|
7
|
+
|
|
8
|
+
Invariants:
|
|
9
|
+
* Never adjusts more than ONE knob per tuple per pass.
|
|
10
|
+
* Never adjusts before N sessions are observed for the tuple.
|
|
11
|
+
* Always records rationale in the tuning file.
|
|
12
|
+
* Reads are lock-free: if two loops race, the JSON write is atomic
|
|
13
|
+
via persistence.save_json_atomic.
|
|
14
|
+
|
|
15
|
+
Disabled by default (reads `DRYDOCK_ADMIRAL_POLICY` env var; set to
|
|
16
|
+
`1` to enable). Users opt in when ready.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import logging
|
|
22
|
+
import os
|
|
23
|
+
from collections import defaultdict
|
|
24
|
+
from statistics import mean
|
|
25
|
+
from typing import Any
|
|
26
|
+
|
|
27
|
+
from drydock.admiral import persistence, tuning
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
MIN_SESSIONS_TO_TUNE = 5
|
|
32
|
+
SUCCESS_REGRESSION_THRESHOLD = 0.2 # 20% drop in success rate
|
|
33
|
+
RECOVERY_WINDOW = 3 # sessions to evaluate after a tweak
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _load_recent_metrics(limit: int = 100) -> list[dict]:
|
|
37
|
+
path = persistence.METRICS_PATH
|
|
38
|
+
if not path.exists():
|
|
39
|
+
return []
|
|
40
|
+
out: list[dict] = []
|
|
41
|
+
try:
|
|
42
|
+
with path.open() as f:
|
|
43
|
+
for line in f.readlines()[-limit:]:
|
|
44
|
+
try:
|
|
45
|
+
out.append(json.loads(line))
|
|
46
|
+
except Exception:
|
|
47
|
+
continue
|
|
48
|
+
except Exception:
|
|
49
|
+
return []
|
|
50
|
+
return out
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _group_by_tuple(metrics: list[dict]) -> dict[tuple[str, str], list[dict]]:
|
|
54
|
+
groups: dict[tuple[str, str], list[dict]] = defaultdict(list)
|
|
55
|
+
for m in metrics:
|
|
56
|
+
key = (m.get("model", "unknown"), m.get("task_type", "unknown"))
|
|
57
|
+
groups[key].append(m)
|
|
58
|
+
return groups
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _success_rate(records: list[dict]) -> float:
|
|
62
|
+
if not records:
|
|
63
|
+
return 0.0
|
|
64
|
+
return sum(1 for r in records if r.get("outcome") == "success") / len(records)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _pick_knob_to_tune(records: list[dict]) -> tuple[str, float, str] | None:
|
|
68
|
+
"""Very simple heuristic: correlate the top failure pattern with
|
|
69
|
+
one knob. Returns (knob, new_value, rationale) or None.
|
|
70
|
+
"""
|
|
71
|
+
if not records:
|
|
72
|
+
return None
|
|
73
|
+
# Many budget hits → raise per_prompt_budget_sec.
|
|
74
|
+
if mean(r.get("per_prompt_budget_hits", 0) for r in records) >= 0.4:
|
|
75
|
+
return (
|
|
76
|
+
"per_prompt_budget_sec",
|
|
77
|
+
1800.0 * 1.25, # +25% from 30min baseline, clipped to bound
|
|
78
|
+
"per_prompt_budget_hits ≥0.4 per session — raise budget.",
|
|
79
|
+
)
|
|
80
|
+
# Many struggle fires → raise struggle_threshold (reads needed).
|
|
81
|
+
if mean(r.get("struggle_fires", 0) for r in records) >= 1.0:
|
|
82
|
+
return (
|
|
83
|
+
"struggle_threshold",
|
|
84
|
+
30.0,
|
|
85
|
+
"struggle_fires ≥1/session — give explore turns more budget.",
|
|
86
|
+
)
|
|
87
|
+
# Many loop fires → tighten loop_detector_window (catch loops earlier).
|
|
88
|
+
if mean(r.get("loop_fires", 0) for r in records) >= 1.0:
|
|
89
|
+
return (
|
|
90
|
+
"loop_detector_window",
|
|
91
|
+
2.0,
|
|
92
|
+
"loop_fires ≥1/session — trip loop detector earlier.",
|
|
93
|
+
)
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def evaluate() -> list[dict[str, Any]]:
|
|
98
|
+
"""Run one policy pass. Returns list of changes applied (possibly empty)."""
|
|
99
|
+
if os.getenv("DRYDOCK_ADMIRAL_POLICY", "0") != "1":
|
|
100
|
+
return []
|
|
101
|
+
|
|
102
|
+
metrics = _load_recent_metrics()
|
|
103
|
+
groups = _group_by_tuple(metrics)
|
|
104
|
+
changes: list[dict[str, Any]] = []
|
|
105
|
+
for (model, task), records in groups.items():
|
|
106
|
+
if len(records) < MIN_SESSIONS_TO_TUNE:
|
|
107
|
+
continue
|
|
108
|
+
recent = records[-MIN_SESSIONS_TO_TUNE:]
|
|
109
|
+
rate = _success_rate(recent)
|
|
110
|
+
# Baseline = across ALL records for this tuple.
|
|
111
|
+
baseline = _success_rate(records)
|
|
112
|
+
if baseline == 0 or rate >= baseline - SUCCESS_REGRESSION_THRESHOLD:
|
|
113
|
+
# Performing fine — don't tune.
|
|
114
|
+
continue
|
|
115
|
+
pick = _pick_knob_to_tune(recent)
|
|
116
|
+
if not pick:
|
|
117
|
+
continue
|
|
118
|
+
knob, value, rationale = pick
|
|
119
|
+
# Idempotency: if the same knob is already set, skip.
|
|
120
|
+
current = tuning.get_for(model, task)
|
|
121
|
+
if knob in current:
|
|
122
|
+
# Already tuning this knob; give it RECOVERY_WINDOW sessions
|
|
123
|
+
# to show improvement before we touch it again.
|
|
124
|
+
if len(recent) < RECOVERY_WINDOW + MIN_SESSIONS_TO_TUNE:
|
|
125
|
+
continue
|
|
126
|
+
tuning.set_knob(model, task, knob, value, rationale=rationale)
|
|
127
|
+
changes.append({
|
|
128
|
+
"model": model,
|
|
129
|
+
"task": task,
|
|
130
|
+
"knob": knob,
|
|
131
|
+
"value": value,
|
|
132
|
+
"rationale": rationale,
|
|
133
|
+
})
|
|
134
|
+
return changes
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"""Phase 3b: draft a unified-diff proposal for a recurring finding.
|
|
2
|
+
|
|
3
|
+
Only called for findings that survived prompt-only interventions
|
|
4
|
+
(see `persistence.finding_qualifies_for_code_change`). Uses the
|
|
5
|
+
same escalation ladder as Phase 2 (local LLM → Opus).
|
|
6
|
+
|
|
7
|
+
Returns a `Proposal` or `None`. Caller (worker) passes the proposal
|
|
8
|
+
to validator.validate(), and if that returns green, to stager.stage().
|
|
9
|
+
|
|
10
|
+
Default DISABLED — reads `DRYDOCK_ADMIRAL_PROPOSER=1` env var.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import hashlib
|
|
15
|
+
import logging
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from typing import TYPE_CHECKING
|
|
20
|
+
|
|
21
|
+
from drydock.admiral import persistence
|
|
22
|
+
from drydock.admiral.llm_analyzer import _DIRECTIVES_RUBRIC, _render_turns
|
|
23
|
+
from drydock.admiral.opus_escalator import _try_anthropic_sdk, _try_claude_cli
|
|
24
|
+
from drydock.core.types import LLMMessage, Role
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from drydock.admiral.detectors import Finding
|
|
28
|
+
from drydock.core.agent_loop import AgentLoop
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
_PROPOSER_PROMPT = """You are Admiral's code proposer. A recurring finding has \
|
|
33
|
+
survived prompt-only interventions and should be fixed at the source. Draft a \
|
|
34
|
+
MINIMAL unified diff that addresses the root cause.
|
|
35
|
+
|
|
36
|
+
{rubric}
|
|
37
|
+
|
|
38
|
+
Recurring finding: {code}
|
|
39
|
+
Total fires across sessions: {n_fires}
|
|
40
|
+
Sessions involved: {n_sessions}
|
|
41
|
+
Failed prompt-only interventions: {n_failed}
|
|
42
|
+
|
|
43
|
+
Repro context (last turns):
|
|
44
|
+
<conversation>
|
|
45
|
+
{context}
|
|
46
|
+
</conversation>
|
|
47
|
+
|
|
48
|
+
Output in EXACTLY this format (no extra text):
|
|
49
|
+
|
|
50
|
+
DIRECTIVES VIOLATED: [code1,code2,...]
|
|
51
|
+
RATIONALE: <one paragraph grounded in the cited directives>
|
|
52
|
+
DIFF:
|
|
53
|
+
```diff
|
|
54
|
+
<unified diff — narrow scope, touches only the files needed>
|
|
55
|
+
```
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass
|
|
60
|
+
class Proposal:
|
|
61
|
+
code: str
|
|
62
|
+
directives_violated: list[str]
|
|
63
|
+
rationale: str
|
|
64
|
+
diff: str
|
|
65
|
+
source: str # "local-llm" | "opus"
|
|
66
|
+
fingerprint: str # sha256 of the diff — used for reject tracking
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
_DIFF_RE = re.compile(r"```(?:diff)?\n([\s\S]*?)```", re.MULTILINE)
|
|
70
|
+
_DIR_RE = re.compile(r"DIRECTIVES VIOLATED:\s*\[([^\]]*)\]")
|
|
71
|
+
_RAT_RE = re.compile(r"RATIONALE:\s*(.+?)(?:\nDIFF:|\Z)", re.DOTALL)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _parse(text: str) -> tuple[list[str], str, str] | None:
|
|
75
|
+
m_diff = _DIFF_RE.search(text)
|
|
76
|
+
m_rat = _RAT_RE.search(text)
|
|
77
|
+
m_dir = _DIR_RE.search(text)
|
|
78
|
+
if not m_diff:
|
|
79
|
+
return None
|
|
80
|
+
diff = m_diff.group(1).strip()
|
|
81
|
+
if not diff:
|
|
82
|
+
return None
|
|
83
|
+
rationale = (m_rat.group(1).strip() if m_rat else "")[:2000]
|
|
84
|
+
dirs = []
|
|
85
|
+
if m_dir:
|
|
86
|
+
dirs = [s.strip() for s in m_dir.group(1).split(",") if s.strip()]
|
|
87
|
+
return dirs, rationale, diff
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _fingerprint(diff: str) -> str:
|
|
91
|
+
return hashlib.sha256(diff.strip().encode()).hexdigest()[:16]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
async def _ask_local(agent_loop: AgentLoop, prompt: str) -> str | None:
|
|
95
|
+
try:
|
|
96
|
+
chunk = await agent_loop.backend.complete(
|
|
97
|
+
model=agent_loop.config.get_active_model(),
|
|
98
|
+
messages=[LLMMessage(role=Role.user, content=prompt)],
|
|
99
|
+
temperature=0.1,
|
|
100
|
+
max_tokens=2000,
|
|
101
|
+
)
|
|
102
|
+
return (chunk.message.content or "").strip() or None
|
|
103
|
+
except Exception as e:
|
|
104
|
+
logger.warning("Admiral proposer local call failed: %s", e)
|
|
105
|
+
return None
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
async def _ask_opus(prompt: str) -> str | None:
|
|
109
|
+
out = await _try_anthropic_sdk(prompt)
|
|
110
|
+
if out:
|
|
111
|
+
return out
|
|
112
|
+
return await _try_claude_cli(prompt)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
async def propose(agent_loop: AgentLoop, finding: Finding) -> Proposal | None:
|
|
116
|
+
if os.getenv("DRYDOCK_ADMIRAL_PROPOSER", "0") != "1":
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
state = persistence.load_state()
|
|
120
|
+
entry = state.get("findings", {}).get(finding.code) or {}
|
|
121
|
+
n_fires = int(entry.get("total_fires", 0))
|
|
122
|
+
n_sessions = len(entry.get("sessions", []))
|
|
123
|
+
n_failed = int(entry.get("prompt_failed", 0))
|
|
124
|
+
|
|
125
|
+
prompt = _PROPOSER_PROMPT.format(
|
|
126
|
+
rubric=_DIRECTIVES_RUBRIC,
|
|
127
|
+
code=finding.code,
|
|
128
|
+
n_fires=n_fires,
|
|
129
|
+
n_sessions=n_sessions,
|
|
130
|
+
n_failed=n_failed,
|
|
131
|
+
context=_render_turns(list(agent_loop.messages), n_turns=12),
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# 1) local LLM
|
|
135
|
+
text = await _ask_local(agent_loop, prompt)
|
|
136
|
+
source = "local-llm"
|
|
137
|
+
parsed = _parse(text or "")
|
|
138
|
+
# 2) Opus fallback
|
|
139
|
+
if not parsed:
|
|
140
|
+
text = await _ask_opus(prompt)
|
|
141
|
+
source = "opus"
|
|
142
|
+
parsed = _parse(text or "")
|
|
143
|
+
if not parsed:
|
|
144
|
+
return None
|
|
145
|
+
dirs, rationale, diff = parsed
|
|
146
|
+
fp = _fingerprint(diff)
|
|
147
|
+
if persistence.is_fingerprint_rejected(finding.code, fp):
|
|
148
|
+
logger.info("Admiral proposer: skipping previously-rejected patch %s", fp)
|
|
149
|
+
return None
|
|
150
|
+
return Proposal(
|
|
151
|
+
code=finding.code,
|
|
152
|
+
directives_violated=dirs,
|
|
153
|
+
rationale=rationale,
|
|
154
|
+
diff=diff,
|
|
155
|
+
source=source,
|
|
156
|
+
fingerprint=fp,
|
|
157
|
+
)
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""Phase 3b: stage a validated proposal as a local branch + proposal markdown.
|
|
2
|
+
|
|
3
|
+
NEVER pushes, NEVER merges to main, NEVER publishes. Writes a summary
|
|
4
|
+
file in `~/.drydock/admiral_proposals/<ts>.md` describing the diff,
|
|
5
|
+
rationale, validator output, branch name, and explicit rollback
|
|
6
|
+
command. The human then runs `/admiral-apply <branch>` to merge.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
import subprocess
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from datetime import datetime, timezone
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
from drydock.admiral import history, persistence
|
|
17
|
+
from drydock.admiral.proposer import Proposal
|
|
18
|
+
from drydock.admiral.validator import REPO_ROOT, ValidationResult
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class StagedProposal:
|
|
25
|
+
branch: str
|
|
26
|
+
proposal_path: Path
|
|
27
|
+
commit_sha: str
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _run(cmd: list[str], cwd: Path = REPO_ROOT, timeout: int = 60) -> tuple[int, str, str]:
|
|
31
|
+
p = subprocess.run(
|
|
32
|
+
cmd, cwd=cwd, timeout=timeout,
|
|
33
|
+
capture_output=True, text=True, check=False,
|
|
34
|
+
)
|
|
35
|
+
return p.returncode, p.stdout, p.stderr
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _safe_code(code: str) -> str:
|
|
39
|
+
# Branch name can't have weird chars — keep letters, digits, hyphens.
|
|
40
|
+
out = []
|
|
41
|
+
for ch in code:
|
|
42
|
+
if ch.isalnum() or ch in "-_":
|
|
43
|
+
out.append(ch)
|
|
44
|
+
else:
|
|
45
|
+
out.append("-")
|
|
46
|
+
return "".join(out)[:40]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def stage(proposal: Proposal, validation: ValidationResult) -> StagedProposal | None:
|
|
50
|
+
if not validation.ok:
|
|
51
|
+
raise ValueError("refusing to stage a proposal that didn't pass validation")
|
|
52
|
+
|
|
53
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
|
|
54
|
+
branch = f"admiral/{ts}-{_safe_code(proposal.code)}"
|
|
55
|
+
|
|
56
|
+
# Invariant: we ALWAYS branch from main.
|
|
57
|
+
rc, out, err = _run(["git", "rev-parse", "main"])
|
|
58
|
+
if rc != 0:
|
|
59
|
+
logger.error("Admiral stager: cannot resolve 'main' ref: %s", err)
|
|
60
|
+
return None
|
|
61
|
+
main_sha = out.strip()
|
|
62
|
+
|
|
63
|
+
# Create branch pointing at main (no checkout of main working tree).
|
|
64
|
+
rc, out, err = _run(["git", "branch", branch, main_sha])
|
|
65
|
+
if rc != 0:
|
|
66
|
+
logger.error("Admiral stager: branch create failed: %s", err)
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
# Use a short-lived worktree to apply+commit, then drop the worktree.
|
|
70
|
+
import tempfile
|
|
71
|
+
tmp_wt = Path(tempfile.mkdtemp(prefix="admiral_stage_")) / "wt"
|
|
72
|
+
diff_path = tmp_wt.parent / "proposal.diff"
|
|
73
|
+
diff_path.write_text(proposal.diff if proposal.diff.endswith("\n")
|
|
74
|
+
else proposal.diff + "\n")
|
|
75
|
+
|
|
76
|
+
commit_sha: str | None = None
|
|
77
|
+
try:
|
|
78
|
+
rc, out, err = _run(
|
|
79
|
+
["git", "worktree", "add", str(tmp_wt), branch], cwd=REPO_ROOT,
|
|
80
|
+
)
|
|
81
|
+
if rc != 0:
|
|
82
|
+
logger.error("Admiral stager: worktree add failed: %s", err)
|
|
83
|
+
_run(["git", "branch", "-D", branch])
|
|
84
|
+
return None
|
|
85
|
+
rc, out, err = _run(["git", "apply", str(diff_path)], cwd=tmp_wt)
|
|
86
|
+
if rc != 0:
|
|
87
|
+
logger.error("Admiral stager: diff apply failed: %s", err)
|
|
88
|
+
return None
|
|
89
|
+
rc, out, err = _run(["git", "add", "-A"], cwd=tmp_wt)
|
|
90
|
+
if rc != 0:
|
|
91
|
+
return None
|
|
92
|
+
commit_msg = (
|
|
93
|
+
f"admiral-proposed: {proposal.code}\n\n"
|
|
94
|
+
f"Rationale: {proposal.rationale}\n\n"
|
|
95
|
+
f"Directives violated: {', '.join(proposal.directives_violated) or '—'}\n"
|
|
96
|
+
f"Source: {proposal.source}\n"
|
|
97
|
+
f"Fingerprint: {proposal.fingerprint}\n"
|
|
98
|
+
)
|
|
99
|
+
rc, out, err = _run(
|
|
100
|
+
["git", "commit", "-m", commit_msg], cwd=tmp_wt,
|
|
101
|
+
)
|
|
102
|
+
if rc != 0:
|
|
103
|
+
logger.error("Admiral stager: commit failed: %s", err)
|
|
104
|
+
return None
|
|
105
|
+
rc, out, err = _run(["git", "rev-parse", "HEAD"], cwd=tmp_wt)
|
|
106
|
+
if rc == 0:
|
|
107
|
+
commit_sha = out.strip()
|
|
108
|
+
finally:
|
|
109
|
+
try:
|
|
110
|
+
_run(["git", "worktree", "remove", "--force", str(tmp_wt)], cwd=REPO_ROOT)
|
|
111
|
+
except Exception:
|
|
112
|
+
pass
|
|
113
|
+
try:
|
|
114
|
+
import shutil
|
|
115
|
+
shutil.rmtree(tmp_wt.parent, ignore_errors=True)
|
|
116
|
+
except Exception:
|
|
117
|
+
pass
|
|
118
|
+
|
|
119
|
+
if not commit_sha:
|
|
120
|
+
logger.error("Admiral stager: no commit sha")
|
|
121
|
+
_run(["git", "branch", "-D", branch])
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
# Write the proposal summary markdown.
|
|
125
|
+
persistence.PROPOSALS_DIR.mkdir(parents=True, exist_ok=True)
|
|
126
|
+
prop_path = persistence.PROPOSALS_DIR / f"{ts}-{_safe_code(proposal.code)}.md"
|
|
127
|
+
prop_path.write_text(
|
|
128
|
+
f"# Admiral proposal: {proposal.code}\n\n"
|
|
129
|
+
f"**Branch:** `{branch}` \n"
|
|
130
|
+
f"**Commit:** `{commit_sha}` \n"
|
|
131
|
+
f"**Source:** {proposal.source} \n"
|
|
132
|
+
f"**Fingerprint:** `{proposal.fingerprint}` \n"
|
|
133
|
+
f"**Directives violated:** {', '.join(proposal.directives_violated) or '—'}\n\n"
|
|
134
|
+
f"## Rationale\n\n{proposal.rationale}\n\n"
|
|
135
|
+
f"## Diff\n\n```diff\n{proposal.diff}\n```\n\n"
|
|
136
|
+
f"## Validator output (tail)\n\n"
|
|
137
|
+
f"```\n{validation.stdout[-2000:]}\n```\n\n"
|
|
138
|
+
f"## Next actions\n\n"
|
|
139
|
+
f"- Merge: `/admiral-apply {branch}` (or `git merge --no-ff {branch}`)\n"
|
|
140
|
+
f"- Reject: `/admiral-reject {branch}` (deletes branch + records fingerprint)\n"
|
|
141
|
+
f"- Rollback: `git branch -D {branch}`\n"
|
|
142
|
+
)
|
|
143
|
+
history.append(
|
|
144
|
+
"proposal-staged",
|
|
145
|
+
f"{proposal.code} :: branch={branch} :: fp={proposal.fingerprint}",
|
|
146
|
+
)
|
|
147
|
+
return StagedProposal(branch=branch, proposal_path=prop_path, commit_sha=commit_sha)
|