drydock-cli 2.8.43__tar.gz → 2.8.45__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (820) hide show
  1. drydock_cli-2.8.45/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/CLAUDE.md +9 -0
  3. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/PKG-INFO +1 -1
  4. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/commands.py +11 -0
  5. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/app.py +35 -0
  6. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agent_loop.py +118 -1
  7. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/pyproject.toml +1 -1
  8. drydock_cli-2.8.45/tests/test_api_error_recovery.py +195 -0
  9. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/trip_log.md +48 -0
  10. drydock_cli-2.8.43/.auto_release.lock +0 -1
  11. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/CODEOWNERS +0 -0
  12. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  13. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  14. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/build-and-upload.yml +0 -0
  16. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/ci.yml +0 -0
  17. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/issue-labeler.yml +0 -0
  18. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.github/workflows/release.yml +0 -0
  19. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.gitignore +0 -0
  20. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.pause_stress +0 -0
  21. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.pre-commit-config.yaml +0 -0
  22. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.python-version +0 -0
  23. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.typos.toml +0 -0
  24. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.vscode/extensions.json +0 -0
  25. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.vscode/launch.json +0 -0
  26. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/.vscode/settings.json +0 -0
  27. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/AGENTS.md +0 -0
  28. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/Admiral.md +0 -0
  29. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/CHANGELOG.md +0 -0
  30. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/CONTRIBUTING.md +0 -0
  31. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/DEEP_NOIR_PRD.md +0 -0
  32. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/DEPLOYMENT.md +0 -0
  33. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/DRYDOCK.md +0 -0
  34. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/HLE_PRD.md +0 -0
  35. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/JETSON_BENCH.md +0 -0
  36. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/LICENSE +0 -0
  37. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/MODEL_SHORTCOMINGS.md +0 -0
  38. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/NOTICE +0 -0
  39. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/README.md +0 -0
  40. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/SOVEREIGN_PRD.md +0 -0
  41. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/TRIAGE_v1.md +0 -0
  42. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/action.yml +0 -0
  43. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/README.md +0 -0
  44. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results1.tsv +0 -0
  45. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results13.tsv +0 -0
  46. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results14.tsv +0 -0
  47. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results15.tsv +0 -0
  48. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results16.tsv +0 -0
  49. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results17.tsv +0 -0
  50. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results18.tsv +0 -0
  51. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results19.tsv +0 -0
  52. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results2.tsv +0 -0
  53. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results20.tsv +0 -0
  54. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results3.tsv +0 -0
  55. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results4.tsv +0 -0
  56. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results5.tsv +0 -0
  57. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results6.tsv +0 -0
  58. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results7.tsv +0 -0
  59. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results8.tsv +0 -0
  60. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results9.tsv +0 -0
  61. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/baseline_history/results_evolved_v1.tsv +0 -0
  62. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/distribution/zed/LICENSE +0 -0
  63. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/distribution/zed/extension.toml +0 -0
  64. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/distribution/zed/icons/mistral_vibe.svg +0 -0
  65. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/README.md +0 -0
  66. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/acp-setup.md +0 -0
  67. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/BASELINE_412.md +0 -0
  68. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/Drydock_rebrand.md +0 -0
  69. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  70. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  71. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  72. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/PRD.md +0 -0
  73. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/drydock_terms.md +0 -0
  74. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/archive/resume.md +0 -0
  75. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/docs/proxy-setup.md +0 -0
  76. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/__init__.py +0 -0
  77. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/__main__.py +0 -0
  78. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/__init__.py +0 -0
  79. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/acp_agent_loop.py +0 -0
  80. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/acp_logger.py +0 -0
  81. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/entrypoint.py +0 -0
  82. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/__init__.py +0 -0
  83. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/base.py +0 -0
  84. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/bash.py +0 -0
  85. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/read_file.py +0 -0
  86. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/search_replace.py +0 -0
  87. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/todo.py +0 -0
  88. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/builtins/write_file.py +0 -0
  89. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/tools/session_update.py +0 -0
  90. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/acp/utils.py +0 -0
  91. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/__init__.py +0 -0
  92. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/detectors.py +0 -0
  93. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/detectors_proposed.py +0 -0
  94. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/history.py +0 -0
  95. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/interventions.py +0 -0
  96. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/llm_analyzer.py +0 -0
  97. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/metrics.py +0 -0
  98. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/opus_escalator.py +0 -0
  99. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/persistence.py +0 -0
  100. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/policy.py +0 -0
  101. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/proposer.py +0 -0
  102. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/stager.py +0 -0
  103. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/task_classifier.py +0 -0
  104. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/tuning.py +0 -0
  105. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/validator.py +0 -0
  106. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/admiral/worker.py +0 -0
  107. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/__init__.py +0 -0
  108. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/__init__.py +0 -0
  109. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/base.py +0 -0
  110. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/path_completion.py +0 -0
  111. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/autocompletion/slash_command.py +0 -0
  112. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/cli.py +0 -0
  113. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/clipboard.py +0 -0
  114. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/entrypoint.py +0 -0
  115. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/fix_windows_path.py +0 -0
  116. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/history_manager.py +0 -0
  117. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  118. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  119. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  120. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/terminal_setup.py +0 -0
  121. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/__init__.py +0 -0
  122. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  123. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/app.tcss +0 -0
  124. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/external_editor.py +0 -0
  125. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  126. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  127. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  128. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  129. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  130. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  131. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  132. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  133. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  134. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  135. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  136. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  137. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  138. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  139. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  140. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  141. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  142. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  143. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  144. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  145. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  146. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  147. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  148. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  149. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  150. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  151. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  152. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  153. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  154. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  155. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  156. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  157. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  158. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  159. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  160. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  161. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  162. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/history.py +0 -0
  163. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  164. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/textual_ui/windowing/state.py +0 -0
  165. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/__init__.py +0 -0
  166. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  167. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  168. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  169. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  170. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  171. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/update.py +0 -0
  172. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/cli/update_notifier/whats_new.py +0 -0
  173. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/__init__.py +0 -0
  174. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agents/__init__.py +0 -0
  175. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agents/manager.py +0 -0
  176. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/agents/models.py +0 -0
  177. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auth/__init__.py +0 -0
  178. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auth/crypto.py +0 -0
  179. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auth/github.py +0 -0
  180. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/auto_solve.py +0 -0
  181. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/__init__.py +0 -0
  182. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/completers.py +0 -0
  183. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  184. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  185. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  186. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  187. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  188. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/fuzzy.py +0 -0
  189. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/path_prompt.py +0 -0
  190. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  191. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/build_orchestrator.py +0 -0
  192. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/checkpoint.py +0 -0
  193. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/__init__.py +0 -0
  194. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/__main__.py +0 -0
  195. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/classifier.py +0 -0
  196. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/dispatcher.py +0 -0
  197. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/rules.py +0 -0
  198. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/classifier/signal.py +0 -0
  199. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/__init__.py +0 -0
  200. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/_dotenv.py +0 -0
  201. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/_settings.py +0 -0
  202. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/doctor.py +0 -0
  203. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/harness_files/__init__.py +0 -0
  204. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  205. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/harness_files/_paths.py +0 -0
  206. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/local_detect.py +0 -0
  207. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/config/migrate.py +0 -0
  208. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/constraint_extract.py +0 -0
  209. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/constraint_hint.py +0 -0
  210. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/consultant.py +0 -0
  211. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/context_recovery.py +0 -0
  212. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/drydock_states.py +0 -0
  213. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/hooks.py +0 -0
  214. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/__init__.py +0 -0
  215. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/anthropic.py +0 -0
  216. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/base.py +0 -0
  217. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/factory.py +0 -0
  218. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/generic.py +0 -0
  219. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/mistral.py +0 -0
  220. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  221. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/backend/vertex.py +0 -0
  222. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/exceptions.py +0 -0
  223. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/format.py +0 -0
  224. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/message_utils.py +0 -0
  225. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/llm/types.py +0 -0
  226. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/logger.py +0 -0
  227. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/middleware.py +0 -0
  228. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/output_formatters.py +0 -0
  229. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/__init__.py +0 -0
  230. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/_drydock_home.py +0 -0
  231. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/_local_config_walk.py +0 -0
  232. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/paths/conventions.py +0 -0
  233. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/plan_session.py +0 -0
  234. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/plugins.py +0 -0
  235. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/programmatic.py +0 -0
  236. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/__init__.py +0 -0
  237. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/builder.md +0 -0
  238. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/cli.md +0 -0
  239. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/compact.md +0 -0
  240. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/dangerous_directory.md +0 -0
  241. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/diagnostic.md +0 -0
  242. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/explore.md +0 -0
  243. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/gemma4.md +0 -0
  244. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/planner.md +0 -0
  245. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/project_context.md +0 -0
  246. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/prompts/tests.md +0 -0
  247. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/proxy_setup.py +0 -0
  248. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/agent_memory.py +0 -0
  249. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/checkpoints.py +0 -0
  250. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/session_loader.py +0 -0
  251. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/session_logger.py +0 -0
  252. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/session_migration.py +0 -0
  253. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session/state_file.py +0 -0
  254. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/session_checker.py +0 -0
  255. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/__init__.py +0 -0
  256. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/manager.py +0 -0
  257. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/models.py +0 -0
  258. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/skills/parser.py +0 -0
  259. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/slug.py +0 -0
  260. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/steering_hook.py +0 -0
  261. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/system_prompt.py +0 -0
  262. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/telemetry/__init__.py +0 -0
  263. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/telemetry/send.py +0 -0
  264. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/errors.py +0 -0
  265. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/git.py +0 -0
  266. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/nuage.py +0 -0
  267. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/teleport.py +0 -0
  268. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/teleport/types.py +0 -0
  269. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/base.py +0 -0
  270. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/_task_manager.py +0 -0
  271. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  272. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  273. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/bash.py +0 -0
  274. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  275. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/count_tool.py +0 -0
  276. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/cron.py +0 -0
  277. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  278. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/glob_tool.py +0 -0
  279. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/grep.py +0 -0
  280. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  281. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  282. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/logic_tool.py +0 -0
  283. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/lsp.py +0 -0
  284. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/math_tool.py +0 -0
  285. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  286. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/memory_tool.py +0 -0
  287. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  288. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  289. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/powershell.py +0 -0
  290. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  291. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  292. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  293. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  294. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  295. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  296. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  297. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  298. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  299. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  300. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  301. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  302. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  303. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  304. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  305. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/task.md +0 -0
  306. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  307. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  308. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  309. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  310. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  311. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  312. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  313. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/read_file.py +0 -0
  314. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/retrieve.py +0 -0
  315. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/search_replace.py +0 -0
  316. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/set_tool.py +0 -0
  317. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/solve_tool.py +0 -0
  318. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/stats_tool.py +0 -0
  319. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/task.py +0 -0
  320. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/todo.py +0 -0
  321. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/tool_search.py +0 -0
  322. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/units_tool.py +0 -0
  323. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/verify_tool.py +0 -0
  324. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/webfetch.py +0 -0
  325. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/websearch.py +0 -0
  326. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/worktree.py +0 -0
  327. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/builtins/write_file.py +0 -0
  328. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/injection_guard.py +0 -0
  329. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/manager.py +0 -0
  330. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp/__init__.py +0 -0
  331. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp/registry.py +0 -0
  332. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp/tools.py +0 -0
  333. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/mcp_sampling.py +0 -0
  334. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/ui.py +0 -0
  335. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/tools/utils.py +0 -0
  336. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/trusted_folders.py +0 -0
  337. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/types.py +0 -0
  338. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/core/utils.py +0 -0
  339. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/__init__.py +0 -0
  340. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/__main__.py +0 -0
  341. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/gap_detector.py +0 -0
  342. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/item.py +0 -0
  343. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/queue.py +0 -0
  344. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/curiosity/surprise.py +0 -0
  345. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/__init__.py +0 -0
  346. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/__main__.py +0 -0
  347. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/code_indexer.py +0 -0
  348. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/retriever.py +0 -0
  349. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/storage.py +0 -0
  350. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/graphrag/text_indexer.py +0 -0
  351. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/__init__.py +0 -0
  352. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/base.py +0 -0
  353. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/onboarding.tcss +0 -0
  354. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/__init__.py +0 -0
  355. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/api_key.py +0 -0
  356. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/choice.py +0 -0
  357. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/local_model.py +0 -0
  358. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/onboarding/screens/welcome.py +0 -0
  359. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  360. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  361. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/__init__.py +0 -0
  362. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/api-design/SKILL.md +0 -0
  363. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/audit-tests/SKILL.md +0 -0
  364. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/batch/SKILL.md +0 -0
  365. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/commit-code/SKILL.md +0 -0
  366. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  367. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/context-summary/SKILL.md +0 -0
  368. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/create-presentation/SKILL.md +0 -0
  369. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/deep-research/SKILL.md +0 -0
  370. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/deploy/SKILL.md +0 -0
  371. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/diff-review/SKILL.md +0 -0
  372. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/doc-gen/SKILL.md +0 -0
  373. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/explain-code/SKILL.md +0 -0
  374. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/explore-code/SKILL.md +0 -0
  375. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/fix-issue/SKILL.md +0 -0
  376. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/git-ops/SKILL.md +0 -0
  377. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/init-project/SKILL.md +0 -0
  378. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/investigate/SKILL.md +0 -0
  379. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/logic/SKILL.md +0 -0
  380. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  381. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/loop/SKILL.md +0 -0
  382. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/migrate/SKILL.md +0 -0
  383. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/perf-analyze/SKILL.md +0 -0
  384. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/plan-impl/SKILL.md +0 -0
  385. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/pr-review/SKILL.md +0 -0
  386. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/prove/SKILL.md +0 -0
  387. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/refactor/SKILL.md +0 -0
  388. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/regex-help/SKILL.md +0 -0
  389. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/review/SKILL.md +0 -0
  390. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/security-review/SKILL.md +0 -0
  391. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/ship/SKILL.md +0 -0
  392. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/simplify/SKILL.md +0 -0
  393. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/strong-tests/SKILL.md +0 -0
  394. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/skills/test-verify/SKILL.md +0 -0
  395. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/__init__.py +0 -0
  396. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/__main__.py +0 -0
  397. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/applier.py +0 -0
  398. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/config.py +0 -0
  399. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/registry.py +0 -0
  400. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sandbox.py +0 -0
  401. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/__init__.py +0 -0
  402. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/header_parser.py +0 -0
  403. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/hooks.py +0 -0
  404. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/loader.py +0 -0
  405. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/sidecar/server.py +0 -0
  406. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/__init__.py +0 -0
  407. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/capture.py +0 -0
  408. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/compute_vector.py +0 -0
  409. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/extract_pairs.py +0 -0
  410. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/train/scan_sessions.py +0 -0
  411. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/steering/vectors.py +0 -0
  412. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock/whats_new.md +0 -0
  413. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/drydock-acp.spec +0 -0
  414. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/flake.lock +0 -0
  415. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/flake.nix +0 -0
  416. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/outlook_draft_assistant.tar.gz +0 -0
  417. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/README.md +0 -0
  418. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/config_base.toml +0 -0
  419. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/config_best.toml +0 -0
  420. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
  421. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
  422. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/domain_spec.md +0 -0
  423. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/experimenter.py +0 -0
  424. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/kernel.py +0 -0
  425. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/mini_prd.md +0 -0
  426. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/mini_prompts.txt +0 -0
  427. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/proposer.py +0 -0
  428. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/research/results.tsv +0 -0
  429. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/resume.md +0 -0
  430. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/README.md +0 -0
  431. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/admiral_probe.py +0 -0
  432. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/auto_test_loop.sh +0 -0
  433. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/monitor_test_battery.sh +0 -0
  434. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/overnight_agents_test.sh +0 -0
  435. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/test_bank.sh +0 -0
  436. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/test_full.sh +0 -0
  437. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/test_smoke.sh +0 -0
  438. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/archive/tui_test.py +0 -0
  439. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/audit_sampler.py +0 -0
  440. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/auto_generate_tests.py +0 -0
  441. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/auto_release.sh +0 -0
  442. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/auto_solve_audit.py +0 -0
  443. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/autonomous_review.sh +0 -0
  444. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/autonomous_review_prompt.md +0 -0
  445. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/backfill_hle_curiosity.py +0 -0
  446. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/backup.sh +0 -0
  447. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/bench_inference.py +0 -0
  448. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/bump_version.py +0 -0
  449. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/classify_pulse.sh +0 -0
  450. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/consume_retrieval_queue.py +0 -0
  451. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/curiosity_idle_cycle.sh +0 -0
  452. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/dedupe_dispatch_queues.py +0 -0
  453. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/deploy_to_github.sh +0 -0
  454. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/dispatch_report.py +0 -0
  455. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/drydock_status.sh +0 -0
  456. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/fetch_arxiv_abstracts.py +0 -0
  457. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/gen_2000_prompts.py +0 -0
  458. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_aggregate.py +0 -0
  459. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_babysitter.sh +0 -0
  460. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_burndown.sh +0 -0
  461. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_burndown_keepalive.sh +0 -0
  462. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_burndown_status.py +0 -0
  463. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_eval.py +0 -0
  464. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/hle_eval_seed.jsonl +0 -0
  465. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/llm_balancer.py +0 -0
  466. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/notify_release.py +0 -0
  467. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/perf_baseline_when_idle.sh +0 -0
  468. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/perf_sweep.py +0 -0
  469. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/poll_issues.sh +0 -0
  470. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/publish_to_pypi.sh +0 -0
  471. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/queue_top.py +0 -0
  472. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/ralph_loop.py +0 -0
  473. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/rejudge_hle.py +0 -0
  474. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/research_babysitter.sh +0 -0
  475. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown.py +0 -0
  476. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown_interactive.py +0 -0
  477. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown_suite.sh +0 -0
  478. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/shakedown_variance.sh +0 -0
  479. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/start_steering_sidecar.sh +0 -0
  480. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_babysitter.sh +0 -0
  481. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_50.txt +0 -0
  482. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_realuser.txt +0 -0
  483. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_tool_agent.txt +0 -0
  484. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  485. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_shakedown.py +0 -0
  486. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_telegram_status.py +0 -0
  487. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/stress_watcher.py +0 -0
  488. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/telegram_bot.py +0 -0
  489. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/tool_usage_report.py +0 -0
  490. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/scripts/vllm_failover.sh +0 -0
  491. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/__init__.py +0 -0
  492. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/conftest.py +0 -0
  493. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_acp.py +0 -0
  494. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_agent_thought.py +0 -0
  495. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_bash.py +0 -0
  496. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_compact_session_updates.py +0 -0
  497. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_content.py +0 -0
  498. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_initialize.py +0 -0
  499. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_list_sessions.py +0 -0
  500. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_load_session.py +0 -0
  501. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_multi_session.py +0 -0
  502. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_new_session.py +0 -0
  503. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_proxy_setup_acp.py +0 -0
  504. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_read_file.py +0 -0
  505. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_search_replace.py +0 -0
  506. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_set_config_option.py +0 -0
  507. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_set_mode.py +0 -0
  508. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_set_model.py +0 -0
  509. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_tool_call_session_update.py +0 -0
  510. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_utils.py +0 -0
  511. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/acp/test_write_file.py +0 -0
  512. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_file_indexer.py +0 -0
  513. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_fuzzy.py +0 -0
  514. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  515. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  516. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_completion_controller.py +0 -0
  517. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  518. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_slash_command_controller.py +0 -0
  519. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  520. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/__init__.py +0 -0
  521. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/data/__init__.py +0 -0
  522. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/data/fireworks.py +0 -0
  523. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/data/mistral.py +0 -0
  524. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_anthropic_adapter.py +0 -0
  525. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_backend.py +0 -0
  526. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  527. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_reasoning_adapter.py +0 -0
  528. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  529. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  530. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  531. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  532. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_bell_notifications.py +0 -0
  533. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_braille_renderer.py +0 -0
  534. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_clipboard.py +0 -0
  535. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_commands.py +0 -0
  536. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_copy_shortcuts.py +0 -0
  537. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_external_editor.py +0 -0
  538. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_no_markup_static.py +0 -0
  539. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_question_app.py +0 -0
  540. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_spinner.py +0 -0
  541. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_switching_mode.py +0 -0
  542. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  543. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  544. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_session_resume.py +0 -0
  545. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/test_ui_skill_dispatch.py +0 -0
  546. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/textual_ui/__init__.py +0 -0
  547. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/cli/textual_ui/test_session_picker.py +0 -0
  548. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/conftest.py +0 -0
  549. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_agents.py +0 -0
  550. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_auth_crypto.py +0 -0
  551. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_auth_github.py +0 -0
  552. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  553. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  554. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_config_load_dotenv.py +0 -0
  555. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_config_paths.py +0 -0
  556. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_config_resolution.py +0 -0
  557. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_file_logging.py +0 -0
  558. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_plan_session.py +0 -0
  559. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_proxy_setup.py +0 -0
  560. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_slug.py +0 -0
  561. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_telemetry_send.py +0 -0
  562. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_teleport_git.py +0 -0
  563. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_teleport_nuage.py +0 -0
  564. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_teleport_service.py +0 -0
  565. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_trusted_folders.py +0 -0
  566. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/core/test_utils.py +0 -0
  567. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/common.py +0 -0
  568. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/conftest.py +0 -0
  569. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/mock_server.py +0 -0
  570. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  571. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/test_cli_tui_streaming.py +0 -0
  572. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  573. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/fixtures/doc_qa_system_prd.md +0 -0
  574. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/__init__.py +0 -0
  575. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/mock_backend_factory.py +0 -0
  576. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/mock_entrypoint.py +0 -0
  577. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/mock/utils.py +0 -0
  578. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/onboarding/test_run_onboarding.py +0 -0
  579. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/onboarding/test_ui_onboarding.py +0 -0
  580. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/session/test_session_loader.py +0 -0
  581. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/session/test_session_logger.py +0 -0
  582. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/session/test_session_migration.py +0 -0
  583. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/conftest.py +0 -0
  584. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/test_manager.py +0 -0
  585. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/test_models.py +0 -0
  586. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/skills/test_parser.py +0 -0
  587. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  588. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  589. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  590. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  591. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  592. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  593. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  594. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  595. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  596. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  597. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  598. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  599. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  600. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  601. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  602. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  603. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  604. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  605. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  606. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  607. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  608. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  609. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  610. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  611. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  612. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  613. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  614. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  615. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  616. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  617. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  618. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  619. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  620. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  621. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  622. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  623. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  624. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  625. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  626. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  627. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  628. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  629. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  630. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  631. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  632. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  633. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  634. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  635. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  636. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  637. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  638. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  639. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  640. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  641. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  642. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  643. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  644. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  645. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  646. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  647. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/base_snapshot_test_app.py +0 -0
  648. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/conftest.py +0 -0
  649. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/snap_compare.py +0 -0
  650. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  651. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  652. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  653. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  654. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  655. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  656. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  657. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  658. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  659. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  660. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  661. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  662. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  663. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  664. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/stubs/fake_backend.py +0 -0
  665. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/stubs/fake_client.py +0 -0
  666. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/stubs/fake_tool.py +0 -0
  667. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral.py +0 -0
  668. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  669. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_intervention_outcome.py +0 -0
  670. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_phase3.py +0 -0
  671. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_proposed.py +0 -0
  672. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_session_id.py +0 -0
  673. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_admiral_struggle_dedup.py +0 -0
  674. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_auto_compact.py +0 -0
  675. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_backend.py +0 -0
  676. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_observer_streaming.py +0 -0
  677. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_stats.py +0 -0
  678. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_tasks.py +0 -0
  679. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agent_tool_call.py +0 -0
  680. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_agents.py +0 -0
  681. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_algebra_tool.py +0 -0
  682. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  683. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_auto_solve.py +0 -0
  684. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_build.py +0 -0
  685. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_debug.py +0 -0
  686. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_multiagent.py +0 -0
  687. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_prd.py +0 -0
  688. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_prd_extended.py +0 -0
  689. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_tools.py +0 -0
  690. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_bank_update.py +0 -0
  691. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_build_projects.py +0 -0
  692. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_checkpoint.py +0 -0
  693. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_chemistry_tool.py +0 -0
  694. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_classifier.py +0 -0
  695. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_cli_programmatic_preload.py +0 -0
  696. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_config_migration.py +0 -0
  697. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_constraint_extract.py +0 -0
  698. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_constraint_hint.py +0 -0
  699. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_context_recovery.py +0 -0
  700. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_count_tool.py +0 -0
  701. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_curiosity.py +0 -0
  702. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_current_bugs.py +0 -0
  703. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_dispatch_report.py +0 -0
  704. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_dispatcher.py +0 -0
  705. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_drydock_regression.py +0 -0
  706. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_drydock_tasks.py +0 -0
  707. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  708. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_full_regression.py +0 -0
  709. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_graphrag.py +0 -0
  710. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_graphrag_worked_examples.py +0 -0
  711. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hallucinated_tool_suppression.py +0 -0
  712. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_history_manager.py +0 -0
  713. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hle_aggregate.py +0 -0
  714. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hle_score_method_split.py +0 -0
  715. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_hle_typing.py +0 -0
  716. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_integration.py +0 -0
  717. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_issue_fixes.py +0 -0
  718. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_linear_algebra_tool.py +0 -0
  719. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_local_detect.py +0 -0
  720. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_logic_tool.py +0 -0
  721. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_loop_detection.py +0 -0
  722. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_math_tool.py +0 -0
  723. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_mcp_settings.py +0 -0
  724. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_memory_tool.py +0 -0
  725. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_message_id.py +0 -0
  726. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_message_merging.py +0 -0
  727. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_middleware.py +0 -0
  728. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_multi_agent.py +0 -0
  729. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_number_theory_tool.py +0 -0
  730. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_read_file_not_found_listing.py +0 -0
  731. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_real_failures.py +0 -0
  732. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_real_issues.py +0 -0
  733. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_real_workflow.py +0 -0
  734. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_reasoning_content.py +0 -0
  735. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_rejudge_hle.py +0 -0
  736. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_retrieval_consumer.py +0 -0
  737. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_retrieve_tool.py +0 -0
  738. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_search_replace_args_not_truncated.py +0 -0
  739. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_set_tool.py +0 -0
  740. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_smoke.py +0 -0
  741. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_solve_tool.py +0 -0
  742. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_stats_tool.py +0 -0
  743. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering.py +0 -0
  744. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_capture.py +0 -0
  745. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_compute_vector.py +0 -0
  746. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_extract_pairs.py +0 -0
  747. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_hook.py +0 -0
  748. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  749. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_steering_sidecar_hooks.py +0 -0
  750. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_system_prompt.py +0 -0
  751. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_tagged_text.py +0 -0
  752. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_task_complete_nudge.py +0 -0
  753. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_tool_args.py +0 -0
  754. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncate_args_valid_json.py +0 -0
  755. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncated_arg_path_hint.py +0 -0
  756. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncated_search_replace_escalation.py +0 -0
  757. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_truncated_write_escalation.py +0 -0
  758. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_ui_external_editor.py +0 -0
  759. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_ui_input_history.py +0 -0
  760. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_units_tool.py +0 -0
  761. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_user_issues.py +0 -0
  762. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_verify_tool.py +0 -0
  763. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_wall_of_text_rescue.py +0 -0
  764. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_workloads.py +0 -0
  765. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/test_write_file_missing_path.py +0 -0
  766. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/testbank_helpers.py +0 -0
  767. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_ask_user_question.py +0 -0
  768. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash.py +0 -0
  769. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  770. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_consec_empty_search.py +0 -0
  771. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  772. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  773. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  774. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  775. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  776. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  777. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  778. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_exit_plan_mode.py +0 -0
  779. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_grep.py +0 -0
  780. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  781. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_invoke_context.py +0 -0
  782. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  783. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_manager_get_tool_config.py +0 -0
  784. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_mcp.py +0 -0
  785. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_mcp_sampling.py +0 -0
  786. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  787. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  788. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_directory.py +0 -0
  789. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_read_file_limit_truncation.py +0 -0
  790. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_append_fallback.py +0 -0
  791. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_dir_path.py +0 -0
  792. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_empty_content.py +0 -0
  793. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_file_not_found.py +0 -0
  794. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  795. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_hard_stop.py +0 -0
  796. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_malformed_block.py +0 -0
  797. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  798. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_placeholder.py +0 -0
  799. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  800. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_task.py +0 -0
  801. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_ui_bash_execution.py +0 -0
  802. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_webfetch.py +0 -0
  803. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_websearch.py +0 -0
  804. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  805. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  806. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  807. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  808. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_do_update.py +0 -0
  809. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  810. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_github_update_gateway.py +0 -0
  811. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  812. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_ui_update_notification.py +0 -0
  813. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_update_use_case.py +0 -0
  814. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/tests/update_notifier/test_whats_new.py +0 -0
  815. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/uv.lock +0 -0
  816. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/README.md +0 -0
  817. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/cli_subcommand_dispatch.py +0 -0
  818. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/lookup.json +0 -0
  819. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/sql_parser.py +0 -0
  820. {drydock_cli-2.8.43 → drydock_cli-2.8.45}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2172060
