drydock-cli 2.8.50__tar.gz → 2.8.52__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 (831) hide show
  1. drydock_cli-2.8.52/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/PKG-INFO +1 -1
  3. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/app.py +51 -0
  4. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/approval_app.py +43 -0
  5. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agent_loop.py +14 -0
  6. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/session_logger.py +24 -0
  7. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/pyproject.toml +1 -1
  8. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown.py +6 -0
  9. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_shakedown.py +10 -2
  10. drydock_cli-2.8.52/tests/test_approval_modal_stray_keys.py +92 -0
  11. drydock_cli-2.8.52/tests/test_session_log_event.py +89 -0
  12. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/trip_log.md +9 -0
  13. drydock_cli-2.8.50/.auto_release.lock +0 -1
  14. drydock_cli-2.8.50/.pause_stress +0 -0
  15. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.drydock/graphrag.sqlite +0 -0
  16. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/CODEOWNERS +0 -0
  17. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  18. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  19. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/build-and-upload.yml +0 -0
  21. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/ci.yml +0 -0
  22. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/issue-labeler.yml +0 -0
  23. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.github/workflows/release.yml +0 -0
  24. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.gitignore +0 -0
  25. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pause_hle_babysitter +0 -0
  26. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pause_hle_burndown +0 -0
  27. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pause_hle_burndown_keepalive +0 -0
  28. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.pre-commit-config.yaml +0 -0
  29. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.python-version +0 -0
  30. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.typos.toml +0 -0
  31. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.vscode/extensions.json +0 -0
  32. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.vscode/launch.json +0 -0
  33. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/.vscode/settings.json +0 -0
  34. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/AGENTS.md +0 -0
  35. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/Admiral.md +0 -0
  36. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/CHANGELOG.md +0 -0
  37. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/CLAUDE.md +0 -0
  38. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/CONTRIBUTING.md +0 -0
  39. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/DEEP_NOIR_PRD.md +0 -0
  40. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/DEPLOYMENT.md +0 -0
  41. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/DRYDOCK.md +0 -0
  42. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/HLE_PRD.md +0 -0
  43. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/JETSON_BENCH.md +0 -0
  44. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/LICENSE +0 -0
  45. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/MODEL_SHORTCOMINGS.md +0 -0
  46. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/NOTICE +0 -0
  47. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/README.md +0 -0
  48. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/SOVEREIGN_PRD.md +0 -0
  49. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/TRIAGE_v1.md +0 -0
  50. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/action.yml +0 -0
  51. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/README.md +0 -0
  52. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results1.tsv +0 -0
  53. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results13.tsv +0 -0
  54. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results14.tsv +0 -0
  55. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results15.tsv +0 -0
  56. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results16.tsv +0 -0
  57. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results17.tsv +0 -0
  58. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results18.tsv +0 -0
  59. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results19.tsv +0 -0
  60. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results2.tsv +0 -0
  61. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results20.tsv +0 -0
  62. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results3.tsv +0 -0
  63. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results4.tsv +0 -0
  64. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results5.tsv +0 -0
  65. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results6.tsv +0 -0
  66. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results7.tsv +0 -0
  67. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results8.tsv +0 -0
  68. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results9.tsv +0 -0
  69. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/baseline_history/results_evolved_v1.tsv +0 -0
  70. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/distribution/zed/LICENSE +0 -0
  71. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/distribution/zed/extension.toml +0 -0
  72. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/distribution/zed/icons/mistral_vibe.svg +0 -0
  73. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/README.md +0 -0
  74. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/acp-setup.md +0 -0
  75. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/BASELINE_412.md +0 -0
  76. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/Drydock_rebrand.md +0 -0
  77. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  78. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  79. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  80. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/PRD.md +0 -0
  81. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/drydock_terms.md +0 -0
  82. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/archive/resume.md +0 -0
  83. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/docs/proxy-setup.md +0 -0
  84. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/__init__.py +0 -0
  85. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/__main__.py +0 -0
  86. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/__init__.py +0 -0
  87. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/acp_agent_loop.py +0 -0
  88. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/acp_logger.py +0 -0
  89. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/entrypoint.py +0 -0
  90. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/__init__.py +0 -0
  91. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/base.py +0 -0
  92. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/bash.py +0 -0
  93. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/read_file.py +0 -0
  94. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/search_replace.py +0 -0
  95. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/todo.py +0 -0
  96. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/builtins/write_file.py +0 -0
  97. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/tools/session_update.py +0 -0
  98. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/acp/utils.py +0 -0
  99. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/__init__.py +0 -0
  100. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/detectors.py +0 -0
  101. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/detectors_proposed.py +0 -0
  102. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/history.py +0 -0
  103. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/interventions.py +0 -0
  104. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/llm_analyzer.py +0 -0
  105. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/metrics.py +0 -0
  106. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/opus_escalator.py +0 -0
  107. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/persistence.py +0 -0
  108. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/policy.py +0 -0
  109. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/proposer.py +0 -0
  110. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/stager.py +0 -0
  111. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/task_classifier.py +0 -0
  112. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/tuning.py +0 -0
  113. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/validator.py +0 -0
  114. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/admiral/worker.py +0 -0
  115. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/__init__.py +0 -0
  116. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/__init__.py +0 -0
  117. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/base.py +0 -0
  118. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/path_completion.py +0 -0
  119. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/autocompletion/slash_command.py +0 -0
  120. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/cli.py +0 -0
  121. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/clipboard.py +0 -0
  122. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/commands.py +0 -0
  123. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/entrypoint.py +0 -0
  124. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/fix_windows_path.py +0 -0
  125. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/history_manager.py +0 -0
  126. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  127. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  128. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  129. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/terminal_setup.py +0 -0
  130. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/__init__.py +0 -0
  131. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  132. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/app.tcss +0 -0
  133. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/external_editor.py +0 -0
  134. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  135. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  136. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  137. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  138. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  139. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  140. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  141. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  142. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  143. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  144. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  145. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  146. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  147. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  148. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  149. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  150. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  151. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  152. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  153. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  154. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  155. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  156. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  157. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  158. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  159. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  160. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  161. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  162. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  163. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  164. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  165. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  166. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  167. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  168. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  169. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  170. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/history.py +0 -0
  171. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  172. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/textual_ui/windowing/state.py +0 -0
  173. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/__init__.py +0 -0
  174. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  175. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  176. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  177. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  178. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  179. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/update.py +0 -0
  180. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/cli/update_notifier/whats_new.py +0 -0
  181. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/__init__.py +0 -0
  182. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agents/__init__.py +0 -0
  183. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agents/manager.py +0 -0
  184. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/agents/models.py +0 -0
  185. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auth/__init__.py +0 -0
  186. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auth/crypto.py +0 -0
  187. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auth/github.py +0 -0
  188. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/auto_solve.py +0 -0
  189. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/__init__.py +0 -0
  190. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/completers.py +0 -0
  191. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  192. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  193. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  194. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  195. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  196. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/fuzzy.py +0 -0
  197. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/path_prompt.py +0 -0
  198. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  199. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/build_orchestrator.py +0 -0
  200. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/checkpoint.py +0 -0
  201. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/__init__.py +0 -0
  202. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/__main__.py +0 -0
  203. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/classifier.py +0 -0
  204. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/dispatcher.py +0 -0
  205. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/rules.py +0 -0
  206. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/classifier/signal.py +0 -0
  207. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/__init__.py +0 -0
  208. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/_dotenv.py +0 -0
  209. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/_settings.py +0 -0
  210. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/doctor.py +0 -0
  211. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/harness_files/__init__.py +0 -0
  212. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  213. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/harness_files/_paths.py +0 -0
  214. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/local_detect.py +0 -0
  215. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/config/migrate.py +0 -0
  216. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/constraint_extract.py +0 -0
  217. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/constraint_hint.py +0 -0
  218. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/consultant.py +0 -0
  219. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/context_recovery.py +0 -0
  220. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/drydock_states.py +0 -0
  221. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/goal.py +0 -0
  222. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/hooks.py +0 -0
  223. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/__init__.py +0 -0
  224. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/anthropic.py +0 -0
  225. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/base.py +0 -0
  226. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/factory.py +0 -0
  227. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/generic.py +0 -0
  228. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/mistral.py +0 -0
  229. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  230. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/backend/vertex.py +0 -0
  231. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/exceptions.py +0 -0
  232. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/format.py +0 -0
  233. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/message_utils.py +0 -0
  234. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/llm/types.py +0 -0
  235. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/logger.py +0 -0
  236. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/middleware.py +0 -0
  237. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/output_formatters.py +0 -0
  238. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/__init__.py +0 -0
  239. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/_drydock_home.py +0 -0
  240. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/_local_config_walk.py +0 -0
  241. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/paths/conventions.py +0 -0
  242. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/plan_session.py +0 -0
  243. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/plugins.py +0 -0
  244. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/programmatic.py +0 -0
  245. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/__init__.py +0 -0
  246. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/builder.md +0 -0
  247. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/cli.md +0 -0
  248. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/compact.md +0 -0
  249. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/dangerous_directory.md +0 -0
  250. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/diagnostic.md +0 -0
  251. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/explore.md +0 -0
  252. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/gemma4.md +0 -0
  253. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/planner.md +0 -0
  254. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/project_context.md +0 -0
  255. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/prompts/tests.md +0 -0
  256. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/proxy_setup.py +0 -0
  257. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/agent_memory.py +0 -0
  258. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/checkpoints.py +0 -0
  259. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/session_loader.py +0 -0
  260. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/session_migration.py +0 -0
  261. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session/state_file.py +0 -0
  262. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/session_checker.py +0 -0
  263. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/__init__.py +0 -0
  264. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/manager.py +0 -0
  265. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/models.py +0 -0
  266. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/skills/parser.py +0 -0
  267. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/slug.py +0 -0
  268. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/steering_hook.py +0 -0
  269. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/system_prompt.py +0 -0
  270. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/telemetry/__init__.py +0 -0
  271. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/telemetry/send.py +0 -0
  272. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/errors.py +0 -0
  273. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/git.py +0 -0
  274. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/nuage.py +0 -0
  275. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/teleport.py +0 -0
  276. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/teleport/types.py +0 -0
  277. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/base.py +0 -0
  278. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/_task_manager.py +0 -0
  279. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  280. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  281. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/bash.py +0 -0
  282. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  283. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/count_tool.py +0 -0
  284. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/cron.py +0 -0
  285. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  286. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/glob_tool.py +0 -0
  287. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/grep.py +0 -0
  288. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  289. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  290. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/logic_tool.py +0 -0
  291. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/lsp.py +0 -0
  292. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/math_tool.py +0 -0
  293. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  294. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/memory_tool.py +0 -0
  295. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  296. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  297. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/powershell.py +0 -0
  298. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prolog_tool.py +0 -0
  299. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  300. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  301. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  302. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  303. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  304. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  305. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  306. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  307. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  308. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  309. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  310. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  311. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  312. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  313. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  314. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/task.md +0 -0
  315. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  316. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  317. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  318. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  319. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  320. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  321. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  322. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/read_file.py +0 -0
  323. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/retrieve.py +0 -0
  324. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/search_replace.py +0 -0
  325. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/set_tool.py +0 -0
  326. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/solve_tool.py +0 -0
  327. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/stats_tool.py +0 -0
  328. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/task.py +0 -0
  329. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/todo.py +0 -0
  330. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/tool_search.py +0 -0
  331. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/units_tool.py +0 -0
  332. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/verify_tool.py +0 -0
  333. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/webfetch.py +0 -0
  334. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/websearch.py +0 -0
  335. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/worktree.py +0 -0
  336. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/builtins/write_file.py +0 -0
  337. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/injection_guard.py +0 -0
  338. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/manager.py +0 -0
  339. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp/__init__.py +0 -0
  340. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp/registry.py +0 -0
  341. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp/tools.py +0 -0
  342. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/mcp_sampling.py +0 -0
  343. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/ui.py +0 -0
  344. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/tools/utils.py +0 -0
  345. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/trusted_folders.py +0 -0
  346. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/types.py +0 -0
  347. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/core/utils.py +0 -0
  348. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/__init__.py +0 -0
  349. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/__main__.py +0 -0
  350. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/gap_detector.py +0 -0
  351. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/item.py +0 -0
  352. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/queue.py +0 -0
  353. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/curiosity/surprise.py +0 -0
  354. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/__init__.py +0 -0
  355. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/__main__.py +0 -0
  356. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/code_indexer.py +0 -0
  357. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/retriever.py +0 -0
  358. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/storage.py +0 -0
  359. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/graphrag/text_indexer.py +0 -0
  360. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/__init__.py +0 -0
  361. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/base.py +0 -0
  362. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/onboarding.tcss +0 -0
  363. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/__init__.py +0 -0
  364. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/api_key.py +0 -0
  365. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/choice.py +0 -0
  366. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/local_model.py +0 -0
  367. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/onboarding/screens/welcome.py +0 -0
  368. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  369. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  370. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/__init__.py +0 -0
  371. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/api-design/SKILL.md +0 -0
  372. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/audit-tests/SKILL.md +0 -0
  373. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/batch/SKILL.md +0 -0
  374. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/commit-code/SKILL.md +0 -0
  375. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  376. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/context-summary/SKILL.md +0 -0
  377. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/create-presentation/SKILL.md +0 -0
  378. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/deep-research/SKILL.md +0 -0
  379. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/deploy/SKILL.md +0 -0
  380. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/diff-review/SKILL.md +0 -0
  381. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/doc-gen/SKILL.md +0 -0
  382. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/explain-code/SKILL.md +0 -0
  383. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/explore-code/SKILL.md +0 -0
  384. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/fix-issue/SKILL.md +0 -0
  385. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/git-ops/SKILL.md +0 -0
  386. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/init-project/SKILL.md +0 -0
  387. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/investigate/SKILL.md +0 -0
  388. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/logic/SKILL.md +0 -0
  389. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  390. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/loop/SKILL.md +0 -0
  391. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/migrate/SKILL.md +0 -0
  392. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/perf-analyze/SKILL.md +0 -0
  393. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/plan-impl/SKILL.md +0 -0
  394. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/pr-review/SKILL.md +0 -0
  395. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/prove/SKILL.md +0 -0
  396. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/refactor/SKILL.md +0 -0
  397. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/regex-help/SKILL.md +0 -0
  398. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/review/SKILL.md +0 -0
  399. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/security-review/SKILL.md +0 -0
  400. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/ship/SKILL.md +0 -0
  401. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/simplify/SKILL.md +0 -0
  402. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/strong-tests/SKILL.md +0 -0
  403. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/skills/test-verify/SKILL.md +0 -0
  404. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/__init__.py +0 -0
  405. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/__main__.py +0 -0
  406. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/applier.py +0 -0
  407. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/config.py +0 -0
  408. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/registry.py +0 -0
  409. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sandbox.py +0 -0
  410. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/__init__.py +0 -0
  411. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/header_parser.py +0 -0
  412. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/hooks.py +0 -0
  413. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/loader.py +0 -0
  414. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/sidecar/server.py +0 -0
  415. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/__init__.py +0 -0
  416. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/capture.py +0 -0
  417. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/compute_vector.py +0 -0
  418. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/extract_pairs.py +0 -0
  419. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/train/scan_sessions.py +0 -0
  420. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/steering/vectors.py +0 -0
  421. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock/whats_new.md +0 -0
  422. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/drydock-acp.spec +0 -0
  423. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/flake.lock +0 -0
  424. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/flake.nix +0 -0
  425. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/outlook_draft_assistant.tar.gz +0 -0
  426. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/README.md +0 -0
  427. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/config_base.toml +0 -0
  428. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/config_best.toml +0 -0
  429. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
  430. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
  431. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/domain_spec.md +0 -0
  432. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/experimenter.py +0 -0
  433. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/kernel.py +0 -0
  434. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/mini_prd.md +0 -0
  435. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/mini_prompts.txt +0 -0
  436. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/proposer.py +0 -0
  437. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/research/results.tsv +0 -0
  438. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/resume.md +0 -0
  439. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/README.md +0 -0
  440. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/README.md +0 -0
  441. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/auto_solve_audit.py.deprecated +0 -0
  442. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_babysitter.sh.deprecated +0 -0
  443. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_burndown.sh.deprecated +0 -0
  444. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_burndown_keepalive.sh.deprecated +0 -0
  445. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_burndown_status.py.deprecated +0 -0
  446. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/_archived_eval_harness/hle_eval.py.deprecated +0 -0
  447. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/admiral_probe.py +0 -0
  448. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/auto_test_loop.sh +0 -0
  449. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/monitor_test_battery.sh +0 -0
  450. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/overnight_agents_test.sh +0 -0
  451. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/test_bank.sh +0 -0
  452. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/test_full.sh +0 -0
  453. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/test_smoke.sh +0 -0
  454. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/archive/tui_test.py +0 -0
  455. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/audit_sampler.py +0 -0
  456. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/auto_generate_tests.py +0 -0
  457. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/auto_release.sh +0 -0
  458. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/autonomous_review.sh +0 -0
  459. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/autonomous_review_prompt.md +0 -0
  460. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/backfill_hle_curiosity.py +0 -0
  461. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/backup.sh +0 -0
  462. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/bench_inference.py +0 -0
  463. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/bump_version.py +0 -0
  464. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/classify_pulse.sh +0 -0
  465. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/consume_retrieval_queue.py +0 -0
  466. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/curiosity_idle_cycle.sh +0 -0
  467. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/dedupe_dispatch_queues.py +0 -0
  468. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/deploy_to_github.sh +0 -0
  469. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/dispatch_report.py +0 -0
  470. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/drydock_status.sh +0 -0
  471. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/fetch_arxiv_abstracts.py +0 -0
  472. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/gen_2000_prompts.py +0 -0
  473. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/hle_aggregate.py +0 -0
  474. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/hle_eval_seed.jsonl +0 -0
  475. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/llm_balancer.py +0 -0
  476. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/notify_release.py +0 -0
  477. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/perf_baseline_when_idle.sh +0 -0
  478. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/perf_sweep.py +0 -0
  479. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/poll_issues.sh +0 -0
  480. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/publish_to_pypi.sh +0 -0
  481. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/queue_top.py +0 -0
  482. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/ralph_loop.py +0 -0
  483. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/rejudge_hle.py +0 -0
  484. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/research_babysitter.sh +0 -0
  485. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown_interactive.py +0 -0
  486. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown_suite.sh +0 -0
  487. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/shakedown_variance.sh +0 -0
  488. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/start_steering_sidecar.sh +0 -0
  489. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_babysitter.sh +0 -0
  490. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_50.txt +0 -0
  491. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_realuser.txt +0 -0
  492. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_tool_agent.txt +0 -0
  493. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  494. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_telegram_status.py +0 -0
  495. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/stress_watcher.py +0 -0
  496. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/telegram_bot.py +0 -0
  497. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/tool_usage_report.py +0 -0
  498. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/scripts/vllm_failover.sh +0 -0
  499. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/__init__.py +0 -0
  500. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/conftest.py +0 -0
  501. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_acp.py +0 -0
  502. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_agent_thought.py +0 -0
  503. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_bash.py +0 -0
  504. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_compact_session_updates.py +0 -0
  505. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_content.py +0 -0
  506. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_initialize.py +0 -0
  507. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_list_sessions.py +0 -0
  508. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_load_session.py +0 -0
  509. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_multi_session.py +0 -0
  510. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_new_session.py +0 -0
  511. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_proxy_setup_acp.py +0 -0
  512. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_read_file.py +0 -0
  513. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_search_replace.py +0 -0
  514. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_set_config_option.py +0 -0
  515. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_set_mode.py +0 -0
  516. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_set_model.py +0 -0
  517. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_tool_call_session_update.py +0 -0
  518. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_utils.py +0 -0
  519. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/acp/test_write_file.py +0 -0
  520. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_file_indexer.py +0 -0
  521. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_fuzzy.py +0 -0
  522. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  523. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  524. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_completion_controller.py +0 -0
  525. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  526. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_slash_command_controller.py +0 -0
  527. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  528. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/__init__.py +0 -0
  529. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/data/__init__.py +0 -0
  530. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/data/fireworks.py +0 -0
  531. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/data/mistral.py +0 -0
  532. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_anthropic_adapter.py +0 -0
  533. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_backend.py +0 -0
  534. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  535. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_reasoning_adapter.py +0 -0
  536. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  537. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  538. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  539. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  540. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_bell_notifications.py +0 -0
  541. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_braille_renderer.py +0 -0
  542. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_clipboard.py +0 -0
  543. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_commands.py +0 -0
  544. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_copy_shortcuts.py +0 -0
  545. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_external_editor.py +0 -0
  546. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_no_markup_static.py +0 -0
  547. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_question_app.py +0 -0
  548. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_spinner.py +0 -0
  549. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_switching_mode.py +0 -0
  550. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  551. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  552. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_session_resume.py +0 -0
  553. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/test_ui_skill_dispatch.py +0 -0
  554. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/textual_ui/__init__.py +0 -0
  555. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/cli/textual_ui/test_session_picker.py +0 -0
  556. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/conftest.py +0 -0
  557. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_agents.py +0 -0
  558. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_auth_crypto.py +0 -0
  559. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_auth_github.py +0 -0
  560. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  561. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  562. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_config_load_dotenv.py +0 -0
  563. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_config_paths.py +0 -0
  564. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_config_resolution.py +0 -0
  565. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_file_logging.py +0 -0
  566. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_plan_session.py +0 -0
  567. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_proxy_setup.py +0 -0
  568. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_slug.py +0 -0
  569. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_telemetry_send.py +0 -0
  570. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_teleport_git.py +0 -0
  571. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_teleport_nuage.py +0 -0
  572. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_teleport_service.py +0 -0
  573. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_trusted_folders.py +0 -0
  574. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/core/test_utils.py +0 -0
  575. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/common.py +0 -0
  576. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/conftest.py +0 -0
  577. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/mock_server.py +0 -0
  578. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  579. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/test_cli_tui_streaming.py +0 -0
  580. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  581. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/fixtures/doc_qa_system_prd.md +0 -0
  582. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/__init__.py +0 -0
  583. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/mock_backend_factory.py +0 -0
  584. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/mock_entrypoint.py +0 -0
  585. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/mock/utils.py +0 -0
  586. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/onboarding/test_run_onboarding.py +0 -0
  587. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/onboarding/test_ui_onboarding.py +0 -0
  588. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/session/test_session_loader.py +0 -0
  589. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/session/test_session_logger.py +0 -0
  590. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/session/test_session_migration.py +0 -0
  591. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/conftest.py +0 -0
  592. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/test_manager.py +0 -0
  593. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/test_models.py +0 -0
  594. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/skills/test_parser.py +0 -0
  595. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  596. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  597. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  598. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  599. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  600. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  601. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  602. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  603. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  604. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  605. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  606. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  607. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  608. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  609. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  610. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  611. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  612. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  613. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  614. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  615. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  616. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  617. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  618. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  619. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  620. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  621. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  622. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  623. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  624. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  625. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  626. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  627. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  628. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  629. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  630. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  631. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  632. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  633. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  634. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  635. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  636. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  637. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  638. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  639. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  640. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  641. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  642. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  643. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  644. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  645. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  646. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  647. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  648. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  649. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  650. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  651. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  652. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  653. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  654. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  655. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/base_snapshot_test_app.py +0 -0
  656. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/conftest.py +0 -0
  657. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/snap_compare.py +0 -0
  658. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  659. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  660. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  661. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  662. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  663. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  664. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  665. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  666. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  667. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  668. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  669. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  670. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  671. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  672. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/stubs/fake_backend.py +0 -0
  673. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/stubs/fake_client.py +0 -0
  674. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/stubs/fake_tool.py +0 -0
  675. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral.py +0 -0
  676. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  677. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_intervention_outcome.py +0 -0
  678. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_phase3.py +0 -0
  679. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_proposed.py +0 -0
  680. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_session_id.py +0 -0
  681. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_admiral_struggle_dedup.py +0 -0
  682. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_auto_compact.py +0 -0
  683. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_backend.py +0 -0
  684. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_observer_streaming.py +0 -0
  685. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_stats.py +0 -0
  686. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_tasks.py +0 -0
  687. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agent_tool_call.py +0 -0
  688. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_agents.py +0 -0
  689. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_algebra_tool.py +0 -0
  690. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_api_error_recovery.py +0 -0
  691. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  692. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_auto_solve.py +0 -0
  693. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_build.py +0 -0
  694. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_debug.py +0 -0
  695. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_multiagent.py +0 -0
  696. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_prd.py +0 -0
  697. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_prd_extended.py +0 -0
  698. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_tools.py +0 -0
  699. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_bank_update.py +0 -0
  700. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_build_projects.py +0 -0
  701. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_checkpoint.py +0 -0
  702. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_chemistry_tool.py +0 -0
  703. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_classifier.py +0 -0
  704. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_cli_programmatic_preload.py +0 -0
  705. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_config_migration.py +0 -0
  706. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_constraint_extract.py +0 -0
  707. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_constraint_hint.py +0 -0
  708. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_context_recovery.py +0 -0
  709. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_count_tool.py +0 -0
  710. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_curiosity.py +0 -0
  711. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_current_bugs.py +0 -0
  712. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_dispatch_report.py +0 -0
  713. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_dispatcher.py +0 -0
  714. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_drydock_regression.py +0 -0
  715. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_drydock_tasks.py +0 -0
  716. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  717. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_full_regression.py +0 -0
  718. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_goal.py +0 -0
  719. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_graphrag.py +0 -0
  720. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_graphrag_worked_examples.py +0 -0
  721. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hallucinated_tool_suppression.py +0 -0
  722. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_history_manager.py +0 -0
  723. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hle_aggregate.py +0 -0
  724. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hle_score_method_split.py +0 -0
  725. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_hle_typing.py +0 -0
  726. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_integration.py +0 -0
  727. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_issue_fixes.py +0 -0
  728. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_linear_algebra_tool.py +0 -0
  729. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_local_detect.py +0 -0
  730. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_logic_tool.py +0 -0
  731. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_loop_detection.py +0 -0
  732. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_math_tool.py +0 -0
  733. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_mcp_settings.py +0 -0
  734. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_memory_tool.py +0 -0
  735. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_message_id.py +0 -0
  736. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_message_merging.py +0 -0
  737. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_middleware.py +0 -0
  738. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_multi_agent.py +0 -0
  739. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_number_theory_tool.py +0 -0
  740. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_prolog_tool.py +0 -0
  741. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_read_file_not_found_listing.py +0 -0
  742. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_real_failures.py +0 -0
  743. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_real_issues.py +0 -0
  744. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_real_workflow.py +0 -0
  745. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_reasoning_content.py +0 -0
  746. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_rejudge_hle.py +0 -0
  747. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_retrieval_consumer.py +0 -0
  748. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_retrieve_tool.py +0 -0
  749. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_search_replace_args_not_truncated.py +0 -0
  750. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_set_tool.py +0 -0
  751. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_smoke.py +0 -0
  752. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_solve_tool.py +0 -0
  753. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_stats_tool.py +0 -0
  754. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering.py +0 -0
  755. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_capture.py +0 -0
  756. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_compute_vector.py +0 -0
  757. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_extract_pairs.py +0 -0
  758. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_hook.py +0 -0
  759. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  760. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_steering_sidecar_hooks.py +0 -0
  761. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_system_prompt.py +0 -0
  762. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_tagged_text.py +0 -0
  763. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_task_complete_nudge.py +0 -0
  764. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_tool_args.py +0 -0
  765. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncate_args_valid_json.py +0 -0
  766. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncated_arg_path_hint.py +0 -0
  767. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncated_search_replace_escalation.py +0 -0
  768. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_truncated_write_escalation.py +0 -0
  769. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_ui_external_editor.py +0 -0
  770. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_ui_input_history.py +0 -0
  771. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_units_tool.py +0 -0
  772. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_user_issues.py +0 -0
  773. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_verify_tool.py +0 -0
  774. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_wall_of_text_rescue.py +0 -0
  775. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_workloads.py +0 -0
  776. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/test_write_file_missing_path.py +0 -0
  777. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/testbank_helpers.py +0 -0
  778. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_ask_user_question.py +0 -0
  779. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash.py +0 -0
  780. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  781. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_consec_empty_search.py +0 -0
  782. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  783. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  784. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  785. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  786. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  787. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  788. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  789. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_exit_plan_mode.py +0 -0
  790. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_grep.py +0 -0
  791. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  792. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_invoke_context.py +0 -0
  793. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  794. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_manager_get_tool_config.py +0 -0
  795. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_mcp.py +0 -0
  796. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_mcp_sampling.py +0 -0
  797. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  798. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  799. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_directory.py +0 -0
  800. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_read_file_limit_truncation.py +0 -0
  801. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_append_fallback.py +0 -0
  802. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_dir_path.py +0 -0
  803. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_empty_content.py +0 -0
  804. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_file_not_found.py +0 -0
  805. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  806. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_hard_stop.py +0 -0
  807. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_malformed_block.py +0 -0
  808. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  809. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_placeholder.py +0 -0
  810. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  811. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_task.py +0 -0
  812. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_ui_bash_execution.py +0 -0
  813. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_webfetch.py +0 -0
  814. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_websearch.py +0 -0
  815. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  816. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  817. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  818. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  819. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_do_update.py +0 -0
  820. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  821. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_github_update_gateway.py +0 -0
  822. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  823. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_ui_update_notification.py +0 -0
  824. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_update_use_case.py +0 -0
  825. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/tests/update_notifier/test_whats_new.py +0 -0
  826. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/uv.lock +0 -0
  827. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/README.md +0 -0
  828. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/cli_subcommand_dispatch.py +0 -0
  829. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/lookup.json +0 -0
  830. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/sql_parser.py +0 -0
  831. {drydock_cli-2.8.50 → drydock_cli-2.8.52}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2492908
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.50
3
+ Version: 2.8.52
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
@@ -480,9 +480,58 @@ class DrydockApp(App): # noqa: PLR0904
480
480
 
