drydock-cli 2.7.37__tar.gz → 2.7.39__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.
Files changed (745) hide show
  1. drydock_cli-2.7.39/.auto_release.lock +1 -0
  2. drydock_cli-2.7.39/HLE_PRD.md +193 -0
  3. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/PKG-INFO +1 -1
  4. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/agent_loop.py +170 -1
  5. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/steering_hook.py +18 -6
  6. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/bash.py +96 -0
  7. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/pyproject.toml +1 -1
  8. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/hle_eval.py +107 -22
  9. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_issue_fixes.py +101 -1
  10. drydock_cli-2.7.39/tests/tools/test_bash_exact_cmd_loop_breaker.py +59 -0
  11. drydock_cli-2.7.39/tests/tools/test_bash_heredoc_confirmation.py +76 -0
  12. drydock_cli-2.7.39/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +57 -0
  13. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/trip_log.md +287 -0
  14. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/uv.lock +1 -1
  15. drydock_cli-2.7.37/.auto_release.lock +0 -1
  16. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.claude/scheduled_tasks.lock +0 -0
  17. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/CODEOWNERS +0 -0
  18. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  19. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  20. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/workflows/build-and-upload.yml +0 -0
  22. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/workflows/ci.yml +0 -0
  23. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/workflows/issue-labeler.yml +0 -0
  24. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.github/workflows/release.yml +0 -0
  25. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.gitignore +0 -0
  26. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.perf_baseline_done +0 -0
  27. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.pre-commit-config.yaml +0 -0
  28. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.python-version +0 -0
  29. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.typos.toml +0 -0
  30. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.vscode/extensions.json +0 -0
  31. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.vscode/launch.json +0 -0
  32. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/.vscode/settings.json +0 -0
  33. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/AGENTS.md +0 -0
  34. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/Admiral.md +0 -0
  35. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/BASELINE_412.md +0 -0
  36. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/CHANGELOG.md +0 -0
  37. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/CLAUDE.md +0 -0
  38. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/CONTRIBUTING.md +0 -0
  39. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/DEPLOYMENT.md +0 -0
  40. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/Drydock_rebrand.md +0 -0
  41. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/JETSON_BENCH.md +0 -0
  42. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/LICENSE +0 -0
  43. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/MODEL_SHORTCOMINGS.md +0 -0
  44. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/NOTICE +0 -0
  45. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/OVERNIGHT_PROGRESS.md +0 -0
  46. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  47. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/PERF_SWEEP_PLAN.md +0 -0
  48. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/PRD.md +0 -0
  49. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/README.md +0 -0
  50. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/SOVEREIGN_PRD.md +0 -0
  51. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/TRIAGE_v1.md +0 -0
  52. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/action.yml +0 -0
  53. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/README.md +0 -0
  54. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results1.tsv +0 -0
  55. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results13.tsv +0 -0
  56. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results14.tsv +0 -0
  57. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results15.tsv +0 -0
  58. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results16.tsv +0 -0
  59. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results17.tsv +0 -0
  60. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results18.tsv +0 -0
  61. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results19.tsv +0 -0
  62. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results2.tsv +0 -0
  63. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results20.tsv +0 -0
  64. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results3.tsv +0 -0
  65. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results4.tsv +0 -0
  66. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results5.tsv +0 -0
  67. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results6.tsv +0 -0
  68. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results7.tsv +0 -0
  69. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results8.tsv +0 -0
  70. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results9.tsv +0 -0
  71. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/baseline_history/results_evolved_v1.tsv +0 -0
  72. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/distribution/zed/LICENSE +0 -0
  73. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/distribution/zed/extension.toml +0 -0
  74. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/distribution/zed/icons/mistral_vibe.svg +0 -0
  75. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/docs/README.md +0 -0
  76. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/docs/acp-setup.md +0 -0
  77. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/docs/proxy-setup.md +0 -0
  78. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/__init__.py +0 -0
  79. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/__init__.py +0 -0
  80. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/acp_agent_loop.py +0 -0
  81. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/acp_logger.py +0 -0
  82. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/entrypoint.py +0 -0
  83. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/__init__.py +0 -0
  84. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/base.py +0 -0
  85. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/builtins/bash.py +0 -0
  86. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/builtins/read_file.py +0 -0
  87. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/builtins/search_replace.py +0 -0
  88. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/builtins/todo.py +0 -0
  89. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/builtins/write_file.py +0 -0
  90. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/tools/session_update.py +0 -0
  91. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/acp/utils.py +0 -0
  92. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/__init__.py +0 -0
  93. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/detectors.py +0 -0
  94. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/detectors_proposed.py +0 -0
  95. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/history.py +0 -0
  96. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/interventions.py +0 -0
  97. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/llm_analyzer.py +0 -0
  98. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/metrics.py +0 -0
  99. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/opus_escalator.py +0 -0
  100. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/persistence.py +0 -0
  101. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/policy.py +0 -0
  102. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/proposer.py +0 -0
  103. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/stager.py +0 -0
  104. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/task_classifier.py +0 -0
  105. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/tuning.py +0 -0
  106. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/validator.py +0 -0
  107. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/admiral/worker.py +0 -0
  108. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/__init__.py +0 -0
  109. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/autocompletion/__init__.py +0 -0
  110. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/autocompletion/base.py +0 -0
  111. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/autocompletion/path_completion.py +0 -0
  112. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/autocompletion/slash_command.py +0 -0
  113. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/cli.py +0 -0
  114. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/clipboard.py +0 -0
  115. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/commands.py +0 -0
  116. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/entrypoint.py +0 -0
  117. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/history_manager.py +0 -0
  118. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  119. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  120. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  121. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/terminal_setup.py +0 -0
  122. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/__init__.py +0 -0
  123. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  124. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/app.py +0 -0
  125. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/app.tcss +0 -0
  126. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/external_editor.py +0 -0
  127. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  128. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  129. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  130. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  131. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  132. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  133. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  134. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  135. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  136. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  137. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  138. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  139. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  140. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  141. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  142. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  143. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  144. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  145. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  146. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  147. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  148. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  149. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  150. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  151. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  152. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  153. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  154. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  155. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  156. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  157. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  158. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  159. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  160. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  161. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  162. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  163. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  164. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/windowing/history.py +0 -0
  165. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  166. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/textual_ui/windowing/state.py +0 -0
  167. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/__init__.py +0 -0
  168. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  169. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  170. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  171. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  172. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  173. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/update.py +0 -0
  174. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/cli/update_notifier/whats_new.py +0 -0
  175. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/__init__.py +0 -0
  176. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/agents/__init__.py +0 -0
  177. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/agents/manager.py +0 -0
  178. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/agents/models.py +0 -0
  179. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/auth/__init__.py +0 -0
  180. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/auth/crypto.py +0 -0
  181. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/auth/github.py +0 -0
  182. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/__init__.py +0 -0
  183. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/completers.py +0 -0
  184. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  185. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  186. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  187. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  188. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  189. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/fuzzy.py +0 -0
  190. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/path_prompt.py +0 -0
  191. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  192. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/build_orchestrator.py +0 -0
  193. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/checkpoint.py +0 -0
  194. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/classifier/__init__.py +0 -0
  195. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/classifier/__main__.py +0 -0
  196. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/classifier/classifier.py +0 -0
  197. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/classifier/dispatcher.py +0 -0
  198. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/classifier/rules.py +0 -0
  199. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/classifier/signal.py +0 -0
  200. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/config/__init__.py +0 -0
  201. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/config/_settings.py +0 -0
  202. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/config/doctor.py +0 -0
  203. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/config/harness_files/__init__.py +0 -0
  204. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  205. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/config/harness_files/_paths.py +0 -0
  206. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/config/local_detect.py +0 -0
  207. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/consultant.py +0 -0
  208. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/context_recovery.py +0 -0
  209. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/drydock_states.py +0 -0
  210. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/hooks.py +0 -0
  211. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/__init__.py +0 -0
  212. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/backend/anthropic.py +0 -0
  213. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/backend/base.py +0 -0
  214. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/backend/factory.py +0 -0
  215. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/backend/generic.py +0 -0
  216. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/backend/mistral.py +0 -0
  217. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  218. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/backend/vertex.py +0 -0
  219. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/exceptions.py +0 -0
  220. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/format.py +0 -0
  221. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/message_utils.py +0 -0
  222. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/llm/types.py +0 -0
  223. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/logger.py +0 -0
  224. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/middleware.py +0 -0
  225. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/output_formatters.py +0 -0
  226. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/paths/__init__.py +0 -0
  227. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/paths/_drydock_home.py +0 -0
  228. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/paths/_local_config_walk.py +0 -0
  229. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/paths/conventions.py +0 -0
  230. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/plan_session.py +0 -0
  231. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/plugins.py +0 -0
  232. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/programmatic.py +0 -0
  233. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/__init__.py +0 -0
  234. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/builder.md +0 -0
  235. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/cli.md +0 -0
  236. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/compact.md +0 -0
  237. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/dangerous_directory.md +0 -0
  238. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/diagnostic.md +0 -0
  239. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/explore.md +0 -0
  240. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/gemma4.md +0 -0
  241. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/planner.md +0 -0
  242. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/project_context.md +0 -0
  243. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/prompts/tests.md +0 -0
  244. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/proxy_setup.py +0 -0
  245. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/session/agent_memory.py +0 -0
  246. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/session/checkpoints.py +0 -0
  247. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/session/session_loader.py +0 -0
  248. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/session/session_logger.py +0 -0
  249. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/session/session_migration.py +0 -0
  250. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/session/state_file.py +0 -0
  251. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/session_checker.py +0 -0
  252. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/skills/__init__.py +0 -0
  253. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/skills/manager.py +0 -0
  254. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/skills/models.py +0 -0
  255. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/skills/parser.py +0 -0
  256. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/slug.py +0 -0
  257. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/system_prompt.py +0 -0
  258. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/telemetry/__init__.py +0 -0
  259. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/telemetry/send.py +0 -0
  260. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/teleport/errors.py +0 -0
  261. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/teleport/git.py +0 -0
  262. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/teleport/nuage.py +0 -0
  263. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/teleport/teleport.py +0 -0
  264. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/teleport/types.py +0 -0
  265. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/base.py +0 -0
  266. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/_task_manager.py +0 -0
  267. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  268. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/cron.py +0 -0
  269. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  270. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/glob_tool.py +0 -0
  271. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/grep.py +0 -0
  272. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  273. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/lsp.py +0 -0
  274. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  275. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  276. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/powershell.py +0 -0
  277. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  278. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  279. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  280. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  281. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  282. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  283. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  284. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  285. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  286. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  287. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  288. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  289. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  290. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  291. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  292. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/task.md +0 -0
  293. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  294. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  295. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  296. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  297. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  298. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  299. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  300. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/read_file.py +0 -0
  301. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/retrieve.py +0 -0
  302. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/search_replace.py +0 -0
  303. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/task.py +0 -0
  304. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/todo.py +0 -0
  305. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/tool_search.py +0 -0
  306. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/webfetch.py +0 -0
  307. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/websearch.py +0 -0
  308. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/worktree.py +0 -0
  309. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/builtins/write_file.py +0 -0
  310. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/injection_guard.py +0 -0
  311. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/manager.py +0 -0
  312. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/mcp/__init__.py +0 -0
  313. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/mcp/registry.py +0 -0
  314. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/mcp/tools.py +0 -0
  315. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/mcp_sampling.py +0 -0
  316. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/ui.py +0 -0
  317. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/tools/utils.py +0 -0
  318. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/trusted_folders.py +0 -0
  319. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/types.py +0 -0
  320. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/core/utils.py +0 -0
  321. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/graphrag/__init__.py +0 -0
  322. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/graphrag/__main__.py +0 -0
  323. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/graphrag/code_indexer.py +0 -0
  324. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/graphrag/retriever.py +0 -0
  325. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/graphrag/storage.py +0 -0
  326. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/graphrag/text_indexer.py +0 -0
  327. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/__init__.py +0 -0
  328. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/base.py +0 -0
  329. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/onboarding.tcss +0 -0
  330. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/screens/__init__.py +0 -0
  331. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/screens/api_key.py +0 -0
  332. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/screens/choice.py +0 -0
  333. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/screens/local_model.py +0 -0
  334. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/onboarding/screens/welcome.py +0 -0
  335. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  336. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  337. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/__init__.py +0 -0
  338. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/api-design/SKILL.md +0 -0
  339. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/audit-tests/SKILL.md +0 -0
  340. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/batch/SKILL.md +0 -0
  341. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/commit-code/SKILL.md +0 -0
  342. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/context-summary/SKILL.md +0 -0
  343. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/create-presentation/SKILL.md +0 -0
  344. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/deep-research/SKILL.md +0 -0
  345. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/deploy/SKILL.md +0 -0
  346. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/diff-review/SKILL.md +0 -0
  347. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/doc-gen/SKILL.md +0 -0
  348. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/explain-code/SKILL.md +0 -0
  349. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/explore-code/SKILL.md +0 -0
  350. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/fix-issue/SKILL.md +0 -0
  351. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/git-ops/SKILL.md +0 -0
  352. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/init-project/SKILL.md +0 -0
  353. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/investigate/SKILL.md +0 -0
  354. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/loop/SKILL.md +0 -0
  355. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/migrate/SKILL.md +0 -0
  356. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/perf-analyze/SKILL.md +0 -0
  357. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/plan-impl/SKILL.md +0 -0
  358. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/pr-review/SKILL.md +0 -0
  359. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/refactor/SKILL.md +0 -0
  360. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/regex-help/SKILL.md +0 -0
  361. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/review/SKILL.md +0 -0
  362. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/security-review/SKILL.md +0 -0
  363. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/ship/SKILL.md +0 -0
  364. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/simplify/SKILL.md +0 -0
  365. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/strong-tests/SKILL.md +0 -0
  366. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/skills/test-verify/SKILL.md +0 -0
  367. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/steering/__init__.py +0 -0
  368. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/steering/__main__.py +0 -0
  369. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/steering/applier.py +0 -0
  370. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/steering/config.py +0 -0
  371. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/steering/registry.py +0 -0
  372. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/steering/sandbox.py +0 -0
  373. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/steering/vectors.py +0 -0
  374. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock/whats_new.md +0 -0
  375. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock-acp.spec +0 -0
  376. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/drydock_terms.md +0 -0
  377. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/flake.lock +0 -0
  378. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/flake.nix +0 -0
  379. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/nohup.out +0 -0
  380. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/perf_results/baseline_1777672181.json +0 -0
  381. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/perf_results/baseline_1777672218.json +0 -0
  382. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/perf_results/baseline_1777672322.json +0 -0
  383. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/perf_results/baseline_1777732278.json +0 -0
  384. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/perf_results/baseline_1777811293.json +0 -0
  385. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/perf_results/baseline_1777811401.json +0 -0
  386. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/README.md +0 -0
  387. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/config_base.toml +0 -0
  388. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/config_best.toml +0 -0
  389. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/domain_spec.md +0 -0
  390. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/experimenter.py +0 -0
  391. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/kernel.py +0 -0
  392. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/mini_prd.md +0 -0
  393. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/mini_prompts.txt +0 -0
  394. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/proposer.py +0 -0
  395. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/research/results.tsv +0 -0
  396. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/resume.md +0 -0
  397. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/README.md +0 -0
  398. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/admiral_probe.py +0 -0
  399. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/audit_sampler.py +0 -0
  400. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/auto_generate_tests.py +0 -0
  401. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/auto_release.sh +0 -0
  402. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/auto_test_loop.sh +0 -0
  403. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/autonomous_review.sh +0 -0
  404. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/autonomous_review_prompt.md +0 -0
  405. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/backup.sh +0 -0
  406. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/bump_version.py +0 -0
  407. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/classify_pulse.sh +0 -0
  408. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/comprehensive_loop.py +0 -0
  409. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/consume_retrieval_queue.py +0 -0
  410. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/deploy_to_github.sh +0 -0
  411. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/discover_cli_tools.sh +0 -0
  412. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/evolve_tests.py +0 -0
  413. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/gen_2000_prompts.py +0 -0
  414. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/hle_eval_seed.jsonl +0 -0
  415. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/install.sh +0 -0
  416. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/llm_balancer.py +0 -0
  417. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/mega_loop.py +0 -0
  418. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/meta_ralph_loop.py +0 -0
  419. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/monitor_swebench.sh +0 -0
  420. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/monitor_test_battery.sh +0 -0
  421. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/notify_release.py +0 -0
  422. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/oss_task_harness.py +0 -0
  423. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/overnight_agents_test.sh +0 -0
  424. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/perf_baseline_when_idle.sh +0 -0
  425. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/perf_sweep.py +0 -0
  426. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/poll_issues.sh +0 -0
  427. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/port_task.py +0 -0
  428. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/prepare_release.py +0 -0
  429. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/publish_to_pypi.sh +0 -0
  430. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/queue_top.py +0 -0
  431. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/ralph_loop.py +0 -0
  432. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/research_babysitter.sh +0 -0
  433. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/session_loop_audit.py +0 -0
  434. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/shakedown.py +0 -0
  435. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/shakedown_interactive.py +0 -0
  436. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/shakedown_regression.sh +0 -0
  437. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/shakedown_suite.sh +0 -0
  438. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/shakedown_variance.sh +0 -0
  439. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_babysitter.sh +0 -0
  440. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_prompts_50.txt +0 -0
  441. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_prompts_realuser.txt +0 -0
  442. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_prompts_tool_agent.txt +0 -0
  443. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  444. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_shakedown.py +0 -0
  445. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_telegram_status.py +0 -0
  446. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/stress_watcher.py +0 -0
  447. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/telegram_bot.py +0 -0
  448. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/test_bank.sh +0 -0
  449. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/test_full.sh +0 -0
  450. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/test_smoke.sh +0 -0
  451. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/test_tui_path.py +0 -0
  452. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/tui_test.py +0 -0
  453. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/scripts/vllm_failover.sh +0 -0
  454. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/test/project/dummy +0 -0
  455. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/__init__.py +0 -0
  456. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/conftest.py +0 -0
  457. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_acp.py +0 -0
  458. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_agent_thought.py +0 -0
  459. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_bash.py +0 -0
  460. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_compact_session_updates.py +0 -0
  461. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_content.py +0 -0
  462. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_initialize.py +0 -0
  463. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_list_sessions.py +0 -0
  464. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_load_session.py +0 -0
  465. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_multi_session.py +0 -0
  466. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_new_session.py +0 -0
  467. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_proxy_setup_acp.py +0 -0
  468. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_read_file.py +0 -0
  469. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_search_replace.py +0 -0
  470. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_set_config_option.py +0 -0
  471. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_set_mode.py +0 -0
  472. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_set_model.py +0 -0
  473. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_tool_call_session_update.py +0 -0
  474. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_utils.py +0 -0
  475. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/acp/test_write_file.py +0 -0
  476. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_file_indexer.py +0 -0
  477. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_fuzzy.py +0 -0
  478. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  479. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  480. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_path_completion_controller.py +0 -0
  481. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  482. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_slash_command_controller.py +0 -0
  483. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  484. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/__init__.py +0 -0
  485. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/data/__init__.py +0 -0
  486. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/data/fireworks.py +0 -0
  487. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/data/mistral.py +0 -0
  488. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/test_anthropic_adapter.py +0 -0
  489. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/test_backend.py +0 -0
  490. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  491. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/test_reasoning_adapter.py +0 -0
  492. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  493. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  494. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  495. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  496. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_bell_notifications.py +0 -0
  497. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_braille_renderer.py +0 -0
  498. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_clipboard.py +0 -0
  499. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_commands.py +0 -0
  500. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_copy_shortcuts.py +0 -0
  501. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_external_editor.py +0 -0
  502. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_no_markup_static.py +0 -0
  503. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_question_app.py +0 -0
  504. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_spinner.py +0 -0
  505. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_switching_mode.py +0 -0
  506. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  507. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  508. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_ui_session_resume.py +0 -0
  509. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/test_ui_skill_dispatch.py +0 -0
  510. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/textual_ui/__init__.py +0 -0
  511. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/cli/textual_ui/test_session_picker.py +0 -0
  512. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/conftest.py +0 -0
  513. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_agents.py +0 -0
  514. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_auth_crypto.py +0 -0
  515. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_auth_github.py +0 -0
  516. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  517. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  518. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_config_load_dotenv.py +0 -0
  519. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_config_paths.py +0 -0
  520. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_config_resolution.py +0 -0
  521. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_file_logging.py +0 -0
  522. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_plan_session.py +0 -0
  523. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_proxy_setup.py +0 -0
  524. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_slug.py +0 -0
  525. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_telemetry_send.py +0 -0
  526. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_teleport_git.py +0 -0
  527. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_teleport_nuage.py +0 -0
  528. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_teleport_service.py +0 -0
  529. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_trusted_folders.py +0 -0
  530. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/core/test_utils.py +0 -0
  531. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/e2e/common.py +0 -0
  532. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/e2e/conftest.py +0 -0
  533. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/e2e/mock_server.py +0 -0
  534. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  535. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/e2e/test_cli_tui_streaming.py +0 -0
  536. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  537. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/fixtures/doc_qa_system_prd.md +0 -0
  538. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/mock/__init__.py +0 -0
  539. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/mock/mock_backend_factory.py +0 -0
  540. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/mock/mock_entrypoint.py +0 -0
  541. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/mock/utils.py +0 -0
  542. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/onboarding/test_run_onboarding.py +0 -0
  543. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/onboarding/test_ui_onboarding.py +0 -0
  544. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/session/test_session_loader.py +0 -0
  545. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/session/test_session_logger.py +0 -0
  546. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/session/test_session_migration.py +0 -0
  547. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/skills/conftest.py +0 -0
  548. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/skills/test_manager.py +0 -0
  549. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/skills/test_models.py +0 -0
  550. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/skills/test_parser.py +0 -0
  551. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  552. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  553. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  554. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  555. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  556. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  557. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  558. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  559. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  560. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  561. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  562. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  563. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  564. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  565. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  566. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  567. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  568. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  569. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  570. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  571. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  572. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  573. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  574. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  575. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  576. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  577. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  578. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  579. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  580. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  581. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  582. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  583. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  584. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  585. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  586. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  587. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  588. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  589. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  590. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  591. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  592. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  593. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  594. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  595. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  596. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  597. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  598. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  599. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  600. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  601. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  602. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  603. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  604. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  605. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  606. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  607. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  608. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  609. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  610. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  611. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/base_snapshot_test_app.py +0 -0
  612. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/conftest.py +0 -0
  613. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/snap_compare.py +0 -0
  614. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  615. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  616. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  617. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  618. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  619. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  620. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  621. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  622. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  623. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  624. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  625. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  626. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  627. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  628. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/stubs/fake_backend.py +0 -0
  629. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/stubs/fake_client.py +0 -0
  630. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/stubs/fake_tool.py +0 -0
  631. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_admiral.py +0 -0
  632. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_admiral_phase3.py +0 -0
  633. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_admiral_proposed.py +0 -0
  634. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_admiral_struggle_dedup.py +0 -0
  635. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_agent_auto_compact.py +0 -0
  636. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_agent_backend.py +0 -0
  637. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_agent_observer_streaming.py +0 -0
  638. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_agent_stats.py +0 -0
  639. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_agent_tasks.py +0 -0
  640. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_agent_tool_call.py +0 -0
  641. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_agents.py +0 -0
  642. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_bank_build.py +0 -0
  643. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_bank_debug.py +0 -0
  644. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_bank_multiagent.py +0 -0
  645. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_bank_prd.py +0 -0
  646. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_bank_prd_extended.py +0 -0
  647. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_bank_tools.py +0 -0
  648. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_bank_update.py +0 -0
  649. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_build_projects.py +0 -0
  650. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_checkpoint.py +0 -0
  651. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_classifier.py +0 -0
  652. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_cli_programmatic_preload.py +0 -0
  653. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_context_recovery.py +0 -0
  654. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_current_bugs.py +0 -0
  655. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_dispatcher.py +0 -0
  656. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_drydock_regression.py +0 -0
  657. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_drydock_tasks.py +0 -0
  658. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  659. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_full_regression.py +0 -0
  660. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_graphrag.py +0 -0
  661. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_hallucinated_tool_suppression.py +0 -0
  662. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_history_manager.py +0 -0
  663. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_integration.py +0 -0
  664. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_local_detect.py +0 -0
  665. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_loop_detection.py +0 -0
  666. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_message_id.py +0 -0
  667. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_message_merging.py +0 -0
  668. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_middleware.py +0 -0
  669. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_multi_agent.py +0 -0
  670. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_read_file_not_found_listing.py +0 -0
  671. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_real_failures.py +0 -0
  672. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_real_issues.py +0 -0
  673. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_real_workflow.py +0 -0
  674. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_reasoning_content.py +0 -0
  675. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_retrieval_consumer.py +0 -0
  676. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_retrieve_tool.py +0 -0
  677. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_search_replace_args_not_truncated.py +0 -0
  678. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_smoke.py +0 -0
  679. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_steering.py +0 -0
  680. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_steering_hook.py +0 -0
  681. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_system_prompt.py +0 -0
  682. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_tagged_text.py +0 -0
  683. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_task_complete_nudge.py +0 -0
  684. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_tool_args.py +0 -0
  685. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_truncate_args_valid_json.py +0 -0
  686. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_truncated_arg_path_hint.py +0 -0
  687. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_truncated_search_replace_escalation.py +0 -0
  688. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_truncated_write_escalation.py +0 -0
  689. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_ui_external_editor.py +0 -0
  690. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_ui_input_history.py +0 -0
  691. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_user_issues.py +0 -0
  692. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_wall_of_text_rescue.py +0 -0
  693. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_workloads.py +0 -0
  694. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/test_write_file_missing_path.py +0 -0
  695. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/testbank_helpers.py +0 -0
  696. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_ask_user_question.py +0 -0
  697. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_bash.py +0 -0
  698. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  699. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_bash_consec_empty_search.py +0 -0
  700. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  701. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  702. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  703. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  704. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_exit_plan_mode.py +0 -0
  705. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_grep.py +0 -0
  706. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  707. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_invoke_context.py +0 -0
  708. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  709. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_manager_get_tool_config.py +0 -0
  710. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_mcp.py +0 -0
  711. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_mcp_sampling.py +0 -0
  712. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  713. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  714. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_read_file_directory.py +0 -0
  715. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_read_file_limit_truncation.py +0 -0
  716. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_append_fallback.py +0 -0
  717. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_dir_path.py +0 -0
  718. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_empty_content.py +0 -0
  719. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_file_not_found.py +0 -0
  720. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  721. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_hard_stop.py +0 -0
  722. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_malformed_block.py +0 -0
  723. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  724. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_placeholder.py +0 -0
  725. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  726. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_task.py +0 -0
  727. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_ui_bash_execution.py +0 -0
  728. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_webfetch.py +0 -0
  729. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_websearch.py +0 -0
  730. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  731. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  732. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  733. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  734. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/test_do_update.py +0 -0
  735. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  736. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/test_github_update_gateway.py +0 -0
  737. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  738. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/test_ui_update_notification.py +0 -0
  739. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/test_update_use_case.py +0 -0
  740. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/tests/update_notifier/test_whats_new.py +0 -0
  741. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/worked_examples/README.md +0 -0
  742. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/worked_examples/cli_subcommand_dispatch.py +0 -0
  743. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/worked_examples/lookup.json +0 -0
  744. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/worked_examples/sql_parser.py +0 -0
  745. {drydock_cli-2.7.37 → drydock_cli-2.7.39}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2749816