@@ -18,6 +18,15 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
18
18
  AWQ-4bit on vLLM is the historical alternate path and stays available
19
19
  via `/data3/Models/start_gemma4.sh` (the vLLM script — NOT the
20
20
  llama.cpp one). Speed: ~64 tok/s e2e on Q3.
21
+ - **Vision (2026-05-16, GH #23):** `/data3/Models/mmproj-F16.gguf`
22
+ (1.2 GB, unsloth/gemma-4-26B-A4B-it-GGUF). Loaded via
23
+ `--mmproj /models/mmproj-F16.gguf` in `start_gemma4_llamacpp.sh`.
24
+ Container reports `projector: gemma4v` and accepts OpenAI-style
25
+ multimodal messages (`content: [{type:text}, {type:image_url}]`).
26
+ Verified with a base64 test image — model received 284 prompt tokens
27
+ for `text + 1×1 image`. Server-side ONLY; drydock TUI does not yet
28
+ have an image-attach affordance — the server-side capability is the
29
+ prereq for that work.
21
30
  - **The honest test:** `scripts/shakedown_interactive.py` — drives the real TUI
22
31
  via pexpect with a multi-step user conversation (24 steps per PRD: plan,
23
32
  build, test, add features, debug, review code, edge cases, README).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.43
3
+ Version: 2.8.45
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -36,6 +36,17 @@ class CommandRegistry:
36
36
  description="Clear conversation history",
37
37
  handler="_clear_history",
38
38
  ),