481
481
  await self._handle_user_message(value)
482
482
 
483
+ async def on_approval_app_stray_key(
484
+ self, message: ApprovalApp.StrayKey
485
+ ) -> None:
486
+ """The approval modal forwarded a stray keystroke (user started
487
+ typing chat input while the modal was up). Buffer printable chars
488
+ into a scratch string; flush as one pending message on Enter.
489
+
490
+ Without this, real users hitting an approval modal mid-type lose
491
+ every character they tap — the modal swallows everything not in
492
+ its 1/y/2/3/n/up/down/enter bindings. Stress harness exposed it
493
+ as 30% SKIP rate; root cause is the same for real interactive
494
+ users."""
495
+ if not hasattr(self, "_stray_key_buffer"):
496
+ self._stray_key_buffer: str = ""
497
+ if not hasattr(self, "_pending_messages"):
498
+ self._pending_messages: list[str] = []
499
+
500
+ if message.is_enter:
501
+ buf = self._stray_key_buffer.strip()
502
+ if buf:
503
+ self._pending_messages.append(buf)
504
+ self._stray_key_buffer = ""
505
+ # Tell the user we caught their stray input
506
+ try:
507
+ await self._mount_and_scroll(UserCommandMessage(
508
+ f"_Queued chat input typed during approval modal "
509
+ f"({len(buf)} chars): \"{buf[:60]}…\". Will run "
510
+ f"after the modal closes._"
511
+ ))
512
+ except Exception:
513
+ pass
514
+ return
515
+
516
+ if message.text:
517
+ self._stray_key_buffer += message.text
518
+
519
+ def _flush_stray_key_buffer(self) -> None:
520
+ """Move any buffered stray-key text to _pending_messages.
521
+ Called from every approval-close path so chars typed during the
522
+ modal aren't lost even if the user didn't press Enter."""
523
+ buf = getattr(self, "_stray_key_buffer", "").strip()
524
+ if not buf:
525
+ return
526
+ if not hasattr(self, "_pending_messages"):
527
+ self._pending_messages = []
528
+ self._pending_messages.append(buf)
529
+ self._stray_key_buffer = ""
530
+
483
531
  async def on_approval_app_approval_granted(
484
532
  self, message: ApprovalApp.ApprovalGranted
485
533
  ) -> None:
534
+ self._flush_stray_key_buffer()
486
535
  if self._pending_approval and not self._pending_approval.done():
487
536
  self._pending_approval.set_result((ApprovalResponse.YES, None))
488
537
 
@@ -491,6 +540,7 @@ class DrydockApp(App): # noqa: PLR0904
491
540
  async def on_approval_app_approval_granted_always_tool(
492
541
  self, message: ApprovalApp.ApprovalGrantedAlwaysTool
493
542
  ) -> None:
543
+ self._flush_stray_key_buffer()
494
544
  self._set_tool_permission_always(
495
545
  message.tool_name, save_permanently=message.save_permanently
496
546
  )
@@ -503,6 +553,7 @@ class DrydockApp(App): # noqa: PLR0904
503
553
  async def on_approval_app_approval_rejected(
504
554
  self, message: ApprovalApp.ApprovalRejected
505
555
  ) -> None:
556
+ self._flush_stray_key_buffer()
506
557
  if self._pending_approval and not self._pending_approval.done():
507
558
  feedback = str(
508
559
  get_user_cancellation_message(CancellationReason.OPERATION_CANCELLED)
@@ -45,6 +45,25 @@ class ApprovalApp(Container):
45
45
  self.tool_args = tool_args
46
46
  self.save_permanently = save_permanently
47
47
 
48
+ class StrayKey(Message):
49
+ """User started typing chat input while the modal was up.
50
+
51
+ Real users (and the pexpect-based stress harness) hit this when
52
+ an approval modal appears mid-conversation: their keystrokes get
53
+ routed to ApprovalApp, which only binds up/down/enter/1/y/2/3/n
54
+ and silently drops everything else. Before this fix, those
55
+ characters disappeared into the void; the user assumed the TUI
56
+ was ignoring them and re-typed (or gave up).
57
+
58
+ Now we forward stray printable characters AND Enter to the main
59
+ app, which appends them to `_pending_messages` so they replay
60
+ into the chat input after the modal closes.
61
+ """
62
+ def __init__(self, text: str, is_enter: bool = False) -> None:
63
+ super().__init__()
64
+ self.text = text
65
+ self.is_enter = is_enter
66
+
48
67
  class ApprovalRejected(Message):
49
68
  def __init__(self, tool_name: str, tool_args: BaseModel) -> None:
50
69
  super().__init__()
@@ -138,6 +157,30 @@ class ApprovalApp(Container):
138
157
  else:
139
158
  widget.add_class("approval-option-no")
140
159
 
160
+ async def on_key(self, event: events.Key) -> None:
161
+ """Catch printable characters that aren't in BINDINGS and forward
162
+ them to the main app's pending-messages queue instead of silently
163
+ dropping them. Without this, a user (or pexpect harness) who types
164
+ chat input while the modal is up loses every keystroke.
165
+
166
+ Bound keys (up/down/enter/1/y/2/3/n) are handled by Textual's
167
+ binding system BEFORE on_key fires for unmatched events — so we
168
+ only ever see the stray ones here.
169
+
170
+ We accept any single printable character. Enter is treated as a
171
+ message-send boundary: flush the buffered stray-key text as one
172
+ pending message. The flush boundary lives on the App side so we
173
+ can preserve typing rhythm across multiple modals."""
174
+ if event.character and event.character.isprintable():
175
+ self.post_message(self.StrayKey(text=event.character, is_enter=False))
176
+ event.stop()
177
+ elif event.key == "enter":
178
+ # Enter without any pending stray text means the user
179
+ # confirmed the focused option — let the BINDINGS handle it.
180
+ # (This on_key won't fire for "enter" if the binding consumed
181
+ # it first.) Forward as flush marker just in case.
182
+ self.post_message(self.StrayKey(text="", is_enter=True))
183
+
141
184
  def action_move_up(self) -> None:
142
185
  self.selected_option = (self.selected_option - 1) % 3
143
186
  self._update_options()
@@ -322,10 +322,24 @@ class AgentLoop:
322
322
  per-turn iteration in `act()` and surfaced to the model as a SYSTEM
323
323
  note on the last tool result so message ordering stays valid for
324
324
  vLLM/Mistral.
325
+
326
+ Side-effect: logs the queue event via the session logger so a
327
+ replay (or a harness/watcher) can see that the message was
328
+ accepted, even though it won't appear in `self.messages` until
329
+ the drain runs. Without this, debugging "did my queued message
330
+ land?" requires waiting for the next turn boundary.
325
331
  """
326
332
  cleaned = (text or "").strip()
327
333
  if cleaned:
328
334
  self._pending_user_injections.append(cleaned)
335
+ try:
336
+ self.session_logger.log_event({
337
+ "event": "user_injection_queued",
338
+ "text": cleaned[:1000],
339
+ "pending_count": len(self._pending_user_injections),
340
+ })
341
+ except Exception as _e: # noqa: BLE001 — never block queueing on logger failure
342
+ logger.debug("[injection] session log_event failed: %s", _e)
329
343
 
330
344
  def _drain_user_injections(self) -> None:
331
345
  """Pull any queued user messages into the current turn's context.
@@ -81,6 +81,30 @@ class SessionLogger:
81
81
  )
