shotgun-sh 0.4.0.dev2__tar.gz → 0.4.0.dev4__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 (243) hide show
  1. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/PKG-INFO +1 -1
  2. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/pyproject.toml +1 -1
  3. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/agent_manager.py +13 -4
  4. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/config/README.md +0 -1
  5. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/config/models.py +0 -4
  6. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/router/models.py +4 -0
  7. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/router/tools/plan_tools.py +5 -0
  8. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat/chat_screen.py +39 -23
  9. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/command_providers.py +0 -10
  10. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/history/chat_history.py +30 -0
  11. shotgun_sh-0.4.0.dev2/src/shotgun/tui/screens/onboarding.py +0 -584
  12. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/.gitignore +0 -0
  13. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/LICENSE +0 -0
  14. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/README.md +0 -0
  15. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/hatch_build.py +0 -0
  16. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/__init__.py +0 -0
  17. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/__init__.py +0 -0
  18. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/common.py +0 -0
  19. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/config/__init__.py +0 -0
  20. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/config/constants.py +0 -0
  21. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/config/manager.py +0 -0
  22. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/config/provider.py +0 -0
  23. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/config/streaming_test.py +0 -0
  24. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/context_analyzer/__init__.py +0 -0
  25. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/context_analyzer/analyzer.py +0 -0
  26. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/context_analyzer/constants.py +0 -0
  27. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/context_analyzer/formatter.py +0 -0
  28. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/context_analyzer/models.py +0 -0
  29. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/__init__.py +0 -0
  30. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/filters.py +0 -0
  31. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/__init__.py +0 -0
  32. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/chunking.py +0 -0
  33. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/compaction.py +0 -0
  34. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/constants.py +0 -0
  35. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/context_extraction.py +0 -0
  36. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/file_content_deduplication.py +0 -0
  37. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/history_building.py +0 -0
  38. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/history_processors.py +0 -0
  39. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/message_utils.py +0 -0
  40. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_counting/__init__.py +0 -0
  41. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_counting/anthropic.py +0 -0
  42. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_counting/base.py +0 -0
  43. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_counting/openai.py +0 -0
  44. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_counting/sentencepiece_counter.py +0 -0
  45. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_counting/tokenizer_cache.py +0 -0
  46. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_counting/utils.py +0 -0
  47. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/history/token_estimation.py +0 -0
  48. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/manager.py +0 -0
  49. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/conversation/models.py +0 -0
  50. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/error/__init__.py +0 -0
  51. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/error/models.py +0 -0
  52. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/export.py +0 -0
  53. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/llm.py +0 -0
  54. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/messages.py +0 -0
  55. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/models.py +0 -0
  56. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/plan.py +0 -0
  57. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/research.py +0 -0
  58. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/router/__init__.py +0 -0
  59. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/router/router.py +0 -0
  60. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/router/tools/__init__.py +0 -0
  61. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/router/tools/delegation_tools.py +0 -0
  62. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/runner.py +0 -0
  63. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/specify.py +0 -0
  64. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tasks.py +0 -0
  65. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/__init__.py +0 -0
  66. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/codebase/__init__.py +0 -0
  67. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/codebase/codebase_shell.py +0 -0
  68. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/codebase/directory_lister.py +0 -0
  69. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/codebase/file_read.py +0 -0
  70. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/codebase/models.py +0 -0
  71. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/codebase/query_graph.py +0 -0
  72. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/codebase/retrieve_code.py +0 -0
  73. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/file_management.py +0 -0
  74. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/registry.py +0 -0
  75. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/web_search/__init__.py +0 -0
  76. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/web_search/anthropic.py +0 -0
  77. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/web_search/gemini.py +0 -0
  78. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/web_search/openai.py +0 -0
  79. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/tools/web_search/utils.py +0 -0
  80. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/agents/usage_manager.py +0 -0
  81. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/api_endpoints.py +0 -0
  82. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/build_constants.py +0 -0
  83. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/__init__.py +0 -0
  84. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/clear.py +0 -0
  85. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/codebase/__init__.py +0 -0
  86. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/codebase/commands.py +0 -0
  87. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/codebase/models.py +0 -0
  88. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/compact.py +0 -0
  89. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/config.py +0 -0
  90. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/context.py +0 -0
  91. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/error_handler.py +0 -0
  92. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/export.py +0 -0
  93. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/feedback.py +0 -0
  94. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/models.py +0 -0
  95. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/plan.py +0 -0
  96. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/research.py +0 -0
  97. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/spec/__init__.py +0 -0
  98. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/spec/backup.py +0 -0
  99. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/spec/commands.py +0 -0
  100. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/spec/models.py +0 -0
  101. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/spec/pull_service.py +0 -0
  102. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/specify.py +0 -0
  103. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/tasks.py +0 -0
  104. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/update.py +0 -0
  105. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/cli/utils.py +0 -0
  106. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/__init__.py +0 -0
  107. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/__init__.py +0 -0
  108. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/change_detector.py +0 -0
  109. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/code_retrieval.py +0 -0
  110. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/cypher_models.py +0 -0
  111. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/ingestor.py +0 -0
  112. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/language_config.py +0 -0
  113. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/manager.py +0 -0
  114. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/nl_query.py +0 -0
  115. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/core/parser_loader.py +0 -0
  116. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/models.py +0 -0
  117. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/codebase/service.py +0 -0
  118. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/exceptions.py +0 -0
  119. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/llm_proxy/__init__.py +0 -0
  120. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/llm_proxy/client.py +0 -0
  121. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/llm_proxy/clients.py +0 -0
  122. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/llm_proxy/constants.py +0 -0
  123. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/llm_proxy/models.py +0 -0
  124. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/logging_config.py +0 -0
  125. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/main.py +0 -0
  126. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/posthog_telemetry.py +0 -0
  127. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/__init__.py +0 -0
  128. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/__init__.py +0 -0
  129. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/export.j2 +0 -0
  130. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/partials/codebase_understanding.j2 +0 -0
  131. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/partials/common_agent_system_prompt.j2 +0 -0
  132. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/partials/content_formatting.j2 +0 -0
  133. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/partials/interactive_mode.j2 +0 -0
  134. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/partials/router_delegation_mode.j2 +0 -0
  135. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/plan.j2 +0 -0
  136. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/research.j2 +0 -0
  137. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/router.j2 +0 -0
  138. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/specify.j2 +0 -0
  139. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2 +0 -0
  140. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/state/system_state.j2 +0 -0
  141. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/agents/tasks.j2 +0 -0
  142. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/codebase/__init__.py +0 -0
  143. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/codebase/cypher_query_patterns.j2 +0 -0
  144. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/codebase/cypher_system.j2 +0 -0
  145. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/codebase/enhanced_query_context.j2 +0 -0
  146. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/codebase/partials/cypher_rules.j2 +0 -0
  147. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/codebase/partials/graph_schema.j2 +0 -0
  148. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/codebase/partials/temporal_context.j2 +0 -0
  149. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/history/__init__.py +0 -0
  150. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/history/chunk_summarization.j2 +0 -0
  151. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/history/combine_summaries.j2 +0 -0
  152. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/history/incremental_summarization.j2 +0 -0
  153. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/history/summarization.j2 +0 -0
  154. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/loader.py +0 -0
  155. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/prompts/tools/web_search.j2 +0 -0
  156. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/py.typed +0 -0
  157. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/sdk/__init__.py +0 -0
  158. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/sdk/codebase.py +0 -0
  159. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/sdk/exceptions.py +0 -0
  160. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/sdk/models.py +0 -0
  161. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/sdk/services.py +0 -0
  162. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/sentry_telemetry.py +0 -0
  163. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/settings.py +0 -0
  164. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/__init__.py +0 -0
  165. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/client.py +0 -0
  166. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/constants.py +0 -0
  167. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/exceptions.py +0 -0
  168. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/models.py +0 -0
  169. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/shared_specs/__init__.py +0 -0
  170. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/shared_specs/file_scanner.py +0 -0
  171. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/shared_specs/hasher.py +0 -0
  172. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/shared_specs/models.py +0 -0
  173. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/shared_specs/upload_pipeline.py +0 -0
  174. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/shared_specs/utils.py +0 -0
  175. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/specs_client.py +0 -0
  176. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/shotgun_web/supabase_client.py +0 -0
  177. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/telemetry.py +0 -0
  178. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/__init__.py +0 -0
  179. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/app.py +0 -0
  180. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/commands/__init__.py +0 -0
  181. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/components/context_indicator.py +0 -0
  182. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/components/mode_indicator.py +0 -0
  183. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/components/prompt_input.py +0 -0
  184. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/components/spinner.py +0 -0
  185. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/components/splash.py +0 -0
  186. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/components/status_bar.py +0 -0
  187. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/components/vertical_tail.py +0 -0
  188. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/containers.py +0 -0
  189. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/dependencies.py +0 -0
  190. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/filtered_codebase_service.py +0 -0
  191. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/layout.py +0 -0
  192. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/protocols.py +0 -0
  193. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat/__init__.py +0 -0
  194. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat/chat.tcss +0 -0
  195. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat/codebase_index_prompt_screen.py +0 -0
  196. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat/codebase_index_selection.py +0 -0
  197. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat/help_text.py +0 -0
  198. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat/prompt_history.py +0 -0
  199. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat.tcss +0 -0
  200. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/__init__.py +0 -0
  201. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/hint_message.py +0 -0
  202. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/history/__init__.py +0 -0
  203. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/history/agent_response.py +0 -0
  204. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/history/formatters.py +0 -0
  205. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/history/partial_response.py +0 -0
  206. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/history/user_question.py +0 -0
  207. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/chat_screen/messages.py +0 -0
  208. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/confirmation_dialog.py +0 -0
  209. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/directory_setup.py +0 -0
  210. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/feedback.py +0 -0
  211. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/github_issue.py +0 -0
  212. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/model_picker.py +0 -0
  213. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/pipx_migration.py +0 -0
  214. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/provider_config.py +0 -0
  215. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/shared_specs/__init__.py +0 -0
  216. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/shared_specs/create_spec_dialog.py +0 -0
  217. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/shared_specs/models.py +0 -0
  218. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/shared_specs/share_specs_dialog.py +0 -0
  219. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/shared_specs/upload_progress_screen.py +0 -0
  220. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/shotgun_auth.py +0 -0
  221. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/spec_pull.py +0 -0
  222. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/splash.py +0 -0
  223. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/screens/welcome.py +0 -0
  224. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/services/__init__.py +0 -0
  225. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/services/conversation_service.py +0 -0
  226. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/state/__init__.py +0 -0
  227. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/state/processing_state.py +0 -0
  228. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/styles.tcss +0 -0
  229. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/utils/__init__.py +0 -0
  230. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/utils/mode_progress.py +0 -0
  231. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/widgets/__init__.py +0 -0
  232. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/widgets/approval_widget.py +0 -0
  233. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/widgets/cascade_confirmation_widget.py +0 -0
  234. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/widgets/plan_panel.py +0 -0
  235. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/widgets/step_checkpoint_widget.py +0 -0
  236. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/tui/widgets/widget_coordinator.py +0 -0
  237. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/utils/__init__.py +0 -0
  238. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/utils/datetime_utils.py +0 -0
  239. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/utils/env_utils.py +0 -0
  240. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/utils/file_system_utils.py +0 -0
  241. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/utils/marketing.py +0 -0
  242. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/utils/source_detection.py +0 -0
  243. {shotgun_sh-0.4.0.dev2 → shotgun_sh-0.4.0.dev4}/src/shotgun/utils/update_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.4.0.dev2
3
+ Version: 0.4.0.dev4
4
4
  Summary: AI-powered research, planning, and task management CLI tool
5
5
  Project-URL: Homepage, https://shotgun.sh/
6
6
  Project-URL: Repository, https://github.com/shotgun-sh/shotgun
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "shotgun-sh"
3
- version = "0.4.0.dev2"
3
+ version = "0.4.0.dev4"
4
4
  description = "AI-powered research, planning, and task management CLI tool"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -78,7 +78,7 @@ from .models import AgentDeps, AgentRuntimeOptions
78
78
  from .plan import create_plan_agent
79
79
  from .research import create_research_agent
80
80
  from .router import create_router_agent
81
- from .router.models import RouterDeps
81
+ from .router.models import RouterDeps, RouterMode
82
82
  from .specify import create_specify_agent
83
83
  from .tasks import create_tasks_agent
84
84
 
@@ -918,6 +918,8 @@ class AgentManager(Widget):
918
918
  self.ui_message_history.append(
919
919
  HintMessage(message=f"💡 {agent_response.clarifying_questions[0]}")
920
920
  )
921
+ # Add plan hint for router if plan exists (single question is non-blocking)
922
+ self._maybe_add_plan_hint(deps)
921
923
  else:
922
924
  # Multiple questions (2+) - enter Q&A mode
923
925
  self._qa_questions = agent_response.clarifying_questions
@@ -947,9 +949,8 @@ class AgentManager(Widget):
947
949
  response_text=agent_response.response,
948
950
  )
949
951
  )
950
-
951
- # Add plan hint for router if plan exists
952
- self._maybe_add_plan_hint(deps)
952
+ # NOTE: Don't add plan hint here - defer until Q&A completes
953
+ # The plan hint will be added after the user answers all questions
953
954
 
954
955
  # Post UI update with hint messages (file operations will be posted after compaction)
955
956
  logger.debug("Posting UI update for Q&A mode with hint messages")
@@ -1384,6 +1385,14 @@ class AgentManager(Widget):
1384
1385
  return
1385
1386
 
1386
1387
  plan_display = deps.current_plan.format_for_display()
1388
+
1389
+ # In drafting mode, if plan is not complete, prompt user to continue
1390
+ if (
1391
+ deps.router_mode == RouterMode.DRAFTING
1392
+ and not deps.current_plan.is_complete()
1393
+ ):
1394
+ plan_display += "\n\n**Shall I continue?**"
1395
+
1387
1396
  logger.debug("Adding plan hint to UI history")
1388
1397
  self.ui_message_history.append(
1389
1398
  HintMessage(message=f"**Current Plan**\n\n{plan_display}")
@@ -41,7 +41,6 @@ This directory contains the configuration management system for Shotgun, includi
41
41
  - **Title**: "feat: add config migration for streaming capability field (v4->v5)"
42
42
  - **Key Changes**:
43
43
  - Added `supports_streaming` field to OpenAI config
44
- - Added `shown_onboarding_popup` timestamp field
45
44
  - Added `supabase_jwt` to Shotgun Account config
46
45
 
47
46
  ## Migration System
@@ -273,10 +273,6 @@ class ShotgunConfig(BaseModel):
273
273
  default=False,
274
274
  description="Whether the welcome screen has been shown to the user",
275
275
  )
276
- shown_onboarding_popup: datetime | None = Field(
277
- default=None,
278
- description="Timestamp when the onboarding popup was shown to the user (ISO8601 format)",
279
- )
280
276
  marketing: MarketingConfig = Field(
281
277
  default_factory=MarketingConfig,
282
278
  description="Marketing messages configuration and tracking",
@@ -358,6 +358,10 @@ class RouterDeps(AgentDeps):
358
358
  # Set by create_plan tool when plan.needs_approval() returns True
359
359
  # Excluded from serialization as it's transient UI state
360
360
  pending_approval: PendingApproval | None = Field(default=None, exclude=True)
361
+ # Completion state for Drafting mode
362
+ # Set by mark_step_done when plan completes in drafting mode
363
+ # Excluded from serialization as it's transient UI state
364
+ pending_completion: bool = Field(default=False, exclude=True)
361
365
  # Event stream handler for forwarding sub-agent streaming events to UI
362
366
  # This is set by the AgentManager when running the router with streaming
363
367
  # Excluded from serialization as it's a callable
@@ -167,6 +167,11 @@ async def mark_step_done(
167
167
  if plan.is_complete():
168
168
  ctx.deps.is_executing = False
169
169
  logger.debug("Plan complete, is_executing=False")
170
+ # Set pending completion for Drafting mode
171
+ # The TUI will detect this and show the completion message
172
+ if ctx.deps.router_mode == RouterMode.DRAFTING:
173
+ ctx.deps.pending_completion = True
174
+ logger.debug("Set pending_completion=True for drafting mode")
170
175
  # Set pending checkpoint for Planning mode
171
176
  # The TUI will detect this and show the StepCheckpointWidget
172
177
  elif ctx.deps.router_mode == RouterMode.PLANNING:
@@ -112,7 +112,6 @@ from shotgun.tui.screens.chat_screen.messages import (
112
112
  SubAgentStarted,
113
113
  )
114
114
  from shotgun.tui.screens.confirmation_dialog import ConfirmationDialog
115
- from shotgun.tui.screens.onboarding import OnboardingModal
116
115
  from shotgun.tui.screens.shared_specs import (
117
116
  CreateSpecDialog,
118
117
  ShareSpecsAction,
@@ -289,9 +288,6 @@ class ChatScreen(Screen[None]):
289
288
  # Initial update of context indicator
290
289
  self.update_context_indicator()
291
290
 
292
- # Show onboarding popup if not shown before
293
- self.call_later(self._check_and_show_onboarding)
294
-
295
291
  async def on_key(self, event: events.Key) -> None:
296
292
  """Handle key presses for cancellation."""
297
293
  # If escape is pressed during Q&A mode, exit Q&A
@@ -575,10 +571,6 @@ class ChatScreen(Screen[None]):
575
571
  HintMessage(message="⚠️ No context analysis available")
576
572
  )
577
573
 
578
- def action_view_onboarding(self) -> None:
579
- """Show the onboarding modal."""
580
- self.app.push_screen(OnboardingModal())
581
-
582
574
  @work
583
575
  async def action_compact_conversation(self) -> None:
584
576
  """Compact the conversation history to reduce size."""
@@ -988,6 +980,10 @@ class ChatScreen(Screen[None]):
988
980
  self, event: MessageHistoryUpdated
989
981
  ) -> None:
990
982
  """Handle message history updates from the agent manager."""
983
+ logger.debug(
984
+ "[MSG_HISTORY] MessageHistoryUpdated received - %d messages",
985
+ len(event.messages),
986
+ )
991
987
  self._clear_partial_response()
992
988
  self.messages = event.messages
993
989
 
@@ -1623,6 +1619,9 @@ class ChatScreen(Screen[None]):
1623
1619
  # Check for pending checkpoint (Planning mode step completion)
1624
1620
  self._check_pending_checkpoint()
1625
1621
 
1622
+ # Check for plan completion (Drafting mode)
1623
+ self._check_plan_completion()
1624
+
1626
1625
  # Save conversation after each interaction
1627
1626
  self._save_conversation()
1628
1627
 
@@ -1689,21 +1688,6 @@ class ChatScreen(Screen[None]):
1689
1688
 
1690
1689
  self.run_worker(_do_load(), exclusive=False)
1691
1690
 
1692
- @work
1693
- async def _check_and_show_onboarding(self) -> None:
1694
- """Check if onboarding should be shown and display modal if needed."""
1695
- config_manager = get_config_manager()
1696
- config = await config_manager.load()
1697
-
1698
- # Only show onboarding if it hasn't been shown before
1699
- if config.shown_onboarding_popup is None:
1700
- # Show the onboarding modal
1701
- await self.app.push_screen_wait(OnboardingModal())
1702
-
1703
- # Mark as shown in config with current timestamp
1704
- config.shown_onboarding_popup = datetime.now(timezone.utc)
1705
- await config_manager.save(config)
1706
-
1707
1691
  # =========================================================================
1708
1692
  # Step Checkpoint Handlers (Planning Mode)
1709
1693
  # =========================================================================
@@ -1826,6 +1810,31 @@ class ChatScreen(Screen[None]):
1826
1810
  )
1827
1811
  )
1828
1812
 
1813
+ def _check_plan_completion(self) -> None:
1814
+ """Check if a plan was completed in Drafting mode and show completion message.
1815
+
1816
+ This is called after each agent run to check if mark_step_done
1817
+ set pending_completion in Drafting mode.
1818
+ """
1819
+ logger.debug("[PLAN] _check_plan_completion called")
1820
+ if not isinstance(self.deps, RouterDeps):
1821
+ logger.debug("[PLAN] Not RouterDeps, skipping plan completion check")
1822
+ return
1823
+
1824
+ if not self.deps.pending_completion:
1825
+ logger.debug("[PLAN] No pending completion")
1826
+ return
1827
+
1828
+ # Clear the pending state
1829
+ self.deps.pending_completion = False
1830
+
1831
+ # Show completion message
1832
+ logger.debug("[PLAN] Showing plan completion message for drafting mode")
1833
+ self.mount_hint("✅ All plan steps completed!")
1834
+
1835
+ # Hide the plan panel since the plan is done
1836
+ self._hide_plan_panel()
1837
+
1829
1838
  # =========================================================================
1830
1839
  # Sub-Agent Lifecycle Handlers (Stage 8)
1831
1840
  # =========================================================================
@@ -2086,6 +2095,13 @@ class ChatScreen(Screen[None]):
2086
2095
  logger.debug("[PLAN] Not RouterDeps, skipping pending approval check")
2087
2096
  return
2088
2097
 
2098
+ # Don't show plan approval while user is answering questions.
2099
+ # The pending approval will remain set and be checked again
2100
+ # after Q&A completes (when run_agent is called with answers).
2101
+ if self.qa_mode:
2102
+ logger.debug("[PLAN] Q&A mode active, deferring plan approval")
2103
+ return
2104
+
2089
2105
  if self.deps.pending_approval is None:
2090
2106
  logger.debug("[PLAN] No pending approval")
2091
2107
  return
@@ -288,11 +288,6 @@ class UnifiedCommandProvider(Provider):
288
288
  self.chat_screen.action_show_usage,
289
289
  help="Display usage information for the current session",
290
290
  )
291
- yield DiscoveryHit(
292
- "View Onboarding",
293
- self.chat_screen.action_view_onboarding,
294
- help="View the onboarding tutorial and helpful resources",
295
- )
296
291
 
297
292
  async def search(self, query: str) -> AsyncGenerator[Hit, None]:
298
293
  """Search for commands in alphabetical order."""
@@ -345,11 +340,6 @@ class UnifiedCommandProvider(Provider):
345
340
  self.chat_screen.action_show_usage,
346
341
  "Display usage information for the current session",
347
342
  ),
348
- (
349
- "View Onboarding",
350
- self.chat_screen.action_view_onboarding,
351
- "View the onboarding tutorial and helpful resources",
352
- ),
353
343
  ]
354
344
 
355
345
  for title, callback, help_text in commands:
@@ -1,5 +1,6 @@
1
1
  """Chat history widget - main container for message display."""
2
2
 
3
+ import logging
3
4
  from collections.abc import Generator, Sequence
4
5
 
5
6
  from pydantic_ai.messages import (
@@ -21,6 +22,8 @@ from .agent_response import AgentResponseWidget
21
22
  from .partial_response import PartialResponseWidget
22
23
  from .user_question import UserQuestionWidget
23
24
 
25
+ logger = logging.getLogger(__name__)
26
+
24
27
 
25
28
  class ChatHistory(Widget):
26
29
  """Main widget for displaying chat message history."""
@@ -89,23 +92,44 @@ class ChatHistory(Widget):
89
92
  def update_messages(self, messages: list[ModelMessage | HintMessage]) -> None:
90
93
  """Update the displayed messages using incremental mounting."""
91
94
  if not self.vertical_tail:
95
+ logger.debug(
96
+ "[CHAT_HISTORY] update_messages called but vertical_tail is None"
97
+ )
92
98
  return
93
99
 
94
100
  self.items = messages
95
101
  filtered = list(self.filtered_items())
96
102
 
103
+ logger.debug(
104
+ "[CHAT_HISTORY] update_messages - total=%d, filtered=%d, rendered=%d",
105
+ len(messages),
106
+ len(filtered),
107
+ self._rendered_count,
108
+ )
109
+
97
110
  # Only mount new messages that haven't been rendered yet
98
111
  if len(filtered) > self._rendered_count:
99
112
  new_messages = filtered[self._rendered_count :]
113
+ logger.debug(
114
+ "[CHAT_HISTORY] Mounting %d new messages",
115
+ len(new_messages),
116
+ )
100
117
  for item in new_messages:
101
118
  widget: Widget
102
119
  if isinstance(item, ModelRequest):
103
120
  widget = UserQuestionWidget(item)
121
+ logger.debug("[CHAT_HISTORY] Mounting UserQuestionWidget")
104
122
  elif isinstance(item, HintMessage):
105
123
  widget = HintMessageWidget(item)
124
+ logger.debug("[CHAT_HISTORY] Mounting HintMessageWidget")
106
125
  elif isinstance(item, ModelResponse):
107
126
  widget = AgentResponseWidget(item)
127
+ logger.debug("[CHAT_HISTORY] Mounting AgentResponseWidget")
108
128
  else:
129
+ logger.debug(
130
+ "[CHAT_HISTORY] Skipping unknown message type: %s",
131
+ type(item).__name__,
132
+ )
109
133
  continue
110
134
 
111
135
  # Mount before the PartialResponseWidget
@@ -115,6 +139,12 @@ class ChatHistory(Widget):
115
139
 
116
140
  # Scroll to bottom to show newly added messages
117
141
  self.vertical_tail.scroll_end(animate=False)
142
+ else:
143
+ logger.debug(
144
+ "[CHAT_HISTORY] No new messages to mount (filtered=%d, rendered=%d)",
145
+ len(filtered),
146
+ self._rendered_count,
147
+ )
118
148
 
119
149
  def on_click(self, event: events.Click) -> None:
120
150
  """Focus the prompt input when clicking on the history area."""