39
+ "undo": Command(
40
+ aliases=frozenset(["/undo", "/back"]),
41
+ description=(
42
+ "Roll back the last turn — drop the most recent user "
43
+ "prompt and the assistant turn it triggered. Use when "
44
+ "an API error or bad tool call wedged the conversation "
45
+ "and you want to retry from the previous good state "
46
+ "without losing the rest of the history (unlike /clear)."
47
+ ),
48
+ handler="_undo_last_turn",
49
+ ),
39
50
  "log": Command(
40
51
  aliases=frozenset(["/log"]),
41
52
  description="Show path to current interaction log file",
@@ -2204,6 +2204,41 @@ class DrydockApp(App): # noqa: PLR0904
2204
2204
  )
2205
2205
  )
2206
2206
 
2207
+ async def _undo_last_turn(self) -> None:
2208
+ """Roll back the last user→assistant turn without wiping the
2209
+ whole session. Safer alternative to /clear when an error
2210
+ wedges the conversation."""
2211
+ if self._agent_running:
2212
+ await self._mount_and_scroll(
2213
+ ErrorMessage(
2214
+ "Cannot /undo while the agent is processing. "
2215
+ "Press Esc to cancel first, then /undo.",
2216
+ collapsed=self._tools_collapsed,
2217
+ )
2218
+ )
2219
+ return
2220
+ try:
2221
+ ok, info = await self.agent_loop.undo_last_turn()
2222
+ if not ok:
2223
+ await self._mount_and_scroll(
2224
+ ErrorMessage(info, collapsed=self._tools_collapsed)
2225
+ )
2226
+ return
2227
+ # The conversation history is now rolled back. We don't try
2228
+ # to selectively remove rendered UI widgets — that's fragile
2229
+ # since the assistant turn we dropped may have produced
2230
+ # multiple widgets (text, tool calls, tool results). Instead,
2231
+ # emit a clear marker so the user sees where the rollback
2232
+ # happened. Subsequent prompts will start fresh against the
2233
+ # truncated message history.
2234
+ await self._mount_and_scroll(UserCommandMessage(info))
2235
+ except Exception as e: # noqa: BLE001
2236
+ await self._mount_and_scroll(
2237
+ ErrorMessage(
2238
+ f"Undo failed: {e}", collapsed=self._tools_collapsed
2239
+ )
2240
+ )
2241
+
2207
2242
  async def _clear_history(self) -> None:
2208
2243
  try:
2209
2244
  self._reset_ui_state()
@@ -729,6 +729,23 @@ class AgentLoop:
729
729
  if user_message.message_id is None:
730
730
  raise AgentLoopError("User message must have a message_id")
731
731
 
732
+ # Reset sticky error counters on every fresh user turn. Without
733
+ # this, once `_total_error_rounds` hits the 3-round stop ceiling
734
+ # (~45 API errors), it stays at 3 forever — every subsequent
735
+ # user message immediately re-trips the ceiling on its first
736
+ # API error and aborts. Users were stuck typing /clear (which
737
+ # wipes the whole session) just to recover. The user has
738
+ # manually intervened by typing again; they earn a fresh
739
+ # error budget. The bad messages may also have been
740
+ # dropped/compacted by the previous round's recovery path, so
741
+ # the new turn often succeeds where the prior round couldn't.
742
+ if getattr(self, "_total_error_rounds", 0) > 0:
743
+ logger.warning(
744
+ "[recovery] resetting _total_error_rounds=%d → 0 on new user turn",
745
+ self._total_error_rounds,
746
+ )
747
+ self._total_error_rounds = 0
748
+
732
749
  # Flush the user message to disk RIGHT NOW, before the LLM call.
733
750
  # Without this, messages.jsonl only updates after the model yields
734
751
  # — for silent/slow prompts the user message is invisible to any
@@ -1050,8 +1067,44 @@ class AgentLoop:
1050
1067
  self._total_error_rounds = 0
1051
1068
  self._total_error_rounds += 1
1052
1069
  if self._total_error_rounds >= 3:
1070
+ # Hard-stop after 3 rounds of recovery attempts.
1071
+ # Drop the LAST user→assistant block so the next
1072
+ # user message doesn't immediately re-trigger the
1073
+ # same broken state. Counter resets on the next
1074
+ # _conversation_loop entry, so the user can just
1075
+ # type the next message and continue without
1076
+ # losing their entire context.
1077
+ try:
1078
+ # Find the last user message; truncate to it.
1079
+ # Keep everything up to AND INCLUDING that
1080
+ # message; drop the assistant garbage after.
1081
+ last_user_idx = -1
1082
+ for i in range(len(self.messages) - 1, -1, -1):
1083
+ if self.messages[i].role == Role.user:
1084
+ last_user_idx = i
1085
+ break
1086
+ if last_user_idx >= 0 and last_user_idx < len(self.messages) - 1:
1087
+ kept = list(self.messages[: last_user_idx + 1])
1088
+ self.messages.reset(kept)
1089
+ logger.warning(
1090
+ "[recovery] hard-stop: dropped %d messages "
1091
+ "after last user turn (idx=%d)",
1092
+ len(self.messages) - last_user_idx - 1,
1093
+ last_user_idx,
1094
+ )
1095
+ except Exception as _drop_err: # noqa: BLE001
1096
+ logger.warning(
1097
+ "[recovery] hard-stop drop failed: %s",
1098
+ _drop_err,
1099
+ )
1053
1100
  yield AssistantEvent(
1054
- content=f"\n\n[Stopping: {self._total_error_rounds * MAX_API_ERRORS}+ API errors. The model cannot process this request. Try /compact or /clear to free context.]\n",
1101
+ content=(
1102
+ f"\n\n[Stopping after {self._total_error_rounds * MAX_API_ERRORS}+ "
1103
+ f"API errors. Conversation rolled back to your "
1104
+ f"last message — just type your next request "
1105
+ f"to continue. (Use /compact if context is "
1106
+ f"genuinely too long, /clear only to fully reset.)]\n"
1107
+ ),
1055
1108
  )