82
82
  return self.session_dir / MESSAGES_FILENAME
83
83
 
84
+ def log_event(self, event: dict) -> None:
85
+ """Append a structured event to <session_dir>/events.jsonl.
86
+
87
+ Used for things that aren't conversation messages but ARE
88
+ worth recording for replay/debugging — e.g.
89
+ user_injection_queued (typed during agent run), tool_recycled,
90
+ modal_opened, etc. Fail-silent: never raise.
91
+
92
+ Creates session_dir on first call if it doesn't exist yet
93
+ (early-session events can fire before persist_messages
94
+ materialises the dir).
95
+ """
96
+ if self.session_dir is None:
97
+ return
98
+ try:
99
+ import json as _json
100
+ import time as _time
101
+ event_with_ts = {"ts": _time.time(), **event}
102
+ self.session_dir.mkdir(parents=True, exist_ok=True)
103
+ with (self.session_dir / "events.jsonl").open("a") as f:
104
+ f.write(_json.dumps(event_with_ts) + "\n")
105
+ except Exception: # noqa: BLE001 — never block on logging
106
+ pass
107
+
84
108
  @property
85
109
  def git_commit(self) -> str | None:
86
110
  try:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.8.50"
3
+ version = "2.8.52"
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"
@@ -362,8 +362,14 @@ class DrydockDriver:
362
362
  "COLUMNS": "120",
363
363
  "LINES": "30",
364
364
  }
365
+ # Match the operator's real daily-driver: `drydock
366
+ # --dangerously-skip-permissions`. Without this flag, every
367
+ # tool call that would prompt for approval pops a modal the
368
+ # harness can't dismiss, leading to a SKIP cascade. The real
369
+ # user has approvals pre-granted via this flag.
365
370
  self.child = pexpect.spawn(
366
371
  DRYDOCK_BIN,
372
+ args=["--dangerously-skip-permissions"],
367
373
  encoding="utf-8",
368
374
  timeout=5,
369
375
  maxread=100000,
@@ -429,8 +429,16 @@ def _spawn_tui_child(log_path: Path, cwd: Path,
429
429
  spawn configuration. Appends to the existing log (don't wipe the
430
430
  history — the watcher is polling it and the prior content is useful
431
431
  for post-mortem)."""
432
- child = pexpect.spawn(DRYDOCK_BIN, encoding="utf-8", timeout=5,
433
- maxread=100000, env=env, cwd=str(cwd))
432
+ # Match the operator's real daily-driver config: they run drydock
433
+ # with --dangerously-skip-permissions, so the stress harness should
434
+ # too. Without this, every tool call that requires approval pops a
435
+ # modal that the harness can't dismiss → SKIP cascade. The user's
436
+ # real TUI never hits this path because approvals are pre-granted.
437
+ child = pexpect.spawn(
438
+ DRYDOCK_BIN, args=["--dangerously-skip-permissions"],
439
+ encoding="utf-8", timeout=5,
440
+ maxread=100000, env=env, cwd=str(cwd),
441
+ )
434
442
  child.logfile_read = open(log_path, "a", buffering=1)
435
443
  child.expect([r">", r"Drydock", r"┌"], timeout=30)
436
444
  time.sleep(2)
@@ -0,0 +1,92 @@
1
+ """Regression tests for the approval-modal-eats-keystrokes fix.
2
+
3
+ Bug: when ApprovalApp had focus, any printable character that wasn't
4
+ in its BINDINGS (up/down/enter/1/y/2/3/n) was silently swallowed.
5
+ Real users typing chat input mid-modal lost every keystroke. The
6
+ stress harness surfaced it as a 30% SKIP rate ("TUI did not accept
7
+ after 3 retries") because pexpect can't see the modal and just
8
+ types — the modal ate the prompt, harness re-tried 3x, gave up.
9
+
10
+ Fix: ApprovalApp.on_key catches stray printable chars and forwards
11
+ them to the main app via a StrayKey message. The main app buffers
12
+ them and either:
13
+ - Flushes the buffer on Enter (treats it as a queued chat input)
14
+ - Flushes on modal close (approval granted / always-tool / rejected)
15
+ into `_pending_messages` so they replay after the modal closes.
16
+ """
17
+ from __future__ import annotations
18
+
19
+ import inspect
20
+
21
+ from drydock.cli.textual_ui.widgets.approval_app import ApprovalApp
22
+
23
+
24
+ # ── ApprovalApp must expose StrayKey + on_key ───────────────────────────
25
+
26
+ def test_stray_key_message_class_exists():
27
+ """ApprovalApp.StrayKey is the message contract the main app
28
+ listens for. Must accept text + is_enter."""
29
+ cls = getattr(ApprovalApp, "StrayKey", None)
30
+ assert cls is not None
31
+ msg = cls(text="abc", is_enter=False)
32
+ assert msg.text == "abc"
33
+ assert msg.is_enter is False
34
+ msg2 = cls(text="", is_enter=True)
35
+ assert msg2.is_enter is True
36
+
37
+
38
+ def test_on_key_handler_exists_and_is_async():
39
+ """Without on_key, the modal's BINDINGS still swallow everything
40
+ not in {up,down,enter,1,y,2,3,n}. on_key must catch the rest."""
41
+ method = getattr(ApprovalApp, "on_key", None)
42
+ assert method is not None
43
+ assert inspect.iscoroutinefunction(method)
44
+
45
+
46
+ def test_on_key_source_forwards_printable_chars():
47
+ """String-grep regression — catches future refactors that remove
48
+ the StrayKey forwarding."""
49
+ src = inspect.getsource(ApprovalApp.on_key)
50
+ assert "StrayKey" in src
51
+ assert "post_message" in src
52
+ assert "isprintable" in src
53
+
54
+
55
+ # ── Main app handler ────────────────────────────────────────────────────
56
+
57
+ def test_main_app_has_stray_key_handler():
58
+ """app.py must implement on_approval_app_stray_key — Textual's
59
+ automatic event routing relies on the snake_case naming
60
+ convention `on_<sender_class>_<message_class>`."""
61
+ from drydock.cli.textual_ui.app import DrydockApp
62
+ method = getattr(DrydockApp, "on_approval_app_stray_key", None)
63
+ assert method is not None
64
+ assert inspect.iscoroutinefunction(method)
65
+
66
+
67
+ def test_main_app_flushes_buffer_on_approval_close():
68
+ """All three approval-close paths (granted / always-tool / rejected)
69
+ must call _flush_stray_key_buffer so chars typed during the modal
70
+ aren't lost even if the user didn't press Enter."""
71
+ from drydock.cli.textual_ui.app import DrydockApp
72
+ for handler_name in (
73
+ "on_approval_app_approval_granted",
74
+ "on_approval_app_approval_granted_always_tool",
75
+ "on_approval_app_approval_rejected",
76
+ ):
77
+ handler = getattr(DrydockApp, handler_name, None)
78
+ assert handler is not None
79
+ src = inspect.getsource(handler)
80
+ assert "_flush_stray_key_buffer" in src, (
81
+ f"{handler_name} must call _flush_stray_key_buffer "
82
+ f"so the stray-key buffer doesn't leak across modals"
83
+ )
84
+
85
+
86
+ def test_flush_method_exists():
87
+ from drydock.cli.textual_ui.app import DrydockApp
88
+ method = getattr(DrydockApp, "_flush_stray_key_buffer", None)
89
+ assert method is not None
90
+ src = inspect.getsource(method)
91
+ assert "_stray_key_buffer" in src
92
+ assert "_pending_messages" in src
@@ -0,0 +1,89 @@
1
+ """Tests for SessionLogger.log_event + agent_loop.queue_user_injection
2
+ session-log integration.
3
+
4
+ The bug: when the user typed during an agent turn, queue_user_injection
5
+ recorded the message in an in-memory list but didn't write anything to
6
+ the session log until the NEXT turn boundary drained it. For long
7
+ multi-tool turns (5+ minutes), this made the on-disk session log
8
+ silently lag behind what the user had typed — debugging "did my queued
9
+ message land?" required waiting.
10
+
11
+ Fix: SessionLogger.log_event appends structured events to
12
+ <session_dir>/events.jsonl. queue_user_injection calls it with
13
+ event=user_injection_queued so the queue is visible immediately.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import json
18
+ import tempfile
19
+ from pathlib import Path
20
+
21
+ from drydock.core.config import SessionLoggingConfig
22
+ from drydock.core.session.session_logger import SessionLogger
23
+
24
+
25
+ # ── SessionLogger.log_event ────────────────────────────────────────────
26
+
27
+ def test_log_event_writes_jsonl():
28
+ with tempfile.TemporaryDirectory() as tmp:
29
+ cfg = SessionLoggingConfig(enabled=True, save_dir=tmp)
30
+ sl = SessionLogger(cfg, "abc12345-deadbeef")
31
+ sl.log_event({"event": "test", "value": 42})
32
+ sl.log_event({"event": "test2", "value": "x"})
33
+ events_file = sl.session_dir / "events.jsonl"
34
+ assert events_file.is_file()
35
+ lines = events_file.read_text().strip().split("\n")
36
+ assert len(lines) == 2
37
+ r0 = json.loads(lines[0])
38
+ assert r0["event"] == "test"
39
+ assert r0["value"] == 42
40
+ assert "ts" in r0 # auto-added timestamp
41
+
42
+
43
+ def test_log_event_no_crash_when_logging_disabled():
44
+ cfg = SessionLoggingConfig(enabled=False, save_dir="")
45
+ sl = SessionLogger(cfg, "test")
46
+ # Must be a no-op, must not raise
47
+ sl.log_event({"event": "should_be_dropped"})
48
+ assert sl.session_dir is None
49
+
50
+
51
+ def test_log_event_creates_session_dir_if_missing():
52
+ """Early-session events (queue_user_injection during the very first
53
+ turn) can fire before persist_messages has materialised the dir.
54
+ log_event must create it on demand."""
55
+ with tempfile.TemporaryDirectory() as tmp:
56
+ cfg = SessionLoggingConfig(enabled=True, save_dir=tmp)
57
+ sl = SessionLogger(cfg, "newid-test")
58
+ # session_dir was assigned in __init__ but the directory itself
59
+ # may not exist yet (save_folder is computed, save_dir.mkdir is
60
+ # called but session_dir is a subdir).
61
+ sl.log_event({"event": "early"})
62
+ assert sl.session_dir.is_dir()
63
+ assert (sl.session_dir / "events.jsonl").is_file()
64
+
65
+
66
+ def test_log_event_silent_on_failure():
67
+ """Disk errors / permission issues must not break the caller."""
68
+ cfg = SessionLoggingConfig(enabled=True, save_dir="/nonexistent/path/cannot/write")
69
+ try:
70
+ sl = SessionLogger(cfg, "x")
71
+ except (OSError, PermissionError):
72
+ # If init itself fails, we can't test log_event — fine, the
73
+ # silent-on-failure guarantee is for steady-state writes
74
+ return
75
+ # If init succeeded somehow, log_event must still not raise
76
+ sl.log_event({"event": "doomed"})
77
+
78
+
79
+ # ── queue_user_injection emits the event ───────────────────────────────
80
+
81
+ def test_queue_user_injection_emits_session_event():
82
+ """String-grep regression: agent_loop.queue_user_injection must
83
+ call session_logger.log_event so the queue is visible in
84
+ events.jsonl immediately, not just after the next drain."""
85
+ import inspect
86
+ from drydock.core.agent_loop import AgentLoop
87
+ src = inspect.getsource(AgentLoop.queue_user_injection)
88
+ assert "log_event" in src
89
+ assert "user_injection_queued" in src
@@ -1,5 +1,14 @@
1
1
  # Drydock Trip Log
2
2
 
3
+ ## 2026-05-17 16:00 UTC tick
4
+ - Stress: step 26/1658, just restarted at 16:00 UTC by hourly babysitter (stress PID 2482864, .pause_stress sentinel present but stress running — babysitter may not check it)
5
+ - Write rate: N/A (just restarted this tick)
6
+ - Admiral last 30 min: N/A
7
+ - vLLM 400s: 0 errors in llamacpp-gemma4 last 30m
8
+ - GH issues: 0 open
9
+ - Dispatch queue: harness=7 (all stale thinking_stall, resolved by v2.8.47+v2.8.48), retrieval=0 actionable, curiosity=2546 pending (409 hle_failure, 2137 unknown_term — all HLE-related, HLE paused via sentinels)
10
+ - Action this tick: no action — system healthy; queued harness items all historical; top curiosity items are hard-math HLE timeouts which cannot be evaluated with HLE paused per operator directive (CLAUDE.md 2026-05-17); retrieval queue already up to date
11
+
3
12
  ## 2026-05-17 15:30 UTC tick
4
13
  - Stress: PAUSED (.pause_stress sentinel active)
5
14
  - HLE burndown: running (PID 2465533 engineering batch, slot 59, ~51 min elapsed), lifetime 115/848 = 13.6% (Math 17.8%, CS/AI 6.8%, Bio/Med 13.2%, Physics 8.3%, Chem 8.7%); babysitter skipping correctly while burndown active
@@ -1 +0,0 @@
1
- 2480262
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes