drydock-cli 2.7.21__tar.gz → 2.7.23__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 (677) hide show
  1. drydock_cli-2.7.23/.auto_release.lock +1 -0
  2. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/PKG-INFO +1 -1
  3. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/detectors.py +14 -6
  4. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/agent_loop.py +10 -1
  5. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/format.py +16 -5
  6. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/pyproject.toml +1 -1
  7. drydock_cli-2.7.23/tests/core/test_circuit_breaker_count_escalation.py +93 -0
  8. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_admiral_struggle_dedup.py +31 -0
  9. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_hallucinated_tool_suppression.py +34 -0
  10. drydock_cli-2.7.23/tests/test_search_replace_args_not_truncated.py +181 -0
  11. drydock_cli-2.7.23/tests/test_truncated_search_replace_escalation.py +76 -0
  12. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/trip_log.md +118 -0
  13. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/uv.lock +1 -1
  14. drydock_cli-2.7.21/.auto_release.lock +0 -1
  15. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.claude/scheduled_tasks.lock +0 -0
  16. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/CODEOWNERS +0 -0
  17. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  18. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  19. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/workflows/build-and-upload.yml +0 -0
  21. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/workflows/ci.yml +0 -0
  22. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/workflows/issue-labeler.yml +0 -0
  23. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.github/workflows/release.yml +0 -0
  24. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.gitignore +0 -0
  25. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.pre-commit-config.yaml +0 -0
  26. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.python-version +0 -0
  27. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.typos.toml +0 -0
  28. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.vscode/extensions.json +0 -0
  29. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.vscode/launch.json +0 -0
  30. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/.vscode/settings.json +0 -0
  31. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/AGENTS.md +0 -0
  32. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/Admiral.md +0 -0
  33. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/BASELINE_412.md +0 -0
  34. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/CHANGELOG.md +0 -0
  35. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/CLAUDE.md +0 -0
  36. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/CONTRIBUTING.md +0 -0
  37. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/DEPLOYMENT.md +0 -0
  38. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/Drydock_rebrand.md +0 -0
  39. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/LICENSE +0 -0
  40. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/MODEL_SHORTCOMINGS.md +0 -0
  41. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/NOTICE +0 -0
  42. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/OVERNIGHT_PROGRESS.md +0 -0
  43. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  44. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/PRD.md +0 -0
  45. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/README.md +0 -0
  46. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/action.yml +0 -0
  47. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/README.md +0 -0
  48. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results1.tsv +0 -0
  49. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results13.tsv +0 -0
  50. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results14.tsv +0 -0
  51. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results15.tsv +0 -0
  52. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results16.tsv +0 -0
  53. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results17.tsv +0 -0
  54. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results18.tsv +0 -0
  55. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results19.tsv +0 -0
  56. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results2.tsv +0 -0
  57. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results20.tsv +0 -0
  58. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results3.tsv +0 -0
  59. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results4.tsv +0 -0
  60. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results5.tsv +0 -0
  61. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results6.tsv +0 -0
  62. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results7.tsv +0 -0
  63. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results8.tsv +0 -0
  64. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results9.tsv +0 -0
  65. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/baseline_history/results_evolved_v1.tsv +0 -0
  66. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/distribution/zed/LICENSE +0 -0
  67. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/distribution/zed/extension.toml +0 -0
  68. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/distribution/zed/icons/mistral_vibe.svg +0 -0
  69. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/docs/README.md +0 -0
  70. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/docs/acp-setup.md +0 -0
  71. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/docs/proxy-setup.md +0 -0
  72. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/__init__.py +0 -0
  73. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/__init__.py +0 -0
  74. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/acp_agent_loop.py +0 -0
  75. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/acp_logger.py +0 -0
  76. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/entrypoint.py +0 -0
  77. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/__init__.py +0 -0
  78. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/base.py +0 -0
  79. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/builtins/bash.py +0 -0
  80. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/builtins/read_file.py +0 -0
  81. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/builtins/search_replace.py +0 -0
  82. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/builtins/todo.py +0 -0
  83. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/builtins/write_file.py +0 -0
  84. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/tools/session_update.py +0 -0
  85. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/acp/utils.py +0 -0
  86. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/__init__.py +0 -0
  87. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/detectors_proposed.py +0 -0
  88. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/history.py +0 -0
  89. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/interventions.py +0 -0
  90. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/llm_analyzer.py +0 -0
  91. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/metrics.py +0 -0
  92. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/opus_escalator.py +0 -0
  93. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/persistence.py +0 -0
  94. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/policy.py +0 -0
  95. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/proposer.py +0 -0
  96. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/stager.py +0 -0
  97. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/task_classifier.py +0 -0
  98. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/tuning.py +0 -0
  99. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/validator.py +0 -0
  100. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/admiral/worker.py +0 -0
  101. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/__init__.py +0 -0
  102. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/autocompletion/__init__.py +0 -0
  103. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/autocompletion/base.py +0 -0
  104. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/autocompletion/path_completion.py +0 -0
  105. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/autocompletion/slash_command.py +0 -0
  106. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/cli.py +0 -0
  107. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/clipboard.py +0 -0
  108. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/commands.py +0 -0
  109. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/entrypoint.py +0 -0
  110. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/history_manager.py +0 -0
  111. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  112. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  113. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  114. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/terminal_setup.py +0 -0
  115. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/__init__.py +0 -0
  116. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  117. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/app.py +0 -0
  118. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/app.tcss +0 -0
  119. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/external_editor.py +0 -0
  120. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  121. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  122. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  123. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  124. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  125. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  126. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  127. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  128. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  129. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  130. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  131. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  132. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  133. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  134. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  135. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  136. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  137. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  138. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  139. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  140. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  141. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  142. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  143. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  144. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  145. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  146. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  147. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  148. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  149. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  150. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  151. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  152. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  153. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  154. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  155. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  156. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  157. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/windowing/history.py +0 -0
  158. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  159. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/textual_ui/windowing/state.py +0 -0
  160. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/__init__.py +0 -0
  161. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  162. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  163. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  164. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  165. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  166. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/update.py +0 -0
  167. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/cli/update_notifier/whats_new.py +0 -0
  168. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/__init__.py +0 -0
  169. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/agents/__init__.py +0 -0
  170. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/agents/manager.py +0 -0
  171. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/agents/models.py +0 -0
  172. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/auth/__init__.py +0 -0
  173. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/auth/crypto.py +0 -0
  174. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/auth/github.py +0 -0
  175. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/__init__.py +0 -0
  176. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/completers.py +0 -0
  177. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  178. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  179. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  180. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  181. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  182. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/fuzzy.py +0 -0
  183. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/path_prompt.py +0 -0
  184. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  185. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/build_orchestrator.py +0 -0
  186. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/checkpoint.py +0 -0
  187. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/config/__init__.py +0 -0
  188. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/config/_settings.py +0 -0
  189. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/config/doctor.py +0 -0
  190. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/config/harness_files/__init__.py +0 -0
  191. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  192. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/config/harness_files/_paths.py +0 -0
  193. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/consultant.py +0 -0
  194. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/drydock_states.py +0 -0
  195. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/hooks.py +0 -0
  196. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/__init__.py +0 -0
  197. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/backend/anthropic.py +0 -0
  198. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/backend/base.py +0 -0
  199. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/backend/factory.py +0 -0
  200. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/backend/generic.py +0 -0
  201. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/backend/mistral.py +0 -0
  202. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  203. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/backend/vertex.py +0 -0
  204. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/exceptions.py +0 -0
  205. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/message_utils.py +0 -0
  206. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/llm/types.py +0 -0
  207. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/logger.py +0 -0
  208. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/middleware.py +0 -0
  209. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/output_formatters.py +0 -0
  210. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/paths/__init__.py +0 -0
  211. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/paths/_drydock_home.py +0 -0
  212. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/paths/_local_config_walk.py +0 -0
  213. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/paths/conventions.py +0 -0
  214. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/plan_session.py +0 -0
  215. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/plugins.py +0 -0
  216. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/programmatic.py +0 -0
  217. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/__init__.py +0 -0
  218. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/builder.md +0 -0
  219. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/cli.md +0 -0
  220. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/compact.md +0 -0
  221. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/dangerous_directory.md +0 -0
  222. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/diagnostic.md +0 -0
  223. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/explore.md +0 -0
  224. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/gemma4.md +0 -0
  225. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/planner.md +0 -0
  226. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/project_context.md +0 -0
  227. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/prompts/tests.md +0 -0
  228. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/proxy_setup.py +0 -0
  229. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/session/agent_memory.py +0 -0
  230. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/session/checkpoints.py +0 -0
  231. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/session/session_loader.py +0 -0
  232. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/session/session_logger.py +0 -0
  233. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/session/session_migration.py +0 -0
  234. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/session/state_file.py +0 -0
  235. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/session_checker.py +0 -0
  236. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/skills/__init__.py +0 -0
  237. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/skills/manager.py +0 -0
  238. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/skills/models.py +0 -0
  239. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/skills/parser.py +0 -0
  240. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/slug.py +0 -0
  241. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/system_prompt.py +0 -0
  242. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/telemetry/__init__.py +0 -0
  243. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/telemetry/send.py +0 -0
  244. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/teleport/errors.py +0 -0
  245. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/teleport/git.py +0 -0
  246. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/teleport/nuage.py +0 -0
  247. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/teleport/teleport.py +0 -0
  248. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/teleport/types.py +0 -0
  249. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/base.py +0 -0
  250. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/_task_manager.py +0 -0
  251. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  252. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/bash.py +0 -0
  253. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/cron.py +0 -0
  254. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  255. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/glob_tool.py +0 -0
  256. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/grep.py +0 -0
  257. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  258. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/lsp.py +0 -0
  259. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  260. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  261. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/powershell.py +0 -0
  262. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  263. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  264. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  265. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  266. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  267. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  268. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  269. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  270. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  271. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  272. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  273. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  274. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  275. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  276. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/task.md +0 -0
  277. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  278. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  279. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  280. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  281. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  282. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  283. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  284. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/read_file.py +0 -0
  285. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/search_replace.py +0 -0
  286. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/task.py +0 -0
  287. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/todo.py +0 -0
  288. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/tool_search.py +0 -0
  289. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/webfetch.py +0 -0
  290. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/websearch.py +0 -0
  291. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/worktree.py +0 -0
  292. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/builtins/write_file.py +0 -0
  293. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/injection_guard.py +0 -0
  294. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/manager.py +0 -0
  295. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/mcp/__init__.py +0 -0
  296. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/mcp/registry.py +0 -0
  297. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/mcp/tools.py +0 -0
  298. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/mcp_sampling.py +0 -0
  299. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/ui.py +0 -0
  300. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/tools/utils.py +0 -0
  301. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/trusted_folders.py +0 -0
  302. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/types.py +0 -0
  303. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/core/utils.py +0 -0
  304. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/__init__.py +0 -0
  305. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/base.py +0 -0
  306. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/onboarding.tcss +0 -0
  307. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/screens/__init__.py +0 -0
  308. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/screens/api_key.py +0 -0
  309. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/screens/choice.py +0 -0
  310. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/screens/local_model.py +0 -0
  311. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/onboarding/screens/welcome.py +0 -0
  312. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  313. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  314. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/__init__.py +0 -0
  315. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/api-design/SKILL.md +0 -0
  316. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/audit-tests/SKILL.md +0 -0
  317. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/batch/SKILL.md +0 -0
  318. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/commit-code/SKILL.md +0 -0
  319. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/context-summary/SKILL.md +0 -0
  320. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/create-presentation/SKILL.md +0 -0
  321. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/deep-research/SKILL.md +0 -0
  322. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/deploy/SKILL.md +0 -0
  323. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/diff-review/SKILL.md +0 -0
  324. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/doc-gen/SKILL.md +0 -0
  325. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/explain-code/SKILL.md +0 -0
  326. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/explore-code/SKILL.md +0 -0
  327. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/fix-issue/SKILL.md +0 -0
  328. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/git-ops/SKILL.md +0 -0
  329. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/init-project/SKILL.md +0 -0
  330. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/investigate/SKILL.md +0 -0
  331. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/loop/SKILL.md +0 -0
  332. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/migrate/SKILL.md +0 -0
  333. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/perf-analyze/SKILL.md +0 -0
  334. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/plan-impl/SKILL.md +0 -0
  335. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/pr-review/SKILL.md +0 -0
  336. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/refactor/SKILL.md +0 -0
  337. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/regex-help/SKILL.md +0 -0
  338. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/review/SKILL.md +0 -0
  339. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/security-review/SKILL.md +0 -0
  340. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/ship/SKILL.md +0 -0
  341. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/simplify/SKILL.md +0 -0
  342. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/strong-tests/SKILL.md +0 -0
  343. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/skills/test-verify/SKILL.md +0 -0
  344. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock/whats_new.md +0 -0
  345. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock-acp.spec +0 -0
  346. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/drydock_terms.md +0 -0
  347. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/flake.lock +0 -0
  348. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/flake.nix +0 -0
  349. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/nohup.out +0 -0
  350. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/README.md +0 -0
  351. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/config_base.toml +0 -0
  352. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/config_best.toml +0 -0
  353. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/domain_spec.md +0 -0
  354. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/experimenter.py +0 -0
  355. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/kernel.py +0 -0
  356. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/mini_prd.md +0 -0
  357. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/mini_prompts.txt +0 -0
  358. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/proposer.py +0 -0
  359. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/research/results.tsv +0 -0
  360. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/resume.md +0 -0
  361. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/README.md +0 -0
  362. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/admiral_probe.py +0 -0
  363. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/audit_sampler.py +0 -0
  364. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/auto_generate_tests.py +0 -0
  365. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/auto_release.sh +0 -0
  366. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/auto_test_loop.sh +0 -0
  367. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/autonomous_review.sh +0 -0
  368. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/autonomous_review_prompt.md +0 -0
  369. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/backup.sh +0 -0
  370. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/bump_version.py +0 -0
  371. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/comprehensive_loop.py +0 -0
  372. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/deploy_to_github.sh +0 -0
  373. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/discover_cli_tools.sh +0 -0
  374. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/evolve_tests.py +0 -0
  375. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/gen_2000_prompts.py +0 -0
  376. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/install.sh +0 -0
  377. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/llm_balancer.py +0 -0
  378. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/mega_loop.py +0 -0
  379. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/meta_ralph_loop.py +0 -0
  380. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/monitor_swebench.sh +0 -0
  381. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/monitor_test_battery.sh +0 -0
  382. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/notify_release.py +0 -0
  383. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/oss_task_harness.py +0 -0
  384. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/overnight_agents_test.sh +0 -0
  385. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/poll_issues.sh +0 -0
  386. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/port_task.py +0 -0
  387. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/prepare_release.py +0 -0
  388. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/publish_to_pypi.sh +0 -0
  389. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/ralph_loop.py +0 -0
  390. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/research_babysitter.sh +0 -0
  391. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/session_loop_audit.py +0 -0
  392. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/shakedown.py +0 -0
  393. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/shakedown_interactive.py +0 -0
  394. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/shakedown_regression.sh +0 -0
  395. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/shakedown_suite.sh +0 -0
  396. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/shakedown_variance.sh +0 -0
  397. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_babysitter.sh +0 -0
  398. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_prompts_50.txt +0 -0
  399. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_prompts_realuser.txt +0 -0
  400. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_prompts_tool_agent.txt +0 -0
  401. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  402. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_shakedown.py +0 -0
  403. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_telegram_status.py +0 -0
  404. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/stress_watcher.py +0 -0
  405. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/telegram_bot.py +0 -0
  406. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/test_bank.sh +0 -0
  407. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/test_full.sh +0 -0
  408. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/test_smoke.sh +0 -0
  409. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/test_tui_path.py +0 -0
  410. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/tui_test.py +0 -0
  411. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/scripts/vllm_failover.sh +0 -0
  412. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/test/project/dummy +0 -0
  413. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/__init__.py +0 -0
  414. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/conftest.py +0 -0
  415. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_acp.py +0 -0
  416. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_agent_thought.py +0 -0
  417. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_bash.py +0 -0
  418. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_compact_session_updates.py +0 -0
  419. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_content.py +0 -0
  420. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_initialize.py +0 -0
  421. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_list_sessions.py +0 -0
  422. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_load_session.py +0 -0
  423. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_multi_session.py +0 -0
  424. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_new_session.py +0 -0
  425. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_proxy_setup_acp.py +0 -0
  426. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_read_file.py +0 -0
  427. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_search_replace.py +0 -0
  428. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_set_config_option.py +0 -0
  429. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_set_mode.py +0 -0
  430. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_set_model.py +0 -0
  431. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_tool_call_session_update.py +0 -0
  432. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_utils.py +0 -0
  433. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/acp/test_write_file.py +0 -0
  434. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_file_indexer.py +0 -0
  435. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_fuzzy.py +0 -0
  436. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  437. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  438. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_path_completion_controller.py +0 -0
  439. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  440. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_slash_command_controller.py +0 -0
  441. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  442. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/__init__.py +0 -0
  443. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/data/__init__.py +0 -0
  444. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/data/fireworks.py +0 -0
  445. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/data/mistral.py +0 -0
  446. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/test_anthropic_adapter.py +0 -0
  447. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/test_backend.py +0 -0
  448. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  449. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/test_reasoning_adapter.py +0 -0
  450. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  451. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  452. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  453. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  454. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_bell_notifications.py +0 -0
  455. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_braille_renderer.py +0 -0
  456. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_clipboard.py +0 -0
  457. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_commands.py +0 -0
  458. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_copy_shortcuts.py +0 -0
  459. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_external_editor.py +0 -0
  460. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_no_markup_static.py +0 -0
  461. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_question_app.py +0 -0
  462. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_spinner.py +0 -0
  463. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_switching_mode.py +0 -0
  464. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  465. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  466. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_ui_session_resume.py +0 -0
  467. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/test_ui_skill_dispatch.py +0 -0
  468. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/textual_ui/__init__.py +0 -0
  469. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/cli/textual_ui/test_session_picker.py +0 -0
  470. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/conftest.py +0 -0
  471. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_agents.py +0 -0
  472. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_auth_crypto.py +0 -0
  473. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_auth_github.py +0 -0
  474. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  475. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_config_load_dotenv.py +0 -0
  476. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_config_paths.py +0 -0
  477. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_config_resolution.py +0 -0
  478. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_file_logging.py +0 -0
  479. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_plan_session.py +0 -0
  480. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_proxy_setup.py +0 -0
  481. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_slug.py +0 -0
  482. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_telemetry_send.py +0 -0
  483. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_teleport_git.py +0 -0
  484. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_teleport_nuage.py +0 -0
  485. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_teleport_service.py +0 -0
  486. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_trusted_folders.py +0 -0
  487. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/core/test_utils.py +0 -0
  488. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/e2e/common.py +0 -0
  489. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/e2e/conftest.py +0 -0
  490. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/e2e/mock_server.py +0 -0
  491. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  492. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/e2e/test_cli_tui_streaming.py +0 -0
  493. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  494. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/fixtures/doc_qa_system_prd.md +0 -0
  495. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/mock/__init__.py +0 -0
  496. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/mock/mock_backend_factory.py +0 -0
  497. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/mock/mock_entrypoint.py +0 -0
  498. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/mock/utils.py +0 -0
  499. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/onboarding/test_run_onboarding.py +0 -0
  500. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/onboarding/test_ui_onboarding.py +0 -0
  501. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/session/test_session_loader.py +0 -0
  502. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/session/test_session_logger.py +0 -0
  503. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/session/test_session_migration.py +0 -0
  504. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/skills/conftest.py +0 -0
  505. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/skills/test_manager.py +0 -0
  506. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/skills/test_models.py +0 -0
  507. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/skills/test_parser.py +0 -0
  508. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  509. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  510. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  511. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  512. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  513. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  514. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  515. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  516. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  517. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  518. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  519. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  520. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  521. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  522. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  523. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  524. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  525. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  526. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  527. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  528. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  529. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  530. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  531. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  532. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  533. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  534. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  535. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  536. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  537. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  538. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  539. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  540. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  541. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  542. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  543. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  544. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  545. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  546. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  547. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  548. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  549. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  550. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  551. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  552. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  553. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  554. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  555. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  556. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  557. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  558. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  559. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  560. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  561. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  562. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  563. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  564. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  565. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  566. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  567. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  568. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/base_snapshot_test_app.py +0 -0
  569. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/conftest.py +0 -0
  570. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/snap_compare.py +0 -0
  571. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  572. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  573. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  574. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  575. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  576. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  577. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  578. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  579. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  580. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  581. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  582. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  583. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  584. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  585. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/stubs/fake_backend.py +0 -0
  586. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/stubs/fake_client.py +0 -0
  587. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/stubs/fake_tool.py +0 -0
  588. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_admiral.py +0 -0
  589. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_admiral_phase3.py +0 -0
  590. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_admiral_proposed.py +0 -0
  591. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_agent_auto_compact.py +0 -0
  592. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_agent_backend.py +0 -0
  593. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_agent_observer_streaming.py +0 -0
  594. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_agent_stats.py +0 -0
  595. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_agent_tasks.py +0 -0
  596. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_agent_tool_call.py +0 -0
  597. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_agents.py +0 -0
  598. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_bank_build.py +0 -0
  599. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_bank_debug.py +0 -0
  600. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_bank_multiagent.py +0 -0
  601. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_bank_prd.py +0 -0
  602. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_bank_prd_extended.py +0 -0
  603. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_bank_tools.py +0 -0
  604. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_bank_update.py +0 -0
  605. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_build_projects.py +0 -0
  606. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_checkpoint.py +0 -0
  607. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_cli_programmatic_preload.py +0 -0
  608. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_current_bugs.py +0 -0
  609. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_drydock_regression.py +0 -0
  610. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_drydock_tasks.py +0 -0
  611. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  612. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_full_regression.py +0 -0
  613. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_history_manager.py +0 -0
  614. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_integration.py +0 -0
  615. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_issue_fixes.py +0 -0
  616. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_loop_detection.py +0 -0
  617. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_message_id.py +0 -0
  618. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_message_merging.py +0 -0
  619. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_middleware.py +0 -0
  620. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_multi_agent.py +0 -0
  621. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_read_file_not_found_listing.py +0 -0
  622. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_real_failures.py +0 -0
  623. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_real_issues.py +0 -0
  624. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_real_workflow.py +0 -0
  625. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_reasoning_content.py +0 -0
  626. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_smoke.py +0 -0
  627. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_system_prompt.py +0 -0
  628. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_tagged_text.py +0 -0
  629. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_tool_args.py +0 -0
  630. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_truncate_args_valid_json.py +0 -0
  631. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_truncated_arg_path_hint.py +0 -0
  632. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_truncated_write_escalation.py +0 -0
  633. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_ui_external_editor.py +0 -0
  634. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_ui_input_history.py +0 -0
  635. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_user_issues.py +0 -0
  636. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_wall_of_text_rescue.py +0 -0
  637. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_workloads.py +0 -0
  638. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/test_write_file_missing_path.py +0 -0
  639. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/testbank_helpers.py +0 -0
  640. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_ask_user_question.py +0 -0
  641. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_bash.py +0 -0
  642. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_exit_plan_mode.py +0 -0
  643. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_grep.py +0 -0
  644. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_invoke_context.py +0 -0
  645. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  646. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_manager_get_tool_config.py +0 -0
  647. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_mcp.py +0 -0
  648. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_mcp_sampling.py +0 -0
  649. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  650. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_read_file_directory.py +0 -0
  651. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_read_file_limit_truncation.py +0 -0
  652. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_search_replace_append_fallback.py +0 -0
  653. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_search_replace_dir_path.py +0 -0
  654. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_search_replace_empty_content.py +0 -0
  655. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_search_replace_hard_stop.py +0 -0
  656. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  657. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  658. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_task.py +0 -0
  659. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_ui_bash_execution.py +0 -0
  660. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_webfetch.py +0 -0
  661. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_websearch.py +0 -0
  662. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  663. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  664. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  665. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  666. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/test_do_update.py +0 -0
  667. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  668. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/test_github_update_gateway.py +0 -0
  669. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  670. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/test_ui_update_notification.py +0 -0
  671. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/test_update_use_case.py +0 -0
  672. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/tests/update_notifier/test_whats_new.py +0 -0
  673. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/worked_examples/README.md +0 -0
  674. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/worked_examples/cli_subcommand_dispatch.py +0 -0
  675. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/worked_examples/lookup.json +0 -0
  676. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/worked_examples/sql_parser.py +0 -0
  677. {drydock_cli-2.7.21 → drydock_cli-2.7.23}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 542815
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.21
3
+ Version: 2.7.23
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
@@ -85,12 +85,20 @@ def detect_struggle(messages: Sequence[LLMMessage], threshold: int = 20) -> Find
85
85
  # in a single session (each with a unique key that bypassed dedup).
86
86
  code = f"struggle:{last_write_tool or 'none'}"
87
87
  if calls_since_write >= 30:
88
- directive = (
89
- f"Admiral: you have made {calls_since_write} tool calls without "
90
- f"writing any file search_replace is clearly not finding the text. "
91
- f"STOP retrying. Call `write_file` with `overwrite=True` to rewrite "
92
- f"the target file from scratch right now."
93
- )
88
+ if last_write_tool is None:
89
+ directive = (
90
+ f"Admiral: you have made {calls_since_write} tool calls without "
91
+ f"writing a single file. You have enough context. STOP exploring "
92
+ f"and start writing code NOW. Call `write_file` to create your "
93
+ f"first file immediately."
94
+ )
95
+ else:
96
+ directive = (
97
+ f"Admiral: you have made {calls_since_write} tool calls without "
98
+ f"writing any file — search_replace is clearly not finding the text. "
99
+ f"STOP retrying. Call `write_file` with `overwrite=True` to rewrite "
100
+ f"the target file from scratch right now."
101
+ )
94
102
  else:
95
103
  hint = (
96
104
  "Either (a) you already have enough context — commit to a plan and "
@@ -1032,7 +1032,7 @@ class AgentLoop:
1032
1032
  parsed = self.format_handler.parse_message(last_message)
1033
1033
  resolved = self.format_handler.resolve_tool_calls(parsed, self.tool_manager)
1034
1034
 
1035
- if not resolved.tool_calls and not resolved.failed_calls:
1035
+ if not resolved.tool_calls and not resolved.failed_calls and not resolved.suppressed_failures:
1036
1036
  return
1037
1037
 
1038
1038
  async for event in self._handle_tool_calls(resolved):
@@ -1148,6 +1148,10 @@ class AgentLoop:
1148
1148
  threshold = 5 if is_readonly else 8
1149
1149
  if count < threshold:
1150
1150
  return None
1151
+ # Increment so the count escalates on every repeated fire, giving the
1152
+ # model a growing signal that nothing has changed. Preserve last_result
1153
+ # so the message always shows the real bash/tool output, not a prior NOTE.
1154
+ self._tool_call_history[sig] = (count + 1, last_result)
1151
1155
  return (
1152
1156
  f"NOTE: this exact call to `{tool_name}` has been made "
1153
1157
  f"{count} times this session with identical arguments. "
@@ -1777,6 +1781,11 @@ class AgentLoop:
1777
1781
  for tc in msg.tool_calls:
1778
1782
  if not tc.function or not tc.function.arguments:
1779
1783
  continue
1784
+ # search_replace args contain SEARCH/REPLACE blocks the model
1785
+ # NEEDS to see in history (to know what edits it already applied).
1786
+ # Only write_file carries full file content worth truncating.
1787
+ if tc.function.name == "search_replace":
1788
+ continue
1780
1789
  args = tc.function.arguments
1781
1790
  if len(args) <= SOFT_CAP_BYTES:
1782
1791
  continue
@@ -447,14 +447,25 @@ class APIToolFormatHandler:
447
447
  dir_listing = "\n".join(f" {f}" for f in py_files)
448
448
  except Exception:
449
449
  dir_listing = " (could not list files)"
450
+ tool_name_hint = parsed_call.tool_name
451
+ if tool_name_hint == "search_replace":
452
+ recovery_hint = (
453
+ f"Use read_file on '{path_hint}' to see its current content, "
454
+ f"then call search_replace with fresh <<<<<<< SEARCH / ======= / "
455
+ f">>>>>>> REPLACE markers copied from the actual file text."
456
+ )
457
+ else:
458
+ recovery_hint = (
459
+ f"Use read_file on the target file, then call write_file "
460
+ f"with fully typed content, OR use search_replace to make "
461
+ f"targeted edits without rewriting the whole file."
462
+ )
450
463
  escalation_suffix = (
451
- f"\n\n[REPEATED FAILURE #{hit_count}: your write_file call "
464
+ f"\n\n[REPEATED FAILURE #{hit_count}: your {tool_name_hint} call "
452
465
  f"keeps using a stale truncated template for '{path_hint}'. "
453
- f"You MUST type fresh content — do NOT copy from history. "
466
+ f"You MUST NOT copy args from history. "
454
467
  f"Current .py files in project:\n{dir_listing}\n"
455
- f"Use read_file on the target file, then call write_file "
456
- f"with fully typed content, OR use search_replace to make "
457
- f"targeted edits without rewriting the whole file.]"
468
+ f"{recovery_hint}]"
458
469
  )
459
470
  else:
460
471
  escalation_suffix = ""
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.7.21"
3
+ version = "2.7.23"
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"
@@ -0,0 +1,93 @@
1
+ """Regression test: circuit breaker count escalates on repeated fires.
2
+
3
+ Bug: _circuit_breaker_check returned the NOTE but never incremented the count
4
+ in _tool_call_history when it fired. Every retry got the same "8 times" message,
5
+ so the escalation signal was flat and the model never broke out.
6
+
7
+ Fix: _circuit_breaker_check now increments the count on each fire, giving the
8
+ model an increasing signal that nothing has changed.
9
+ """
10
+ import unittest
11
+ from unittest.mock import MagicMock
12
+
13
+
14
+ def _make_loop():
15
+ from drydock.core.agent_loop import AgentLoop
16
+ loop = AgentLoop.__new__(AgentLoop)
17
+ loop._tool_call_history = {}
18
+ loop._get_attempted_summary = lambda: ""
19
+ return loop
20
+
21
+
22
+ def _make_tc(name, args):
23
+ tc = MagicMock()
24
+ tc.tool_name = name
25
+ tc.args_dict = args
26
+ tc.call_id = "test-id"
27
+ return tc
28
+
29
+
30
+ def _record(loop, tc, result="output"):
31
+ from drydock.core.agent_loop import AgentLoop
32
+ AgentLoop._circuit_breaker_record(loop, tc, result)
33
+
34
+
35
+ class TestCircuitBreakerCountEscalation(unittest.TestCase):
36
+ def test_count_escalates_on_repeated_fires(self):
37
+ """After the threshold, each fire increments the count so the message escalates."""
38
+ loop = _make_loop()
39
+ tc = _make_tc("bash", {"command": "python3 -m tool_agent run foo"})
40
+
41
+ # Reach threshold (8 recorded calls)
42
+ for _ in range(8):
43
+ _record(loop, tc, "some output")
44
+
45
+ # First fire: should mention 8
46
+ msg1 = loop._circuit_breaker_check(tc)
47
+ self.assertIsNotNone(msg1)
48
+ self.assertIn("8 times", msg1)
49
+
50
+ # Second fire (without any external record call): should mention 9
51
+ msg2 = loop._circuit_breaker_check(tc)
52
+ self.assertIsNotNone(msg2)
53
+ self.assertIn("9 times", msg2)
54
+
55
+ # Third fire: should mention 10
56
+ msg3 = loop._circuit_breaker_check(tc)
57
+ self.assertIsNotNone(msg3)
58
+ self.assertIn("10 times", msg3)
59
+
60
+ def test_last_result_preserved_across_fires(self):
61
+ """last_result shown in NOTE stays as the real tool output, not a prior NOTE."""
62
+ loop = _make_loop()
63
+ tc = _make_tc("bash", {"command": "echo hello"})
64
+
65
+ for _ in range(8):
66
+ _record(loop, tc, "hello\n")
67
+
68
+ msg1 = loop._circuit_breaker_check(tc)
69
+ self.assertIn("hello", msg1)
70
+
71
+ # After a second fire, last_result should still be the original output
72
+ msg2 = loop._circuit_breaker_check(tc)
73
+ self.assertIn("hello", msg2)
74
+ # Not the prior NOTE text
75
+ self.assertNotIn("NOTE: this exact call", msg2.split("Last result:")[1])
76
+
77
+ def test_count_below_threshold_unaffected(self):
78
+ """Calls below threshold still return None and don't mutate state unexpectedly."""
79
+ loop = _make_loop()
80
+ tc = _make_tc("bash", {"command": "ls"})
81
+
82
+ for i in range(7):
83
+ result = loop._circuit_breaker_check(tc)
84
+ self.assertIsNone(result, f"Should not fire on call {i+1} (count={i})")
85
+ _record(loop, tc)
86
+
87
+ # 8th call is still below threshold (count=7 < 8)
88
+ result = loop._circuit_breaker_check(tc)
89
+ self.assertIsNone(result)
90
+
91
+
92
+ if __name__ == "__main__":
93
+ unittest.main()
@@ -66,3 +66,34 @@ def test_struggle_gentle_directive_below_30() -> None:
66
66
  def test_struggle_no_fire_below_threshold() -> None:
67
67
  msgs = _make_msgs("write_file", 5)
68
68
  assert detect_struggle(msgs) is None
69
+
70
+
71
+ def _make_msgs_no_write(non_write_count: int) -> list[LLMMessage]:
72
+ """Messages where the model never called any write tool."""
73
+ msgs: list[LLMMessage] = [LLMMessage(role=Role.user, content="build it")]
74
+ for i in range(non_write_count):
75
+ msgs.append(_assistant("read_file", f'{{"path":"f{i}.py"}}'))
76
+ msgs.append(LLMMessage(role=Role.tool, content="content"))
77
+ return msgs
78
+
79
+
80
+ def test_struggle_none_escalated_says_start_writing() -> None:
81
+ """When model never wrote a file and hits 30+ calls, directive must not
82
+ mention search_replace (model never used it) and must urge writing."""
83
+ msgs = _make_msgs_no_write(30)
84
+ f = detect_struggle(msgs)
85
+ assert f is not None
86
+ assert f.code == "struggle:none"
87
+ assert "search_replace" not in f.directive
88
+ assert "write_file" in f.directive
89
+ assert "exploring" in f.directive or "STOP" in f.directive
90
+
91
+
92
+ def test_struggle_with_prior_write_escalated_mentions_search_replace() -> None:
93
+ """When model previously wrote and is now stuck retrying, the search_replace
94
+ message is appropriate."""
95
+ msgs = _make_msgs("search_replace", 30)
96
+ f = detect_struggle(msgs)
97
+ assert f is not None
98
+ assert "search_replace" in f.directive
99
+ assert "overwrite" in f.directive
@@ -85,3 +85,37 @@ def test_unknown_non_hallucinated_tool_goes_to_failed_calls():
85
85
  resolved = handler.resolve_tool_calls(parsed, tm)
86
86
  assert any(fc.tool_name == "nonexistent_random_tool" for fc in resolved.failed_calls)
87
87
  assert not resolved.suppressed_failures
88
+
89
+
90
+ def test_suppressed_failures_not_bypassed_by_early_return():
91
+ """Regression for agent_loop early-return bug: when only suppressed_failures
92
+ exist (no real tool_calls, no failed_calls), the condition
93
+ `not tool_calls and not failed_calls` was True and _handle_tool_calls was
94
+ skipped, so _silence_suppressed_failures was never called. The tool result
95
+ message for the hallucinated tool was never added, leaving the conversation
96
+ malformed (assistant tool_call with no paired tool result).
97
+
98
+ Fix: early-return also checks `not suppressed_failures`.
99
+ This test verifies that a ResolvedMessage with only suppressed_failures
100
+ is NOT considered empty by the fixed condition.
101
+ """
102
+ handler = _make_handler()
103
+ tm = _make_tool_manager(["read_file"])
104
+ parsed = _parsed("ralph_repo_index")
105
+ resolved = handler.resolve_tool_calls(parsed, tm)
106
+
107
+ # Preconditions: only suppressed_failures, nothing else
108
+ assert not resolved.tool_calls
109
+ assert not resolved.failed_calls
110
+ assert resolved.suppressed_failures
111
+
112
+ # The fixed early-return condition must NOT consider this "no work to do"
113
+ should_skip_early = (
114
+ not resolved.tool_calls
115
+ and not resolved.failed_calls
116
+ and not resolved.suppressed_failures # fixed: was missing this
117
+ )
118
+ assert not should_skip_early, (
119
+ "Bug regression: suppressed_failures were ignored by early-return, "
120
+ "leaving assistant tool_call with no paired tool result in history."
121
+ )
@@ -0,0 +1,181 @@
1
+ """Regression test: search_replace call args must NOT be truncated.
2
+
3
+ Repro: _truncate_old_tool_results truncated ALL large tool-call arguments,
4
+ including search_replace SEARCH/REPLACE blocks (~400-800 bytes). The model
5
+ then saw {_truncated: true, file_path: "..."} in its own history and copied
6
+ those truncated args as new call arguments. format.py detected this and
7
+ returned a FailedToolCall, but the model retried with the same truncated
8
+ args again and again, creating a retry_after_error:search_replace loop.
9
+
10
+ Fix (2026-04-29): skip the arg-truncation loop for search_replace tool
11
+ calls. Only write_file carries full file content worth truncating.
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import json
16
+
17
+ import pytest
18
+
19
+ from drydock.core.types import (
20
+ FunctionCall,
21
+ LLMMessage,
22
+ Role,
23
+ ToolCall,
24
+ )
25
+ from tests.conftest import build_test_agent_loop
26
+
27
+
28
+ def _make_tc(name: str, arguments: str, idx: int = 0) -> ToolCall:
29
+ return ToolCall(
30
+ id=f"tc_{idx}",
31
+ index=idx,
32
+ function=FunctionCall(name=name, arguments=arguments),
33
+ )
34
+
35
+
36
+ def _build_history_with_search_replace(num_old: int) -> list[LLMMessage]:
37
+ """Build a conversation with `num_old` old search_replace messages
38
+ plus enough newer messages to exceed KEEP_RECENT."""
39
+ msgs: list[LLMMessage] = [
40
+ LLMMessage(role=Role.system, content="be helpful"),
41
+ LLMMessage(role=Role.user, content="please help"),
42
+ ]
43
+ # search_replace calls with realistic 600+ byte args (exceeds SOFT_CAP=500)
44
+ search_block = " def run_tool(self, tool_name: str, args: dict) -> str:\n"
45
+ search_block += " # This is the old implementation that needs to be replaced\n"
46
+ search_block += " return ''\n"
47
+ replace_block = " def run_tool(self, tool_name: str, args: dict) -> str:\n"
48
+ replace_block += " plugin = self._load_plugin(tool_name)\n"
49
+ replace_block += " if plugin is None:\n"
50
+ replace_block += " raise ValueError(f'Unknown tool: {tool_name}')\n"
51
+ replace_block += " return plugin.execute(args)\n"
52
+ sr_args = json.dumps({
53
+ "file_path": "/data3/drydock_test_projects/403_tool_agent/tool_agent/cli.py",
54
+ "content": (
55
+ f"<<<<<<< SEARCH\n{search_block}=======\n{replace_block}>>>>>>> REPLACE"
56
+ ),
57
+ })
58
+ assert len(sr_args) > 500, f"Test args must exceed SOFT_CAP_BYTES=500 to be meaningful, got {len(sr_args)}"
59
+
60
+ for i in range(num_old):
61
+ msgs.append(
62
+ LLMMessage(
63
+ role=Role.assistant,
64
+ content="",
65
+ tool_calls=[_make_tc("search_replace", sr_args, i)],
66
+ )
67
+ )
68
+ msgs.append(
69
+ LLMMessage(
70
+ role=Role.tool,
71
+ tool_call_id=f"tc_{i}",
72
+ name="search_replace",
73
+ content="Applied edit.",
74
+ )
75
+ )
76
+
77
+ # Add newer messages to exceed KEEP_RECENT (4) so truncation would trigger
78
+ # for write_file but should be skipped for search_replace.
79
+ for i in range(6):
80
+ msgs.append(
81
+ LLMMessage(
82
+ role=Role.assistant,
83
+ content="",
84
+ tool_calls=[_make_tc("read_file", '{"path":"/x"}', 100 + i)],
85
+ )
86
+ )
87
+ msgs.append(
88
+ LLMMessage(
89
+ role=Role.tool,
90
+ tool_call_id=f"tc_{100+i}",
91
+ name="read_file",
92
+ content="ok",
93
+ )
94
+ )
95
+ return msgs
96
+
97
+
98
+ class TestSearchReplaceArgsNotTruncated:
99
+ def test_search_replace_args_preserved_after_truncation(self):
100
+ """search_replace call args must not be replaced with {_truncated: true} stub."""
101
+ loop = build_test_agent_loop()
102
+ loop.messages.reset(_build_history_with_search_replace(num_old=10))
103
+
104
+ loop._truncate_old_tool_results()
105
+
106
+ for m in loop.messages:
107
+ if m.role != Role.assistant or not m.tool_calls:
108
+ continue
109
+ for tc in m.tool_calls:
110
+ if tc.function.name != "search_replace":
111
+ continue
112
+ args = tc.function.arguments or ""
113
+ parsed = json.loads(args)
114
+ assert not parsed.get("_truncated"), (
115
+ f"search_replace args were truncated — model will copy the stub "
116
+ f"and loop: {args[:120]}"
117
+ )
118
+ assert "content" in parsed, (
119
+ "search_replace args lost the 'content' field after truncation"
120
+ )
121
+
122
+ def test_write_file_still_truncated(self):
123
+ """write_file args should still be truncated (they carry full file content)."""
124
+ msgs: list[LLMMessage] = [
125
+ LLMMessage(role=Role.system, content="be helpful"),
126
+ LLMMessage(role=Role.user, content="please help"),
127
+ ]
128
+ big_args = json.dumps({
129
+ "file_path": "/data3/test/foo.py",
130
+ "content": "x" * 5000,
131
+ })
132
+ for i in range(10):
133
+ msgs.append(
134
+ LLMMessage(
135
+ role=Role.assistant,
136
+ content="",
137
+ tool_calls=[_make_tc("write_file", big_args, i)],
138
+ )
139
+ )
140
+ msgs.append(
141
+ LLMMessage(
142
+ role=Role.tool,
143
+ tool_call_id=f"tc_{i}",
144
+ name="write_file",
145
+ content=f"Wrote {i}",
146
+ )
147
+ )
148
+ for i in range(6):
149
+ msgs.append(
150
+ LLMMessage(
151
+ role=Role.assistant,
152
+ content="",
153
+ tool_calls=[_make_tc("read_file", '{"path":"/x"}', 100 + i)],
154
+ )
155
+ )
156
+ msgs.append(
157
+ LLMMessage(
158
+ role=Role.tool,
159
+ tool_call_id=f"tc_{100+i}",
160
+ name="read_file",
161
+ content="ok",
162
+ )
163
+ )
164
+
165
+ loop = build_test_agent_loop()
166
+ loop.messages.reset(msgs)
167
+ loop._truncate_old_tool_results()
168
+
169
+ truncated_count = 0
170
+ for m in loop.messages:
171
+ if m.role != Role.assistant or not m.tool_calls:
172
+ continue
173
+ for tc in m.tool_calls:
174
+ if tc.function.name != "write_file":
175
+ continue
176
+ args = tc.function.arguments or ""
177
+ parsed = json.loads(args)
178
+ if parsed.get("_truncated"):
179
+ truncated_count += 1
180
+
181
+ assert truncated_count > 0, "write_file args should still be truncated"
@@ -0,0 +1,76 @@
1
+ """Regression test: truncated search_replace escalation uses correct tool name.
2
+
3
+ When Gemma 4 calls search_replace with _truncated args, the escalation message
4
+ must say "search_replace call" and give SEARCH/REPLACE recovery guidance —
5
+ not "write_file call" and "call write_file with typed content".
6
+
7
+ The wrong tool name in the escalation confused the model into switching to
8
+ write_file (full overwrite) instead of reading the file and forming fresh
9
+ SEARCH/REPLACE blocks. Observed via admiral retry_after_error:search_replace
10
+ loops in stress run 2026-04-29.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ from unittest.mock import MagicMock
15
+
16
+ from drydock.core.llm.format import APIToolFormatHandler, ParsedMessage, ParsedToolCall
17
+ from drydock.core.tools.builtins.search_replace import SearchReplace
18
+
19
+
20
+ def _make_tm():
21
+ tm = MagicMock()
22
+ tm.available_tools = {"search_replace": SearchReplace}
23
+ return tm
24
+
25
+
26
+ def _truncated_sr_call(path: str, call_id: str = "tc1") -> ParsedMessage:
27
+ return ParsedMessage(
28
+ tool_calls=[
29
+ ParsedToolCall(
30
+ tool_name="search_replace",
31
+ call_id=call_id,
32
+ raw_args={
33
+ "_truncated": True,
34
+ "_original_bytes": 1230,
35
+ "file_path": path,
36
+ },
37
+ )
38
+ ]
39
+ )
40
+
41
+
42
+ class TestTruncatedSearchReplaceEscalation:
43
+ def test_first_hit_mentions_search_replace(self, tmp_path):
44
+ """First truncated-arg failure for search_replace mentions the right tool."""
45
+ target = tmp_path / "cli.py"
46
+ target.write_text("def run(): pass\n")
47
+ handler = APIToolFormatHandler()
48
+ result = handler.resolve_tool_calls(_truncated_sr_call(str(target)), _make_tm())
49
+ err = result.failed_calls[0].error
50
+ assert "truncated" in err.lower()
51
+ assert "REPEATED FAILURE" not in err
52
+
53
+ def test_second_hit_escalates_with_correct_tool_name(self, tmp_path):
54
+ """Escalation message says 'search_replace call', not 'write_file call'."""
55
+ target = tmp_path / "utils.py"
56
+ target.write_text("x = 1\n")
57
+ handler = APIToolFormatHandler()
58
+ handler.resolve_tool_calls(_truncated_sr_call(str(target), "tc1"), _make_tm())
59
+ result = handler.resolve_tool_calls(_truncated_sr_call(str(target), "tc2"), _make_tm())
60
+ err = result.failed_calls[0].error
61
+ assert "REPEATED FAILURE #2" in err
62
+ assert "search_replace call" in err
63
+ assert "write_file call" not in err
64
+
65
+ def test_second_hit_escalation_gives_search_replace_recovery(self, tmp_path):
66
+ """Escalation for search_replace suggests SEARCH/REPLACE markers, not write_file."""
67
+ target = tmp_path / "agent.py"
68
+ target.write_text("def run(): pass\n")
69
+ handler = APIToolFormatHandler()
70
+ handler.resolve_tool_calls(_truncated_sr_call(str(target), "tc1"), _make_tm())
71
+ result = handler.resolve_tool_calls(_truncated_sr_call(str(target), "tc2"), _make_tm())
72
+ err = result.failed_calls[0].error
73
+ assert "SEARCH" in err
74
+ assert "REPLACE" in err
75
+ # Must NOT redirect to write_file as the primary recovery path
76
+ assert "then call write_file" not in err