shotgun-sh 0.4.7.dev2__tar.gz → 0.4.7.dev3__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 (244) hide show
  1. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/PKG-INFO +2 -2
  2. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/pyproject.toml +2 -2
  3. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/change_detector.py +6 -2
  4. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/ingestor.py +10 -3
  5. shotgun_sh-0.4.7.dev3/src/shotgun/codebase/core/kuzu_compat.py +98 -0
  6. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/manager.py +17 -4
  7. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat/chat_screen.py +8 -0
  8. shotgun_sh-0.4.7.dev3/src/shotgun/tui/screens/kuzu_error_dialog.py +124 -0
  9. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/.gitignore +0 -0
  10. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/LICENSE +0 -0
  11. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/README.md +0 -0
  12. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/hatch_build.py +0 -0
  13. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/__init__.py +0 -0
  14. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/__init__.py +0 -0
  15. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/agent_manager.py +0 -0
  16. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/common.py +0 -0
  17. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/config/README.md +0 -0
  18. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/config/__init__.py +0 -0
  19. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/config/constants.py +0 -0
  20. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/config/manager.py +0 -0
  21. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/config/models.py +0 -0
  22. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/config/provider.py +0 -0
  23. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/config/streaming_test.py +0 -0
  24. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/context_analyzer/__init__.py +0 -0
  25. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/context_analyzer/analyzer.py +0 -0
  26. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/context_analyzer/constants.py +0 -0
  27. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/context_analyzer/formatter.py +0 -0
  28. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/context_analyzer/models.py +0 -0
  29. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/__init__.py +0 -0
  30. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/filters.py +0 -0
  31. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/__init__.py +0 -0
  32. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/chunking.py +0 -0
  33. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/compaction.py +0 -0
  34. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/constants.py +0 -0
  35. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/context_extraction.py +0 -0
  36. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/file_content_deduplication.py +0 -0
  37. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/history_building.py +0 -0
  38. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/history_processors.py +0 -0
  39. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/message_utils.py +0 -0
  40. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_counting/__init__.py +0 -0
  41. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_counting/anthropic.py +0 -0
  42. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_counting/base.py +0 -0
  43. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_counting/openai.py +0 -0
  44. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_counting/sentencepiece_counter.py +0 -0
  45. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_counting/tokenizer_cache.py +0 -0
  46. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_counting/utils.py +0 -0
  47. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/history/token_estimation.py +0 -0
  48. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/manager.py +0 -0
  49. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/conversation/models.py +0 -0
  50. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/error/__init__.py +0 -0
  51. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/error/models.py +0 -0
  52. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/export.py +0 -0
  53. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/llm.py +0 -0
  54. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/messages.py +0 -0
  55. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/models.py +0 -0
  56. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/plan.py +0 -0
  57. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/research.py +0 -0
  58. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/router/__init__.py +0 -0
  59. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/router/models.py +0 -0
  60. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/router/router.py +0 -0
  61. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/router/tools/__init__.py +0 -0
  62. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/router/tools/delegation_tools.py +0 -0
  63. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/router/tools/plan_tools.py +0 -0
  64. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/runner.py +0 -0
  65. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/specify.py +0 -0
  66. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tasks.py +0 -0
  67. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/__init__.py +0 -0
  68. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/codebase/__init__.py +0 -0
  69. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/codebase/codebase_shell.py +0 -0
  70. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/codebase/directory_lister.py +0 -0
  71. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/codebase/file_read.py +0 -0
  72. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/codebase/models.py +0 -0
  73. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/codebase/query_graph.py +0 -0
  74. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/codebase/retrieve_code.py +0 -0
  75. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/file_management.py +0 -0
  76. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/registry.py +0 -0
  77. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/web_search/__init__.py +0 -0
  78. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/web_search/anthropic.py +0 -0
  79. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/web_search/gemini.py +0 -0
  80. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/web_search/openai.py +0 -0
  81. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/tools/web_search/utils.py +0 -0
  82. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/agents/usage_manager.py +0 -0
  83. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/api_endpoints.py +0 -0
  84. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/build_constants.py +0 -0
  85. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/__init__.py +0 -0
  86. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/clear.py +0 -0
  87. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/codebase/__init__.py +0 -0
  88. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/codebase/commands.py +0 -0
  89. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/codebase/models.py +0 -0
  90. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/compact.py +0 -0
  91. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/config.py +0 -0
  92. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/context.py +0 -0
  93. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/error_handler.py +0 -0
  94. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/export.py +0 -0
  95. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/feedback.py +0 -0
  96. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/models.py +0 -0
  97. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/plan.py +0 -0
  98. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/research.py +0 -0
  99. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/spec/__init__.py +0 -0
  100. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/spec/backup.py +0 -0
  101. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/spec/commands.py +0 -0
  102. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/spec/models.py +0 -0
  103. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/spec/pull_service.py +0 -0
  104. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/specify.py +0 -0
  105. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/tasks.py +0 -0
  106. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/update.py +0 -0
  107. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/cli/utils.py +0 -0
  108. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/__init__.py +0 -0
  109. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/__init__.py +0 -0
  110. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/code_retrieval.py +0 -0
  111. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/cypher_models.py +0 -0
  112. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/language_config.py +0 -0
  113. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/nl_query.py +0 -0
  114. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/core/parser_loader.py +0 -0
  115. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/models.py +0 -0
  116. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/codebase/service.py +0 -0
  117. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/exceptions.py +0 -0
  118. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/llm_proxy/__init__.py +0 -0
  119. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/llm_proxy/client.py +0 -0
  120. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/llm_proxy/clients.py +0 -0
  121. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/llm_proxy/constants.py +0 -0
  122. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/llm_proxy/models.py +0 -0
  123. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/logging_config.py +0 -0
  124. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/main.py +0 -0
  125. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/posthog_telemetry.py +0 -0
  126. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/__init__.py +0 -0
  127. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/__init__.py +0 -0
  128. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/export.j2 +0 -0
  129. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/partials/codebase_understanding.j2 +0 -0
  130. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/partials/common_agent_system_prompt.j2 +0 -0
  131. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/partials/content_formatting.j2 +0 -0
  132. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/partials/interactive_mode.j2 +0 -0
  133. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/partials/router_delegation_mode.j2 +0 -0
  134. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/plan.j2 +0 -0
  135. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/research.j2 +0 -0
  136. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/router.j2 +0 -0
  137. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/specify.j2 +0 -0
  138. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2 +0 -0
  139. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/state/system_state.j2 +0 -0
  140. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/agents/tasks.j2 +0 -0
  141. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/codebase/__init__.py +0 -0
  142. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/codebase/cypher_query_patterns.j2 +0 -0
  143. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/codebase/cypher_system.j2 +0 -0
  144. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/codebase/enhanced_query_context.j2 +0 -0
  145. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/codebase/partials/cypher_rules.j2 +0 -0
  146. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/codebase/partials/graph_schema.j2 +0 -0
  147. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/codebase/partials/temporal_context.j2 +0 -0
  148. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/history/__init__.py +0 -0
  149. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/history/chunk_summarization.j2 +0 -0
  150. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/history/combine_summaries.j2 +0 -0
  151. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/history/incremental_summarization.j2 +0 -0
  152. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/history/summarization.j2 +0 -0
  153. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/loader.py +0 -0
  154. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/prompts/tools/web_search.j2 +0 -0
  155. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/py.typed +0 -0
  156. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/sdk/__init__.py +0 -0
  157. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/sdk/codebase.py +0 -0
  158. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/sdk/exceptions.py +0 -0
  159. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/sdk/models.py +0 -0
  160. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/sdk/services.py +0 -0
  161. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/sentry_telemetry.py +0 -0
  162. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/settings.py +0 -0
  163. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/__init__.py +0 -0
  164. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/client.py +0 -0
  165. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/constants.py +0 -0
  166. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/exceptions.py +0 -0
  167. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/models.py +0 -0
  168. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/shared_specs/__init__.py +0 -0
  169. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/shared_specs/file_scanner.py +0 -0
  170. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/shared_specs/hasher.py +0 -0
  171. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/shared_specs/models.py +0 -0
  172. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/shared_specs/upload_pipeline.py +0 -0
  173. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/shared_specs/utils.py +0 -0
  174. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/specs_client.py +0 -0
  175. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/shotgun_web/supabase_client.py +0 -0
  176. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/telemetry.py +0 -0
  177. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/__init__.py +0 -0
  178. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/app.py +0 -0
  179. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/commands/__init__.py +0 -0
  180. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/components/context_indicator.py +0 -0
  181. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/components/mode_indicator.py +0 -0
  182. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/components/prompt_input.py +0 -0
  183. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/components/spinner.py +0 -0
  184. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/components/splash.py +0 -0
  185. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/components/status_bar.py +0 -0
  186. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/components/vertical_tail.py +0 -0
  187. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/containers.py +0 -0
  188. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/dependencies.py +0 -0
  189. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/filtered_codebase_service.py +0 -0
  190. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/layout.py +0 -0
  191. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/protocols.py +0 -0
  192. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat/__init__.py +0 -0
  193. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat/chat.tcss +0 -0
  194. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat/codebase_index_prompt_screen.py +0 -0
  195. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat/codebase_index_selection.py +0 -0
  196. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat/help_text.py +0 -0
  197. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat/prompt_history.py +0 -0
  198. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat.tcss +0 -0
  199. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/__init__.py +0 -0
  200. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/command_providers.py +0 -0
  201. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/hint_message.py +0 -0
  202. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/history/__init__.py +0 -0
  203. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/history/agent_response.py +0 -0
  204. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/history/chat_history.py +0 -0
  205. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/history/formatters.py +0 -0
  206. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/history/partial_response.py +0 -0
  207. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/history/user_question.py +0 -0
  208. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/chat_screen/messages.py +0 -0
  209. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/confirmation_dialog.py +0 -0
  210. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/directory_setup.py +0 -0
  211. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/feedback.py +0 -0
  212. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/github_issue.py +0 -0
  213. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/model_picker.py +0 -0
  214. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/pipx_migration.py +0 -0
  215. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/provider_config.py +0 -0
  216. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/shared_specs/__init__.py +0 -0
  217. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/shared_specs/create_spec_dialog.py +0 -0
  218. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/shared_specs/models.py +0 -0
  219. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/shared_specs/share_specs_dialog.py +0 -0
  220. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/shared_specs/upload_progress_screen.py +0 -0
  221. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/shotgun_auth.py +0 -0
  222. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/spec_pull.py +0 -0
  223. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/splash.py +0 -0
  224. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/screens/welcome.py +0 -0
  225. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/services/__init__.py +0 -0
  226. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/services/conversation_service.py +0 -0
  227. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/state/__init__.py +0 -0
  228. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/state/processing_state.py +0 -0
  229. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/styles.tcss +0 -0
  230. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/utils/__init__.py +0 -0
  231. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/utils/mode_progress.py +0 -0
  232. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/widgets/__init__.py +0 -0
  233. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/widgets/approval_widget.py +0 -0
  234. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/widgets/cascade_confirmation_widget.py +0 -0
  235. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/widgets/plan_panel.py +0 -0
  236. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/widgets/step_checkpoint_widget.py +0 -0
  237. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/tui/widgets/widget_coordinator.py +0 -0
  238. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/utils/__init__.py +0 -0
  239. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/utils/datetime_utils.py +0 -0
  240. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/utils/env_utils.py +0 -0
  241. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/utils/file_system_utils.py +0 -0
  242. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/utils/marketing.py +0 -0
  243. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/src/shotgun/utils/source_detection.py +0 -0
  244. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev3}/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.7.dev2
3
+ Version: 0.4.7.dev3
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
@@ -34,7 +34,7 @@ Requires-Dist: posthog>=3.0.0
34
34
  Requires-Dist: pydantic-ai>=1.26.0
35
35
  Requires-Dist: pydantic-settings>=2.0.0
36
36
  Requires-Dist: pyperclip>=1.10.0
37
- Requires-Dist: real-ladybug==0.12.2
37
+ Requires-Dist: real-ladybug==0.14.0
38
38
  Requires-Dist: rich>=13.0.0
39
39
  Requires-Dist: sentencepiece>=0.2.0
40
40
  Requires-Dist: sentry-sdk[pure-eval]>=2.0.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "shotgun-sh"
3
- version = "0.4.7.dev2"
3
+ version = "0.4.7.dev3"
4
4
  description = "AI-powered research, planning, and task management CLI tool"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -34,7 +34,7 @@ dependencies = [
34
34
  "textual>=6.1.0",
35
35
  "textual-dev>=1.7.0",
36
36
  "textual-serve>=0.1.0",
37
- "real_ladybug==0.12.2", # Pinned: 0.14.0 has broken Windows DLL dependencies
37
+ "real_ladybug==0.14.0",
38
38
  "tree-sitter>=0.21.0",
39
39
  "tree-sitter-python>=0.23.0",
40
40
  "tree-sitter-javascript>=0.23.0",
@@ -1,16 +1,20 @@
1
1
  """Change detection for incremental graph updates."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import hashlib
4
6
  import os
5
7
  from enum import Enum
6
8
  from pathlib import Path
7
- from typing import Any, cast
9
+ from typing import TYPE_CHECKING, Any, cast
8
10
 
9
11
  import aiofiles
10
- import real_ladybug as kuzu
11
12
 
12
13
  from shotgun.logging_config import get_logger
13
14
 
15
+ if TYPE_CHECKING:
16
+ import real_ladybug as kuzu
17
+
14
18
  logger = get_logger(__name__)
15
19
 
16
20
 
@@ -1,5 +1,7 @@
1
1
  """Kuzu graph ingestor for building code knowledge graphs."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import asyncio
4
6
  import hashlib
5
7
  import os
@@ -8,12 +10,16 @@ import uuid
8
10
  from collections import defaultdict
9
11
  from collections.abc import Callable
10
12
  from pathlib import Path
11
- from typing import Any
13
+ from typing import TYPE_CHECKING, Any
12
14
 
13
15
  import aiofiles
14
- import real_ladybug as kuzu
15
16
  from tree_sitter import Node, Parser, QueryCursor
16
17
 
18
+ from shotgun.codebase.core.kuzu_compat import get_kuzu
19
+
20
+ if TYPE_CHECKING:
21
+ import real_ladybug as kuzu
22
+
17
23
  from shotgun.codebase.core.language_config import LANGUAGE_CONFIGS, get_language_config
18
24
  from shotgun.codebase.core.parser_loader import load_parsers
19
25
  from shotgun.logging_config import get_logger
@@ -1760,7 +1766,8 @@ class CodebaseIngestor:
1760
1766
  self.project_name = repo_path_obj.name
1761
1767
 
1762
1768
  try:
1763
- # Create database
1769
+ # Create database (lazy import kuzu for Windows compatibility)
1770
+ kuzu = get_kuzu()
1764
1771
  logger.info(f"Creating Kuzu database at: {self.db_path}")
1765
1772
  db = kuzu.Database(str(self.db_path))
1766
1773
  conn = kuzu.Connection(db)
@@ -0,0 +1,98 @@
1
+ """Lazy import wrapper for kuzu (real_ladybug) with Windows compatibility handling."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+ from typing import Any
7
+
8
+ _kuzu_module: Any = None
9
+ _import_error: ImportError | None = None
10
+
11
+ # Windows VC++ download URL
12
+ _VC_REDIST_URL = "https://aka.ms/vs/17/release/vc_redist.x64.exe"
13
+
14
+ # Windows VC++ installation instructions
15
+ _WINDOWS_INSTALL_INSTRUCTIONS = f"""
16
+ To fix this, install the Visual C++ Redistributable:
17
+
18
+ 1. Download from: {_VC_REDIST_URL}
19
+ 2. Run the installer and follow the prompts
20
+ 3. Restart your terminal and try again
21
+
22
+ Or run this PowerShell command (as Administrator):
23
+ Invoke-WebRequest -Uri "{_VC_REDIST_URL}" -OutFile "$env:TEMP\\vc_redist.x64.exe"
24
+ Start-Process -FilePath "$env:TEMP\\vc_redist.x64.exe" -ArgumentList "/install", "/quiet", "/norestart" -Wait
25
+ """
26
+
27
+
28
+ def copy_vcpp_instructions_to_clipboard() -> bool:
29
+ """Copy the VC++ Redistributable download URL to clipboard.
30
+
31
+ Returns:
32
+ True if successful, False otherwise
33
+ """
34
+ try:
35
+ import pyperclip # type: ignore[import-untyped]
36
+
37
+ pyperclip.copy(_VC_REDIST_URL)
38
+ return True
39
+ except Exception:
40
+ return False
41
+
42
+
43
+ class KuzuImportError(ImportError):
44
+ """Raised when kuzu cannot be imported, typically on Windows due to DLL issues."""
45
+
46
+ def __init__(self, original_error: ImportError) -> None:
47
+ self.original_error = original_error
48
+ if sys.platform == "win32":
49
+ message = (
50
+ "Failed to load the graph database library (real_ladybug).\n\n"
51
+ "This error typically occurs on Windows when the Visual C++ "
52
+ "Redistributable is not installed.\n"
53
+ f"{_WINDOWS_INSTALL_INSTRUCTIONS}\n"
54
+ f"Original error: {original_error}"
55
+ )
56
+ else:
57
+ message = f"Failed to import real_ladybug: {original_error}"
58
+ super().__init__(message)
59
+
60
+
61
+ def get_kuzu() -> Any:
62
+ """Get the kuzu module, importing it lazily on first use.
63
+
64
+ Raises:
65
+ KuzuImportError: If kuzu cannot be imported (e.g., Windows DLL issues)
66
+
67
+ Returns:
68
+ The real_ladybug module
69
+ """
70
+ global _kuzu_module, _import_error
71
+
72
+ if _kuzu_module is not None:
73
+ return _kuzu_module
74
+
75
+ if _import_error is not None:
76
+ raise KuzuImportError(_import_error)
77
+
78
+ try:
79
+ import real_ladybug
80
+
81
+ _kuzu_module = real_ladybug
82
+ return _kuzu_module
83
+ except ImportError as e:
84
+ _import_error = e
85
+ raise KuzuImportError(e) from e
86
+
87
+
88
+ def is_kuzu_available() -> bool:
89
+ """Check if kuzu is available without raising an error.
90
+
91
+ Returns:
92
+ True if kuzu can be imported, False otherwise
93
+ """
94
+ try:
95
+ get_kuzu()
96
+ return True
97
+ except KuzuImportError:
98
+ return False
@@ -9,13 +9,17 @@ import time
9
9
  import uuid
10
10
  from collections.abc import Awaitable, Callable
11
11
  from pathlib import Path
12
- from typing import Any, ClassVar
12
+ from typing import TYPE_CHECKING, Any, ClassVar
13
13
 
14
14
  import anyio
15
- import real_ladybug as kuzu
16
15
  from watchdog.events import FileSystemEvent, FileSystemEventHandler
17
16
  from watchdog.observers import Observer
18
17
 
18
+ from shotgun.codebase.core.kuzu_compat import get_kuzu
19
+
20
+ if TYPE_CHECKING:
21
+ import real_ladybug as kuzu
22
+
19
23
  from shotgun.codebase.models import (
20
24
  CodebaseGraph,
21
25
  FileChange,
@@ -265,7 +269,8 @@ class CodebaseGraphManager:
265
269
  """
266
270
  graph_path = self.storage_dir / f"{graph_id}.kuzu"
267
271
 
268
- # Create database and connection
272
+ # Create database and connection (lazy import for Windows compatibility)
273
+ kuzu = get_kuzu()
269
274
  lock = await self._get_lock()
270
275
  async with lock:
271
276
  db = kuzu.Database(str(graph_path))
@@ -412,7 +417,8 @@ class CodebaseGraphManager:
412
417
  # Run build in thread pool
413
418
  await anyio.to_thread.run_sync(ingestor.build_graph_from_directory, repo_path)
414
419
 
415
- # Get statistics
420
+ # Get statistics (lazy import for Windows compatibility)
421
+ kuzu = get_kuzu()
416
422
  lock = await self._get_lock()
417
423
  async with lock:
418
424
  db = kuzu.Database(str(graph_path))
@@ -554,6 +560,8 @@ class CodebaseGraphManager:
554
560
  "relationships_removed": 0,
555
561
  }
556
562
 
563
+ # Lazy import for Windows compatibility
564
+ kuzu = get_kuzu()
557
565
  lock = await self._get_lock()
558
566
  async with lock:
559
567
  if graph_id not in self._connections:
@@ -622,6 +630,8 @@ class CodebaseGraphManager:
622
630
  languages = build_options.get("languages")
623
631
  exclude_patterns = build_options.get("exclude_patterns")
624
632
 
633
+ # Lazy import for Windows compatibility
634
+ kuzu = get_kuzu()
625
635
  lock = await self._get_lock()
626
636
  async with lock:
627
637
  if graph_id not in self._connections:
@@ -1044,6 +1054,8 @@ class CodebaseGraphManager:
1044
1054
  self, graph_id: str, query: str, parameters: dict[str, Any] | None = None
1045
1055
  ) -> list[dict[str, Any]]:
1046
1056
  """Internal query execution with connection management."""
1057
+ # Lazy import for Windows compatibility
1058
+ kuzu = get_kuzu()
1047
1059
  lock = await self._get_lock()
1048
1060
  async with lock:
1049
1061
  if graph_id not in self._connections:
@@ -1264,6 +1276,7 @@ class CodebaseGraphManager:
1264
1276
 
1265
1277
  # Try to open the database
1266
1278
  def _open_and_query(g: str = gid, p: Path = db_path) -> bool:
1279
+ kuzu = get_kuzu()
1267
1280
  db = kuzu.Database(str(p))
1268
1281
  conn = kuzu.Connection(db)
1269
1282
  try:
@@ -58,6 +58,7 @@ from shotgun.agents.router.models import (
58
58
  RouterMode,
59
59
  )
60
60
  from shotgun.agents.runner import AgentRunner
61
+ from shotgun.codebase.core.kuzu_compat import KuzuImportError
61
62
  from shotgun.codebase.core.manager import (
62
63
  CodebaseAlreadyIndexedError,
63
64
  CodebaseGraphManager,
@@ -111,6 +112,7 @@ from shotgun.tui.screens.chat_screen.messages import (
111
112
  SubAgentStarted,
112
113
  )
113
114
  from shotgun.tui.screens.confirmation_dialog import ConfirmationDialog
115
+ from shotgun.tui.screens.kuzu_error_dialog import KuzuErrorDialog
114
116
  from shotgun.tui.screens.shared_specs import (
115
117
  CreateSpecDialog,
116
118
  ShareSpecsAction,
@@ -1517,6 +1519,12 @@ class ChatScreen(Screen[None]):
1517
1519
  logger.error(f"Invalid path error: {exc}")
1518
1520
  self.agent_manager.add_hint_message(HintMessage(message=f"❌ {exc}"))
1519
1521
  return
1522
+ except KuzuImportError as exc:
1523
+ progress_timer.stop()
1524
+ logger.error(f"Kuzu import error (Windows DLL issue): {exc}")
1525
+ # Show dialog with copy button for Windows users
1526
+ await self.app.push_screen_wait(KuzuErrorDialog())
1527
+ return
1520
1528
 
1521
1529
  except Exception as exc: # pragma: no cover - defensive UI path
1522
1530
  # Check if this is a kuzu corruption error and we have retries left
@@ -0,0 +1,124 @@
1
+ """Error dialog for Windows kuzu/graph database import failures."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from textual.app import ComposeResult
6
+ from textual.containers import Container, Horizontal
7
+ from textual.screen import ModalScreen
8
+ from textual.widgets import Button, Label, Static
9
+
10
+ from shotgun.codebase.core.kuzu_compat import (
11
+ _VC_REDIST_URL,
12
+ _WINDOWS_INSTALL_INSTRUCTIONS,
13
+ copy_vcpp_instructions_to_clipboard,
14
+ )
15
+ from shotgun.logging_config import get_logger
16
+
17
+ logger = get_logger(__name__)
18
+
19
+
20
+ class KuzuErrorDialog(ModalScreen[bool]):
21
+ """Error dialog for Windows kuzu import failures with copy button."""
22
+
23
+ DEFAULT_CSS = """
24
+ KuzuErrorDialog {
25
+ align: center middle;
26
+ background: rgba(0, 0, 0, 0.5);
27
+ }
28
+
29
+ KuzuErrorDialog > #dialog-container {
30
+ width: 80%;
31
+ max-width: 90;
32
+ height: auto;
33
+ max-height: 90%;
34
+ border: wide $error;
35
+ padding: 1 2;
36
+ layout: vertical;
37
+ background: $surface;
38
+ }
39
+
40
+ #error-title {
41
+ text-style: bold;
42
+ color: $error;
43
+ padding-bottom: 1;
44
+ }
45
+
46
+ #error-message {
47
+ padding: 1 0;
48
+ }
49
+
50
+ #instructions {
51
+ padding: 1 0;
52
+ color: $text-muted;
53
+ }
54
+
55
+ #url-display {
56
+ padding: 1;
57
+ background: $surface-darken-1;
58
+ border: round $primary;
59
+ }
60
+
61
+ #status-label {
62
+ color: $success;
63
+ padding: 1 0;
64
+ }
65
+
66
+ #dialog-buttons {
67
+ layout: horizontal;
68
+ align-horizontal: right;
69
+ height: auto;
70
+ padding-top: 1;
71
+ }
72
+
73
+ #dialog-buttons Button {
74
+ margin-left: 1;
75
+ }
76
+ """
77
+
78
+ BINDINGS = [
79
+ ("escape", "close", "Close"),
80
+ ]
81
+
82
+ def compose(self) -> ComposeResult:
83
+ with Container(id="dialog-container"):
84
+ yield Label("⚠ Graph Database Import Failed", id="error-title")
85
+ yield Static(
86
+ "The graph database library failed to load. "
87
+ "This typically occurs on Windows when the Visual C++ "
88
+ "Redistributable is not installed.\n\n"
89
+ "Install instructions:",
90
+ id="error-message",
91
+ )
92
+ yield Static(_WINDOWS_INSTALL_INSTRUCTIONS.strip(), id="instructions")
93
+ yield Static(f"Download URL: {_VC_REDIST_URL}", id="url-display")
94
+ yield Static("", id="status-label")
95
+ with Horizontal(id="dialog-buttons"):
96
+ yield Button("Copy Download URL", id="copy-btn", variant="primary")
97
+ yield Button("Close", id="close-btn")
98
+
99
+ def on_button_pressed(self, event: Button.Pressed) -> None:
100
+ """Handle button presses."""
101
+ event.stop()
102
+
103
+ if event.button.id == "copy-btn":
104
+ self._copy_url()
105
+ elif event.button.id == "close-btn":
106
+ self.dismiss(True)
107
+
108
+ def _copy_url(self) -> None:
109
+ """Copy the VC++ download URL to clipboard."""
110
+ status_label = self.query_one("#status-label", Static)
111
+
112
+ if copy_vcpp_instructions_to_clipboard():
113
+ status_label.update("✓ Copied URL to clipboard!")
114
+ self.query_one("#copy-btn", Button).label = "Copied!"
115
+ logger.debug(f"Copied VC++ URL to clipboard: {_VC_REDIST_URL}")
116
+ else:
117
+ status_label.update(
118
+ f"⚠ Could not copy. Please manually copy: {_VC_REDIST_URL}"
119
+ )
120
+ logger.warning("Failed to copy VC++ URL to clipboard")
121
+
122
+ def action_close(self) -> None:
123
+ """Close the dialog."""
124
+ self.dismiss(True)
File without changes