drydock-cli 2.8.17__tar.gz → 2.8.19__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 (749) hide show
  1. drydock_cli-2.8.19/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/PKG-INFO +50 -2
  3. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/README.md +49 -1
  4. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/SOVEREIGN_PRD.md +111 -0
  5. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/commands.py +9 -0
  6. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/app.py +211 -15
  7. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agent_loop.py +55 -6
  8. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/pyproject.toml +1 -1
  9. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/auto_release.sh +18 -4
  10. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_integration.py +12 -4
  11. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_loop_detection.py +71 -0
  12. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_real_issues.py +6 -1
  13. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/trip_log.md +216 -0
  14. drydock_cli-2.8.17/.auto_release.lock +0 -1
  15. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/CODEOWNERS +0 -0
  16. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  17. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  18. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  19. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/build-and-upload.yml +0 -0
  20. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/ci.yml +0 -0
  21. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/issue-labeler.yml +0 -0
  22. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.github/workflows/release.yml +0 -0
  23. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.gitignore +0 -0
  24. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.pre-commit-config.yaml +0 -0
  25. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.python-version +0 -0
  26. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.typos.toml +0 -0
  27. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.vscode/extensions.json +0 -0
  28. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.vscode/launch.json +0 -0
  29. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/.vscode/settings.json +0 -0
  30. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/AGENTS.md +0 -0
  31. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/Admiral.md +0 -0
  32. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/CHANGELOG.md +0 -0
  33. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/CLAUDE.md +0 -0
  34. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/CONTRIBUTING.md +0 -0
  35. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/DEEP_NOIR_PRD.md +0 -0
  36. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/DEPLOYMENT.md +0 -0
  37. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/HLE_PRD.md +0 -0
  38. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/JETSON_BENCH.md +0 -0
  39. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/LICENSE +0 -0
  40. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/MODEL_SHORTCOMINGS.md +0 -0
  41. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/NOTICE +0 -0
  42. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/TRIAGE_v1.md +0 -0
  43. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/action.yml +0 -0
  44. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/README.md +0 -0
  45. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results1.tsv +0 -0
  46. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results13.tsv +0 -0
  47. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results14.tsv +0 -0
  48. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results15.tsv +0 -0
  49. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results16.tsv +0 -0
  50. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results17.tsv +0 -0
  51. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results18.tsv +0 -0
  52. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results19.tsv +0 -0
  53. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results2.tsv +0 -0
  54. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results20.tsv +0 -0
  55. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results3.tsv +0 -0
  56. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results4.tsv +0 -0
  57. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results5.tsv +0 -0
  58. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results6.tsv +0 -0
  59. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results7.tsv +0 -0
  60. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results8.tsv +0 -0
  61. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results9.tsv +0 -0
  62. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/baseline_history/results_evolved_v1.tsv +0 -0
  63. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/distribution/zed/LICENSE +0 -0
  64. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/distribution/zed/extension.toml +0 -0
  65. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/distribution/zed/icons/mistral_vibe.svg +0 -0
  66. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/README.md +0 -0
  67. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/acp-setup.md +0 -0
  68. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/BASELINE_412.md +0 -0
  69. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/Drydock_rebrand.md +0 -0
  70. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  71. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  72. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  73. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/PRD.md +0 -0
  74. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/drydock_terms.md +0 -0
  75. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/archive/resume.md +0 -0
  76. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/docs/proxy-setup.md +0 -0
  77. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/__init__.py +0 -0
  78. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/__main__.py +0 -0
  79. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/__init__.py +0 -0
  80. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/acp_agent_loop.py +0 -0
  81. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/acp_logger.py +0 -0
  82. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/entrypoint.py +0 -0
  83. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/__init__.py +0 -0
  84. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/base.py +0 -0
  85. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/bash.py +0 -0
  86. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/read_file.py +0 -0
  87. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/search_replace.py +0 -0
  88. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/todo.py +0 -0
  89. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/builtins/write_file.py +0 -0
  90. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/tools/session_update.py +0 -0
  91. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/acp/utils.py +0 -0
  92. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/__init__.py +0 -0
  93. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/detectors.py +0 -0
  94. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/detectors_proposed.py +0 -0
  95. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/history.py +0 -0
  96. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/interventions.py +0 -0
  97. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/llm_analyzer.py +0 -0
  98. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/metrics.py +0 -0
  99. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/opus_escalator.py +0 -0
  100. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/persistence.py +0 -0
  101. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/policy.py +0 -0
  102. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/proposer.py +0 -0
  103. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/stager.py +0 -0
  104. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/task_classifier.py +0 -0
  105. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/tuning.py +0 -0
  106. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/validator.py +0 -0
  107. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/admiral/worker.py +0 -0
  108. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/__init__.py +0 -0
  109. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/__init__.py +0 -0
  110. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/base.py +0 -0
  111. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/path_completion.py +0 -0
  112. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/autocompletion/slash_command.py +0 -0
  113. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/cli.py +0 -0
  114. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/clipboard.py +0 -0
  115. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/entrypoint.py +0 -0
  116. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/fix_windows_path.py +0 -0
  117. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/history_manager.py +0 -0
  118. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  119. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  120. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  121. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/terminal_setup.py +0 -0
  122. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/__init__.py +0 -0
  123. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  124. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/app.tcss +0 -0
  125. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/external_editor.py +0 -0
  126. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  127. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  128. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  129. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  130. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  131. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  132. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  133. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  134. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  135. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  136. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  137. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  138. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  139. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  140. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  141. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  142. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  143. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  144. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  145. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  146. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  147. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  148. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  149. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  150. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  151. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  152. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  153. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  154. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  155. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  156. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  157. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  158. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  159. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  160. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  161. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  162. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  163. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/history.py +0 -0
  164. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  165. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/textual_ui/windowing/state.py +0 -0
  166. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/__init__.py +0 -0
  167. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  168. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  169. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  170. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  171. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  172. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/update.py +0 -0
  173. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/cli/update_notifier/whats_new.py +0 -0
  174. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/__init__.py +0 -0
  175. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agents/__init__.py +0 -0
  176. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agents/manager.py +0 -0
  177. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/agents/models.py +0 -0
  178. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/auth/__init__.py +0 -0
  179. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/auth/crypto.py +0 -0
  180. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/auth/github.py +0 -0
  181. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/__init__.py +0 -0
  182. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/completers.py +0 -0
  183. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  184. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  185. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  186. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  187. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  188. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/fuzzy.py +0 -0
  189. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/path_prompt.py +0 -0
  190. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  191. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/build_orchestrator.py +0 -0
  192. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/checkpoint.py +0 -0
  193. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/__init__.py +0 -0
  194. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/__main__.py +0 -0
  195. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/classifier.py +0 -0
  196. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/dispatcher.py +0 -0
  197. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/rules.py +0 -0
  198. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/classifier/signal.py +0 -0
  199. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/__init__.py +0 -0
  200. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/_dotenv.py +0 -0
  201. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/_settings.py +0 -0
  202. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/doctor.py +0 -0
  203. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/harness_files/__init__.py +0 -0
  204. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  205. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/harness_files/_paths.py +0 -0
  206. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/local_detect.py +0 -0
  207. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/config/migrate.py +0 -0
  208. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/consultant.py +0 -0
  209. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/context_recovery.py +0 -0
  210. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/drydock_states.py +0 -0
  211. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/hooks.py +0 -0
  212. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/__init__.py +0 -0
  213. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/anthropic.py +0 -0
  214. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/base.py +0 -0
  215. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/factory.py +0 -0
  216. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/generic.py +0 -0
  217. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/mistral.py +0 -0
  218. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  219. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/backend/vertex.py +0 -0
  220. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/exceptions.py +0 -0
  221. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/format.py +0 -0
  222. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/message_utils.py +0 -0
  223. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/llm/types.py +0 -0
  224. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/logger.py +0 -0
  225. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/middleware.py +0 -0
  226. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/output_formatters.py +0 -0
  227. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/__init__.py +0 -0
  228. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/_drydock_home.py +0 -0
  229. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/_local_config_walk.py +0 -0
  230. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/paths/conventions.py +0 -0
  231. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/plan_session.py +0 -0
  232. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/plugins.py +0 -0
  233. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/programmatic.py +0 -0
  234. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/__init__.py +0 -0
  235. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/builder.md +0 -0
  236. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/cli.md +0 -0
  237. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/compact.md +0 -0
  238. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/dangerous_directory.md +0 -0
  239. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/diagnostic.md +0 -0
  240. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/explore.md +0 -0
  241. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/gemma4.md +0 -0
  242. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/planner.md +0 -0
  243. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/project_context.md +0 -0
  244. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/prompts/tests.md +0 -0
  245. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/proxy_setup.py +0 -0
  246. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/agent_memory.py +0 -0
  247. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/checkpoints.py +0 -0
  248. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/session_loader.py +0 -0
  249. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/session_logger.py +0 -0
  250. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/session_migration.py +0 -0
  251. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session/state_file.py +0 -0
  252. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/session_checker.py +0 -0
  253. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/__init__.py +0 -0
  254. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/manager.py +0 -0
  255. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/models.py +0 -0
  256. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/skills/parser.py +0 -0
  257. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/slug.py +0 -0
  258. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/steering_hook.py +0 -0
  259. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/system_prompt.py +0 -0
  260. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/telemetry/__init__.py +0 -0
  261. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/telemetry/send.py +0 -0
  262. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/errors.py +0 -0
  263. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/git.py +0 -0
  264. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/nuage.py +0 -0
  265. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/teleport.py +0 -0
  266. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/teleport/types.py +0 -0
  267. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/base.py +0 -0
  268. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/_task_manager.py +0 -0
  269. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  270. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/bash.py +0 -0
  271. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/cron.py +0 -0
  272. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  273. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/glob_tool.py +0 -0
  274. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/grep.py +0 -0
  275. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  276. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/lsp.py +0 -0
  277. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  278. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  279. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/powershell.py +0 -0
  280. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  281. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  282. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  283. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  284. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  285. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  286. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  287. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  288. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  289. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  290. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  291. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  292. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  293. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  294. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  295. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/task.md +0 -0
  296. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  297. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  298. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  299. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  300. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  301. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  302. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  303. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/read_file.py +0 -0
  304. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/retrieve.py +0 -0
  305. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/search_replace.py +0 -0
  306. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/task.py +0 -0
  307. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/todo.py +0 -0
  308. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/tool_search.py +0 -0
  309. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/webfetch.py +0 -0
  310. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/websearch.py +0 -0
  311. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/worktree.py +0 -0
  312. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/builtins/write_file.py +0 -0
  313. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/injection_guard.py +0 -0
  314. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/manager.py +0 -0
  315. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp/__init__.py +0 -0
  316. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp/registry.py +0 -0
  317. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp/tools.py +0 -0
  318. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/mcp_sampling.py +0 -0
  319. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/ui.py +0 -0
  320. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/tools/utils.py +0 -0
  321. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/trusted_folders.py +0 -0
  322. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/types.py +0 -0
  323. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/core/utils.py +0 -0
  324. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/__init__.py +0 -0
  325. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/__main__.py +0 -0
  326. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/code_indexer.py +0 -0
  327. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/retriever.py +0 -0
  328. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/storage.py +0 -0
  329. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/graphrag/text_indexer.py +0 -0
  330. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/__init__.py +0 -0
  331. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/base.py +0 -0
  332. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/onboarding.tcss +0 -0
  333. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/__init__.py +0 -0
  334. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/api_key.py +0 -0
  335. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/choice.py +0 -0
  336. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/local_model.py +0 -0
  337. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/onboarding/screens/welcome.py +0 -0
  338. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  339. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  340. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/__init__.py +0 -0
  341. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/api-design/SKILL.md +0 -0
  342. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/audit-tests/SKILL.md +0 -0
  343. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/batch/SKILL.md +0 -0
  344. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/commit-code/SKILL.md +0 -0
  345. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/context-summary/SKILL.md +0 -0
  346. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/create-presentation/SKILL.md +0 -0
  347. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/deep-research/SKILL.md +0 -0
  348. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/deploy/SKILL.md +0 -0
  349. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/diff-review/SKILL.md +0 -0
  350. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/doc-gen/SKILL.md +0 -0
  351. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/explain-code/SKILL.md +0 -0
  352. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/explore-code/SKILL.md +0 -0
  353. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/fix-issue/SKILL.md +0 -0
  354. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/git-ops/SKILL.md +0 -0
  355. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/init-project/SKILL.md +0 -0
  356. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/investigate/SKILL.md +0 -0
  357. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/loop/SKILL.md +0 -0
  358. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/migrate/SKILL.md +0 -0
  359. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/perf-analyze/SKILL.md +0 -0
  360. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/plan-impl/SKILL.md +0 -0
  361. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/pr-review/SKILL.md +0 -0
  362. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/refactor/SKILL.md +0 -0
  363. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/regex-help/SKILL.md +0 -0
  364. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/review/SKILL.md +0 -0
  365. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/security-review/SKILL.md +0 -0
  366. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/ship/SKILL.md +0 -0
  367. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/simplify/SKILL.md +0 -0
  368. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/strong-tests/SKILL.md +0 -0
  369. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/skills/test-verify/SKILL.md +0 -0
  370. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/__init__.py +0 -0
  371. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/__main__.py +0 -0
  372. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/applier.py +0 -0
  373. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/config.py +0 -0
  374. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/registry.py +0 -0
  375. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sandbox.py +0 -0
  376. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/__init__.py +0 -0
  377. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/header_parser.py +0 -0
  378. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/hooks.py +0 -0
  379. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/loader.py +0 -0
  380. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/sidecar/server.py +0 -0
  381. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/__init__.py +0 -0
  382. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/capture.py +0 -0
  383. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/compute_vector.py +0 -0
  384. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/train/extract_pairs.py +0 -0
  385. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/steering/vectors.py +0 -0
  386. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock/whats_new.md +0 -0
  387. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/drydock-acp.spec +0 -0
  388. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/flake.lock +0 -0
  389. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/flake.nix +0 -0
  390. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/outlook_draft_assistant.tar.gz +0 -0
  391. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/README.md +0 -0
  392. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/config_base.toml +0 -0
  393. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/config_best.toml +0 -0
  394. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/domain_spec.md +0 -0
  395. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/experimenter.py +0 -0
  396. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/kernel.py +0 -0
  397. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/mini_prd.md +0 -0
  398. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/mini_prompts.txt +0 -0
  399. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/proposer.py +0 -0
  400. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/research/results.tsv +0 -0
  401. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/README.md +0 -0
  402. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/admiral_probe.py +0 -0
  403. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/auto_test_loop.sh +0 -0
  404. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/monitor_test_battery.sh +0 -0
  405. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/overnight_agents_test.sh +0 -0
  406. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/test_bank.sh +0 -0
  407. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/test_full.sh +0 -0
  408. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/test_smoke.sh +0 -0
  409. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/archive/tui_test.py +0 -0
  410. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/audit_sampler.py +0 -0
  411. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/auto_generate_tests.py +0 -0
  412. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/autonomous_review.sh +0 -0
  413. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/autonomous_review_prompt.md +0 -0
  414. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/backup.sh +0 -0
  415. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/bump_version.py +0 -0
  416. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/classify_pulse.sh +0 -0
  417. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/consume_retrieval_queue.py +0 -0
  418. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/deploy_to_github.sh +0 -0
  419. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/fetch_arxiv_abstracts.py +0 -0
  420. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/gen_2000_prompts.py +0 -0
  421. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/hle_eval.py +0 -0
  422. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/hle_eval_seed.jsonl +0 -0
  423. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/llm_balancer.py +0 -0
  424. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/notify_release.py +0 -0
  425. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/perf_baseline_when_idle.sh +0 -0
  426. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/perf_sweep.py +0 -0
  427. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/poll_issues.sh +0 -0
  428. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/publish_to_pypi.sh +0 -0
  429. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/queue_top.py +0 -0
  430. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/ralph_loop.py +0 -0
  431. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/research_babysitter.sh +0 -0
  432. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown.py +0 -0
  433. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown_interactive.py +0 -0
  434. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown_suite.sh +0 -0
  435. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/shakedown_variance.sh +0 -0
  436. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/start_steering_sidecar.sh +0 -0
  437. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_babysitter.sh +0 -0
  438. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_50.txt +0 -0
  439. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_realuser.txt +0 -0
  440. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_tool_agent.txt +0 -0
  441. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  442. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_shakedown.py +0 -0
  443. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_telegram_status.py +0 -0
  444. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/stress_watcher.py +0 -0
  445. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/telegram_bot.py +0 -0
  446. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/scripts/vllm_failover.sh +0 -0
  447. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/__init__.py +0 -0
  448. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/conftest.py +0 -0
  449. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_acp.py +0 -0
  450. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_agent_thought.py +0 -0
  451. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_bash.py +0 -0
  452. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_compact_session_updates.py +0 -0
  453. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_content.py +0 -0
  454. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_initialize.py +0 -0
  455. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_list_sessions.py +0 -0
  456. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_load_session.py +0 -0
  457. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_multi_session.py +0 -0
  458. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_new_session.py +0 -0
  459. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_proxy_setup_acp.py +0 -0
  460. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_read_file.py +0 -0
  461. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_search_replace.py +0 -0
  462. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_set_config_option.py +0 -0
  463. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_set_mode.py +0 -0
  464. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_set_model.py +0 -0
  465. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_tool_call_session_update.py +0 -0
  466. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_utils.py +0 -0
  467. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/acp/test_write_file.py +0 -0
  468. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_file_indexer.py +0 -0
  469. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_fuzzy.py +0 -0
  470. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  471. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  472. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_completion_controller.py +0 -0
  473. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  474. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_slash_command_controller.py +0 -0
  475. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  476. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/__init__.py +0 -0
  477. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/data/__init__.py +0 -0
  478. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/data/fireworks.py +0 -0
  479. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/data/mistral.py +0 -0
  480. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_anthropic_adapter.py +0 -0
  481. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_backend.py +0 -0
  482. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  483. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_reasoning_adapter.py +0 -0
  484. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  485. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  486. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  487. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  488. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_bell_notifications.py +0 -0
  489. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_braille_renderer.py +0 -0
  490. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_clipboard.py +0 -0
  491. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_commands.py +0 -0
  492. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_copy_shortcuts.py +0 -0
  493. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_external_editor.py +0 -0
  494. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_no_markup_static.py +0 -0
  495. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_question_app.py +0 -0
  496. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_spinner.py +0 -0
  497. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_switching_mode.py +0 -0
  498. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  499. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  500. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_session_resume.py +0 -0
  501. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/test_ui_skill_dispatch.py +0 -0
  502. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/textual_ui/__init__.py +0 -0
  503. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/cli/textual_ui/test_session_picker.py +0 -0
  504. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/conftest.py +0 -0
  505. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_agents.py +0 -0
  506. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_auth_crypto.py +0 -0
  507. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_auth_github.py +0 -0
  508. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  509. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  510. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_config_load_dotenv.py +0 -0
  511. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_config_paths.py +0 -0
  512. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_config_resolution.py +0 -0
  513. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_file_logging.py +0 -0
  514. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_plan_session.py +0 -0
  515. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_proxy_setup.py +0 -0
  516. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_slug.py +0 -0
  517. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_telemetry_send.py +0 -0
  518. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_teleport_git.py +0 -0
  519. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_teleport_nuage.py +0 -0
  520. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_teleport_service.py +0 -0
  521. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_trusted_folders.py +0 -0
  522. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/core/test_utils.py +0 -0
  523. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/common.py +0 -0
  524. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/conftest.py +0 -0
  525. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/mock_server.py +0 -0
  526. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  527. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/test_cli_tui_streaming.py +0 -0
  528. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  529. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/fixtures/doc_qa_system_prd.md +0 -0
  530. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/__init__.py +0 -0
  531. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/mock_backend_factory.py +0 -0
  532. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/mock_entrypoint.py +0 -0
  533. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/mock/utils.py +0 -0
  534. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/onboarding/test_run_onboarding.py +0 -0
  535. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/onboarding/test_ui_onboarding.py +0 -0
  536. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/session/test_session_loader.py +0 -0
  537. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/session/test_session_logger.py +0 -0
  538. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/session/test_session_migration.py +0 -0
  539. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/conftest.py +0 -0
  540. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/test_manager.py +0 -0
  541. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/test_models.py +0 -0
  542. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/skills/test_parser.py +0 -0
  543. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  544. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  545. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  546. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  547. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  548. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  549. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  550. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  551. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  552. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  553. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  554. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  555. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  556. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  557. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  558. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  559. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  560. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  561. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  562. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  563. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  564. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  565. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  566. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  567. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  568. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  569. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  570. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  571. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  572. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  573. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  574. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  575. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  576. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  577. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  578. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  579. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  580. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  581. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  582. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  583. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  584. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  585. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  586. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  587. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  588. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  589. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  590. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  591. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  592. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  593. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  594. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  595. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  596. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  597. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  598. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  599. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  600. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  601. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  602. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  603. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/base_snapshot_test_app.py +0 -0
  604. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/conftest.py +0 -0
  605. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/snap_compare.py +0 -0
  606. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  607. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  608. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  609. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  610. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  611. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  612. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  613. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  614. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  615. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  616. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  617. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  618. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  619. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  620. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/stubs/fake_backend.py +0 -0
  621. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/stubs/fake_client.py +0 -0
  622. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/stubs/fake_tool.py +0 -0
  623. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral.py +0 -0
  624. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  625. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_intervention_outcome.py +0 -0
  626. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_phase3.py +0 -0
  627. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_proposed.py +0 -0
  628. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_session_id.py +0 -0
  629. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_admiral_struggle_dedup.py +0 -0
  630. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_auto_compact.py +0 -0
  631. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_backend.py +0 -0
  632. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_observer_streaming.py +0 -0
  633. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_stats.py +0 -0
  634. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_tasks.py +0 -0
  635. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agent_tool_call.py +0 -0
  636. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_agents.py +0 -0
  637. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_build.py +0 -0
  638. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_debug.py +0 -0
  639. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_multiagent.py +0 -0
  640. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_prd.py +0 -0
  641. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_prd_extended.py +0 -0
  642. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_tools.py +0 -0
  643. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_bank_update.py +0 -0
  644. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_build_projects.py +0 -0
  645. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_checkpoint.py +0 -0
  646. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_classifier.py +0 -0
  647. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_cli_programmatic_preload.py +0 -0
  648. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_config_migration.py +0 -0
  649. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_context_recovery.py +0 -0
  650. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_current_bugs.py +0 -0
  651. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_dispatcher.py +0 -0
  652. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_drydock_regression.py +0 -0
  653. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_drydock_tasks.py +0 -0
  654. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  655. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_full_regression.py +0 -0
  656. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_graphrag.py +0 -0
  657. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_graphrag_worked_examples.py +0 -0
  658. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_hallucinated_tool_suppression.py +0 -0
  659. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_history_manager.py +0 -0
  660. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_hle_typing.py +0 -0
  661. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_issue_fixes.py +0 -0
  662. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_local_detect.py +0 -0
  663. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_message_id.py +0 -0
  664. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_message_merging.py +0 -0
  665. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_middleware.py +0 -0
  666. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_multi_agent.py +0 -0
  667. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_read_file_not_found_listing.py +0 -0
  668. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_real_failures.py +0 -0
  669. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_real_workflow.py +0 -0
  670. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_reasoning_content.py +0 -0
  671. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_retrieval_consumer.py +0 -0
  672. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_retrieve_tool.py +0 -0
  673. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_search_replace_args_not_truncated.py +0 -0
  674. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_smoke.py +0 -0
  675. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering.py +0 -0
  676. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_capture.py +0 -0
  677. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_compute_vector.py +0 -0
  678. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_extract_pairs.py +0 -0
  679. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_hook.py +0 -0
  680. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_steering_sidecar_hooks.py +0 -0
  681. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_system_prompt.py +0 -0
  682. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_tagged_text.py +0 -0
  683. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_task_complete_nudge.py +0 -0
  684. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_tool_args.py +0 -0
  685. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncate_args_valid_json.py +0 -0
  686. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncated_arg_path_hint.py +0 -0
  687. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncated_search_replace_escalation.py +0 -0
  688. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_truncated_write_escalation.py +0 -0
  689. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_ui_external_editor.py +0 -0
  690. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_ui_input_history.py +0 -0
  691. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_user_issues.py +0 -0
  692. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_wall_of_text_rescue.py +0 -0
  693. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_workloads.py +0 -0
  694. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/test_write_file_missing_path.py +0 -0
  695. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/testbank_helpers.py +0 -0
  696. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_ask_user_question.py +0 -0
  697. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash.py +0 -0
  698. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  699. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_consec_empty_search.py +0 -0
  700. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  701. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  702. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  703. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  704. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  705. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  706. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  707. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_exit_plan_mode.py +0 -0
  708. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_grep.py +0 -0
  709. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  710. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_invoke_context.py +0 -0
  711. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  712. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_manager_get_tool_config.py +0 -0
  713. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_mcp.py +0 -0
  714. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_mcp_sampling.py +0 -0
  715. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  716. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  717. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_directory.py +0 -0
  718. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_read_file_limit_truncation.py +0 -0
  719. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_append_fallback.py +0 -0
  720. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_dir_path.py +0 -0
  721. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_empty_content.py +0 -0
  722. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_file_not_found.py +0 -0
  723. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  724. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_hard_stop.py +0 -0
  725. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_malformed_block.py +0 -0
  726. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  727. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_placeholder.py +0 -0
  728. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  729. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_task.py +0 -0
  730. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_ui_bash_execution.py +0 -0
  731. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_webfetch.py +0 -0
  732. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_websearch.py +0 -0
  733. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  734. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  735. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  736. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  737. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_do_update.py +0 -0
  738. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  739. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_github_update_gateway.py +0 -0
  740. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  741. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_ui_update_notification.py +0 -0
  742. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_update_use_case.py +0 -0
  743. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/tests/update_notifier/test_whats_new.py +0 -0
  744. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/uv.lock +0 -0
  745. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/README.md +0 -0
  746. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/cli_subcommand_dispatch.py +0 -0
  747. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/lookup.json +0 -0
  748. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/sql_parser.py +0 -0
  749. {drydock_cli-2.8.17 → drydock_cli-2.8.19}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 739611
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.17
3
+ Version: 2.8.19
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
@@ -284,7 +284,7 @@ First run creates a config at `~/.drydock/config.toml` and prompts for your prov
284
284
  - **Loop Detection**: Advisory-only detection that nudges the model away from repetitive actions without blocking.
285
285
  - **Conda/Pip Support**: Auto-approves `pip install`, `conda install`, `pytest`, and other dev commands.
286
286
  - **Bundled Skills**: Ships with skills like `create-presentation` for PowerPoint generation.
287
- - **MCP Support**: Connect Model Context Protocol servers for extended capabilities.
287
+ - **MCP Support**: Connect Model Context Protocol servers via the `/mcp` slash command or `~/.drydock/config.toml`. See [MCP Servers](#mcp-servers).
288
288
  - **Safety First**: Tool execution approval with `--dangerously-skip-permissions` for full auto-approve.
289
289
 
290
290
  ### Built-in Agents
@@ -379,14 +379,62 @@ DryDock discovers skills from:
379
379
 
380
380
  ### MCP Servers
381
381
 
382
+ DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
383
+
384
+ #### Option A — `/mcp` slash command (recommended)
385
+
386
+ Inside the TUI:
387
+
388
+ ```
389
+ /mcp # list configured servers + usage
390
+ /mcp examples # ready-to-paste examples
391
+ /mcp add stdio fetch_server uvx mcp-server-fetch
392
+ /mcp add stdio filesystem npx -y @modelcontextprotocol/server-filesystem /data
393
+ /mcp add http weather https://mcp.example.com
394
+ /mcp add streamable-http myapi https://api.example.com/mcp
395
+ /mcp remove fetch_server
396
+ ```
397
+
398
+ The command writes to `~/.drydock/config.toml`. Restart DryDock to load new servers.
399
+
400
+ #### Option B — edit `~/.drydock/config.toml` directly
401
+
402
+ Use this for advanced fields (auth headers, env-var API keys, custom timeouts, `sampling_enabled`). Three transports: `stdio`, `http`, `streamable-http`.
403
+
382
404
  ```toml
383
405
  [[mcp_servers]]
384
406
  name = "fetch_server"
385
407
  transport = "stdio"
386
408
  command = "uvx"
387
409
  args = ["mcp-server-fetch"]
410
+
411
+ [[mcp_servers]]
412
+ name = "filesystem"
413
+ transport = "stdio"
414
+ command = "npx"
415
+ args = ["-y", "@modelcontextprotocol/server-filesystem", "/data"]
416
+ env = { LOG_LEVEL = "info" }
417
+ startup_timeout_sec = 10.0
418
+ tool_timeout_sec = 60.0
419
+ sampling_enabled = true
420
+
421
+ [[mcp_servers]]
422
+ name = "github"
423
+ transport = "streamable-http"
424
+ url = "https://api.githubcopilot.com/mcp"
425
+ api_key_env = "GITHUB_TOKEN" # reads token from this env var
426
+ api_key_header = "Authorization"
427
+ api_key_format = "Bearer {token}"
428
+
429
+ [[mcp_servers]]
430
+ name = "weather"
431
+ transport = "http"
432
+ url = "https://mcp.weather.example.com"
433
+ headers = { "X-Tenant" = "drydock" }
388
434
  ```
389
435
 
436
+ Verify a server loaded by running `/help` inside the TUI and checking for `<name>__*` prefixed tools. Server errors show up in `~/.drydock/logs/`.
437
+
390
438
  ## Testing
391
439
 
392
440
  DryDock uses a **shakedown harness** (`scripts/shakedown.py`) that drives the real TUI via pexpect and judges on user-perceptible criteria — not tool-call counts.
@@ -229,7 +229,7 @@ First run creates a config at `~/.drydock/config.toml` and prompts for your prov
229
229
  - **Loop Detection**: Advisory-only detection that nudges the model away from repetitive actions without blocking.
230
230
  - **Conda/Pip Support**: Auto-approves `pip install`, `conda install`, `pytest`, and other dev commands.
231
231
  - **Bundled Skills**: Ships with skills like `create-presentation` for PowerPoint generation.
232
- - **MCP Support**: Connect Model Context Protocol servers for extended capabilities.
232
+ - **MCP Support**: Connect Model Context Protocol servers via the `/mcp` slash command or `~/.drydock/config.toml`. See [MCP Servers](#mcp-servers).
233
233
  - **Safety First**: Tool execution approval with `--dangerously-skip-permissions` for full auto-approve.
234
234
 
235
235
  ### Built-in Agents
@@ -324,14 +324,62 @@ DryDock discovers skills from:
324
324
 
325
325
  ### MCP Servers
326
326
 
327
+ DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
328
+
329
+ #### Option A — `/mcp` slash command (recommended)
330
+
331
+ Inside the TUI:
332
+
333
+ ```
334
+ /mcp # list configured servers + usage
335
+ /mcp examples # ready-to-paste examples
336
+ /mcp add stdio fetch_server uvx mcp-server-fetch
337
+ /mcp add stdio filesystem npx -y @modelcontextprotocol/server-filesystem /data
338
+ /mcp add http weather https://mcp.example.com
339
+ /mcp add streamable-http myapi https://api.example.com/mcp
340
+ /mcp remove fetch_server
341
+ ```
342
+
343
+ The command writes to `~/.drydock/config.toml`. Restart DryDock to load new servers.
344
+
345
+ #### Option B — edit `~/.drydock/config.toml` directly
346
+
347
+ Use this for advanced fields (auth headers, env-var API keys, custom timeouts, `sampling_enabled`). Three transports: `stdio`, `http`, `streamable-http`.
348
+
327
349
  ```toml
328
350
  [[mcp_servers]]
329
351
  name = "fetch_server"
330
352
  transport = "stdio"
331
353
  command = "uvx"
332
354
  args = ["mcp-server-fetch"]
355
+
356
+ [[mcp_servers]]
357
+ name = "filesystem"
358
+ transport = "stdio"
359
+ command = "npx"
360
+ args = ["-y", "@modelcontextprotocol/server-filesystem", "/data"]
361
+ env = { LOG_LEVEL = "info" }
362
+ startup_timeout_sec = 10.0
363
+ tool_timeout_sec = 60.0
364
+ sampling_enabled = true
365
+
366
+ [[mcp_servers]]
367
+ name = "github"
368
+ transport = "streamable-http"
369
+ url = "https://api.githubcopilot.com/mcp"
370
+ api_key_env = "GITHUB_TOKEN" # reads token from this env var
371
+ api_key_header = "Authorization"
372
+ api_key_format = "Bearer {token}"
373
+
374
+ [[mcp_servers]]
375
+ name = "weather"
376
+ transport = "http"
377
+ url = "https://mcp.weather.example.com"
378
+ headers = { "X-Tenant" = "drydock" }
333
379
  ```
334
380
 
381
+ Verify a server loaded by running `/help` inside the TUI and checking for `<name>__*` prefixed tools. Server errors show up in `~/.drydock/logs/`.
382
+
335
383
  ## Testing
336
384
 
337
385
  DryDock uses a **shakedown harness** (`scripts/shakedown.py`) that drives the real TUI via pexpect and judges on user-perceptible criteria — not tool-call counts.
@@ -80,6 +80,9 @@ A sovereign AI system that:
80
80
  - Learns customer-specific knowledge
81
81
  - Performs coding and reasoning tasks autonomously
82
82
  - Self-diagnoses failures (Admiral) and self-improves (MetaHarness, evaluator)
83
+ - **Operates with engineered curiosity** — actively detects its own gaps,
84
+ retrieves before asserting, ingests unfamiliar context, and treats
85
+ surprise as signal worth chasing rather than noise to suppress
83
86
  - Improves continuously without phoning home
84
87
 
85
88
  ---
@@ -363,6 +366,99 @@ Already partially shipped — the system already self-observes.
363
366
 
364
367
  ---
365
368
 
369
+ ## 5.7 Curiosity Layer — engineered intellectual drive
370
+
371
+ GraphRAG, Deep Noir, and the HLE benchmark together expose a structural
372
+ weakness in Gemma 4 and most small local models: they answer from prior
373
+ when they should retrieve, plateau on familiar patterns, and treat
374
+ "unknown" as something to guess past rather than something to investigate.
375
+ The Curiosity Layer is a first-class drydock directive — both a guiding
376
+ principle in the system prompt and a concrete subsystem — that converts
377
+ that weakness into a feedback loop.
378
+
379
+ **Operating definition (carries into the system prompt):**
380
+
381
+ > Curiosity is an inquisitive, often insatiable desire to understand the
382
+ > unknown — from everyday questions to scientific discovery. In drydock
383
+ > this means: when you notice a gap, you close it; when you encounter
384
+ > something unfamiliar, you investigate before asserting; when you have
385
+ > spare cycles, you explore the corpus rather than idle.
386
+
387
+ **Behaviors required of the agent (enforced via prompt + Deep Noir vector
388
+ candidate + tool wiring):**
389
+
390
+ 1. **Retrieve before answering on unfamiliar terms.** Any user message
391
+ containing a named entity, paper title, identifier, API, or symbol
392
+ not present in recent context triggers an automatic `retrieve` call
393
+ against GraphRAG before the first content token. Low-confidence
394
+ retrieval triggers a second pass against the arXiv corpus
395
+ (`/data3/arxiv_corpus/graphrag.sqlite`) instead of falling back to
396
+ `web_search`. Fixes the failure mode logged in
397
+ `project_graphrag_underused.md` (Gemma 4 defaults to web_search on
398
+ general-knowledge HLE questions).
399
+ 2. **Treat surprise as signal, not noise.** When the model's own
400
+ probability estimate disagrees with retrieved evidence, with a tool
401
+ result, or with an HLE judge verdict, the disagreement is logged to
402
+ the curiosity queue (`~/.drydock/dispatch/curiosity.jsonl`) and
403
+ surfaces in the next overnight `autonomous_review` tick as a
404
+ candidate for: GraphRAG ingest, prompt refinement, Deep Noir vector
405
+ training data, or LoRA candidate.
406
+ 3. **Investigate before asking.** When the user request is
407
+ under-specified, the agent first reads the project (Glob + Read on
408
+ plausible files, `retrieve` against GraphRAG) and proposes a
409
+ concrete interpretation. `ask_user_question` only fires after at
410
+ least one investigation pass — never as a first move on ambiguity.
411
+ 4. **Explore on idle.** When drydock is idle for > N minutes and the
412
+ classifier dispatch queues are non-empty, the agent runs a single
413
+ exploratory cycle: pick the highest-priority pattern, ingest fresh
414
+ logs into GraphRAG, generate one hypothesis, log to
415
+ `~/.drydock/curiosity_log.md`. Bounded by a tokens-per-day budget
416
+ so curiosity does not starve user work.
417
+ 5. **Open mindset on conflict.** When new evidence contradicts a
418
+ previously asserted answer, the agent prefers the new evidence and
419
+ issues a correction in the same turn. Extends the existing
420
+ "Retrieval vs. Prior" guidance in §10 into an active rule.
421
+
422
+ **Curiosity subsystem deliverables (Phase 3, alongside Deep Noir):**
423
+
424
+ - `drydock.curiosity` module — gap detector, surprise scorer, dispatch
425
+ writer. Reuses classifier infrastructure from §5.6.
426
+ - `~/.drydock/dispatch/curiosity.jsonl` queue + consumer wired into
427
+ `autonomous_review.sh`.
428
+ - System-prompt section embedding the five behaviors above, kept short
429
+ enough for Gemma 4's 20-line prompt budget (`gemma4.md`).
430
+ - Deep Noir vector candidate: "exploration" mode — bias toward retrieval,
431
+ hypothesis enumeration, and reading-before-writing. Trained from
432
+ curiosity-log traces once Deep Noir vector training lands.
433
+ - HLE/eval integration: every HLE failure where the judge reasoning
434
+ contains "no answer extracted" or "incorrect prior" is auto-enqueued
435
+ as a curiosity item — the eval becomes a growth signal, not just
436
+ a scoreboard.
437
+
438
+ **Anti-patterns explicitly forbidden:**
439
+
440
+ - Curiosity does **not** mean asking the user more questions. The
441
+ default is to investigate, not interrogate.
442
+ - Curiosity does **not** override the "advisory-only" rule. Exploration
443
+ cycles never block user work; they consume idle cycles only.
444
+ - Curiosity must **not** become rumination — the tokens-per-day budget
445
+ exists specifically to prevent endless exploration loops on a single
446
+ unfamiliar term.
447
+
448
+ **Acceptance criteria:**
449
+
450
+ - `retrieve` is called on ≥ 80 % of HLE questions before any content
451
+ token (measured via execution traces, Phase 3).
452
+ - `~/.drydock/dispatch/curiosity.jsonl` accumulates ≥ 10 items per
453
+ active week without operator priming.
454
+ - `autonomous_review` ships ≥ 1 prompt/AGENTS.md/vector update per week
455
+ that originated from a curiosity-queue item (not a stress-run signal).
456
+ - HLE general-knowledge category score lifts measurably vs. the
457
+ May 2026 baseline (1/20 = 5 %, 18/20 "empty"); target ≥ 25 %
458
+ in Phase 3, ≥ 40 % in Phase 4.
459
+
460
+ ---
461
+
366
462
  # 6. Adaptive Failure Logic
367
463
 
368
464
  ```text
@@ -383,6 +479,18 @@ If loops detected:
383
479
  → loop-break sampling (temp+0.3/0.5, freq_pen 0.4–0.7, fresh seed)
384
480
  → planner reset + diversity strategy
385
481
  → only escalates to FORCE_STOP on pure no-op duplicates
482
+
483
+ If unfamiliar term / named entity / identifier in user input:
484
+ → mandatory retrieve pass (GraphRAG, then arXiv corpus)
485
+ → web_search only after both local retrievers return low confidence
486
+
487
+ If model output contradicts retrieved evidence / tool result / judge verdict:
488
+ → log to ~/.drydock/dispatch/curiosity.jsonl
489
+ → autonomous_review picks it up next tick as ingest / prompt / vector candidate
490
+
491
+ If idle > N minutes AND classifier queues non-empty:
492
+ → one exploratory cycle (bounded by tokens-per-day budget)
493
+ → ingest, hypothesis, curiosity_log entry — never a user-visible action
386
494
  ```
387
495
 
388
496
  All logic is **advisory-first**. Hard stops are reserved for objectively useless
@@ -551,6 +659,9 @@ mitigates several of the failure classes already in `MODEL_SHORTCOMINGS.md`.
551
659
  | Customer cloud dependency | −70 % | Brand promise, qualitative |
552
660
  | Task completion rate (interactive) | +35 % | Current shakedown baseline |
553
661
  | SWE-bench file match | maintain ≥70 % | 70 % current |
662
+ | `retrieve` calls before content (HLE) | ≥80 % | <5 % observed May 2026 |
663
+ | Curiosity-queue items shipped / week | ≥1 | 0 — queue not built yet |
664
+ | HLE general-knowledge score | ≥25 % Phase 3, ≥40 % Phase 4 | 5 % (1/20 May 2026) |
554
665
 
555
666
  Metrics with "TBD" baselines are explicitly required to be **measured** before
556
667
  Phase 2 begins, not estimated.
@@ -125,6 +125,15 @@ class CommandRegistry:
125
125
  "/steering off | /steering list).",
126
126
  handler="_steering_command",
127
127
  ),
128
+ "mcp": Command(
129
+ aliases=frozenset(["/mcp"]),
130
+ description="Configure MCP servers in ~/.drydock/config.toml "
131
+ "(usage: /mcp | /mcp add stdio <name> <cmd...> | "
132
+ "/mcp add http <name> <url> | "
133
+ "/mcp add streamable-http <name> <url> | "
134
+ "/mcp remove <name> | /mcp examples).",
135
+ handler="_mcp_command",
136
+ ),
128
137
  }
129
138
 
130
139
  for command in excluded_commands:
@@ -421,20 +421,46 @@ class DrydockApp(App): # noqa: PLR0904
421
421
  input_widget.value = ""
422
422
 
423
423
  if self._agent_running:
424
- # Queue the message join rapid-fire inputs (multi-line paste)
425
- if not hasattr(self, "_pending_messages"):
426
- self._pending_messages: list[str] = []
427
- import time
428
- now = time.time()
429
- last_queue_time = getattr(self, "_last_queue_time", 0)
430
- if now - last_queue_time < 0.5 and self._pending_messages:
431
- # Rapid input (< 500ms apart) = likely paste — join with newline
432
- self._pending_messages[-1] += "\n" + value
433
- else:
434
- self._pending_messages.append(value)
435
- self._last_queue_time = now
424
+ # Slash commands and bash escapes can't be folded into a running
425
+ # turn they need their own worker. Keep the end-of-turn queue
426
+ # for those. Everything else (plain text) goes straight into the
427
+ # agent's context via `queue_user_injection`, matching Claude
428
+ # Code's "type while busy" behavior: the in-flight task keeps
429
+ # running, and the model sees the new message at the next turn
430
+ # boundary without restarting.
431
+ is_command = value.startswith("/") or value.startswith("!") or (
432
+ value.startswith("&") and self.config.nuage_enabled
433
+ )
434
+
435
+ if is_command:
436
+ if not hasattr(self, "_pending_messages"):
437
+ self._pending_messages: list[str] = []
438
+ import time
439
+ now = time.time()
440
+ last_queue_time = getattr(self, "_last_queue_time", 0)
441
+ if now - last_queue_time < 0.5 and self._pending_messages:
442
+ self._pending_messages[-1] += "\n" + value
443
+ else:
444
+ self._pending_messages.append(value)
445
+ self._last_queue_time = now
446
+ preview = value[:60] + "..." if len(value) > 60 else value
447
+ self.notify(
448
+ f"Queued for after current task: \"{preview}\" "
449
+ f"({len(self._pending_messages)} pending)"
450
+ )
451
+ return
452
+
453
+ # Plain text → inject into the running agent's context. Render
454
+ # a user-message bubble immediately so the UI shows what landed,
455
+ # and notify so the user knows it didn't displace the current
456
+ # work.
457
+ self.agent_loop.queue_user_injection(value)
458
+ await self._mount_and_scroll(UserMessage(value))
436
459
  preview = value[:60] + "..." if len(value) > 60 else value
437
- self.notify(f"Queued: \"{preview}\" ({len(self._pending_messages)} pending)")
460
+ self.notify(
461
+ f"Sent to running agent: \"{preview}\" "
462
+ f"(will be picked up at the next turn)"
463
+ )
438
464
  return
439
465
 
440
466
  if value.startswith("!"):
@@ -1414,11 +1440,11 @@ class DrydockApp(App): # noqa: PLR0904
1414
1440
  pass
1415
1441
 
1416
1442
  # Read existing config
1417
- import tomli
1443
+ import tomllib
1418
1444
  existing = {}
1419
1445
  if config_path.exists():
1420
1446
  try:
1421
- existing = tomli.loads(config_path.read_text())
1447
+ existing = tomllib.loads(config_path.read_text())
1422
1448
  except Exception:
1423
1449
  pass
1424
1450
 
@@ -1462,6 +1488,176 @@ class DrydockApp(App): # noqa: PLR0904
1462
1488
  )
1463
1489
  )
1464
1490
 
1491
+ async def _mcp_command(self, args: str = "") -> None:
1492
+ """Configure MCP servers in ~/.drydock/config.toml."""
1493
+ import shlex
1494
+ import tomllib
1495
+ import tomli_w
1496
+
1497
+ config_path = Path.home() / ".drydock" / "config.toml"
1498
+ config_path.parent.mkdir(parents=True, exist_ok=True)
1499
+
1500
+ def _load() -> dict:
1501
+ if not config_path.exists():
1502
+ return {}
1503
+ try:
1504
+ return tomllib.loads(config_path.read_text())
1505
+ except Exception:
1506
+ return {}
1507
+
1508
+ def _save(data: dict) -> None:
1509
+ config_path.write_text(tomli_w.dumps(data))
1510
+
1511
+ def _render_servers(servers: list[dict]) -> str:
1512
+ if not servers:
1513
+ return "_(no MCP servers configured)_"
1514
+ lines = []
1515
+ for s in servers:
1516
+ name = s.get("name", "?")
1517
+ transport = s.get("transport", "?")
1518
+ if transport == "stdio":
1519
+ cmd = s.get("command", "")
1520
+ if isinstance(cmd, list):
1521
+ cmd = " ".join(cmd)
1522
+ extra = " ".join(s.get("args", []) or [])
1523
+ target = f"`{cmd} {extra}`".strip()
1524
+ else:
1525
+ target = f"`{s.get('url', '')}`"
1526
+ lines.append(f"- **{name}** ({transport}) → {target}")
1527
+ return "\n".join(lines)
1528
+
1529
+ parts = shlex.split(args) if args.strip() else []
1530
+ sub = parts[0].lower() if parts else "list"
1531
+
1532
+ if sub in ("list", ""):
1533
+ data = _load()
1534
+ servers = data.get("mcp_servers", []) or []
1535
+ msg = (
1536
+ "### MCP servers\n\n"
1537
+ f"Config: `{config_path}`\n\n"
1538
+ f"{_render_servers(servers)}\n\n"
1539
+ "**Commands:**\n"
1540
+ "- `/mcp add stdio <name> <command> [args...]`\n"
1541
+ "- `/mcp add http <name> <url>`\n"
1542
+ "- `/mcp add streamable-http <name> <url>`\n"
1543
+ "- `/mcp remove <name>`\n"
1544
+ "- `/mcp examples`\n\n"
1545
+ "_Restart Drydock after changes to load new servers._"
1546
+ )
1547
+ await self._mount_and_scroll(UserCommandMessage(msg))
1548
+ return
1549
+
1550
+ if sub == "examples":
1551
+ await self._mount_and_scroll(UserCommandMessage(
1552
+ "### MCP server examples\n\n"
1553
+ "**stdio (local process):**\n"
1554
+ "```\n"
1555
+ "/mcp add stdio filesystem npx -y "
1556
+ "@modelcontextprotocol/server-filesystem /data\n"
1557
+ "```\n\n"
1558
+ "**HTTP:**\n"
1559
+ "```\n"
1560
+ "/mcp add http weather https://mcp.example.com\n"
1561
+ "```\n\n"
1562
+ "**Streamable HTTP:**\n"
1563
+ "```\n"
1564
+ "/mcp add streamable-http myapi https://api.example.com/mcp\n"
1565
+ "```\n\n"
1566
+ "For auth headers, env-var API keys, custom timeouts, or "
1567
+ "`sampling_enabled=false`, edit `~/.drydock/config.toml` "
1568
+ "directly. Schema: `name`, `transport`, plus `command`/"
1569
+ "`args`/`env` (stdio) or `url`/`headers`/`api_key_env`/"
1570
+ "`api_key_header`/`api_key_format` (http variants)."
1571
+ ))
1572
+ return
1573
+
1574
+ if sub == "remove":
1575
+ if len(parts) < 2:
1576
+ await self._mount_and_scroll(UserCommandMessage(
1577
+ "Usage: `/mcp remove <name>`"
1578
+ ))
1579
+ return
1580
+ name = parts[1]
1581
+ data = _load()
1582
+ servers = data.get("mcp_servers", []) or []
1583
+ new_servers = [s for s in servers if s.get("name") != name]
1584
+ if len(new_servers) == len(servers):
1585
+ await self._mount_and_scroll(UserCommandMessage(
1586
+ f"No MCP server named `{name}` found."
1587
+ ))
1588
+ return
1589
+ data["mcp_servers"] = new_servers
1590
+ _save(data)
1591
+ await self._mount_and_scroll(UserCommandMessage(
1592
+ f"Removed MCP server `{name}`. Restart Drydock to apply."
1593
+ ))
1594
+ return
1595
+
1596
+ if sub == "add":
1597
+ if len(parts) < 4:
1598
+ await self._mount_and_scroll(UserCommandMessage(
1599
+ "Usage:\n"
1600
+ "- `/mcp add stdio <name> <command> [args...]`\n"
1601
+ "- `/mcp add http <name> <url>`\n"
1602
+ "- `/mcp add streamable-http <name> <url>`"
1603
+ ))
1604
+ return
1605
+ transport = parts[1].lower()
1606
+ name = parts[2]
1607
+ rest = parts[3:]
1608
+
1609
+ if transport not in ("stdio", "http", "streamable-http"):
1610
+ await self._mount_and_scroll(UserCommandMessage(
1611
+ f"Unknown transport `{transport}`. "
1612
+ "Use `stdio`, `http`, or `streamable-http`."
1613
+ ))
1614
+ return
1615
+
1616
+ entry: dict
1617
+ if transport == "stdio":
1618
+ entry = {
1619
+ "name": name,
1620
+ "transport": "stdio",
1621
+ "command": rest[0],
1622
+ "args": list(rest[1:]),
1623
+ }
1624
+ else:
1625
+ if len(rest) != 1:
1626
+ await self._mount_and_scroll(UserCommandMessage(
1627
+ f"Usage: `/mcp add {transport} <name> <url>`"
1628
+ ))
1629
+ return
1630
+ entry = {
1631
+ "name": name,
1632
+ "transport": transport,
1633
+ "url": rest[0],
1634
+ }
1635
+
1636
+ data = _load()
1637
+ servers = data.get("mcp_servers", []) or []
1638
+ servers = [s for s in servers if s.get("name") != name]
1639
+ servers.append(entry)
1640
+ data["mcp_servers"] = servers
1641
+ _save(data)
1642
+
1643
+ target = (
1644
+ f"`{entry['command']} {' '.join(entry.get('args', []))}`".strip()
1645
+ if transport == "stdio"
1646
+ else f"`{entry['url']}`"
1647
+ )
1648
+ await self._mount_and_scroll(UserCommandMessage(
1649
+ f"Added MCP server **{name}** ({transport}) → {target}\n\n"
1650
+ f"Config: `{config_path}`\n"
1651
+ "Restart Drydock to load the server. Edit the file directly "
1652
+ "for advanced fields (headers, env, api_key_env, timeouts)."
1653
+ ))
1654
+ return
1655
+
1656
+ await self._mount_and_scroll(UserCommandMessage(
1657
+ "Usage: `/mcp {list | add <transport> <name> ... | "
1658
+ "remove <name> | examples}`"
1659
+ ))
1660
+
1465
1661
  async def _admiral_apply_command(self, args: str = "") -> None:
1466
1662
  """Merge an Admiral-staged proposal branch into main."""
1467
1663
  import subprocess
@@ -224,6 +224,15 @@ class AgentLoop:
224
224
  self._empty_responses: int = 0
225
225
  self._successful_test_runs: int = 0
226
226
 
227
+ # Mid-turn user injections (the Claude Code "type while busy" feature).
228
+ # The TUI calls `queue_user_injection()` whenever the user submits a
229
+ # message while the agent is mid-task. The per-turn loop drains this
230
+ # at the top of each iteration and folds the text into context as a
231
+ # SYSTEM note attached to the last tool result (the only ordering that
232
+ # vLLM/Mistral accept after a tool turn). No locking needed — Textual's
233
+ # event loop is single-threaded asyncio, same loop the agent runs on.
234
+ self._pending_user_injections: list[str] = []
235
+
227
236
  # Shared read-file state — used by write_file / search_replace to
228
237
  # enforce Read-before-Write (per Claude Code's tool contract) and
229
238
  # by read_file to dedup unchanged-mtime re-reads. Keyed by resolved
@@ -305,6 +314,38 @@ class AgentLoop:
305
314
  def auto_approve(self) -> bool:
306
315
  return self.config.auto_approve
307
316
 
317
+ def queue_user_injection(self, text: str) -> None:
318
+ """Queue a user message to be folded into context at the next turn boundary.
319
+
320
+ Called by the TUI when the user submits a message while the agent is
321
+ already running. The injection is drained at the top of the next
322
+ per-turn iteration in `act()` and surfaced to the model as a SYSTEM
323
+ note on the last tool result so message ordering stays valid for
324
+ vLLM/Mistral.
325
+ """
326
+ cleaned = (text or "").strip()
327
+ if cleaned:
328
+ self._pending_user_injections.append(cleaned)
329
+
330
+ def _drain_user_injections(self) -> None:
331
+ """Pull any queued user messages into the current turn's context.
332
+
333
+ Folds them onto the last tool result via the same safe path as
334
+ `_inject_system_note` — never appends a fresh user-after-tool
335
+ message, which vLLM/Mistral reject.
336
+ """
337
+ if not self._pending_user_injections:
338
+ return
339
+ # Snapshot + clear so a concurrent queue append doesn't double-fire.
340
+ injections = self._pending_user_injections
341
+ self._pending_user_injections = []
342
+ for text in injections:
343
+ note = (
344
+ f"USER (typed while you were working — fold this into "
345
+ f"the current task; do not start over):\n{text}"
346
+ )
347
+ self._inject_system_note(note)
348
+
308
349
  def set_tool_permission(
309
350
  self, tool_name: str, permission: ToolPermission, save_permanently: bool = False
310
351
  ) -> None:
@@ -738,6 +779,10 @@ class AgentLoop:
738
779
  _prompt_start = time.perf_counter()
739
780
  logger.warning("[TIMING] entering conversation while loop")
740
781
  while not should_break_loop:
782
+ # Drain any user messages typed while the agent was working.
783
+ # Done BEFORE the turn counter increments and BEFORE middleware
784
+ # runs so the new context is visible to both.
785
+ self._drain_user_injections()
741
786
  # Loop protection: prevent infinite tool-call loops
742
787
  tool_turns += 1
743
788
  _wt0 = time.perf_counter()
@@ -2999,12 +3044,16 @@ class AgentLoop:
2999
3044
  # appear many times in sequence when building multi-file projects.
3000
3045
  # Record a hot-combo on the stuck tool with an empty-path marker
3001
3046
  # so the per-tool mute in _chat will remove it for 1 turn.
3002
- _productive_tools = {"write_file", "search_replace", "bash", "run_command"}
3003
- _check_1a_threshold = 8 if (tool_names and tool_names[-1] in _productive_tools) else 4
3004
- if len(tool_names) >= _check_1a_threshold:
3005
- last_n = tool_names[-_check_1a_threshold:]
3006
- if all(n == last_n[-1] for n in last_n):
3007
- self._hot_tool_path = (last_n[-1], "<stuck>")
3047
+ # Uniform threshold=8. The autonomous_review fix that lowered this to
3048
+ # 4 for exploration tools (grep/read_file/glob) addressed a misattributed
3049
+ # `harness:thinking_stall` signal — that pattern is about post-thinking
3050
+ # empty messages, handled by the empty-message nudge elsewhere — and the
3051
+ # lowered threshold broke loop_detection regression tests (4 different
3052
+ # greps or read_files is legitimate investigation, not a stuck loop).
3053
+ if len(tool_names) >= 8:
3054
+ last8 = tool_names[-8:]
3055
+ if all(n == last8[-1] for n in last8):
3056
+ self._hot_tool_path = (last8[-1], "<stuck>")
3008
3057
  return "FORCE_STOP"
3009
3058
 
3010
3059
  # Check 1c: High recent-error fraction. If ≥6 of last 10 tool
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.8.17"
3
+ version = "2.8.19"
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"