1056
1109
  return
1057
1110
 
@@ -4320,6 +4373,70 @@ or replace freely; future sessions will respect your edits._
4320
4373
  def set_user_input_callback(self, callback: UserInputCallback) -> None:
4321
4374
  self.user_input_callback = callback
4322
4375
 
4376
+ async def undo_last_turn(self) -> tuple[bool, str]:
4377
+ """Rewind history past the LAST user message, dropping the
4378
+ assistant turn (and any tool results) it triggered AND the
4379
+ user message itself. Use case: the last user prompt set off
4380
+ a chain that wedged the conversation; the user wants to back
4381
+ out and try a different prompt.
4382
+
4383
+ Returns (success, info_message).
4384
+
4385
+ Why this is safer than `/clear`:
4386
+ - Preserves the system message (index 0)
4387
+ - Preserves all prior good user+assistant exchanges
4388
+ - Resets the sticky error counters so the new prompt
4389
+ won't immediately re-trip the lockout
4390
+
4391
+ Why drop the user message too (not just the assistant turn):
4392
+ - If the user repeats the same prompt, they'll re-trigger
4393
+ the same bad assistant response. The point of /undo is
4394
+ to escape; the user can always re-type the prompt if
4395
+ they really want it.
4396
+ """
4397
+ # Find the last user message — walk backward
4398
+ last_user_idx = -1
4399
+ for i in range(len(self.messages) - 1, -1, -1):
4400
+ if self.messages[i].role == Role.user:
4401
+ last_user_idx = i
4402
+ break
4403
+
4404
+ if last_user_idx <= 0:
4405
+ # No user message to rewind past (only the system message
4406
+ # is present), or the user message is at idx 0 which we
4407
+ # never drop. Nothing to undo.
4408
+ return (False, "Nothing to undo — no prior user turn in history.")
4409
+
4410
+ dropped = len(self.messages) - last_user_idx
4411
+ kept = list(self.messages[:last_user_idx])
4412
+ try:
4413
+ await self.session_logger.save_interaction(
4414
+ self.messages,
4415
+ self.stats,
4416
+ self._base_config,
4417
+ self.tool_manager,
4418
+ self.agent_profile,
4419
+ )
4420
+ except Exception as e: # noqa: BLE001 — never block /undo on a save failure
4421
+ logger.warning("[undo] session save failed (continuing): %s", e)
4422
+ self.messages.reset(kept)
4423
+ # Clear the sticky error counters so the next prompt starts fresh.
4424
+ if hasattr(self, "_total_error_rounds"):
4425
+ self._total_error_rounds = 0
4426
+ if hasattr(self, "_consecutive_circuit_breaker_fires"):
4427
+ self._consecutive_circuit_breaker_fires = 0
4428
+ if hasattr(self, "_consecutive_empty_turns"):
4429
+ self._consecutive_empty_turns = 0
4430
+ logger.warning(
4431
+ "[undo] rolled back: kept %d messages (dropped %d after last user idx=%d)",
4432
+ len(kept), dropped, last_user_idx,
4433
+ )
4434
+ return (
4435
+ True,
4436
+ f"Rolled back the last turn — dropped {dropped} message(s). "
4437
+ f"Type your next prompt to continue from the prior state.",
4438
+ )
4439
+
4323
4440
  async def clear_history(self) -> None:
4324
4441
  await self.session_logger.save_interaction(
4325
4442
  self.messages,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.8.43"
3
+ version = "2.8.45"
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,195 @@
1
+ """Regression tests for the unrecoverable-API-error fix.
2
+
3
+ The bug (reported 2026-05-16): once the agent loop hit
4
+ `_total_error_rounds >= 3`, it stayed stuck — every subsequent user
5
+ message tripped the ceiling on its first API error and aborted.
6
+ The only escape was `/clear`, which wipes the entire session.
7
+
8
+ The fix has two parts:
9
+ 1. Reset `_total_error_rounds` to 0 at the top of each new
10
+ `_conversation_loop` (= new user turn).
11
+ 2. On the hard-stop path, drop messages after the last user
12
+ turn so the broken state doesn't immediately re-trip the same
13
+ error on the next attempt.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ from unittest.mock import MagicMock
19
+
20
+
21
+ def _make_stub_loop():
22
+ """Minimal stub object that exercises just the reset semantics
23
+ without needing a full AgentLoop construction (which requires
24
+ a real backend, tools, config, etc.)."""
25
+ loop = MagicMock()
26
+ loop._total_error_rounds = 0
27
+ return loop
28
+
29
+
30
+ def test_total_error_rounds_starts_at_zero():
31
+ """Baseline — fresh agent loops should have rounds=0."""
32
+ loop = _make_stub_loop()
33
+ assert loop._total_error_rounds == 0
34
+
35
+
36
+ def test_reset_on_new_user_turn_clears_sticky_state():
37
+ """The hard-stop ceiling was sticky pre-fix. After the fix,
38
+ `_conversation_loop` resets `_total_error_rounds` at entry so
39
+ subsequent user messages get a fresh error budget."""
40
+ # Simulate the reset block from _conversation_loop:
41
+ loop = _make_stub_loop()
42
+ loop._total_error_rounds = 3 # hit the stop ceiling
43
+
44
+ # The fix logic — extracted to validate it in isolation:
45
+ if getattr(loop, "_total_error_rounds", 0) > 0:
46
+ loop._total_error_rounds = 0
47
+
48
+ assert loop._total_error_rounds == 0
49
+
50
+
51
+ def test_drop_messages_after_last_user_turn_on_hard_stop():
52
+ """Hard-stop path should rewind history to the last user
53
+ message so the next turn doesn't re-trigger the same error.
54
+ Validates the slice/keep logic independent of AgentLoop."""
55
+
56
+ class FakeMsg:
57
+ def __init__(self, role, content=""):
58
+ self.role = role
59
+ self.content = content
60
+
61
+ class Role:
62
+ user = "user"
63
+ assistant = "assistant"
64
+ tool = "tool"
65
+
66
+ msgs = [
67
+ FakeMsg(Role.user, "first prompt"),
68
+ FakeMsg(Role.assistant, "first reply"),
69
+ FakeMsg(Role.user, "second prompt"),
70
+ FakeMsg(Role.assistant, "broken tool_call attempt"),
71
+ FakeMsg(Role.tool, "error result"),
72
+ FakeMsg(Role.assistant, "another bad attempt"),
73
+ ]
74
+
75
+ # Find last user message index — matches the fix's loop
76
+ last_user_idx = -1
77
+ for i in range(len(msgs) - 1, -1, -1):
78
+ if msgs[i].role == Role.user:
79
+ last_user_idx = i
80
+ break
81
+
82
+ assert last_user_idx == 2
83
+ kept = msgs[: last_user_idx + 1]
84
+ assert len(kept) == 3
85
+ assert kept[-1].role == Role.user
86
+ assert kept[-1].content == "second prompt"
87
+
88
+
89
+ def test_drop_is_safe_when_last_message_is_already_user():
90
+ """If the last message is already a user turn (nothing after),
91
+ the drop should be a no-op."""
92
+
93
+ class FakeMsg:
94
+ def __init__(self, role, content=""):
95
+ self.role = role
96
+ self.content = content
97
+
98
+ class Role:
99
+ user = "user"
100
+ assistant = "assistant"
101
+
102
+ msgs = [
103
+ FakeMsg(Role.user, "only message"),
104
+ ]
105
+ last_user_idx = -1
106
+ for i in range(len(msgs) - 1, -1, -1):
107
+ if msgs[i].role == Role.user:
108
+ last_user_idx = i
109
+ break
110
+
111
+ # The fix's guard: `last_user_idx < len(self.messages) - 1`
112
+ should_drop = last_user_idx >= 0 and last_user_idx < len(msgs) - 1
113
+ assert should_drop is False # nothing to drop
114
+
115
+
116
+ def test_reset_skipped_when_already_zero():
117
+ """The reset path logs when rounds > 0 and skips otherwise — no
118
+ side effects for healthy sessions."""
119
+ loop = _make_stub_loop()
120
+ loop._total_error_rounds = 0
121
+
122
+ triggered_reset = False
123
+ if getattr(loop, "_total_error_rounds", 0) > 0:
124
+ triggered_reset = True
125
+ loop._total_error_rounds = 0
126
+
127
+ assert triggered_reset is False
128
+ assert loop._total_error_rounds == 0
129
+
130
+
131
+ # ── Integration via the real _conversation_loop entry ──────────────────
132
+
133
+ def test_conversation_loop_resets_total_error_rounds_on_entry():
134
+ """The actual code path: `_conversation_loop` should reset the
135
+ counter to 0 before any LLM work happens. We patch AgentLoop's
136
+ dependencies to skip the LLM call and just verify the counter."""
137
+ # This is a partial-integration test — it imports the real method
138
+ # and exercises its early code path. We don't run a full LLM turn.
139
+ from drydock.core.agent_loop import AgentLoop # noqa: F401
140
+
141
+ # Verify the source code contains the reset block at the
142
+ # `_conversation_loop` site. (A behavioural test would require
143
+ # mocking the whole agent loop; this string-check is the
144
+ # cheapest reliable regression.)
145
+ import inspect
146
+ src = inspect.getsource(AgentLoop._conversation_loop)
147
+ assert "_total_error_rounds" in src
148
+ assert "= 0" in src
149
+ assert "fresh user turn" in src or "Reset sticky error" in src
150
+
151
+
152
+ # ── /undo slash command ────────────────────────────────────────────────
153
+
154
+ def test_undo_command_registered_with_aliases():
155
+ """The /undo command must be in the registry with /back as alias."""
156
+ from drydock.cli.commands import CommandRegistry
157
+ r = CommandRegistry()
158
+ cmd = r.commands.get("undo")
159
+ assert cmd is not None
160
+ assert "/undo" in cmd.aliases
161
+ assert "/back" in cmd.aliases
162
+ assert cmd.handler == "_undo_last_turn"
163
+
164
+
165
+ def test_agent_loop_undo_last_turn_method_exists():
166
+ """The agent loop must expose undo_last_turn for the TUI handler."""
167
+ from drydock.core.agent_loop import AgentLoop
168
+ assert callable(getattr(AgentLoop, "undo_last_turn", None))
169
+
170
+
171
+ def test_undo_keeps_system_and_truncates_to_before_last_user():
172
+ """Validate the rewind shape: drop the last user msg + everything
173
+ after it; keep the system message and all prior turns."""
174
+ import inspect
175
+ from drydock.core.agent_loop import AgentLoop
176
+ src = inspect.getsource(AgentLoop.undo_last_turn)
177
+ # The implementation must walk backward to find the last user idx,
178
+ # then slice the messages to keep only [:last_user_idx].
179
+ assert "last_user_idx" in src
180
+ assert "Role.user" in src
181
+ assert ".reset(" in src
182
+ # It must also clear the sticky error counters so the next prompt
183
+ # doesn't immediately re-trip the lockout.
184
+ assert "_total_error_rounds" in src
185
+
186
+
187
+ def test_undo_returns_failure_when_only_system_message():
188
+ """If there's no user message to rewind past, undo should return
189
+ (False, info) rather than wiping the system message."""
190
+ import inspect
191
+ from drydock.core.agent_loop import AgentLoop
192
+ src = inspect.getsource(AgentLoop.undo_last_turn)
193
+ # Guard condition for "no user message" or "only system message"
194
+ assert "last_user_idx <= 0" in src or "last_user_idx == -1" in src
195
+ assert "Nothing to undo" in src
@@ -1,5 +1,53 @@
1
1
  # Drydock Trip Log
2
2
 
3
+ ## 2026-05-16 12:00 UTC tick
4
+ - Stress: paused (.pause_stress sentinel active)
5
+ - Write rate: N/A (stress paused)
6
+ - HLE burndown: running (PID 2157358, slot 33 "other" category); lifetime 12.1% (72/594): Math 17.1%, Bio/Med 14.3%, CS/AI 2.4%, Chemistry 6.1%, Engineering 6.1%, Physics 3.1%
7
+ - Recent batches declining (60%→0%) as burndown cycles into hard CS/AI questions — not a regression; CS/AI 2.4% is baseline for this model on symbolic/graph-theory problems; earlier Math 6/10 batch confirms Math loop is healthy
8
+ - vLLM 400s: 0 (llamacpp-gemma4 healthy, reasoning-budget=12000 confirmed in container config)
9
+ - GH issues: 1 open (#23 image-processing multimodal enhancement — not actionable this tick)
10
+ - Dispatch queue: harness=8 (all thinking_stall, fully addressed by prior commits), retrieval=0 actionable, curiosity=1950 pending (316 hle_failure, 1635 unknown_term)
11
+ - Retrieval drain: 0 projects ingested (all already ingested recently)
12
+ - Curiosity: consumed 30cceb0645e3c41e (JS timeout hle_failure — pre-fix thinking stall, addressed by reasoning-budget=12000 + STOP_NOW fixes)
13
+ - Action this tick: no code changes — all dispatch patterns addressed, CS/AI 0% is model capability not a drydock bug
14
+
15
+ ## 2026-05-16 12:30 UTC tick
16
+ - Stress: paused (.pause_stress sentinel active)
17
+ - Write rate: N/A (stress paused)
18
+ - HLE burndown: running (PID 2157358, 43m elapsed); lifetime 12.3% (74/600): Math 17.1%, Bio/Med 14.3%, CS/AI 2.4%, Chemistry 6.1%, Other 18.2%
19
+ - vLLM 400s: 0 (llamacpp-gemma4 healthy, Q3_K_M, reasoning-budget=12000)
20
+ - GH issues: 1 open (#23 image-processing enhancement — not actionable)
21
+ - Dispatch queue: harness=8 (all thinking_stall, fully addressed), retrieval=0 actionable, curiosity=1971 pending (319 hle_failure, 1652 unknown_term)
22
+ - Retrieval drain: 0 projects ingested (all already ingested recently)
23
+ - Curiosity: consumed 21fc1bf2f3913021 (directed multigraph cycle cover — model used tools but no FINAL ANSWER; addressed by 23f3530 force tool_choice=none + b0350cb stall nudge)
24
+ - Action this tick: no code changes — system nominal; all harness:thinking_stall patterns addressed by prior 24h commits; HLE score holding steady at 12.3%
25
+
26
+ ## 2026-05-16 11:30 UTC tick
27
+ - Stress: paused (.pause_stress sentinel active)
28
+ - Write rate: N/A (stress paused)
29
+ - HLE burndown: alive (PID 2144966, 52 min), lifetime 71/589 = 12.1% (Math 50/292 = 17.1%, CS/AI 2/81 = 2.5%)
30
+ - Recent batch trend: scores dropped 60%→0% over last 8 batches — NOT a regression. Category rotation has been hitting CS/AI (10:40 UTC 0/10, 10:46 UTC 0/8 ongoing) and Biology (10%). CS/AI is historically 2.5% for this model; both recent CS/AI batches are consistent with baseline. Earlier 6/10 Math batch confirms Math is healthy at ~17%.
31
+ - vLLM (llamacpp-gemma4): healthy, Q3_K_M, reasoning-budget=12000 confirmed active
32
+ - Balancer: healthy on :8001
33
+ - Autonomous review: started 11:30 UTC (prior tick ended 11:05 UTC exit=0)
34
+ - GH issues: 1 open (#23 image processing enhancement, non-critical)
35
+ - Dispatch queue: harness=12 (thinking_stall, all addressed per evidence), retrieval=0 actionable (3 entries, already ingested), curiosity=1945 pending (1632 unknown_term, 314 hle_failure)
36
+ - Action this tick: consumed curiosity d287eae28286f71b (Make 24 no-FINAL-ANSWER case, addressed by 23f3530 force-tool_choice-none fix). No code change — system healthy, HLE running, all loops nominal.
37
+
38
+ ## 2026-05-16 11:00 UTC tick
39
+ - Stress: paused (.pause_stress sentinel active)
40
+ - Write rate: N/A (stress paused)
41
+ - HLE burndown: alive (PID 2144966, 19h+ elapsed), lifetime 71/584 = 12.2% (Math 50/292 = 17.1%, CS/AI 2/76 = 2.6%)
42
+ - Recent batch trend: score drop from ~30% (Math) to 0% (CS/AI) is category-rotation driven — model historically 2.6% on CS/AI vs 17.1% Math; empty:no_response on two coding questions is thinking-budget exhaustion (12000-token budget × ~50 tok/s ≈ 240s, plus prompt overhead)
43
+ - vLLM (llamacpp-gemma4): healthy, Q3_K_M, reasoning-budget=12000
44
+ - Balancer: healthy on :8001
45
+ - Autonomous review: started 11:00 UTC (prior run ended 10:35 UTC)
46
+ - GH issues: 1 open (#23 image processing enhancement, non-critical)
47
+ - Dispatch queue: harness=12 (thinking_stall, all addressed per prior commits), retrieval=0 actionable, curiosity=1925 pending
48
+ - Retrieval drain: 0 ingested (3 entries, all recently ingested)
49
+ - Action this tick: consumed 3 stale curiosity items (chemistry no_final_answer from pre-v2.8.42 era, before judge fix e3a3a9d and stall fixes b0350cb/23f3530 — no code change needed)
50
+
3
51
  ## 2026-05-16 10:30 UTC tick
4
52
  - Stress: paused (.pause_stress sentinel active)
5
53
  - Write rate: N/A (stress paused)
@@ -1 +0,0 @@
1
- 2148271
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes