drydock-cli 2.2.7__tar.gz → 2.2.9__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 (516) hide show
  1. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/PKG-INFO +1 -1
  2. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agent_loop.py +139 -49
  3. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/search_replace.py +13 -2
  4. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/pyproject.toml +1 -1
  5. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/CODEOWNERS +0 -0
  6. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  7. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  8. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  9. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/build-and-upload.yml +0 -0
  10. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/ci.yml +0 -0
  11. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/issue-labeler.yml +0 -0
  12. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.github/workflows/release.yml +0 -0
  13. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.gitignore +0 -0
  14. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.pre-commit-config.yaml +0 -0
  15. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.python-version +0 -0
  16. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.typos.toml +0 -0
  17. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.vscode/extensions.json +0 -0
  18. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.vscode/launch.json +0 -0
  19. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/.vscode/settings.json +0 -0
  20. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/AGENTS.md +0 -0
  21. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/CHANGELOG.md +0 -0
  22. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/CLAUDE.md +0 -0
  23. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/CONTRIBUTING.md +0 -0
  24. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/Drydock_rebrand.md +0 -0
  25. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/LICENSE +0 -0
  26. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/NOTICE +0 -0
  27. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/PRD.md +0 -0
  28. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/README.md +0 -0
  29. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/action.yml +0 -0
  30. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/distribution/zed/LICENSE +0 -0
  31. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/distribution/zed/extension.toml +0 -0
  32. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/distribution/zed/icons/mistral_vibe.svg +0 -0
  33. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/docs/README.md +0 -0
  34. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/docs/acp-setup.md +0 -0
  35. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/docs/proxy-setup.md +0 -0
  36. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/__init__.py +0 -0
  37. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/__init__.py +0 -0
  38. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/acp_agent_loop.py +0 -0
  39. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/acp_logger.py +0 -0
  40. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/entrypoint.py +0 -0
  41. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/__init__.py +0 -0
  42. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/base.py +0 -0
  43. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/bash.py +0 -0
  44. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/read_file.py +0 -0
  45. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/search_replace.py +0 -0
  46. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/todo.py +0 -0
  47. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/builtins/write_file.py +0 -0
  48. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/tools/session_update.py +0 -0
  49. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/acp/utils.py +0 -0
  50. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/__init__.py +0 -0
  51. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/__init__.py +0 -0
  52. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/base.py +0 -0
  53. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/path_completion.py +0 -0
  54. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/autocompletion/slash_command.py +0 -0
  55. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/cli.py +0 -0
  56. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/clipboard.py +0 -0
  57. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/commands.py +0 -0
  58. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/entrypoint.py +0 -0
  59. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/history_manager.py +0 -0
  60. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  61. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  62. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  63. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/terminal_setup.py +0 -0
  64. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/__init__.py +0 -0
  65. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  66. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/app.py +0 -0
  67. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/app.tcss +0 -0
  68. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/external_editor.py +0 -0
  69. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  70. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  71. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  72. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  73. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  74. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  75. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  76. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  77. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  78. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  79. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  80. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  81. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  82. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  83. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  84. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  85. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  86. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  87. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  88. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  89. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  90. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  91. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  92. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  93. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  94. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  95. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  96. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  97. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  98. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  99. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  100. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  101. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  102. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  103. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  104. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  105. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/history.py +0 -0
  106. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  107. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/textual_ui/windowing/state.py +0 -0
  108. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/__init__.py +0 -0
  109. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  110. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  111. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  112. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  113. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  114. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/update.py +0 -0
  115. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/cli/update_notifier/whats_new.py +0 -0
  116. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/__init__.py +0 -0
  117. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agents/__init__.py +0 -0
  118. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agents/manager.py +0 -0
  119. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/agents/models.py +0 -0
  120. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/auth/__init__.py +0 -0
  121. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/auth/crypto.py +0 -0
  122. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/auth/github.py +0 -0
  123. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/__init__.py +0 -0
  124. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/completers.py +0 -0
  125. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  126. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  127. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  128. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  129. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  130. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/fuzzy.py +0 -0
  131. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/path_prompt.py +0 -0
  132. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  133. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/build_orchestrator.py +0 -0
  134. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/__init__.py +0 -0
  135. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/_settings.py +0 -0
  136. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/harness_files/__init__.py +0 -0
  137. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  138. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/config/harness_files/_paths.py +0 -0
  139. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/consultant.py +0 -0
  140. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/drydock_states.py +0 -0
  141. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/hooks.py +0 -0
  142. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/__init__.py +0 -0
  143. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/anthropic.py +0 -0
  144. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/base.py +0 -0
  145. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/factory.py +0 -0
  146. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/generic.py +0 -0
  147. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/mistral.py +0 -0
  148. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  149. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/backend/vertex.py +0 -0
  150. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/exceptions.py +0 -0
  151. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/format.py +0 -0
  152. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/message_utils.py +0 -0
  153. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/llm/types.py +0 -0
  154. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/logger.py +0 -0
  155. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/middleware.py +0 -0
  156. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/output_formatters.py +0 -0
  157. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/__init__.py +0 -0
  158. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/_local_config_walk.py +0 -0
  159. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/_vibe_home.py +0 -0
  160. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/paths/conventions.py +0 -0
  161. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/plan_session.py +0 -0
  162. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/plugins.py +0 -0
  163. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/programmatic.py +0 -0
  164. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/__init__.py +0 -0
  165. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/builder.md +0 -0
  166. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/cli.md +0 -0
  167. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/compact.md +0 -0
  168. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/dangerous_directory.md +0 -0
  169. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/diagnostic.md +0 -0
  170. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/explore.md +0 -0
  171. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/planner.md +0 -0
  172. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/project_context.md +0 -0
  173. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/prompts/tests.md +0 -0
  174. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/proxy_setup.py +0 -0
  175. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/agent_memory.py +0 -0
  176. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/checkpoints.py +0 -0
  177. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/session_loader.py +0 -0
  178. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/session_logger.py +0 -0
  179. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/session_migration.py +0 -0
  180. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/session/state_file.py +0 -0
  181. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/__init__.py +0 -0
  182. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/manager.py +0 -0
  183. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/models.py +0 -0
  184. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/skills/parser.py +0 -0
  185. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/slug.py +0 -0
  186. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/system_prompt.py +0 -0
  187. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/telemetry/__init__.py +0 -0
  188. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/telemetry/send.py +0 -0
  189. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/errors.py +0 -0
  190. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/git.py +0 -0
  191. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/nuage.py +0 -0
  192. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/teleport.py +0 -0
  193. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/teleport/types.py +0 -0
  194. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/base.py +0 -0
  195. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  196. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/bash.py +0 -0
  197. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/cron.py +0 -0
  198. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  199. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/glob_tool.py +0 -0
  200. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/grep.py +0 -0
  201. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  202. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/lsp.py +0 -0
  203. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  204. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  205. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/powershell.py +0 -0
  206. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  207. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  208. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  209. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  210. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  211. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  212. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  213. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  214. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  215. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  216. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  217. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  218. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  219. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  220. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/task.md +0 -0
  221. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  222. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  223. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  224. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  225. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  226. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  227. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  228. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/read_file.py +0 -0
  229. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/task.py +0 -0
  230. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/task_manager.py +0 -0
  231. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/todo.py +0 -0
  232. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/tool_search.py +0 -0
  233. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/webfetch.py +0 -0
  234. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/websearch.py +0 -0
  235. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/worktree.py +0 -0
  236. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/builtins/write_file.py +0 -0
  237. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/injection_guard.py +0 -0
  238. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/manager.py +0 -0
  239. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp/__init__.py +0 -0
  240. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp/registry.py +0 -0
  241. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp/tools.py +0 -0
  242. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/mcp_sampling.py +0 -0
  243. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/ui.py +0 -0
  244. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/tools/utils.py +0 -0
  245. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/trusted_folders.py +0 -0
  246. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/types.py +0 -0
  247. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/core/utils.py +0 -0
  248. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/__init__.py +0 -0
  249. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/base.py +0 -0
  250. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/onboarding.tcss +0 -0
  251. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/screens/__init__.py +0 -0
  252. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/screens/api_key.py +0 -0
  253. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/onboarding/screens/welcome.py +0 -0
  254. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  255. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  256. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/__init__.py +0 -0
  257. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/batch/SKILL.md +0 -0
  258. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/create-presentation/SKILL.md +0 -0
  259. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/deep-research/SKILL.md +0 -0
  260. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/investigate/SKILL.md +0 -0
  261. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/review/SKILL.md +0 -0
  262. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/ship/SKILL.md +0 -0
  263. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/skills/simplify/SKILL.md +0 -0
  264. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock/whats_new.md +0 -0
  265. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock-acp.spec +0 -0
  266. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/drydock_terms.md +0 -0
  267. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/flake.lock +0 -0
  268. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/flake.nix +0 -0
  269. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/README.md +0 -0
  270. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/auto_test_loop.sh +0 -0
  271. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/backup.sh +0 -0
  272. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/bump_version.py +0 -0
  273. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/deploy_to_github.sh +0 -0
  274. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/install.sh +0 -0
  275. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/monitor_swebench.sh +0 -0
  276. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/monitor_test_battery.sh +0 -0
  277. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/notify_release.py +0 -0
  278. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/overnight_agents_test.sh +0 -0
  279. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/prepare_release.py +0 -0
  280. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/publish_to_pypi.sh +0 -0
  281. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/test_bank.sh +0 -0
  282. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/test_full.sh +0 -0
  283. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/scripts/test_smoke.sh +0 -0
  284. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/__init__.py +0 -0
  285. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/conftest.py +0 -0
  286. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_acp.py +0 -0
  287. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_agent_thought.py +0 -0
  288. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_bash.py +0 -0
  289. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_compact_session_updates.py +0 -0
  290. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_content.py +0 -0
  291. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_initialize.py +0 -0
  292. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_list_sessions.py +0 -0
  293. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_load_session.py +0 -0
  294. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_multi_session.py +0 -0
  295. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_new_session.py +0 -0
  296. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_proxy_setup_acp.py +0 -0
  297. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_read_file.py +0 -0
  298. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_search_replace.py +0 -0
  299. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_set_config_option.py +0 -0
  300. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_set_mode.py +0 -0
  301. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_set_model.py +0 -0
  302. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_tool_call_session_update.py +0 -0
  303. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_utils.py +0 -0
  304. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/acp/test_write_file.py +0 -0
  305. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_file_indexer.py +0 -0
  306. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_fuzzy.py +0 -0
  307. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  308. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  309. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_completion_controller.py +0 -0
  310. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  311. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_slash_command_controller.py +0 -0
  312. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  313. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/__init__.py +0 -0
  314. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/data/__init__.py +0 -0
  315. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/data/fireworks.py +0 -0
  316. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/data/mistral.py +0 -0
  317. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_anthropic_adapter.py +0 -0
  318. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_backend.py +0 -0
  319. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_reasoning_adapter.py +0 -0
  320. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  321. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  322. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  323. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  324. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_bell_notifications.py +0 -0
  325. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_braille_renderer.py +0 -0
  326. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_clipboard.py +0 -0
  327. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_commands.py +0 -0
  328. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_copy_shortcuts.py +0 -0
  329. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_external_editor.py +0 -0
  330. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_no_markup_static.py +0 -0
  331. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_question_app.py +0 -0
  332. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_spinner.py +0 -0
  333. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_switching_mode.py +0 -0
  334. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  335. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  336. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_session_resume.py +0 -0
  337. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/test_ui_skill_dispatch.py +0 -0
  338. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/textual_ui/__init__.py +0 -0
  339. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/cli/textual_ui/test_session_picker.py +0 -0
  340. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/conftest.py +0 -0
  341. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_agents.py +0 -0
  342. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_auth_crypto.py +0 -0
  343. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_auth_github.py +0 -0
  344. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_config_load_dotenv.py +0 -0
  345. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_config_paths.py +0 -0
  346. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_config_resolution.py +0 -0
  347. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_file_logging.py +0 -0
  348. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_plan_session.py +0 -0
  349. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_proxy_setup.py +0 -0
  350. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_slug.py +0 -0
  351. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_telemetry_send.py +0 -0
  352. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_teleport_git.py +0 -0
  353. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_teleport_nuage.py +0 -0
  354. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_teleport_service.py +0 -0
  355. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_trusted_folders.py +0 -0
  356. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/core/test_utils.py +0 -0
  357. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/common.py +0 -0
  358. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/conftest.py +0 -0
  359. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/mock_server.py +0 -0
  360. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  361. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/test_cli_tui_streaming.py +0 -0
  362. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  363. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/__init__.py +0 -0
  364. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/mock_backend_factory.py +0 -0
  365. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/mock_entrypoint.py +0 -0
  366. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/mock/utils.py +0 -0
  367. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/onboarding/test_run_onboarding.py +0 -0
  368. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/onboarding/test_ui_onboarding.py +0 -0
  369. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/session/test_session_loader.py +0 -0
  370. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/session/test_session_logger.py +0 -0
  371. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/session/test_session_migration.py +0 -0
  372. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/conftest.py +0 -0
  373. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/test_manager.py +0 -0
  374. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/test_models.py +0 -0
  375. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/skills/test_parser.py +0 -0
  376. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  377. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  378. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  379. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  380. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  381. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  382. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  383. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  384. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  385. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  386. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  387. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  388. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  389. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  390. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  391. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  392. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  393. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  394. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  395. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  396. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  397. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  398. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  399. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  400. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  401. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  402. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  403. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  404. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  405. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  406. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  407. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  408. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  409. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  410. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  411. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  412. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  413. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  414. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  415. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  416. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  417. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  418. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  419. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  420. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  421. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  422. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  423. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  424. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  425. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  426. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  427. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  428. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  429. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  430. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  431. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  432. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  433. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  434. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  435. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  436. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/base_snapshot_test_app.py +0 -0
  437. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/conftest.py +0 -0
  438. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/snap_compare.py +0 -0
  439. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  440. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  441. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  442. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  443. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  444. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  445. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  446. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  447. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  448. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  449. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  450. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  451. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  452. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  453. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/stubs/fake_backend.py +0 -0
  454. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/stubs/fake_client.py +0 -0
  455. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/stubs/fake_tool.py +0 -0
  456. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_auto_compact.py +0 -0
  457. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_backend.py +0 -0
  458. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_observer_streaming.py +0 -0
  459. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_stats.py +0 -0
  460. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_tasks.py +0 -0
  461. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agent_tool_call.py +0 -0
  462. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_agents.py +0 -0
  463. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_build.py +0 -0
  464. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_debug.py +0 -0
  465. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_multiagent.py +0 -0
  466. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_prd.py +0 -0
  467. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_prd_extended.py +0 -0
  468. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_tools.py +0 -0
  469. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_bank_update.py +0 -0
  470. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_build_projects.py +0 -0
  471. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_cli_programmatic_preload.py +0 -0
  472. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_current_bugs.py +0 -0
  473. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_drydock_regression.py +0 -0
  474. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_drydock_tasks.py +0 -0
  475. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_full_regression.py +0 -0
  476. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_history_manager.py +0 -0
  477. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_integration.py +0 -0
  478. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_loop_detection.py +0 -0
  479. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_message_id.py +0 -0
  480. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_message_merging.py +0 -0
  481. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_middleware.py +0 -0
  482. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_multi_agent.py +0 -0
  483. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_real_failures.py +0 -0
  484. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_real_issues.py +0 -0
  485. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_real_workflow.py +0 -0
  486. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_reasoning_content.py +0 -0
  487. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_smoke.py +0 -0
  488. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_system_prompt.py +0 -0
  489. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_tagged_text.py +0 -0
  490. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_ui_external_editor.py +0 -0
  491. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_ui_input_history.py +0 -0
  492. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_user_issues.py +0 -0
  493. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/test_workloads.py +0 -0
  494. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/testbank_helpers.py +0 -0
  495. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_ask_user_question.py +0 -0
  496. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_bash.py +0 -0
  497. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_exit_plan_mode.py +0 -0
  498. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_grep.py +0 -0
  499. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_invoke_context.py +0 -0
  500. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_manager_get_tool_config.py +0 -0
  501. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_mcp.py +0 -0
  502. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_mcp_sampling.py +0 -0
  503. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_task.py +0 -0
  504. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_ui_bash_execution.py +0 -0
  505. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_webfetch.py +0 -0
  506. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/tools/test_websearch.py +0 -0
  507. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  508. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  509. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_do_update.py +0 -0
  510. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  511. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_github_update_gateway.py +0 -0
  512. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  513. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_ui_update_notification.py +0 -0
  514. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_update_use_case.py +0 -0
  515. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/tests/update_notifier/test_whats_new.py +0 -0
  516. {drydock_cli-2.2.7 → drydock_cli-2.2.9}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.2.7
3
+ Version: 2.2.9
4
4
  Summary: Drydock — nautical CLI coding agent
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -497,6 +497,8 @@ class AgentLoop:
497
497
  files_explored: list[str] = [] # Track files read for context state
498
498
  files_modified: list[str] = [] # Track files edited for blast radius
499
499
  context_summary_injected = False
500
+ self._temp_override: float | None = None # Temperature bump on loop detection
501
+ self._failed_approaches: list[str] = [] # Persistent failed approach tracker
500
502
  while not should_break_loop:
501
503
  # Loop protection: prevent infinite tool-call loops
502
504
  tool_turns += 1
@@ -861,57 +863,31 @@ class AgentLoop:
861
863
  if nudge_text:
862
864
  self._inject_system_note(nudge_text)
863
865
 
864
- # Loop guidance — prune duplicates and nudge, NEVER stop
866
+ # Loop guidance — retrospection, NEVER stop
865
867
  if not should_break_loop:
866
868
  rep = self._check_tool_call_repetition()
867
869
  if rep == "FORCE_STOP" or (rep and rep.startswith("WARNING")):
868
- stuck_tool = ""
869
- if rep and "|" in rep:
870
- stuck_tool = rep.split("|", 1)[1]
871
-
872
870
  # Prune duplicate tool calls to give model fresh context
873
871
  self._prune_repeated_tool_calls()
874
872
 
875
- # Gentle nudge just suggest a different approach
876
- nudge = "Try a different approach."
877
- if stuck_tool in ("read_file",):
878
- nudge = "You already read this. Try search_replace or a different file."
879
- elif stuck_tool in ("grep",):
880
- nudge = "Try a different search term or read a file you found."
881
- elif stuck_tool in ("bash", "run_command"):
882
- nudge = "If the command failed, read the error and fix the code."
883
- self._inject_system_note(nudge)
884
-
885
- # Extract tool-specific nudge
886
- nudge = ""
887
- if stuck_tool in ("read_file",):
888
- nudge = " You have been READING the same code repeatedly. You already know what it says. Make your EDIT now using search_replace or write_file."
889
- elif stuck_tool in ("grep",):
890
- nudge = " You have been SEARCHING repeatedly. Pick the most relevant file from your search results and READ it, then make your edit."
891
- elif stuck_tool in ("bash", "run_command"):
892
- nudge = (
893
- " You have been running the SAME bash command repeatedly. "
894
- "Running the same command again will give the same result. "
895
- "If it succeeded but didn't do what you expected, READ the source code "
896
- "to understand WHY, then FIX the code with search_replace. "
897
- "If it failed, try a DIFFERENT command or approach."
898
- )
899
- if repeat_warnings >= 4:
900
- # Escalated: replace tool result with strong directive
901
- warning_text = (
902
- "BLOCKED: Your tool call was not executed because you have been repeating the same action. "
903
- "You already have all the information you need from previous tool results. "
904
- "Your ONLY valid next action is: use search_replace to make your code fix. "
905
- "Do NOT read, grep, or bash. Use search_replace NOW."
906
- )
907
- self._inject_system_note(warning_text, replace_last_tool=True)
908
- else:
909
- warning_text = (
910
- "WARNING: You are repeating the same tool call with the same arguments. "
911
- "This is not making progress. Try a DIFFERENT approach, use a different tool, "
912
- "or tell the user what's blocking you." + nudge
913
- )
914
- self._inject_system_note(warning_text)
873
+ # Temperature bump: force model to explore different paths
874
+ self._temp_override = 0.5
875
+
876
+ # Track failed approach for accumulator
877
+ self._record_failed_approach()
878
+
879
+ # RETROSPECTION: Summarize recent actions and let the model
880
+ # decide its own next step no hardcoded nudges
881
+ retro = self._build_retrospection()
882
+ if retro:
883
+ # Include failed approaches if any
884
+ if self._failed_approaches:
885
+ approaches = "\n".join(f" - {a}" for a in self._failed_approaches[-5:])
886
+ retro += f"\n\nApproaches already tried (don't repeat these):\n{approaches}"
887
+ self._inject_system_note(retro)
888
+ else:
889
+ # Loop broken reset temperature to normal
890
+ self._temp_override = None
915
891
 
916
892
  if user_cancelled:
917
893
  return
@@ -1291,11 +1267,31 @@ class AgentLoop:
1291
1267
  )
1292
1268
  except (json.JSONDecodeError, AttributeError):
1293
1269
  pass
1270
+ # AUTO-READ: Automatically read the target file so the model has
1271
+ # the actual content — don't just tell it to read, DO it for it
1272
+ auto_read_content = ""
1273
+ try:
1274
+ sr_args = json.loads(tool_call.raw_arguments or "{}")
1275
+ sr_path = sr_args.get("file_path", sr_args.get("path", ""))
1276
+ if sr_path and Path(sr_path).exists():
1277
+ with open(sr_path, "r", encoding="utf-8", errors="replace") as f:
1278
+ lines = f.readlines()
1279
+ # Show first 50 lines or the whole file if small
1280
+ preview_lines = lines[:50]
1281
+ numbered = [f"{i+1}\t{line.rstrip()}" for i, line in enumerate(preview_lines)]
1282
+ auto_read_content = (
1283
+ f"\n\nAUTO-READ of {sr_path} (first {len(preview_lines)} lines):\n"
1284
+ + "\n".join(numbered)
1285
+ )
1286
+ if len(lines) > 50:
1287
+ auto_read_content += f"\n[... {len(lines) - 50} more lines]"
1288
+ except Exception:
1289
+ pass
1294
1290
  error_msg += (
1295
1291
  "\n\n[RECOVERY: Your search text didn't match the file contents. "
1296
- "Use read_file with offset/limit to re-read the exact area you want to change, "
1297
- "then retry search_replace with the EXACT text from read_file output."
1292
+ "The actual file content is shown below use EXACT text from it for your next edit."
1298
1293
  f"{sr_file_hint}]"
1294
+ f"{auto_read_content}"
1299
1295
  )
1300
1296
  elif tool_call.tool_name == "search_replace" and "multiple" in str(exc).lower():
1301
1297
  error_msg += (
@@ -1429,10 +1425,12 @@ class AgentLoop:
1429
1425
 
1430
1426
  try:
1431
1427
  start_time = time.perf_counter()
1428
+ # Use temperature override if set (loop detection bumps it)
1429
+ temp = getattr(self, '_temp_override', None) or active_model.temperature
1432
1430
  result = await self.backend.complete(
1433
1431
  model=active_model,
1434
1432
  messages=self.messages,
1435
- temperature=active_model.temperature,
1433
+ temperature=temp,
1436
1434
  tools=available_tools,
1437
1435
  tool_choice=tool_choice,
1438
1436
  extra_headers=self._get_extra_headers(provider),
@@ -1477,10 +1475,12 @@ class AgentLoop:
1477
1475
  start_time = time.perf_counter()
1478
1476
  usage = LLMUsage()
1479
1477
  chunk_agg = LLMChunk(message=LLMMessage(role=Role.assistant))
1478
+ # Use temperature override if set (loop detection bumps it)
1479
+ temp = getattr(self, '_temp_override', None) or active_model.temperature
1480
1480
  async for chunk in self.backend.complete_streaming(
1481
1481
  model=active_model,
1482
1482
  messages=self.messages,
1483
- temperature=active_model.temperature,
1483
+ temperature=temp,
1484
1484
  tools=available_tools,
1485
1485
  tool_choice=tool_choice,
1486
1486
  extra_headers=self._get_extra_headers(provider),
@@ -1584,6 +1584,96 @@ class AgentLoop:
1584
1584
  feedback=feedback,
1585
1585
  )
1586
1586
 
1587
+ def _record_failed_approach(self) -> None:
1588
+ """Record a one-line summary of the most recent failed approach.
1589
+
1590
+ Survives pruning and compaction so the model doesn't retry
1591
+ the same strategy after context cleanup.
1592
+ """
1593
+ if not hasattr(self, '_failed_approaches'):
1594
+ self._failed_approaches = []
1595
+
1596
+ # Extract the last tool call and its result
1597
+ last_tool_name = ""
1598
+ last_tool_args = ""
1599
+ last_result = ""
1600
+ for msg in reversed(self.messages[-6:]):
1601
+ if msg.role == Role.tool and not last_result:
1602
+ result = str(msg.content or "")[:100]
1603
+ if "error" in result.lower() or "not found" in result.lower():
1604
+ last_result = result[:80]
1605
+ elif msg.role == Role.assistant and msg.tool_calls and not last_tool_name:
1606
+ for tc in msg.tool_calls:
1607
+ if tc.function:
1608
+ last_tool_name = tc.function.name or ""
1609
+ args = tc.function.arguments or ""
1610
+ # Extract file path if present
1611
+ try:
1612
+ parsed = json.loads(args)
1613
+ last_tool_args = parsed.get("file_path", parsed.get("path", parsed.get("command", "")))[:60]
1614
+ except (json.JSONDecodeError, TypeError, AttributeError):
1615
+ last_tool_args = args[:40]
1616
+ break
1617
+
1618
+ if last_tool_name:
1619
+ summary = f"{last_tool_name}({last_tool_args})"
1620
+ if last_result:
1621
+ summary += f" → {last_result}"
1622
+ # Don't add duplicates
1623
+ if not self._failed_approaches or self._failed_approaches[-1] != summary:
1624
+ self._failed_approaches.append(summary)
1625
+ # Keep only last 10
1626
+ self._failed_approaches = self._failed_approaches[-10:]
1627
+
1628
+ def _build_retrospection(self) -> str | None:
1629
+ """Build a retrospection summary of recent tool calls.
1630
+
1631
+ Instead of hardcoded nudges, show the model what it's been doing
1632
+ and let it decide on a different approach. The model is better at
1633
+ self-correcting when it can see its own pattern of behavior.
1634
+ """
1635
+ # Collect last 8 tool calls with their results (truncated)
1636
+ recent: list[str] = []
1637
+ count = 0
1638
+ for msg in reversed(self.messages):
1639
+ if count >= 8:
1640
+ break
1641
+ if msg.role == Role.assistant and msg.tool_calls:
1642
+ for tc in reversed(msg.tool_calls or []):
1643
+ if tc.function:
1644
+ name = tc.function.name or "?"
1645
+ args_str = tc.function.arguments or ""
1646
+ # Truncate args for readability
1647
+ if len(args_str) > 120:
1648
+ args_str = args_str[:120] + "..."
1649
+ recent.append(f" {count+1}. {name}({args_str})")
1650
+ count += 1
1651
+ if count >= 8:
1652
+ break
1653
+ elif msg.role == Role.tool and recent:
1654
+ # Add result summary to last entry
1655
+ result = str(msg.content or "")[:150]
1656
+ if "error" in result.lower() or "Error" in result:
1657
+ recent[-1] += f" → ERROR"
1658
+ elif "not found" in result.lower():
1659
+ recent[-1] += f" → NOT FOUND"
1660
+ else:
1661
+ recent[-1] += f" → ok"
1662
+
1663
+ if len(recent) < 3:
1664
+ return None
1665
+
1666
+ recent.reverse()
1667
+ summary = "\n".join(recent)
1668
+
1669
+ return (
1670
+ f"RETROSPECTION — Your last {len(recent)} tool calls:\n"
1671
+ f"{summary}\n\n"
1672
+ f"You are repeating a pattern that is not making progress. "
1673
+ f"Review the sequence above. What went wrong? What should you do differently? "
1674
+ f"Choose a different approach on your own."
1675
+ )
1676
+
1587
1677
  def _inject_system_note(self, text: str, replace_last_tool: bool = False) -> None:
1588
1678
  """Safely inject a system note into conversation without breaking message ordering.
1589
1679
 
@@ -23,11 +23,12 @@ from drydock.core.tools.utils import resolve_file_tool_permission
23
23
  from drydock.core.types import ToolResultEvent, ToolStreamEvent
24
24
 
25
25
  SEARCH_REPLACE_BLOCK_RE = re.compile(
26
- r"<{5,} SEARCH\r?\n(.*?)\r?\n?={5,}\r?\n(.*?)\r?\n?>{5,} REPLACE", flags=re.DOTALL
26
+ r"<{5,}\s*(?:SEARCH\s*)+\r?\n(.*?)\r?\n?={5,}\r?\n(.*?)\r?\n?>{5,}\s*(?:REPLACE\s*)+",
27
+ flags=re.DOTALL,
27
28
  )
28
29
 
29
30
  SEARCH_REPLACE_BLOCK_WITH_FENCE_RE = re.compile(
30
- r"```[\s\S]*?\n<{5,} SEARCH\r?\n(.*?)\r?\n?={5,}\r?\n(.*?)\r?\n?>{5,} REPLACE\s*\n```",
31
+ r"```[\s\S]*?\n<{5,}\s*(?:SEARCH\s*)+\r?\n(.*?)\r?\n?={5,}\r?\n(.*?)\r?\n?>{5,}\s*(?:REPLACE\s*)+\s*\n```",
31
32
  flags=re.DOTALL,
32
33
  )
33
34
 
@@ -213,6 +214,16 @@ class SearchReplace(
213
214
  ">>>>>>> REPLACE"
214
215
  )
215
216
 
217
+ # Detect garbled token output (common with some models/parsers)
218
+ for block in search_replace_blocks:
219
+ if re.search(r'(.)\1{4,}', block.search) or re.search(r'<{3,}[a-z]', block.search):
220
+ raise ToolError(
221
+ "Your search text appears garbled (repeated/corrupted characters). "
222
+ "This happens when regex or special characters confuse the tool call parser. "
223
+ "WORKAROUND: Use read_file to get the exact line numbers, then use write_file "
224
+ "to rewrite the entire function instead of search_replace on complex regex patterns."
225
+ )
226
+
216
227
  return file_path, search_replace_blocks
217
228
 
218
229
  async def _read_file(self, file_path: Path) -> str:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.2.7"
3
+ version = "2.2.9"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
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