shotgun-sh 0.2.8.dev3__tar.gz → 0.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.

Potentially problematic release.


This version of shotgun-sh might be problematic. Click here for more details.

Files changed (157) hide show
  1. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/PKG-INFO +1 -1
  2. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/pyproject.toml +1 -1
  3. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/agent_manager.py +27 -2
  4. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/build_constants.py +2 -2
  5. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/chat.py +26 -1
  6. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/.gitignore +0 -0
  7. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/LICENSE +0 -0
  8. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/README.md +0 -0
  9. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/README_PYPI.md +0 -0
  10. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/hatch_build.py +0 -0
  11. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/__init__.py +0 -0
  12. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/__init__.py +0 -0
  13. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/common.py +0 -0
  14. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/config/__init__.py +0 -0
  15. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/config/constants.py +0 -0
  16. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/config/manager.py +0 -0
  17. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/config/models.py +0 -0
  18. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/config/provider.py +0 -0
  19. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/conversation_history.py +0 -0
  20. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/conversation_manager.py +0 -0
  21. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/export.py +0 -0
  22. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/__init__.py +0 -0
  23. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/compaction.py +0 -0
  24. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/constants.py +0 -0
  25. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/context_extraction.py +0 -0
  26. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/history_building.py +0 -0
  27. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/history_processors.py +0 -0
  28. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/message_utils.py +0 -0
  29. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_counting/__init__.py +0 -0
  30. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_counting/anthropic.py +0 -0
  31. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_counting/base.py +0 -0
  32. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_counting/openai.py +0 -0
  33. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_counting/sentencepiece_counter.py +0 -0
  34. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_counting/tokenizer_cache.py +0 -0
  35. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_counting/utils.py +0 -0
  36. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/history/token_estimation.py +0 -0
  37. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/llm.py +0 -0
  38. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/messages.py +0 -0
  39. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/models.py +0 -0
  40. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/plan.py +0 -0
  41. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/research.py +0 -0
  42. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/specify.py +0 -0
  43. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tasks.py +0 -0
  44. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/__init__.py +0 -0
  45. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/codebase/__init__.py +0 -0
  46. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/codebase/codebase_shell.py +0 -0
  47. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/codebase/directory_lister.py +0 -0
  48. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/codebase/file_read.py +0 -0
  49. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/codebase/models.py +0 -0
  50. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/codebase/query_graph.py +0 -0
  51. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/codebase/retrieve_code.py +0 -0
  52. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/file_management.py +0 -0
  53. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/web_search/__init__.py +0 -0
  54. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/web_search/anthropic.py +0 -0
  55. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/web_search/gemini.py +0 -0
  56. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/web_search/openai.py +0 -0
  57. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/tools/web_search/utils.py +0 -0
  58. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/agents/usage_manager.py +0 -0
  59. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/api_endpoints.py +0 -0
  60. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/__init__.py +0 -0
  61. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/codebase/__init__.py +0 -0
  62. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/codebase/commands.py +0 -0
  63. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/codebase/models.py +0 -0
  64. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/config.py +0 -0
  65. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/export.py +0 -0
  66. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/feedback.py +0 -0
  67. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/models.py +0 -0
  68. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/plan.py +0 -0
  69. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/research.py +0 -0
  70. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/specify.py +0 -0
  71. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/tasks.py +0 -0
  72. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/update.py +0 -0
  73. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/cli/utils.py +0 -0
  74. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/__init__.py +0 -0
  75. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/__init__.py +0 -0
  76. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/change_detector.py +0 -0
  77. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/code_retrieval.py +0 -0
  78. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/cypher_models.py +0 -0
  79. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/ingestor.py +0 -0
  80. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/language_config.py +0 -0
  81. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/manager.py +0 -0
  82. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/nl_query.py +0 -0
  83. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/core/parser_loader.py +0 -0
  84. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/models.py +0 -0
  85. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/codebase/service.py +0 -0
  86. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/llm_proxy/__init__.py +0 -0
  87. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/llm_proxy/clients.py +0 -0
  88. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/llm_proxy/constants.py +0 -0
  89. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/logging_config.py +0 -0
  90. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/main.py +0 -0
  91. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/posthog_telemetry.py +0 -0
  92. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/__init__.py +0 -0
  93. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/__init__.py +0 -0
  94. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/export.j2 +0 -0
  95. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/partials/codebase_understanding.j2 +0 -0
  96. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/partials/common_agent_system_prompt.j2 +0 -0
  97. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/partials/content_formatting.j2 +0 -0
  98. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/partials/interactive_mode.j2 +0 -0
  99. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/plan.j2 +0 -0
  100. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/research.j2 +0 -0
  101. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/specify.j2 +0 -0
  102. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2 +0 -0
  103. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/state/system_state.j2 +0 -0
  104. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/agents/tasks.j2 +0 -0
  105. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/codebase/__init__.py +0 -0
  106. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/codebase/cypher_query_patterns.j2 +0 -0
  107. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/codebase/cypher_system.j2 +0 -0
  108. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/codebase/enhanced_query_context.j2 +0 -0
  109. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/codebase/partials/cypher_rules.j2 +0 -0
  110. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/codebase/partials/graph_schema.j2 +0 -0
  111. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/codebase/partials/temporal_context.j2 +0 -0
  112. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/history/__init__.py +0 -0
  113. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/history/incremental_summarization.j2 +0 -0
  114. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/history/summarization.j2 +0 -0
  115. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/loader.py +0 -0
  116. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/prompts/tools/web_search.j2 +0 -0
  117. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/py.typed +0 -0
  118. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/sdk/__init__.py +0 -0
  119. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/sdk/codebase.py +0 -0
  120. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/sdk/exceptions.py +0 -0
  121. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/sdk/models.py +0 -0
  122. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/sdk/services.py +0 -0
  123. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/sentry_telemetry.py +0 -0
  124. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/shotgun_web/__init__.py +0 -0
  125. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/shotgun_web/client.py +0 -0
  126. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/shotgun_web/constants.py +0 -0
  127. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/shotgun_web/models.py +0 -0
  128. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/telemetry.py +0 -0
  129. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/__init__.py +0 -0
  130. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/app.py +0 -0
  131. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/commands/__init__.py +0 -0
  132. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/components/prompt_input.py +0 -0
  133. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/components/spinner.py +0 -0
  134. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/components/splash.py +0 -0
  135. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/components/vertical_tail.py +0 -0
  136. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/filtered_codebase_service.py +0 -0
  137. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/chat.tcss +0 -0
  138. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/chat_screen/__init__.py +0 -0
  139. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/chat_screen/command_providers.py +0 -0
  140. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/chat_screen/hint_message.py +0 -0
  141. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/chat_screen/history.py +0 -0
  142. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/directory_setup.py +0 -0
  143. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/feedback.py +0 -0
  144. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/model_picker.py +0 -0
  145. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/provider_config.py +0 -0
  146. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/shotgun_auth.py +0 -0
  147. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/splash.py +0 -0
  148. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/screens/welcome.py +0 -0
  149. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/styles.tcss +0 -0
  150. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/utils/__init__.py +0 -0
  151. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/tui/utils/mode_progress.py +0 -0
  152. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/utils/__init__.py +0 -0
  153. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/utils/datetime_utils.py +0 -0
  154. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/utils/env_utils.py +0 -0
  155. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/utils/file_system_utils.py +0 -0
  156. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/src/shotgun/utils/source_detection.py +0 -0
  157. {shotgun_sh-0.2.8.dev3 → shotgun_sh-0.2.9}/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.2.8.dev3
3
+ Version: 0.2.9
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.2.8.dev3"
3
+ version = "0.2.9"
4
4
  description = "AI-powered research, planning, and task management CLI tool"
5
5
  readme = "README_PYPI.md"
6
6
  license = { text = "MIT" }
@@ -40,6 +40,7 @@ from pydantic_ai.messages import (
40
40
  SystemPromptPart,
41
41
  ToolCallPart,
42
42
  ToolCallPartDelta,
43
+ UserPromptPart,
43
44
  )
44
45
  from textual.message import Message
45
46
  from textual.widget import Widget
@@ -554,11 +555,35 @@ class AgentManager(Widget):
554
555
  },
555
556
  )
556
557
 
557
- # Always add the agent's response messages to maintain conversation history
558
- self.ui_message_history = original_messages + cast(
558
+ # Merge agent's response messages, avoiding duplicates
559
+ # The TUI may have already added the user prompt, so check for it
560
+ new_messages = cast(
559
561
  list[ModelRequest | ModelResponse | HintMessage], result.new_messages()
560
562
  )
561
563
 
564
+ # Deduplicate: skip user prompts that are already in original_messages
565
+ deduplicated_new_messages = []
566
+ for msg in new_messages:
567
+ # Check if this is a user prompt that's already in original_messages
568
+ if isinstance(msg, ModelRequest) and any(
569
+ isinstance(part, UserPromptPart) for part in msg.parts
570
+ ):
571
+ # Check if an identical user prompt is already in original_messages
572
+ already_exists = any(
573
+ isinstance(existing, ModelRequest)
574
+ and any(isinstance(p, UserPromptPart) for p in existing.parts)
575
+ and existing.parts == msg.parts
576
+ for existing in original_messages[
577
+ -5:
578
+ ] # Check last 5 messages for efficiency
579
+ )
580
+ if already_exists:
581
+ continue # Skip this duplicate user prompt
582
+
583
+ deduplicated_new_messages.append(msg)
584
+
585
+ self.ui_message_history = original_messages + deduplicated_new_messages
586
+
562
587
  # Get file operations early so we can use them for contextual messages
563
588
  file_operations = deps.file_tracker.operations.copy()
564
589
  self.recently_change_files = file_operations
@@ -12,8 +12,8 @@ POSTHOG_API_KEY = ''
12
12
  POSTHOG_PROJECT_ID = '191396'
13
13
 
14
14
  # Logfire configuration embedded at build time (only for dev builds)
15
- LOGFIRE_ENABLED = 'true'
16
- LOGFIRE_TOKEN = 'pylf_v1_us_KZ5NM1pP3NwgJkbBJt6Ftdzk8mMhmrXcGJHQQgDJ1LfK'
15
+ LOGFIRE_ENABLED = ''
16
+ LOGFIRE_TOKEN = ''
17
17
 
18
18
  # Build metadata
19
19
  BUILD_TIME_ENV = "production" if SENTRY_DSN else "development"
@@ -506,9 +506,28 @@ class ChatScreen(Screen[None]):
506
506
  self.partial_message = event.message
507
507
  history = self.query_one(ChatHistory)
508
508
 
509
+ # Filter event.messages to exclude ModelRequest with only ToolReturnPart
510
+ # These are intermediate tool results that would render as empty (UserQuestionWidget
511
+ # filters out ToolReturnPart in format_prompt_parts), causing user messages to disappear
512
+ from pydantic_ai.messages import ToolReturnPart
513
+
514
+ filtered_event_messages: list[ModelMessage] = []
515
+ for msg in event.messages:
516
+ if isinstance(msg, ModelRequest):
517
+ # Check if this ModelRequest has any user-visible parts
518
+ has_user_content = any(
519
+ not isinstance(part, ToolReturnPart) for part in msg.parts
520
+ )
521
+ if has_user_content:
522
+ filtered_event_messages.append(msg)
523
+ # Skip ModelRequest with only ToolReturnPart
524
+ else:
525
+ # Keep all ModelResponse and other message types
526
+ filtered_event_messages.append(msg)
527
+
509
528
  # Only update messages if the message list changed
510
529
  new_message_list = self.messages + cast(
511
- list[ModelMessage | HintMessage], event.messages
530
+ list[ModelMessage | HintMessage], filtered_event_messages
512
531
  )
513
532
  if len(new_message_list) != len(history.items):
514
533
  history.update_messages(new_message_list)
@@ -690,6 +709,12 @@ class ChatScreen(Screen[None]):
690
709
  # Not a command, process as normal
691
710
  self.history.append(message.text)
692
711
 
712
+ # Add user message to agent_manager's history BEFORE running the agent
713
+ # This ensures immediate visual feedback AND proper deduplication
714
+ user_message = ModelRequest.user_text_prompt(text)
715
+ self.agent_manager.ui_message_history.append(user_message)
716
+ self.messages = self.agent_manager.ui_message_history.copy()
717
+
693
718
  # Clear the input
694
719
  self.value = ""
695
720
  self.run_agent(text) # Use stripped text
File without changes
File without changes
File without changes