@@ -0,0 +1,193 @@
1
+ # HLE PRD — drydock + GraphRAG + Deep Noir vs Humanity's Last Exam
2
+
3
+ **Status as of 2026-05-04 00:40 UTC.** Update on resume.
4
+
5
+ ## Thesis
6
+
7
+ > drydock + GraphRAG + Deep Noir working together should be able to solve
8
+ > any problem.
9
+
10
+ HLE is the hardest possible PRD — explicitly designed to defeat frontier
11
+ models. Reaching a defensible local-26B score against it validates that
12
+ the three-leg architecture generalizes. Failures expose which leg is weak.
13
+
14
+ **Critical rule:** drydock IS the harness. Eval drives questions through
15
+ the real TUI. Never wrap the model directly. Every failure is a drydock-
16
+ or-leg bug to fix, not a harness limitation. See
17
+ `memory/feedback_drydock_is_the_harness.md`.
18
+
19
+ ## The three legs and their current strength
20
+
21
+ | Leg | What it owns | State | Evidence |
22
+ |-----|--------------|-------|----------|
23
+ | **drydock** | agent loop, tool use, prompts, harness fixes | **strongest** | 70% SWE-bench file match; 49/52 PRD functional tests; 16K+ harness queue actively drained |
24
+ | **GraphRAG** | factual recall over indexed code/text | **medium** | infra works (1842 symbols, 75 chunks); only cwd source ingested; **no general knowledge corpus** |
25
+ | **Deep Noir** | reasoning-mode steering | **weakest** | scaffolding shipped (`drydock/steering/`), `LogitBiasSteeringApplier` wired, hook in agent_loop; **zero vectors trained** — hook is a no-op |
26
+
27
+ ## Phase plan
28
+
29
+ ### Phase 1 — baseline (in flight)
30
+
31
+ Goal: bare drydock + bare GraphRAG (cwd only) + zero Deep Noir vs HLE.
32
+ This number is the floor.
33
+
34
+ - ✅ `scripts/hle_eval.py` — single-file orchestrator
35
+ - ✅ `scripts/hle_eval_seed.jsonl` — 7 undergrad questions for pipeline validation
36
+ - ✅ Pipeline validated: 7/7 = 100% on seed (commit 7c3a2d9 + earlier)
37
+ - ✅ HF token landed at `~/.config/drydock/hf_token` (chmod 600)
38
+ - ✅ HLE accessible: 2500 questions total, 2158 text-only, 342 multimodal (skipped)
39
+ - 🟡 **N=200 overnight baseline running** (PID in `/tmp/hle_overnight.pid`,
40
+ log `/tmp/hle_overnight.log`, results dir under `/data3/drydock/hle_results/`).
41
+ Started 2026-05-04 00:46 UTC (restarted with Telegram wiring).
42
+ Expected runtime ~10-16h based on q1's 6 min pace. Each question
43
+ writes a line to `results.jsonl` incrementally — partial progress
44
+ is always visible mid-run.
45
+ - 🟡 **Telegram pings configured** (commit ed7f6de, SOTA ref 45.9%):
46
+ start ping fired; milestone every 50 completions; final + breakdown
47
+ on completion; crash + resume command on error.
48
+ - ⏳ Phase 1 deliverable: a number — Gemma 4 + bare drydock baseline on HLE
49
+
50
+ Realistic baseline expectation per pre-run analysis:
51
+ - Bare 26B-A4B without retrieval/steering: ~5–10% on HLE
52
+ - Reaching ~22–25% would be defensible vs ~25–30% frontier scores
53
+
54
+ ### Phase 2 — GraphRAG with knowledge corpus
55
+
56
+ Goal: ingest enough general knowledge that retrieve answers fact-recall
57
+ questions. Re-run, measure delta.
58
+
59
+ - ⏳ Identify corpus (Wikipedia subset / arXiv abstracts / textbook chunks)
60
+ - ⏳ Extend `drydock/graphrag/code_indexer.py` ingest path for non-code text
61
+ (it already supports text via `text_indexer.py`; just needs corpus)
62
+ - ⏳ Bulk ingest into `~/.drydock/graphrag.sqlite`
63
+ - ⏳ Re-run HLE Phase 1 with corpus loaded; measure delta
64
+ - Expected delta: +3 to +7 points if corpus is good, +0 if not
65
+
66
+ ### Phase 3 — Deep Noir reasoning vectors
67
+
68
+ Goal: train activation-steering vectors on reasoning-failure pairs from
69
+ admiral_history; deposit into `~/.drydock/steering/vectors/`; the
70
+ existing hook applies them. This is the user's research domain.
71
+
72
+ - ⏳ Extract pairs from admiral_history (model-output / correct-intervention)
73
+ - ⏳ Train vectors per direction: "verify-before-answer", "show-work-explicitly",
74
+ "consider-units", "minimal-patch"
75
+ - ⏳ Deposit `.npy + .toml` per mode under `~/.drydock/steering/vectors/<mode>/`
76
+ - ⏳ Set `DRYDOCK_STEERING_MODES=<mode1>,<mode2>` env at TUI launch
77
+ - ⏳ Re-run HLE; measure delta vs Phase 2
78
+ - Expected delta: 0 to +3 points; high variance, open research
79
+
80
+ ## Currently running / in flight
81
+
82
+ | Thing | PID | Log | Notes |
83
+ |-------|-----|-----|-------|
84
+ | stress harness | `/tmp/stress_pid.txt` (was 2219727) | `/tmp/stress_*.log` | 1d 9h+ uptime, ~76% through 1658-prompt suite |
85
+ | llm_balancer | 2462362 (rotates) | `/data3/drydock/logs/balancer.log` | :8001, ~10h uptime |
86
+ | HLE N=200 overnight | `/tmp/hle_overnight.pid` (was 2567027) | `/tmp/hle_overnight.log` | output `/data3/drydock/hle_results/run_*/`; expected 10-16h |
87
+
88
+ ## Resume checklist (if connection dropped)
89
+
90
+ ```bash
91
+ # 1. Where are we?
92
+ date -u
93
+ git -C /data3/drydock log --oneline --since="6 hours ago"
94
+ git -C /data3/drydock describe --tags --abbrev=0 # current PyPI tag
95
+
96
+ # 2. HLE run status
97
+ ps -p $(cat /tmp/hle_overnight.pid 2>/dev/null) -o pid,etime,comm
98
+ ls /data3/drydock/hle_results/
99
+ tail -50 /tmp/hle_overnight.log
100
+ n_done=$(wc -l < /data3/drydock/hle_results/run_*/results.jsonl 2>/dev/null)
101
+ echo "completed: $n_done / 200"
102
+
103
+ # 3. If HLE crashed mid-flight, RESUME (skip already-done IDs)
104
+ RUN_DIR=$(ls -td /data3/drydock/hle_results/run_* | head -1)
105
+ nohup /home/bobef/miniconda3/bin/python3 /data3/drydock/scripts/hle_eval.py \
106
+ --source hle --limit 200 --shuffle --seed 42 --resume "$RUN_DIR" \
107
+ > /tmp/hle_resume.log 2>&1 &
108
+
109
+ # 4. If complete, see the score
110
+ cat /data3/drydock/hle_results/run_*/summary.json | python3 -m json.tool
111
+
112
+ # 5. Infra health
113
+ ps -p 2462362 -o pid,etime
114
+ curl -s --max-time 3 http://localhost:8001/v1/models | head -1
115
+ gh issue list --repo fbobe321/drydock --state open --limit 5
116
+ ```
117
+
118
+ ## Known issues + workarounds
119
+
120
+ 1. **`web_search` tool requires permission approval** by default
121
+ (`ToolPermission.ASK`). In batch eval the harness can't see/respond
122
+ to the prompt → session stalls. **Workaround:**
123
+ `--dangerously-skip-permissions` flag passed by `hle_eval.py`.
124
+ **Real fix:** auto-approve read-only tools when stdin is non-TTY
125
+ or `DRYDOCK_BATCH_MODE=1`. Memory:
126
+ `memory/project_hle_phase1_findings.md`.
127
+
128
+ 2. **TUI input handler corrupts rapid char-by-char multi-line pexpect
129
+ input.** Internal `\n` chars get partially eaten + spurious newlines
130
+ inserted on long prompts. **Workaround:** single-line prompts in
131
+ `hle_eval.py`. **Real fix:** debug `drydock/cli/textual_ui/` input
132
+ buffer.
133
+
134
+ 3. **Auto_release at 06:00/12:00/18:00/00:00 UTC overwrites site-packages.**
135
+ In-flight HLE runs survive (each new question is a fresh TUI spawn that
136
+ picks up the new binary), but if you direct-edit site-packages your
137
+ changes vanish. Always commit to source. Pause via:
138
+ `touch /data3/drydock/.pause_auto_release`.
139
+
140
+ 4. **PRD contamination: model edits `PRD.md` mid-session.** HLE doesn't
141
+ touch this — every HLE question gets a fresh empty cwd. Not a concern
142
+ for HLE; relevant for shakedown PRD runs.
143
+
144
+ 5. **Sessions take real time.** HLE questions involve web_search +
145
+ multi-step reasoning. Seed q's took 30-60s; HLE q's appear to take
146
+ 5+ min each (q1: 5 min in and still working). Expect N=20 to take
147
+ 1-2 hours, N=100 overnight.
148
+
149
+ ## Sentinels currently set
150
+
151
+ - `/data3/drydock_test_projects/.pause_watchdog` — watchdog cron paused
152
+ - `/data3/drydock/.pause_auto_release` — NOT set (auto_release is active)
153
+ - `/data3/drydock/research/STOP` — research loop sentinel (per gitignore)
154
+
155
+ ## Tomorrow morning's first action
156
+
157
+ If overnight run completed:
158
+ 1. `cat /data3/drydock/hle_results/run_*/summary.json` for the baseline number
159
+ 2. If <10%, the diagnosis is in the per-question `verdict` and `judge_reasoning`
160
+ fields. Sort by category to see if math/physics/CS dominate the failures.
161
+ 3. Commit the results JSON (with HLE content redacted to just IDs+verdicts —
162
+ never commit the question text per HLE license).
163
+ 4. Decide Phase 2 corpus based on category distribution of failures.
164
+
165
+ If overnight run crashed:
166
+ 1. `--resume` flag re-enters where it stopped (skip-by-id from results.jsonl).
167
+ 2. Likely failure modes: vLLM OOM on a long-thinking question, balancer
168
+ crash from a port conflict, drydock TUI hang on a tool error.
169
+ Investigate via the per-question `tui_logs/<id>.tui.log` files.
170
+
171
+ ## File map
172
+
173
+ ```
174
+ /data3/drydock/
175
+ ├── scripts/
176
+ │ ├── hle_eval.py # the orchestrator (this PRD's main artifact)
177
+ │ ├── hle_eval_seed.jsonl # 7 hand-crafted seed questions
178
+ │ └── consume_retrieval_queue.py # GraphRAG-leg autonomy (28× perf-fixed)
179
+ ├── hle_results/ # gitignored — per-run outputs
180
+ │ └── run_<ts>/
181
+ │ ├── config.json
182
+ │ ├── results.jsonl
183
+ │ ├── summary.json
184
+ │ ├── tui_logs/<id>.tui.log
185
+ │ └── work/<id>/ # per-question fresh cwd
186
+ ├── HLE_PRD.md # this file
187
+ └── ~/.config/drydock/hf_token # gated cais/hle access
188
+ ```
189
+
190
+ ## What "done" looks like for Phase 1
191
+
192
+ A number. With distribution. Per-category and overall. Writeup in this
193
+ PRD. Commit the writeup, not the questions. Decide Phase 2 from there.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.37
3
+ Version: 2.7.39
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
@@ -693,6 +693,25 @@ class AgentLoop:
693
693
  _ar_t1 = time.perf_counter()
694
694
  logger.warning("[TIMING] _auto_route_task: %.2fs", _ar_t1 - _ar_t0)
695
695
 
696
+ # === AUTO-PREFETCH RETRIEVE ===
697
+ # HLE Phase 1 finding (memory: project_graphrag_underused.md): Gemma 4
698
+ # almost never calls retrieve() on its own for general-knowledge
699
+ # questions — it defaults to web_search instead. So a curated
700
+ # GraphRAG corpus is invisible to the model unless we surface it
701
+ # automatically. This hook runs retrieve(query=user_msg[:300]) and,
702
+ # if there are real hits (above a quality threshold), prepends them
703
+ # as a system note BEFORE the first LLM call. Zero behavior change
704
+ # when the index has nothing relevant; pure lift when it does.
705
+ #
706
+ # Env-gated via DRYDOCK_AUTO_RETRIEVE so existing workflows are
707
+ # unaffected. Set to "1" or "true" to enable.
708
+ if os.environ.get("DRYDOCK_AUTO_RETRIEVE", "").strip().lower() in ("1", "true", "yes"):
709
+ logger.warning("[AUTO-RETRIEVE] hook entry, query=%r", (user_msg or "")[:80])
710
+ try:
711
+ self._auto_prefetch_retrieve(user_msg)
712
+ except Exception as _e:
713
+ logger.warning("auto-prefetch retrieve failed (skipped): %s", _e, exc_info=True)
714
+
696
715
  try:
697
716
  should_break_loop = False
698
717
  tool_turns = 0
@@ -1885,7 +1904,30 @@ class AgentLoop:
1885
1904
  if len(cleaned) != len(self.messages):
1886
1905
  self.messages.reset(cleaned)
1887
1906
 
1888
- # Fix 2: If last message is assistant, add a user "Continue." prompt.
1907
+ # Fix 2: Drop empty assistant messages (no content AND no tool_calls).
1908
+ # These violate the OpenAI schema and cause 400 errors on the next LLM
1909
+ # call. They arise when the model returns only thinking/reasoning tokens
1910
+ # (which get stripped) and stall-retry exhaustion leaves the empty msg
1911
+ # in history. An assistant message that follows a tool result must have
1912
+ # either content or tool_calls; if neither, drop it along with any
1913
+ # orphaned tool result messages that precede it (to keep role ordering
1914
+ # valid).
1915
+ cleaned2: list[LLMMessage] = []
1916
+ for msg in self.messages:
1917
+ if (msg.role == Role.assistant
1918
+ and not (msg.content or "").strip()
1919
+ and not msg.tool_calls):
1920
+ # Skip empty assistant — also drop any immediately preceding
1921
+ # tool result that would be left dangling without a matching
1922
+ # assistant turn.
1923
+ while cleaned2 and cleaned2[-1].role == Role.tool:
1924
+ cleaned2.pop()
1925
+ else:
1926
+ cleaned2.append(msg)
1927
+ if len(cleaned2) != len(self.messages):
1928
+ self.messages.reset(cleaned2)
1929
+
1930
+ # Fix 3: If last message is assistant, add a user "Continue." prompt.
1889
1931
  # The auto-Continue exists so Gemma 4 keeps executing multi-step plans
1890
1932
  # without stopping prematurely at an intermediate text response. For
1891
1933
  # stress runs against prompts that don't need tool calls (pure
@@ -2776,6 +2818,133 @@ class AgentLoop:
2776
2818
 
2777
2819
  return None
2778
2820
 
2821
+ def _auto_prefetch_retrieve(self, user_msg: str) -> None:
2822
+ """Auto-fetch relevant chunks from GraphRAG and inject as system note.
2823
+
2824
+ Runs synchronously (the GraphRAG retriever is a fast SQLite query).
2825
+ Caps the query length at 300 chars and the injected context at 2000
2826
+ chars to avoid blowing context budget on long user prompts.
2827
+
2828
+ Quality gate: only inject if at least one text-chunk hit has score
2829
+ >= 8.0 (the indexer's score is roughly TF-IDF magnitude). Below
2830
+ that, the retrieval is probably noise and would just bloat the
2831
+ prompt.
2832
+
2833
+ See memory/project_graphrag_underused.md for why this exists:
2834
+ Gemma 4 doesn't call retrieve() on its own for general-knowledge
2835
+ questions, so a curated index is invisible without a hook like
2836
+ this one.
2837
+ """
2838
+ try:
2839
+ from drydock.graphrag import Index
2840
+ db = os.environ.get("DRYDOCK_GRAPHRAG_DB") or str(
2841
+ Path.home() / ".drydock" / "graphrag.sqlite"
2842
+ )
2843
+ if not Path(db).is_file():
2844
+ logger.warning("[AUTO-RETRIEVE] db missing: %s", db)
2845
+ return
2846
+ idx = Index(db)
2847
+ except Exception as e:
2848
+ logger.warning("[AUTO-RETRIEVE] setup failed: %s", e, exc_info=True)
2849
+ return
2850
+
2851
+ # Extract the actual question from boilerplate. HLE-style prompts
2852
+ # are wrapped: "Answer this question. End your response with...
2853
+ # QUESTION: <real text>". Without this strip the retrieve query
2854
+ # matches scaffolding (CLAUDE.md learnings, etc.) instead of the
2855
+ # actual content. Also strip "FINAL ANSWER:" trailing instructions.
2856
+ raw = (user_msg or "")
2857
+ q_marker = raw.find("QUESTION:")
2858
+ if q_marker >= 0:
2859
+ raw = raw[q_marker + len("QUESTION:"):]
2860
+ # Drop trailing answer-format instructions
2861
+ for stopper in ("FINAL ANSWER:", "Your answer", "Format your", "End your response"):
2862
+ idx_ = raw.find(stopper)
2863
+ if idx_ > 50: # only strip if there's still meaningful content
2864
+ raw = raw[:idx_]
2865
+ query = raw.strip()[:400]
2866
+ if len(query) < 10:
2867
+ logger.warning("[AUTO-RETRIEVE] query too short (%d chars)", len(query))
2868
+ return
2869
+ logger.warning("[AUTO-RETRIEVE] extracted query: %r", query[:120])
2870
+
2871
+ try:
2872
+ result = idx.retrieve(query, symbol_limit=0, text_limit=4)
2873
+ except Exception as e:
2874
+ logger.warning("[AUTO-RETRIEVE] query failed: %s", e, exc_info=True)
2875
+ return
2876
+
2877
+ text_hits = getattr(result, "text", None) or getattr(result, "text_hits", []) or []
2878
+ QUALITY_THRESHOLD = 8.0
2879
+ good_hits = [h for h in text_hits if getattr(h, "score", 0) >= QUALITY_THRESHOLD]
2880
+ logger.warning("[AUTO-RETRIEVE] %d total hits, %d above threshold %.1f",
2881
+ len(text_hits), len(good_hits), QUALITY_THRESHOLD)
2882
+ if not good_hits:
2883
+ return
2884
+
2885
+ # Build the system note. Cap at ~2000 chars total.
2886
+ chunks = []
2887
+ budget = 2000
2888
+ for h in good_hits[:3]:
2889
+ text = (getattr(h, "content", "") or "").strip()
2890
+ score = float(getattr(h, "score", 0))
2891
+ file_ = getattr(h, "file", "") or "?"
2892
+ s, e = getattr(h, "start_line", 0), getattr(h, "end_line", 0)
2893
+ piece = f"--- {file_}:{s}-{e} (score={score:.1f}) ---\n{text}"
2894
+ if len(piece) > budget:
2895
+ piece = piece[:budget] + "..."
2896
+ chunks.append(piece)
2897
+ budget -= len(piece) + 4
2898
+ if budget <= 0:
2899
+ break
2900
+
2901
+ # SYNTHETIC TOOL CALL: instead of mutating the user message
2902
+ # (which iter6-9 proved is treated as scaffolding by Gemma 4 — it
2903
+ # ignores inline references and trusts its training prior), spawn
2904
+ # a fake assistant->tool message pair that LOOKS like the model
2905
+ # called retrieve() and got results. Models trust tool outputs
2906
+ # as authoritative input.
2907
+ #
2908
+ # Sequence:
2909
+ # user -> [our synthetic assistant with tool_call retrieve]
2910
+ # -> [our synthetic tool result with the chunks]
2911
+ # -> real LLM turn begins from there
2912
+ from drydock.core.types import ToolCall, FunctionCall as _FC
2913
+ import uuid
2914
+
2915
+ tool_call_id = f"auto-retrieve-{uuid.uuid4().hex[:16]}"
2916
+ tool_args = json.dumps({"query": (user_msg or "")[:200]})
2917
+ synth_assistant = LLMMessage(
2918
+ role=Role.assistant,
2919
+ content="",
2920
+ tool_calls=[
2921
+ ToolCall(
2922
+ id=tool_call_id,
2923
+ function=_FC(name="retrieve", arguments=tool_args),
2924
+ type="function",
2925
+ )
2926
+ ],
2927
+ )
2928
+ # Format chunks as the retrieve tool's actual output shape.
2929
+ formatted = "=== TEXT ===\n\n" + "\n\n".join(chunks)
2930
+ synth_tool = LLMMessage(
2931
+ role=Role.tool,
2932
+ content=formatted,
2933
+ name="retrieve",
2934
+ tool_call_id=tool_call_id,
2935
+ )
2936
+ self.messages.append(synth_assistant)
2937
+ self.messages.append(synth_tool)
2938
+
2939
+ logger.warning(
2940
+ "[AUTO-RETRIEVE] synthesized retrieve tool result: %d chunks "
2941
+ "(top score %.1f, content %d chars), msgs now %d",
2942
+ len(chunks),
2943
+ max(float(getattr(h, "score", 0)) for h in good_hits),
2944
+ len(formatted),
2945
+ len(self.messages),
2946
+ )
2947
+
2779
2948
  async def _auto_route_task(self, user_msg: str) -> None:
2780
2949
  """Lightweight auto-context: list project files and key docs.
2781
2950
 
@@ -52,7 +52,9 @@ def _initialize() -> _CachedSteering | None:
52
52
 
53
53
  try:
54
54
  from drydock.steering import (
55
+ LogitBiasSteeringApplier,
55
56
  LogOnlySteeringApplier,
57
+ NullSteeringApplier,
56
58
  SteeringConfig,
57
59
  load_registry,
58
60
  )
@@ -63,13 +65,23 @@ def _initialize() -> _CachedSteering | None:
63
65
  root = os.environ.get("DRYDOCK_STEERING_ROOT") or None
64
66
  registry = load_registry(root)
65
67
  config = SteeringConfig.from_mode_names(mode_names)
66
- # Default applier is log-only — a real applier (vLLM sidecar etc.)
67
- # is the next-phase deliverable. The seam is the same either way.
68
- applier = LogOnlySteeringApplier()
68
+ # Applier selection via DRYDOCK_STEERING_APPLIER:
69
+ # "log_only" (default) : log-only, no inference change
70
+ # "logit_bias" : token-level steering via vLLM logit_bias
71
+ # (manifest must carry tags.tokens_boost
72
+ # and/or tags.tokens_suppress)
73
+ # "null" : no-op (same as not setting MODES at all)
74
+ # Real activation steering (VllmSidecarSteeringApplier) lands later.
75
+ kind = os.environ.get("DRYDOCK_STEERING_APPLIER", "log_only").strip().lower()
76
+ if kind == "logit_bias":
77
+ applier = LogitBiasSteeringApplier()
78
+ elif kind == "null":
79
+ applier = NullSteeringApplier()
80
+ else:
81
+ applier = LogOnlySteeringApplier()
69
82
  logger.info(
70
- "steering: enabled, modes=%s, registry=%s",
71
- mode_names,
72
- registry.root,
83
+ "steering: enabled, modes=%s, applier=%s, registry=%s",
84
+ mode_names, applier.kind, registry.root,
73
85
  )
74
86
  return _CachedSteering(config=config, registry=registry, applier=applier)
75
87
 
@@ -550,6 +550,31 @@ class Bash(
550
550
 
551
551
  returncode = proc.returncode or 0
552
552
 
553
+ # Proactive heredoc-write confirmation. When `cat <<EOF > file`
554
+ # succeeds silently (empty stdout, rc=0), the model can't tell the
555
+ # file landed and re-runs the same heredoc. Check the file on disk
556
+ # and confirm immediately so the model moves on without a retry.
557
+ import re as _re_hd
558
+ import os as _os_hd
559
+ _hd_match = _re_hd.search(
560
+ r"cat\s+<<\s*['\"]?[A-Za-z_]*['\"]?\s+>+\s*(\S+)", args.command
561
+ )
562
+ if _hd_match and returncode == 0 and not stdout.strip():
563
+ _hd_path = _hd_match.group(1).strip().rstrip(";")
564
+ if _os_hd.path.exists(_hd_path):
565
+ _hd_size = _os_hd.path.getsize(_hd_path)
566
+ _hd_lines = 0
567
+ try:
568
+ with open(_hd_path, "r", errors="replace") as _hdf:
569
+ _hd_lines = sum(1 for _ in _hdf)
570
+ except Exception:
571
+ pass
572
+ stdout = (
573
+ f"[File written: {_hd_path} ({_hd_lines} lines, "
574
+ f"{_hd_size} bytes). "
575
+ f"The file is on disk — do not re-run this command.]"
576
+ )
577
+
553
578
  # Mechanical loop-breaker (ADVISORY ONLY — never raise
554
579
  # ToolError; see feedback_no_tool_errors_for_loop_detection.md).
555
580
  # Two complementary checks:
@@ -561,6 +586,10 @@ class Bash(
561
586
  state = self.state.__dict__.setdefault("_bash_history", {})
562
587
  # Track total error-exit calls per command (regardless of output).
563
588
  err_state = self.state.__dict__.setdefault("_bash_err_count", {})
589
+ # Track total run count per exact command regardless of output or
590
+ # exit code. Catches benchmark/timeit loops where output varies
591
+ # each run (timings differ) so the hash check never fires.
592
+ run_count_state = self.state.__dict__.setdefault("_bash_run_count", {})
564
593
  # Track consecutive empty-stdout search commands (any command, not
565
594
  # just identical ones). The model semantic-loops by trying different
566
595
  # search terms for a non-existent target:
@@ -570,6 +599,73 @@ class Bash(
570
599
  _consec_empty_search_state = self.state.__dict__.setdefault(
571
600
  "_consec_empty_searches", {"count": 0}
572
601
  )
602
+ # python -c / python3 -c SyntaxError loop-breaker.
603
+ # The model truncates multi-line inline scripts; each re-run
604
+ # produces a SyntaxError but with slightly different stderr
605
+ # (different column/line), so the hash check never fires.
606
+ # Track cross-command: any python3 -c that hits SyntaxError.
607
+ _python_c_err_state = self.state.__dict__.setdefault(
608
+ "_python_c_syntaxerr_count", 0
609
+ )
610
+ _is_python_c_syntaxerr = (
611
+ returncode != 0
612
+ and "SyntaxError" in stderr_raw
613
+ and bool(__import__("re").search(r"\bpython3?\s+-c\b", args.command))
614
+ )
615
+ if _is_python_c_syntaxerr:
616
+ self.state.__dict__["_python_c_syntaxerr_count"] = _python_c_err_state + 1
617
+ if _python_c_err_state >= 1:
618
+ _cnt = _python_c_err_state + 1
619
+ yield self._build_result(
620
+ command=args.command,
621
+ stdout=(
622
+ f"[LOOP-BREAKER: `python3 -c '...'` has hit SyntaxError "
623
+ f"{_cnt} times. Inline -c scripts get truncated by the "
624
+ f"shell when they contain newlines or quotes. "
625
+ f"Write the script to a file first, then run it:\n"
626
+ f" write_file path='/tmp/script.py' content='...'\n"
627
+ f" bash command='python3 /tmp/script.py'\n"
628
+ f"Do NOT retry the inline -c form again.]"
629
+ ),
630
+ stderr="",
631
+ returncode=returncode,
632
+ )
633
+ return
634
+
635
+ # Exact-command repetition loop-breaker: fires when the same
636
+ # command text is run 5+ times regardless of output or exit code.
637
+ # Catches benchmark/timeit/import-check loops where each run has
638
+ # varying output (timings, object ids) that defeats the hash check.
639
+ # Excludes commands that write files (heredoc, redirect, sed -i)
640
+ # since those legitimately run the same form multiple times.
641
+ _is_write_cmd = bool(
642
+ __import__("re").search(
643
+ r"(>|>>|\bsed\s+-i\b|\btee\b|\bcat\s+<<|\bprintf\b.*>)",
644
+ args.command,
645
+ )
646
+ )
647
+ if not _is_write_cmd:
648
+ _run_cnt = run_count_state.get(args.command, 0) + 1
649
+ run_count_state[args.command] = _run_cnt
650
+ if _run_cnt >= 5:
651
+ cmd_preview = args.command[:80]
652
+ yield self._build_result(
653
+ command=args.command,
654
+ stdout=(
655
+ f"[LOOP-BREAKER: `{cmd_preview}` has been run "
656
+ f"{_run_cnt} times this session with the same "
657
+ f"command text. The output is stable — re-running "
658
+ f"it will not produce new information. "
659
+ f"Stop repeating this command and move on to the "
660
+ f"next task step. If you are benchmarking, one "
661
+ f"run is enough. If you are checking an import, "
662
+ f"the result is already known.]\n{stdout}"
663
+ ),
664
+ stderr=stderr,
665
+ returncode=returncode,
666
+ )
667
+ return
668
+
573
669
  if returncode != 0:
574
670
  err_count = err_state.get(args.command, 0) + 1
575
671
  err_state[args.command] = err_count
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.7.37"
3
+ version = "2.7.39"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via vLLM"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"