drydock-cli 2.8.44__tar.gz → 2.8.46__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 (822) hide show
  1. drydock_cli-2.8.46/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/PKG-INFO +1 -1
  3. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/commands.py +25 -0
  4. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/app.py +187 -0
  5. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agent_loop.py +148 -0
  6. drydock_cli-2.8.46/drydock/core/goal.py +147 -0
  7. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/pyproject.toml +1 -1
  8. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_api_error_recovery.py +46 -0
  9. drydock_cli-2.8.46/tests/test_goal.py +203 -0
  10. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/trip_log.md +13 -0
  11. drydock_cli-2.8.44/.auto_release.lock +0 -1
  12. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/CODEOWNERS +0 -0
  13. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  14. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  15. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/build-and-upload.yml +0 -0
  17. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/ci.yml +0 -0
  18. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/issue-labeler.yml +0 -0
  19. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.github/workflows/release.yml +0 -0
  20. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.gitignore +0 -0
  21. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.pause_stress +0 -0
  22. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.pre-commit-config.yaml +0 -0
  23. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.python-version +0 -0
  24. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.typos.toml +0 -0
  25. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.vscode/extensions.json +0 -0
  26. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.vscode/launch.json +0 -0
  27. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/.vscode/settings.json +0 -0
  28. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/AGENTS.md +0 -0
  29. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/Admiral.md +0 -0
  30. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/CHANGELOG.md +0 -0
  31. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/CLAUDE.md +0 -0
  32. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/CONTRIBUTING.md +0 -0
  33. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/DEEP_NOIR_PRD.md +0 -0
  34. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/DEPLOYMENT.md +0 -0
  35. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/DRYDOCK.md +0 -0
  36. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/HLE_PRD.md +0 -0
  37. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/JETSON_BENCH.md +0 -0
  38. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/LICENSE +0 -0
  39. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/MODEL_SHORTCOMINGS.md +0 -0
  40. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/NOTICE +0 -0
  41. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/README.md +0 -0
  42. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/SOVEREIGN_PRD.md +0 -0
  43. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/TRIAGE_v1.md +0 -0
  44. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/action.yml +0 -0
  45. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/README.md +0 -0
  46. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results1.tsv +0 -0
  47. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results13.tsv +0 -0
  48. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results14.tsv +0 -0
  49. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results15.tsv +0 -0
  50. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results16.tsv +0 -0
  51. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results17.tsv +0 -0
  52. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results18.tsv +0 -0
  53. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results19.tsv +0 -0
  54. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results2.tsv +0 -0
  55. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results20.tsv +0 -0
  56. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results3.tsv +0 -0
  57. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results4.tsv +0 -0
  58. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results5.tsv +0 -0
  59. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results6.tsv +0 -0
  60. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results7.tsv +0 -0
  61. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results8.tsv +0 -0
  62. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results9.tsv +0 -0
  63. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/baseline_history/results_evolved_v1.tsv +0 -0
  64. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/distribution/zed/LICENSE +0 -0
  65. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/distribution/zed/extension.toml +0 -0
  66. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/distribution/zed/icons/mistral_vibe.svg +0 -0
  67. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/README.md +0 -0
  68. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/acp-setup.md +0 -0
  69. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/BASELINE_412.md +0 -0
  70. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/Drydock_rebrand.md +0 -0
  71. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  72. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  73. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  74. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/PRD.md +0 -0
  75. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/drydock_terms.md +0 -0
  76. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/archive/resume.md +0 -0
  77. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/docs/proxy-setup.md +0 -0
  78. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/__init__.py +0 -0
  79. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/__main__.py +0 -0
  80. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/__init__.py +0 -0
  81. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/acp_agent_loop.py +0 -0
  82. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/acp_logger.py +0 -0
  83. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/entrypoint.py +0 -0
  84. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/__init__.py +0 -0
  85. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/base.py +0 -0
  86. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/bash.py +0 -0
  87. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/read_file.py +0 -0
  88. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/search_replace.py +0 -0
  89. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/todo.py +0 -0
  90. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/write_file.py +0 -0
  91. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/tools/session_update.py +0 -0
  92. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/acp/utils.py +0 -0
  93. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/__init__.py +0 -0
  94. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/detectors.py +0 -0
  95. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/detectors_proposed.py +0 -0
  96. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/history.py +0 -0
  97. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/interventions.py +0 -0
  98. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/llm_analyzer.py +0 -0
  99. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/metrics.py +0 -0
  100. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/opus_escalator.py +0 -0
  101. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/persistence.py +0 -0
  102. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/policy.py +0 -0
  103. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/proposer.py +0 -0
  104. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/stager.py +0 -0
  105. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/task_classifier.py +0 -0
  106. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/tuning.py +0 -0
  107. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/validator.py +0 -0
  108. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/admiral/worker.py +0 -0
  109. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/__init__.py +0 -0
  110. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/__init__.py +0 -0
  111. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/base.py +0 -0
  112. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/path_completion.py +0 -0
  113. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/autocompletion/slash_command.py +0 -0
  114. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/cli.py +0 -0
  115. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/clipboard.py +0 -0
  116. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/entrypoint.py +0 -0
  117. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/fix_windows_path.py +0 -0
  118. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/history_manager.py +0 -0
  119. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  120. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  121. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  122. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/terminal_setup.py +0 -0
  123. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/__init__.py +0 -0
  124. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  125. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/app.tcss +0 -0
  126. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/external_editor.py +0 -0
  127. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  128. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  129. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  130. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  131. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  132. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  133. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  134. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  135. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  136. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  137. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  138. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  139. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  140. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  141. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  142. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  143. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  144. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  145. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  146. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  147. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  148. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  149. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  150. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  151. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  152. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  153. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  154. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  155. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  156. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  157. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  158. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  159. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  160. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  161. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  162. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  163. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  164. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/history.py +0 -0
  165. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  166. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/state.py +0 -0
  167. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/__init__.py +0 -0
  168. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  169. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  170. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  171. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  172. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  173. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/update.py +0 -0
  174. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/cli/update_notifier/whats_new.py +0 -0
  175. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/__init__.py +0 -0
  176. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agents/__init__.py +0 -0
  177. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agents/manager.py +0 -0
  178. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/agents/models.py +0 -0
  179. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auth/__init__.py +0 -0
  180. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auth/crypto.py +0 -0
  181. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auth/github.py +0 -0
  182. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/auto_solve.py +0 -0
  183. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/__init__.py +0 -0
  184. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/completers.py +0 -0
  185. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  186. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  187. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  188. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  189. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  190. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/fuzzy.py +0 -0
  191. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/path_prompt.py +0 -0
  192. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  193. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/build_orchestrator.py +0 -0
  194. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/checkpoint.py +0 -0
  195. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/__init__.py +0 -0
  196. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/__main__.py +0 -0
  197. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/classifier.py +0 -0
  198. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/dispatcher.py +0 -0
  199. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/rules.py +0 -0
  200. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/classifier/signal.py +0 -0
  201. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/__init__.py +0 -0
  202. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/_dotenv.py +0 -0
  203. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/_settings.py +0 -0
  204. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/doctor.py +0 -0
  205. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/harness_files/__init__.py +0 -0
  206. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  207. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/harness_files/_paths.py +0 -0
  208. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/local_detect.py +0 -0
  209. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/config/migrate.py +0 -0
  210. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/constraint_extract.py +0 -0
  211. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/constraint_hint.py +0 -0
  212. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/consultant.py +0 -0
  213. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/context_recovery.py +0 -0
  214. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/drydock_states.py +0 -0
  215. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/hooks.py +0 -0
  216. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/__init__.py +0 -0
  217. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/anthropic.py +0 -0
  218. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/base.py +0 -0
  219. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/factory.py +0 -0
  220. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/generic.py +0 -0
  221. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/mistral.py +0 -0
  222. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  223. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/backend/vertex.py +0 -0
  224. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/exceptions.py +0 -0
  225. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/format.py +0 -0
  226. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/message_utils.py +0 -0
  227. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/llm/types.py +0 -0
  228. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/logger.py +0 -0
  229. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/middleware.py +0 -0
  230. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/output_formatters.py +0 -0
  231. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/__init__.py +0 -0
  232. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/_drydock_home.py +0 -0
  233. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/_local_config_walk.py +0 -0
  234. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/paths/conventions.py +0 -0
  235. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/plan_session.py +0 -0
  236. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/plugins.py +0 -0
  237. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/programmatic.py +0 -0
  238. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/__init__.py +0 -0
  239. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/builder.md +0 -0
  240. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/cli.md +0 -0
  241. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/compact.md +0 -0
  242. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/dangerous_directory.md +0 -0
  243. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/diagnostic.md +0 -0
  244. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/explore.md +0 -0
  245. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/gemma4.md +0 -0
  246. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/planner.md +0 -0
  247. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/project_context.md +0 -0
  248. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/prompts/tests.md +0 -0
  249. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/proxy_setup.py +0 -0
  250. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/agent_memory.py +0 -0
  251. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/checkpoints.py +0 -0
  252. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/session_loader.py +0 -0
  253. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/session_logger.py +0 -0
  254. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/session_migration.py +0 -0
  255. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session/state_file.py +0 -0
  256. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/session_checker.py +0 -0
  257. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/__init__.py +0 -0
  258. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/manager.py +0 -0
  259. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/models.py +0 -0
  260. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/skills/parser.py +0 -0
  261. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/slug.py +0 -0
  262. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/steering_hook.py +0 -0
  263. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/system_prompt.py +0 -0
  264. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/telemetry/__init__.py +0 -0
  265. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/telemetry/send.py +0 -0
  266. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/errors.py +0 -0
  267. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/git.py +0 -0
  268. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/nuage.py +0 -0
  269. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/teleport.py +0 -0
  270. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/teleport/types.py +0 -0
  271. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/base.py +0 -0
  272. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/_task_manager.py +0 -0
  273. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  274. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  275. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/bash.py +0 -0
  276. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  277. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/count_tool.py +0 -0
  278. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/cron.py +0 -0
  279. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  280. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/glob_tool.py +0 -0
  281. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/grep.py +0 -0
  282. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  283. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  284. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/logic_tool.py +0 -0
  285. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/lsp.py +0 -0
  286. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/math_tool.py +0 -0
  287. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  288. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/memory_tool.py +0 -0
  289. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  290. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  291. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/powershell.py +0 -0
  292. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  293. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  294. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  295. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  296. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  297. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  298. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  299. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  300. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  301. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  302. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  303. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  304. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  305. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  306. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  307. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/task.md +0 -0
  308. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  309. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  310. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  311. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  312. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  313. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  314. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  315. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/read_file.py +0 -0
  316. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/retrieve.py +0 -0
  317. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/search_replace.py +0 -0
  318. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/set_tool.py +0 -0
  319. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/solve_tool.py +0 -0
  320. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/stats_tool.py +0 -0
  321. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/task.py +0 -0
  322. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/todo.py +0 -0
  323. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/tool_search.py +0 -0
  324. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/units_tool.py +0 -0
  325. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/verify_tool.py +0 -0
  326. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/webfetch.py +0 -0
  327. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/websearch.py +0 -0
  328. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/worktree.py +0 -0
  329. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/builtins/write_file.py +0 -0
  330. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/injection_guard.py +0 -0
  331. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/manager.py +0 -0
  332. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp/__init__.py +0 -0
  333. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp/registry.py +0 -0
  334. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp/tools.py +0 -0
  335. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/mcp_sampling.py +0 -0
  336. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/ui.py +0 -0
  337. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/tools/utils.py +0 -0
  338. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/trusted_folders.py +0 -0
  339. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/types.py +0 -0
  340. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/core/utils.py +0 -0
  341. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/__init__.py +0 -0
  342. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/__main__.py +0 -0
  343. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/gap_detector.py +0 -0
  344. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/item.py +0 -0
  345. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/queue.py +0 -0
  346. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/curiosity/surprise.py +0 -0
  347. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/__init__.py +0 -0
  348. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/__main__.py +0 -0
  349. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/code_indexer.py +0 -0
  350. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/retriever.py +0 -0
  351. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/storage.py +0 -0
  352. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/graphrag/text_indexer.py +0 -0
  353. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/__init__.py +0 -0
  354. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/base.py +0 -0
  355. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/onboarding.tcss +0 -0
  356. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/__init__.py +0 -0
  357. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/api_key.py +0 -0
  358. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/choice.py +0 -0
  359. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/local_model.py +0 -0
  360. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/welcome.py +0 -0
  361. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  362. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  363. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/__init__.py +0 -0
  364. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/api-design/SKILL.md +0 -0
  365. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/audit-tests/SKILL.md +0 -0
  366. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/batch/SKILL.md +0 -0
  367. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/commit-code/SKILL.md +0 -0
  368. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  369. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/context-summary/SKILL.md +0 -0
  370. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/create-presentation/SKILL.md +0 -0
  371. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/deep-research/SKILL.md +0 -0
  372. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/deploy/SKILL.md +0 -0
  373. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/diff-review/SKILL.md +0 -0
  374. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/doc-gen/SKILL.md +0 -0
  375. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/explain-code/SKILL.md +0 -0
  376. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/explore-code/SKILL.md +0 -0
  377. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/fix-issue/SKILL.md +0 -0
  378. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/git-ops/SKILL.md +0 -0
  379. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/init-project/SKILL.md +0 -0
  380. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/investigate/SKILL.md +0 -0
  381. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/logic/SKILL.md +0 -0
  382. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  383. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/loop/SKILL.md +0 -0
  384. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/migrate/SKILL.md +0 -0
  385. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/perf-analyze/SKILL.md +0 -0
  386. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/plan-impl/SKILL.md +0 -0
  387. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/pr-review/SKILL.md +0 -0
  388. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/prove/SKILL.md +0 -0
  389. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/refactor/SKILL.md +0 -0
  390. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/regex-help/SKILL.md +0 -0
  391. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/review/SKILL.md +0 -0
  392. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/security-review/SKILL.md +0 -0
  393. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/ship/SKILL.md +0 -0
  394. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/simplify/SKILL.md +0 -0
  395. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/strong-tests/SKILL.md +0 -0
  396. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/skills/test-verify/SKILL.md +0 -0
  397. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/__init__.py +0 -0
  398. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/__main__.py +0 -0
  399. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/applier.py +0 -0
  400. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/config.py +0 -0
  401. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/registry.py +0 -0
  402. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sandbox.py +0 -0
  403. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/__init__.py +0 -0
  404. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/header_parser.py +0 -0
  405. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/hooks.py +0 -0
  406. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/loader.py +0 -0
  407. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/sidecar/server.py +0 -0
  408. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/__init__.py +0 -0
  409. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/capture.py +0 -0
  410. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/compute_vector.py +0 -0
  411. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/extract_pairs.py +0 -0
  412. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/train/scan_sessions.py +0 -0
  413. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/steering/vectors.py +0 -0
  414. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock/whats_new.md +0 -0
  415. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/drydock-acp.spec +0 -0
  416. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/flake.lock +0 -0
  417. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/flake.nix +0 -0
  418. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/outlook_draft_assistant.tar.gz +0 -0
  419. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/README.md +0 -0
  420. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/config_base.toml +0 -0
  421. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/config_best.toml +0 -0
  422. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
  423. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
  424. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/domain_spec.md +0 -0
  425. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/experimenter.py +0 -0
  426. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/kernel.py +0 -0
  427. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/mini_prd.md +0 -0
  428. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/mini_prompts.txt +0 -0
  429. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/proposer.py +0 -0
  430. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/research/results.tsv +0 -0
  431. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/resume.md +0 -0
  432. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/README.md +0 -0
  433. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/admiral_probe.py +0 -0
  434. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/auto_test_loop.sh +0 -0
  435. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/monitor_test_battery.sh +0 -0
  436. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/overnight_agents_test.sh +0 -0
  437. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/test_bank.sh +0 -0
  438. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/test_full.sh +0 -0
  439. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/test_smoke.sh +0 -0
  440. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/archive/tui_test.py +0 -0
  441. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/audit_sampler.py +0 -0
  442. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/auto_generate_tests.py +0 -0
  443. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/auto_release.sh +0 -0
  444. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/auto_solve_audit.py +0 -0
  445. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/autonomous_review.sh +0 -0
  446. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/autonomous_review_prompt.md +0 -0
  447. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/backfill_hle_curiosity.py +0 -0
  448. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/backup.sh +0 -0
  449. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/bench_inference.py +0 -0
  450. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/bump_version.py +0 -0
  451. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/classify_pulse.sh +0 -0
  452. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/consume_retrieval_queue.py +0 -0
  453. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/curiosity_idle_cycle.sh +0 -0
  454. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/dedupe_dispatch_queues.py +0 -0
  455. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/deploy_to_github.sh +0 -0
  456. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/dispatch_report.py +0 -0
  457. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/drydock_status.sh +0 -0
  458. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/fetch_arxiv_abstracts.py +0 -0
  459. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/gen_2000_prompts.py +0 -0
  460. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_aggregate.py +0 -0
  461. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_babysitter.sh +0 -0
  462. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_burndown.sh +0 -0
  463. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_burndown_keepalive.sh +0 -0
  464. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_burndown_status.py +0 -0
  465. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_eval.py +0 -0
  466. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/hle_eval_seed.jsonl +0 -0
  467. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/llm_balancer.py +0 -0
  468. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/notify_release.py +0 -0
  469. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/perf_baseline_when_idle.sh +0 -0
  470. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/perf_sweep.py +0 -0
  471. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/poll_issues.sh +0 -0
  472. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/publish_to_pypi.sh +0 -0
  473. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/queue_top.py +0 -0
  474. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/ralph_loop.py +0 -0
  475. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/rejudge_hle.py +0 -0
  476. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/research_babysitter.sh +0 -0
  477. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown.py +0 -0
  478. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown_interactive.py +0 -0
  479. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown_suite.sh +0 -0
  480. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/shakedown_variance.sh +0 -0
  481. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/start_steering_sidecar.sh +0 -0
  482. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_babysitter.sh +0 -0
  483. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_50.txt +0 -0
  484. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_realuser.txt +0 -0
  485. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_tool_agent.txt +0 -0
  486. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  487. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_shakedown.py +0 -0
  488. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_telegram_status.py +0 -0
  489. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/stress_watcher.py +0 -0
  490. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/telegram_bot.py +0 -0
  491. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/tool_usage_report.py +0 -0
  492. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/scripts/vllm_failover.sh +0 -0
  493. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/__init__.py +0 -0
  494. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/conftest.py +0 -0
  495. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_acp.py +0 -0
  496. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_agent_thought.py +0 -0
  497. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_bash.py +0 -0
  498. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_compact_session_updates.py +0 -0
  499. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_content.py +0 -0
  500. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_initialize.py +0 -0
  501. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_list_sessions.py +0 -0
  502. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_load_session.py +0 -0
  503. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_multi_session.py +0 -0
  504. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_new_session.py +0 -0
  505. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_proxy_setup_acp.py +0 -0
  506. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_read_file.py +0 -0
  507. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_search_replace.py +0 -0
  508. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_set_config_option.py +0 -0
  509. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_set_mode.py +0 -0
  510. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_set_model.py +0 -0
  511. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_tool_call_session_update.py +0 -0
  512. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_utils.py +0 -0
  513. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/acp/test_write_file.py +0 -0
  514. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_file_indexer.py +0 -0
  515. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_fuzzy.py +0 -0
  516. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  517. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  518. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completion_controller.py +0 -0
  519. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  520. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_slash_command_controller.py +0 -0
  521. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  522. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/__init__.py +0 -0
  523. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/data/__init__.py +0 -0
  524. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/data/fireworks.py +0 -0
  525. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/data/mistral.py +0 -0
  526. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_anthropic_adapter.py +0 -0
  527. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_backend.py +0 -0
  528. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  529. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_reasoning_adapter.py +0 -0
  530. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  531. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  532. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  533. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  534. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_bell_notifications.py +0 -0
  535. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_braille_renderer.py +0 -0
  536. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_clipboard.py +0 -0
  537. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_commands.py +0 -0
  538. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_copy_shortcuts.py +0 -0
  539. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_external_editor.py +0 -0
  540. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_no_markup_static.py +0 -0
  541. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_question_app.py +0 -0
  542. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_spinner.py +0 -0
  543. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_switching_mode.py +0 -0
  544. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  545. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  546. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_session_resume.py +0 -0
  547. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/test_ui_skill_dispatch.py +0 -0
  548. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/textual_ui/__init__.py +0 -0
  549. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/cli/textual_ui/test_session_picker.py +0 -0
  550. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/conftest.py +0 -0
  551. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_agents.py +0 -0
  552. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_auth_crypto.py +0 -0
  553. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_auth_github.py +0 -0
  554. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  555. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  556. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_config_load_dotenv.py +0 -0
  557. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_config_paths.py +0 -0
  558. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_config_resolution.py +0 -0
  559. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_file_logging.py +0 -0
  560. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_plan_session.py +0 -0
  561. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_proxy_setup.py +0 -0
  562. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_slug.py +0 -0
  563. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_telemetry_send.py +0 -0
  564. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_teleport_git.py +0 -0
  565. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_teleport_nuage.py +0 -0
  566. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_teleport_service.py +0 -0
  567. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_trusted_folders.py +0 -0
  568. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/core/test_utils.py +0 -0
  569. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/common.py +0 -0
  570. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/conftest.py +0 -0
  571. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/mock_server.py +0 -0
  572. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  573. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_streaming.py +0 -0
  574. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  575. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/fixtures/doc_qa_system_prd.md +0 -0
  576. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/__init__.py +0 -0
  577. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/mock_backend_factory.py +0 -0
  578. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/mock_entrypoint.py +0 -0
  579. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/mock/utils.py +0 -0
  580. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/onboarding/test_run_onboarding.py +0 -0
  581. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/onboarding/test_ui_onboarding.py +0 -0
  582. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/session/test_session_loader.py +0 -0
  583. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/session/test_session_logger.py +0 -0
  584. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/session/test_session_migration.py +0 -0
  585. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/conftest.py +0 -0
  586. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/test_manager.py +0 -0
  587. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/test_models.py +0 -0
  588. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/skills/test_parser.py +0 -0
  589. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  590. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  591. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  592. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  593. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  594. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  595. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  596. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  597. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  598. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  599. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  600. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  601. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  602. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  603. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  604. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  605. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  606. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  607. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  608. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  609. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  610. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  611. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  612. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  613. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  614. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  615. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  616. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  617. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  618. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  619. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  620. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  621. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  622. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  623. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  624. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  625. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  626. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  627. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  628. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  629. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  630. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  631. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  632. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  633. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  634. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  635. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  636. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  637. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  638. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  639. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  640. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  641. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  642. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  643. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  644. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  645. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  646. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  647. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  648. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  649. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/base_snapshot_test_app.py +0 -0
  650. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/conftest.py +0 -0
  651. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/snap_compare.py +0 -0
  652. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  653. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  654. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  655. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  656. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  657. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  658. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  659. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  660. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  661. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  662. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  663. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  664. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  665. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  666. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/stubs/fake_backend.py +0 -0
  667. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/stubs/fake_client.py +0 -0
  668. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/stubs/fake_tool.py +0 -0
  669. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral.py +0 -0
  670. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  671. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_intervention_outcome.py +0 -0
  672. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_phase3.py +0 -0
  673. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_proposed.py +0 -0
  674. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_session_id.py +0 -0
  675. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_admiral_struggle_dedup.py +0 -0
  676. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_auto_compact.py +0 -0
  677. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_backend.py +0 -0
  678. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_observer_streaming.py +0 -0
  679. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_stats.py +0 -0
  680. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_tasks.py +0 -0
  681. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agent_tool_call.py +0 -0
  682. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_agents.py +0 -0
  683. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_algebra_tool.py +0 -0
  684. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  685. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_auto_solve.py +0 -0
  686. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_build.py +0 -0
  687. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_debug.py +0 -0
  688. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_multiagent.py +0 -0
  689. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_prd.py +0 -0
  690. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_prd_extended.py +0 -0
  691. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_tools.py +0 -0
  692. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_bank_update.py +0 -0
  693. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_build_projects.py +0 -0
  694. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_checkpoint.py +0 -0
  695. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_chemistry_tool.py +0 -0
  696. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_classifier.py +0 -0
  697. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_cli_programmatic_preload.py +0 -0
  698. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_config_migration.py +0 -0
  699. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_constraint_extract.py +0 -0
  700. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_constraint_hint.py +0 -0
  701. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_context_recovery.py +0 -0
  702. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_count_tool.py +0 -0
  703. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_curiosity.py +0 -0
  704. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_current_bugs.py +0 -0
  705. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_dispatch_report.py +0 -0
  706. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_dispatcher.py +0 -0
  707. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_drydock_regression.py +0 -0
  708. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_drydock_tasks.py +0 -0
  709. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  710. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_full_regression.py +0 -0
  711. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_graphrag.py +0 -0
  712. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_graphrag_worked_examples.py +0 -0
  713. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hallucinated_tool_suppression.py +0 -0
  714. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_history_manager.py +0 -0
  715. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hle_aggregate.py +0 -0
  716. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hle_score_method_split.py +0 -0
  717. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_hle_typing.py +0 -0
  718. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_integration.py +0 -0
  719. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_issue_fixes.py +0 -0
  720. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_linear_algebra_tool.py +0 -0
  721. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_local_detect.py +0 -0
  722. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_logic_tool.py +0 -0
  723. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_loop_detection.py +0 -0
  724. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_math_tool.py +0 -0
  725. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_mcp_settings.py +0 -0
  726. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_memory_tool.py +0 -0
  727. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_message_id.py +0 -0
  728. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_message_merging.py +0 -0
  729. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_middleware.py +0 -0
  730. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_multi_agent.py +0 -0
  731. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_number_theory_tool.py +0 -0
  732. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_read_file_not_found_listing.py +0 -0
  733. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_real_failures.py +0 -0
  734. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_real_issues.py +0 -0
  735. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_real_workflow.py +0 -0
  736. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_reasoning_content.py +0 -0
  737. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_rejudge_hle.py +0 -0
  738. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_retrieval_consumer.py +0 -0
  739. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_retrieve_tool.py +0 -0
  740. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_search_replace_args_not_truncated.py +0 -0
  741. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_set_tool.py +0 -0
  742. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_smoke.py +0 -0
  743. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_solve_tool.py +0 -0
  744. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_stats_tool.py +0 -0
  745. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering.py +0 -0
  746. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_capture.py +0 -0
  747. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_compute_vector.py +0 -0
  748. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_extract_pairs.py +0 -0
  749. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_hook.py +0 -0
  750. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  751. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_steering_sidecar_hooks.py +0 -0
  752. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_system_prompt.py +0 -0
  753. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_tagged_text.py +0 -0
  754. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_task_complete_nudge.py +0 -0
  755. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_tool_args.py +0 -0
  756. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncate_args_valid_json.py +0 -0
  757. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncated_arg_path_hint.py +0 -0
  758. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncated_search_replace_escalation.py +0 -0
  759. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_truncated_write_escalation.py +0 -0
  760. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_ui_external_editor.py +0 -0
  761. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_ui_input_history.py +0 -0
  762. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_units_tool.py +0 -0
  763. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_user_issues.py +0 -0
  764. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_verify_tool.py +0 -0
  765. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_wall_of_text_rescue.py +0 -0
  766. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_workloads.py +0 -0
  767. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/test_write_file_missing_path.py +0 -0
  768. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/testbank_helpers.py +0 -0
  769. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_ask_user_question.py +0 -0
  770. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash.py +0 -0
  771. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  772. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_consec_empty_search.py +0 -0
  773. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  774. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  775. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  776. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  777. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  778. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  779. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  780. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_exit_plan_mode.py +0 -0
  781. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_grep.py +0 -0
  782. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  783. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_invoke_context.py +0 -0
  784. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  785. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_manager_get_tool_config.py +0 -0
  786. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_mcp.py +0 -0
  787. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_mcp_sampling.py +0 -0
  788. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  789. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  790. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_directory.py +0 -0
  791. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_read_file_limit_truncation.py +0 -0
  792. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_append_fallback.py +0 -0
  793. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_dir_path.py +0 -0
  794. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_empty_content.py +0 -0
  795. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_file_not_found.py +0 -0
  796. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  797. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_hard_stop.py +0 -0
  798. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_malformed_block.py +0 -0
  799. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  800. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_placeholder.py +0 -0
  801. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  802. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_task.py +0 -0
  803. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_ui_bash_execution.py +0 -0
  804. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_webfetch.py +0 -0
  805. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_websearch.py +0 -0
  806. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  807. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  808. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  809. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  810. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_do_update.py +0 -0
  811. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  812. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_github_update_gateway.py +0 -0
  813. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  814. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_ui_update_notification.py +0 -0
  815. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_update_use_case.py +0 -0
  816. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/tests/update_notifier/test_whats_new.py +0 -0
  817. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/uv.lock +0 -0
  818. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/README.md +0 -0
  819. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/cli_subcommand_dispatch.py +0 -0
  820. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/lookup.json +0 -0
  821. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/sql_parser.py +0 -0
  822. {drydock_cli-2.8.44 → drydock_cli-2.8.46}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2173622
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.44
3
+ Version: 2.8.46
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -36,6 +36,31 @@ class CommandRegistry:
36
36
  description="Clear conversation history",
37
37
  handler="_clear_history",
38
38
  ),
39
+ "undo": Command(
40
+ aliases=frozenset(["/undo", "/back"]),
41
+ description=(
42
+ "Roll back the last turn — drop the most recent user "
43
+ "prompt and the assistant turn it triggered. Use when "
44
+ "an API error or bad tool call wedged the conversation "
45
+ "and you want to retry from the previous good state "
46
+ "without losing the rest of the history (unlike /clear)."
47
+ ),
48
+ handler="_undo_last_turn",
49
+ ),
50
+ "goal": Command(
51
+ aliases=frozenset(["/goal"]),
52
+ description=(
53
+ "Set a completion condition and auto-continue across "
54
+ "turns until met. Usage:\n"
55
+ " /goal <condition> — set a goal\n"
56
+ " /goal — show current goal status\n"
57
+ " /goal clear — cancel the active goal\n"
58
+ "After each turn, a small evaluator checks the "
59
+ "condition. If not met, drydock injects a continuation "
60
+ "prompt and runs another turn (capped at 20 iterations)."
61
+ ),
62
+ handler="_goal_command",
63
+ ),
39
64
  "log": Command(
40
65
  aliases=frozenset(["/log"]),
41
66
  description="Show path to current interaction log file",
@@ -851,6 +851,21 @@ class DrydockApp(App): # noqa: PLR0904
851
851
  loading_widget=self._loading_widget,
852
852
  )
853
853
 
854
+ # /goal post-turn hook — if a goal is active, ask the
855
+ # evaluator whether the condition is met. Met → clear and
856
+ # tell the user. Not met → queue a continuation prompt so
857
+ # the next turn fires automatically. The hook only runs on
858
+ # the success path (skipped on exception below) so a broken
859
+ # turn doesn't trigger an auto-continuation that re-trips
860
+ # the same failure.
861
+ try:
862
+ await self._check_goal_continuation()
863
+ except Exception as _goal_e: # noqa: BLE001
864
+ import logging
865
+ logging.getLogger(__name__).warning(
866
+ "[goal] post-turn hook failed (skipped): %s", _goal_e,
867
+ )
868
+
854
869
  except asyncio.CancelledError:
855
870
  if self._loading_widget and self._loading_widget.parent:
856
871
  await self._loading_widget.remove()
@@ -2204,6 +2219,178 @@ class DrydockApp(App): # noqa: PLR0904
2204
2219
  )
2205
2220
  )
2206
2221
 
2222
+ async def _check_goal_continuation(self) -> None:
2223
+ """Called from `_handle_agent_loop_turn` after the agent's turn
2224
+ finishes. If a goal is active, run the evaluator and either
2225
+ clear (met) or queue a continuation prompt (not met).
2226
+ """
2227
+ loop = self.agent_loop
2228
+ goal = getattr(loop, "goal", None)
2229
+ if goal is None or not goal.active:
2230
+ return
2231
+
2232
+ # Cap check first — never call the evaluator past the cap.
2233
+ if goal.iterations >= goal.max_iterations:
2234
+ await self._mount_and_scroll(UserCommandMessage(
2235
+ f"**Goal hit iteration cap** ({goal.max_iterations}). "
2236
+ f"Stopping auto-continuation for: _{goal.condition}_.\n\n"
2237
+ f"Last verdict: {goal.last_verdict or '(none)'}. "
2238
+ f"Re-issue `/goal <condition>` to restart, or send a "
2239
+ f"normal prompt to continue manually."
2240
+ ))
2241
+ loop.clear_goal()
2242
+ return
2243
+
2244
+ # If the user typed something while we were processing, defer
2245
+ # to their input — don't pre-empt with an auto-continuation.
2246
+ # The queued message will run via _process_queued_message in
2247
+ # the `finally` block below, and the goal will re-evaluate
2248
+ # after THAT turn.
2249
+ if hasattr(self, "_pending_messages") and self._pending_messages:
2250
+ return
2251
+
2252
+ verdict, reasoning = await loop.evaluate_goal()
2253
+ goal.iterations += 1
2254
+
2255
+ if verdict == "YES":
2256
+ await self._mount_and_scroll(UserCommandMessage(
2257
+ f"**Goal met** after {goal.iterations} turn(s): "
2258
+ f"_{goal.condition}_.\n\n"
2259
+ f"Evaluator reasoning: {reasoning or '—'}\n\n"
2260
+ f"Auto-continuation cleared."
2261
+ ))
2262
+ loop.clear_goal()
2263
+ return
2264
+
2265
+ if verdict == "ERROR":
2266
+ # Repeated evaluator errors are not the model's fault and
2267
+ # shouldn't lock the user in. Three errors → stop.
2268
+ err_key = "_goal_eval_error_streak"
2269
+ n = getattr(self, err_key, 0) + 1
2270
+ setattr(self, err_key, n)
2271
+ if n >= 3:
2272
+ await self._mount_and_scroll(UserCommandMessage(
2273
+ f"**Goal evaluator failing repeatedly** (3 errors in a "
2274
+ f"row). Last reason: {reasoning}. Clearing the goal — "
2275
+ f"re-issue `/goal` to retry."
2276
+ ))
2277
+ loop.clear_goal()
2278
+ setattr(self, err_key, 0)
2279
+ return
2280
+ # On a single error, keep the goal but don't auto-continue —
2281
+ # safer than running another turn blind.
2282
+ await self._mount_and_scroll(UserCommandMessage(
2283
+ f"Goal evaluator returned an error: {reasoning}. "
2284
+ f"Pausing auto-continuation for this turn; goal still "
2285
+ f"active. Type any prompt to continue manually."
2286
+ ))
2287
+ return
2288
+
2289
+ # NO — queue a continuation prompt so the next turn fires.
2290
+ setattr(self, "_goal_eval_error_streak", 0)
2291
+ from drydock.core.goal import make_continuation_prompt
2292
+ cont_prompt = make_continuation_prompt(goal)
2293
+ if not hasattr(self, "_pending_messages"):
2294
+ self._pending_messages = []
2295
+ self._pending_messages.append(cont_prompt)
2296
+ await self._mount_and_scroll(UserCommandMessage(
2297
+ f"_Auto-continuing toward goal (turn {goal.iterations}/"
2298
+ f"{goal.max_iterations}): {reasoning or 'not yet met'}_"
2299
+ ))
2300
+
2301
+ async def _goal_command(self, args: str = "") -> None:
2302
+ """/goal — set / show / clear a session-scoped goal that drives
2303
+ automatic turn-after-turn work toward a verifiable condition.
2304
+
2305
+ Usage:
2306
+ /goal <condition> set a goal (and start auto-continuation)
2307
+ /goal show the current goal's status
2308
+ /goal clear cancel the active goal
2309
+ """
2310
+ args = (args or "").strip()
2311
+ loop = self.agent_loop
2312
+
2313
+ # Status (no args) — show whatever goal is active
2314
+ if not args:
2315
+ g = getattr(loop, "goal", None)
2316
+ if g is None or not g.active:
2317
+ await self._mount_and_scroll(UserCommandMessage(
2318
+ "No active goal. Set one with `/goal <condition>`."
2319
+ ))
2320
+ return
2321
+ verdict = g.last_verdict or "(not yet evaluated)"
2322
+ reason = g.last_evaluator_reasoning or ""
2323
+ await self._mount_and_scroll(UserCommandMessage(
2324
+ f"**Goal:** {g.condition}\n\n"
2325
+ f"- Iterations: {g.iterations} / {g.max_iterations}\n"
2326
+ f"- Last verdict: {verdict}\n"
2327
+ f"- Reasoning: {reason or '—'}\n\n"
2328
+ f"Use `/goal clear` to cancel."
2329
+ ))
2330
+ return
2331
+
2332
+ # Clear
2333
+ if args.lower() in ("clear", "cancel", "stop", "off"):
2334
+ loop.clear_goal()
2335
+ await self._mount_and_scroll(UserCommandMessage(
2336
+ "Goal cleared."
2337
+ ))
2338
+ return
2339
+
2340
+ # Set a new goal
2341
+ # Read DRYDOCK_GOAL_MAX_ITERATIONS for the operator-overridable cap
2342
+ import os
2343
+ try:
2344
+ cap = int(os.environ.get("DRYDOCK_GOAL_MAX_ITERATIONS", "20"))
2345
+ if cap < 1:
2346
+ cap = 20
2347
+ except ValueError:
2348
+ cap = 20
2349
+ loop.set_goal(args, max_iterations=cap)
2350
+ await self._mount_and_scroll(UserCommandMessage(
2351
+ f"**Goal set:** {args}\n\n"
2352
+ f"After each turn, a fast evaluator will check whether the "
2353
+ f"condition holds. If not, drydock will keep working "
2354
+ f"automatically (up to {cap} turns). The goal will clear "
2355
+ f"once met. Use `/goal` to check status, `/goal clear` to "
2356
+ f"cancel."
2357
+ ))
2358
+
2359
+ async def _undo_last_turn(self) -> None:
2360
+ """Roll back the last user→assistant turn without wiping the
2361
+ whole session. Safer alternative to /clear when an error
2362
+ wedges the conversation."""
2363
+ if self._agent_running:
2364
+ await self._mount_and_scroll(
2365
+ ErrorMessage(
2366
+ "Cannot /undo while the agent is processing. "
2367
+ "Press Esc to cancel first, then /undo.",
2368
+ collapsed=self._tools_collapsed,
2369
+ )
2370
+ )
2371
+ return
2372
+ try:
2373
+ ok, info = await self.agent_loop.undo_last_turn()
2374
+ if not ok:
2375
+ await self._mount_and_scroll(
2376
+ ErrorMessage(info, collapsed=self._tools_collapsed)
2377
+ )
2378
+ return
2379
+ # The conversation history is now rolled back. We don't try
2380
+ # to selectively remove rendered UI widgets — that's fragile
2381
+ # since the assistant turn we dropped may have produced
2382
+ # multiple widgets (text, tool calls, tool results). Instead,
2383
+ # emit a clear marker so the user sees where the rollback
2384
+ # happened. Subsequent prompts will start fresh against the
2385
+ # truncated message history.
2386
+ await self._mount_and_scroll(UserCommandMessage(info))
2387
+ except Exception as e: # noqa: BLE001
2388
+ await self._mount_and_scroll(
2389
+ ErrorMessage(
2390
+ f"Undo failed: {e}", collapsed=self._tools_collapsed
2391
+ )
2392
+ )
2393
+
2207
2394
  async def _clear_history(self) -> None:
2208
2395
  try:
2209
2396
  self._reset_ui_state()
@@ -4373,6 +4373,150 @@ or replace freely; future sessions will respect your edits._
4373
4373
  def set_user_input_callback(self, callback: UserInputCallback) -> None:
4374
4374
  self.user_input_callback = callback
4375
4375
 
4376
+ # ------------------------------------------------------------------
4377
+ # Goal pursuit (Claude Code /goal feature) — see drydock/core/goal.py
4378
+ # ------------------------------------------------------------------
4379
+
4380
+ def set_goal(self, condition: str, max_iterations: int = 20) -> None:
4381
+ """Activate goal-pursuit mode. The TUI calls this when the user
4382
+ types `/goal <condition>`. The agent loop itself doesn't act on
4383
+ the goal — the TUI's post-turn hook checks `self.goal` and
4384
+ decides whether to inject a continuation prompt."""
4385
+ from drydock.core.goal import GoalState
4386
+ self.goal = GoalState(
4387
+ condition=condition.strip(),
4388
+ max_iterations=max_iterations,
4389
+ )
4390
+ logger.warning(
4391
+ "[goal] activated: %r (cap=%d turns)",
4392
+ condition[:80], max_iterations,
4393
+ )
4394
+
4395
+ def clear_goal(self) -> None:
4396
+ """Cancel goal-pursuit. Idempotent."""
4397
+ if getattr(self, "goal", None) is not None:
4398
+ logger.warning("[goal] cleared")
4399
+ self.goal = None
4400
+
4401
+ async def evaluate_goal(self) -> tuple[str, str]:
4402
+ """Ask the model whether the active goal has been met.
4403
+
4404
+ Returns (verdict, reasoning) where verdict ∈ {"YES", "NO", "ERROR"}.
4405
+ ERROR means the call itself failed or the response couldn't be
4406
+ parsed — caller should treat as NO and continue (or, after a
4407
+ threshold of ERRORs in a row, clear the goal as a safety hatch).
4408
+ """
4409
+ from drydock.core.goal import (
4410
+ EVALUATOR_SYSTEM_PROMPT,
4411
+ build_evaluator_prompt,
4412
+ collect_recent_message_snippets,
4413
+ parse_verdict,
4414
+ )
4415
+ goal = getattr(self, "goal", None)
4416
+ if goal is None or not goal.active:
4417
+ return ("ERROR", "no active goal")
4418
+
4419
+ snippets = collect_recent_message_snippets(self.messages, n=8)
4420
+ user_prompt = build_evaluator_prompt(goal, snippets)
4421
+
4422
+ eval_messages = [
4423
+ LLMMessage(role=Role.system, content=EVALUATOR_SYSTEM_PROMPT),
4424
+ LLMMessage(role=Role.user, content=user_prompt),
4425
+ ]
4426
+ active_model = self.config.get_active_model()
4427
+ try:
4428
+ # Tight budget — evaluator returns ~30 tokens at most.
4429
+ # Temperature low for determinism. No tools.
4430
+ result = await self.backend.complete(
4431
+ model=active_model,
4432
+ messages=eval_messages,
4433
+ temperature=0.0,
4434
+ tools=[],
4435
+ tool_choice=None,
4436
+ extra_headers=self._get_extra_headers(
4437
+ self.config.get_active_provider()
4438
+ ),
4439
+ max_tokens=120,
4440
+ metadata=None,
4441
+ )
4442
+ except Exception as e: # noqa: BLE001 — never crash the TUI on eval error
4443
+ logger.warning("[goal] evaluator call failed: %s", e)
4444
+ return ("ERROR", f"evaluator backend error: {e!s}"[:200])
4445
+
4446
+ raw = (result.message.content or "").strip()
4447
+ verdict, reasoning = parse_verdict(raw)
4448
+ goal.last_verdict = verdict
4449
+ goal.last_evaluator_reasoning = reasoning
4450
+ logger.warning(
4451
+ "[goal] verdict=%s iter=%d/%d reason=%r",
4452
+ verdict, goal.iterations, goal.max_iterations, reasoning[:120],
4453
+ )
4454
+ return (verdict, reasoning)
4455
+
4456
+ async def undo_last_turn(self) -> tuple[bool, str]:
4457
+ """Rewind history past the LAST user message, dropping the
4458
+ assistant turn (and any tool results) it triggered AND the
4459
+ user message itself. Use case: the last user prompt set off
4460
+ a chain that wedged the conversation; the user wants to back
4461
+ out and try a different prompt.
4462
+
4463
+ Returns (success, info_message).
4464
+
4465
+ Why this is safer than `/clear`:
4466
+ - Preserves the system message (index 0)
4467
+ - Preserves all prior good user+assistant exchanges
4468
+ - Resets the sticky error counters so the new prompt
4469
+ won't immediately re-trip the lockout
4470
+
4471
+ Why drop the user message too (not just the assistant turn):
4472
+ - If the user repeats the same prompt, they'll re-trigger
4473
+ the same bad assistant response. The point of /undo is
4474
+ to escape; the user can always re-type the prompt if
4475
+ they really want it.
4476
+ """
4477
+ # Find the last user message — walk backward
4478
+ last_user_idx = -1
4479
+ for i in range(len(self.messages) - 1, -1, -1):
4480
+ if self.messages[i].role == Role.user:
4481
+ last_user_idx = i
4482
+ break
4483
+
4484
+ if last_user_idx <= 0:
4485
+ # No user message to rewind past (only the system message
4486
+ # is present), or the user message is at idx 0 which we
4487
+ # never drop. Nothing to undo.
4488
+ return (False, "Nothing to undo — no prior user turn in history.")
4489
+
4490
+ dropped = len(self.messages) - last_user_idx
4491
+ kept = list(self.messages[:last_user_idx])
4492
+ try:
4493
+ await self.session_logger.save_interaction(
4494
+ self.messages,
4495
+ self.stats,
4496
+ self._base_config,
4497
+ self.tool_manager,
4498
+ self.agent_profile,
4499
+ )
4500
+ except Exception as e: # noqa: BLE001 — never block /undo on a save failure
4501
+ logger.warning("[undo] session save failed (continuing): %s", e)
4502
+ self.messages.reset(kept)
4503
+ # Clear the sticky error counters so the next prompt starts fresh.
4504
+ if hasattr(self, "_total_error_rounds"):
4505
+ self._total_error_rounds = 0
4506
+ if hasattr(self, "_consecutive_circuit_breaker_fires"):
4507
+ self._consecutive_circuit_breaker_fires = 0
4508
+ if hasattr(self, "_consecutive_empty_turns"):
4509
+ self._consecutive_empty_turns = 0
4510
+ logger.warning(
4511
+ "[undo] rolled back: kept %d messages (dropped %d after last user idx=%d)",
4512
+ len(kept), dropped, last_user_idx,
4513
+ )
4514
+ return (
4515
+ True,
4516
+ f"Rolled back the last turn — dropped {dropped} message(s). "
4517
+ f"Type your next prompt to continue from the prior state.",
4518
+ )
4519
+
4376
4520
  async def clear_history(self) -> None:
4377
4521
  await self.session_logger.save_interaction(
4378
4522
  self.messages,
@@ -4415,6 +4559,10 @@ or replace freely; future sessions will respect your edits._
4415
4559
  self._empty_nudge_last_user_idx = -1
4416
4560
  self._total_error_rounds = 0
4417
4561
  self._read_file_state = {}
4562
+ # /goal state: None means no active goal. Cleared by /clear and
4563
+ # /compact since the goal is session-scoped and a fresh session
4564
+ # shouldn't inherit the prior pursuit.
4565
+ self.goal = None
4418
4566
 
4419
4567
  async def compact(self) -> str:
4420
4568
  try:
@@ -0,0 +1,147 @@
1
+ """Goal pursuit — autonomous turn-after-turn work toward a condition.
2
+
3
+ Mirrors the Claude Code `/goal` feature. The user sets a completion
4
+ condition; after every turn, a small evaluator model decides whether
5
+ the condition holds. If not, drydock injects a continuation prompt
6
+ and runs another turn. The goal clears automatically once met.
7
+
8
+ Design notes:
9
+ - Iteration cap (default 20) prevents infinite loops on unverifiable
10
+ or impossible goals.
11
+ - Evaluator uses the same provider/model as the agent loop. A small
12
+ dedicated model would be cleaner but complicates local deployment.
13
+ The evaluator prompt is tight: it returns a single YES/NO token.
14
+ - The continuation prompt is synthesised — same shape as the existing
15
+ DRYDOCK_AUTO_CONTINUE mechanism — but tagged with the goal so the
16
+ main agent loop knows we're on a goal turn, not a user turn.
17
+ - Status (`/goal` with no args), set (`/goal <condition>`), and
18
+ clear (`/goal clear`) live in commands.py; this module owns the
19
+ state, evaluation, and continuation-prompt synthesis.
20
+ """
21
+ from __future__ import annotations
22
+
23
+ import logging
24
+ from dataclasses import dataclass, field
25
+
26
+ logger = logging.getLogger("drydock.goal")
27
+
28
+
29
+ @dataclass
30
+ class GoalState:
31
+ """Per-session goal state. Owned by the TUI / AgentLoop wrapper."""
32
+
33
+ condition: str
34
+ iterations: int = 0
35
+ # Conservative cap — covers most realistic workflows (per-turn ~30-80s
36
+ # on Gemma 4, so 20 turns ~10-25 min) without letting a runaway goal
37
+ # burn the whole afternoon. Operator can override.
38
+ max_iterations: int = 20
39
+ last_verdict: str = "" # "YES" | "NO" | "ERROR" | "" before first eval
40
+ last_evaluator_reasoning: str = ""
41
+
42
+ @property
43
+ def active(self) -> bool:
44
+ return bool(self.condition.strip())
45
+
46
+ @property
47
+ def remaining(self) -> int:
48
+ return max(0, self.max_iterations - self.iterations)
49
+
50
+
51
+ # ── Evaluation prompt ───────────────────────────────────────────────────
52
+
53
+ EVALUATOR_SYSTEM_PROMPT = (
54
+ "You are a goal-completion evaluator. You read a goal condition "
55
+ "plus the recent conversation between a user and a coding agent, "
56
+ "and you decide whether the goal has been met.\n\n"
57
+ "Output rules (STRICT):\n"
58
+ "1. Your FIRST line must be exactly `VERDICT: YES` or `VERDICT: NO`.\n"
59
+ "2. Your SECOND line should be a one-sentence reason (≤120 chars).\n"
60
+ "3. Output NOTHING else. No preamble, no markdown, no quotes.\n\n"
61
+ "Be conservative — only say YES if the conversation contains "
62
+ "concrete evidence the goal is satisfied. Tool output, test "
63
+ "results, file contents, or explicit confirmation from the agent. "
64
+ "Plans, intentions, and 'I will' statements are NOT evidence."
65
+ )
66
+
67
+
68
+ def build_evaluator_prompt(goal: GoalState, recent_messages: list[str]) -> str:
69
+ """Render the evaluator user prompt from the goal + last N msgs."""
70
+ convo = "\n\n---\n\n".join(recent_messages[-12:])
71
+ if len(convo) > 8000:
72
+ convo = convo[:8000] + "\n[... earlier turns truncated]"
73
+ return (
74
+ f"GOAL CONDITION:\n{goal.condition}\n\n"
75
+ f"RECENT CONVERSATION:\n{convo}\n\n"
76
+ f"Has the goal been met? Respond with VERDICT: YES or VERDICT: NO."
77
+ )
78
+
79
+
80
+ def parse_verdict(raw: str) -> tuple[str, str]:
81
+ """Parse an evaluator response into (verdict, reasoning).
82
+
83
+ verdict ∈ {"YES", "NO", "ERROR"}.
84
+ """
85
+ if not raw:
86
+ return ("ERROR", "evaluator returned empty response")
87
+ lines = [l.strip() for l in raw.splitlines() if l.strip()]
88
+ if not lines:
89
+ return ("ERROR", "evaluator returned only whitespace")
90
+ first = lines[0].upper()
91
+ reasoning = lines[1] if len(lines) > 1 else ""
92
+ # Accept both strict ("VERDICT: YES") and lenient ("YES.") forms
93
+ if first.startswith("VERDICT:"):
94
+ verdict_token = first.replace("VERDICT:", "").strip().rstrip(".").strip()
95
+ else:
96
+ verdict_token = first.rstrip(".").strip()
97
+ if verdict_token.startswith("YES"):
98
+ return ("YES", reasoning)
99
+ if verdict_token.startswith("NO"):
100
+ return ("NO", reasoning)
101
+ return ("ERROR", f"unrecognised verdict token: {first[:60]!r}")
102
+
103
+
104
+ def make_continuation_prompt(goal: GoalState) -> str:
105
+ """The synthesised user message that keeps the agent working.
106
+
107
+ Kept short so it doesn't dominate the next turn's context. The
108
+ main agent loop's system prompt already explains the agent's
109
+ role; the continuation just refocuses on the goal.
110
+ """
111
+ return (
112
+ f"Continue working toward the goal: {goal.condition}\n"
113
+ f"(Iteration {goal.iterations}/{goal.max_iterations}. "
114
+ f"Goal will auto-clear when met.)"
115
+ )
116
+
117
+
118
+ # ── Snippet extraction for the evaluator ────────────────────────────────
119
+
120
+ def collect_recent_message_snippets(messages, n: int = 8) -> list[str]:
121
+ """Render the last n messages as short strings the evaluator can
122
+ read. Truncates each to ≤600 chars so the evaluator prompt stays
123
+ bounded.
124
+
125
+ `messages` is the AgentLoop's `self.messages` — a sequence of
126
+ LLMMessage objects with .role and .content.
127
+ """
128
+ out: list[str] = []
129
+ # Skip the system message (index 0); take the tail.
130
+ tail = list(messages)[-n:] if len(messages) > n else list(messages)
131
+ for m in tail:
132
+ role = getattr(m, "role", "?")
133
+ role_str = getattr(role, "value", None) or str(role)
134
+ content = getattr(m, "content", "") or ""
135
+ # Include tool-call summaries since they're often the evidence
136
+ # the evaluator needs (test pass, file written, etc.).
137
+ tcs = getattr(m, "tool_calls", None) or []
138
+ if tcs and not content:
139
+ tc_summary = ", ".join(
140
+ getattr(getattr(tc, "function", None), "name", "?")
141
+ for tc in tcs
142
+ )
143
+ content = f"[tool calls: {tc_summary}]"
144
+ if len(content) > 600:
145
+ content = content[:600] + "...[truncated]"
146
+ out.append(f"[{role_str}] {content}")
147
+ return out
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.8.44"
3
+ version = "2.8.46"
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"
@@ -147,3 +147,49 @@ def test_conversation_loop_resets_total_error_rounds_on_entry():
147
147
  assert "_total_error_rounds" in src
148
148
  assert "= 0" in src
149
149
  assert "fresh user turn" in src or "Reset sticky error" in src
150
+
151
+
152
+ # ── /undo slash command ────────────────────────────────────────────────
153
+
154
+ def test_undo_command_registered_with_aliases():
155
+ """The /undo command must be in the registry with /back as alias."""
156
+ from drydock.cli.commands import CommandRegistry
157
+ r = CommandRegistry()
158
+ cmd = r.commands.get("undo")
159
+ assert cmd is not None
160
+ assert "/undo" in cmd.aliases
161
+ assert "/back" in cmd.aliases
162
+ assert cmd.handler == "_undo_last_turn"
163
+
164
+
165
+ def test_agent_loop_undo_last_turn_method_exists():
166
+ """The agent loop must expose undo_last_turn for the TUI handler."""
167
+ from drydock.core.agent_loop import AgentLoop
168
+ assert callable(getattr(AgentLoop, "undo_last_turn", None))
169
+
170
+
171
+ def test_undo_keeps_system_and_truncates_to_before_last_user():
172
+ """Validate the rewind shape: drop the last user msg + everything
173
+ after it; keep the system message and all prior turns."""
174
+ import inspect
175
+ from drydock.core.agent_loop import AgentLoop
176
+ src = inspect.getsource(AgentLoop.undo_last_turn)
177
+ # The implementation must walk backward to find the last user idx,
178
+ # then slice the messages to keep only [:last_user_idx].
179
+ assert "last_user_idx" in src
180
+ assert "Role.user" in src
181
+ assert ".reset(" in src
182
+ # It must also clear the sticky error counters so the next prompt
183
+ # doesn't immediately re-trip the lockout.
184
+ assert "_total_error_rounds" in src
185
+
186
+
187
+ def test_undo_returns_failure_when_only_system_message():
188
+ """If there's no user message to rewind past, undo should return
189
+ (False, info) rather than wiping the system message."""
190
+ import inspect
191
+ from drydock.core.agent_loop import AgentLoop
192
+ src = inspect.getsource(AgentLoop.undo_last_turn)
193
+ # Guard condition for "no user message" or "only system message"
194
+ assert "last_user_idx <= 0" in src or "last_user_idx == -1" in src
195
+ assert "Nothing to undo" in src